Brazil Company Risk Score — Registry, Reputation & Protests avatar

Brazil Company Risk Score — Registry, Reputation & Protests

Pricing

$20.00 / 1,000 company scoreds

Go to Apify Store
Brazil Company Risk Score — Registry, Reputation & Protests

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

MoreLock

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

1

Monthly active users

2 days ago

Last modified

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 confidence that 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_status separates matched from not_matched (searched, nothing carries this CNPJ) and lookup_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_reason and lowers confidence instead of silently scoring 0. Registry lookups that come back not-found, invalid or failed produce no record and are never billed.
  • Forward-compatible — cnd and litigation fields 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

ParameterTypeDefaultDescription
cnpjsarray—CNPJ numbers, formatted or digits-only. One per line.
includeReputationbooleantrueAdd Reclame Aqui reputation to the score.
includeProtestobooleanfalseAdd São Paulo (CENPROT) protests. Slower + adds its own charge. SP state only.
maxItemsinteger1000Stop after this many companies (cost control). With reputation on, budget ~10 s per company.
includeRawbooleanfalseAttach the full raw registry payload.

How the score works

The final score is the weighted average of the components that are present:

ComponentWeight0 (low risk) → 100 (high risk)
Registration status35ATIVA = 0 · SUSPENSA = 60 · INAPTA = 85 · BAIXADA/NULA = 100
Judicial status (from official name)25none = 0 · judicial recovery = 70 · intervention = 80 · bankruptcy/liquidation = 100
Registry red flags10+34 each: opened < 1 year, no contact, zero share capital
Reclame Aqui reputation20RA1000/GREAT = 0-5 · GOOD = 20 · REGULAR = 50 · BAD = 80 · NOT_RECOMMENDED = 100
São Paulo protests10none = 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_statusMeaningreclame_aquiEffect on the score
matchedA Reclame Aqui page carries this CNPJ (or its 8-digit corporate root)the reputation objectreputation counts (weight 20)
not_matchedReclame 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 safelynullexcluded, confidence drops
lookup_failedThe source refused or did not answer. Reputation is UNKNOWN, not absent — re-run to retrynullexcluded, confidence drops, and components[].absent_reason says so
disabledYou set includeReputation: falsenullexcluded, 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 includeReputation off 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 includeProtesto only for the counterparties that matter — it is the slow, premium signal (São Paulo only).
  • Read confidence alongside score: a low-confidence LOW just means few signals were available, not "safe". risk.missing_components tells 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).

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 reputation component 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. New reclame_aqui_status (matched / not_matched / lookup_failed / disabled), absent_reason on every absent component, and risk.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.