Como consultar CNPJ com Python usando a API CNPJ da APIBrasil

Como consultar CNPJ com Python usando a API CNPJ da APIBrasil

Validar o CNPJ de um cliente ou fornecedor é uma das tarefas mais comuns em sistemas brasileiros: cadastro de empresas, emissão de nota, análise de crédito, onboarding de parceiros. Neste tutorial você vai aprender a consultar CNPJ com Python usando a API CNPJ da APIBrasil, que devolve razão social, situação cadastral, CNAE, endereço, sócios e dados do Simples Nacional em uma única chamada.

O código foi escrito seguindo a especificação publicada em doc.apibrasil.io e usa o modo de homologação, então você pode rodar quantas vezes quiser sem gastar crédito.

O que a API CNPJ devolve

A API CNPJ fica na categoria Consulta CNPJ do catálogo e custa R$ 0,04 por consulta em produção. Além da consulta por número de CNPJ, ela tem endpoints para buscar empresas por CNAE, por estado, por capital social e para listar sócios. Neste guia vamos usar a consulta por número.

Grupo de dadosCampos principais
Identificaçãocnpj, nome_fantasia, matriz_filial
Situaçãosituacao_cadastral, data_situacao_cadastral, motivo_situacao
Atividadecnae_fiscal, cnae_fiscal_secundaria, data_inicio_atividades
Endereçologradouro, numero, bairro, cep, uf, municipio
Empresaempresa.razao_social, empresa.natureza_juridica, empresa.porte_empresa, empresa.capital_social
Simples Nacionalsimples.opcao_simples, simples.opcao_mei e datas
Quadro societáriosocios

Pré-requisitos

Passo 1: prepare o projeto

Crie uma pasta, um ambiente virtual e instale as bibliotecas requests (para as chamadas HTTP) e python-dotenv (para ler o token do arquivo .env):

mkdir consulta-cnpj && cd consulta-cnpj
python3 -m venv .venv
source .venv/bin/activate   # no Windows: .venv\Scripts\activate
pip install requests python-dotenv
Terminal criando ambiente virtual Python e instalando requests para consultar CNPJ
Ambiente virtual criado e biblioteca <code>requests</code> instalada.

Crie um arquivo .env com o token e o modo de homologação ligado:

APIBRASIL_TOKEN=seu_token_aqui
APIBRASIL_HOMOLOG=true

Não esqueça de adicionar .env ao .gitignore.

Passo 2: entenda a chamada

A API CNPJ recebe um POST no endereço abaixo, com o tipo da consulta e o número do CNPJ no corpo:

POST https://gateway.apibrasil.io/api/v2/dados/cnpj/credits
Authorization: Bearer SEU_TOKEN
Content-Type: application/json

{
  "tipo": "cnpj",
  "cnpj": "44.959.669/0001-80",
  "homolog": true
}

O CNPJ pode ir com ou sem pontuação no exemplo do catálogo. Mesmo assim, é boa prática limpar a máscara antes de enviar, e é isso que o nosso código vai fazer.

Passo 3: escreva o cliente em Python

Crie o arquivo consulta_cnpj.py:

import os
import re
import sys
import time

import requests
from dotenv import load_dotenv

load_dotenv()

URL = "https://gateway.apibrasil.io/api/v2/dados/cnpj/credits"
TOKEN = os.environ["APIBRASIL_TOKEN"]
HOMOLOG = os.getenv("APIBRASIL_HOMOLOG", "true").lower() == "true"


class SaldoInsuficiente(Exception):
    pass


class ErroAPIBrasil(Exception):
    pass


def valor_br(texto):
    """Converte "105,660" ou "0.19" em float."""
    if texto is None:
        return 0.0
    texto = str(texto).strip()
    if "," in texto:
        texto = texto.replace(".", "").replace(",", ".")
    return float(texto)


