Empresas e certificado
Cada CNPJ que vai emitir é uma empresa da sua conta. Você cadastra, atualiza, envia o certificado digital e liga a produção pela API, sem depender de ninguém.
| Método | Rota | Para quê |
|---|---|---|
GET |
/empresas |
listar as empresas da conta |
POST |
/empresas |
cadastrar (nasce em homologação) |
GET |
/empresas/{cnpj} |
detalhar |
PATCH |
/empresas/{cnpj} |
atualizar (parcial) |
GET |
/empresas/{cnpj}/certificado |
situação do certificado |
PUT |
/empresas/{cnpj}/certificado |
enviar o certificado A1 |
DELETE |
/empresas/{cnpj}/certificado |
remover o certificado |
PUT |
/empresas/{cnpj}/ambiente |
trocar homologação ↔ produção |
O {cnpj} da URL aceita só os dígitos (ou o formato alfanumérico); pontos, barra e traço são ignorados. O CNPJ de outra conta e um CNPJ que não existe recebem a mesma resposta 404 empresa_nao_encontrada: a API nunca revela quem é cliente da plataforma.
Cadastrar uma empresa
POST /empresas
{
"cnpj": "11.222.333/0001-81",
"razao_social": "LOJA EXEMPLO LTDA",
"nome_fantasia": "Loja Exemplo",
"ie": "111.111.111.111",
"regime": "simples",
"uf": "SP",
"municipio": "Sao Paulo",
"logradouro": "Rua das Flores",
"numero": "100",
"bairro": "Centro",
"cep": "01001-000",
"email": "fiscal@loja.exemplo.com.br",
"telefone": "(11) 99999-8888"
}
Resposta 201:
{
"id": "d6a1174d-11f5-487e-9583-d846f870c54d",
"razao_social": "LOJA EXEMPLO LTDA",
"nome_fantasia": "Loja Exemplo",
"cnpj": "11222333000181",
"ie": "111111111111",
"im": null,
"cnae": null,
"regime": "simples",
"industrial": false,
"p_cred_sn": null,
"endereco": {
"uf": "SP", "codigo_municipio": "3550308", "municipio": "Sao Paulo", "logradouro": "Rua das Flores",
"numero": "100", "complemento": null, "bairro": "Centro", "cep": "01001000"
},
"telefone": "11999998888",
"email": "fiscal@loja.exemplo.com.br",
"ambiente": "homologacao",
"certificado": { "instalado": false, "valido_ate": null, "dias_restantes": null, "vencido": false },
"bloqueios_producao": [
"Envie um certificado A1 válido (e-CNPJ).",
"As tabelas fiscais ainda não foram validadas por um contador (FISCAL_RATES_VERIFIED)."
],
"ativo": true,
"criado_em": "2026-10-04T15:50:05+00:00"
}
Campos do cadastro
Campo desconhecido é recusado. Obrigatórios no POST: cnpj, razao_social, regime, uf, municipio, logradouro, numero, bairro, cep, email.
| Campo | Regra |
|---|---|
cnpj |
só no POST; com dígito verificador, numérico ou alfanumérico; único na plataforma |
razao_social |
até 60 caracteres (limite da NF-e) |
nome_fantasia |
até 60 |
ie |
inscrição estadual, 2 a 14 dígitos. Sem IE habilitada na SEFAZ não há NF-e |
im, cnae |
inscrição municipal (até 15 dígitos); CNAE com 7 dígitos |
regime |
mei, simples, simples_excesso, presumido ou real. Informe o verdadeiro: ele decide como o ICMS é calculado (CSOSN no Simples/MEI, CST nos demais) |
industrial |
true se for estabelecimento industrial (passa a exigir IPI) |
p_cred_sn |
percentual de crédito de ICMS do Simples (CSOSN 101), 0 a 100. Só para Simples/MEI |
uf |
sigla da UF |
codigo_municipio |
código IBGE do município (7 dígitos). Se faltar, a API descobre pelo CEP; se não conseguir, pede que você informe |
municipio, logradouro, numero, complemento, bairro |
endereço do emitente (até 60 caracteres cada) |
cep |
8 dígitos, com ou sem máscara |
telefone, email |
contato do emitente |
Limite de empresas: cada conta tem um máximo de empresas (padrão 50, ajustável). Passou dele: 422 limite_de_empresas. Criar empresa e enviar certificado são operações sensíveis: no máximo 10 chamadas por minuto por chave.
CNPJ já cadastrado na plataforma devolve 422 com erro no campo cnpj (a mesma mensagem, seja o CNPJ da sua conta ou de outra).
Atualizar uma empresa
PATCH /empresas/{cnpj}: atualização parcial. O que você não enviar fica como está, e o resultado inteiro é validado. O CNPJ não muda (o certificado e as notas estão presos a ele).
{ "nome_fantasia": "Loja Exemplo Centro", "regime": "presumido" }
Se você trocar o cep sem informar o município, o código IBGE antigo deixa de valer e a API o descobre de novo. Mande "ativo": false para desativar a emissão da empresa (as notas e o cadastro continuam); "ativo": true reativa.
Certificado digital A1
Para emitir, a SEFAZ exige o certificado A1 (arquivo .pfx ou .p12) e-CNPJ ICP-Brasil da empresa, dentro da validade. Certificado de pessoa física (e-CPF), A3 (token ou cartão) e autoassinado não servem.
PUT /empresas/{cnpj}/certificado aceita dois formatos.
JSON, com o arquivo em base64:
curl -s -X PUT "$API/empresas/11222333000181/certificado" -H "Authorization: Bearer $CHAVE" -H "Content-Type: application/json" \
-d "{\"arquivo_certificado_base64\": \"$(base64 -w0 certificado.pfx)\", \"senha_certificado\": \"SENHA\"}"
Multipart, com o arquivo:
curl -s -X PUT "$API/empresas/11222333000181/certificado" -H "Authorization: Bearer $CHAVE" \
-F "certificado=@certificado.pfx" -F "senha_certificado=SENHA"
A API confere que o arquivo abre com a senha, que não está vencido e que o CNPJ do certificado é o da empresa (mesma raiz de 8 dígitos: matriz e filiais compartilham o certificado do grupo). Resposta 200:
{ "empresa": "LOJA EXEMPLO LTDA:11222333000181", "cnpj": "11222333000181", "valido_ate": "2027-10-04", "dias_restantes": 364 }
- Arquivo de até 200 KB.
- A mensagem de erro para arquivo inválido e senha errada é a mesma de propósito (não ajudar quem está sondando): confira o arquivo e a senha.
- O arquivo e a senha ficam criptografados e nunca voltam em nenhuma resposta nem entram no log.
GET /empresas/{cnpj}/certificadodevolve só a situação:{ "instalado": true, "valido_ate": "2027-10-04", "dias_restantes": 364, "vencido": false }. Monitoredias_restantes: certificado vencido bloqueia toda a emissão da empresa.DELETE /empresas/{cnpj}/certificadoremove o certificado; sem ele não há emissão e a empresa volta para homologação.
Cadastrar já com o certificado (tudo ou nada)
O POST /empresas aceita arquivo_certificado_base64 e senha_certificado junto dos dados: se o certificado for recusado, a empresa também não é criada. É o jeito mais simples de fazer o onboarding de um cliente em uma só chamada.
Trocar de ambiente
PUT /empresas/{cnpj}/ambiente com { "ambiente": "producao" } ou { "ambiente": "homologacao" }.
Produção só libera quando nada impede. O que falta vem em erros.ambiente (e, a qualquer momento, em bloqueios_producao da empresa):
{ "codigo": "requisicao_invalida", "mensagem": "As tabelas fiscais ainda não foram validadas por um contador (FISCAL_RATES_VERIFIED).",
"erros": { "ambiente": ["As tabelas fiscais ainda não foram validadas por um contador (FISCAL_RATES_VERIFIED)."] } }
Os bloqueios possíveis são: certificado A1 válido ausente ou vencido, inscrição estadual não informada e as tabelas fiscais da plataforma ainda não validadas. Antes de trocar, siga o checklist de produção.
Numeração da NF-e (séries e próximo número)
Cada empresa numera as notas em sequência, por série e por ambiente (homologação e produção têm sequências próprias). Sem configurar nada, a nota sai na série 1 a partir do número 1.
Quem já emitia por outro sistema (Bling, Tiny...) precisa continuar de onde parou: a SEFAZ recusa número repetido na mesma série. Antes da primeira nota em produção, informe o próximo número:
curl -s -X PUT "$API/empresas/11222333000181/series/1" -H "Authorization: Bearer $CHAVE" -H "Content-Type: application/json" \
-d '{ "proximo_numero": 1500 }'
Resposta 200:
{ "cnpj": "11222333000181", "ambiente": "producao", "serie": 1, "ultimo_numero": 1499, "proximo_numero": 1500 }
- A série vai de
0a889(890 em diante são do fisco e da contingência). Série que não existe é criada na hora. - A numeração só anda para a frente: número menor ou igual ao maior já usado na série responde
422numero_retroativo, com ominimoaceito. Número já usado nunca é reaproveitado. - O ajuste vale para o ambiente atual da empresa. Configure a numeração de produção depois de trocar de ambiente.
- Pular números sem nota (por exemplo, ir de 10 para 1500 sem ter emitido 11 a 1499 em outro sistema) obriga a inutilizar a faixa pulada.
GET /empresas/{cnpj}/series lista as séries do ambiente atual com ultimo_numero e proximo_numero (sem nenhuma nota, a série 1 aparece com próximo número 1). Para emitir em outra série, mande serie no corpo da nota (Emitir NF-e).
Resposta da empresa
Campos que você vai usar mais: ambiente (homologacao ou producao), certificado.dias_restantes e certificado.vencido, bloqueios_producao (lista do que impede a produção; vazia quando pode ligar) e ativo.