Pular para o conteúdo
DADOS DECNPJ

API de CNPJ

Integre dados de empresas ao seu CRM, ERP ou produto com os mesmos filtros do site.

Chave de API

Autenticação Bearer, gerada no painel. Só o hash da chave fica guardado.

JSON padronizado

Mesmo envelope {success, data, meta} em todas as respostas, inclusive erros.

Créditos só nos contatos

Dados cadastrais, pesquisa e tabelas não usam créditos. Contatos: 1 crédito por CNPJ, uma vez.

Visão geral

Base: https://dadosdecnpj.com.br/api/v1. Todas as rotas são GET, respondem JSON em UTF-8 e trazem em meta.dataset a competência da base da Receita Federal usada e em meta.request_id o identificador da requisição (informe-o ao suporte).

Formato das respostas

// sucesso
{
  "success": true,
  "data": { "cnpj": "00000000000191", … },
  "meta": {
    "dataset": { "version": "2026_10", "competence": "2026-10" },
    "request_id": "01JB…"
  }
}

// erro
{
  "success": false,
  "error": {
    "code": "insufficient_credits",
    "message": "Saldo insuficiente para desbloquear os contatos.",
    "details": { "required": 1, "balance": 0 }
  },
  "meta": { "dataset": { … }, "request_id": "01JB…" }
}

Autenticação

  1. Crie sua conta, confirme o e-mail e assine o plano Corporativo (o único com API).
  2. Em Painel › API, gere uma chave. Ela aparece uma única vez: copie e guarde num cofre de segredos.
  3. Envie a chave em toda requisição: Authorization: Bearer ddc_live_…

A chave dá acesso aos seus créditos. Use-a só no servidor (variável de ambiente), nunca em código de navegador ou aplicativo. A API aceita chamadas de outras origens (CORS) só para leitura e sem cookies; ainda assim, quem tiver a chave pode usá-la. Vazou? Revogue no painel: a chave para de funcionar na hora.

GET /credits — saldo e cota

curl -s "https://dadosdecnpj.com.br/api/v1/credits" \
  -H "Authorization: Bearer $DDC_API_KEY"

Limites por plano

Cada plano define quatro limites. Os do seu plano aparecem no painel e nos cabeçalhos de cada resposta.

Acesso à API
Só o plano Corporativo inclui API. Nos outros planos, a API responde 403 plan_required.
Requisições por minuto
Por chave, em janela deslizante. Cabeçalhos X-RateLimit-Limit e X-RateLimit-Remaining.
Requisições por mês
Por conta, somando todas as chaves; renova no dia 1º (horário de Brasília). Cabeçalhos X-Quota-Limit, X-Quota-Remaining e X-Quota-Reset.
Chaves ativas
Quantas chaves podem existir ao mesmo tempo (uma por sistema, por exemplo).

Acima do limite a API responde 429 com Retry-After; requisição barrada não consome a cota. Veja o plano Corporativo em /planos.

Créditos

ChamadaCréditos
GET /cnpj/{cnpj}0
GET /cnpj/{cnpj}?include=contacts1 por CNPJ novo · 0 se já desbloqueado (pela API ou pelo site) · 0 se não há contato ou foi ocultado (LGPD)
/companies/search, /companies/search/count, tabelas, /credits0 (consomem só a cota)

O cabeçalho X-Credits-Used e meta.credits informam o gasto. Sem saldo, a resposta é 402 e nada é cobrado.

Exemplos

Consultar um CNPJ com sócios e contatos

GET /cnpj/{cnpj}

curl -s "https://dadosdecnpj.com.br/api/v1/cnpj/00000000000191?include=partners,contacts" \
  -H "Authorization: Bearer $DDC_API_KEY"

Transportadoras ativas de MG com e-mail

GET /companies/search

curl -s "https://dadosdecnpj.com.br/api/v1/companies/search?uf=MG&cnae=4930202&has_email=true&limit=50" \
  -H "Authorization: Bearer $DDC_API_KEY"

Pesquisa: filtros na querystring

Os filtros são os mesmos da busca avançada do site (FilterSchema v1), escritos “achatados” na querystring e validados do mesmo jeito. Parâmetro desconhecido ou valor inválido devolve 422 com o erro no nome do parâmetro.