def consultar_cnpj(cnpj, tentativas=3):
    cnpj = re.sub(r"\D", "", cnpj)
    if len(cnpj) != 14:
        raise ValueError("CNPJ deve ter 14 dígitos")

    corpo = {"tipo": "cnpj", "cnpj": cnpj, "homolog": HOMOLOG}
    cabecalhos = {
        "Authorization": f"Bearer {TOKEN}",
        "Content-Type": "application/json",
    }

    for tentativa in range(1, tentativas + 1):
        try:
            resp = requests.post(URL, json=corpo, headers=cabecalhos, timeout=120)
        except requests.Timeout:
            if tentativa == tentativas:
                raise
            time.sleep(2 ** tentativa)
            continue

        if resp.status_code == 402:
            raise SaldoInsuficiente("Saldo insuficiente: recarregue a conta.")
        if resp.status_code >= 500 and tentativa < tentativas:
            time.sleep(2 ** tentativa)
            continue
        if resp.status_code >= 400:
            raise ErroAPIBrasil(f"HTTP {resp.status_code}: {resp.text[:200]}")

        corpo_resp = resp.json()
        # O erro pode vir com HTTP 200: confira sempre o campo error.
        if corpo_resp.get("error"):
            raise ErroAPIBrasil(corpo_resp.get("message", "Erro na consulta"))
        return corpo_resp

    raise ErroAPIBrasil("Não foi possível concluir a consulta")


if __name__ == "__main__":
    resposta = consultar_cnpj(sys.argv[1])
    empresa = resposta["data"]["cnpj"]

    print("Razão social .....", empresa["empresa"]["razao_social"])
    print("Nome fantasia ....", empresa["nome_fantasia"])
    print("Situação .........", empresa["situacao_cadastral"])
    print("CNAE principal ...", empresa["cnae_fiscal"])
    print("Custo ............ R$", resposta["tax"])
    print("Saldo restante ... R$", valor_br(resposta["balance"]))

Os pontos mais importantes do código:

  • Limpeza do CNPJ: a expressão \D remove pontos, barra e hífen.
  • Duas verificações: primeiro o status HTTP, depois o campo error do corpo. A APIBrasil pode devolver um erro com HTTP 200.
  • Retry só quando faz sentido: tempo esgotado e erros 5xx são repetidos com espera crescente. Erros 4xx não, porque repetir uma chamada errada continua cobrando.
  • 402 separado: saldo insuficiente é um erro terminal e precisa de ação humana.
  • valor_br: balance e tax chegam como texto no formato brasileiro, e o separador varia entre APIs.

Passo 4: rode o script

python consulta_cnpj.py 44.959.669/0001-80
Saída do script Python mostrando razão social, situação cadastral e CNAE do CNPJ consultado
O script imprime os principais dados da empresa e o custo da consulta.

Interpretando a situação cadastral

O campo situacao_cadastral vem como código, no padrão da Receita Federal:

CódigoSituação
01Nula
02Ativa
03Suspensa
04Inapta
08Baixada

Na prática, para liberar um cadastro, a regra mais comum é aceitar só 02 (Ativa) e mandar os demais casos para revisão manual.

Boas práticas para usar em produção

  • Cache: dados cadastrais mudam pouco. Guardar o resultado por alguns dias evita pagar duas vezes pela mesma consulta.
  • Homologação nos testes: deixe APIBRASIL_HOMOLOG=true no ambiente de desenvolvimento e na esteira de CI.
  • Log de custo: registre tax e balance de cada chamada para acompanhar o gasto.
  • Validação local antes: confira os dígitos verificadores do CNPJ antes de chamar a API e evite consultas inúteis.

Perguntas frequentes

Consigo buscar empresas por CNAE ou por estado?

Sim. A mesma API tem endpoints para buscar CNPJs por CNAE, por UF e por faixa de capital social, além de um endpoint para listar sócios. Os corpos de cada um estão na página da API CNPJ em doc.apibrasil.io.

Quanto custa cada consulta?

R$ 0,04 por consulta em produção, conforme o catálogo. Em homologação não há cobrança.

Funciona com Django ou FastAPI?

Sim. A função consultar_cnpj é Python puro: basta importá-la na sua view ou rota.

Próximos passos

Agora que você já sabe consultar empresas, veja como consultar CPF na Receita Federal com PHP e como tratar erros, saldo e retries em produção.

Loading

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *