Get menu
curl --request GET \
--url https://api.fire.rest/v1/menus/{syncId} \
--header 'x-api-key: <x-api-key>'import requests
url = "https://api.fire.rest/v1/menus/{syncId}"
headers = {"x-api-key": "<x-api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<x-api-key>'}};
fetch('https://api.fire.rest/v1/menus/{syncId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fire.rest/v1/menus/{syncId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <x-api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.fire.rest/v1/menus/{syncId}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<x-api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.fire.rest/v1/menus/{syncId}")
.header("x-api-key", "<x-api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fire.rest/v1/menus/{syncId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<x-api-key>'
response = http.request(request)
puts response.read_body{
"source": {
"menuId": "<string>",
"priceListId": "<string>"
},
"list": {
"syncId": "<string>",
"listId": "<string>",
"listName": "<string>",
"vendorId": {},
"storeId": "<string>",
"storeName": "<string>",
"timezone": {},
"channelId": "<string>",
"channelReferenceName": "<string>",
"fulfillmentType": "<string>",
"schedules": [
{
"day": "<string>",
"startTime": "<string>",
"endTime": "<string>"
}
]
},
"categories": [
{
"productCategoryId": "<string>",
"name": "<string>",
"displayInList": true,
"featured": true,
"position": 123,
"images": [
{}
],
"assignedAt": {},
"productListing": [
{}
],
"schedules": {}
}
],
"products": [
{
"productId": {},
"name": "<string>",
"description": "<string>",
"active": true,
"type": "<string>",
"priceInfo": {},
"productModifiers": [
{}
],
"schedules": {},
"images": [
{}
],
"taxInfo": [
{}
],
"additionalInfo": {}
}
],
"modifierGroups": [
{
"modifierId": "<string>",
"modifier": "<string>",
"minOptions": 123,
"maxOptions": 123,
"type": "<string>",
"modifierOptions": [
{}
]
}
]
}Menu
Get menu
Returns the full menu for a syncId received in a menu.list_ready notification.
GET
/
v1
/
menus
/
{syncId}
Get menu
curl --request GET \
--url https://api.fire.rest/v1/menus/{syncId} \
--header 'x-api-key: <x-api-key>'import requests
url = "https://api.fire.rest/v1/menus/{syncId}"
headers = {"x-api-key": "<x-api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<x-api-key>'}};
fetch('https://api.fire.rest/v1/menus/{syncId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fire.rest/v1/menus/{syncId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <x-api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.fire.rest/v1/menus/{syncId}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<x-api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.fire.rest/v1/menus/{syncId}")
.header("x-api-key", "<x-api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fire.rest/v1/menus/{syncId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<x-api-key>'
response = http.request(request)
puts response.read_body{
"source": {
"menuId": "<string>",
"priceListId": "<string>"
},
"list": {
"syncId": "<string>",
"listId": "<string>",
"listName": "<string>",
"vendorId": {},
"storeId": "<string>",
"storeName": "<string>",
"timezone": {},
"channelId": "<string>",
"channelReferenceName": "<string>",
"fulfillmentType": "<string>",
"schedules": [
{
"day": "<string>",
"startTime": "<string>",
"endTime": "<string>"
}
]
},
"categories": [
{
"productCategoryId": "<string>",
"name": "<string>",
"displayInList": true,
"featured": true,
"position": 123,
"images": [
{}
],
"assignedAt": {},
"productListing": [
{}
],
"schedules": {}
}
],
"products": [
{
"productId": {},
"name": "<string>",
"description": "<string>",
"active": true,
"type": "<string>",
"priceInfo": {},
"productModifiers": [
{}
],
"schedules": {},
"images": [
{}
],
"taxInfo": [
{}
],
"additionalInfo": {}
}
],
"modifierGroups": [
{
"modifierId": "<string>",
"modifier": "<string>",
"minOptions": 123,
"maxOptions": 123,
"type": "<string>",
"modifierOptions": [
{}
]
}
]
}Proposal — not implemented in XMART_BACKOFFICE yet. See Hybrid
delivery for context. This page shows the intended
shape of the endpoint, not a live contract.
menu.list_ready event to get the
full menu. The response shape mirrors data.menu in
menu.updated exactly — same fields, same
semantics.
The notify webhook and this fetch endpoint authenticate differently. Fire pushes
menu.list_ready to your server, signed with HMAC — see Request
headers. Your system pulls this
endpoint, so it needs an API credential instead — see below.Authentication
This is a/v1/* endpoint — see Authentication:
only x-api-key is required, no login flow.
string
required
Your Fire API key.
string
Optional
Bearer <token>, accepted as a legacy alternative to x-api-key. Send one or the other.Path parameters
string
required
The sync assignment’s identifier, received as
data.syncId in the
menu.list_ready event. This is the id of
the row that ties a store, channel, and fulfillment type to a menu and a price
list — the same three values listId summarizes as a string, but this is the one
guaranteed to be unique.Response
object
Which menu and price list this response was resolved from. Compare against your
last
menu.list_ready to detect a
reassignment between the notify event and this fetch.Show source fields
Show source fields
object
Menu metadata and channel/store association.
Show list fields
Show list fields
string
The sync assignment’s own id — same value as the path parameter, echoed back.
string
Legacy composite identifier:
{storeNumber}-{channelCode}-{fulfillmentType}.
Kept for cross-reference with menu.updated;
not guaranteed unique on its own.string
Auto-generated label
{channelCode} - Store {storeNumber}.string | number
Brand code.
string
Internal store UUID (PK
stores.id).string
Store operational name.
string | null
Store IANA timezone (e.g.
America/Sao_Paulo).string
Internal sales channel UUID (PK
channels.id).string
Fulfillment reference name (e.g.
delivery, pickup).string
Fulfillment type code (e.g.
DELIVERY, DINE_IN, TAKEAWAY). Part of the
assignment’s real identity, alongside storeId and channelId.object[]
Menu categories.
Show category fields
Show category fields
string
Category identifier.
string
Display name.
boolean
Whether the category is visible.
boolean
Whether the category is featured.
number
Display order.
object[]
Category images —
{ imageCategoryId, fileUrl }.string | null
Date the category joined the menu, in ISO 8601 UTC. Same semantics as
menu.updated → Menu assignment date.object[]
Products in this category with their positions —
{ productId, position }.object[] | null
Category-specific schedule.
null if none is configured.object[]
Product catalog.
Show product fields
Show product fields
string | number
Product identifier (
externalId or UUID).string
Product name.
string
Product description.
boolean
Menu visibility (
visible); does not reflect stock or operational availability.string
Item type:
PRODUCTO, MODIFIER, COMPLEMENT, COMBO.object
Resolved product prices —
{ pointPrice, price, referencePrice, suggestedPrice }.object[]
Modifier group references —
{ modifierId, position, overrides? }.object[] | null
Product custom schedule.
null if using store hours or no custom schedule.object[]
Product images.
object[]
Tax information —
{ vatRatePercentage }.object
Optional extra metadata —
{ externalCode, ncm, assignedAt }.object[]
Modifier groups and options.
Show modifierGroups fields
Show modifierGroups fields
Notes
- This endpoint returns the same shape documented field-by-field in
menu.updated— refer to that page for full descriptions, edge cases, and the Menu assignment date rules. - A
syncIdthat doesn’t exist, or whose assignment has been removed, should return404.