ParâmetroExemploRegra
ufuf=MG,SPListas separadas por vírgula (ou repetidas: uf[]=MG&uf[]=SP).
cnae + cnae_scopecnae=4930202&cnae_scope=anyEscopo main (padrão), secondary ou any.
statusstatus=02,04 · status=anyPadrão: só ativas (02). any = qualquer situação.
city_idcity_id=5403Código da Receita (veja /cities).
opened_from / opened_toopened_from=2024-01-01Datas AAAA-MM-DD.
age_years_min / _maxage_years_min=2Idade da empresa em anos.
share_capital_min / _maxshare_capital_min=100000Capital social em reais.
has_phone · has_email · simples · meihas_email=truetrue/false (ou 1/0).
company_size · legal_nature · ddd · zip_prefixcompany_size=01,03Mesmos códigos dos filtros do site.
q · legal_name · trade_name · cnae_text · cnpjq=transportesTexto (até 120 caracteres) ou CNPJ/raiz.
headquarters · sortsort=opened_at:descany|headquarters|branch · legal_name, opened_at ou share_capital.

Paginação por cursor

limit vai de 1 a 100 (padrão 25). Para a próxima página, repita os mesmos filtros e o mesmo limit com cursor=meta.next_cursor. Cada página conta como uma requisição.

const params = new URLSearchParams("uf=MG&cnae=4930202&limit=100");
let cursor = null;
do {
  if (cursor) params.set("cursor", cursor);
  const res = await fetch(`https://dadosdecnpj.com.br/api/v1/companies/search?${params}`, {
    headers: { Authorization: `Bearer ${process.env.DDC_API_KEY}` },
  });
  const body = await res.json();
  for (const company of body.data) console.log(company.cnpj, company.legal_name);
  cursor = body.meta.next_cursor; // mesmos filtros e limit em todas as páginas
} while (cursor);

Erros

HTTPerror.codeO que fazer
401missing_api_key · invalid_api_key · api_key_revoked · api_key_expiredEnvie uma chave ativa no cabeçalho Authorization.
402insufficient_creditsSaldo insuficiente para desbloquear contatos; nada foi cobrado.
403api_not_in_plan · account_blockedPlano sem API ou conta bloqueada.
404company_not_found · cnae_not_foundNão existe na base (ou foi ocultado a pedido do titular).
410cursor_expiredO cursor ficou mais de 5 minutos parado: refaça a pesquisa.
422validation_failed · invalid_cnpj · invalid_cursordetails traz os erros por parâmetro.
429rate_limited · monthly_quota_exceededEspere o tempo do cabeçalho Retry-After.
503dataset_unavailableBase em publicação; tente de novo em instantes.

Referência

Gerada do openapi.json (OpenAPI 3.1), versão 1.0.0. Use-o para gerar clientes ou importar no Postman/Insomnia.

Empresas

Consulta de CNPJ e pesquisa com filtros.

GET/cnpj/{cnpj}Dados de um CNPJ

Ficha completa de um estabelecimento (numérico ou alfanumérico, com ou sem máscara). include=partners traz o quadro societário; include=contacts desbloqueia telefones e e-mail com créditos. Se os contatos foram ocultados a pedido do titular (LGPD) ou a empresa não tem contato, nada é cobrado.

Parâmetros

NomeOndeTipoDescrição
cnpj*caminhostring14 caracteres (máscara opcional).ex.: 00000000000191
includequerystringLista separada por vírgula: partners, contacts.ex.: partners,contacts

Resposta 200: data

