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).
- GET
/cnpj/{cnpj}Dados de um CNPJ - GET
/companies/searchPesquisa de empresas - GET
/companies/search/countContagem e facets - GET
/cnaeBusca de CNAEs - GET
/cnae/{code}Um CNAE e sua hierarquia - GET
/citiesMunicípios - GET
/statesUnidades da federação - GET
/statusesSituações cadastrais (filtro status) - GET
/company-sizesPortes (filtro company_size) - GET
/legal-naturesNaturezas jurídicas (filtro legal_nature) - GET
/creditsSaldo e cota do mês - GET
/openapi.jsonEsta especificação (OpenAPI 3.1)
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
- Crie sua conta, confirme o e-mail e assine o plano Corporativo (o único com API).
- Em Painel › API, gere uma chave. Ela aparece uma única vez: copie e guarde num cofre de segredos.
- 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
| Chamada | Créditos |
|---|---|
| GET /cnpj/{cnpj} | 0 |
| GET /cnpj/{cnpj}?include=contacts | 1 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, /credits | 0 (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âmetro | Exemplo | Regra |
|---|---|---|
| uf | uf=MG,SP | Listas separadas por vírgula (ou repetidas: uf[]=MG&uf[]=SP). |
| cnae + cnae_scope | cnae=4930202&cnae_scope=any | Escopo main (padrão), secondary ou any. |
| status | status=02,04 · status=any | Padrão: só ativas (02). any = qualquer situação. |
| city_id | city_id=5403 | Código da Receita (veja /cities). |
| opened_from / opened_to | opened_from=2024-01-01 | Datas AAAA-MM-DD. |
| age_years_min / _max | age_years_min=2 | Idade da empresa em anos. |
| share_capital_min / _max | share_capital_min=100000 | Capital social em reais. |
| has_phone · has_email · simples · mei | has_email=true | true/false (ou 1/0). |
| company_size · legal_nature · ddd · zip_prefix | company_size=01,03 | Mesmos códigos dos filtros do site. |
| q · legal_name · trade_name · cnae_text · cnpj | q=transportes | Texto (até 120 caracteres) ou CNPJ/raiz. |
| headquarters · sort | sort=opened_at:desc | any|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
| HTTP | error.code | O que fazer |
|---|---|---|
| 401 | missing_api_key · invalid_api_key · api_key_revoked · api_key_expired | Envie uma chave ativa no cabeçalho Authorization. |
| 402 | insufficient_credits | Saldo insuficiente para desbloquear contatos; nada foi cobrado. |
| 403 | api_not_in_plan · account_blocked | Plano sem API ou conta bloqueada. |
| 404 | company_not_found · cnae_not_found | Não existe na base (ou foi ocultado a pedido do titular). |
| 410 | cursor_expired | O cursor ficou mais de 5 minutos parado: refaça a pesquisa. |
| 422 | validation_failed · invalid_cnpj · invalid_cursor | details traz os erros por parâmetro. |
| 429 | rate_limited · monthly_quota_exceeded | Espere o tempo do cabeçalho Retry-After. |
| 503 | dataset_unavailable | Base 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
| Nome | Onde | Tipo | Descrição |
|---|---|---|---|
| cnpj* | caminho | string | 14 caracteres (máscara opcional).ex.: 00000000000191 |
| include | query | string | Lista separada por vírgula: partners, contacts.ex.: partners,contacts |
Resposta 200: data
| cnpj | string | |
| cnpj_formatted | string | |
| cnpj_base | string | |
| url | string | |
| is_headquarters | boolean | null | |
| legal_name | string | |
| trade_name | string | null | |
| status | object | |
| status.code | string | |
| status.label | string | |
| status.date | string | null | |
| status_reason | object | null | |
| status_reason.code | string | |
| status_reason.description | string | null | |
| special_status | object | null | |
| opened_at | string | null | |
| company_size | object | null | |
| company_size.code | string | |
| company_size.label | string | |
| main_activity | object | |
| main_activity.code | string | |
| main_activity.formatted | string | |
| main_activity.description | string | null | |
| secondary_activities_count | integer | |
| secondary_activities | array<object> | |
| secondary_activities.code | string | |
| secondary_activities.formatted | string | |
| secondary_activities.description | string | null | |
| address | object | |
| address.street_type | string | null | |
| address.street | string | null | |
| address.number | string | null | |
| address.complement | string | null | |
| address.district | string | null | |
| address.zip_code | string | null | |
| address.city | string | null | |
| address.city_id | string | null | |
| address.city_slug | string | null | |
| address.uf | string | null | |
| address.foreign_city | string | null | |
| address.country | object | null | |
| legal_nature | object | null | |
| legal_nature.code | string | |
| legal_nature.formatted | string | |
| legal_nature.description | string | null | |
| responsible_qualification | object | null | |
| responsible_qualification.code | string | |
| responsible_qualification.description | string | null | |
| share_capital | number | null | |
| responsible_federative_entity | string | null | |
| simples | object | |
| simples.opted | boolean | null | |
| simples.since | string | null | |
| simples.until | string | null | |
| mei | object | |
| mei.opted | boolean | null | |
| mei.since | string | null | |
| mei.until | string | null | |
| contacts | object | Telefones e e-mail só com include=contacts (e se não houver ocultação LGPD). |
| contacts.included | boolean | |
| contacts.unlocked | boolean | |
| contacts.suppressed | boolean | |
| contacts.has_phone | boolean | |
| contacts.has_email | boolean | |
| contacts.phones | array<string> | null | |
| contacts.fax | string | null | |
| contacts.email | string | null | |
| partners | object | Quadro societário: itens só com include=partners. |
| partners.total | integer | |
| partners.included | boolean | |
| partners.complete | boolean | |
| partners.items | array<object> | null | |
| partners.items.name | string | |
| partners.items.type | integer | null | |
| partners.items.type_label | string | null | |
| partners.items.document | string | null | CPF de pessoa física vem mascarado pela Receita. |
| partners.items.qualification | object | null | |
| partners.items.entry_date | string | null | |
| partners.items.age_range | string | null | |
| branches_count | integer |
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);detailstrazrequiredebalance. 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);detailstraz os erros por parâmetro. - 429Limite por minuto (
rate_limited) ou cota mensal (monthly_quota_exceeded) atingidos. VejaRetry-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
| Nome | Onde | Tipo | Descrição |
|---|---|---|---|
| q | query | string | Texto livre (razão social, nome fantasia). |
| cnpj | query | string | CNPJ completo (14) ou raiz (8 posições: todos os estabelecimentos). |
| legal_name | query | string | Razão social contém. |
| trade_name | query | string | Nome fantasia contém. |
| cnae_text | query | string | Palavras da descrição da atividade. |
| status | query | string | Situaçã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 |
| cnae | query | string | Códigos CNAE de 7 dígitos. Separe por vírgula ou repita o parâmetro.ex.: 4930202 |
| cnae_scope | query | main | secondary | anypadrão: main | Onde procurar os CNAEs: atividade principal (padrão), secundárias ou qualquer. |
| uf | query | string | UFs. Separe por vírgula ou repita o parâmetro.ex.: MG · MG,SP |
| city_id | query | string | Código do município na Receita (4 dígitos; veja /cities). Separe por vírgula ou repita o parâmetro.ex.: 5403 |
| zip_prefix | query | string | Começo do CEP (1 a 8 dígitos). Separe por vírgula ou repita o parâmetro.ex.: 384 |
| ddd | query | string | DDD do telefone. Separe por vírgula ou repita o parâmetro.ex.: 34 |
| company_size | query | string | Porte: 00 não informado, 01 ME, 03 EPP, 05 demais. Separe por vírgula ou repita o parâmetro.ex.: 01,03 |
| legal_nature | query | string | Natureza jurídica (4 dígitos; veja /legal-natures). Separe por vírgula ou repita o parâmetro.ex.: 2062 |
| headquarters | query | any | headquarters | branchpadrão: any | Matriz ou filial. |
| opened_from | query | string | Aberta a partir de (AAAA-MM-DD). |
| opened_to | query | string | Aberta até (AAAA-MM-DD). |
| age_years_min | query | integer | Idade mínima em anos. |
| age_years_max | query | integer | Idade máxima em anos. |
| share_capital_min | query | number | Capital social mínimo (R$). |
| share_capital_max | query | number | Capital social máximo (R$). |
| simples | query | true | false | 1 | 0 | Optante pelo Simples Nacional. |
| mei | query | true | false | 1 | 0 | Optante pelo MEI. |
| has_phone | query | true | false | 1 | 0 | Tem telefone na base. |
| has_email | query | true | false | 1 | 0 | Tem e-mail na base. |
| sort | query | legal_name:asc | legal_name:desc | opened_at:asc | opened_at:desc | share_capital:asc | share_capital:descpadrão: legal_name:asc | Ordenação. |
| limit | query | integerpadrão: 25 | Resultados por página (alias: page_size). |
| cursor | query | string | meta.next_cursor da página anterior. |
Resposta 200: data
| cnpj | string | null | |
| legal_name | string | null | |
| trade_name | string | null | |
| city_name | string | null | |
| uf | string | null | |
| main_cnae | string | null | |
| main_cnae_desc | string | null | |
| status | string | null | |
| opened_at | string | null | |
| company_size | string | null | |
| is_headquarters | boolean | null | |
| simples | boolean | null | |
| mei | boolean | null | |
| has_phone | boolean | null | |
| has_email | boolean | 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);detailstraz os erros por parâmetro. - 429Limite por minuto (
rate_limited) ou cota mensal (monthly_quota_exceeded) atingidos. VejaRetry-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
| Nome | Onde | Tipo | Descrição |
|---|---|---|---|
| q | query | string | Texto livre (razão social, nome fantasia). |
| cnpj | query | string | CNPJ completo (14) ou raiz (8 posições: todos os estabelecimentos). |
| legal_name | query | string | Razão social contém. |
| trade_name | query | string | Nome fantasia contém. |
| cnae_text | query | string | Palavras da descrição da atividade. |
| status | query | string | Situaçã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 |
| cnae | query | string | Códigos CNAE de 7 dígitos. Separe por vírgula ou repita o parâmetro.ex.: 4930202 |
| cnae_scope | query | main | secondary | anypadrão: main | Onde procurar os CNAEs: atividade principal (padrão), secundárias ou qualquer. |
| uf | query | string | UFs. Separe por vírgula ou repita o parâmetro.ex.: MG · MG,SP |
| city_id | query | string | Código do município na Receita (4 dígitos; veja /cities). Separe por vírgula ou repita o parâmetro.ex.: 5403 |
| zip_prefix | query | string | Começo do CEP (1 a 8 dígitos). Separe por vírgula ou repita o parâmetro.ex.: 384 |
| ddd | query | string | DDD do telefone. Separe por vírgula ou repita o parâmetro.ex.: 34 |
| company_size | query | string | Porte: 00 não informado, 01 ME, 03 EPP, 05 demais. Separe por vírgula ou repita o parâmetro.ex.: 01,03 |
| legal_nature | query | string | Natureza jurídica (4 dígitos; veja /legal-natures). Separe por vírgula ou repita o parâmetro.ex.: 2062 |
| headquarters | query | any | headquarters | branchpadrão: any | Matriz ou filial. |
| opened_from | query | string | Aberta a partir de (AAAA-MM-DD). |
| opened_to | query | string | Aberta até (AAAA-MM-DD). |
| age_years_min | query | integer | Idade mínima em anos. |
| age_years_max | query | integer | Idade máxima em anos. |
| share_capital_min | query | number | Capital social mínimo (R$). |
| share_capital_max | query | number | Capital social máximo (R$). |
| simples | query | true | false | 1 | 0 | Optante pelo Simples Nacional. |
| mei | query | true | false | 1 | 0 | Optante pelo MEI. |
| has_phone | query | true | false | 1 | 0 | Tem telefone na base. |
| has_email | query | true | false | 1 | 0 | Tem e-mail na base. |
| sort | query | legal_name:asc | legal_name:desc | opened_at:asc | opened_at:desc | share_capital:asc | share_capital:descpadrão: legal_name:asc | Ordenação. |
Resposta 200: data
| total | integer | |
| facets | object |
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);detailstraz os erros por parâmetro. - 429Limite por minuto (
rate_limited) ou cota mensal (monthly_quota_exceeded) atingidos. VejaRetry-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
| Nome | Onde | Tipo | Descrição |
|---|---|---|---|
| q* | query | string | ex.: transporte rodoviário |
Resposta 200: data
| code | string | |
| formatted | string | |
| description | string | |
| hierarchy | object | |
| hierarchy.section | object | null | |
| hierarchy.section.code | string | |
| hierarchy.section.name | string | |
| hierarchy.division | string | |
| hierarchy.group | string | |
| hierarchy.class | string | |
| hierarchy.subclass | string |
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);detailstraz os erros por parâmetro. - 429Limite por minuto (
rate_limited) ou cota mensal (monthly_quota_exceeded) atingidos. VejaRetry-After.
GET/cnae/{code}Um CNAE e sua hierarquia
Parâmetros
| Nome | Onde | Tipo | Descrição |
|---|---|---|---|
| code* | caminho | string | Subclasse com 7 dígitos (máscara opcional).ex.: 4930202 |
Resposta 200: data
| code | string | |
| formatted | string | |
| description | string | |
| hierarchy | object | |
| hierarchy.section | object | null | |
| hierarchy.section.code | string | |
| hierarchy.section.name | string | |
| hierarchy.division | string | |
| hierarchy.group | string | |
| hierarchy.class | string | |
| hierarchy.subclass | string |
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. VejaRetry-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
| Nome | Onde | Tipo | Descrição |
|---|---|---|---|
| uf | query | AC | 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 | |
| q | query | string |
Resposta 200: data
| id | string | |
| name | string | |
| uf | string | null | |
| slug | string |
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);detailstraz os erros por parâmetro. - 429Limite por minuto (
rate_limited) ou cota mensal (monthly_quota_exceeded) atingidos. VejaRetry-After.
GET/statesUnidades da federação
Resposta 200: data
| code | string | |
| name | string |
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. VejaRetry-After.
GET/statusesSituações cadastrais (filtro status)
Resposta 200: data
| code | string | |
| name | string |
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. VejaRetry-After.
GET/company-sizesPortes (filtro company_size)
Resposta 200: data
| code | string | |
| name | string |
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. VejaRetry-After.
GET/legal-naturesNaturezas jurídicas (filtro legal_nature)
Resposta 200: data
| code | string | |
| name | string |
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. VejaRetry-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
| balance | integer | |
| reserved | integer | |
| costs | object | |
| costs.cnpj_contacts | integer | |
| quota | object | |
| quota.period | string | |
| quota.limit | integer | null | |
| quota.used | integer | |
| quota.remaining | integer | null | |
| quota.resets_at | string | |
| rate_limit | object | |
| rate_limit.requests_per_minute | integer | |
| plan | string |
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. VejaRetry-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.
