Brazil CNPJ Receita Federal Lookup Scraper avatar

Brazil CNPJ Receita Federal Lookup Scraper

Pricing

from $0.96 / 1,000 company returneds

Go to Apify Store
Brazil CNPJ Receita Federal Lookup Scraper

Brazil CNPJ Receita Federal Lookup Scraper

Get a company's public Brazil CNPJ Receita Federal registry entry by its CNPJ number, one row per company, from the open mirror at minhareceita.org: registration status and its reason, legal and trade names, activity codes, address, share capital and tax flags. No key, no login, no browser.

Pricing

from $0.96 / 1,000 company returneds

Rating

0.0

(0)

Developer

Pradio Actors

Pradio Actors

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

What does Brazil CNPJ Receita Federal Lookup Scraper do?

Brazil CNPJ Receita Federal Lookup Scraper turns a Brazilian CNPJ number into that company's public Receita Federal registry entry: legal and trade names, registration status and its reason, main and secondary activities, registered address, share capital and tax flags. Paste the numbers or the registry's own URLs and press Start; one row lands in your dataset per company found. A number that resolves to nothing costs nothing, and its row says why.

On 81 numbers this build had never seen, every lookup returned a row, at $0.0016 a row plus the platform's $0.00005 start.

Who uses Brazil CNPJ Receita Federal Lookup Scraper

BuyerWhat they run it for
Compliance and onboarding teamsConfirm a Brazilian company's registration is active before signing or paying, with the status, its reason and its date on the row.
Procurement and supplier vettingTurn a column of CNPJs into legal names, trade names, registered addresses and activity codes.
Data teamsEnrich a file of Brazilian companies with the registry fields below, one row per number.
Agents and scriptsAnswer "which company is registered under this CNPJ" inside a run or a chat.

Features

  • Any spelling of a CNPJ. Paste 33.683.111/0002-80, the bare digits, or a URL carrying either. The fourteen digits are what the lookup reads.
  • The open JSON mirror, no browser. Each number is one GET against the public endpoint at minhareceita.org. No key, no account, no page rendering.
  • Duplicates dropped before billing. The same number in two spellings is one company: looked up once, billed once.
  • Every miss is a visible row. A number the registry does not hold, an entry that is not CNPJ-shaped and a read that failed each land in the dataset with their reason. None is billed.
  • The partners list stays at the registry. qsa_count says how many partners and officers the entry lists. The list itself, its names and its identifiers are not copied into the row.
  • A run summary on every run. RUN_SUMMARY in the key-value store carries the fetched, pushed, charged and dropped counts, so a quiet run and a broken one are told apart.

What you can count on

  • You pay only for rows whose status is ok: a number the registry refused, or publishes no company under, is pushed as an uncharged ITEM_STATUS row. The dataset still tells you what happened.
  • Every billed row is charged only after it is written to your dataset. A row you cannot see is never billed.
  • A run that finds nothing returns one PROFILE_NOT_FOUND row that says so, never an empty dataset.
  • A spending limit stops the run cleanly, with a STOPPED_EARLY row saying how many rows were returned and how many were not.
  • Every run writes a RUN_SUMMARY with rowsFetched, rowsPushed, rowsCharged and duplicatesDropped, so a short run and a broken one are told apart.
  • If the source's answer changes shape, the run fails with the error in the log. It never returns rows full of nulls and calls it success.
  • No value is invented: a field the entry does not carry is null, and the table below says where each one was read.

Why this one

The most-used alternative on this platform, measured on 2026-09-15. The differences that held up:

  • A row costs $0.0016. The alternative charges $0.002 per returned row.
  • A run costs $0.00005 to start. That is the platform's own start charge; this Actor adds nothing on top of it. The alternative bills a $0.10 start event before the first row exists.
  • Two fields it left empty are filled here. Its measured row came back with telefone1 and data_opcao_simples empty, two fields this Actor returns: on the five-lookup example run telefone1 filled four of the five and data_opcao_simples one of the five. Its own listing also promises telefone2, fax, pais, regime_tributario, ente_federativo and ultima_atualizacao; all six came back empty on the measured row.
  • A miss is free and explained. status says why a number yielded nothing, and the row is never billed.
  • The fill is measured: 100% over 81 lookups on numbers this build had never seen. No seller on this shelf publishes a hit rate.
  • Every row carries source_url. The address each value was read from is on the row.