cnpjstring
cnpj_formattedstring
cnpj_basestring
urlstring
is_headquartersboolean | null
legal_namestring
trade_namestring | null
statusobject
status.codestring
status.labelstring
status.datestring | null
status_reasonobject | null
status_reason.codestring
status_reason.descriptionstring | null
special_statusobject | null
opened_atstring | null
company_sizeobject | null
company_size.codestring
company_size.labelstring
main_activityobject
main_activity.codestring
main_activity.formattedstring
main_activity.descriptionstring | null
secondary_activities_countinteger
secondary_activitiesarray<object>
secondary_activities.codestring
secondary_activities.formattedstring
secondary_activities.descriptionstring | null
addressobject
address.street_typestring | null
address.streetstring | null
address.numberstring | null
address.complementstring | null
address.districtstring | null
address.zip_codestring | null
address.citystring | null
address.city_idstring | null
address.city_slugstring | null
address.ufstring | null
address.foreign_citystring | null
address.countryobject | null
legal_natureobject | null
legal_nature.codestring
legal_nature.formattedstring
legal_nature.descriptionstring | null
responsible_qualificationobject | null
responsible_qualification.codestring
responsible_qualification.descriptionstring | null
share_capitalnumber | null
responsible_federative_entitystring | null
simplesobject
simples.optedboolean | null
simples.sincestring | null
simples.untilstring | null
meiobject
mei.optedboolean | null
mei.sincestring | null
mei.untilstring | null
contactsobjectTelefones e e-mail só com include=contacts (e se não houver ocultação LGPD).
contacts.includedboolean
contacts.unlockedboolean
contacts.suppressedboolean
contacts.has_phoneboolean
contacts.has_emailboolean
contacts.phonesarray<string> | null
contacts.faxstring | null
contacts.emailstring | null
partnersobjectQuadro societário: itens só com include=partners.
partners.totalinteger
partners.includedboolean
partners.completeboolean
partners.itemsarray<object> | null
partners.items.namestring
partners.items.typeinteger | null
partners.items.type_labelstring | null
partners.items.documentstring | nullCPF de pessoa física vem mascarado pela Receita.
partners.items.qualificationobject | null
partners.items.entry_datestring | null
partners.items.age_rangestring | null
branches_countinteger

Erros

  • 401Sem chave, chave inválida, revogada ou vencida (missing_api_key, invalid_api_key, api_key_revoked, api_key_expired).
  • 402Saldo insuficiente (insufficient_credits); details traz required e balance. Nada foi cobrado.
  • 403Conta bloqueada (account_blocked), conta no plano Grátis (plan_required) ou plano sem API (api_not_in_plan).
  • 404Não encontrado (company_not_found, cnae_not_found, not_found).
  • 422Parâmetros inválidos (validation_failed, invalid_cnpj, invalid_cursor); details traz os erros por parâmetro.
  • 429Limite por minuto (rate_limited) ou cota mensal (monthly_quota_exceeded) atingidos. Veja Retry-After.
  • 503Base em publicação (dataset_unavailable). Tente de novo em instantes.
GET/companies/searchPesquisa de empresas

Filtros do FilterSchema v1 em querystring achatada (mesma validação do site). Paginação por cursor: repita os mesmos filtros e limit com o meta.next_cursor da página anterior; o cursor vale por 5 minutos sem uso. Navegação até 10.000 resultados. Não traz telefone nem e-mail e não usa créditos.

Parâmetros

NomeOndeTipoDescrição
qquerystringTexto livre (razão social, nome fantasia).
cnpjquerystringCNPJ completo (14) ou raiz (8 posições: todos os estabelecimentos).
legal_namequerystringRazão social contém.
trade_namequerystringNome fantasia contém.
cnae_textquerystringPalavras da descrição da atividade.
statusquerystringSituação cadastral: 01 nula, 02 ativa, 03 suspensa, 04 inapta, 08 baixada. Padrão: 02. Use any para qualquer situação. Separe por vírgula ou repita o parâmetro.ex.: 02 · 02,04 · any
cnaequerystringCódigos CNAE de 7 dígitos. Separe por vírgula ou repita o parâmetro.ex.: 4930202
cnae_scopequerymain | secondary | anypadrão: mainOnde procurar os CNAEs: atividade principal (padrão), secundárias ou qualquer.
ufquerystringUFs. Separe por vírgula ou repita o parâmetro.ex.: MG · MG,SP
city_idquerystringCódigo do município na Receita (4 dígitos; veja /cities). Separe por vírgula ou repita o parâmetro.ex.: 5403
zip_prefixquerystringComeço do CEP (1 a 8 dígitos). Separe por vírgula ou repita o parâmetro.ex.: 384
dddquerystringDDD do telefone. Separe por vírgula ou repita o parâmetro.ex.: 34
company_sizequerystringPorte: 00 não informado, 01 ME, 03 EPP, 05 demais. Separe por vírgula ou repita o parâmetro.ex.: 01,03
legal_naturequerystringNatureza jurídica (4 dígitos; veja /legal-natures). Separe por vírgula ou repita o parâmetro.ex.: 2062
headquartersqueryany | headquarters | branchpadrão: anyMatriz ou filial.
opened_fromquerystringAberta a partir de (AAAA-MM-DD).
opened_toquerystringAberta até (AAAA-MM-DD).
age_years_minqueryintegerIdade mínima em anos.
age_years_maxqueryintegerIdade máxima em anos.
share_capital_minquerynumberCapital social mínimo (R$).
share_capital_maxquerynumberCapital social máximo (R$).
simplesquerytrue | false | 1 | 0Optante pelo Simples Nacional.
meiquerytrue | false | 1 | 0Optante pelo MEI.
has_phonequerytrue | false | 1 | 0Tem telefone na base.
has_emailquerytrue | false | 1 | 0Tem e-mail na base.
sortquerylegal_name:asc | legal_name:desc | opened_at:asc | opened_at:desc | share_capital:asc | share_capital:descpadrão: legal_name:ascOrdenação.
limitqueryintegerpadrão: 25Resultados por página (alias: page_size).
cursorquerystringmeta.next_cursor da página anterior.

