15 June 2026 — order.completed — new payment method fields
Added 4 fields to payments.paymentMethods[n] in the order.completed event. All fields are nullable and already live in production.
idAuth(string | null) — Authorization ID from the payment processor (e.g. SiTefIdAuth). Distinct fromauthorizationCode.receiptCustomer(string | null) — Full customer-facing receipt text; may be multi-line.receiptMerchant(string | null) — Full merchant-facing receipt text; may be multi-line.acquirer.cnpj(string | null) — Tax ID (CNPJ) of the payment acquirer — Brazil only.
15 June 2026 — Payment method details fields
Added 5 optional fields topayments.paymentMethods[n] in Inject Order:
id_auth(string | null) — NFCE authorization number (SiTef 952 / IdAuth).receipt_customer(string | null) — Customer receipt copy: printed receipt text for the cardholder (SiTef 121 / ReceiptCustomer).receipt_merchant(string | null) — Merchant receipt copy: printed receipt text for the store (SiTef 122 / ReceiptMerchant).acquirer.cnpj(string) — Acquirer CNPJ for NFCE (SiTef 950 / CNPJAuth).acquireritself is now documented as nullable — sendnullfor methods without an acquirer.card.media(string) — Card read method:CHIP,MAGNETIC,NFC,MANUAL(SiTef 2090 / Media).cardis now documented as nullable — sendnullfor non-card methods.
14 June 2026 — Aggregator order-status webhook
- New inbound webhook
POST /v1/webhooks/aggregators/order-status— your delivery aggregator (Rappi / Uber / Didi / iFood / PedidosYa / Glovo…) POSTs the order’s delivery status as it advances (courier_assigned→on_route→delivered…). Fire mirrors the latest status ontoorders.aggregatorand logs every event. - Status is passthrough — no enum is imposed; the aggregator’s own labels are stored verbatim, and the current status is the one with the latest
occurredAt(no anti-regression gate). Friendly translated labels are resolved at display time from the channel catalog. - Flexible order resolution — send
orderId(Fire UUID) and/orexternalOrderId(your reference, matched onmetadata.order_id); at least one is required, both vendor-scoped. If both are sent and resolve to different orders →409. - No Fire-emitted
eventIdto echo — an aggregator status is a spontaneous external event (Fire is not the source of truth here). Idempotency is keyed on(channelCode, providerEventId)+status;channelCodemust equal the order’smetadata.channel.code. - Auth: vendor-scoped API key with the new
webhooks:aggregatorscope. Async202+ queue, same envelope as the fiscal / KDS callbacks. - Documented in EN / ES / PT.
12 June 2026 — Aggregator discounts in Inject Order
Documented how to send aggregator platform discounts (iFood, Rappi, UberEats, etc.) in the Inject Order endpoint.- Aggregator discounts are a payment method, not a discount row. When an aggregator applies a promotional discount to the customer, the store receives the full amount and the aggregator reimburses the difference — model it as an extra entry in
payments.paymentMethods[]withpaymentMethodCode: "AGGREGATOR_DISCOUNT",transactionType: "BENEFIT",processorset to the aggregator name, andcard: null. payments.discounts[]stays empty for aggregator discounts — that array is only for store-absorbed promos/coupons.- New balance rule documented:
SUM(paymentMethods[].totalBill)must equal products + extra charges + shipping. - New request example with an iFood order (BRL 38.69 CREDIT + BRL 1.00 AGGREGATOR_DISCOUNT = BRL 39.69 gross).
- Updated in EN / ES / PT.
11 June 2026 — Underscore nomenclature + lean day-close payload
- Naming (breaking) —
store.day-closed→store.business_day_closedandorder.status-updated→order.status_updated(underscore nomenclature). Update yourevent.typeswitch. store.business_day_closedis now a thin payload — close identity (businessDayId,businessDayDate,timezone,status), timing (openedAt/closedAt),closedBy, and a minimalstore(uid,code,externalId,countryCode,timezone,currencyCode). Removed from the event:sales,metrics,summary,byChannel,byPaymentMethod,forceClosedOrders,closureStats,cancelledOrders,metadata— query them bybusinessDayIdwhen needed.snapshotIdrenamed tobusinessDayId(same value).- Documented in EN / ES / PT.
10 June 2026 — Canonical order events + kitchen event
Fiscal events drop the country from the name and become canonical order events — still the v1 contract, only theevent.type changes:
fiscal.authorized.br→order.invoicedandfiscal.cancelled.br→order.reversed. If your integration dispatches onevent.type, update your switch — the payload shape does not change.- They now fire for all countries: Brazil (SEFAZ via your fiscal provider) and CO/EC/CL/AR/VE via the generic fiscal callback. The country travels in
fiscal.countryCode. - New event
order.status_updated— the KDS advances the order in the kitchen (preparing→ready→dispatched), with akitchenblock and the full journey inhistory. - Fire is the source of truth — inbound webhooks (fiscal callback, KDS statuses) now validate that
eventIdreferences an event Fire emitted for that order; otherwise they respond400before the202. Always echo theevent.idof an envelope you received. - Documented in EN / ES / PT.
9 June 2026 — Event contract v1
The order/fiscal/day-close event contract is now officially v1. All additions are backward-compatible (new optional fields); the previous shape is preserved as v0 (deprecated, historical) — switch with the version selector at the top of each event page.- Discounts — order- and product-level discounts now travel as a structured
Discountobject (priority,typeFIXED/PERCENTAGE,value,net_price,discount_value,net_price_after_discount) inpayments.discounts,payments.totals[].discounts,orderLines[].price.unitPrice/totalPrice[].discountsandorderLines[].lineTotals[].discounts. - Granular taxes —
taxes[]now carries the BR tax-reform taxesIBS_UF,IBS_MUN,CBSalongsideICMS/PIS/COFINS, each with reformmetadata(cClassTrib,reducao,rateNominal,rateEffective) in addition tocst/cBenef. The breakdown is uniform across countries — LATAM carries its localIVAin the sametaxes[]shape; only SEFAZ emission (metadata.fiscal,fiscal.*.br) is BR-only. itemType— full enum documented:PRODUCT/COMBO/MODIFIER/PACKAGING, with the meaning of each.fulfillment.delivery.deliveryConfirmationCode— aggregator delivery/pickup confirmation code (e.g. iFood / Rappi).payments.shippingCost/extraCharges— documented as PriceBlock rows (same shape astotals[]).- store.business_day_closed —
salesnow includesproduct_discounts,gross_before_discounts,shipping,extra_charges,total_charged, andtaxes_by_type(per-tax breakdown with anOTHERreconciliation bucket). (Superseded 11 June — these aggregates are no longer embedded in the event; the day-close payload is now thin. See the entry at the top.) - order.cancelled / order.invoiced / order.reversed — carry the v1 order snapshot (they reference
order.completed/order.cancelled). - All of the above documented in EN / ES / PT with updated examples.
8 June 2026
- menu.updated:
productModifiers[n].overrides[]added — allows setting a different price for a specific modifier option when it belongs to a particular product. Each override targets oneproductIdand provides its ownpriceInfo.priceandpriceInfo.salePrice. EN/ES/PT updated.
5 June 2026
-
menus.sync: page removed — Fire sends a single
menu.updatedevent per menu; batch sync is no longer a separate event. -
menu.updated:
event.timezonefield removed from the payload.data.groupIdadded — a UUID that identifies the synchronization batch; multiple events emitted together share the same value, allowing downstream systems to correlate them. Category and productschedulesarrays now include full 7-day examples showing different time windows per category (e.g. Burgers 11:00–23:00, Breakfast 07:00–11:00).standardTimefield on products documented:trueinherits menu-level schedules,falsemeans the product has its ownschedulesarray. EN/ES/PT updated. -
Inject order:
typeis now required on everyorder.products[]item, everyselectedModifiers[]item, and everypayments.extraCharges[]item. Accepted values:COMBO(product with non-empty modifier groups),PRODUCT(simple sellable product or sellable modifier option),MODIFIER(pure modifier option),PACKAGING(packing-cost item). Payloads that omittypeare invalid. Request examples updated in EN/ES/PT. -
Inject order:
shippingMethod.delivery.additionalInfo.deliveryConfirmationCodedocumented as an optional string for delivery verification codes.
1 June 2026
- Inject order: new Amounts and price bands and Shipping and discounts sections; three reconciled request examples (simple delivery, line discount + shipping, multi-product + order discount); emphasis on
payments.shippingCost[],payments.discounts[], and productdiscountsValue(EN/ES/PT).
27 May 2026
- menus.sync: payload example completed (categories, products, modifier groups, schedules);
data.menus[]replaced withdata.menu(one menu per event); EN/ES/PT pages in webhook reference. - menu.updated: general structure aligned with
menus.sync— catalog fields (list,categories,products,modifierGroups,scheduledActivities) nested underdata.menu; field tables and delete example updated. - Menu publication guide (EN/ES/PT): examples and processing steps updated for
data.menu. - Inject order: optional
commentfield documented onorder.products[]; request example updated (replacesproductComment). - menu.updated / menus.sync: modifier option
productIdvalues must exist inproducts; example includesprod_size_smallandprod_size_large. - menu.updated: main payload example indentation fixed under
data.menu. - Menu webhooks (
menu.updated,menus.sync, product.updated):data.countrydocumented and exemplified as ISO 3166-1 alpha-2 (e.g.EC,BR,CO) instead of a numeric country ID.
26 May 2026
- Added User manuals as a top-level navigation tab.
- Added FIRE POS V2 manuals for Linking, Cashiers, and Authorization codes in English, Spanish, and Portuguese.
- Added subtle placeholder images for pending POS screenshots so the guides keep their final visual structure while captures are prepared.
- Inject order: removed
order.stockfrom the request body (not part of the contract). 200 response example updated to the real envelope (data,isArray,status,method,pathname,duration,traceId). - Login (playground):
authMethod: none, absolute staging URL in theapi:frontmatter, defaultContent-Typeand defaultgrant_typeto avoid Missing required fields when using Try it. - Inject order: product line
pricedocumented with full price band fields andtaxes[](name,rate,amount, optionalmetadata). - Inject order:
payments.shippingCost[]andpayments.discounts[]documented as the same price-band rows astotals[]; request example updated with sample shipping and discount lines. - Cancel order: API reference updated to the aggregator route
POST /api/v4/integrations/sales/aggregator/orders/{order_uid}/refund, with refund/cancellation request fields and standard response envelope; moved under Inject order in the API reference.
11 May 2026
- New Changelog tab (last in the nav) with this page.
- Removed the List sales channels page and its sidebar entry (all locales).
- API reference intro: copy adjusted; removed the sales channels card.
- Inject order: documented the
Authorizationheader (EN). ES & PT: path, headers, and body updated to the current aggregator contract (channel/service objects, device and operator fields, examples). - Login (ES & PT): aligned with
POST /api/authentication/loginand the client-credentials response (accessToken). - Spanish homepage (
/es/): content updated. - Configuration: new Aggregator integrations guide (Fire dashboard: webhook endpoints and test events).

