Assine as atualizações
Receba um e-mail sempre que uma nova entrada for publicada — eventos novos, mudanças incompatíveis e atualizações da referência da API. Cancele com um clique.
Assinar15 de agosto de 2026 — O bloco fiscal: identificadores por país, cancelamento e provedor
fiscalRepresentation deixa de ter campos fixos por país e passa a levar o documento
vigente do pedido, com os anteriores em history.
- Breaking —
sequential,serieeclaveAccesonão são mais campos do bloco. Os identificadores do órgão vivem agora emcountryData, com o vocabulário do país que numerou:claveAcceso,establecimiento,puntoEmision,secuencialeambienteno Equador;numeroControl,numeroFacturaeseriena Venezuela. Percorra as chaves, não as indexe: um canal que leiacountryData.claveAccesodireto funciona no Equador e quebra com o primeiro país que entrar. Os campos que significam o mesmo em qualquer país —documentNumber,issuedAt,authorizationMode,numberingStatus— não se moveram. historyecompensates— quando um cancelamento numera, a nota de crédito passa a ser o documento do topo,compensatesaponta para a nota de venda que ela cancela, e a nota de venda inteira desce parahistory. Cada entrada dehistorytem as mesmas chaves que o bloco acima, então se leem igual.environment— em qual ambiente o Fire numerou:SANDBOXouPRODUCTION. É nosso, não do órgão; o do órgão continua viajando dentro decountryDatacom o próprio código.providerCode,providerIdentityeproviderMetadata— antes eram um único objeto que misturava três coisas.providerCodeé o nosso identificador de adaptador;providerIdentityé o bloco do provedor (name,version,reference) e tem forma;providerMetadataé uma bolsa opaca e não se deve programar contra suas chaves. A resposta do endpoint de numeração devolve agora exatamente os mesmos três campos, com os mesmos nomes.
Se a sua conciliação assume que
documentNumber é sempre o da venda, revise-a: após um
cancelamento o número do topo é o da nota de crédito. O que o cliente levou impresso não se
perde — está em history — mas é preciso ir buscá-lo lá.order.opened,
order.completed,
order.cancelled,
order.invoiced,
order.reversed, na
referência do endpoint e no guia
Integrar um ponto de venda.
Atualizado em EN / ES / PT.
13 de agosto de 2026 — A numeração fiscal agora viaja em todos os eventos do pedido
Os pedidos que o Fiscal Gateway numerou antes da injeção agora levam esses identificadores em todos os seus eventos, então não é mais preciso uma segunda chamada para imprimir ou conciliar.-
data.fiscalRepresentation— série, sequencial, número do documento, chave de acesso e o QR (graphic), exatamente como foram impressos no caixa. A chave viaja sempre: chega emnullquando não se tentou numerar — agregadores, países sem representação fiscal, ou numeração desativada — e traz o bloco quando houve tentativa. Ramifique pelo valor (if (data.fiscalRepresentation)), não pela presença da chave. Trazer o bloco significa que se tentou numerar, não que foi numerado:numberingStatusdiz como a tentativa terminou efailurepor quê, quando não terminou bem — uma venda cobrada que ficou sem comprovante fiscal chega com os identificadores emnulle o motivo emfailure. Trazer o bloco não significa que o comprovante esteja autorizado: o veredito do órgão continua emlastKnown.fiscal.status. O bloco nunca muda, nem depois que o órgão autoriza ou rejeita. -
data.lastKnown.fiscal.sourceEvent— agora informa a procedência real em vez de deduzi-la do status. Umprocessingsemeado na injeção era reportado comofiscal.callbacksem que nenhum callback tivesse ocorrido; agora dizorder.injected. Contemple o valor novo se você ramifica por este campo. -
Documentado em
order.opened,order.completed,order.invoicedeorder.cancelled.
11 de agosto de 2026 — BOH API: qty_base derivado no servidor com item_unit_id
Nas linhas de pedidos de compra (POST /procurement/orders, add-lines e atualização de linha), qty_base agora é opcional quando a linha referencia item_unit_id — não apenas unit_code. O servidor deriva qty_base = qty × factor_to_base a partir da unidade referenciada, então integradores externos que referenciam uma unidade de compra por UUID não precisam mais conhecer nem recalcular o fator de conversão.
Se você enviar um qty_base explícito mesmo assim, o BOH o valida contra o valor derivado (tolerância 0.001) e retorna purchase_order_qty_base_mismatch (422) em caso de divergência — mesmo comportamento do unit_code. Se item_unit_id não resolver para uma unidade ativa e qty_base foi omitido, a resposta agora é o erro tipado item_unit_not_found (404).
Atualizado em EN / ES / PT.
11 de agosto de 2026 — BOH API: resolução de estabelecimento por ID fiscal em pedidos de compra (Fase 19)
tax_id é agora um campo de primeira classe nos estabelecimentos do BOH (RUC, CNPJ, CUIT, NIT, RUT, RFC ou qualquer código fiscal até 64 caracteres). É opcional, não único, e aceito em POST /identity/stores e PATCH /identity/stores/{id}.
Ao criar um pedido de compra via API você pode identificar o estabelecimento receptor com qualquer um destes três campos mutuamente exclusivos:
store_id— UUID interno (sem alterações).external_store_id— identificador externo cruzado.store_tax_id(novo) — identificador fiscal. Retorna422compurchase_order_store_tax_id_ambiguousse vários estabelecimentos ativos compartilharem o mesmo valor (ex.: CNPJ compartilhado entre filiais) — nesse caso usestore_idouexternal_store_id.
11 de agosto de 2026 — BOH API reestruturada: uma página por endpoint
A aba de BOH API foi completamente reestruturada em páginas individuais por endpoint. Cada endpoint tem agora sua própria entrada no menu mostrando o método HTTP (GET, POST, PATCH, DELETE), exemplos interativos de request/response, e um botão Experimentar para testar o endpoint diretamente na documentação.
A nova estrutura cobre os 63 endpoints em 6 seções: Identidade, Catálogo, Receitas, Operações, Compras e Webhooks.
Atualizado em EN / ES / PT.
11 de agosto de 2026 — BOH API: ordens de compra — resolução por supplier_sku e external_user_id
Duas adições à referência de ordens de compra:supplier_sku nas linhas — um terceiro identificador de item para integração com ERPs. Em vez de item_id ou external_item_id, envie supplier_sku (sem diferenciar maiúsculas) e o BOH resolve o item diretamente do catálogo do fornecedor da ordem, derivando base_unit_id automaticamente. Erro: purchase_order_supplier_sku_not_found (404).
external_user_id na criação — o identificador do usuário chamador agora é aceito ao criar uma ordem de compra e armazenado como actor_external_user_id. Anteriormente o campo era ignorado silenciosamente.
Atualizado em EN / ES / PT.
10 de agosto de 2026 — Manuais KDS: emparelhamento, board do operador, riscar linhas e defaults de display
Manuais KDS novos e atualizados com o trabalho recente do fire-kds: Emparelhar um dispositivo — guia nova. Cadastrar TVs de cozinha com código de 6 dígitos em KDS → Todas as lojas, gerenciar terminais emparelhados e entender o logout de dispositivo vs e-mail. Board do operador — guia nova. Lista/detalhe do supervisor com temporizadores ao vivo, filtros, códigos de coleta e sobrescritas cancelar / pronto / despachar. Ações na tela — riscar linhas antes do bump, despacho aguardando montagem, alerta de pedido novo e configurações de display mais ricas (defaults da loja, nome do cliente por canal/fulfillment). Painel de senhas — filtros de fulfillment (ex. ocultar delivery do painel). Visão geral — opções KDS no nível da loja (defaults de display, line strike, motivos de cancelamento) e links para as novas guias. Atualizado em EN / ES / PT.7 de agosto de 2026 — BOH API: operações, identidade, sincronização em massa e endpoints de compras
A referência da BOH API agora cobre o conjunto completo de endpoints para construir uma integração completa: Identidade — nova seção. Descubra o contexto da sua conta (GET /identity/me), liste vendors e gerencie estabelecimentos e fornecedores (criar, atualizar, arquivar/desarquivar).
Catálogo: Sync em massa — nova seção. Três endpoints PUT de sincronização em massa:
PUT /catalog/units— upsert de unidades porcode + unit_group_code; unidades globais são ignoradas sem erro.PUT /identity/suppliers— upsert de fornecedores porexternal_supplier_id.PUT /catalog/classifications/assignments— substitui todas as atribuições de classificação de um item ou estabelecimento de forma atômica.
- Recebimentos de mercadoria (criar, listar, obter) — suporta
external_store_ideexternal_supplier_idpara não precisar de UUIDs prévios. - Contagens de estoque (criar, listar) — escopo
FULLouPARTIAL, comarea_breakdownpara sessões de contagem colaborativa por áreas. - Perdas (criar, listar) — linhas por item, tag de itens ou snapshot de sub-receita.
- Transferências (criar, listar) — débito/crédito atômico entre estabelecimentos.
- Lotes de produção (criar, listar, obter) — registra execuções de receita com output real e overrides de ingredientes opcionais.
- Rastreamento de transações (status, listar) — consulte qualquer escrita assíncrona pelo seu
tracking_id.
POST /procurement/orders com chave de idempotência, listar/obter, enviar, confirmar, adicionar/atualizar/remover linhas, cancelar, fechar e status de atendimento), além de PUT /procurement/par-levels para upsert de metas de estoque por item/estabelecimento e GET /procurement/suggested-order para obter quantidades de reabastecimento sugeridas. As ordens de compra também suportam integração com ERPs por meio de identificadores externos: external_supplier_id, external_item_id e unit_code resolvem os registros internos no servidor (sem necessidade de UUIDs do BOH), external_reference marca a ordem com o seu código de documento (filtrável na listagem) e as linhas aceitam valores informativos (tax_amount, delivery_amount, total_amount, markup_amount).
Atualizado em EN / ES / PT.
7 de agosto de 2026 — Manuais BOH: linhas por canal, contagens colaborativas, moeda da conta
Três atualizações nos manuais do usuário BOH refletindo mudanças recentes no produto: Receitas — linhas com escopo por canal (Fase 16) O modelo de “complementos por serviço” foi substituído por linhas com escopo por canal em uma única receita. Cada linha agora tem um campo opcionalservice_codes:
- Linhas sem
service_codessão gerais e sempre se aplicam. - Linhas com
service_codes: ["DELIVERY"]só se aplicam quando o canal do pedido corresponde. - Uma única receita publicada por produto e loja substitui o par BASE + COMPLEMENT anterior.
7 de agosto de 2026 — Listas de preços: novo manual do usuário
As listas de preços permitem trabalhar com preços diferentes por canal, loja ou campanha sem manter cada um na mão. O manual já está disponível: Listas de preços.- Listas conectadas — uma lista pode seguir uma lista base. Você muda o preço uma vez e ele
chega a todas; o produto que precisar de um preço próprio o define e deixa de segui-la, apenas
para aquele produto. As fórmulas como
=P*1.15ficam vivas: quando a base muda, a lista se recalcula sozinha. - Preços por contexto — o mesmo produto pode valer diferente dentro de um combo. Esses preços ficavam escondidos na configuração de cada combo; agora aparecem e são editáveis na própria linha do produto, com o percentual em relação ao preço avulso.
- Edição em massa com arredondamento comercial — aplique um percentual ou um valor a muitos
produtos de uma vez, alcançando também os preços dentro de combos, e arredonde para
.99,.90ou número inteiro para não acabar vendendo a 13,42. - Modo comparação — sobreponha outra lista como referência para ver, produto a produto, onde as duas se separam.
- Alcance antes de salvar — um resumo de quais listas conectadas recebem a mudança e, principalmente, qual não recebe nada porque todos os produtos que você tocou têm preço próprio ali.
- Conectar uma lista existente — uma lista que nasceu como cópia e ficou desatualizada pode ser conectada a uma lista base. O que coincide com a base passa a segui-la, o que tem preço próprio fica como está: ao conectar, nenhum preço se move.
Os preços por horário (day-parting) ainda não estão disponíveis, e esta fase trabalha sobre o
preço final com impostos incluídos — o preço líquido e o de referência vêm depois. O manual
deixa os dois limites explícitos.
6 de agosto de 2026 — Batimentos de saúde de quiosques, KDS e caixas
Quiosques, telas KDS e caixas POS já podem informar que estão vivos, e o painel de disponibilidade do Fire lê a frota a partir desses batimentos. O endpoint éPOST /external/component-health e exige uma API key com
o escopo component-health:write.
- Saúde de componentes — um batimento por ciclo com
componentType,componentId,storeIdestatus. Opcionais:sentAt,offlineSince,degradedReason,appVersione umdetailslivre. Responde204 No Content. X-Heartbeat-Interval— cada204traz a cadência vigente, em segundos. Adote-a no próximo ciclo: é assim que o intervalo é reconfigurado sem publicar uma release.- O
componentIdprecisa ser estável — se mudar entre reinícios, para o Fire é outro componente: o antigo é baixado após 7 dias e o novo começa sem histórico. degradedReasonusa um vocabulário comum —printer_down,pinpad_down,backend_unreachable,queue_backlog,peripheral_other. As chaves dedetailsparakds_stationainda serão combinadas com o time de KDS.
status aceita apenas online e degraded. Não existe down: um equipamento não pode se
declarar morto — o Fire infere a queda pela ausência do batimento, após dois intervalos
perdidos.4 de agosto de 2026 — Novo campo assignedAt em eventos de menu e produto
menu.updated v2 e product.updated agora levam assignedAt em cada categoria e produto.
categories[n].assignedAteproducts[n].additionalInfo.assignedAt— data em que a entidade entrou no menu, ISO 8601 UTC, sem milissegundos. É um dado de pertencimento, não de edição: não muda com edições de preço, nome, imagem ou ordem; muda (data nova) quando o item é removido do menu e adicionado novamente. Casos extremos completos emmenu.updated→ Data de atribuição ao menu. Não viaja emproduct.price_updatednem emproduct.availability_changed— esses eventos transmitem apenas seu delta.menu.updated/product.updatedusamtaxInfo(nãotaxesInfo),type: PRODUCTOpara itens padrão, emodifierGroups[n].type: RADIOpara grupos de seleção única (CHECKBOXpara múltipla).storeIdé o UUID interno da loja (stores.id), não ostore_number— mesma convenção emmenu.updated,product.updated,product.price_updatedeproduct.availability_changed.- O
priceInfodeproduct.price_updatednão compartilha forma com opriceInfode catálogo demenu.updated/product.updated— é o preço de venda recém-salvo com seu desconto, não preços de catálogo.
channelReferenceName significa o fulfillment (delivery, pickup) em list.stores[n].channels[n] de menu.updated, mas o canal de vendas (iFood, Rappi) no mesmo nome de campo de product.updated, product.price_updated e product.availability_changed. Mesma chave, duas coisas diferentes dependendo do evento.4 de agosto de 2026 — Assinatura por e-mail do registro de alterações
Agora você pode receber um e-mail sempre que uma nova entrada for publicada nesta página. Assine pelo botão acima — a lista é gerenciada pelo Buttondown, então nenhum endereço fica guardado na documentação, e um clique em qualquer e-mail cancela a assinatura.- Um e-mail por entrada, nos três idiomas — English, Español e Português chegam juntos na mesma mensagem, então não há nada a escolher.
- Só uma entrada nova dispara o envio — corrigir um erro em algo já publicado nunca reenvia.
2 de agosto de 2026 — order.opened e os blocos de pagamento diferido
Cada evento avança em sua própria linha de versão — não há um número de contrato global:
Tudo o que foi adicionado é retrocompatível (blocos novos sobre um shape existente).
Nada aqui altera um campo que você já lê, e o contrato anterior de cada evento continua
publicado atrás da sua aba de versão.
- Novo evento
order.opened— dispara quando um pedido é injetado já aberto: ele existe, a cozinha pode começar, ninguém pagou ainda. Carrega o mesmo snapshot V4 queorder.completed. Não dispara para pedidos injetados comoCOMPLETEDouCANCELLED. Este evento não tem v0 — nasceu no v1. data.policy.deferredPayment— adicionado aos quatro eventos de pedido (order.opened,order.completed,order.invoiced,order.cancelled). Diz se o pedido pode ser cozinhado, faturado ou despachado antes do pagamento. Resolvido uma vez na injeção e carimbado imutável; todos os eventos seguintes repetem o mesmo valor.data.lastKnown— adicionado a esses mesmos quatro eventos. Foto orientativa do estado de cozinha e fiscal. Nunca condicione uma ação irreversível a este campo — pode virnullou desatualizado, e o próprio Fire o ignora e relê da fonte antes de emitir qualquer coisa.
Em
order.opened, payments.paymentMethods[] é o que o PDV declarou, não o que
foi cobrado — transactionStatus vem como PENDING e transactionId normalmente
vazio. O Fire sobrescreve o array com os tenders reais quando a cobrança entra, e
emite order.completed. Ler o meio declarado como evidência de recebimento é o erro
mais comum com este evento.22 de julho de 2026 — Manuais do usuário BOH
Adicionada a seção BOH na aba Manuais do usuário, cobrindo a administração do inventário back-of-house pelo Fire backoffice:- Visão geral e conceitos — como catálogo, receitas, abastecimento, movimentos, contagens e relatórios se relacionam; o fluxo de estoque; mapa do menu BOH.
- Lojas e fornecedores — lojas BOH vinculadas ao Restaurant OS e fornecedores com vínculos item–fornecedor (preço, unidade de compra, SKU).
- Catálogo — grupos de unidade e unidades, itens, etiquetas de itens intercambiáveis (FIFO / FEFO / prioridade / maior estoque), classificações.
- Receitas — receitas de venda, produção e subreceitas; ciclo rascunho → publicada → arquivada; linhas por canal; simulador de venda.
- Abastecimento — programações de recebimento, ciclo de vida dos pedidos de compra, níveis par e pedido sugerido.
- Recebimentos e devoluções — recebimentos de mercadoria (entrada de estoque, vínculo ao pedido de compra, sobre-recebimento) e devoluções ao fornecedor.
- Perdas e consumos internos — catálogo de motivos de perda, eventos de perda, consumos internos.
- Transferências e produção — transferências entre lojas e lotes de produção com rendimento.
- Contagens — áreas de inventário, contagens completas/parciais e o app móvel de contagem.
- Relatórios — usos e consumos, perdas, rendimento de produção e saldo em uma data.
13 de julho de 2026 — Cancelar pedido: campo cancellationType
Adicionado o campo opcional cancellationType (string) ao body de Cancelar pedido. Quando enviado, o ID ou código do motivo de cancelamento do catálogo é persistido no pedido e reportado ao gateway de pagamento. Atualizado em EN / ES / PT.
3 de julho de 2026 — Injetar pedido: distribuição de desconto em combo
Adicionada a seção Descontos de combo na referência de Injetar pedido. Quando um produtoCOMBO tem preço do contêiner igual a 0, o discountsValue do combo não deve ser colocado na linha do contêiner (produz totais negativos). Em vez disso, deve ser distribuído proporcionalmente entre os selectedModifiers:
discount_i = ROUND(D × (base_i / B), 2)— parcela proporcional por modificador- Cada modificador deve manter
subtotalIncludeDiscounts >= 0etotal >= 0após o desconto - O contêiner COMBO deve ter todos os campos de preço em
0 SUM(modifier.totalPrice.discountsValue)deve ser igual ao desconto total do combo
29 de junho de 2026 — Manuais do usuário KDS
Adicionada a seção KDS na aba Manuais do usuário, cobrindo tanto o uso pelo operador quanto a administração pelo backoffice:- Visão geral e conceitos — como lojas, estações, telas, roteamento, dispositivos e impressão se relacionam; dois tipos de estação (produção vs convergência); padrões de cozinha (somente montagem, KITCHEN, multi-estação).
- Configurar uma loja — aplicar um modelo (assistente de blueprint) ou configurar do zero; ordem recomendada das etapas.
- Estações — campos, regras opcionais por canal / serviço / tipo de item, criação passo a passo.
- Telas — identificador de dispositivo, criar e atribuir estações, relação tela ↔ estação.
- Roteamento — camadas de decisão (roteamento → regras → distribuição → convergência), modos de distribuição, exemplo multi-estação.
- Periféricos, impressão e validação — teclados, impressão de retirada (uma tela por loja), cancelamento de pedidos, checklist de go-live e rotas de referência.
- Ações na tela — avançar, reter/liberar, desfazer, cancelar, paginação, menu de configurações e atalhos de teclado.
- Tela de espera — tela para clientes (áreas em preparo / pronto, destaque ao ficar pronto, paginação automática).
22 de junho de 2026 — Novo guia: Estrutura de produtos · Publicação de cardápios atualizada
Novo guia: Estrutura de produtos
Nova página Estrutura de produtos na aba Guias — cobre o tipoCOMBO e os overrides de modificadores:
- Tipo COMBO —
priceInfo.priceé sempre0; usarpriceInfo.referencePricecomo preço de cabeçalho do produto. - Preço de referência — soma de (opção mais barata ×
minOptions) em cada grupo de modificadores obrigatório (minOptions ≥ 1). - Overrides de modificadores —
productModifiers[n].overridesdefine um preço diferente para uma opção dentro de um combo específico; tem precedência sobre o preço base do produto emproducts[]. - Preços delta — grupos obrigatórios exibem
+R$ Xacima do baseline; grupos opcionais exibem o preço cheio do add-on.
Guia de publicação de cardápios
- Removida a seção
menus.sync— esse evento não existe mais. - Corrigido o formato do payload:
eventé agora um objeto aninhado (id,type,executionId,createdAt), não campos no nível raiz. - O passo de verificação de assinatura agora especifica que o signing secret é obtido em Integrações de agregadores no dashboard do Fire.
- Adicionada seção de estrutura do cardápio com descrição de
list,categories,products(tabela de tipos) emodifierGroups.
15 de junho de 2026 — order.completed — novos campos do método de pagamento
Adicionados 4 campos em payments.paymentMethods[n] no evento order.completed. Todos são nullable e já estão em produção.
idAuth(string | null) — ID de autorização do processador de pagamento (ex.: SiTefIdAuth). Diferente deauthorizationCode.receiptCustomer(string | null) — Texto completo do comprovante para o cliente; pode ser multilinha.receiptMerchant(string | null) — Texto completo do comprovante para o estabelecimento; pode ser multilinha.acquirer.cnpj(string | null) — CNPJ da credenciadora de pagamento — apenas Brasil.
15 de junho de 2026 — Campos de detalhe do método de pagamento
Adicionados 5 campos opcionais empayments.paymentMethods[n] em Injetar pedido:
id_auth(string | null) — Número de autorização NFCE (SiTef 952 / IdAuth).receipt_customer(string | null) — Via do cliente: texto do comprovante impresso para o portador (SiTef 121 / ReceiptCustomer).receipt_merchant(string | null) — Via do estabelecimento: texto do comprovante impresso para o lojista (SiTef 122 / ReceiptMerchant).acquirer.cnpj(string) — CNPJ da credenciadora para NFCE (SiTef 950 / CNPJAuth).acquirerfica documentado como nullable — envienullpara métodos sem credenciadora.card.media(string) — Tipo de leitura do cartão:CHIP,MAGNETIC,NFC,MANUAL(SiTef 2090 / Media).cardfica documentado como nullable — envienullpara métodos sem cartão.
14 de junho de 2026 — Webhook de status de pedido do agregador
- Novo webhook de entrada
POST /v1/webhooks/aggregators/order-status— seu agregador de delivery (Rappi / Uber / Didi / iFood / PedidosYa / Glovo…) faz POST com o status de entrega do pedido conforme ele avança (courier_assigned→on_route→delivered…). O Fire espelha o status mais recente emorders.aggregatore registra cada evento. - O status é passthrough — nenhum enum é imposto; os rótulos do próprio agregador são armazenados literalmente, e o status atual é o que tem o
occurredAtmais recente (sem guard anti-regressão). Rótulos traduzidos amigáveis são resolvidos no momento da exibição a partir do catálogo do canal. - Resolução flexível do pedido — envie
orderId(UUID do Fire) e/ouexternalOrderId(sua referência, casada emmetadata.order_id); ao menos um é obrigatório, ambos vendor-scoped. Se os dois forem enviados e resolverem para pedidos diferentes →409. - Não há
eventIdemitido pelo Fire para ecoar — um status de agregador é um evento externo espontâneo (o Fire não é a fonte da verdade aqui). A idempotência é chaveada em(channelCode, providerEventId)+status;channelCodedeve ser igual aometadata.channel.codedo pedido. - Auth: API key vendor-scoped com o novo escopo
webhooks:aggregator.202async + fila, mesmo envelope que os callbacks fiscal / KDS. - Documentado em EN / ES / PT.
12 de junho de 2026 — Descontos do agregador em Injetar pedido
Documentado como enviar descontos promocionais do agregador (iFood, Rappi, UberEats, etc.) no endpoint Injetar pedido.- Descontos do agregador são um método de pagamento, não uma linha de desconto. Quando o agregador aplica um desconto ao cliente, o estabelecimento recebe o valor integral e o agregador reembolsa a diferença — modele como uma entrada extra em
payments.paymentMethods[]compaymentMethodCode: "AGGREGATOR_DISCOUNT",transactionType: "BENEFIT",processorcom o nome do agregador ecard: null. payments.discounts[]fica vazio para descontos do agregador — esse array é apenas para promos/cupons absorvidos pelo estabelecimento.- Nova regra de saldo documentada:
SUM(paymentMethods[].totalBill)deve ser igual a produtos + cobranças extras + frete. - Novo exemplo de request com um pedido do iFood (BRL 38.69 CREDIT + BRL 1.00 AGGREGATOR_DISCOUNT = BRL 39.69 bruto).
- Atualizado em EN / ES / PT.
11 de junho de 2026 — Nomenclatura underscore + payload thin de fechamento de dia
- Nomes (breaking) —
store.day-closed→store.business_day_closedeorder.status-updated→order.status_updated(nomenclatura underscore). Atualize seu switch deevent.type. store.business_day_closedagora é um payload thin — identidade do fechamento (businessDayId,businessDayDate,timezone,status), timing (openedAt/closedAt),closedBye umastoremínima (uid,code,externalId,countryCode,timezone,currencyCode). Removido do evento:sales,metrics,summary,byChannel,byPaymentMethod,forceClosedOrders,closureStats,cancelledOrders,metadata— consulte-os porbusinessDayIdquando precisar.snapshotIdrenomeado parabusinessDayId(mesmo valor).- Documentado em EN / ES / PT.
10 de junho de 2026 — Eventos canônicos de pedido + evento de cozinha
Os eventos fiscais perdem o país do nome e passam a ser canônicos de pedido — continua sendo o contrato v1, só muda oevent.type:
fiscal.authorized.br→order.invoicedefiscal.cancelled.br→order.reversed. Se sua integração despacha porevent.type, atualize o switch — a forma do payload não muda.- Agora disparam para todos os países: Brasil (SEFAZ via seu provedor fiscal) e CO/EC/CL/AR/VE via o callback fiscal genérico. O país viaja em
fiscal.countryCode. - Novo evento
order.status_updated— o KDS avança o pedido na cozinha (preparing→ready→dispatched), com blocokitchene o percurso completo emhistory. - O Fire é a fonte da verdade — os webhooks de entrada (callback fiscal, status KDS) agora validam que
eventIdreferencia um evento emitido pelo Fire para esse pedido; caso contrário respondem400antes do202. Sempre ecoe oevent.idde um envelope que você recebeu. - Documentado em EN / ES / PT.
9 de junho de 2026 — Contrato de eventos v1
O contrato de eventos de pedido/fiscal/fechamento agora é oficialmente v1. Todas as adições são retrocompatíveis (novos campos opcionais); o formato anterior é preservado como v0 (descontinuado, histórico) — alterne com o seletor de versão no topo de cada página de evento.- Descontos — descontos de pedido e de produto trafegam como objeto
Discount(priority,typeFIXED/PERCENTAGE,value,net_price,discount_value,net_price_after_discount) empayments.discounts,payments.totals[].discountseorderLines[].price.*[].discounts+lineTotals[].discounts. - Impostos granulares —
taxes[]agora carrega os impostos da reforma BRIBS_UF,IBS_MUN,CBSjunto deICMS/PIS/COFINS, com metadata de reforma (cClassTrib,reducao,rateNominal,rateEffective). O detalhamento é uniforme em todos os países — LATAM carrega seuIVAlocal no mesmotaxes[]; apenas a emissão SEFAZ (metadata.fiscal,fiscal.*.br) é exclusiva do BR. itemType— enum completo:PRODUCT/COMBO/MODIFIER/PACKAGING.fulfillment.delivery.deliveryConfirmationCode— código de confirmação do agregador (ex. iFood / Rappi).- store.business_day_closed —
salesagora incluiproduct_discounts,gross_before_discounts,shipping,extra_charges,total_chargedetaxes_by_type. (Substituído em 11 de junho — esses agregados já não vão embutidos no evento; o payload de fechamento agora é thin. Veja a entrada no topo.) - order.cancelled / order.invoiced / order.reversed — carregam o snapshot v1 do pedido.
- Documentado em EN / ES / PT com exemplos atualizados.
8 de junho de 2026
- menu.updated: adicionado
productModifiers[n].overrides[]— permite definir um preço diferente para uma opção específica de modificador quando pertence a um produto específico. Cada override aponta para umproductIde fornece seu própriopriceInfo.priceepriceInfo.salePrice. Atualizado EN/ES/PT.
5 de junho de 2026
-
menus.sync: página removida — o Fire envia um único evento
menu.updatedpor menu; a sincronização em lote não é mais um evento separado. -
menu.updated: campo
event.timezoneremovido do payload. Adicionadodata.groupId— UUID que identifica o batch de sincronização; vários eventos emitidos juntos compartilham o mesmo valor, permitindo correlacioná-los em sistemas externos. Os arraysschedulesde categorias e produtos agora incluem exemplos completos de 7 dias com janelas de horário diferentes por categoria (ex.: Hambúrgueres 11:00–23:00, Café da Manhã 07:00–11:00). CampostandardTimeem produtos documentado:trueherda os horários do menu,falsesignifica que o produto tem seu próprio arrayschedules. Atualizado EN/ES/PT. -
Injetar pedido: o campo
typeé agora obrigatório em cada item deorder.products[], em cada item deselectedModifiers[]e em cada item depayments.extraCharges[]. Valores aceitos:COMBO(produto com grupos de modificadores não vazios),PRODUCT(produto simples vendável ou opção vendável dentro de modificadores),MODIFIER(opção de modificador puro),PACKAGING(item de embalagem). Payloads que omitemtypesão inválidos. Exemplos de requisição atualizados em EN/ES/PT. -
Injetar pedido: documentado
shippingMethod.delivery.additionalInfo.deliveryConfirmationCodecomo string opcional para enviar o código de confirmação da entrega.
1 de junho de 2026
- Injetar pedido: seções Valores e faixas de preço e Frete e descontos; três exemplos de requisição conciliados (entrega simples, desconto na linha + frete, vários produtos + desconto do pedido); ênfase em
payments.shippingCost[],payments.discounts[]ediscountsValuepor produto (EN/ES/PT).
27 de maio de 2026
- menus.sync: exemplo de payload completo (categorias, produtos, grupos de modificadores, horários);
data.menus[]substituído pordata.menu(um cardápio por evento); páginas EN/ES/PT na webhook reference. - menu.updated: estrutura geral alinhada com
menus.sync— campos do catálogo (list,categories,products,modifierGroups,scheduledActivities) aninhados emdata.menu; tabelas de campos e exemplo de remoção atualizados. - Guia Publicação de cardápio (EN/ES/PT): exemplos e passos de processamento atualizados para
data.menu. - Injetar pedido: campo opcional
commentdocumentado emorder.products[]; exemplo de requisição atualizado (substituiproductComment). - menu.updated / menus.sync: os
productIddas opções de modificador devem existir emproducts; o exemplo incluiprod_size_smalleprod_size_large. - menu.updated: indentação do exemplo principal do payload corrigida em
data.menu. - Webhooks de cardápio (
menu.updated,menus.sync, product.updated):data.countrydocumentado e exemplificado como ISO 3166-1 alpha-2 (ex.:EC,BR,CO) em vez de um ID numérico de país.
26 de maio de 2026
- Adicionada a aba Manuais do usuário como seção principal da navegação.
- Adicionados manuais do FIRE POS V2 para Vinculação, Caixas e Códigos de autorização em inglês, espanhol e português.
- Adicionadas imagens placeholder sutis para as capturas pendentes do POS, mantendo a estrutura visual final dos guias enquanto as capturas são preparadas.
- Injetar pedido: removido o campo
order.stockdo corpo (não faz parte do contrato). Exemplo de resposta 200 atualizado para o envelope real (data,isArray,status,method,pathname,duration,traceId). - Login (playground):
authMethod: none, URL absoluta de staging no frontmatterapi:, cabeçalhoContent-Typecom valor padrão egrant_typepadrão para evitar Missing required fields ao usar Testar. - Injetar pedido:
priceda linha de produto documentado com todos os campos da faixa de preço etaxes[](name,rate,amount,metadataopcional). - Injetar pedido:
payments.shippingCost[]epayments.discounts[]documentados como as mesmas linhas de faixa de preço quetotals[]; exemplo de requisição atualizado com linhas de frete e desconto. - Cancelar pedido: referência da API atualizada para a rota de agregador
POST /api/v4/integrations/sales/aggregator/orders/{order_uid}/refund, com campos de cancelamento/reembolso e envelope padrão de resposta; movida para baixo de Injetar pedido na referência da API.
11 de maio de 2026
- Nova aba Alterações no fim da navegação e esta página inicial.
- Removida a página de listagem de canais de venda e o item correspondente na navegação (todos os idiomas).
- Introdução da API: texto ajustado; card de canais de venda removido.
- Injetar pedido: cabeçalho
Authorizationdocumentado (EN). ES e PT: caminho, cabeçalhos e corpo atualizados para o contrato atual de integração (objetos de canal/serviço, dispositivo, operador, exemplos). - Login (ES e PT): alinhado a
POST /api/authentication/logine respostaaccessToken(client credentials). - Página inicial em espanhol (
/es/): conteúdo revisado. - Configuração: novo guia Integrações de agregadores (painel Fire: endpoints de webhook e eventos de teste).