Resposta 200: data

cnpjstring | null
legal_namestring | null
trade_namestring | null
city_namestring | null
ufstring | null
main_cnaestring | null
main_cnae_descstring | null
statusstring | null
opened_atstring | null
company_sizestring | null
is_headquartersboolean | null
simplesboolean | null
meiboolean | null
has_phoneboolean | null
has_emailboolean | null

Erros

  • 401Sem chave, chave inválida, revogada ou vencida (missing_api_key, invalid_api_key, api_key_revoked, api_key_expired).
  • 403Conta bloqueada (account_blocked), conta no plano Grátis (plan_required) ou plano sem API (api_not_in_plan).
  • 410Cursor expirado (cursor_expired): volte para a primeira página.
  • 422Parâmetros inválidos (validation_failed, invalid_cnpj, invalid_cursor); details traz os erros por parâmetro.
  • 429Limite por minuto (rate_limited) ou cota mensal (monthly_quota_exceeded) atingidos. Veja Retry-After.
  • 503Base em publicação (dataset_unavailable). Tente de novo em instantes.
GET/companies/search/countContagem e facets

Total de empresas para os filtros e a distribuição por UF, porte, situação, matriz/filial, Simples e MEI.

Parâmetros

NomeOndeTipoDescrição
qquerystringTexto livre (razão social, nome fantasia).
cnpjquerystringCNPJ completo (14) ou raiz (8 posições: todos os estabelecimentos).
legal_namequerystringRazão social contém.
trade_namequerystringNome fantasia contém.
cnae_textquerystringPalavras da descrição da atividade.
statusquerystringSituação cadastral: 01 nula, 02 ativa, 03 suspensa, 04 inapta, 08 baixada. Padrão: 02. Use any para qualquer situação. Separe por vírgula ou repita o parâmetro.ex.: 02 · 02,04 · any
cnaequerystringCódigos CNAE de 7 dígitos. Separe por vírgula ou repita o parâmetro.ex.: 4930202
cnae_scopequerymain | secondary | anypadrão: mainOnde procurar os CNAEs: atividade principal (padrão), secundárias ou qualquer.
ufquerystringUFs. Separe por vírgula ou repita o parâmetro.ex.: MG · MG,SP
city_idquerystringCódigo do município na Receita (4 dígitos; veja /cities). Separe por vírgula ou repita o parâmetro.ex.: 5403
zip_prefixquerystringComeço do CEP (1 a 8 dígitos). Separe por vírgula ou repita o parâmetro.ex.: 384
dddquerystringDDD do telefone. Separe por vírgula ou repita o parâmetro.ex.: 34
company_sizequerystringPorte: 00 não informado, 01 ME, 03 EPP, 05 demais. Separe por vírgula ou repita o parâmetro.ex.: 01,03
legal_naturequerystringNatureza jurídica (4 dígitos; veja /legal-natures). Separe por vírgula ou repita o parâmetro.ex.: 2062
headquartersqueryany | headquarters | branchpadrão: anyMatriz ou filial.
opened_fromquerystringAberta a partir de (AAAA-MM-DD).
opened_toquerystringAberta até (AAAA-MM-DD).
age_years_minqueryintegerIdade mínima em anos.
age_years_maxqueryintegerIdade máxima em anos.
share_capital_minquerynumberCapital social mínimo (R$).
share_capital_maxquerynumberCapital social máximo (R$).
simplesquerytrue | false | 1 | 0Optante pelo Simples Nacional.
meiquerytrue | false | 1 | 0Optante pelo MEI.
has_phonequerytrue | false | 1 | 0Tem telefone na base.
has_emailquerytrue | false | 1 | 0Tem e-mail na base.
sortquerylegal_name:asc | legal_name:desc | opened_at:asc | opened_at:desc | share_capital:asc | share_capital:descpadrão: legal_name:ascOrdenação.

