- v3 · atual
- v2 · descontinuado
- v1 · descontinuado
Você está lendo o contrato atual (v3) de
order.reversed. v3 é uma mudança incompatível apenas no bloco fiscal: ele passa de cancellation.metadata.fiscal para cancellation.fiscal, fica estruturado (authority, history, compensates) e sefazCancellation não é mais emitido. Os campos de auditoria de cancellation adicionados na v2 (cancellationType, cancellationGroup, cancellationNote) não mudam. Veja Mudanças de caminho em relação à versão anterior.order.reversed dispara quando o órgão fiscal confirma o cancelamento de um documento que tinha autorizado previamente. É o resultado fiscal de order.cancelled: o pedido é cancelado primeiro dentro do Fire (order.cancelled), o cancelamento é solicitado ao órgão por meio do seu provedor fiscal, e order.reversed dispara apenas quando o órgão o aprova.
Condição de disparo
O Fire emiteorder.reversed quando um documento fiscal do pedido chega a cancelled — pela integração nativa com o provedor ou pelo callback fiscal com eventType: "cancelled" — e o pedido tem um registro operacional de cancelamento no Fire. Sem esse registro o evento não é emitido: o bloco cancellation é o que diz aos consumidores que se trata de uma anulação e não de uma venda.
O que tem em trigger.data
O mesmo snapshot V4 do pedido que order.completed, com status: "CANCELLED", mais o bloco cancellation: os mesmos campos de auditoria de order.cancelled e, dentro dele, o bloco fiscal com o documento cancelado.
Campos de dinheiro em
payments.paymentMethods[]. customerCashAmount e changeAmount são números. Os pedidos injetados antes de 24 de setembro de 2026 trazem customerCashAmount como o texto "0" e sem changeAmount: se você reenviar ou reprocessar eventos antigos, leia o campo como número. Veja a referência de campos de order.completed.Exemplo — Brasil (NFC-e, sanitizado)
Repare que no Brasil
authority.documentNumber e compensates.documentNumber são iguais (12388): a SEFAZ anula o documento em vez de emitir um novo. Em regimes onde um cancelamento é uma nota de crédito separada, eles diferem.Referência de data.cancellation
Os campos de auditoria são os mesmos de order.cancelled — incluindo cancellationId, que ambos os eventos compartilham para o mesmo cancelamento e que você pode usar como chave de junção. O bloco fiscal está documentado abaixo.
O bloco fiscal
Para ver como cada campo do callback fiscal chega aqui, veja Do callback aos eventos. O bloco fiscal deorder.invoiced, order.cancelled e order.reversed é o que o Fire guardou no pedido, com a mesma forma. Ele não é reconstruído por emissor: seja o documento vindo pela integração nativa do seu provedor fiscal ou pelo callback fiscal, você lê os mesmos campos na mesma profundidade.
Onde fica em cada evento
Campos do bloco
string | null
O status fiscal do pedido, não de um documento:
awaiting_payment, not_issued, pending, processing, fiscal_graphic, authorized, cancelling, cancelled, rejected, denied, error. Na prática order.invoiced leva authorized, order.reversed leva cancelled e order.cancelled leva authorized ou cancelling.string | null
Código ISO 3166-1 alpha-2 do regime que emitiu o documento (
BR, CO, EC, CL, AR, VE). O país não vive mais no nome do evento: filtre por este campo.string | null
Identificador do Fire para o adaptador que processou o documento (
plugnotas, generic). É nosso, não o nome do provedor.string | null
Timestamp ISO 8601 UTC do fato fiscal que disparou o evento, conforme reportado pelo provedor.
object | null
O veredito do órgão sobre o documento vigente. Os campos que significam o mesmo em todos os países ficam no topo; os identificadores próprios do órgão ficam em
countryData, no vocabulário daquele país.object[]
Cada parada da jornada fiscal do pedido que descreve um documento, da mais antiga para a mais recente — incluindo a atual. Em
order.invoiced normalmente tem uma entrada, igual a authority; em order.reversed tem a fatura e depois o cancelamento. Paradas sem bloco de documento não aparecem — por exemplo o cancelling que o Fire registra antes de consultar o órgão; um processing que já traz a numeração do caixa aparece.Não é
fiscalRepresentation.history. Aquele lista apenas os documentos anteriores da numeração; este é a jornada completa e termina com o documento atual.object | null
Um ponteiro para o documento que o atual substitui. Presente quando o status fiscal do pedido é
cancelled; null caso contrário. Aponta para a última parada de history que não é ela mesma um cancelamento — procure lá o seu documentNumber para ter o documento inteiro.Não carrega
reason, ao contrário de fiscalRepresentation.compensates. O motivo já viaja no mesmo evento, com mais detalhe: cancellation.cancellationType, cancellationGroup, cancellationReason, cancellationNote e cancellationSource. O Fire não emite order.reversed sem um registro operacional de cancelamento, então esse bloco está sempre presente quando compensates está. Um código fixo ORDER_CANCELLATION aqui diria o mesmo com menos informação. O bloco de numeração carrega sim um reason: é onde o código canônico é resolvido no texto impresso na nota de crédito, que precisa do texto próprio da empresa.No Brasil o ponteiro se refere ao mesmo número. A SEFAZ não numera um novo documento para cancelar um, então
compensates.documentNumber é igual a authority.documentNumber. Isso está correto, não é um bug.countryData e o callback fiscal
countryData é um bloco com três nomes, dependendo de qual lado do Fire você olha:
O que seu provedor envia no
document do callback é o que você recebe em authority.countryData, com os mesmos nomes de chave. A regra que separa os dois é a exclusão: toda chave do callback que não é um campo canônico cai em countryData intacta. É por isso que um novo identificador de um país viaja sem nenhuma mudança do lado do Fire.
Os campos raiz do callback se tornam os campos de topo de authority com os mesmos nomes, exceto os três valores, que se agrupam em amounts. provider e metadata viram providerIdentity e providerMetadata (null se ausentes ou vazios). A tabela campo a campo está em Do callback aos eventos.
O
protocolo do Brasil fica em countryData, não no topo. Só a SEFAZ o tem — o Chile tem trackId, a Argentina o cae — então é vocabulário do órgão, não um campo canônico. Pedidos armazenados antes deste contrato o tinham no topo como authorizationProtocol; o Fire o emite como countryData.protocolo também para esses.Mudanças de caminho em relação à versão anterior
Cada caminho anterior tem exatamente um caminho atual. O payload não carrega número de versão: a versão pertence a este contrato documentado.
Lifecycle
Um pedido cancelado antes de seu documento ser autorizado só disparaorder.cancelled: não há nada a estornar no órgão.
Handler de exemplo
Erros comuns
- Leia
cancellation.fiscal, nãocancellation.metadata.fiscal. O caminho anterior vem vazio na v3. sefazCancellationnão existe mais. A data do cancelamento éauthority.cancelledAt; os identificadores do órgão estão emauthority.countryData.- A entrega fora de ordem é possível. Se chegar um
order.reversedde um pedido para o qual você não tem cancelamento, crie-o a partir do blococancellationdeste evento em vez de descartar o evento. - Não há evento para um cancelamento que falhou. Se o órgão rejeitar o cancelamento, nenhum evento dispara.
Eventos relacionados
order.cancelled
Dispara antes deste evento — o próprio cancelamento do pedido.
order.invoiced
O evento que reportou o documento que aqui é cancelado.
Callback fiscal
Como um provedor reporta o cancelamento que dispara este evento.
data.fiscalRepresentation
Sem mudanças na v3. Guarda os números do comprovante impresso no caixa — o que está sendo anulado — e é um bloco diferente de cancellation.fiscal: fiscalRepresentation é o que foi numerado, authority é o que o órgão decidiu. A referência de campos está na página v2.
