- URL base:
https://api.zenpj.com/v1 - Formato: JSON (UTF-8). Erros em
application/problem+json(RFC 9457). - Autenticação: chave de API no cabeçalho
Authorization: Bearer zpj_…. - Planos e preços: zenpj.com/#precos. O plano gratuito tem 100 consultas de API por mês, sem cartão.
- Versão desta página: outubro de 2026. Este arquivo também existe em Markdown: zenpj.com/api/referencia.md.
Autenticação
- Crie uma conta grátis em app.zenpj.com.
- No app, abra a tela API e crie uma chave. Ela começa com
zpj_e aparece uma única vez: guarde-a num cofre de segredos. A ZenPJ guarda só um hash dela. - Envie a chave em toda chamada:
curl -H "Authorization: Bearer zpj_SUA_CHAVE" https://api.zenpj.com/v1/companies/33000167000101
Cada conta pode ter até 5 chaves ativas. Chaves são criadas e revogadas no app; uma chave não cria nem revoga outras chaves (403 session_required).
Consultas por mês e limites
| Plano | Consultas de API e lote por mês | Estados por busca | Buscas novas por mês |
|---|---|---|---|
| Gratuito | 100 | 1 | 15 |
| Pesquisa | 1.000 | 1 | sem limite |
| Exportação | 3.000 | 1 | sem limite |
| Plus | 10.000 | vários ou o Brasil inteiro | sem limite |
- O que conta: cada chamada feita com a chave conta 1 consulta. O lote (
POST /companies/batch) conta 1 por CNPJ distinto e válido enviado. As ferramentas do servidor MCP contam pelas chamadas que fazem.GET /me/queriesnão conta. - Erros não contam: uma chamada que termina em erro (4xx ou 5xx) é devolvida ao saldo.
- Renovação: no dia 1º de cada mês, horário de Brasília.
- Cabeçalhos de saldo:
X-Queries-LimiteX-Queries-Remainingem cada resposta. Passou do saldo: 429query_quota_exceeded. - Buscas do plano gratuito: além das consultas, o plano gratuito tem 15 buscas novas por mês. Repetir a mesma busca ou pedir o total dela não conta outra vez. Passou: 429
monthly_quota_exceeded. - Empresas por busca no plano gratuito: a lista traz as 10 primeiras empresas (um
limitmaior devolve 10) e o total, semnextCursor; pedir uma página comcursorresponde 403page_limit. O cabeçalhoX-Page-Limitdiz o tamanho. A primeira ordem (sort) de uma busca está incluída; outra ordem da mesma busca conta como busca nova (o total continua sem contar). Os planos pagos paginam todos os resultados. - Um estado por busca (Gratuito, Pesquisa, Exportação): mais de um estado responde 422
state_limit; uma busca sem estado e sem cidade, raio, nome, CNPJ, sócio, telefone, e-mail ou CEP responde 422state_required. - Ritmo: até 5 requisições por segundo por conta, com rajadas de até 30. Acima disso, 429 com o cabeçalho
Retry-After(segundos).
GET /me/queries
O saldo do mês.
{ "limit": 1000, "used": 120, "remaining": 880, "unlimited": false, "resetsAt": "2026-11-01T00:00:00-03:00" }
Buscar empresas
GET /companies
Todos os parâmetros são opcionais e se combinam com E (AND). Listas aceitam vírgulas (state=SP,RJ) ou repetição (state=SP&state=RJ). Toda busca precisa de ao menos um filtro (422 filter_required). Sem status, a busca traz só empresas ativas.
Filtros
| Parâmetro | Exemplo | Observações |
|---|---|---|
cnae |
cnae=5611201 |
Atividade principal, código CNAE de 7 dígitos (pontuação e zero à esquerda opcionais: 0111-3/01). Códigos em GET /reference/cnaes. |
secondaryCnae |
secondaryCnae=5611201 |
Atividade principal ou secundária. |
q |
q=padaria |
Palavras no nome (razão social ou fantasia). Todas as palavras precisam aparecer; acentos ignorados; palavras inteiras de 3+ letras. Uma palavra só de dígitos com 6+ dígitos é recusada (422): use cnpj. |
prefix |
q=padar&prefix=true |
A última palavra de q vale como início de palavra ("padar" acha PADARIA) quando tem 3+ letras. Não é busca por trecho: "daria" não acha PADARIA. |
nameField |
nameField=legal |
Com q: só a razão social (legal) ou só o nome fantasia (trade). Padrão: os dois. |
cnpj |
cnpj=33000167 |
Início do CNPJ, 2 a 14 caracteres, pontuação ignorada. Sem status, traz todas as situações. Para um CNPJ completo use GET /companies/{cnpj}. |
state |
state=SP,RJ |
Siglas das UFs. |
municipality |
municipality=7107,6291 |
Códigos de município da Receita (SIAFI), não do IBGE. Códigos em GET /reference/municipalities. Uma cidade restringe o seu estado. |
near, radiusKm |
near=7107&radiusKm=50 |
Municípios cujo centro (IBGE) está até radiusKm (1 a 1.000 km) do município near. |
populationMin, populationMax |
populationMin=100000 |
População estimada do município (IBGE). |
district |
district=CENTRO |
Bairro exato (maiúsculas e acentos ignorados). |
street, streetNumber |
street=paulista&streetNumber=1000 |
Palavras do logradouro e número. |
zip |
zip=01310 |
Início do CEP, 2 a 8 dígitos. |
status |
status=active |
active (padrão), closed (baixada), unfit (inapta), suspended (suspensa), null (nula), any (todas). Aceita lista. |
headquarters |
headquarters=true |
true só matrizes, false só filiais. |
legalNature |
legalNature=2062,2135 |
Natureza jurídica, código de 4 dígitos da Receita. Lista em GET /reference/legal-natures. |
openedFrom, openedTo |
openedFrom=2026-01-01 |
Data de abertura (AAAA-MM-DD). |
size |
size=micro,small |
Porte: micro (ME), small (EPP), other (demais), not_informed. |
shareCapitalMin, shareCapitalMax |
shareCapitalMin=100000 |
Capital social em reais. |
simples |
simples=opted |
Simples Nacional: opted (optante), excluded (excluída), outside (fora). |
mei |
mei=not |
only (só MEI), not (sem MEI), excluded (ex-MEI). |
regime |
regime=real,presumido |
Regime da última ECF: real, presumido, arbitrado, imune (imune ou isenta). |
debts |
debts=without |
Dívida ativa da União (PGFN), empresa como devedora principal: with ou without. |
hasEmail, hasMobile, hasLandline, hasPhone |
hasMobile=true |
Só empresas com e-mail, celular, telefone fixo ou algum telefone. |
hideAccountant |
hideAccountant=true |
E-mails compartilhados por muitas empresas (em geral do contador) não contam para hasEmail e saem em branco. |
phone |
phone=11987654321 |
Telefone, 8 a 11 dígitos, DDD opcional. |
email, emailDomain |
emailDomain=empresa.com.br |
E-mail exato ou domínio do e-mail. |
partner |
partner=joao silva |
Nome de sócio (palavras inteiras, todas no nome do mesmo sócio). |
partnerDoc |
partnerDoc=12345678000190 |
CPF ou CNPJ do sócio, como publicado pela Receita (a Receita mascara o CPF: só os dígitos do meio aparecem, então um CPF pode achar mais de uma pessoa). |
Valores inválidos respondem 422 com uma mensagem por campo.
Paginação, total e ordem
| Parâmetro | Observações |
|---|---|
limit |
Empresas por página, 1 a 200 (padrão 50). |
cursor |
O nextCursor da resposta anterior, com os mesmos filtros e ordem. nextCursor: null = última página. Um cursor de outra ordem responde 422. |
includeTotal=true |
Inclui total (contagem exata) na resposta. |
totalOnly=true |
Responde só { "total": N }, sem listar: tamanho de mercado. |
sort |
bestContacts (melhores contatos: e-mail próprio, celular, fixo), newest, oldest (data de abertura), capitalDesc, capitalAsc, name (razão social A–Z), municipality (código do município), debtDesc (maior dívida). Sem sort, a ordem é a mais rápida para os filtros. |
A paginação é por cursor (sem OFFSET): custo estável por página, sem repetir nem pular empresas.
Resposta
Exemplo ilustrativo:
{
"items": [
{
"cnpj": "12345678000190",
"legalName": "EXEMPLO PADARIA LTDA",
"tradeName": "PADARIA EXEMPLO",
"isHeadquarters": true,
"status": "active",
"activityStartDate": "2019-03-14T00:00:00Z",
"mainCnae": 1091102,
"legalNatureCode": 2062,
"size": "micro",
"shareCapital": 50000,
"mei": "never",
"simples": "opted",
"state": "MG",
"municipalityCode": 4123,
"municipality": "BELO HORIZONTE",
"district": "CENTRO",
"zipCode": "30110000",
"email": "[email protected]",
"emailShared": false,
"phones": ["3130000000"],
"taxRegime": [],
"federalDebt": 0
}
],
"nextCursor": "…",
"total": 5636
}
status:active,closed,unfit,suspended,null.meiesimples:opted(optante),excluded(excluída),never(nunca optou).size:micro,small,other,not_informed.taxRegime: subconjunto dereal,presumido,arbitrado,imune, da última ECF; vazio = não informado (empresas do Simples não entregam ECF).federalDebt: total da dívida ativa da União da empresa (raiz do CNPJ) como devedora principal, em reais; repetido em cada filial.0= nenhuma.emailShared:truequando o e-mail é usado por muitas empresas (provável contador).municipalityCode: código da Receita (SIAFI).splitQuery(só às vezes): quando nada foi achado e a API separou palavras digitadas juntas ("ctvoicer" → "CT VOICER"), a resposta trazsplitQuery; use-o comoqnas próximas páginas.
Ficha de uma empresa
GET /companies/{cnpj}
CNPJ com ou sem pontuação, numérico ou alfanumérico (IN RFB 2.229/2024). Traz qualquer situação cadastral. 404 quando o CNPJ não existe na base.
Campos:
| Campo | Descrição |
|---|---|
cnpj, cnpjBase |
CNPJ e raiz (8 primeiros caracteres). |
isHeadquarters |
Matriz (true) ou filial. |
legalName, tradeName |
Razão social e nome fantasia. |
status, statusDate, statusReason |
Situação cadastral, data e motivo (texto da Receita). |
activityStartDate |
Data de abertura. |
legalNature |
Natureza jurídica (texto). |
size, shareCapital |
Porte e capital social. |
mainCnae, secondaryCnaes |
{ "code", "description" } da atividade principal e lista das secundárias. |
address |
streetType, street, number, complement, district, zipCode, municipality, state. |
phones, email, emailShared |
Contatos publicados pela Receita. |
simples, mei |
opted, excluded ou never; simplesOption e meiOption (booleanos da Receita). |
taxRegime, federalDebt |
Regime da última ECF e dívida ativa da União (PGFN). |
establishmentCount |
Quantos estabelecimentos a raiz tem. |
partners |
Sócios: type, name, document (como publicado; CPF mascarado pela Receita), qualification, entryDate, ageRange. |
release |
Base da Receita usada na resposta (ex.: rfb_2026_09). |
Conferir CNPJs em lote
POST /companies/batch
Até 1.000 CNPJs por chamada. Ideal para enriquecer um CRM ou conferir fornecedores. Conta 1 consulta por CNPJ distinto e válido.
curl -X POST -H "Authorization: Bearer zpj_SUA_CHAVE" \
-H "Content-Type: application/json" \
-d '{"cnpjs":["33000167000101","00.000.000/0001-91"]}' \
https://api.zenpj.com/v1/companies/batch
Resposta (exemplo ilustrativo):
{
"asked": 2,
"checked": 2,
"found": 2,
"items": [
{
"cnpj": "33000167000101",
"found": true,
"valid": true,
"legalName": "EXEMPLO S.A.",
"status": "active",
"statusDate": "2005-11-03",
"simples": "never",
"mei": "never",
"taxRegime": ["real"],
"federalDebt": 0,
"mainCnae": 600001,
"cnaeName": "Extração de petróleo e gás natural",
"city": "RIO DE JANEIRO",
"state": "RJ",
"openedAt": "1966-09-28",
"size": "other",
"isHeadquarters": true
}
]
}
- Os itens vêm na ordem enviada; CNPJs repetidos aparecem uma vez.
valid: false: o texto não é um CNPJ válido (não conta consulta).found: false: CNPJ válido que não está na base.asked= itens enviados,checked= CNPJs distintos e válidos consultados (o que é cobrado),found= encontrados.- Mais de 1.000 ou nenhum CNPJ: 422.
Códigos para os filtros
Respostas no formato { "items": [...] }.
| Chamada | Itens |
|---|---|
GET /reference/cnaes?q=padaria&limit=20 |
code, description, current (false = código antigo que a Receita mantém), class, className, division, divisionName, section, sectionName. Sem q, a lista inteira. |
GET /reference/municipalities?q=campinas&state=SP&limit=20 |
code (Receita, usado nos filtros), ibgeCode, name, state, population. Sem q, todos os municípios dos estados pedidos (ou do país). |
GET /reference/states |
uf, ibgeCode, name, region. |
GET /reference/legal-natures |
Naturezas jurídicas (code, descrição, grupo). |
GET /reference/registration-statuses, company-sizes, status-reasons, partner-types, partner-qualifications, countries |
Demais tabelas da Receita usadas nas respostas. |
Servidor MCP
Para agentes de IA (Claude, ChatGPT, Cursor e qualquer cliente MCP).
- Endpoint:
POST https://api.zenpj.com/v1/mcp. - Autenticação, duas formas:
- Entrar com a conta ZenPJ (OAuth 2.1), sem chave: no Claude ou no ChatGPT, adicione um conector com esse endereço. Listar as ferramentas não pede login; na primeira ferramenta usada, o aplicativo abre o login da ZenPJ e uma tela para você autorizar. Você vê e desconecta os apps conectados no app, na tela API.
- Chave de API: o cabeçalho
Authorization: Bearer zpj_…, como na API REST.
- Transporte: Streamable HTTP, respostas JSON, sem sessão. Atende as versões 2025-03-26 a 2025-11-25 (com
initialize) e 2026-07-28 da especificação. - Consultas: cada ferramenta conta as consultas da chamada REST que faz, com OAuth ou com chave, no plano da sua conta.
# Com login (OAuth): o Claude Code abre o navegador na primeira ferramenta usada
claude mcp add --transport http zenpj https://api.zenpj.com/v1/mcp
# Com chave
claude mcp add --transport http zenpj https://api.zenpj.com/v1/mcp --header "Authorization: Bearer zpj_SUA_CHAVE"
Detalhes do OAuth para quem integra: metadados em https://api.zenpj.com/.well-known/oauth-authorization-server e https://api.zenpj.com/.well-known/oauth-protected-resource/v1/mcp; código de autorização com PKCE (S256); registro dinâmico de cliente (RFC 7591) ou documento de metadados do cliente (CIMD); escopos companies:read e offline_access; o token só vale para o endereço do MCP.
| Ferramenta | O que faz | Argumentos |
|---|---|---|
buscar_atividade |
Acha códigos CNAE por palavras. | termo |
buscar_cidade |
Acha o código de município da Receita pelo nome. | termo |
contar_empresas |
Conta empresas ativas que atendem aos filtros, sem listar. | filtros (abaixo) |
buscar_empresas |
Lista empresas ativas, paginado. | filtros, ordem, limite (1–50, padrão 20), cursor |
consultar_cnpj |
Ficha completa de um CNPJ. | cnpj |
consultar_lote |
Confere até 100 CNPJs. | cnpjs |
Filtros das ferramentas: nome, cnae (lista), cnae_qualquer (principal ou secundária), uf (lista), municipio (lista de códigos da Receita), raio_km (em volta do primeiro município), abertura_de e abertura_ate (AAAA-MM-DD), porte (micro, small, other), simples (opted, excluded, outside), mei (only, not, excluded), regime (lista), dividas (with, without), com_email, com_celular, com_telefone, so_matriz, capital_minimo.
Servidor MCP público (sem chave)
Para usar dados públicos da ZenPJ no Claude, no ChatGPT ou em qualquer cliente MCP sem conta e sem chave.
- Endpoint:
POST https://api.zenpj.com/v1/public/mcp, sem autenticação. Mesmo transporte do servidor com chave (Streamable HTTP, JSON, sem sessão). - O que não traz: contatos (telefone, e-mail), endereço e sócios. Para listas com esses dados, use o app ou o servidor MCP com chave.
- Limites: até 5 requisições por segundo por IP (rajadas de 30); consultas de CNPJ, dados de governo e licitações: até 30 por minuto por IP.
- Privacidade: o servidor não recebe nem guarda as conversas, só as chamadas de ferramenta. Para operação e segurança, registra método, endereço chamado (que pode incluir o CNPJ consultado), código de resposta e duração de cada requisição, além dos registros técnicos de acesso descritos na política de privacidade; os demais argumentos das ferramentas não são gravados.
claude mcp add --transport http zenpj-publico https://api.zenpj.com/v1/public/mcp
| Ferramenta | O que faz | Argumentos |
|---|---|---|
buscar_atividade |
Acha códigos CNAE por palavras. | termo |
buscar_cidade |
Acha o código de município da Receita pelo nome. | termo, uf (opcional) |
contar_empresas |
Conta exatamente as empresas ativas por atividade principal, estado, cidade e tipo de contato. Sem filtros, o Brasil inteiro. | cnae (7 dígitos, ou de 2 a 6 para um grupo), uf, municipio, com_email, com_telefone, com_celular, sem_mei, so_matriz |
consultar_cnpj |
Situação cadastral de um CNPJ: situação, data e motivo, nome, abertura, natureza jurídica, atividade, cidade, Simples/MEI e se há dívida ativa da União. | cnpj |
consultar_governo |
Inscrições estaduais ativas (estados com arquivo aberto) e sanções CEIS/CNEP da CGU. | cnpj |
indice_aberturas |
Empresas abertas e baixadas por mês, no Brasil ou num estado, com comparação anual e divisão por atividade. | uf (opcional) |
licitacoes_abertas |
Licitações com proposta aberta no PNCP, 20 por página. | termo, uf, pagina (1–50) |
Exemplos de pedidos ao assistente: "Quantas construtoras ativas com celular existem no Paraná?", "Qual a situação cadastral do CNPJ 33.000.167/0001-01?", "Quantas empresas abriram em São Paulo no último mês, comparado ao ano passado?", "Quais licitações de software estão abertas em Minas Gerais?".
Erros
Formato (RFC 9457):
{ "title": "Unprocessable Entity", "status": 422, "detail": "…", "code": "state_required" }
Erros de validação trazem errors com uma mensagem por campo ({ "title": "Validation failed", "status": 422, "errors": { "cnpjs": "…" } }).
| Status | code |
Quando |
|---|---|---|
| 400 | — | Corpo JSON inválido ou com campos desconhecidos. |
| 401 | — | Chave ausente, inválida ou revogada. |
| 403 | session_required |
Tentativa de gerenciar chaves com uma chave. |
| 403 | page_limit |
Próxima página no plano gratuito (ele mostra as 10 primeiras empresas de cada busca). |
| 404 | — | CNPJ não encontrado. |
| 422 | — | Parâmetro inválido (errors por campo), inclusive cursor de outra ordem. |
| 422 | filter_required |
Busca sem nenhum filtro. |
| 422 | state_limit / state_required |
Regra de um estado por busca do plano. |
| 429 | query_quota_exceeded |
Consultas de API do mês esgotadas. |
| 429 | monthly_quota_exceeded |
Buscas novas do plano gratuito esgotadas. |
| 429 | — | Ritmo acima do limite; espere Retry-After segundos. |
| 503 | — | Base em carga (raro); tente de novo. |
Dados
- Fonte: Dados Abertos do CNPJ da Receita Federal (cerca de 73 milhões de estabelecimentos, 27 milhões ativos), atualizados todo mês; dívida ativa da União (PGFN); Simples Nacional e MEI; regime tributário (ECF); população e localização dos municípios (IBGE).
- Nomes sem CPF: razões sociais antigas de empresário individual terminam com o CPF na base da Receita; a API remove o CPF de todos os nomes.
- Sócios menores de idade não são exibidos.
- Remoção: empresas que pediram remoção da ZenPJ não aparecem em nenhuma resposta.
- Não existe na base oficial e por isso a API não traz: faturamento, número de funcionários e site.
- Tratamento conforme a LGPD: dados públicos de pessoas jurídicas, para prospecção B2B.
Suporte
Dúvidas sobre a API: pelo WhatsApp da página zenpj.com/suporte ou pela página zenpj.com/api.