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.
Assinar21 de outubro de 2026 — Importar e exportar o catálogo
O backoffice tem uma tela nova, Importar e exportar (Operação → Importar e exportar): baixe uma cópia do catálogo de um vendor, edite fora do backoffice e importe de volta, revisando cada alteração antes de ela ser gravada.- Importar e exportar — manual novo. Dois formatos: Backup completo (JSON), com categorias, modificadores, listas de preços, produtos e menus, para guardar uma cópia ou levar o catálogo para outro ambiente; e Planilha editável (Excel), com categorias, produtos e preços em linhas simples, para alterar muitos de uma vez.
- Primeiro se revisa — importar nunca grava na hora: o arquivo é analisado, você revisa o que seria criado, atualizado e excluído, e só então o aplica. Antes de aplicar, o Fire guarda um backup dos dados atuais.
- Mesclar e Substituir — Mesclar cria e atualiza, e não exclui nada. Substituir deixa os dados exatamente como estão no arquivo e exclui o que não está nele; é reservado a administradores da plataforma, que também podem Desfazer uma importação aplicada.
- Combinações afetadas — o detalhe lista as combinações de loja × canal × Tipo de Fulfillment que usam um menu ou uma lista de preços que muda.
Importar não sincroniza: as alterações chegam às lojas e aos canais somente quando você sincroniza em Atribuição de menus.
13 de outubro de 2026 — Guia de API keys e preços promocionais no backoffice
Um novo guia cobre as API keys de ponta a ponta: onde criar uma, o que significa o vendor scope e qual scope cada endpoint exige.- API keys — as keys são criadas em Developers → API Management com Create API Key: você escolhe um nome, os scopes e uma expiração opcional. Selecione um vendor no dashboard antes de criar a key: com All vendors selecionado a key fica sem vínculo de vendor, e os endpoints que o exigem respondem
403. - Scopes — todos os scopes do dashboard, com os endpoints que cada um libera, incluindo
cash-management:writeekiosks:write. - Gerenciar keys — você pode editar os scopes de uma key sem mudar o segredo dela; nome, descrição e expiração ficam fixos depois de criada, e não há rotação integrada (crie uma key nova, troque e depois revogue a antiga).
- Header — envie a key em
x-api-key.Authorization: Bearer pk_live_...continua funcionando como alias legacy; se você enviar ambos,x-api-keyvale. - Listar menus e Obter menu agora apontam para o guia sobre o scope
menu:reade o vínculo de vendor.
- Listas de preços — as promoções agora ficam aqui, ao lado do preço, e também valem dentro dos combos. Até onde uma promoção chega e por que um preço sugerido é só um preço riscado que nunca é cobrado.
- Menus — um menu não tem mais tipo de entrega próprio: ele usa o da linha de atribuição. Três lentes (dia, tipo de entrega, preços) e a nova aba Overrides.
- Atribuição de menus — os preços promocionais viajam com o Sync, os lotes caem de 50 para 20 linhas e as alterações de preço salvas na pré-visualização só chegam aos agregadores, não ao POS nem ao Quiosque.
- Grupos de modificadores — adicionar um grupo a um produto o copia: alterações posteriores no grupo não chegam aos produtos que já o têm. Perguntas diferentes por tipo de entrega.
- Produtos — combos não têm preço próprio: o cliente paga a soma das opções que escolhe. O preço de referência “a partir de”, as promoções dentro de um combo e os preços por tipo de entrega.
6 de outubro de 2026 — Novo endpoint: listar os terminais de uma loja
Agora você pode consultar quais equipamentos uma loja tem e em que estado estão: caixas POS, quiosques de autoatendimento e telas de cozinha KDS.GET /external/stores/{storeId}/terminals— retorna otype, ostatuse olastSeenAtde cada terminal, e o seuexternalId(em quiosques, o device ID da tela QR). Por padrão traz os terminais ativos e suspensos; os revogados são pedidos comstatus=REVOKED. Filtre portypee reduza a resposta comfields. Usa o scopestore:readque você já tem para os endpoints de lojas.
5 de outubro de 2026 — O parcial do dia na impressão de cupom
Imprimir o fechamento do dia aceita"partial": true para imprimir
como está o dia até agora sem fechá-lo (leitura X): mesmo template do fechamento, com uma faixa
PARCIAL — NÃO É FECHAMENTO e o horário do corte.
- Só o dia aberto da loja; qualquer outra data responde
409 PRINT_DAY_NOT_OPEN. - A resposta traz
subject.partial: true, efreshness.asOfé o horário do corte. - Sem
partial, o endpoint se comporta igual a antes.
30 de setembro de 2026 — O bloco fiscal das lojas tem o mesmo formato em todos os países
O blocofiscal de Listar lojas e
Obter loja deixa de ser específico do Brasil. secondaryGovIdType,
secondaryGovIdNumber e metadata vêm sempre, em null quando a loja não os tem, igual a
store.storeFiscalConfig em order.completed.
- Colômbia:
metadatatrazclaveTecnica,rangoFacturacionerangoNotaCredito(as faixas da DIAN). - Equador, Chile, Argentina, Venezuela: as três chaves aparecem, em
null. Antes não vinham. - Brasil: sem mudanças.
order.cancelled, order.invoiced, order.reversed) levam o mesmo bloco
que order.completed: na Colômbia, o cancelamento traz as faixas com que se emite a nota de crédito.
28 de setembro de 2026 — Endpoints de menus da External API documentados
Dois endpoints se somam à External API, junto de Obter loja e Listar lojas: ler os menus de uma loja por API key, a versão por consulta do webhookmenu.updated.
- Listar menus — quais ternas (loja × canal × tipo de fulfillment) de uma loja têm hoje um menu gerado, sem o menu.
- Obter menu — o último menu gerado de uma terna, no mesmo formato de
menu.updated, com um blocosyncque diz se chegou ao canal.
O design está fechado mas ainda não está implementado — não há nada para chamar hoje. Esta entrada existe para que você possa construir contra o contrato antes do lançamento.
25 de setembro de 2026 — Dinheiro entregue e troco nos eventos do pedido
Os dois campos de dinheiro depayments.paymentMethods[] nos eventos que levam o snapshot V4 do pedido (order.opened, order.completed, order.invoiced, order.cancelled, order.reversed). As versões dos eventos não mudam.
customerCashAmounté um número e traz o valor real. Até 24 de setembro de 2026 trafegava sempre como o texto"0", inclusive em pagamentos em dinheiro. Agora é o dinheiro entregue pelo cliente: para uma conta de22.9paga com uma nota de50,50;0nos meios que não são dinheiro.changeAmountentra na referência — o troco entregue pelo caixa, como número:27.1no exemplo anterior,0nos meios que não são dinheiro,nullquando o caixa não o enviou. Já trafegava nos eventos; faltava na referência.- Se o seu consumidor validava que
customerCashAmountfosse texto, agora falha. Leia como número. Os eventos de pedidos injetados antes de 24 de setembro continuam trazendo"0", então um reenvio de um pedido antigo também.
23 de setembro de 2026 — Manual do Agente de catálogo
Novo manual para quem opera o catálogo com o Agente de catálogo, o chat com inteligência artificial que propõe etiquetas de produto e as aplica só com aprovação humana.- Agente de catálogo — como conversar ou enviar um arquivo para etiquetar produtos, quais decisões o agente pede (modo, termos novos, alias) e por que uma aprovação pode sair parcial quando alguém edita o produto nesse meio-tempo.
16 de setembro de 2026 — cStat volta a ser emitido, dentro de countryData
Isto corrige o que diz uma entrada posterior. Em 15 de setembro anunciamos que cStat não era mais emitido. Os consumidores pediram de volta —sem ele um cancelamento não diz se o órgão o aceitou— então ele retorna. Apenas cStat: docType, dataAutorizacao e sefazCancellation continuam de fora.
- Brasil:
authority.countryData.cStat. O código com que o órgão resolveu este documento:100numa autorização,135num cancelamento. É vocabulário do órgão, então viaja ao lado dechaveAcessoeprotocolo, não na raiz do bloco. - O cancelamento leva o próprio código, não o da nota. O
order.reversedtraz135—o evento de cancelamento registrado na SEFAZ— enquanto oorder.invoicedque o precedeu mantém100. Verificado de ponta a ponta em staging. - Viaja como o provedor envia,
numberoustring. Não normalizamos um tipo que o órgão não escolheu. - Pelo callback fiscal já funcionava: tudo o que vai dentro de
documente não é canônico chega acountryDatasem alteração. EnviecStatali e ele chega — não foi preciso mudar nada do seu lado. mensagemSefazcontinua de fora. Volta apenas o código.- As rejeições continuam sem emitir evento. Um documento
rejectedguarda seu código mas não disparaorder.invoicednemorder.reversed, então nesse casocStatnão chega até você.
15 de setembro de 2026 — Impressão no envio do KDS, zoom e Agente Fire Android
A impressão da cozinha agora é uma regra da loja (comanda e/ou fiscal numa estação). Tablets precisam do próprio Agente Fire. O zoom e a reimpressão do operador são outra impressora.- Impressão no envio — By screen ou By station, documentos e timing fiscal. Arme a fila na tela KDS. O dashboard avisa se a estação de impressão não tem tela ativa.
- Ações na tela — zoom de estação/ticket (toque duplo no temporizador, tecla Q). Se a impressora falhar com o fiscal pronto, o ticket mostra Queued: printer failed.
- Board do operador — Operator fiscal printer no PC do supervisor (não a fila da cozinha).
- Instalação no Android — APK no tablet do KDS.
kds-agent.fire.restdeve resolver para127.0.0.1. Token e nome da impressora devem coincidir com o fire-kds. - Estações / Roteamento — o veto de item type na estação sumiu. As categorias vivem só na estratégia de roteamento.
15 de setembro de 2026 — Datas do cancelamento e rejeições
Duas correções no que o callback fiscal guarda e, por consequência, no queorder.invoiced e order.reversed carregam. As versões dos eventos não mudam.
- O cancelamento mantém as datas da fatura.
authority.issuedAteauthority.authorizedAtcontinuam como a fatura os tinha, mesmo que o callbackcancelledenvie os seus. Antes assumiam a hora do cancelamento enquantocompensates.issuedAtseguia apontando para a fatura, então o mesmo bloco contava duas histórias. Para saber quando o documento foi anulado, useauthority.cancelledAt. - Um resultado negativo não guarda dados de comprovante. Em
rejected,deniedeerror, o Fire ignoradocumentNumber,providerDocId,issuedAt,authorizedAt, os valores,pdfUrl,xmlUrlegraphicmesmo que o provedor os envie; são guardadosdocumentType,docSubtype, as chaves do país emdocument,failure,provideremetadata. Um documento rejeitado era lido como um autorizado, com número e comauthorizedAt. Um documento que já tinha dados de comprovante os mantém.
15 de setembro de 2026 — Bloco fiscal estruturado e eventos fiscais novos
O bloco fiscal dos três eventos fiscais agora é o que o Fire guarda no pedido, com uma única forma para todos os países: o veredito do órgão emauthority, mais o percurso do documento e qual ele substitui. Dois guias novos explicam o ciclo completo.
- Breaking — o bloco fiscal de
order.invoiced,order.cancelledeorder.reversedé estruturado. Os campos canônicos passam paraauthority(documentType,documentNumber,issuedAt,cancelledAt…), os valores paraauthority.amountse os identificadores do órgão (chaveAcesso,claveAcceso,cufe,protocolo…) paraauthority.countryData.dataAutorizacaopassa a serauthority.authorizedAt;docType,cStatesefazCancellationnão são mais emitidos. Cada caminho anterior tem exatamente um caminho novo: veja Mudanças de caminho. - Breaking — num cancelamento o bloco passa de
cancellation.metadata.fiscalparacancellation.fiscal, ecancellation.metadatanão é mais emitido. Se o pedido não tinha documento autorizado, a chavefiscalnão existe — antes vinhanull, então uma comparação com=== nulldeixa de bater. - Breaking — o callback fiscal tirou todos os campos canônicos de
documentpara a raiz (documentType,docSubtype,documentNumber,issuedAt,authorizedAt,cancelledAt,authorizationMode,providerDocId,totalAmount,taxAmount,currencyCode,pdfUrl,xmlUrl,graphic);documentagora leva só os identificadores do país. Renomeações:countryCode→country,docType→documentType(SALE_INVOICEouCREDIT_NOTE, os únicos dois aceitos),error→failure(comscopeedetails),providerSpecific→metadata,emittedAt→issuedAt. Um emissor com os nomes anteriores recebe400indicando o campo — no caso dedocType, emauthorizedecancelled. No EquadornumeroAutorizacioné retirado: o identificador autorizado éclaveAcceso.cnpjEmitentenão faz parte do contrato. order.cancelledleva o bloco fiscal em todos os países com documento autorizado; antes era só o Brasil.historyecompensates—order.invoicedeorder.reversedlevam cada parada do percurso do documento, da mais antiga à mais nova.compensatesaponta para o documento que o vigente substitui: vem preenchido emorder.reversedenullemorder.invoiced.authority.providerIdentityeauthority.providerMetadata— oprovidere ometadatado callback agora chegam ao pedido e aos eventos, com os mesmos nomes da numeração fiscal.nullquando não enviados; o PlugNotas (Brasil) nunca os envia.- Como o fiscal funciona no Fire — os dois atos (numerar e autorizar), os dois blocos do pedido e os dois caminhos pelos quais um documento chega ao Fire.
- Do callback aos eventos — qual evento sai para cada callback e onde cai cada campo.
No Brasil
authority.authorizedAt traz a data da SEFAZ com um horário convencional de meia-noite, então pode ficar antes de issuedAt. Para o momento da venda use issuedAt.
Não é retrocompatível no bloco fiscal; o resto do snapshot do pedido não muda. As versões anteriores continuam disponíveis nas abas de versão de cada evento.
Atualizado em EN / ES / PT.
4 de setembro de 2026 — Cupons nas linhas do pedido
Os pedidos já podem chegar com cupons.order.completed leva quem financiou cada desconto, na linha e no pedido.
orderLines[].rewardId— o código de resgate do cupom, ounull. Os modificadores selecionados também o levam: num combo o desconto costuma estar nos modificadores, não no contêiner. Há duas formas válidas e nenhuma é erro:nullcom desconto (uma remarcação de catálogo, sem cupom) e um código comdiscountValue: "0"(o cupom mudou o preço de tabela em vez de descontar).data.marketing.coupons[]— estava reservado para uso futuro; agora leva{ rewardId, name, metadata }por cupom.metadata.scopeéproduct,orderoushipping, emetadata.amounté o dinheiro que ele descontou. Um cupom comscope: "order"aparece apenas aqui: o seu valor chega às linhas já distribuído entre elas e nada liga as parcelas a ele.
value de um cupom é o valor nominal da regra — uma porcentagem, ou pontos —, não moeda. O dinheiro está sempre em amount. E baseValue: null significa que o preço de tabela não é conhecido, o que não é o mesmo que zero.
Retrocompatível: os dois campos são adições sobre a forma existente, e
rewardId chega como null em todo canal que não envia cupons.
Atualizado em EN / ES / PT.
3 de setembro de 2026 — Credenciais Fire do KDS, linhas de comandas e categorias de estação
A impressão e o cancelamento da cozinha precisam do host e da key certos da Fire. Os cartões podem ocupar de uma a três linhas. Os produtos ganham uma categoria de roteamento e uma miniatura de cozinha.- Credenciais Fire API — padrão da conta versus override por vendor. A base URL é só o host da Fire; o fire-kds acrescenta as rotas de print e cancel.
- Categorias de estação — códigos usados como
item_typeno roteamento, mais miniaturas de produto na visualização da categoria. - Credenciais Fire do KDS (técnico) — linha de vendor → padrão da conta → env. Print lê só
FISCAL_PRINT_*. Cancel pode cair emFIRE_*. - Ações na tela — Linhas de comandas (1–3) reservam espaço para notas. Se a Fire rejeitar um cancel, o operador vê a rejeição e o detalhe de policy; o trabalho fica falho.
3 de setembro de 2026 — O catálogo: produtos, categorias e grupos de modificadores
Três manuais novos para as telas que alimentam todo o resto. Um menu não inventa nada — escolhe do catálogo —, então o trabalho começa de verdade aqui.- Produtos — os quatro tipos, os interruptores que decidem se algo vende, o preço, os modificadores, os combos e as sugestões.
- Categorias — os blocos com que o cliente percorre o cardápio, o horário deles e a exclusividade de canal.
- Grupos de modificadores — as perguntas feitas na hora do pedido, e as opções que as respondem.
- As opções de um modificador são produtos do catálogo. Para oferecer queijo extra tem que existir um produto queijo extra; o preço dele é lido daquele produto, nunca digitado no grupo.
- Num grupo só se definem dois números: mínimo e máximo. Obrigatório/opcional e única/múltipla são deduzidos deles, então um grupo não pode se contradizer.
- A exclusividade de canal é herdada. Marcar uma categoria como exclusiva a tira do Golden Menu junto com os produtos dela.
- Um combo não tem aba de preço, e o preço que a lista mostra é uma referência calculada, não o que você cobra. O preço real sai da lista de preços do destino.
A aba de preços depende do país: no Brasil ela é simplificada ao preço final mais a categoria
fiscal (NCM). As variantes de produto estão previstas mas ainda não têm tela.
3 de setembro de 2026 — Menus: montar o cardápio e fazê-lo chegar ao canal
Dois manuais novos para o par de telas que decidem o que se vende e onde: o menu Golden e os menus custom que herdam dele, e a matriz que coloca cada menu em cada loja, canal e tipo de fulfillment.- Menus — Golden e custom, a herança, o diálogo de criação, as abas Structure e Overrides, e as lentes de preço e de dia.
- Atribuição de menus — a matriz loja x canal x fulfillment, a atribuição em massa, o Sync e seus avisos, e a pré-visualização.
- O tipo de fulfillment é escolhido uma vez e não pode ser alterado. É o único campo do menu sem volta: errar significa criar o menu de novo.
- Salvar um menu não o publica — no editor não há botão de publicar. O menu chega a um canal só quando alguém sincroniza a linha correspondente na tela de atribuições.
- O Sync achata o menu fresco, sem versionamento. Envia o menu e a lista de preços exatamente como estão salvos naquele segundo; não é possível republicar um estado anterior.
- Uma linha pode ficar em Synced e ainda assim ter perdido produtos. Um produto sem preço na lista atribuída fica fora do envio em vez de ser publicado em zero, e a única coisa que avisa é o chip de avisos.
Os canais agregadores recebem seus eventos, mas o resultado ainda não se reflete no status de
sincronização desta tela. A aba History do menu também segue vazia.
2 de setembro de 2026 — Em falta: desligar produtos durante a operação
Manual novo da tela Em falta: tirar um produto da venda em uma loja quando ele acaba na cozinha, sem editar o cardápio e sem que ninguém precise desfazer depois.- Em falta — a caixa de diálogo de desligamento, o alcance por canal, o motivo obrigatório, a restauração e a aba de auditoria.
- Um desligamento nunca sobrevive ao fechamento da loja. O teto é o fim da jornada operacional, não uma quantidade fixa de horas: um produto desligado hoje amanhece vendendo.
- O alcance é um par de canal e tipo de entrega. Um produto pode ficar desligado no quiosque e continuar sendo vendido no caixa.
- Como opção de um combo, o produto continua selecionável. Se ele também é vendido dentro de grupos de modificadores, a caixa de diálogo os nomeia e o desligamento os registra, mas o que os canais recebem é disponibilidade por produto: uma opção não tem onde entrar ali.
- O motivo é obrigatório e não é editável. Alterar a validade move apenas o horário — o motivo fica como o registro do porquê o produto foi desligado.
- Publicar o cardápio encerra o desligamento, mas só se cobriu todo o seu alcance. Um desligamento de toda a loja sobrevive a uma publicação que chegou a um canal, porque nos outros o produto continua fora de venda de verdade. O desfecho é Substituído por um sync.
- O desligamento fica salvo mesmo que o canal não fique sabendo. Avisar é informado separado de salvar, e os desligamentos cujo aviso não chegou são contados no cabeçalho e marcados na sua linha.
O desligamento se propaga sim aos canais de venda:
products/listing por produto para os canais
X-Mart e product.availability_changed por
canal para os agregadores, nas três direções (desligar, restaurar, vencer). A linha fica como
registro operacional do Fire — o que deixou de ser vendido, quando e por quê — e nunca entra no
snapshot do cardápio: essa separação é deliberada, não uma etapa pendente. O que não se propaga são
os produtos vendidos apenas como opção de modificador: nenhum dos dois contratos tem onde colocá-los.15 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).