What data does Brazil CNPJ Receita Federal Lookup Scraper return?

One company in, one registry entry out. This is a real row for CNPJ 00000000000191 (Banco do Brasil), trimmed for display:

{
"source_url": "https://minhareceita.org/00000000000191",
"status": "ok",
"cnpj": "00000000000191",
"razao_social": "BANCO DO BRASIL SA",
"nome_fantasia": "DIRECAO GERAL",
"matriz_filial": "MATRIZ",
"situacao_cadastral": "ATIVA",
"situacao_cadastral_motivo": "SEM MOTIVO",
"data_situacao_cadastral": "2005-11-03",
"data_abertura": "1966-08-01",
"cnae_principal_codigo": 6422100,
"cnae_principal_descricao": "Bancos múltiplos, com carteira comercial",
"porte": "DEMAIS",
"capital_social": 120000000000,
"logradouro": "SAUN QUADRA 5 BLOCO B TORRE I, II, III",
"numero": "SN",
"bairro": "ASA NORTE",
"municipio": "BRASILIA",
"uf": "DF",
"cep": "70040912",
"telefone1": "6134939002",
"data_opcao_simples": "2007-07-01",
"simples_nacional": false,
"mei": false,
"orgao_publico": "NÃO",
"cnaes_secundarios": [
{ "codigo": 6499999, "descricao": "Outras atividades de serviços financeiros não especificadas anteriormente" }
],
"qsa_count": 41,
"row_type": "ROW"
}

Two more rows from the same run show the other advertised shapes. A branch, CNPJ 00776574000156, reads matriz_filial FILIAL. And note the legal name: the register's own text carries "EM RECUPERACAO JUDICIAL" beside a situacao_cadastral of ATIVA, and the row reproduces both as the register publishes them; the name is the register's text, the status is the register's status field:

{
"source_url": "https://minhareceita.org/00776574000156",
"status": "ok",
"cnpj": "00776574000156",
"razao_social": "AMERICANAS S.A - EM RECUPERACAO JUDICIAL",
"matriz_filial": "FILIAL",
"situacao_cadastral": "ATIVA",
"situacao_cadastral_motivo": "SEM MOTIVO",
"data_situacao_cadastral": "2005-11-03",
"data_abertura": "1995-08-22",
"cnae_principal_codigo": 4789099,
"cnae_principal_descricao": "Comércio varejista de outros produtos não especificados anteriormente",
"porte": "DEMAIS",
"capital_social": 39918280000,
"municipio": "OSASCO",
"uf": "SP",
"telefone1": "1140034848",
"qsa_count": 2,
"row_type": "ROW"
}

And a closed company, CNPJ 11396633000187, reads situacao_cadastral BAIXADA with its reason on the row:

{
"source_url": "https://minhareceita.org/11396633000187",
"status": "ok",
"cnpj": "11396633000187",
"razao_social": "3A CONSULTORIA FINANCEIRA LTDA",
"matriz_filial": "MATRIZ",
"situacao_cadastral": "BAIXADA",
"situacao_cadastral_motivo": "EXTINCAO POR ENCERRAMENTO LIQUIDACAO VOLUNTARIA",
"data_situacao_cadastral": "2024-11-27",
"data_abertura": "2009-12-02",
"cnae_principal_codigo": 7020400,
"cnae_principal_descricao": "Atividades de consultoria em gestão empresarial, exceto consultoria técnica específica",
"porte": "DEMAIS",
"capital_social": 450000,
"municipio": "RIO DE JANEIRO",
"uf": "RJ",
"telefone1": "2122527542",
"qsa_count": 2,
"row_type": "ROW"
}

Every field a row can carry:

