TexFiscal: emissão de NFS-e por API (2.0.0)

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:

  1. A 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.
  2. Nota em 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.

NFS-e

Emitir, consultar, cancelar e baixar o documento.

Emitir NFS-e

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.

Authorizations:
basicAuth
query Parameters
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).

Request Body schema: application/json
required
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

Responses

Request samples

Content type
application/json
{
  • "data_emissao": "2026-09-02T10:00:00",
  • "optante_simples_nacional": true,
  • "regime_especial_tributacao": 1,
  • "prestador": {
    },
  • "tomador": {
    },
  • "servico": {
    }
}

Response samples

Content type
application/json
{
  • "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": [
    ]
}

Consultar NFS-e

Se a nota estiver em processamento, a consulta PERGUNTA a prefeitura antes de responder: e por isso que consultar resolve e reenviar não.

Authorizations:
basicAuth
path Parameters
ref
required
string <= 64 characters

A mesma ref usada na emissão.

Responses

Response samples

Content type
application/json
{
  • "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": [
    ]
}

Cancelar NFS-e

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.

Authorizations:
basicAuth
path Parameters
ref
required
string <= 64 characters

A mesma ref usada na emissão.

Request Body schema: application/json
required
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 abaixo.

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.

Responses

Request samples

Content type
application/json
{
  • "justificativa": "Valor do serviço lancado errado na venda 4471.",
  • "motivo": 2
}

Response samples

Content type
application/json
{
  • "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": [
    ]
}

XML da NFS-e autorizada

Como a prefeitura devolveu. Exige token, e responde no-store: documento fiscal com CPF do tomador nunca entra em cache.

Authorizations:
basicAuth
path Parameters
ref
required
string <= 64 characters

A mesma ref usada na emissão.

Responses

Response samples

Content type
application/json
{
  • "codigo": "nao_autorizado",
  • "mensagem": "Token ausente, inválido, ou de um ambiente diferente do endereço chamado."
}

DANFSe em PDF

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.

Authorizations:
basicAuth
path Parameters
ref
required
string <= 64 characters

A mesma ref usada na emissão.

Responses

Response samples

Content type
application/json
{
  • "codigo": "nao_autorizado",
  • "mensagem": "Token ausente, inválido, ou de um ambiente diferente do endereço chamado."
}

Cobertura

Municípios atendidos, com a data de verificação de cada um.

Municípios atendidos, com a data em que cada um foi verificado

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.

query Parameters
uf
string^[A-Za-z]{2}$

Filtra por UF.

codigo_ibge
string^[0-9]{7}$

Pergunta por um município específico.

Responses

Response samples

Content type
application/json
{
  • "verificado_em": "2019-08-24",
  • "total": 0,
  • "municipios": [
    ]
}

Conta

Uso do mês, que é a base da fatura.

Uso do mês

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.

Authorizations:
basicAuth
query Parameters
mes
string^\d{4}-(0[1-9]|1[0-2])$
Example: mes=2026-09

Responses

Response samples

Content type
application/json
{
  • "mes": "2026-09",
  • "ambiente": "homologacao",
  • "por_status": {
    },
  • "total": 22,
  • "cobravel": 9
}

Serviço

Saúde do ambiente.

Saúde do serviço

Única rota sem token. Diz o mínimo de proposito: vigia não precisa de credencial, e o que não se responde não vaza.

Responses

Response samples

Content type
application/json
{
  • "servico": "string",
  • "status": "string"
}

Webhook

Evento de mudança de desfecho de uma nota Webhook

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:

  1. Responda 2xx rápido. Nosso timeout na tentativa imediata e 5 s.
  2. DESCARTE evento fora de ordem. Uma entrega reagendada pode chegar DEPOIS de um evento mais novo da mesma ref: por exemplo, uma nfse_autorizada que falhou chegando depois da nfse_cancelada. Guarde o ocorrido_em do último evento aplicado por ref e ignore o que for mais antigo, senão você marca como autorizada uma nota que foi cancelada.
  3. Trate entrega REPETIDA. Reenviamos até 16 vezes enquanto você não responder 2xx, e uma entrega pode chegar duas vezes se a sua resposta se perder. Deduplique pelo evento_id.
Authorizations:
basicAuth
header Parameters
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.

Request Body schema: application/json
required
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.

Responses

Request samples

Content type
application/json
{
  • "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"
}