Skip to main content
GET
Coming soon. The design is closed but this endpoint is not implemented yet. This page describes the agreed contract so integrators can plan against it ahead of release.
Returns the last generated menu for one terna of a store — the same combination you would otherwise get pushed as a menu.updated webhook. Use List menus to discover which ternas of a store currently have one.

Authentication

string
required
Your Fire API key with the menu:read scope. The key must be vendor-scoped (account + vendor binding) — keys without a vendorId are rejected with 403.

Path parameters

string
required
Store UUID (stores.id).

Query parameters

There is no default terna — Fire never guesses one on your behalf. Both parameters are required; missing either one returns 400.
string
required
Sales channel code (e.g. KIOSK). Compared case-insensitively.
string
required
Fulfillment type code (e.g. DINE_IN, TAKEAWAY). Compared case-insensitively.

Request

Response

object
Same shape as data.menu in the menu.updated webhook — list, categories, products, modifierGroups — with the same enrichment aggregators receive today (internal ids in list.storeId / list.channelId, categories[].assignedAt). See that page for the full field reference.
Same shape for X-MART-type channels too. KIOSK (authType: XMART_LOGIN — see channel.updated) is one of them: its stored payload additionally carries the store number and the external channel id, already folded into list above.
object

Notes

The last generated menu, even if it never synced

Fire stores the menu payload before sending it, and every attempt overwrites the previous one. This endpoint returns that last version regardless of whether the send reached the channel — the sync block tells you whether it did. Example: on Monday KIOSK/DINE_IN syncs fine. On Tuesday prices go up and the send fails. Wednesday’s GET returns Tuesday’s version with sync.status: FAILED and sync.syncedAt still pointing at Monday.

Out-of-stock is recalculated at read time

The stored payload’s active reflects the out-of-stock state at the moment the menu was generated. A product marked out-of-stock afterwards reaches the channel through its own webhook, not by rewriting the stored menu. This endpoint recalculates active against the out-of-stock state at the moment of the request, for products[].active and for combo option-products. Example, in both directions: the menu generates at 10:00 with an item out of stock. At 11:00 the mark-down expires and the webhook reactivates the item on the channel. A GET at 11:05 shows it active, matching the channel — not out of stock, which is what the stored payload alone would show.

syncedAt semantics

sync.syncedAt means “last successful delivery,” consistently across every channel type, including X-MART ones. A failed send never advances it.

Terna without a menu — 404 MENU_NOT_AVAILABLE

If the terna exists but has no menu or price list assigned, the response is 404 MENU_NOT_AVAILABLE — distinct from the 404 used when the store itself doesn’t exist or belongs to another tenant. The store is already validated against your key before this check runs, so this response never leaks another tenant’s data.

Empty send — also 404 MENU_NOT_AVAILABLE

When the flattening step produces zero sellable products, the send fails without ever reaching the channel — but the stored payload still has products: []. This endpoint treats that the same as a terna with no menu: 404 MENU_NOT_AVAILABLE, rather than a 200 with an empty menu. An empty menu here would be indistinguishable from “this store sells nothing,” which is not what happened — the menu never reached the channel. List menus still shows the terna, with syncStatus: FAILED, so the problem is visible.

List menus

Discover which ternas of a store have a generated menu.

menu.updated

The webhook this endpoint mirrors — full field reference for data.menu.

Get store

Read a single store by id.