Primeira consulta em cinco minutos
Crie a chave, faça a primeira consulta por CNPJ, leia a resposta e confira o uso. Exemplos em curl, Python, Node, PHP, Ruby, Go e n8n.
Uma chave, uma chamada HTTP e um JSON com os dados da empresa e a data da base. A chave é criada em app.cnpj.ia.br e vai no header Authorization. O exemplo abaixo consulta o CNPJ 00.000.000/0001-91 (BANCO DO BRASIL SA), uma instituição pública, no perfil full, que custa 6 créditos.
1. Crie a chave
Entre em app.cnpj.ia.br com e-mail e senha, ou com GitHub ou Google. A chave aparece uma única vez: copie e guarde num gerenciador de segredos ou numa variável de ambiente. Ela nasce com 15 créditos; verificar o e-mail libera os 60 créditos mensais do plano Free.
2. Faça a primeira consulta
Guarde a chave em CNPJIA_KEY e rode um dos exemplos. Todos fazem a mesma coisa: GET /v1/cnpjs/{cnpj} com profile=full.
curl
curl "https://api.cnpj.ia.br/v1/cnpjs/00000000000191?profile=full" \
-H "Authorization: Bearer $CNPJIA_KEY"
Python
import os, requests
r = requests.get(
"https://api.cnpj.ia.br/v1/cnpjs/00000000000191",
params={"profile": "full"},
headers={"Authorization": f"Bearer {os.environ['CNPJIA_KEY']}"},
timeout=10,
)
r.raise_for_status()
body = r.json()
print(body["data"]["razao_social"], body["meta"]["data_as_of"])
Node
const res = await fetch(
"https://api.cnpj.ia.br/v1/cnpjs/00000000000191?profile=full",
{ headers: { Authorization: `Bearer ${process.env.CNPJIA_KEY}` } },
);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const { data, meta } = await res.json();
console.log(data.razao_social, meta.data_as_of);
PHP
<?php
$ch = curl_init("https://api.cnpj.ia.br/v1/cnpjs/00000000000191?profile=full");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . getenv("CNPJIA_KEY")],
]);
$body = json_decode(curl_exec($ch), true);
echo $body["data"]["razao_social"], " ", $body["meta"]["data_as_of"];
Ruby
require "net/http"
require "json"
uri = URI("https://api.cnpj.ia.br/v1/cnpjs/00000000000191?profile=full")
req = Net::HTTP::Get.new(uri, "Authorization" => "Bearer #{ENV.fetch('CNPJIA_KEY')}")
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
body = JSON.parse(res.body)
puts body["data"]["razao_social"], body["meta"]["data_as_of"]
Go
req, _ := http.NewRequest("GET",
"https://api.cnpj.ia.br/v1/cnpjs/00000000000191?profile=full", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("CNPJIA_KEY"))
res, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer res.Body.Close()
var body struct {
Data struct{ RazaoSocial string `json:"razao_social"` } `json:"data"`
Meta struct{ DataAsOf string `json:"data_as_of"` } `json:"meta"`
}
json.NewDecoder(res.Body).Decode(&body)
fmt.Println(body.Data.RazaoSocial, body.Meta.DataAsOf)
n8n
{
"node": "HTTP Request",
"method": "GET",
"url": "https://api.cnpj.ia.br/v1/cnpjs/{{ $json.cnpj }}",
"queryParameters": { "profile": "full" },
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"headerAuth": { "name": "Authorization", "value": "Bearer <sua chave, guardada como credencial>" }
}
O CNPJ pode ir com ou sem pontuação. O perfil basic (1 crédito) traz o cadastro; o full (6 créditos) acrescenta telefones, e-mail, site, sócios e regime tributário. Os dois perfis estão descritos em Consulta por CNPJ e todos os campos em Campos da resposta.
3. Leia a resposta
A resposta tem dois objetos. data traz os campos do perfil pedido; meta diz o que aconteceu com a chamada:
meta.data_as_of: a data da base da Receita Federal que respondeu. A base é mensal; nenhum campo reflete o instante da chamada.meta.credits_chargedemeta.credits_remaining: o que esta chamada custou e o que sobra na franquia.meta.request_id: o identificador para citar num pedido de suporte.meta.suppressed:truequando a empresa tem pedido de remoção de contatos ativo. Nesse caso os campos de contato e os sócios são omitidos e a chamada custa 1 crédito, mesmo emfull.
Ausência de dado é null, nunca chave omitida. Os mesmos valores viajam nos headers X-Credits-Charged, X-Credits-Remaining e X-Request-Id.
4. Confira o uso
GET /v1/usage custa 0 créditos e devolve franquia, consumo do ciclo, pacotes, data do reset e o limite de requisições por minuto do seu plano.
curl
curl "https://api.cnpj.ia.br/v1/usage" \
-H "Authorization: Bearer $CNPJIA_KEY"
Próximos passos
- Precisa de listas de empresas por filtro? Busca de empresas, disponível a partir do plano Starter.
- Vai usar com um agente? O servidor MCP usa a mesma chave.
- Quer entender a cobrança antes de escalar? Créditos, franquia e rate limit.
Perguntas frequentes
Preciso de cartão de crédito para criar a chave?
Não. O plano Free é criado só com e-mail e senha, ou com GitHub ou Google. Dados fiscais e forma de pagamento só entram quando você assina um plano pago; pacotes avulsos são para assinantes.
Por que a chave começa com menos créditos do que o plano Free anuncia?
A chave nasce com um saldo de ativação para a primeira chamada funcionar antes de você verificar o e-mail. A verificação libera a franquia mensal inteira do Free. Os dois números estão em /precos e em GET /v1/usage.
Posso usar a chave no frontend do meu site?
Não. A chave identifica a sua conta e gasta os seus créditos; num frontend qualquer visitante a copia. Chame a API do seu backend, de uma função serverless ou de um fluxo n8n. Os únicos endpoints sem chave são GET /v1/status e GET /v1/demo, e só eles aceitam CORS.
O CNPJ precisa ir formatado?
Não. A API aceita 00000000000191 e 00.000.000/0001-91 e normaliza antes de consultar. Formato ou dígito verificador inválido devolve 400 invalid_cnpj, sem custo.
A primeira consulta funciona com qualquer CNPJ?
Sim, com qualquer CNPJ registrado na Receita Federal. Os exemplos das docs usam instituições públicas, como o Banco do Brasil, porque o contato institucional delas é público por lei. Para testar sem chave, GET /v1/demo?cnpj= serve uma lista fixa de CNPJs públicos.