FieldWhat it holdsWhere it is read
cnpjThe fourteen-digit registry number this row answersthe entry's cnpj key
razao_socialThe company's registered legal namerazao_social
nome_fantasiaThe trade name the company does business under, where it filed onenome_fantasia
matriz_filialWhether the entry is the head office (MATRIZ) or a branch (FILIAL)descricao_identificador_matriz_filial
situacao_cadastralThe registration status, for example ATIVA or BAIXADAdescricao_situacao_cadastral
situacao_cadastral_motivoThe reason behind the registration statusdescricao_motivo_situacao_cadastral
situacao_cadastral_motivo_codigoThe registry's code for that reasonmotivo_situacao_cadastral
data_situacao_cadastralThe date the registration status last changeddata_situacao_cadastral
data_aberturaThe date the company was registereddata_inicio_atividade
cnae_principal_codigoThe company's main economic-activity codecnae_fiscal
cnae_principal_descricaoWhat the main activity code means, in wordscnae_fiscal_descricao
cnaes_secundariosThe secondary activities, each a {codigo, descricao} paircnaes_secundarios
natureza_juridica_codigoThe legal-nature code: a company type, a public body, and so oncodigo_natureza_juridica
porteThe size class the registry gives the companyporte
porte_codigoThe registry's code for that size classcodigo_porte
capital_socialThe registered share capital, in BRLcapital_social
logradouroThe street of the registered addresslogradouro
numeroThe street numbernumero
complementoThe address complement line, where the entry carries onecomplemento
bairroThe district of the registered addressbairro
municipioThe city of the registered addressmunicipio
municipio_codigo_ibgeThe city's IBGE codecodigo_municipio_ibge
municipio_codigo_siafiThe city's SIAFI codecodigo_municipio
ufThe state of the registered addressuf
cepThe postcode of the registered addresscep
telefone1The first phone line on the entry, with its area codeddd_telefone_1
simples_nacionalWhether the company opted into the Simples tax regime; false when the entry carries no optionopcao_pelo_simples
data_opcao_simplesThe date the company opted into Simples, where it did. The registry keeps the date even after a company leaves the regime, so a row can carry it beside simples_nacional: falsedata_opcao_pelo_simples
meiWhether the company is registered as an individual micro-entrepreneuropcao_pelo_mei
orgao_publicoSIM or NÃO: derived from the legal-nature code, whose public-body range starts with 1derived from codigo_natureza_juridica
qsa_countHow many partners and officers the entry lists; the list itself is not copiedthe size of qsa
source_urlThe exact address this row was read fromthe request itself
row_typeROW on a company row; ITEM_STATUS on a per-number miss; PROFILE_NOT_FOUND when nothing came back; STOPPED_EARLY when a limit ended the runset by the run
statusThe per-number verdict: ok on a company row, not_found, bad_url or fetch_failed on a missset by the run
reasonThe detail behind a status, or why a run-level row existsset by the run
rowsFetchedOn run-level status rows: how many rows the run examined before de-duplication and the capset by the run
rowsReturnedOn run-level status rows: how many rows made it to the datasetset by the run
rowsRemainingOn run-level status rows: how many fetched rows were not returnedset by the run

A field the registry leaves empty comes back null; nothing is invented. On the run over 81 numbers this build had never seen, the thinnest fields were data_opcao_simples at 35.8% (only Simples optants carry a date), nome_fantasia and complemento at 59.3%, cnaes_secundarios at 80.2%, telefone1 at 82.7%, logradouro and numero at 88.9%, and data_situacao_cadastral at 97.5%. Every other company field filled every resolved lookup.

The Console preview opens on the Overview view, the columns read first. The All fields view shows every declared column, empty or not.

How much does it cost?

A resolved lookup is one company-returned event: $0.0016, charged only after the row is written to your dataset. Apify also bills its standard apify-actor-start event once per run, $0.00005 at this Actor's size. Nothing else is billed.

Per resolved lookup (every measured lookup returned a row): 100 CNPJs come back as 100 rows for $0.16, and 1,000 CNPJs as 1,000 rows for $1.60, each plus the $0.00005 start. In a table:

CNPJs in one runRows backYou pay
100100$0.16, plus $0.00005 to start
1,0001,000$1.60, plus $0.00005 to start
10,00010,000$16.00, plus $0.00005 to start

On higher Apify plans the per-row price steps down, to $0.00096 on the top tier.

What is never charged:

  • ITEM_STATUS miss rows (not_found, bad_url, fetch_failed), each pushed with its reason.
  • The PROFILE_NOT_FOUND row on a zero result, and the STOPPED_EARLY row on a charge limit.
  • Duplicates dropped before they reach the dataset, and the RUN_SUMMARY itself.

