Pular para o conteúdo

Como consultar CNPJ via API no Rust.

Aprenda a consultar CNPJ via API no Rust com reqwest: código pronto, leitura do JSON, tratamento de erros e boas práticas. API de CNPJ grátis, sem chave e sem cadastro.

Por que usar a API do openCNPJ no Rust

Em Rust, a crate reqwest com serde_json faz a consulta de CNPJ de forma segura e rápida. O exemplo usa a API bloqueante; para aplicações assíncronas com Tokio, a chamada é praticamente a mesma.

  • Grátis, sem chave de acesso e sem cadastro.
  • Resposta em JSON com razão social, situação cadastral, endereço, CNAEs, sócios e Simples Nacional.
  • Aceita o CNPJ numérico e o novo CNPJ alfanumérico.
  • Limite de 10 requisições por segundo por IP.

O que você precisa

Rust com Cargo e as crates reqwest (features blocking e json) e serde_json.

Consultar um CNPJ no Rust

O endpoint é GET https://api.opencnpj.com.br/cnpj/{cnpj}. Envie o CNPJ com 14 caracteres, sem pontos, barra ou hífen. O exemplo abaixo consulta o CNPJ 06.990.590/0001-23:

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let cnpj = "06990590000123";
    let url = format!("https://api.opencnpj.com.br/cnpj/{cnpj}");

    let empresa: serde_json::Value = reqwest::blocking::get(url)?
        .error_for_status()?
        .json()?;

    println!("{}", empresa["razao_social"]);
    println!("{}", empresa["estabelecimento"]["situacao_cadastral"]);
    Ok(())
}

Dependências: reqwest = { version = "0.12", features = ["blocking", "json"] } e serde_json = "1".

Remover a máscara do CNPJ

Se o CNPJ vem formatado (06.990.590/0001-23) de um formulário, banco de dados ou planilha, limpe a pontuação antes de montar a URL. A mesma regra funciona para o CNPJ alfanumérico:

fn limpar_cnpj(cnpj: &str) -> String {
    cnpj.chars()
        .filter(|c| c.is_ascii_alphanumeric())
        .collect::<String>()
        .to_uppercase()
}

// limpar_cnpj("06.990.590/0001-23") == "06990590000123"

Campos mais usados da resposta

CampoConteúdo
razao_socialNome empresarial
estabelecimento.nome_fantasiaNome fantasia
estabelecimento.situacao_cadastralAtiva, Suspensa, Inapta, Baixada ou Nula
estabelecimento.atividade_principalCNAE principal, com código e descrição
estabelecimento.cidade.nome e estabelecimento.estado.siglaMunicípio e UF
estabelecimento.cep, logradouro, numero, bairroEndereço
simples.simples e simples.meiOpção pelo Simples Nacional e MEI
sociosQuadro de sócios e administradores

A lista completa de campos está na documentação da API.

Tratando erros

Verifique o status HTTP antes de ler o JSON. Rust: use resposta.status().

StatusO que significaO que fazer
200CNPJ encontradoLer o JSON
400Formato de CNPJ inválidoConferir os 14 caracteres
404CNPJ não encontrado na baseInformar ao usuário
429Limite de requisições excedidoAguardar e tentar de novo
500Erro internoTentar novamente mais tarde

Os erros também vêm em JSON, com os campos status, titulo e detalhes.

Boas práticas

  • Defina um timeout na requisição, por exemplo com reqwest::blocking::Client::builder().timeout(...).
  • Guarde o resultado em cache se o mesmo CNPJ for consultado com frequência.
  • Em processamentos em lote, respeite o limite de 10 requisições por segundo.
  • Os dados refletem a base pública mais recente processada e não substituem certidões oficiais.

Perguntas frequentes

A API de CNPJ do openCNPJ é gratuita?

Sim, 100% grátis. Não há chave de acesso nem cadastro. O limite é de 10 requisições por segundo por IP.

Como fazer a chamada de forma assíncrona?

Use reqwest::get(url).await? dentro de um runtime Tokio, sem a feature blocking.

Como mapear a resposta para structs?

Derive serde::Deserialize em structs com os campos que você usa (razao_social, estabelecimento) e chame .json::<Empresa>().

De onde vêm os dados do CNPJ?

Dos dados abertos do CNPJ publicados pela Receita Federal, complementados por bases públicas. Os dados podem ter defasagem e não substituem certidões oficiais. Veja a origem dos dados.