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
| Campo | Conteúdo |
|---|---|
razao_social | Nome empresarial |
estabelecimento.nome_fantasia | Nome fantasia |
estabelecimento.situacao_cadastral | Ativa, Suspensa, Inapta, Baixada ou Nula |
estabelecimento.atividade_principal | CNAE principal, com código e descrição |
estabelecimento.cidade.nome e estabelecimento.estado.sigla | Município e UF |
estabelecimento.cep, logradouro, numero, bairro | Endereço |
simples.simples e simples.mei | Opção pelo Simples Nacional e MEI |
socios | Quadro 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().
| Status | O que significa | O que fazer |
|---|---|---|
200 | CNPJ encontrado | Ler o JSON |
400 | Formato de CNPJ inválido | Conferir os 14 caracteres |
404 | CNPJ não encontrado na base | Informar ao usuário |
429 | Limite de requisições excedido | Aguardar e tentar de novo |
500 | Erro interno | Tentar 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.