How do I use Brazil CNPJ Receita Federal Lookup Scraper?

  1. Open the Actor's Store page and press Try for free / Start.
  2. The Start Urls list already carries five real CNPJs, so a first run needs nothing typed. To look up your own, replace it: one entry per company, a bare or punctuated number, or its minhareceita.org URL.
  3. Optionally set Maximum items (default 100), the most rows the run returns.
  4. Press Start. Rows land in the dataset as they are read; RUN_SUMMARY in the key-value store carries the counts when the run finishes.

Example input:

{
"startUrls": [
{ "url": "https://minhareceita.org/33.683.111/0002-80" },
{ "url": "https://minhareceita.org/00.000.000/0001-91" },
{ "url": "https://minhareceita.org/60.701.190/0001-04" },
{ "url": "https://minhareceita.org/33.000.167/0001-01" },
{ "url": "https://minhareceita.org/02.558.157/0001-62" }
],
"maxItems": 100
}

Or over the Apify API:

curl "https://api.apify.com/v2/acts/Pradio~brazil-cnpj-receita-federal/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
-X POST -H "Content-Type: application/json" \
-d '{"startUrls":[{"url":"https://minhareceita.org/33683111000280"}]}'

Input

InputTypeDefaultWhat it does
startUrlsarrayfive real CNPJsThe numbers to look up, one entry per company.
maxItemsinteger100The most rows one run returns; the run stops there. Minimum 1.

startUrls

Each entry is { "url": "…" } or a bare string. The run reads the first CNPJ-shaped number it finds: 33.683.111/0002-80, 33683111000280 and https://minhareceita.org/33.683.111/0002-80 all name the same company. The same number in two spellings is looked up once and billed once. An entry carrying nothing CNPJ-shaped comes back as a bad_url row, unbilled.

maxItems

The run returns at most this many rows, whatever is left in the list. The form's minimum is 1; over the API, omit it or send 0 for no cap.

Output

A run writes two kinds of things:

  • Data rows in the default dataset, one per CNPJ that resolved, each carrying row_type: "ROW" and status: "ok". A number that misses (nothing registered under it, an entry with no CNPJ-shaped number, a read that failed) is pushed as row_type: "ITEM_STATUS" with a status of not_found, bad_url or fetch_failed and a reason saying why. A miss row is never billed.
  • One run-level status row, only when there is something to report. A run that pushes nothing ends with one PROFILE_NOT_FOUND row carrying reason, rowsFetched, rowsReturned and rowsRemaining. A run your charge limit cut short ends with STOPPED_EARLY carrying the same counts. Neither is billed.

The key-value store's RUN_SUMMARY carries rowsFetched, rowsPushed, rowsCharged, rowsUncharged, duplicatesDropped and stoppedEarly for every run, alongside the input and the start and finish timestamps. That is how a short run and a broken one are told apart.

A zero result is an answer, not silence: one PROFILE_NOT_FOUND row, uncharged, with rowsFetched telling you whether anything was looked up at all.

What can you do with the data?

  • Check a company before you sign or pay it. situacao_cadastral, its reason and its date say whether the registration is active; data_abertura, porte and capital_social say how established it is.
  • Turn a column of CNPJs into registry entries. A supplier or lead list becomes legal names, trade names, addresses and activity codes you can join back on cnpj.
  • Map a market. Group rows by cnae_principal_codigo and uf, or filter on porte and simples_nacional for size and tax regime.
  • Feed the tools you already use. Rows land in an Apify dataset, so integrations, schedules and webhooks can carry each run into a sheet or a CRM.

Use Brazil CNPJ Receita Federal Lookup Scraper with AI agents

$claude mcp add --transport http apify "https://mcp.apify.com?tools=Pradio/brazil-cnpj-receita-federal"

Paste that line to give an MCP-capable agent this Actor as a tool. It can then answer "which company is registered under this CNPJ" inside a chat.

Personal data

Transparency and source. Each row reproduces one entry of the public Receita Federal CNPJ registry as mirrored at minhareceita.org, and the purpose is company registration lookup. A registry entry can name natural persons appearing in it in a business capacity, such as partners and officers.

Field minimisation is kept. The row stays the company-registry entry itself: names, counts, dates and description lines, carried only as the entry carries them. The partners list arrives only as qsa_count, its size; a person's name, identifier or representative is not copied, and no enrichment adds anything about a person beyond the entry. telefone1 carries the company's listed phone line.

