Brazil Company Risk Score — Registry, Reputation & Protests
Pricing
$20.00 / 1,000 company scoreds
Brazil Company Risk Score — Registry, Reputation & Protests
Score any Brazilian company by CNPJ into one auditable risk record: Receita Federal registry status, judicial distress, Reclame Aqui reputation, and optional São Paulo protests. Deterministic CNPJ match, transparent weighted score, honest abstain. Pay per result.
Pricing
$20.00 / 1,000 company scoreds
Rating
0.0
(0)
Developer
MoreLock
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Turn a Brazilian CNPJ into one auditable risk score — official Receita Federal registry status, Reclame Aqui consumer reputation, and optional São Paulo protests — matched deterministically, in a single record. Built for KYB, vendor onboarding, credit and due diligence.
🇧🇷 Precisa só do cadastro + reputação? Use os actors-fonte: Consulta CNPJ em Lote · Brazil Due Diligence
Overview
Give it a list of CNPJs; get back, per company, a transparent composite risk score (0-100) and a band (LOW / MEDIUM / HIGH). The score is never a black box: every component (registration status, registry red flags, reputation, protests) reports its own sub-score, weight, and the exact reason it contributed. Missing signals lower the confidence instead of being silently treated as zero — so you always know what the score was actually built from.
The CNPJ ↔ company match for reputation is deterministic (the Reclame Aqui record carries the CNPJ in its documents[]), so the actor never attaches the wrong company. When a signal is not available it says so in absent_reason and drops out of the score — honest abstain, never a fabricated value.
Features
- Transparent, auditable score — per-component breakdown (sub-score + weight + reason), overall band, and a
confidencethat reflects how many signals were present. - Official registry — legal & trade name, registration status, activity (CNAE), legal nature, share capital, size, contacts, full address, owners (QSA).
- Judicial distress flag — detects bankruptcy (falência/falida), judicial recovery (recuperação judicial), liquidation and intervention embedded in the official Receita name — the signal that catches a bankrupt company still registered as ATIVA.
- Reclame Aqui reputation — reputation label (RA1000 / GREAT / GOOD / REGULAR / BAD / NOT_RECOMMENDED), score, complaint count, % solved, segment — matched by exact CNPJ, over a Brazilian residential IP.
- Reputation status, spelled out —
reclame_aqui_statusseparatesmatchedfromnot_matched(searched, nothing carries this CNPJ) andlookup_failed(the source did not answer: reputation UNKNOWN, not absent). - Optional São Paulo protests — CENPROT São Paulo protest existence, count and total value (opt-in, premium).
- Deterministic matching — exact CNPJ, with an 8-digit root as a second net. Never a fuzzy guess.
- Honest abstain — every absent component carries an
absent_reasonand lowersconfidenceinstead of silently scoring 0. Registry lookups that come back not-found, invalid or failed produce no record and are never billed. - Forward-compatible —
cndandlitigationfields are reserved for upcoming signals.
Input
{"cnpjs": ["47960950000121", "18236120000158", "06164253000187"],"includeReputation": true,"includeProtesto": false,"maxItems": 1000}
Output (example)
Real record, Magazine Luiza (CNPJ 47.960.950/0001-21), trimmed for readability:
{"tax_id": "47.960.950/0001-21","risk": {"score": 0,"band": "LOW","confidence": 0.9,"components": [{ "name": "registration_status", "present": true, "subscore": 0, "weight": 35, "raw": "ATIVA", "reason": "registration status is ATIVA", "absent_reason": null },{ "name": "judicial_status", "present": true, "subscore": 0, "weight": 25, "raw": null, "reason": "no distress flag in official name", "absent_reason": null },{ "name": "registry_flags", "present": true, "subscore": 0, "weight": 10, "raw": 0, "reason": "no registry red flags", "absent_reason": null },{ "name": "reputation", "present": true, "subscore": 0, "weight": 20, "raw": "RA1000", "reason": "Reclame Aqui reputation RA1000, 90.8% solved, 56897 complaints", "absent_reason": null },{ "name": "protesto", "present": false, "subscore": null, "weight": 10, "raw": null, "reason": null, "absent_reason": "protest lookup disabled (includeProtesto: false) — excluded from the score" }],"missing_components": [{ "name": "protesto", "weight": 10, "reason": "protest lookup disabled (includeProtesto: false) — excluded from the score" }],"reasons": []},"registry": {"tax_id": "47.960.950/0001-21","legal_name": "MAGAZINE LUIZA S/A","trade_name": "MAGAZINE LUIZA","status": "ATIVA","founded": "1966-10-24","age_years": 59.9,"main_activity": { "code": 4713004, "description": "Lojas de departamentos ou magazines, exceto lojas francas (Duty free)" },"share_capital": 14202162000,"address": { "city": "FRANCA", "state": "SP" },"partners": [{ "name": "FREDERICO TRAJANO INACIO RODRIGUES", "role": "Presidente" }]},"reclame_aqui": {"name": "Magazine Luiza - Loja Online","shortname": "magazine-luiza-loja-online","reclame_aqui_url": "https://www.reclameaqui.com.br/empresa/magazine-luiza-loja-online/","reputation_label": "RA1000","reclame_aqui_score": "8.3","total_complaints": 56897,"solved_percent": "90.8","segment": "Varejo","match_type": "exact_cnpj"},"reclame_aqui_status": "matched","reclame_aqui_note": null,"protesto": null,"protesto_note": "protest lookup disabled (set includeProtesto = true to add São Paulo protests)","cnd": null,"litigation": null}
Note that score: 0 here is the right answer: every present component scored 0 (ATIVA, no distress flag, no red flags, RA1000 reputation). confidence: 0.9 says the score was built on 90 of the 100 declared weight points — only the opt-in protest signal was missing.
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
cnpjs | array | — | CNPJ numbers, formatted or digits-only. One per line. |
includeReputation | boolean | true | Add Reclame Aqui reputation to the score. |
includeProtesto | boolean | false | Add São Paulo (CENPROT) protests. Slower + adds its own charge. SP state only. |
maxItems | integer | 1000 | Stop after this many companies (cost control). With reputation on, budget ~10 s per company. |
includeRaw | boolean | false | Attach the full raw registry payload. |
How the score works
The final score is the weighted average of the components that are present:
| Component | Weight | 0 (low risk) → 100 (high risk) |
|---|---|---|
| Registration status | 35 | ATIVA = 0 · SUSPENSA = 60 · INAPTA = 85 · BAIXADA/NULA = 100 |
| Judicial status (from official name) | 25 | none = 0 · judicial recovery = 70 · intervention = 80 · bankruptcy/liquidation = 100 |
| Registry red flags | 10 | +34 each: opened < 1 year, no contact, zero share capital |
| Reclame Aqui reputation | 20 | RA1000/GREAT = 0-5 · GOOD = 20 · REGULAR = 50 · BAD = 80 · NOT_RECOMMENDED = 100 |
| São Paulo protests | 10 | none = 0 · any on record = 80 |
confidence = share of total weight that was actually present. A bankrupt / in-liquidation company (flagged in its official Receita name) or an irregular/defunct registration status (INAPTA, BAIXADA, NULA) forces the band to HIGH regardless of the other signals — note that a bankrupt company often still shows registration status ATIVA, so the name-level judicial flag is what catches it.
What "no reputation" means — reclame_aqui_status
An absent reputation is never scored as a good one. The component simply leaves the weighted average (which lowers confidence), and the record says which absence it is:
reclame_aqui_status | Meaning | reclame_aqui | Effect on the score |
|---|---|---|---|
matched | A Reclame Aqui page carries this CNPJ (or its 8-digit corporate root) | the reputation object | reputation counts (weight 20) |
not_matched | Reclame Aqui was searched by CNPJ and by the registry names, and no page carries this CNPJ. Not proof that no page exists — a page registered without a CNPJ, or under another CNPJ of the same group, cannot be matched safely | null | excluded, confidence drops |
lookup_failed | The source refused or did not answer. Reputation is UNKNOWN, not absent — re-run to retry | null | excluded, confidence drops, and components[].absent_reason says so |
disabled | You set includeReputation: false | null | excluded, confidence drops |
⚠️ matched means a page was found, not that it can be scored. Reclame Aqui publishes no reputation index for pages with very few complaints — the label comes back NO_INDEX with no score and no % solved. Those records keep the page (reclame_aqui with the URL and complaint count) but the reputation component stays absent, with absent_reason saying so, rather than being given a made-up middle value. [Measured on 22 small Brazilian businesses: 6 pages matched, 5 of them NO_INDEX.]
The same rule applies to every component: anything present: false carries an absent_reason, and risk.missing_components lists them together. A failed lookup can never pass for "nothing bad found".
Tips
- Turn
includeReputationoff for a fast, registry-only score — the reputation lookup is the slow step (~10 s per company, because it queries Reclame Aqui over a residential IP). - Use
includeProtestoonly for the counterparties that matter — it is the slow, premium signal (São Paulo only). - Read
confidencealongsidescore: a low-confidence LOW just means few signals were available, not "safe".risk.missing_componentstells you exactly which ones and why. reasons[]gives you the human-readable drivers for a review or a report.
Use cases
- Vendor onboarding / KYB — one score to accept, review, or reject a Brazilian supplier.
- Credit & risk — a fast pre-screen before pulling a paid bureau report.
- M&A / due diligence — registry + reputation + protests in one auditable record.
- Marketplace / platform trust — score sellers by CNPJ at scale.
- Sales qualification — filter a prospect list by company health.
- AI agents — MCP-ready structured JSON for autonomous due-diligence workflows.
FAQ
Is the score a black box? No. Every component reports its sub-score, weight, and reason; the final score is a plain weighted average over the present components.
What if a company has no Reclame Aqui page? reclame_aqui is null, reclame_aqui_status tells you whether we searched and found nothing (not_matched) or could not ask at all (lookup_failed), and reputation is excluded from the score so confidence drops. No guessing, and a failed lookup is never scored as a clean reputation.
Why is protest São Paulo only? It uses the CENPROT São Paulo source. Other states are on the roadmap.
Do I pay for failed or invalid CNPJs? No — not-found, invalid, and failed lookups are never charged.
Is the CNPJ match reliable? Yes — it is deterministic (exact CNPJ from the company's own documents[]), never a fuzzy name guess.
Pricing
Pay per result (per company scored). You are not charged for CNPJs that are not in the registry, are invalid, or whose registry lookup failed — those produce no record at all. A record whose reputation lookup failed is still a delivered registry record and is charged; reclame_aqui_status: lookup_failed and the lowered confidence tell you what you got. Enabling includeProtesto runs a dedicated São Paulo protest actor that adds its own pay-per-result charge on top (opt-in only).
Related Actors
- Consulta CNPJ em Lote — Dados da Receita Federal 🇧🇷
- Brazil Company Data — Bulk CNPJ Lookup & Enrichment 🇺🇸
- Brazil Due Diligence — CNPJ Registry + Reclame Aqui 🇺🇸
- Protesto SP — Consulta por CPF/CNPJ 🇧🇷
Changelog
- 1.0.7 — Reputation fixed. The Reclame Aqui lookup used to run from a datacenter IP, get blocked, and report the block as "no page registered under this CNPJ" — so the
reputationcomponent was absent in every record and the score ran on 70 of its 100 weight points. It now queries Reclame Aqui over a Brazilian residential IP and matches the CNPJ deterministically. Newreclame_aqui_status(matched/not_matched/lookup_failed/disabled),absent_reasonon every absent component, andrisk.missing_components. Measured on the sample in this README: reputation went from 0 of 3 to 2 of 3 companies. - 1.0 — First release: registry + reputation + optional São Paulo protests, transparent composite score, deterministic CNPJ match, honest abstain.
Contact & issues
Found a bug or need another signal (CND, litigation, more states)? Open an issue on the actor's Issues tab.