Resposta 200: data

totalinteger
facetsobject

Erros

  • 401Sem chave, chave inválida, revogada ou vencida (missing_api_key, invalid_api_key, api_key_revoked, api_key_expired).
  • 403Conta bloqueada (account_blocked), conta no plano Grátis (plan_required) ou plano sem API (api_not_in_plan).
  • 422Parâmetros inválidos (validation_failed, invalid_cnpj, invalid_cursor); details traz os erros por parâmetro.
  • 429Limite por minuto (rate_limited) ou cota mensal (monthly_quota_exceeded) atingidos. Veja Retry-After.
  • 503Base em publicação (dataset_unavailable). Tente de novo em instantes.

Referência

CNAEs, municípios, UFs e códigos usados nos filtros.

GET/cnaeBusca de CNAEs

Por código (prefixo) ou por palavras da descrição. Até 20 resultados.

Parâmetros

NomeOndeTipoDescrição
q*querystringex.: transporte rodoviário

Resposta 200: data

codestring
formattedstring
descriptionstring
hierarchyobject
hierarchy.sectionobject | null
hierarchy.section.codestring
hierarchy.section.namestring
hierarchy.divisionstring
hierarchy.groupstring
hierarchy.classstring
hierarchy.subclassstring

Erros

  • 401Sem chave, chave inválida, revogada ou vencida (missing_api_key, invalid_api_key, api_key_revoked, api_key_expired).
  • 403Conta bloqueada (account_blocked), conta no plano Grátis (plan_required) ou plano sem API (api_not_in_plan).
  • 422Parâmetros inválidos (validation_failed, invalid_cnpj, invalid_cursor); details traz os erros por parâmetro.
  • 429Limite por minuto (rate_limited) ou cota mensal (monthly_quota_exceeded) atingidos. Veja Retry-After.
GET/cnae/{code}Um CNAE e sua hierarquia

Parâmetros

NomeOndeTipoDescrição
code*caminhostringSubclasse com 7 dígitos (máscara opcional).ex.: 4930202

Resposta 200: data

codestring
formattedstring
descriptionstring
hierarchyobject
hierarchy.sectionobject | null
hierarchy.section.codestring
hierarchy.section.namestring
hierarchy.divisionstring
hierarchy.groupstring
hierarchy.classstring
hierarchy.subclassstring

Erros

  • 401Sem chave, chave inválida, revogada ou vencida (missing_api_key, invalid_api_key, api_key_revoked, api_key_expired).
  • 403Conta bloqueada (account_blocked), conta no plano Grátis (plan_required) ou plano sem API (api_not_in_plan).
  • 404Não encontrado (company_not_found, cnae_not_found, not_found).
  • 429Limite por minuto (rate_limited) ou cota mensal (monthly_quota_exceeded) atingidos. Veja Retry-After.
GET/citiesMunicípios

Com q: busca pelo nome (até 20). Só com uf: todos os municípios da UF. O id é o código da Receita, usado no filtro city_id.

Parâmetros

NomeOndeTipoDescrição
ufqueryAC | AL | AM | AP | BA | CE | DF | ES | GO | MA | MG | MS | MT | PA | PB | PE | PI | PR | RJ | RN | RO | RR | RS | SC | SE | SP | TO
qquerystring

Resposta 200: data

idstring
namestring
ufstring | null
slugstring