The publisher of this Actor answers for the product it lists; you answer for the runs you make and the rows you keep. Deletion is honoured: a person named in an entry can object through the Issues tab on this page and have themselves removed from output rows. The same place takes a request to correct or delete what a run produced. The run keeps its stop condition: a refused or failed read fails it, and nothing retries past a block or an objection.

Release notes

  • 0.1 (2026-09-15): the first build. One row per CNPJ from the public Receita Federal registry mirror, miss rows unbilled, a run summary on every run.

Limits

  • It looks up CNPJs you already have; it does not find companies. There is no discovery by state or UF, municipality, CNAE activity, registration status, legal nature or partner, and no company-name search: the open mirror serves one CNPJ at a time, so there is no list to filter. Bring the numbers.
  • A row is the registry's current entry, not its history. What the entry does not carry, the row does not have.
  • The mirror is a secondary source. Its own documentation says the data can be outdated, incorrect or inconsistent, that there is no SLA, and that updates land some days after Receita Federal's releases. A value you would act on twice is worth confirming on the entry itself; source_url is on the row.
  • Thin fields are the registry's choice, and they stay thin. data_opcao_simples exists only where the company opted into Simples (35.8% of the 81 lookups on numbers the build had never seen), nome_fantasia and complemento appear on 59.3% of them, telefone1 on 82.7%.
  • A number's check digits are not verified first. The registry answers a bad one itself as not_found, and an entry with nothing CNPJ-shaped lands as bad_url. Both are unbilled.
  • No proxy, no browser, no login. If the endpoint refuses every read, the run fails rather than working around the refusal.
  • The endpoint publishes no usage cap and no SLA. The run still paces itself with a pause between requests, so a very long list takes a while.

Troubleshooting

I pasted more entries than rows I got back. Two spellings of the same number are one lookup and one row, and a maxItems cap ends the list early. RUN_SUMMARY shows rowsFetched beside rowsPushed and duplicatesDropped: for example, 50 entries can mean 47 lookups once the duplicates are out.

A CNPJ came back not_found. The registry answered and holds no company under that number, or it rejected the number as invalid. The row carries its reason and is unbilled.

The run failed instead of returning partial results. When every lookup fails, the endpoint itself was unreachable, and the run fails with the error in the log rather than push an empty dataset. One failed lookup alone lands as a fetch_failed row.

The rows stopped before my list ended. Either maxItems capped the run or your charge limit did. The STOPPED_EARLY row says how many rows were returned and how many were not. Raise the limit and re-run.

FAQ

Can I use integrations with Brazil CNPJ Receita Federal Lookup Scraper? Yes. Like every Apify Actor it plugs into Apify's integrations: Zapier, Make, Google Sheets, webhooks. It can also run on a schedule, so a list re-check can refresh itself.

Can I use Brazil CNPJ Receita Federal Lookup Scraper with the Apify API? Yes. The curl line under "How do I use" is the whole call: POST the input to acts/Pradio~brazil-cnpj-receita-federal/run-sync-get-dataset-items with your token and the rows come back in the response. The apify-client libraries for JavaScript and Python wrap the same call.

Can I use it through an MCP server? Yes. The line in "Use with AI agents" registers it with an MCP-capable agent through Apify's hosted MCP server, no local install needed.

Is it legal to look up CNPJ data? Brazilian company registrations are public data, read here from an open mirror that asks for no key, account or login. The mirror's own documentation says it serves the entries as Receita Federal published them. That is not legal advice: a row can name a person in a business capacity, and the Personal data section above says what is kept and how a named person objects.

See also

  • German Impressum Contact Scraper: our own Actor for the same job on German companies. It reads the legally required company imprint (Impressum) on each site you give it.

Report a problem

Something off, a number that parses wrong, a field that should be there? Open an issue on this Actor's Issues tab in the Apify Console. Attaching the run's log and RUN_SUMMARY gets it fixed fastest.

Not affiliated

This Actor is not affiliated with, endorsed by or sponsored by Receita Federal, the Brazilian government or Minha Receita. It reads the same public registry mirror anyone can open at minhareceita.org. Company names and marks belong to their owners.