NFS-e Nacional via API: como integrar com a FOX NF-e
Para emitir NFS-e pela FOX NF-e, primeiro consulte GET /api/v1/nfse/cobertura/{ibge} para ver o que está declarado para o município. Depois envie POST /api/v1/nfse/emit com Authorization: Bearer e X-Tenant-ID. A resposta 202 traz nfse_id e indica enfileiramento, não autorização. Consulte GET /api/v1/nfse/{nfse} até authorized. A NFS-e Nacional não está incluída no Trial nem no Starter.
O que você precisa antes da primeira chamada
A NFS-e depende de mais variáveis do que a NF-e: além de conta, token e certificado, importam o município, o provedor e o plano contratado. No catálogo atual, a NFS-e Nacional não está incluída no Trial nem no Starter. O cadastro inicia avaliação de 14 dias em homologação e não equivale a autorização fiscal. Guarde o token só no servidor da integração.
- Conta, plano e tenant: plano que inclua NFS-e Nacional; o cabeçalho
X-Tenant-IDrecebe o slug textual do tenant. - Token: obtido por
POST /api/v1/auth/logine enviado comoAuthorization: Bearer <SEU_TOKEN>; confirme comGET /api/v1/auth/me. - Certificado A1: cadastrado para o CNPJ prestador; consulte
GET /api/v1/certificates. - Dados do prestador: CNPJ (14 dígitos), inscrição municipal e endereço com código IBGE do município.
- Ambiente: a documentação indica que a NFS-e tem contrato próprio de ambiente; o schema de emissão publicado não traz campo de ambiente no corpo. Confirme no portal do desenvolvedor como o ambiente do seu tenant está configurado e mantenha a integração em homologação.
Emissão de ponta a ponta
O fluxo é assíncrono e começa pela verificação do município, porque a cobertura é declarada por município e provedor, não presumida. Siga as etapas na ordem e comece por chamadas de leitura. Diante de timeout ou erro 5xx, consulte o recurso antes de reenviar; a documentação vincula a idempotência ao par payload e tenant, e reemitir às cegas pode gerar retrabalho.
- Confirme a identidade. Chame
GET /api/v1/auth/mee verifique o tenant retornado. - Verifique o município. Consulte
GET /api/v1/nfse/cobertura/{ibge}e leiaadesao_nacional,driver,opsehomologacao_externa. - Confirme o certificado. Liste com
GET /api/v1/certificates. - Monte o corpo. Preencha os campos obrigatórios da tabela abaixo, incluindo
tomadorcomcnpjoucpf. - Envie a emissão. Faça
POST /api/v1/nfse/emite guardenfse_id. - Consulte o resultado. Chame
GET /api/v1/nfse/{nfse}até um estado final; confiranumero_nfse,chave_acessoecodigo_verificacao. - Consulte pela chave ou número, se preciso. Use
GET /api/v1/nfse/consult/{chave}ouGET /api/v1/nfse/consult/numero/{numero}. - Cancele ou substitua. Use
POST /api/v1/nfse/{nfse}/cancel(campojustificativa, 15 a 255 caracteres) ouPOST /api/v1/nfse/{nfse}/substitute(campomotivoe os dados do novo documento). O 202 indica pedido enfileirado.
Requisição e resposta conforme o OpenAPI
O corpo abaixo parte do exemplo estrutural do OpenAPI vigente, completado com os campos que o próprio schema exige: documento do tomador e códigos de tributação com alíquota. Todos os valores são fictícios e devem ser trocados por dados válidos de homologação. Em vez dos três campos de tributação, o schema também aceita informar cnae. O exemplo não comprova aceitação fiscal.
Verificação do município antes da emissão:
curl -sS "https://www.foxnfe.com.br/api/v1/nfse/cobertura/<CODIGO_IBGE>" \
-H "Authorization: Bearer <SEU_TOKEN>" \
-H "X-Tenant-ID: <SLUG_DO_TENANT>" \
-H "Accept: application/json"
A mesma leitura com o SDK Python oficial (foxnfe no PyPI):
import os
from foxnfe import Client # pip install foxnfe==1.3.1
client = Client(
tenant_slug=os.environ["FOXNFE_TENANT"], # slug do tenant, não número
token=os.environ["FOXNFE_TOKEN"], # nunca no código nem em log
base_url="https://www.foxnfe.com.br/api/v1", # informe sempre a URL canônica
)
# Somente leitura: capacidades declaradas para um município (código IBGE de 7 dígitos)
cobertura = client.nfse.cobertura_municipio(os.environ["IBGE_MUNICIPIO"])
dados = cobertura.get("data", {})
for campo in ("adesao_nacional", "driver", "ops", "homologacao_externa"):
print(campo, "=", dados.get(campo))
Corpo da emissão (nfse.json):
{
"competencia": "0000-00",
"cnpj_prestador": "00000000000000",
"inscricao_municipal": "EXEMPLO_FICTICIO",
"descricao_servico": "EXEMPLO_FICTICIO",
"codigo_tributacao_nacional": "00.00.00.00",
"codigo_tributacao_municipal": "EXEMPLO_FICTICIO",
"aliquota_iss": 0,
"codigo_municipio_prestacao": "0000000",
"valor_servico": 1,
"tomador": {
"cnpj": "00000000000000",
"nome": "EXEMPLO_FICTICIO"
},
"prestador": {
"endereco": {
"logradouro": "EXEMPLO_FICTICIO",
"numero": "EXEMPLO_FI",
"bairro": "EXEMPLO_FICTICIO",
"codigo_municipio": "EXEMPLO",
"uf": "EX",
"cep": "00000000"
}
}
}
Envio:
curl -sS -X POST "https://www.foxnfe.com.br/api/v1/nfse/emit" \
-H "Authorization: Bearer <SEU_TOKEN>" \
-H "X-Tenant-ID: <SLUG_DO_TENANT>" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
--data @nfse.json
Resposta 202 (exemplo estrutural do OpenAPI):
{
"nfse_id": 1,
"status": "draft",
"message": "NFSe enfileirada para emissão"
}
Consulta do resultado:
curl -sS "https://www.foxnfe.com.br/api/v1/nfse/<NFSE_ID>" \
-H "Authorization: Bearer <SEU_TOKEN>" \
-H "X-Tenant-ID: <SLUG_DO_TENANT>" \
-H "Accept: application/json"
| Campo do corpo | Regra no OpenAPI |
|---|---|
competencia | Obrigatório, formato AAAA-MM. |
cnpj_prestador, inscricao_municipal | Obrigatórios; CNPJ com 14 dígitos, inscrição até 20 caracteres. |
descricao_servico | Obrigatório, de 5 a 2000 caracteres. |
cnae ou codigo_tributacao_nacional + codigo_tributacao_municipal + aliquota_iss | Na ausência de cnae, os três são obrigatórios; o código nacional segue o padrão 00.00.00.00 e a alíquota vai de 0 a 100. |
codigo_municipio_prestacao | Obrigatório, código IBGE com 7 dígitos. |
valor_servico | Obrigatório, mínimo 0,01; valor_deducoes é opcional. |
tomador | Obrigatório: nome e cnpj (14 dígitos) ou cpf; endereco opcional. |
prestador.endereco | Obrigatório: logradouro, numero (até 10), bairro, codigo_municipio (7), uf e cep (8 dígitos). |
rtc | Opcional. Com rtc.incluir verdadeiro, exige resolution_id, sku, cind_op, fin_nfse, ind_dest e codigo_nbs (9 dígitos). Os campos cst, cclass_trib, source_version, valor_ibs e valor_cbs são proibidos nesse grupo. |
| Campo da consulta | Significado |
|---|---|
status | Estado do documento (ver tabela a seguir). |
numero_nfse, chave_acesso, codigo_verificacao | Identificação do documento; podem vir nulos até a autorização. |
valor_servico, valor_iss, aliquota_iss | Valores do serviço e do ISS. |
authorized_at, canceled_at | Datas de autorização e cancelamento, quando houver. |
Estados do documento e o que fazer
O campo status da NFS-e segue o enum publicado no OpenAPI, que inclui substituted. Trate como autorizada apenas a nota em authorized com identificação preenchida; aceitação HTTP ou enfileiramento não é autorização fiscal. Os estados intermediários pedem nova consulta. A tabela resume a ação recomendada sem presumir comportamento que o contrato público não descreve.
| Status | O que significa para a integração | O que fazer |
|---|---|---|
draft, pending, processing | Pedido aceito pela API, ainda sem resultado final. | Consulte de novo mais tarde. Não reenvie. |
authorized | Nota autorizada. | Grave numero_nfse, chave_acesso e codigo_verificacao. |
rejected | Recusa no processamento. | Corrija os dados e só então avalie nova emissão. |
canceled | Cancelamento registrado; canceled_at preenchido. | Atualize o seu sistema. |
substituted | Nota substituída por outra. | Passe a referenciar o documento substituto. |
Erros confirmados no contrato e na documentação
Os erros abaixo aparecem no OpenAPI ou no portal do desenvolvedor, com o código textual devolvido no campo error. Eles cobrem autenticação, validação, cobertura e operações não oferecidas para o provedor do município. Se receber uma resposta não descrita aqui, registre o corpo sem o token, consulte o estado do recurso e procure o suporte antes de repetir a chamada.
| Resposta | Causa | Correção |
|---|---|---|
| 401 ou 403 | Token ausente, inválido ou sem permissão. | Revalide com GET /api/v1/auth/me. |
422 com mapa errors | Campo obrigatório ausente ou fora do formato. | Ajuste o corpo conforme a tabela de campos. |
422 ibge_invalido | Código IBGE inválido na consulta de cobertura. | Envie o código de 7 dígitos. |
404 municipio_nao_encontrado | Município fora da base de cobertura. | Confira o código na matriz pública. |
409 operacao_nao_oferecida | Cancelamento ou substituição não oferecidos para o provedor. | Verifique ops na cobertura do município. |
422 cancelation_not_allowed / substitution_not_allowed | Operação não permitida para a nota no estado atual. | Consulte o status antes de pedir de novo. |
502 govbr_api_error | Falha na consulta ao ambiente nacional em /api/v1/nfse/consult/{chave}. | Repita a consulta depois; ela não emite documento. |
Limites, cobertura municipal e fontes oficiais
A cobertura depende de documento, município, provedor e ambiente, e não deve ser inferida como universal. Cadastro territorial, adesão ao padrão nacional, parametrização municipal, integração testada e produção liberada são estados diferentes. Antes de prometer emissão ao seu cliente, consulte a matriz pública e o endpoint de cobertura do município. Franquias e condições estão no portal.
- Matriz pública: cobertura municipal de NFS-e da FOX NF-e, sem login. Segundo o llms.txt de 23/09/2026, a base tem 5.571 registros territoriais, com 30 municípios cadastrados com SpeedGov, 1 com Ginfes e 5.540 sem provedor identificado.
- Homologação externa: a documentação informa que
homologacao_externapermanece pendente de autorização até o ciclo real com o município. - Padrão nacional: segundo o Portal Nacional da NFS-e, a NFS-e de padrão nacional “objetiva unificar e simplificar os processos de emissão e guarda desses documentos em todo o território nacional”, e “a adesão ao padrão nacional deverá ser ratificada pelo município através da assinatura do Termo de Adesão”.
- IBS e CBS: no cronograma da Receita Federal (Ato Conjunto RFB/CGIBS nº 4/2026), a NFS-e de serviços em geral está no marco de 1º de outubro de 2026, e categorias específicas têm outras datas. Veja o cronograma do IBS e da CBS na nota fiscal.
- Planos: a NFS-e Nacional não está incluída no Trial nem no Starter no catálogo atual; consulte planos e condições no portal FOX NF-e (login necessário).
- Agentes de IA: veja o guia do servidor MCP da FOX NF-e.
Perguntas frequentes
Estas respostas resumem o contrato público da API, a documentação do desenvolvedor e as fontes oficiais consultadas em 23/09/2026. Elas descrevem a integração, não o enquadramento fiscal do seu serviço. Para código de tributação, alíquota de ISS e regime, consulte o seu contador e a legislação do município. Confira o OpenAPI vigente antes de publicar a integração.
Qual endpoint emite NFS-e na FOX NF-e?
POST /api/v1/nfse/emit, com os cabeçalhos Authorization: Bearer e X-Tenant-ID. A resposta 202 traz nfse_id, status e message; o resultado é consultado em GET /api/v1/nfse/{nfse}.
A FOX NF-e emite NFS-e em qualquer município?
Não se deve presumir isso. A cobertura é declarada por município, provedor e ambiente. Consulte a matriz pública de cobertura municipal e o endpoint GET /api/v1/nfse/cobertura/{ibge} antes de integrar.
A NFS-e Nacional está incluída no Trial?
Não. No catálogo atual, a NFS-e Nacional não está incluída no Trial nem no Starter. Consulte os planos e condições no portal.
A resposta 202 significa nota autorizada?
Não. O 202 indica pedido aceito e enfileirado. A nota só está autorizada quando a consulta retorna status authorized com a identificação do documento preenchida.
Como cancelar ou substituir uma NFS-e?
Use POST /api/v1/nfse/{nfse}/cancel com justificativa de 15 a 255 caracteres, ou POST /api/v1/nfse/{nfse}/substitute com motivo e os dados do novo documento. Se o provedor do município não oferecer a operação, a API responde 409 operacao_nao_oferecida.
Autoria e método
Elaborado pela equipe fiscal e de engenharia da Central Fox Tecnologia LTDA com auxílio de IA a partir do contrato público da API e das fontes oficiais listadas; exemplos conferidos contra o OpenAPI vigente. Conteúdo informativo; não substitui orientação contábil ou jurídica. Atualizado em 23/09/2026.
Fontes consultadas em 23/09/2026:
- OpenAPI da FOX NF-e, versão 1.20260923.
- Portal do desenvolvedor FOX NF-e: autenticação, estados assíncronos e cobertura NFS-e.
- Portal Nacional da NFS-e: o projeto NFS-e.
- Receita Federal: cronograma dos documentos fiscais eletrônicos (Ato Conjunto RFB/CGIBS nº 4/2026).
- SDK Python foxnfe no PyPI, versão 1.3.1.
O contrato completo, com webhooks, SDKs e a matriz de cobertura municipal, está no portal do desenvolvedor.
Abrir o portal do desenvolvedor →