Erros

  • 401Sem chave, chave inválida, revogada ou vencida (missing_api_key, invalid_api_key, api_key_revoked, api_key_expired).
  • 403Conta bloqueada (account_blocked), conta no plano Grátis (plan_required) ou plano sem API (api_not_in_plan).
  • 422Parâmetros inválidos (validation_failed, invalid_cnpj, invalid_cursor); details traz os erros por parâmetro.
  • 429Limite por minuto (rate_limited) ou cota mensal (monthly_quota_exceeded) atingidos. Veja Retry-After.
GET/statesUnidades da federação

Resposta 200: data

codestring
namestring

Erros

  • 401Sem chave, chave inválida, revogada ou vencida (missing_api_key, invalid_api_key, api_key_revoked, api_key_expired).
  • 403Conta bloqueada (account_blocked), conta no plano Grátis (plan_required) ou plano sem API (api_not_in_plan).
  • 429Limite por minuto (rate_limited) ou cota mensal (monthly_quota_exceeded) atingidos. Veja Retry-After.
GET/statusesSituações cadastrais (filtro status)

Resposta 200: data

codestring
namestring

Erros

  • 401Sem chave, chave inválida, revogada ou vencida (missing_api_key, invalid_api_key, api_key_revoked, api_key_expired).
  • 403Conta bloqueada (account_blocked), conta no plano Grátis (plan_required) ou plano sem API (api_not_in_plan).
  • 429Limite por minuto (rate_limited) ou cota mensal (monthly_quota_exceeded) atingidos. Veja Retry-After.
GET/company-sizesPortes (filtro company_size)

Resposta 200: data

codestring
namestring

Erros

  • 401Sem chave, chave inválida, revogada ou vencida (missing_api_key, invalid_api_key, api_key_revoked, api_key_expired).
  • 403Conta bloqueada (account_blocked), conta no plano Grátis (plan_required) ou plano sem API (api_not_in_plan).
  • 429Limite por minuto (rate_limited) ou cota mensal (monthly_quota_exceeded) atingidos. Veja Retry-After.
GET/legal-naturesNaturezas jurídicas (filtro legal_nature)

Resposta 200: data

codestring
namestring

Erros

  • 401Sem chave, chave inválida, revogada ou vencida (missing_api_key, invalid_api_key, api_key_revoked, api_key_expired).
  • 403Conta bloqueada (account_blocked), conta no plano Grátis (plan_required) ou plano sem API (api_not_in_plan).
  • 429Limite por minuto (rate_limited) ou cota mensal (monthly_quota_exceeded) atingidos. Veja Retry-After.
GET/openapi.jsonEsta especificação (OpenAPI 3.1)sem chave

Conta

Saldo de créditos e cota do mês.

GET/creditsSaldo e cota do mês

Resposta 200: data

balanceinteger
reservedinteger
costsobject
costs.cnpj_contactsinteger
quotaobject
quota.periodstring
quota.limitinteger | null
quota.usedinteger
quota.remaininginteger | null
quota.resets_atstring
rate_limitobject
rate_limit.requests_per_minuteinteger
planstring

Erros

  • 401Sem chave, chave inválida, revogada ou vencida (missing_api_key, invalid_api_key, api_key_revoked, api_key_expired).
  • 403Conta bloqueada (account_blocked), conta no plano Grátis (plan_required) ou plano sem API (api_not_in_plan).
  • 429Limite por minuto (rate_limited) ou cota mensal (monthly_quota_exceeded) atingidos. Veja Retry-After.

Todas as respostas usam o mesmo envelope JSON: {success, data, meta} no sucesso e {success: false, error: {code, message, details}, meta} no erro. meta.dataset informa a versão/competência da base e meta.request_id identifica a requisição (também no cabeçalho X-Request-Id).

Autenticação: Authorization: Bearer ddc_live_… (gere a chave no painel, em /painel/api). Não há sessão nem cookies.

Limites: por chave, requisições por minuto (janela deslizante; cabeçalhos X-RateLimit-Limit e X-RateLimit-Remaining); por conta, requisições por mês (X-Quota-Limit, X-Quota-Remaining, X-Quota-Reset). Estourar qualquer um devolve 429 com Retry-After. Requisição barrada não consome a cota.

Créditos: só GET /cnpj/{cnpj}?include=contacts usa créditos (1 por CNPJ novo; 0 se o CNPJ já foi desbloqueado, pela API ou pelo site). O cabeçalho X-Credits-Used informa o gasto de cada requisição.