Obter 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
Obter menu
Retorna o menu completo para um syncId recebido em uma notificação menu.list_ready.
GET
/
v1
/
menus
/
{syncId}
Obter 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": [
{}
]
}
]
}Proposta — ainda não implementada no XMART_BACKOFFICE. Veja Entrega
híbrida para contexto. Esta página mostra a forma
prevista do endpoint, não um contrato ao vivo.
menu.list_ready para
buscar o menu completo. A forma da resposta reflete exatamente data.menu em
menu.updated — mesmos campos, mesma
semântica.
O webhook de notificação e este endpoint de busca se autenticam de forma
diferente. O Fire empurra
menu.list_ready para o seu servidor, assinado com
HMAC — veja Headers da requisição.
Seu sistema consulta este endpoint, então precisa de uma credencial de API —
veja abaixo.Autenticação
É um endpoint/v1/* — veja Autenticação:
só é necessário x-api-key, sem fluxo de login.
string
obrigatório
Sua API key do Fire.
string
Bearer <token> opcional, aceito como alternativa legacy a x-api-key. Envie um ou outro.Parâmetros de rota
string
obrigatório
Identificador da atribuição de sync, recebido como
data.syncId no
evento menu.list_ready. É o id da linha
que amarra uma loja, um canal e um fulfillment type a um menu e uma lista de
preços — os mesmos três valores que listId resume como string, mas este é o
que garante unicidade.Resposta
object
De qual menu e lista de preços veio esta resposta. Compare com seu último
menu.list_ready para detectar uma
reatribuição entre o evento de notificação e esta busca.Mostrar campos de source
Mostrar campos de source
string
UUID do menu do qual esta resposta foi achatada.
string
UUID da lista de preços usada para resolver cada preço desta resposta. Um
menu não tem lista de preços própria — cada atribuição de sync (
syncId)
escolhe uma, então o mesmo menu pode ter preços diferentes dependendo de
qual atribuição o buscou.object
Metadados do menu e associação canal/loja.
Mostrar campos de list
Mostrar campos de list
string
O id próprio da atribuição de sync — mesmo valor do parâmetro de rota,
retornado de volta.
string
Identificador composto legado:
{storeNumber}-{channelCode}-{fulfillmentType}.
Mantido para cruzar com menu.updated;
não garante unicidade por si só.string
Rótulo autogerado
{channelCode} - Store {storeNumber}.string | number
Código da marca.
string
UUID interno da loja (PK
stores.id).string
Nome operacional da loja.
string | null
Fuso horário IANA da loja (ex.:
America/Sao_Paulo).string
UUID interno do canal de vendas (PK
channels.id).string
Nome de referência do fulfillment (ex.:
delivery, pickup).string
Código do tipo de fulfillment (ex.:
DELIVERY, DINE_IN, TAKEAWAY). Parte
da identidade real da atribuição, junto com storeId e channelId.object[]
object[]
Categorias do menu.
Mostrar campos de category
Mostrar campos de category
string
Identificador da categoria.
string
Nome de exibição.
boolean
Se a categoria está visível.
boolean
Se a categoria está em destaque.
number
Ordem de exibição.
object[]
Imagens da categoria —
{ imageCategoryId, fileUrl }.string | null
Data em que a categoria entrou no menu, em ISO 8601 UTC. Mesma semântica que
menu.updated → Data de atribuição ao menu.object[]
Produtos desta categoria com suas posições —
{ productId, position }.object[] | null
Horário próprio da categoria.
null se não houver horário configurado.object[]
Catálogo de produtos.
Mostrar campos de product
Mostrar campos de product
string | number
Identificador do produto (
externalId ou UUID).string
Nome do produto.
string
Descrição do produto.
boolean
Visibilidade no menu (
visible); não reflete estoque nem disponibilidade operacional.string
Tipo de item:
PRODUCTO, MODIFIER, COMPLEMENT, COMBO.object
Preços resolvidos do produto —
{ pointPrice, price, referencePrice, suggestedPrice }.object[]
Referências de grupos de modificadores —
{ modifierId, position, overrides? }.object[] | null
Horário customizado do produto.
null se usa horário da loja ou não tem horário customizado.object[]
Imagens do produto.
object[]
Informação fiscal —
{ vatRatePercentage }.object
Metadados extras opcionais —
{ externalCode, ncm, assignedAt }.object[]
Grupos de modificadores e opções.
Mostrar campos de modifierGroups
Mostrar campos de modifierGroups
string
Identificador do grupo de modificadores.
string
Nome de exibição do grupo.
number
Número mínimo de seleções obrigatórias.
number
Número máximo de seleções permitidas.
string
Tipo de seleção:
RADIO (single) ou CHECKBOX (multiple).object[]
Opções individuais —
{ optionId, productId, name, position }.Notas
- Este endpoint retorna a mesma forma documentada campo por campo em
menu.updated— consulte essa página para descrições completas, casos extremos, e as regras de Data de atribuição ao menu. - Um
syncIdque não existe, ou cuja atribuição foi removida, deveria retornar404.

