Como consultar CNPJ via API no Go.
Aprenda a consultar CNPJ via API no Go com net/http: 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 Go
Go é ótimo para microsserviços e integrações de alto desempenho. A consulta de CNPJ usa apenas a biblioteca padrão (net/http e encoding/json), com uma struct tipada para os campos de que você precisa.
- 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
Go 1.18 ou superior. Apenas a biblioteca padrão.
Consultar um CNPJ no Go
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:
package main
import (
"encoding/json"
"fmt"
"net/http"
)
type Empresa struct {
RazaoSocial string `json:"razao_social"`
Estabelecimento struct {
SituacaoCadastral string `json:"situacao_cadastral"`
} `json:"estabelecimento"`
}
func main() {
resp, err := http.Get("https://api.opencnpj.com.br/cnpj/06990590000123")
if err != nil {
panic(err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
panic(fmt.Sprintf("HTTP %d", resp.StatusCode))
}
var empresa Empresa
if err := json.NewDecoder(resp.Body).Decode(&empresa); err != nil {
panic(err)
}
fmt.Println(empresa.RazaoSocial)
fmt.Println(empresa.Estabelecimento.SituacaoCadastral)
}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:
import "strings"
func limparCNPJ(cnpj string) string {
return strings.ToUpper(strings.Map(func(r rune) rune {
if (r >= '0' && r <= '9') || (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z') {
return r
}
return -1
}, cnpj))
}
// limparCNPJ("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. Go: use resp.StatusCode.
| 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 um
http.Client{Timeout: 10 * time.Second}. - 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.
Preciso de alguma biblioteca externa?
Não. net/http e encoding/json resolvem tudo. Declare na struct apenas os campos que vai usar; os demais são ignorados.
Como evitar ultrapassar o limite de requisições?
Use um time.Ticker de 100 ms ou o pacote golang.org/x/time/rate para manter no máximo 10 requisições por segundo.
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.