Download OpenAPI specification:
Emissão, consulta e cancelamento de NFS-e pelo contrato REST v2 de mercado.
Emissão de Nota Fiscal de Serviço eletrônica pelo seu sistema.
COMPATIBILIDADE: os caminhos, os campos e os literais de status são os do
contrato REST v2 de NFS-e que a maioria dos ERPs já integra. Quem já emite por
API migra trocando a URL base e o token, sem mexer no código do cliente.
DUAS REGRAS QUE MUDAM COMO SE ESCREVE O CLIENTE:
ref e a chave de idempotencia. Repetir o POST com a mesma ref NÃO emite
de novo: devolve a nota que já existe. Gere a ref a partir da sua transação,
nunca de um relogio ou de um aleatorio.processando_autorizacao NUNCA se reenvia. Só a consulta resolve.
Reenviar duplica documento fiscal, e documento fiscal duplicado se resolve com
o contador, não com código.O que este serviço nunca faz: responder 502, 503 ou 504 em rota de API (falha de dependencia sai como 422 com corpo próprio, porque a Cloudflare troca o corpo de 5xx pela página dela e o seu fetch cairia no catch sem a mensagem); guardar o seu token em claro; entregar PDF ou XML por link público.
A ref vai na QUERY, não no corpo, e e a chave de idempotencia.
Toda recusa de validação acontece ANTES de reservar número de RPS. Número reservado e número consumido: validar depois deixaria buraco na numeracao, e buraco na numeracao o fisco cobra explicacao.
| ref required | string <= 64 characters ^[A-Za-z0-9._-]{1,64}$ Example: ref=venda-2026-000123 Sua chave da transação. Não pode começar com ponto nem terminar em sufixo de arquivo reservado (.env, .log, .key e afins). |
| data_emissao | string <date-time> ISO 8601. Formato brasileiro é recusado. Omita para usar agora. |
| optante_simples_nacional | boolean Omita para usar o do cadastro do emissor. |
| regime_especial_tributacao | integer [ 1 .. 6 ] UM dígito, conforme o XSD ABRASF. Omita para usar o do cadastro. |
object | |
required | object |
required | object |
{- "data_emissao": "2026-09-02T10:00:00",
- "optante_simples_nacional": true,
- "regime_especial_tributacao": 1,
- "prestador": {
- "cnpj": "string"
}, - "tomador": {
- "cpf": "string",
- "cnpj": "string",
- "razao_social": "string",
- "email": "user@example.com",
- "telefone": "string",
- "endereco": {
- "logradouro": "string",
- "numero": "string",
- "complemento": "string",
- "bairro": "string",
- "codigo_municipio": "2910800",
- "uf": "string",
- "cep": "string"
}
}, - "servico": {
- "valor_servicos": 150,
- "aliquota": 2,
- "iss_retido": true,
- "item_lista_servico": "4.10",
- "codigo_tributario_municipio": "string",
- "codigo_cnae": "string",
- "ibs_cbs": {
- "cst": "string",
- "classificacao_tributaria": "string",
- "indicador_operacao": "string",
- "indicador_destinatario": "0",
- "uso_consumo_pessoal": "0"
}, - "discriminacao": "stringstri"
}
}{- "ref": "string",
- "status": "autorizado",
- "numero": "string",
- "numero_rps": "string",
- "serie_rps": "string",
- "codigo_verificacao": "string",
- "data_emissao": "2019-08-24T14:15:22Z",
- "url": "string",
- "caminho_danfse": "string",
- "caminho_xml_nota_fiscal": "string",
- "mensagem": "string",
- "erros": [
- { }
]
}Se a nota estiver em processamento, a consulta PERGUNTA a prefeitura antes de responder: e por isso que consultar resolve e reenviar não.
| ref required | string <= 64 characters A mesma ref usada na emissão. |
{- "ref": "string",
- "status": "autorizado",
- "numero": "string",
- "numero_rps": "string",
- "serie_rps": "string",
- "codigo_verificacao": "string",
- "data_emissao": "2019-08-24T14:15:22Z",
- "url": "string",
- "caminho_danfse": "string",
- "caminho_xml_nota_fiscal": "string",
- "mensagem": "string",
- "erros": [
- { }
]
}Só nota autorizada cancela. 202 com processando_cancelamento quando a prefeitura não foi conclusiva: repita o DELETE ou consulte, o serviço confere e resolve.
| ref required | string <= 64 characters A mesma ref usada na emissão. |
| justificativa required | string >= 15 characters Por que a nota está sendo cancelada. ATENÇÃO: este texto NÃO vai a prefeitura. O padrão ABRASF não tem campo livre para justificativa; ela fica no registro do serviço como prova de auditoria e volta na resposta. Quem declara o motivo ao fisco e o campo |
| motivo | integer Default: 1 Enum: 1 2 3 Declaração AO FISCO (tsCodigoCancelamentoNfse do ABRASF): 1 erro na emissão, 2 serviço não prestado, 3 erro de assinatura. Opcional; omitido vale 1. Informe o valor correto: 1 e 2 dizem coisas diferentes ao município. |
{- "justificativa": "Valor do serviço lancado errado na venda 4471.",
- "motivo": 2
}{- "ref": "string",
- "status": "autorizado",
- "numero": "string",
- "numero_rps": "string",
- "serie_rps": "string",
- "codigo_verificacao": "string",
- "data_emissao": "2019-08-24T14:15:22Z",
- "url": "string",
- "caminho_danfse": "string",
- "caminho_xml_nota_fiscal": "string",
- "mensagem": "string",
- "erros": [
- { }
]
}Como a prefeitura devolveu. Exige token, e responde no-store: documento fiscal com CPF do tomador nunca entra em cache.
| ref required | string <= 64 characters A mesma ref usada na emissão. |
{- "codigo": "nao_autorizado",
- "mensagem": "Token ausente, inválido, ou de um ambiente diferente do endereço chamado."
}Gerado do XML autorizado. Exige token: não existe link público de documento fiscal aqui. Se você hoje entrega ao seu usuário o link do PDF do integrador, troque por um proxy autenticado no seu servidor.
| ref required | string <= 64 characters A mesma ref usada na emissão. |
{- "codigo": "nao_autorizado",
- "mensagem": "Token ausente, inválido, ou de um ambiente diferente do endereço chamado."
}Cobertura MEDIDA, não afirmada: cada município da lista teve o webservice da prefeitura consultado e o padrão conferido, e a resposta traz a data dessa verificação. Consulte antes de prometer emissão ao seu cliente.
Município ausente da lista não e necessariamente município impossível: e município que não verificamos ou que usa um provedor para o qual ainda não há driver. Pergunte.
| uf | string^[A-Za-z]{2}$ Filtra por UF. |
| codigo_ibge | string^[0-9]{7}$ Pergunta por um município específico. |
{- "verificado_em": "2019-08-24",
- "total": 0,
- "municipios": [
- {
- "codigo_ibge": "string",
- "nome": "string",
- "uf": "string",
- "provedor": "string",
- "padrao": "string",
- "driver": "string",
- "verificado_em": "2019-08-24"
}
]
}Quantidade e valor por status no mês, no ambiente do token. O campo total soma TODOS os status, inclusive os que falharam, então ele não é o valor da fatura: quem responde por isso é cobravel, que aplica o mesmo critério do fechamento (nota que recebeu número da prefeitura, em produção). Em homologação cobravel é sempre 0, porque nada ali é cobrado.
| mes | string^\d{4}-(0[1-9]|1[0-2])$ Example: mes=2026-09 |
{- "mes": "2026-09",
- "ambiente": "homologacao",
- "por_status": {
- "property1": {
- "quantidade": 9,
- "valor": 5470
}, - "property2": {
- "quantidade": 9,
- "valor": 5470
}
}, - "total": 22,
- "cobravel": 9
}Enviado por nós para a URL que você cadastrar, uma por ambiente.
Confira o X-TexFiscal-Assinatura antes de confiar no conteúdo: e o HMAC-SHA256 do CORPO CRU com o segredo do seu webhook. Compare com hash_equals ou equivalente, nunca com == .
Três regras do receptor, e a segunda já custou caro em outros integradores:
| X-TexFiscal-Evento required | string O mesmo valor do campo evento. |
| X-TexFiscal-Tentativa required | integer Número da tentativa, comecando em 1. |
| X-TexFiscal-Assinatura required | string HMAC-SHA256 do corpo cru, em hexadecimal, com o segredo do seu webhook. |
| ref required | string |
| status | string Enum: "autorizado" "processando_autorizacao" "erro_autorizacao" "cancelado" "processando_cancelamento" |
| numero | string or null Número da NFS-e na prefeitura. |
| numero_rps | string or null |
| serie_rps | string or null |
| codigo_verificacao | string or null |
| data_emissao | string or null <date-time> |
| url | string or null Endereço do DANFSe. Exige o token: não e link público. |
| caminho_danfse | string or null |
| caminho_xml_nota_fiscal | string or null |
| mensagem | string or null |
| erros | Array of objects or null |
| evento required | string Enum: "nfse_autorizada" "nfse_erro" "nfse_cancelada" "nfse_cancelamento_nao_efetivado" nfse_cancelamento_nao_efetivado significa que o cancelamento NÃO valeu na prefeitura e a nota voltou a estar autorizada: e o único que pede acao sua. |
| evento_id required | integer Único e estável. Use como chave de deduplicação. |
| ocorrido_em required | string <date-time> Quando o evento foi gerado, não quando foi entregue. Use para descartar evento fora de ordem. |
{- "ref": "string",
- "status": "autorizado",
- "numero": "string",
- "numero_rps": "string",
- "serie_rps": "string",
- "codigo_verificacao": "string",
- "data_emissao": "2019-08-24T14:15:22Z",
- "url": "string",
- "caminho_danfse": "string",
- "caminho_xml_nota_fiscal": "string",
- "mensagem": "string",
- "erros": [
- { }
], - "evento": "nfse_autorizada",
- "evento_id": 0,
- "ocorrido_em": "2019-08-24T14:15:22Z"
}