Baixar a especificação OpenAPI:
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 é a chave de idempotência. 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 relógio ou de um aleatório.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 dependência 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 é a chave de idempotência.
Toda recusa de validação acontece ANTES de reservar número de RPS. Número reservado é número consumido: validar depois deixaria buraco na numeração, e buraco na numeração o fisco cobra explicação.
| ref required | string <= 64 characters ^[A-Za-z0-9._-]{1,64}$ Exemplo: 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": [
- { }
]
}Listagem paginada (50 por página) das notas do emissor no ambiente do token, da mais recente para a mais antiga, para conciliar sem consultar ref por ref. Nunca leva payload, XML nem PDF, e não pergunta à prefeitura: nota pendente aparece como está no serviço.
| de | string <date> Dia inicial de criação da nota (inclusive), AAAA-MM-DD. |
| ate | string <date> Dia final de criação da nota (inclusive), AAAA-MM-DD. |
| status | string Valores possíveis: "autorizado" "processando_autorizacao" "erro_autorizacao" "cancelado" "processando_cancelamento" "denegado" Literal público, o mesmo que o GET por ref devolve. processando_autorizacao cobre recebida e processando. |
| pagina | integer >= 1 Padrão: 1 50 por página, da mais recente para a mais antiga. |
{- "documento": "nfse",
- "ambiente": "homologacao",
- "pagina": 0,
- "paginas": 0,
- "total": 0,
- "por_pagina": 0,
- "notas": [
- {
- "ref": "string",
- "status": "autorizado",
- "status_texfiscal": "string",
- "numero": "string",
- "codigo_verificacao": "string",
- "serie_rps": "string",
- "numero_rps": 0,
- "valor": 0,
- "tomador": "string",
- "mensagem": "string",
- "data_emissao": "string",
- "processado_em": "string",
- "cancelada_em": "string",
- "criado_em": "string",
- "atualizado_em": "string"
}
]
}Roda a mesma validação da emissão (cadastro do emissor e regras do payload) e PARA antes de reservar RPS, assinar ou falar com a prefeitura. 200 quando passa; 422 requisicao_invalida com os mesmos erros[] da emissão quando não passa. Não exige certificado, então serve para homologar a integração antes de o A1 chegar. A prefeitura ainda pode recusar por regra própria dela.
| 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"
}
}{- "valido": true,
- "documento": "nfse",
- "ambiente": "string",
- "mensagem": "string"
}Se a nota estiver em processamento, a consulta PERGUNTA à prefeitura antes de responder: é 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 à 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 é o campo |
| motivo | integer Padrão: 1 Valores possíveis: 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, então NÃO entregue este endereço ao seu usuário final: ele receberia 401 em JSON. Para mostrar o PDF a quem recebeu a nota, peça um endereço assinado em /v2/nfse/{ref}/pdf/link, que abre sem token e expira.
| 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."
}Devolve um endereço de curta validade que abre o PDF SEM token, para você entregar ao navegador de quem recebeu a nota (botão de e-mail, tela do cliente, WhatsApp). É a alternativa oficial ao proxy autenticado que cada integrador vinha escrevendo. O endereço vale para UM documento, expira, e não dá acesso a mais nada da conta: quem o tiver antes da expiração abre esse PDF, então entregue apenas ao destinatário da nota. A validade padrão é de 900 segundos e o teto é de 604800 (sete dias). Depois de expirar, o endereço responde uma página dizendo que o link venceu, e não JSON, porque quem lê é uma pessoa. O PDF em si não pode ser exibido dentro de um iframe (frame-ancestors none neste host): abra em aba nova ou ofereça como download.
| ref required | string <= 64 characters A mesma ref usada na emissão. |
| validade | integer [ 60 .. 604800 ] Padrão: 900 Exemplo: validade=3600 Validade do endereço, em segundos. Fora da faixa, o valor é ajustado ao limite mais próximo, sem erro. |
{- "expira_em": "2019-08-24T14:15:22Z",
- "validade_segundos": 0,
- "aviso": "string"
}Nota fiscal de mercadoria (modelos 55 e 65) direto na SEFAZ: emitir, consultar, cancelar, carta de correção, inutilização e XML de distribuição.
Devolve um endereço de curta validade que abre o PDF SEM token, para você entregar ao navegador de quem recebeu a nota (botão de e-mail, tela do cliente, WhatsApp). É a alternativa oficial ao proxy autenticado que cada integrador vinha escrevendo. O endereço vale para UM documento, expira, e não dá acesso a mais nada da conta: quem o tiver antes da expiração abre esse PDF, então entregue apenas ao destinatário da nota. A validade padrão é de 900 segundos e o teto é de 604800 (sete dias). Depois de expirar, o endereço responde uma página dizendo que o link venceu, e não JSON, porque quem lê é uma pessoa. O PDF em si não pode ser exibido dentro de um iframe (frame-ancestors none neste host): abra em aba nova ou ofereça como download.
| ref required | string <= 64 characters A mesma ref usada na emissão. |
| validade | integer [ 60 .. 604800 ] Padrão: 900 Exemplo: validade=3600 Validade do endereço, em segundos. Fora da faixa, o valor é ajustado ao limite mais próximo, sem erro. |
{- "expira_em": "2019-08-24T14:15:22Z",
- "validade_segundos": 0,
- "aviso": "string"
}Devolve um endereço de curta validade que abre o PDF SEM token, para você entregar ao navegador de quem recebeu a nota (botão de e-mail, tela do cliente, WhatsApp). É a alternativa oficial ao proxy autenticado que cada integrador vinha escrevendo. O endereço vale para UM documento, expira, e não dá acesso a mais nada da conta: quem o tiver antes da expiração abre esse PDF, então entregue apenas ao destinatário da nota. A validade padrão é de 900 segundos e o teto é de 604800 (sete dias). Depois de expirar, o endereço responde uma página dizendo que o link venceu, e não JSON, porque quem lê é uma pessoa. O PDF em si não pode ser exibido dentro de um iframe (frame-ancestors none neste host): abra em aba nova ou ofereça como download.
| ref required | string <= 64 characters A mesma ref usada na emissão. |
| validade | integer [ 60 .. 604800 ] Padrão: 900 Exemplo: validade=3600 Validade do endereço, em segundos. Fora da faixa, o valor é ajustado ao limite mais próximo, sem erro. |
{- "expira_em": "2019-08-24T14:15:22Z",
- "validade_segundos": 0,
- "aviso": "string"
}Modelo 65, transmitida de forma síncrona à SEFAZ da UF do emissor. A ref vai na
QUERY e é a chave de idempotência: repetir com a mesma ref devolve a nota que existe.
Toda recusa de validação (CFOP, CSOSN, GTIN, pagamento menor que o total, valor bruto
diferente de quantidade x unitário) acontece ANTES de numerar. A nota recusada pela SEFAZ
volta 422 com status_sefaz e mensagem_sefaz, e pode ser reenviada com a MESMA ref
(mesmo número, mesma chave) depois de corrigida; número DENEGADO não volta.
Sem desfecho (SEFAZ fora do ar, timeout) a resposta é 202: NUNCA reenvie, consulte. A NFC-e exige CSC cadastrado no emissor (produção) e só aceita CFOP de venda a consumidor.
| ref required | string <= 64 characters ^[A-Za-z0-9._-]{1,64}$ Exemplo: ref=venda-2026-000123 Sua chave da transação. Uma ref por documento; nota cancelada não reaproveita a ref. |
| natureza_operacao | string <= 60 characters |
| cnpj_emitente | string Opcional. Se vier, tem de ser o CNPJ do emissor do token (senão 422 emitente_divergente). |
| numero | integer [ 1 .. 999999999 ] Opcional. Sem ele o serviço numera a série. Número já usado por outra ref responde 409 numero_em_uso. |
| serie | integer [ 0 .. 889 ] Padrão: 1 |
| tipo_documento | integer Padrão: 1 Valores possíveis: 0 1 0 entrada, 1 saída. NFC-e só saída. |
| finalidade_emissao | integer Padrão: 1 Valores possíveis: 1 2 3 4 1 normal, 2 complementar, 3 ajuste, 4 devolução (exige notas_referenciadas). |
| local_destino | integer Padrão: 1 Valores possíveis: 1 2 3 NF-e: recalculado pela UF do destinatário quando divergir. |
| consumidor_final | integer Padrão: 1 Valores possíveis: 0 1 |
| presenca_comprador | integer Padrão: 1 NFC-e aceita só 1 (presencial) e 4 (entrega a domicílio). |
| modalidade_frete | integer Padrão: 9 Valores possíveis: 0 1 2 3 4 9 |
| cnpj_destinatario | string NF-e exige CNPJ ou CPF. NFC-e aceita e não exige. |
| cpf_destinatario | string |
| nome_destinatario | string <= 60 characters |
| indicador_inscricao_estadual_destinatario | integer Padrão: 9 Valores possíveis: 1 2 9 1 contribuinte (exige inscricao_estadual_destinatario), 2 isento, 9 não contribuinte. NFC-e é sempre 9. |
| inscricao_estadual_destinatario | string |
| email_destinatario | string |
| logradouro_destinatario | string <= 60 characters |
| numero_destinatario | string <= 60 characters |
| complemento_destinatario | string <= 60 characters |
| bairro_destinatario | string <= 60 characters |
| municipio_destinatario | string Nome do município. Com uf_destinatario, o código IBGE é resolvido pela tabela oficial; se não resolver, mande codigo_municipio_destinatario. |
| codigo_municipio_destinatario | string^[0-9]{7}$ |
| uf_destinatario | string^[A-Z]{2}$ |
| cep_destinatario | string |
| telefone_destinatario | string |
Lista de objects | |
| cnpjs_autorizados_xml | Lista de strings Quem pode baixar o XML na SEFAZ (contador). Na Bahia a NF-e exige o grupo: sem ele o serviço informa o CNPJ da própria SEFAZ-BA. |
| informacoes_adicionais_contribuinte | string <= 5000 characters |
| valor_troco | number |
required | Lista de objects [ 1 .. 990 ] items |
required | Lista de objects non-empty |
{- "natureza_operacao": "Venda de mercadoria",
- "cnpj_emitente": "string",
- "numero": 1,
- "serie": 1,
- "tipo_documento": 0,
- "finalidade_emissao": 1,
- "local_destino": 1,
- "consumidor_final": 0,
- "presenca_comprador": 1,
- "modalidade_frete": 0,
- "cnpj_destinatario": "string",
- "cpf_destinatario": "string",
- "nome_destinatario": "string",
- "indicador_inscricao_estadual_destinatario": 1,
- "inscricao_estadual_destinatario": "string",
- "email_destinatario": "string",
- "logradouro_destinatario": "string",
- "numero_destinatario": "string",
- "complemento_destinatario": "string",
- "bairro_destinatario": "string",
- "municipio_destinatario": "string",
- "codigo_municipio_destinatario": "string",
- "uf_destinatario": "string",
- "cep_destinatario": "string",
- "telefone_destinatario": "string",
- "notas_referenciadas": [
- {
- "chave_nfe": "string"
}
], - "cnpjs_autorizados_xml": [
- "string"
], - "informacoes_adicionais_contribuinte": "string",
- "valor_troco": 0,
- "items": [
- {
- "codigo_produto": "string",
- "descricao": "string",
- "codigo_ncm": "string",
- "cest": "string",
- "cfop": "string",
- "unidade_comercial": "UN",
- "quantidade_comercial": 1,
- "valor_unitario_comercial": 1,
- "valor_bruto": 0,
- "valor_desconto": 0,
- "codigo_ean": "string",
- "inclui_no_total": 0,
- "icms_origem": "0",
- "icms_situacao_tributaria": "string",
- "pis_situacao_tributaria": "49",
- "cofins_situacao_tributaria": "49",
- "valor_total_tributos": 0
}
], - "formas_pagamento": [
- {
- "forma_pagamento": "string",
- "valor_pagamento": 0,
- "tipo_integracao": "1",
- "cnpj_credenciadora": "string",
- "bandeira_operadora": "string",
- "numero_autorizacao": "string"
}
]
}{- "ref": "string",
- "status": "autorizado",
- "modelo": "55",
- "serie": "string",
- "numero": "string",
- "status_sefaz": "string",
- "mensagem_sefaz": "string",
- "chave_nfe": "string",
- "protocolo": "string",
- "data_emissao": "2019-08-24T14:15:22Z",
- "data_autorizacao": "2019-08-24T14:15:22Z",
- "caminho_xml_nota_fiscal": "string",
- "qrcode_url": "string",
- "url_consulta_nf": "string",
- "protocolo_cancelamento": "string",
- "caminho_xml_cancelamento": "string",
- "mensagem": "string",
- "erros": [
- { }
]
}Listagem paginada (50 por página) das NFC-e do emissor no ambiente do token, da mais recente para a mais antiga, para conciliar sem consultar ref por ref. Nunca leva payload nem XML, e não pergunta à SEFAZ: nota pendente aparece como está no serviço.
| de | string <date> Dia inicial de criação da nota (inclusive), AAAA-MM-DD. |
| ate | string <date> Dia final de criação da nota (inclusive), AAAA-MM-DD. |
| status | string Valores possíveis: "autorizado" "processando_autorizacao" "erro_autorizacao" "cancelado" "processando_cancelamento" "denegado" Literal público, o mesmo que o GET por ref devolve. processando_autorizacao cobre recebida e processando. |
| pagina | integer >= 1 Padrão: 1 50 por página, da mais recente para a mais antiga. |
{- "documento": "nfse",
- "ambiente": "homologacao",
- "pagina": 0,
- "paginas": 0,
- "total": 0,
- "por_pagina": 0,
- "notas": [
- {
- "ref": "string",
- "status": "autorizado",
- "status_texfiscal": "string",
- "serie": 0,
- "numero": 0,
- "chave_nfe": "string",
- "status_sefaz": "string",
- "mensagem_sefaz": "string",
- "protocolo": "string",
- "valor": 0,
- "destinatario": "string",
- "data_emissao": "string",
- "autorizada_em": "string",
- "cancelada_em": "string",
- "criado_em": "string",
- "atualizado_em": "string"
}
]
}Roda a mesma validação da emissão (habilitação, UF, cadastro do emissor, CFOP, CSOSN, GTIN, pagamentos, totais) e PARA antes de numerar, assinar e transmitir. 200 quando passa; 422 requisicao_invalida com os mesmos erros[] da emissão quando não passa. Não consome número da série nem toca a SEFAZ, que ainda pode recusar por regra própria dela.
| natureza_operacao | string <= 60 characters |
| cnpj_emitente | string Opcional. Se vier, tem de ser o CNPJ do emissor do token (senão 422 emitente_divergente). |
| numero | integer [ 1 .. 999999999 ] Opcional. Sem ele o serviço numera a série. Número já usado por outra ref responde 409 numero_em_uso. |
| serie | integer [ 0 .. 889 ] Padrão: 1 |
| tipo_documento | integer Padrão: 1 Valores possíveis: 0 1 0 entrada, 1 saída. NFC-e só saída. |
| finalidade_emissao | integer Padrão: 1 Valores possíveis: 1 2 3 4 1 normal, 2 complementar, 3 ajuste, 4 devolução (exige notas_referenciadas). |
| local_destino | integer Padrão: 1 Valores possíveis: 1 2 3 NF-e: recalculado pela UF do destinatário quando divergir. |
| consumidor_final | integer Padrão: 1 Valores possíveis: 0 1 |
| presenca_comprador | integer Padrão: 1 NFC-e aceita só 1 (presencial) e 4 (entrega a domicílio). |
| modalidade_frete | integer Padrão: 9 Valores possíveis: 0 1 2 3 4 9 |
| cnpj_destinatario | string NF-e exige CNPJ ou CPF. NFC-e aceita e não exige. |
| cpf_destinatario | string |
| nome_destinatario | string <= 60 characters |
| indicador_inscricao_estadual_destinatario | integer Padrão: 9 Valores possíveis: 1 2 9 1 contribuinte (exige inscricao_estadual_destinatario), 2 isento, 9 não contribuinte. NFC-e é sempre 9. |
| inscricao_estadual_destinatario | string |
| email_destinatario | string |
| logradouro_destinatario | string <= 60 characters |
| numero_destinatario | string <= 60 characters |
| complemento_destinatario | string <= 60 characters |
| bairro_destinatario | string <= 60 characters |
| municipio_destinatario | string Nome do município. Com uf_destinatario, o código IBGE é resolvido pela tabela oficial; se não resolver, mande codigo_municipio_destinatario. |
| codigo_municipio_destinatario | string^[0-9]{7}$ |
| uf_destinatario | string^[A-Z]{2}$ |
| cep_destinatario | string |
| telefone_destinatario | string |
Lista de objects | |
| cnpjs_autorizados_xml | Lista de strings Quem pode baixar o XML na SEFAZ (contador). Na Bahia a NF-e exige o grupo: sem ele o serviço informa o CNPJ da própria SEFAZ-BA. |
| informacoes_adicionais_contribuinte | string <= 5000 characters |
| valor_troco | number |
required | Lista de objects [ 1 .. 990 ] items |
required | Lista de objects non-empty |
{- "natureza_operacao": "Venda de mercadoria",
- "cnpj_emitente": "string",
- "numero": 1,
- "serie": 1,
- "tipo_documento": 0,
- "finalidade_emissao": 1,
- "local_destino": 1,
- "consumidor_final": 0,
- "presenca_comprador": 1,
- "modalidade_frete": 0,
- "cnpj_destinatario": "string",
- "cpf_destinatario": "string",
- "nome_destinatario": "string",
- "indicador_inscricao_estadual_destinatario": 1,
- "inscricao_estadual_destinatario": "string",
- "email_destinatario": "string",
- "logradouro_destinatario": "string",
- "numero_destinatario": "string",
- "complemento_destinatario": "string",
- "bairro_destinatario": "string",
- "municipio_destinatario": "string",
- "codigo_municipio_destinatario": "string",
- "uf_destinatario": "string",
- "cep_destinatario": "string",
- "telefone_destinatario": "string",
- "notas_referenciadas": [
- {
- "chave_nfe": "string"
}
], - "cnpjs_autorizados_xml": [
- "string"
], - "informacoes_adicionais_contribuinte": "string",
- "valor_troco": 0,
- "items": [
- {
- "codigo_produto": "string",
- "descricao": "string",
- "codigo_ncm": "string",
- "cest": "string",
- "cfop": "string",
- "unidade_comercial": "UN",
- "quantidade_comercial": 1,
- "valor_unitario_comercial": 1,
- "valor_bruto": 0,
- "valor_desconto": 0,
- "codigo_ean": "string",
- "inclui_no_total": 0,
- "icms_origem": "0",
- "icms_situacao_tributaria": "string",
- "pis_situacao_tributaria": "49",
- "cofins_situacao_tributaria": "49",
- "valor_total_tributos": 0
}
], - "formas_pagamento": [
- {
- "forma_pagamento": "string",
- "valor_pagamento": 0,
- "tipo_integracao": "1",
- "cnpj_credenciadora": "string",
- "bandeira_operadora": "string",
- "numero_autorizacao": "string"
}
]
}{- "valido": true,
- "documento": "nfse",
- "ambiente": "string",
- "mensagem": "string"
}Cupom de bobina de 80mm, com a altura ajustada ao número de itens e o QR Code da consulta desenhado. É a representação impressa; o documento fiscal continua sendo o XML.
| ref required | string <= 64 characters ^[A-Za-z0-9._-]{1,64}$ Exemplo: venda-2026-000123 A sua chave da transação, a mesma usada na emissão. |
{- "codigo": "nao_autorizado",
- "mensagem": "Token ausente, inválido, ou de um ambiente diferente do endereço chamado."
}Nota pendente: a consulta pergunta a SEFAZ pela chave (no máximo uma vez a cada 15 s). Nota recusada volta 422 com o motivo da SEFAZ.
| ref required | string <= 64 characters A mesma ref usada na emissão. |
{- "ref": "string",
- "status": "autorizado",
- "modelo": "55",
- "serie": "string",
- "numero": "string",
- "status_sefaz": "string",
- "mensagem_sefaz": "string",
- "chave_nfe": "string",
- "protocolo": "string",
- "data_emissao": "2019-08-24T14:15:22Z",
- "data_autorizacao": "2019-08-24T14:15:22Z",
- "caminho_xml_nota_fiscal": "string",
- "qrcode_url": "string",
- "url_consulta_nf": "string",
- "protocolo_cancelamento": "string",
- "caminho_xml_cancelamento": "string",
- "mensagem": "string",
- "erros": [
- { }
]
}Só nota autorizada cancela. O prazo é da SEFAZ (24 h para NF-e; NFC-e na Bahia, 30 minutos sem circulação da mercadoria): fora dele a resposta é 422 cancelamento_recusado com o cStat. A justificativa (15 a 255 caracteres) VAI à SEFAZ no evento 110111.
| ref required | string <= 64 characters A mesma ref usada na emissão. |
| justificativa required | string [ 15 .. 255 ] characters |
{- "justificativa": "stringstringstr"
}{- "ref": "string",
- "status": "autorizado",
- "modelo": "55",
- "serie": "string",
- "numero": "string",
- "status_sefaz": "string",
- "mensagem_sefaz": "string",
- "chave_nfe": "string",
- "protocolo": "string",
- "data_emissao": "2019-08-24T14:15:22Z",
- "data_autorizacao": "2019-08-24T14:15:22Z",
- "caminho_xml_nota_fiscal": "string",
- "qrcode_url": "string",
- "url_consulta_nf": "string",
- "protocolo_cancelamento": "string",
- "caminho_xml_cancelamento": "string",
- "mensagem": "string",
- "erros": [
- { }
]
}Recuperação: devolve a nota deste emissor com a série e o número informados, no ambiente do token, com a mesma representação do GET por ref. Use quando a resposta do POST se perdeu (timeout, rede) e o seu sistema não gravou a ref: antes de reenviar o mesmo número, pergunte se ele já existe. Nota de outro emissor responde 404, igual a número inexistente.
| serie required | integer [ 0 .. 999 ] Exemplo: 1 |
| numero required | integer [ 1 .. 999999999 ] Exemplo: 2012 |
{- "ref": "string",
- "status": "autorizado",
- "modelo": "55",
- "serie": "string",
- "numero": "string",
- "status_sefaz": "string",
- "mensagem_sefaz": "string",
- "chave_nfe": "string",
- "protocolo": "string",
- "data_emissao": "2019-08-24T14:15:22Z",
- "data_autorizacao": "2019-08-24T14:15:22Z",
- "caminho_xml_nota_fiscal": "string",
- "qrcode_url": "string",
- "url_consulta_nf": "string",
- "protocolo_cancelamento": "string",
- "caminho_xml_cancelamento": "string",
- "mensagem": "string",
- "erros": [
- { }
]
}Recuperação pela chave de acesso de 44 posições (a do DANFE e do Id do XML), com ou sem o prefixo NFe e aceitando o CNPJ alfanumérico, escopada ao emissor do token e ao ambiente. Chave de outro emissor responde 404, igual a chave inexistente; chave com dígito verificador errado responde 422 chave_invalida.
| chave required | string^(NFe)?[0-9A-Za-z]{44}$ Exemplo: 29260905509541000163650010000020121144422536 |
{- "ref": "string",
- "status": "autorizado",
- "modelo": "55",
- "serie": "string",
- "numero": "string",
- "status_sefaz": "string",
- "mensagem_sefaz": "string",
- "chave_nfe": "string",
- "protocolo": "string",
- "data_emissao": "2019-08-24T14:15:22Z",
- "data_autorizacao": "2019-08-24T14:15:22Z",
- "caminho_xml_nota_fiscal": "string",
- "qrcode_url": "string",
- "url_consulta_nf": "string",
- "protocolo_cancelamento": "string",
- "caminho_xml_cancelamento": "string",
- "mensagem": "string",
- "erros": [
- { }
]
}NFe assinada + protNFe, exatamente como a SEFAZ autorizou. É o arquivo que o emitente guarda por 5 anos e manda ao contador. Também aceito como /{ref}/xml.
| 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."
}| 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."
}Cada pedido de inutilização do emissor neste ambiente (homologado ou recusado), mais recente primeiro. Desde 22/09/2026 o procInutNFe é guardado e entra no ZIP do mês do painel.
{- "inutilizacoes": [
- {
- "status": "string",
- "status_sefaz": "string",
- "mensagem_sefaz": "string",
- "protocolo": "string",
- "modelo": "string",
- "serie": "string",
- "numero_inicial": "string",
- "numero_final": "string",
- "justificativa": "string",
- "inutilizacao_id": 0,
- "registrada_em": "string"
}
]
}Declara à SEFAZ que os números de numero_inicial a numero_final da série não serão usados. Faixa com número já usado é recusada antes de ir à SEFAZ.
| cnpj | string Opcional; se vier tem de ser o do emissor. |
| serie required | integer |
| numero_inicial required | integer |
| numero_final required | integer |
| justificativa required | string [ 15 .. 255 ] characters |
{- "cnpj": "string",
- "serie": 0,
- "numero_inicial": 0,
- "numero_final": 0,
- "justificativa": "stringstringstr"
}{- "status": "string",
- "status_sefaz": "string",
- "mensagem_sefaz": "string",
- "protocolo": "string"
}Modelo 55, transmitida de forma síncrona à SEFAZ da UF do emissor. A ref vai na
QUERY e é a chave de idempotência: repetir com a mesma ref devolve a nota que existe.
Toda recusa de validação (CFOP, CSOSN, GTIN, pagamento menor que o total, valor bruto
diferente de quantidade x unitário) acontece ANTES de numerar. A nota recusada pela SEFAZ
volta 422 com status_sefaz e mensagem_sefaz, e pode ser reenviada com a MESMA ref
(mesmo número, mesma chave) depois de corrigida; número DENEGADO não volta.
Sem desfecho (SEFAZ fora do ar, timeout) a resposta é 202: NUNCA reenvie, consulte. A NF-e exige destinatário identificado com endereço completo.
| ref required | string <= 64 characters ^[A-Za-z0-9._-]{1,64}$ Exemplo: ref=venda-2026-000123 Sua chave da transação. Uma ref por documento; nota cancelada não reaproveita a ref. |
| natureza_operacao | string <= 60 characters |
| cnpj_emitente | string Opcional. Se vier, tem de ser o CNPJ do emissor do token (senão 422 emitente_divergente). |
| numero | integer [ 1 .. 999999999 ] Opcional. Sem ele o serviço numera a série. Número já usado por outra ref responde 409 numero_em_uso. |
| serie | integer [ 0 .. 889 ] Padrão: 1 |
| tipo_documento | integer Padrão: 1 Valores possíveis: 0 1 0 entrada, 1 saída. NFC-e só saída. |
| finalidade_emissao | integer Padrão: 1 Valores possíveis: 1 2 3 4 1 normal, 2 complementar, 3 ajuste, 4 devolução (exige notas_referenciadas). |
| local_destino | integer Padrão: 1 Valores possíveis: 1 2 3 NF-e: recalculado pela UF do destinatário quando divergir. |
| consumidor_final | integer Padrão: 1 Valores possíveis: 0 1 |
| presenca_comprador | integer Padrão: 1 NFC-e aceita só 1 (presencial) e 4 (entrega a domicílio). |
| modalidade_frete | integer Padrão: 9 Valores possíveis: 0 1 2 3 4 9 |
| cnpj_destinatario | string NF-e exige CNPJ ou CPF. NFC-e aceita e não exige. |
| cpf_destinatario | string |
| nome_destinatario | string <= 60 characters |
| indicador_inscricao_estadual_destinatario | integer Padrão: 9 Valores possíveis: 1 2 9 1 contribuinte (exige inscricao_estadual_destinatario), 2 isento, 9 não contribuinte. NFC-e é sempre 9. |
| inscricao_estadual_destinatario | string |
| email_destinatario | string |
| logradouro_destinatario | string <= 60 characters |
| numero_destinatario | string <= 60 characters |
| complemento_destinatario | string <= 60 characters |
| bairro_destinatario | string <= 60 characters |
| municipio_destinatario | string Nome do município. Com uf_destinatario, o código IBGE é resolvido pela tabela oficial; se não resolver, mande codigo_municipio_destinatario. |
| codigo_municipio_destinatario | string^[0-9]{7}$ |
| uf_destinatario | string^[A-Z]{2}$ |
| cep_destinatario | string |
| telefone_destinatario | string |
Lista de objects | |
| cnpjs_autorizados_xml | Lista de strings Quem pode baixar o XML na SEFAZ (contador). Na Bahia a NF-e exige o grupo: sem ele o serviço informa o CNPJ da própria SEFAZ-BA. |
| informacoes_adicionais_contribuinte | string <= 5000 characters |
| valor_troco | number |
required | Lista de objects [ 1 .. 990 ] items |
required | Lista de objects non-empty |
{- "natureza_operacao": "Venda de mercadoria",
- "cnpj_emitente": "string",
- "numero": 1,
- "serie": 1,
- "tipo_documento": 0,
- "finalidade_emissao": 1,
- "local_destino": 1,
- "consumidor_final": 0,
- "presenca_comprador": 1,
- "modalidade_frete": 0,
- "cnpj_destinatario": "string",
- "cpf_destinatario": "string",
- "nome_destinatario": "string",
- "indicador_inscricao_estadual_destinatario": 1,
- "inscricao_estadual_destinatario": "string",
- "email_destinatario": "string",
- "logradouro_destinatario": "string",
- "numero_destinatario": "string",
- "complemento_destinatario": "string",
- "bairro_destinatario": "string",
- "municipio_destinatario": "string",
- "codigo_municipio_destinatario": "string",
- "uf_destinatario": "string",
- "cep_destinatario": "string",
- "telefone_destinatario": "string",
- "notas_referenciadas": [
- {
- "chave_nfe": "string"
}
], - "cnpjs_autorizados_xml": [
- "string"
], - "informacoes_adicionais_contribuinte": "string",
- "valor_troco": 0,
- "items": [
- {
- "codigo_produto": "string",
- "descricao": "string",
- "codigo_ncm": "string",
- "cest": "string",
- "cfop": "string",
- "unidade_comercial": "UN",
- "quantidade_comercial": 1,
- "valor_unitario_comercial": 1,
- "valor_bruto": 0,
- "valor_desconto": 0,
- "codigo_ean": "string",
- "inclui_no_total": 0,
- "icms_origem": "0",
- "icms_situacao_tributaria": "string",
- "pis_situacao_tributaria": "49",
- "cofins_situacao_tributaria": "49",
- "valor_total_tributos": 0
}
], - "formas_pagamento": [
- {
- "forma_pagamento": "string",
- "valor_pagamento": 0,
- "tipo_integracao": "1",
- "cnpj_credenciadora": "string",
- "bandeira_operadora": "string",
- "numero_autorizacao": "string"
}
]
}{- "ref": "string",
- "status": "autorizado",
- "modelo": "55",
- "serie": "string",
- "numero": "string",
- "status_sefaz": "string",
- "mensagem_sefaz": "string",
- "chave_nfe": "string",
- "protocolo": "string",
- "data_emissao": "2019-08-24T14:15:22Z",
- "data_autorizacao": "2019-08-24T14:15:22Z",
- "caminho_xml_nota_fiscal": "string",
- "qrcode_url": "string",
- "url_consulta_nf": "string",
- "protocolo_cancelamento": "string",
- "caminho_xml_cancelamento": "string",
- "mensagem": "string",
- "erros": [
- { }
]
}Listagem paginada (50 por página) das NF-e do emissor no ambiente do token, da mais recente para a mais antiga, para conciliar sem consultar ref por ref. Nunca leva payload nem XML, e não pergunta à SEFAZ: nota pendente aparece como está no serviço.
| de | string <date> Dia inicial de criação da nota (inclusive), AAAA-MM-DD. |
| ate | string <date> Dia final de criação da nota (inclusive), AAAA-MM-DD. |
| status | string Valores possíveis: "autorizado" "processando_autorizacao" "erro_autorizacao" "cancelado" "processando_cancelamento" "denegado" Literal público, o mesmo que o GET por ref devolve. processando_autorizacao cobre recebida e processando. |
| pagina | integer >= 1 Padrão: 1 50 por página, da mais recente para a mais antiga. |
{- "documento": "nfse",
- "ambiente": "homologacao",
- "pagina": 0,
- "paginas": 0,
- "total": 0,
- "por_pagina": 0,
- "notas": [
- {
- "ref": "string",
- "status": "autorizado",
- "status_texfiscal": "string",
- "serie": 0,
- "numero": 0,
- "chave_nfe": "string",
- "status_sefaz": "string",
- "mensagem_sefaz": "string",
- "protocolo": "string",
- "valor": 0,
- "destinatario": "string",
- "data_emissao": "string",
- "autorizada_em": "string",
- "cancelada_em": "string",
- "criado_em": "string",
- "atualizado_em": "string"
}
]
}Roda a mesma validação da emissão (habilitação, UF, cadastro do emissor, CFOP, CSOSN, GTIN, pagamentos, totais) e PARA antes de numerar, assinar e transmitir. 200 quando passa; 422 requisicao_invalida com os mesmos erros[] da emissão quando não passa. Não consome número da série nem toca a SEFAZ, que ainda pode recusar por regra própria dela.
| natureza_operacao | string <= 60 characters |
| cnpj_emitente | string Opcional. Se vier, tem de ser o CNPJ do emissor do token (senão 422 emitente_divergente). |
| numero | integer [ 1 .. 999999999 ] Opcional. Sem ele o serviço numera a série. Número já usado por outra ref responde 409 numero_em_uso. |
| serie | integer [ 0 .. 889 ] Padrão: 1 |
| tipo_documento | integer Padrão: 1 Valores possíveis: 0 1 0 entrada, 1 saída. NFC-e só saída. |
| finalidade_emissao | integer Padrão: 1 Valores possíveis: 1 2 3 4 1 normal, 2 complementar, 3 ajuste, 4 devolução (exige notas_referenciadas). |
| local_destino | integer Padrão: 1 Valores possíveis: 1 2 3 NF-e: recalculado pela UF do destinatário quando divergir. |
| consumidor_final | integer Padrão: 1 Valores possíveis: 0 1 |
| presenca_comprador | integer Padrão: 1 NFC-e aceita só 1 (presencial) e 4 (entrega a domicílio). |
| modalidade_frete | integer Padrão: 9 Valores possíveis: 0 1 2 3 4 9 |
| cnpj_destinatario | string NF-e exige CNPJ ou CPF. NFC-e aceita e não exige. |
| cpf_destinatario | string |
| nome_destinatario | string <= 60 characters |
| indicador_inscricao_estadual_destinatario | integer Padrão: 9 Valores possíveis: 1 2 9 1 contribuinte (exige inscricao_estadual_destinatario), 2 isento, 9 não contribuinte. NFC-e é sempre 9. |
| inscricao_estadual_destinatario | string |
| email_destinatario | string |
| logradouro_destinatario | string <= 60 characters |
| numero_destinatario | string <= 60 characters |
| complemento_destinatario | string <= 60 characters |
| bairro_destinatario | string <= 60 characters |
| municipio_destinatario | string Nome do município. Com uf_destinatario, o código IBGE é resolvido pela tabela oficial; se não resolver, mande codigo_municipio_destinatario. |
| codigo_municipio_destinatario | string^[0-9]{7}$ |
| uf_destinatario | string^[A-Z]{2}$ |
| cep_destinatario | string |
| telefone_destinatario | string |
Lista de objects | |
| cnpjs_autorizados_xml | Lista de strings Quem pode baixar o XML na SEFAZ (contador). Na Bahia a NF-e exige o grupo: sem ele o serviço informa o CNPJ da própria SEFAZ-BA. |
| informacoes_adicionais_contribuinte | string <= 5000 characters |
| valor_troco | number |
required | Lista de objects [ 1 .. 990 ] items |
required | Lista de objects non-empty |
{- "natureza_operacao": "Venda de mercadoria",
- "cnpj_emitente": "string",
- "numero": 1,
- "serie": 1,
- "tipo_documento": 0,
- "finalidade_emissao": 1,
- "local_destino": 1,
- "consumidor_final": 0,
- "presenca_comprador": 1,
- "modalidade_frete": 0,
- "cnpj_destinatario": "string",
- "cpf_destinatario": "string",
- "nome_destinatario": "string",
- "indicador_inscricao_estadual_destinatario": 1,
- "inscricao_estadual_destinatario": "string",
- "email_destinatario": "string",
- "logradouro_destinatario": "string",
- "numero_destinatario": "string",
- "complemento_destinatario": "string",
- "bairro_destinatario": "string",
- "municipio_destinatario": "string",
- "codigo_municipio_destinatario": "string",
- "uf_destinatario": "string",
- "cep_destinatario": "string",
- "telefone_destinatario": "string",
- "notas_referenciadas": [
- {
- "chave_nfe": "string"
}
], - "cnpjs_autorizados_xml": [
- "string"
], - "informacoes_adicionais_contribuinte": "string",
- "valor_troco": 0,
- "items": [
- {
- "codigo_produto": "string",
- "descricao": "string",
- "codigo_ncm": "string",
- "cest": "string",
- "cfop": "string",
- "unidade_comercial": "UN",
- "quantidade_comercial": 1,
- "valor_unitario_comercial": 1,
- "valor_bruto": 0,
- "valor_desconto": 0,
- "codigo_ean": "string",
- "inclui_no_total": 0,
- "icms_origem": "0",
- "icms_situacao_tributaria": "string",
- "pis_situacao_tributaria": "49",
- "cofins_situacao_tributaria": "49",
- "valor_total_tributos": 0
}
], - "formas_pagamento": [
- {
- "forma_pagamento": "string",
- "valor_pagamento": 0,
- "tipo_integracao": "1",
- "cnpj_credenciadora": "string",
- "bandeira_operadora": "string",
- "numero_autorizacao": "string"
}
]
}{- "valido": true,
- "documento": "nfse",
- "ambiente": "string",
- "mensagem": "string"
}Folha A4 em retrato. É a representação impressa; o documento fiscal continua sendo o XML. Não é um layout homologado pela SEFAZ: cumpre a função (identificar a nota e permitir a consulta pela chave) com os campos obrigatórios presentes.
| ref required | string <= 64 characters ^[A-Za-z0-9._-]{1,64}$ Exemplo: venda-2026-000123 A sua chave da transação, a mesma usada na emissão. |
{- "codigo": "nao_autorizado",
- "mensagem": "Token ausente, inválido, ou de um ambiente diferente do endereço chamado."
}Nota pendente: a consulta pergunta a SEFAZ pela chave (no máximo uma vez a cada 15 s). Nota recusada volta 422 com o motivo da SEFAZ.
| ref required | string <= 64 characters A mesma ref usada na emissão. |
{- "ref": "string",
- "status": "autorizado",
- "modelo": "55",
- "serie": "string",
- "numero": "string",
- "status_sefaz": "string",
- "mensagem_sefaz": "string",
- "chave_nfe": "string",
- "protocolo": "string",
- "data_emissao": "2019-08-24T14:15:22Z",
- "data_autorizacao": "2019-08-24T14:15:22Z",
- "caminho_xml_nota_fiscal": "string",
- "qrcode_url": "string",
- "url_consulta_nf": "string",
- "protocolo_cancelamento": "string",
- "caminho_xml_cancelamento": "string",
- "mensagem": "string",
- "erros": [
- { }
]
}Só nota autorizada cancela. O prazo é da SEFAZ (24 h para NF-e; NFC-e na Bahia, 30 minutos sem circulação da mercadoria): fora dele a resposta é 422 cancelamento_recusado com o cStat. A justificativa (15 a 255 caracteres) VAI à SEFAZ no evento 110111.
| ref required | string <= 64 characters A mesma ref usada na emissão. |
| justificativa required | string [ 15 .. 255 ] characters |
{- "justificativa": "stringstringstr"
}{- "ref": "string",
- "status": "autorizado",
- "modelo": "55",
- "serie": "string",
- "numero": "string",
- "status_sefaz": "string",
- "mensagem_sefaz": "string",
- "chave_nfe": "string",
- "protocolo": "string",
- "data_emissao": "2019-08-24T14:15:22Z",
- "data_autorizacao": "2019-08-24T14:15:22Z",
- "caminho_xml_nota_fiscal": "string",
- "qrcode_url": "string",
- "url_consulta_nf": "string",
- "protocolo_cancelamento": "string",
- "caminho_xml_cancelamento": "string",
- "mensagem": "string",
- "erros": [
- { }
]
}Recuperação: devolve a nota deste emissor com a série e o número informados, no ambiente do token, com a mesma representação do GET por ref. Use quando a resposta do POST se perdeu (timeout, rede) e o seu sistema não gravou a ref: antes de reenviar o mesmo número, pergunte se ele já existe. Nota de outro emissor responde 404, igual a número inexistente.
| serie required | integer [ 0 .. 999 ] Exemplo: 1 |
| numero required | integer [ 1 .. 999999999 ] Exemplo: 2012 |
{- "ref": "string",
- "status": "autorizado",
- "modelo": "55",
- "serie": "string",
- "numero": "string",
- "status_sefaz": "string",
- "mensagem_sefaz": "string",
- "chave_nfe": "string",
- "protocolo": "string",
- "data_emissao": "2019-08-24T14:15:22Z",
- "data_autorizacao": "2019-08-24T14:15:22Z",
- "caminho_xml_nota_fiscal": "string",
- "qrcode_url": "string",
- "url_consulta_nf": "string",
- "protocolo_cancelamento": "string",
- "caminho_xml_cancelamento": "string",
- "mensagem": "string",
- "erros": [
- { }
]
}Recuperação pela chave de acesso de 44 posições (a do DANFE e do Id do XML), com ou sem o prefixo NFe e aceitando o CNPJ alfanumérico, escopada ao emissor do token e ao ambiente. Chave de outro emissor responde 404, igual a chave inexistente; chave com dígito verificador errado responde 422 chave_invalida.
| chave required | string^(NFe)?[0-9A-Za-z]{44}$ Exemplo: 29260905509541000163650010000020121144422536 |
{- "ref": "string",
- "status": "autorizado",
- "modelo": "55",
- "serie": "string",
- "numero": "string",
- "status_sefaz": "string",
- "mensagem_sefaz": "string",
- "chave_nfe": "string",
- "protocolo": "string",
- "data_emissao": "2019-08-24T14:15:22Z",
- "data_autorizacao": "2019-08-24T14:15:22Z",
- "caminho_xml_nota_fiscal": "string",
- "qrcode_url": "string",
- "url_consulta_nf": "string",
- "protocolo_cancelamento": "string",
- "caminho_xml_cancelamento": "string",
- "mensagem": "string",
- "erros": [
- { }
]
}NFe assinada + protNFe, exatamente como a SEFAZ autorizou. É o arquivo que o emitente guarda por 5 anos e manda ao contador. Também aceito como /{ref}/xml.
| 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."
}| 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."
}Cada pedido de inutilização do emissor neste ambiente (homologado ou recusado), mais recente primeiro. Desde 22/09/2026 o procInutNFe é guardado e entra no ZIP do mês do painel.
{- "inutilizacoes": [
- {
- "status": "string",
- "status_sefaz": "string",
- "mensagem_sefaz": "string",
- "protocolo": "string",
- "modelo": "string",
- "serie": "string",
- "numero_inicial": "string",
- "numero_final": "string",
- "justificativa": "string",
- "inutilizacao_id": 0,
- "registrada_em": "string"
}
]
}Declara à SEFAZ que os números de numero_inicial a numero_final da série não serão usados. Faixa com número já usado é recusada antes de ir à SEFAZ.
| cnpj | string Opcional; se vier tem de ser o do emissor. |
| serie required | integer |
| numero_inicial required | integer |
| numero_final required | integer |
| justificativa required | string [ 15 .. 255 ] characters |
{- "cnpj": "string",
- "serie": 0,
- "numero_inicial": 0,
- "numero_final": 0,
- "justificativa": "stringstringstr"
}{- "status": "string",
- "status_sefaz": "string",
- "mensagem_sefaz": "string",
- "protocolo": "string"
}A CC-e é documento fiscal de guarda (5 anos). Sem sequencia devolve a última registrada. Existe desde 22/09/2026; antes só o texto da correção ficava guardado.
| ref required | string <= 64 characters A mesma ref usada na emissão. |
| sequencia | integer [ 1 .. 20 ] |
{- "codigo": "nao_autorizado",
- "mensagem": "Token ausente, inválido, ou de um ambiente diferente do endereço chamado."
}| ref required | string <= 64 characters A mesma ref usada na emissão. |
{- "ref": "string",
- "chave_nfe": "string",
- "cartas_correcao": [
- {
- "numero_carta_correcao": 0,
- "protocolo": "string",
- "correcao": "string",
- "registrada_em": "string",
- "caminho_xml_carta_correcao": "string"
}
]
}Evento 110110. Só NF-e autorizada; NFC-e não tem carta de correção. Não corrige valor, quantidade, imposto, remetente, destinatário nem data (regra do Convênio S/N).
| ref required | string <= 64 characters A mesma ref usada na emissão. |
| correcao required | string [ 15 .. 1000 ] characters |
| sequencia | integer [ 1 .. 20 ] Padrão: 1 |
{- "correcao": "stringstringstr",
- "sequencia": 1
}{- "status": "string",
- "status_sefaz": "string",
- "mensagem_sefaz": "string",
- "protocolo": "string",
- "numero_carta_correcao": 0
}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 é necessariamente município impossível: é 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"
}
]
}Diz em nome de QUAL CNPJ a nota sairia com este token, e quais valores o TexFiscal assume quando o seu payload não manda o campo.
Consulte esta rota ANTES de emitir em sistema multi-inquilino. O caso que ela existe para evitar é concreto: um sistema com vários clientes e UM token no ambiente emite a nota do inquilino B com o CNPJ do inquilino A. A nota sai AUTORIZADA, em nome de quem não prestou o serviço, e o erro só aparece na apuração do contador.
O bloco padroes traz o que vem do CADASTRO do emissor. Seu payload sempre
vence: mande o campo e o cadastro é ignorado; omita e o cadastro entra.
Assim um cliente com o cadastro completo emite mandando só tomador, valor e
discriminação.
{- "cnpj": "string",
- "nome": "string",
- "inscricao_municipal": "string",
- "inscricao_estadual": "string",
- "codigo_municipio": "string",
- "municipio_nome": "string",
- "uf": "string",
- "ambiente": "producao",
- "situacao": "string",
- "serie_rps": "string",
- "endereco": {
- "logradouro": "string",
- "numero": "string",
- "complemento": "string",
- "bairro": "string",
- "cep": "string"
}, - "padroes": {
- "item_lista_servico": "string",
- "codigo_tributario_municipio": "string",
- "codigo_cnae": "string",
- "codigo_nbs": "string",
- "aliquota": 0,
- "optante_simples_nacional": true,
- "regime_especial_tributacao": 0,
- "discriminacao": "string"
}
}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])$ Exemplo: mes=2026-09 |
{- "mes": "2026-09",
- "ambiente": "homologacao",
- "por_status": {
- "property1": {
- "quantidade": 9,
- "valor": 5470
}, - "property2": {
- "quantidade": 9,
- "valor": 5470
}
}, - "total": 22,
- "cobravel": 9
}O aviso que o serviço manda ao seu sistema quando a nota muda de desfecho, e o cadastro dele por API (/v2/hooks).
Enviado por nós para a URL que você cadastrar, uma por ambiente (no painel ou por POST /v2/hooks). Vale para NFS-e (nfse_*), NF-e (nfe_*) e NFC-e (nfce_*): o prefixo do evento diz o recurso.
Confira o X-TexFiscal-Assinatura antes de confiar no conteúdo: é 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. |
| X-Webhook-Token required | string O próprio segredo do webhook, em claro, para o receptor escrito para a Focus continuar funcionando sem mudança. Prefira conferir a assinatura: ela prova o corpo, o token só prova a origem. |
| ref required | string |
| status | string Valores possíveis: "autorizado" "processando_autorizacao" "erro_autorizacao" "cancelado" "processando_cancelamento" "denegado" |
| 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 é link público. |
| caminho_danfse | string or null |
| caminho_xml_nota_fiscal | string or null |
| mensagem | string or null |
| erros | Lista de objects or null |
| evento required | string Valores possíveis: "nfse_autorizada" "nfse_erro" "nfse_cancelada" "nfse_cancelamento_nao_efetivado" "nfe_autorizada" "nfe_erro" "nfe_cancelada" "nfe_denegada" "nfce_autorizada" "nfce_erro" "nfce_cancelada" "nfce_denegada" "teste" nfse_cancelamento_nao_efetivado significa que o cancelamento NÃO valeu na prefeitura e a nota voltou a estar autorizada: é o único que pede ação sua. nfe_denegada e nfce_denegada: a SEFAZ denegou o uso e o número foi consumido (estado final, XML em /xml). teste: disparado pelo botão do painel, corpo sem nota. |
| 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"
}Lista o webhook do emissor no ambiente do token (há no máximo um por ambiente), ativo ou desligado. O segredo nunca volta aqui: ele só aparece na resposta do POST.
{- "ambiente": "string",
- "hooks": [
- {
- "id": 0,
- "ambiente": "homologacao",
- "ativo": true,
- "criado_em": "string",
- "atualizado_em": "string"
}
]
}Cadastra a URL que recebe os eventos do emissor neste ambiente. Só https, sem usuário embutido e sem endereço interno.
A resposta 201 traz o segredo UMA vez: guarde-o, ele vai em X-Webhook-Token em cada aviso e assina o corpo em X-TexFiscal-Assinatura.
Já existe um ativo: 409 webhook_ja_cadastrado. Repita com substituir: true para trocar a URL, sabendo que o segredo é rotacionado e o seu receptor precisa adotar o novo.
É o mesmo cadastro do painel (Webhooks) e do console: quem integra pela API não precisa de acesso ao painel.
| url required | string <uri> |
| substituir | boolean Padrão: false true para trocar um webhook ativo; rotaciona o segredo. |
{- "substituir": false
}{- "id": 0,
- "ambiente": "homologacao",
- "ativo": true,
- "criado_em": "string",
- "atualizado_em": "string",
- "segredo": "string",
- "mensagem": "string"
}Desliga o webhook do emissor. As entregas pendentes dele são encerradas sem envio; as notas continuam consultáveis por GET. Cadastrar de novo gera outro segredo.
| id required | integer O id devolvido pelo GET ou pelo POST. |
{- "id": 0,
- "ativo": true,
- "mensagem": "string"
}