Consultar CNPJ em Go

Este guia mostra como consultar um CNPJ pela API REST da CNPJAPI em Go, usando o pacote net/http da biblioteca padrão. A resposta vem em JSON, com os campos em PascalCase (RazaoSocial, SituacaoCadastral, ...).

Pré-requisitos

Consulta simples

Com structs tipadas para os campos que você usa:

package main

import (
	"encoding/json"
	"fmt"
	"log"
	"net/http"
)

type Empresa struct {
	RazaoSocial       string `json:"RazaoSocial"`
	SituacaoCadastral struct {
		Descricao string `json:"Descricao"`
	} `json:"SituacaoCadastral"`
}

func main() {
	const cnpj = "00776574000156" // apenas os 14 dígitos, sem pontuação
	const apiKey = "cnpj_sua_chave"

	req, _ := http.NewRequest(http.MethodGet, "https://api.cnpjapi.com.br/"+cnpj, nil)
	req.Header.Set("Authorization", "Bearer "+apiKey)

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		log.Fatalf("consulta falhou: HTTP %d", resp.StatusCode)
	}

	var empresa Empresa
	if err := json.NewDecoder(resp.Body).Decode(&empresa); err != nil {
		log.Fatal(err)
	}

	fmt.Println(empresa.RazaoSocial)
	fmt.Println(empresa.SituacaoCadastral.Descricao)
}

Tratando erros e rate limit

Ao exceder o limite por minuto ou a cota mensal, a API responde 429 com o cabeçalho Retry-After (segundos). Trate como recuperável. Este trecho usa também os pacotes strconv e time, então acrescente-os ao seu import:

import (
	"net/http"
	"strconv"
	"time"
)

// ...

resp, err := http.DefaultClient.Do(req)
if err != nil {
	log.Fatal(err)
}
defer resp.Body.Close()

switch resp.StatusCode {
case http.StatusTooManyRequests:
	espera, err := strconv.Atoi(resp.Header.Get("Retry-After"))
	if err != nil {
		espera = 60 // sem header válido, espera um minuto
	}
	time.Sleep(time.Duration(espera) * time.Second)
	// tente novamente...
case http.StatusNotFound:
	fmt.Println("CNPJ não encontrado na base pública")
case http.StatusOK:
	// decodifique o corpo...
}

Inscrição Estadual (premium)

Com um plano que inclui Inscrição Estadual, consulte a IE de um CNPJ na fonte oficial da SEFAZ. Passe uf para uma UF (1 crédito) ou omita para a varredura nacional (3 créditos):

type RespostaIE struct {
	Resultados []struct {
		UF       string `json:"uf"`
		IE       string `json:"ie"`
		Situacao string `json:"situacao"`
	} `json:"resultados"`
}

req, _ := http.NewRequest(http.MethodGet, "https://api.cnpjapi.com.br/consulta/ie/"+cnpj+"?uf=SP", nil)
req.Header.Set("Authorization", "Bearer "+apiKey)

resp, err := http.DefaultClient.Do(req)
if err != nil {
	log.Fatal(err)
}
defer resp.Body.Close()

var ie RespostaIE
if err := json.NewDecoder(resp.Body).Decode(&ie); err != nil {
	log.Fatal(err)
}
for _, r := range ie.Resultados {
	fmt.Println(r.UF, r.IE, r.Situacao)
}

Contrato completo (campos, cobertura, créditos) em Consultar a Inscrição Estadual.

Próximos passos

Crie sua conta gratuita em https://app.cnpjapi.com.br e faça a primeira consulta em minutos.