Substituição
POST /v1/notas/{notaId}/substituicao com o token de acesso, onde {notaId} é a nota original, a que será substituída (referência). A substituição corrige uma nota autorizada (descrição, códigos, retenção, dados do tomador) sem cancelar e emitir de novo: a API emite uma nota nova, a substituta, com o grupo de substituição da Sefin Nacional (chave da original, cMotivo e xMotivo). Autorizada a substituta, a Sefin Nacional cancela a original por substituição. O processamento é assíncrono, como a emissão.
Corpo do pedido
nota(obrigatório): a nota corrigida completa, no mesmo formato de uma nota do lote e com as mesmas recusas (envio do lote). Não é uma alteração parcial: todos os campos são enviados de novo, inclusive os que não mudaram. A chave da original não vai no corpo: a API a lê da nota indicada no endereço.nota.idOperacao: novo, escolhido pelo seu sistema, com a mesma idempotência do lote. Repetir o pedido com o mesmoidOperacaopara a mesma original devolve202com a substituta já gravada, sem criar outra. UmidOperacaojá usado por outra nota do emitente recebe409ID_OPERACAO_EM_USO.cMotivo(obrigatório): texto, um de01(desenquadramento do Simples Nacional),02(enquadramento no Simples Nacional),03(inclusão retroativa de imunidade ou isenção),04(exclusão retroativa de imunidade ou isenção),05(rejeição pelo tomador ou intermediário) e99(outros). Número JSON (99sem aspas) é recusado.xMotivo: obrigatório comcMotivo99e opcional com os demais; quando informado, de 15 a 255 caracteres depois de remover os espaços das pontas, só com caracteres de U+0020 a U+00FF, a mesma regra do motivo do cancelamento.- Só nota
autorizadapode ser substituída, e só uma substituição por vez para a mesma original.
Requisição
POST /v1/notas/3f8b2c1a-6d4e-4b7f-9a21-0c5e8d7f6a10/substituicao HTTP/1.1
Host: hml.nfse.lideraweb.com
Authorization: Bearer <seu-token>
Content-Type: application/json
{
"nota": {
"idOperacao": "FAT-1001-S1",
"competencia": "2026-11-10",
"tomador": {
"documento": "11222333000181",
"nome": "Cliente Exemplo Ltda",
"email": "financeiro@cliente.example",
"endereco": {
"cep": "30130000",
"logradouro": "Rua Exemplo",
"numero": "100",
"bairro": "Centro",
"codigoMunicipio": "3106200"
}
},
"servico": {
"codigoTributacaoNacional": "010701",
"descricao": "Desenvolvimento de sistema sob encomenda"
},
"valores": {
"valorServico": 1450,
"issRetido": false
}
},
"cMotivo": "99",
"xMotivo": "Correção do valor do serviço informado na nota"
}
curl -X POST "$BASE_URL/notas/3f8b2c1a-6d4e-4b7f-9a21-0c5e8d7f6a10/substituicao" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
--data '{
"nota": {
"idOperacao": "FAT-1001-S1",
"competencia": "2026-11-10",
"tomador": {
"documento": "11222333000181",
"nome": "Cliente Exemplo Ltda",
"email": "financeiro@cliente.example",
"endereco": {
"cep": "30130000",
"logradouro": "Rua Exemplo",
"numero": "100",
"bairro": "Centro",
"codigoMunicipio": "3106200"
}
},
"servico": {
"codigoTributacaoNacional": "010701",
"descricao": "Desenvolvimento de sistema sob encomenda"
},
"valores": {
"valorServico": 1450,
"issRetido": false
}
},
"cMotivo": "99",
"xMotivo": "Correção do valor do serviço informado na nota"
}'
Resposta 202, com a nota substituta:
{
"id": "b2d4f6a8-1c3e-4a5b-8c7d-9e0f1a2b3c4d",
"idOperacao": "FAT-1001-S1",
"loteId": "9d8c7b6a-5f4e-4d3c-a2b1-0f9e8d7c6b5a",
"status": "recebida",
"ambiente": "homologacao",
"substitui": {
"notaId": "3f8b2c1a-6d4e-4b7f-9a21-0c5e8d7f6a10",
"chaveAcesso": "31062002211222333000181000000000012326110000001234",
"cMotivo": "99",
"xMotivo": "Correção do valor do serviço informado na nota"
}
}
Guarde o id da substituta: é por ele que o seu sistema acompanha a substituição.
O que não pode mudar
A API compara a substituta com a original conforme o perfil do emitente e recusa na hora, com 422 SUBSTITUICAO_NAO_PERMITIDA, sem gravar nada. campos traz um item por campo alterado, com codigo (E0061 ou E0060), campo e mensagem.
| Perfil do emitente | Código | Não pode alterar | Pode alterar (exemplos) |
|---|---|---|---|
| MEI e ME/EPP (Simples Nacional) | E0061 |
O CPF ou CNPJ do tomador, quando a original tem tomador (remover o tomador também é alteração); competencia; valores.valorServico |
Descrição; nome, endereço, e-mail e telefone do tomador; incluir tomador quando a original não tinha; códigos de serviço; retenção |
| Não optante | E0060 |
competencia; servico.codigoTributacaoNacional; servico.codigoTributacaoMunicipal; município de prestação |
Valor do serviço; tomador; descrição; retenção |
O exemplo acima altera o valor do serviço, o que só vale para emitente não optante.
Desfecho
- Substituta autorizada: chegam dois eventos no webhook:
autorizadada substituta, comnota.substitui, esubstituidada original, comnota.statussubstituidaenota.substituidaPor. A original mantém o XML, oslinkse o DANFSe, que passa a sair com a marca "SUBSTITUÍDA". - Substituta rejeitada (pela Sefin Nacional ou pela validação antes do envio): chega só o evento
rejeitadada substituta, comnota.erroenota.substitui. A original continuaautorizada, sem evento. Para tentar de novo, corrija e peça outra substituição com outroidOperacao. Rejeições comuns:E0050(fora do prazo de substituição do município; não vale para os motivos01e02),E0070eE0072(a nota já foi confirmada pelo tomador ou pelo intermediário). - Em processamento: enquanto a substituta não tem desfecho, a original continua
autorizadae recusa outro pedido de substituição e o pedido de cancelamento com409NOTA_EM_ESTADO_INCOMPATIVEL. Continue consultando a substituta. - Nova correção: para corrigir de novo uma nota já substituída, substitua a substituta (
substituidaPor.notaId).
Respostas de erro
| HTTP | codigo |
Quando |
|---|---|---|
400 |
VALIDACAO_CAMPO |
notaId fora do formato UUID; corpo sem nota ou sem cMotivo; campo não reconhecido; cMotivo fora da lista; xMotivo fora da regra (com cMotivo 99, o item de campos traz codigo E0078); erro de campo da nota, com o prefixo nota. (por exemplo nota.competencia) |
400 |
JSON_INVALIDO |
Corpo vazio ou JSON malformado |
401 |
TOKEN_INVALIDO |
Token ausente, inválido ou revogado |
404 |
NOTA_NAO_ENCONTRADA |
Original inexistente ou de outro emitente |
409 |
NOTA_NAO_AUTORIZADA |
Original do seu emitente que não está autorizada |
409 |
NOTA_EM_ESTADO_INCOMPATIVEL |
Original em cancelamento_solicitado, cancelada ou substituida, com substituição em andamento ou com análise fiscal aguardando o município ou indeferida. A mensagem diz qual |
409 |
ID_OPERACAO_EM_USO |
nota.idOperacao já usado por outra nota do emitente que não é substituta desta original |
422 |
SUBSTITUICAO_NAO_PERMITIDA |
A substituta altera campo que a Sefin Nacional não permite alterar (tabela acima) |
429 |
LIMITE_REQUISICOES_EXCEDIDO |
Limite de requisições do token (limites) |
503 |
TABELAS_OFICIAIS_INDISPONIVEIS |
Tabelas oficiais da NFS-e Nacional indisponíveis no momento; nada foi gravado. Repita o mesmo pedido depois dos segundos do cabeçalho Retry-After |