Get menus
curl --request GET \
--url https://firespark.cloud/api/storefront/v1/menus \
--header 'Authorization: Bearer <token>'import requests
url = "https://firespark.cloud/api/storefront/v1/menus"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://firespark.cloud/api/storefront/v1/menus', 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://firespark.cloud/api/storefront/v1/menus",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://firespark.cloud/api/storefront/v1/menus"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://firespark.cloud/api/storefront/v1/menus")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://firespark.cloud/api/storefront/v1/menus")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "lunch-delivery",
"uid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"brand_id": null,
"organization_id": "11111111-1111-1111-1111-111111111111",
"merchant_id": "22222222-2222-2222-2222-222222222222",
"store_id": "downtown",
"store_uid": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
"channel_id": "app",
"channel_uid": "c3d4e5f6-a7b8-9012-cdef-123456789012",
"fulfillment_id": "delivery",
"fulfillment_uid": "d4e5f6a7-b8c9-0123-def4-567890abcdef",
"name": { "en_us": "Lunch delivery menu" },
"description": { "en_us": "Weekday lunch items for app delivery" },
"schedules": [
{ "day_of_week": "monday", "periods": [{ "start_time": "11:00:00", "end_time": "15:00:00" }] },
{ "day_of_week": "tuesday", "periods": [{ "start_time": "11:00:00", "end_time": "15:00:00" }] },
{ "day_of_week": "wednesday", "periods": [{ "start_time": "11:00:00", "end_time": "15:00:00" }] },
{ "day_of_week": "thursday", "periods": [{ "start_time": "11:00:00", "end_time": "15:00:00" }] },
{ "day_of_week": "friday", "periods": [{ "start_time": "11:00:00", "end_time": "15:00:00" }] }
],
"products": [
{
"id": "burger-classic",
"name": { "en_us": "Classic burger" },
"description": { "en_us": "Angus beef patty with lettuce and tomato." },
"image_url": "https://cdn.example.com/burger-classic.jpg",
"cms_template_id": null,
"status": "ACTIVE",
"bundled_items": [],
"pricing": {
"minimum_quantity": 1,
"maximum_quantity": 10,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 12.99,
"anchor_price": 14.99,
"anchor_price_percentage": 0.13,
"modifiers": [],
"modifier_group_ids": ["choose-drink"]
},
"availability": {
"status": "AVAILABLE",
"schedules": null,
"out_of_stock_until": null
},
"metadata": {}
},
{
"id": "soda",
"name": { "en_us": "Soda" },
"description": null,
"image_url": null,
"cms_template_id": null,
"status": "ACTIVE",
"bundled_items": [],
"pricing": {
"minimum_quantity": 0,
"maximum_quantity": 1,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 0,
"anchor_price": 0,
"anchor_price_percentage": 0,
"modifiers": [],
"modifier_group_ids": []
},
"availability": {
"status": "AVAILABLE",
"schedules": null,
"out_of_stock_until": null
},
"metadata": {}
},
{
"id": "cola",
"name": { "en_us": "Cola" },
"description": null,
"image_url": null,
"cms_template_id": null,
"status": "ACTIVE",
"bundled_items": [],
"pricing": {
"minimum_quantity": 0,
"maximum_quantity": 1,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 0,
"anchor_price": 0,
"anchor_price_percentage": 0,
"modifiers": [],
"modifier_group_ids": []
},
"availability": {
"status": "AVAILABLE",
"schedules": null,
"out_of_stock_until": null
},
"metadata": {}
}
],
"categories": [
{
"id": "mains",
"name": { "en_us": "Mains" },
"description": { "en_us": "Burgers and sandwiches" },
"cms_template_id": null,
"status": "ACTIVE",
"items": [{ "type": "PRODUCT", "id": "e5f6a7b8-c9d0-1234-ef56-789012345678" }],
"availability": {
"status": "AVAILABLE",
"schedules": null,
"out_of_stock_until": null
},
"metadata": {}
}
],
"modifier_groups": [
{
"id": "choose-drink",
"title": { "en_us": "Choose a drink" },
"description": null,
"display_type": "LIST",
"modifier_ids": ["cola", "soda"],
"minimum_quantity": 0,
"maximum_quantity": 1,
"charge_above_quantity": null,
"metadata": {}
}
],
"metadata": {},
"cms_template_id": null,
"cms": null,
"status": "ACTIVE",
"release": "v2026-07-10-21h"
}
]
}
Menus
Get menus
Get the composed menus available to the customer for a store, channel, and fulfillment context.
GET
/
menus
Get menus
curl --request GET \
--url https://firespark.cloud/api/storefront/v1/menus \
--header 'Authorization: Bearer <token>'import requests
url = "https://firespark.cloud/api/storefront/v1/menus"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://firespark.cloud/api/storefront/v1/menus', 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://firespark.cloud/api/storefront/v1/menus",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://firespark.cloud/api/storefront/v1/menus"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://firespark.cloud/api/storefront/v1/menus")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://firespark.cloud/api/storefront/v1/menus")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "lunch-delivery",
"uid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"brand_id": null,
"organization_id": "11111111-1111-1111-1111-111111111111",
"merchant_id": "22222222-2222-2222-2222-222222222222",
"store_id": "downtown",
"store_uid": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
"channel_id": "app",
"channel_uid": "c3d4e5f6-a7b8-9012-cdef-123456789012",
"fulfillment_id": "delivery",
"fulfillment_uid": "d4e5f6a7-b8c9-0123-def4-567890abcdef",
"name": { "en_us": "Lunch delivery menu" },
"description": { "en_us": "Weekday lunch items for app delivery" },
"schedules": [
{ "day_of_week": "monday", "periods": [{ "start_time": "11:00:00", "end_time": "15:00:00" }] },
{ "day_of_week": "tuesday", "periods": [{ "start_time": "11:00:00", "end_time": "15:00:00" }] },
{ "day_of_week": "wednesday", "periods": [{ "start_time": "11:00:00", "end_time": "15:00:00" }] },
{ "day_of_week": "thursday", "periods": [{ "start_time": "11:00:00", "end_time": "15:00:00" }] },
{ "day_of_week": "friday", "periods": [{ "start_time": "11:00:00", "end_time": "15:00:00" }] }
],
"products": [
{
"id": "burger-classic",
"name": { "en_us": "Classic burger" },
"description": { "en_us": "Angus beef patty with lettuce and tomato." },
"image_url": "https://cdn.example.com/burger-classic.jpg",
"cms_template_id": null,
"status": "ACTIVE",
"bundled_items": [],
"pricing": {
"minimum_quantity": 1,
"maximum_quantity": 10,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 12.99,
"anchor_price": 14.99,
"anchor_price_percentage": 0.13,
"modifiers": [],
"modifier_group_ids": ["choose-drink"]
},
"availability": {
"status": "AVAILABLE",
"schedules": null,
"out_of_stock_until": null
},
"metadata": {}
},
{
"id": "soda",
"name": { "en_us": "Soda" },
"description": null,
"image_url": null,
"cms_template_id": null,
"status": "ACTIVE",
"bundled_items": [],
"pricing": {
"minimum_quantity": 0,
"maximum_quantity": 1,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 0,
"anchor_price": 0,
"anchor_price_percentage": 0,
"modifiers": [],
"modifier_group_ids": []
},
"availability": {
"status": "AVAILABLE",
"schedules": null,
"out_of_stock_until": null
},
"metadata": {}
},
{
"id": "cola",
"name": { "en_us": "Cola" },
"description": null,
"image_url": null,
"cms_template_id": null,
"status": "ACTIVE",
"bundled_items": [],
"pricing": {
"minimum_quantity": 0,
"maximum_quantity": 1,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 0,
"anchor_price": 0,
"anchor_price_percentage": 0,
"modifiers": [],
"modifier_group_ids": []
},
"availability": {
"status": "AVAILABLE",
"schedules": null,
"out_of_stock_until": null
},
"metadata": {}
}
],
"categories": [
{
"id": "mains",
"name": { "en_us": "Mains" },
"description": { "en_us": "Burgers and sandwiches" },
"cms_template_id": null,
"status": "ACTIVE",
"items": [{ "type": "PRODUCT", "id": "e5f6a7b8-c9d0-1234-ef56-789012345678" }],
"availability": {
"status": "AVAILABLE",
"schedules": null,
"out_of_stock_until": null
},
"metadata": {}
}
],
"modifier_groups": [
{
"id": "choose-drink",
"title": { "en_us": "Choose a drink" },
"description": null,
"display_type": "LIST",
"modifier_ids": ["cola", "soda"],
"minimum_quantity": 0,
"maximum_quantity": 1,
"charge_above_quantity": null,
"metadata": {}
}
],
"metadata": {},
"cms_template_id": null,
"cms": null,
"status": "ACTIVE",
"release": "v2026-07-10-21h"
}
]
}
Returns every menu available for the customer’s current selling context. Pass
fulfillment_id, store_id, channel_id, and brand_id to load catalogs for that combination. When any parameter is omitted, or when no menu exists for the combination, Fire spark falls back to the merchant-wide default menu (fulfillment_id, store_id, channel_id, and brand_id all __ANY__).
When multiple menus share the same context and their schedules match the current time, Fire spark returns all of them in data. Menus with schedules: null are always available.
When no menu is currently in schedule, Fire spark returns every menu in data whose next availability window is closest to the current time. If several menus share that same next start time, all of them are returned.
Requires a Fire spark access token obtained through token
exchange. The token scopes requests to the
authenticated customer and merchant.
Query parameters
| Parameter | Required | Description |
|---|---|---|
fulfillment_id | No | External fulfillment identifier (for example delivery, pickup). Alphanumeric characters, _, and - only. 1–64 characters. Omit to receive the default menu. |
store_id | No | External store identifier. Alphanumeric characters, _, and - only. 1–64 characters. Omit to receive the default menu. |
channel_id | No | External channel identifier. Alphanumeric characters, _, and - only. 1–64 characters. Omit to receive the default menu. |
brand_id | No | External brand identifier. Alphanumeric characters, _, and - only. 1–64 characters. Omit to receive the default menu. |
Request
curl "https://firespark.cloud/api/storefront/v1/menus?fulfillment_id=delivery&store_id=downtown&channel_id=app&brand_id=0001" \
-H "Authorization: Bearer ACCESS_TOKEN"
Response
The response wraps an array of menu objects indata. Only ACTIVE menus are returned. When at least one menu is in schedule now, every matching menu is included. Otherwise, Fire spark includes the menu or menus whose next scheduled window starts soonest.
{
"data": [
{
"id": "lunch-delivery",
"uid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"brand_id": null,
"organization_id": "11111111-1111-1111-1111-111111111111",
"merchant_id": "22222222-2222-2222-2222-222222222222",
"store_id": "downtown",
"store_uid": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
"channel_id": "app",
"channel_uid": "c3d4e5f6-a7b8-9012-cdef-123456789012",
"fulfillment_id": "delivery",
"fulfillment_uid": "d4e5f6a7-b8c9-0123-def4-567890abcdef",
"name": { "en_us": "Lunch delivery menu" },
"description": { "en_us": "Weekday lunch items for app delivery" },
"schedules": [
{ "day_of_week": "monday", "periods": [{ "start_time": "11:00:00", "end_time": "15:00:00" }] },
{ "day_of_week": "tuesday", "periods": [{ "start_time": "11:00:00", "end_time": "15:00:00" }] },
{ "day_of_week": "wednesday", "periods": [{ "start_time": "11:00:00", "end_time": "15:00:00" }] },
{ "day_of_week": "thursday", "periods": [{ "start_time": "11:00:00", "end_time": "15:00:00" }] },
{ "day_of_week": "friday", "periods": [{ "start_time": "11:00:00", "end_time": "15:00:00" }] }
],
"products": [
{
"id": "burger-classic",
"name": { "en_us": "Classic burger" },
"description": { "en_us": "Angus beef patty with lettuce and tomato." },
"image_url": "https://cdn.example.com/burger-classic.jpg",
"cms_template_id": null,
"status": "ACTIVE",
"bundled_items": [],
"pricing": {
"minimum_quantity": 1,
"maximum_quantity": 10,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 12.99,
"anchor_price": 14.99,
"anchor_price_percentage": 0.13,
"modifiers": [],
"modifier_group_ids": ["choose-drink"]
},
"availability": {
"status": "AVAILABLE",
"schedules": null,
"out_of_stock_until": null
},
"metadata": {}
},
{
"id": "soda",
"name": { "en_us": "Soda" },
"description": null,
"image_url": null,
"cms_template_id": null,
"status": "ACTIVE",
"bundled_items": [],
"pricing": {
"minimum_quantity": 0,
"maximum_quantity": 1,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 0,
"anchor_price": 0,
"anchor_price_percentage": 0,
"modifiers": [],
"modifier_group_ids": []
},
"availability": {
"status": "AVAILABLE",
"schedules": null,
"out_of_stock_until": null
},
"metadata": {}
},
{
"id": "cola",
"name": { "en_us": "Cola" },
"description": null,
"image_url": null,
"cms_template_id": null,
"status": "ACTIVE",
"bundled_items": [],
"pricing": {
"minimum_quantity": 0,
"maximum_quantity": 1,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 0,
"anchor_price": 0,
"anchor_price_percentage": 0,
"modifiers": [],
"modifier_group_ids": []
},
"availability": {
"status": "AVAILABLE",
"schedules": null,
"out_of_stock_until": null
},
"metadata": {}
}
],
"categories": [
{
"id": "mains",
"name": { "en_us": "Mains" },
"description": { "en_us": "Burgers and sandwiches" },
"cms_template_id": null,
"status": "ACTIVE",
"items": [{ "type": "PRODUCT", "id": "e5f6a7b8-c9d0-1234-ef56-789012345678" }],
"availability": {
"status": "AVAILABLE",
"schedules": null,
"out_of_stock_until": null
},
"metadata": {}
}
],
"modifier_groups": [
{
"id": "choose-drink",
"title": { "en_us": "Choose a drink" },
"description": null,
"display_type": "LIST",
"modifier_ids": ["cola", "soda"],
"minimum_quantity": 0,
"maximum_quantity": 1,
"charge_above_quantity": null,
"metadata": {}
}
],
"metadata": {},
"cms_template_id": null,
"cms": null,
"status": "ACTIVE",
"release": "v2026-07-10-21h"
}
]
}
Menu object
| Field | Type | Description |
|---|---|---|
id | string | External menu identifier. Alphanumeric characters, _, and - only. 1–64 characters. |
uid | string (UUID) | Fire spark internal identifier. |
brand_id | string | null | External brand identifier. null when the resource is not brand-scoped. |
organization_id | string (UUID) | Fire spark organization identifier. |
merchant_id | string (UUID) | Fire spark merchant identifier. |
store_id | string | External store identifier. |
store_uid | string (UUID) | Fire spark store identifier. |
channel_id | string | External channel identifier. |
channel_uid | string (UUID) | Fire spark channel identifier. |
fulfillment_id | string | External fulfillment identifier. |
fulfillment_uid | string (UUID) | Fire spark fulfillment identifier. |
name | object | Localized display name keyed by locale (for example en_us). Each value is 1–1024 characters. |
description | object | null | Localized description keyed by locale. null when omitted. Each value is 1–1024 characters. |
schedules | array | null | Weekly schedule entries. null when there is no schedule restriction. |
products | array | Products in this menu. Use Get product for full detail. |
categories | array | Categories in this menu. Use Get category for full detail. |
modifier_groups | array | Modifier groups referenced by products in this menu. |
metadata | object | Partner-specific metadata. Defaults to {}. |
cms_template_id | string (UUID) | CMS template linked to this menu. null when no template is assigned. |
cms | object | Read-only. Resolved CMS template when cms_template_id is set. |
status | string | ACTIVE or INACTIVE. Only ACTIVE menus are returned. |
release | string | Release id that published this menu. |
schedules
schedules
An array of schedule entries, or
Each period:
null when there is no schedule restriction. Each entry represents one day of the week:| Field | Required | Type | Description |
|---|---|---|---|
day_of_week | Yes | string | monday through sunday. |
periods | Yes | array | One or more time windows when the menu is active on that day. |
| Field | Required | Type | Description |
|---|---|---|---|
closed | No | boolean | true when this period is closed. Defaults to false. |
start_time | Conditional | string | ISO time (for example 11:00:00). Required unless closed is true. |
end_time | Conditional | string | ISO time (for example 15:00:00). Required unless closed is true. |
start_date | No | string | null | ISO 8601 datetime, or null for the always-on fallback. Set together with end_date. |
end_date | No | string | null | ISO 8601 datetime, or null for the always-on fallback. Set together with start_date. |
products
products
Each product in a composed menu includes catalog fields plus context-specific pricing and availability:
Each
Each
| Field | Required | Type | Description |
|---|---|---|---|
id | Yes | string | External product identifier. |
name | Yes | object | Localized display name keyed by locale (for example en_us). |
description | No | object | null | Localized description. null when omitted. |
image_url | No | string | Product image URL. null when omitted. |
cms_template_id | No | string (UUID) | CMS template linked to this product. null when not assigned. |
status | Yes | string | ACTIVE or INACTIVE. |
bundled_items | No | array | Items included in a bundle or combo. Defaults to []. |
pricing | Yes | object | Price, tax, quantity limits, and modifier configuration. See pricing. |
availability | Yes | object | Product availability. See fields below. |
metadata | No | object | Partner-specific metadata. Defaults to {}. |
availability object:| Field | Required | Type | Description |
|---|---|---|---|
status | Yes | string | AVAILABLE, UNAVAILABLE, or OUT_OF_STOCK. |
schedules | No | array | null | Schedule entries with day_of_week and periods. null when there is no schedule restriction. |
out_of_stock_until | No | string | Optional ISO 8601 datetime when the product returns to stock. |
bundled_items entry:| Field | Required | Type | Description |
|---|---|---|---|
id | Yes | string | External identifier of the bundled product. |
refund_price | Yes | number | Refund amount when the customer removes this item from the bundle. ≥ 0. |
included_quantity | Yes | number | Units included by default. ≥ 0. |
Example product
{
"id": "burger-classic",
"name": { "en_us": "Classic burger" },
"description": { "en_us": "Angus beef patty with lettuce and tomato." },
"image_url": "https://cdn.example.com/burger-classic.jpg",
"cms_template_id": null,
"status": "ACTIVE",
"bundled_items": [],
"pricing": {
"minimum_quantity": 1,
"maximum_quantity": 10,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 12.99,
"anchor_price": 14.99,
"anchor_price_percentage": 0.13,
"modifiers": [],
"modifier_group_ids": ["choose-drink"]
},
"availability": {
"status": "AVAILABLE",
"schedules": null,
"out_of_stock_until": null
},
"metadata": {}
}
categories
categories
Each category in a composed menu:
Each entry in
Each
| Field | Required | Type | Description |
|---|---|---|---|
id | Yes | string | External category identifier. |
name | Yes | object | Localized display name keyed by locale. |
description | No | object | null | Localized description. null when omitted. |
cms_template_id | No | string (UUID) | CMS template linked to this category. null when not assigned. |
status | Yes | string | ACTIVE or INACTIVE. |
items | No | array | Ordered category entries. Defaults to []. |
availability | Yes | object | Category availability. See fields below. |
metadata | No | object | Partner-specific metadata. Defaults to {}. |
items:| Field | Required | Type | Description |
|---|---|---|---|
type | Yes | string | CATEGORY or PRODUCT. |
id | Yes | string | External category or product identifier. |
availability object:| Field | Required | Type | Description |
|---|---|---|---|
status | Yes | string | AVAILABLE, UNAVAILABLE, or OUT_OF_STOCK. |
schedules | No | array | null | Schedule entries with day_of_week and periods. null when there is no schedule restriction. |
out_of_stock_until | No | string | Optional ISO 8601 datetime when the product returns to stock. |
Example category
{
"id": "mains",
"name": { "en_us": "Mains" },
"description": { "en_us": "Burgers and sandwiches" },
"cms_template_id": null,
"status": "ACTIVE",
"items": [{ "type": "PRODUCT", "id": "e5f6a7b8-c9d0-1234-ef56-789012345678" }],
"availability": {
"status": "AVAILABLE",
"schedules": null,
"out_of_stock_until": null
},
"metadata": {}
}
modifier_groups
modifier_groups
Each modifier group in a composed menu:
| Field | Required | Type | Description |
|---|---|---|---|
id | Yes | string | External modifier group identifier. Referenced from pricing.modifier_group_ids. |
title | Yes | object | Localized group title keyed by locale. |
description | No | object | null | Localized description. null when omitted. |
display_type | No | string | GRID or LIST. |
modifier_ids | Yes | array | Product UUIDs for modifiers in this group. At least 2 entries. |
minimum_quantity | Yes | number | Minimum selections required. ≥ 0. |
maximum_quantity | Yes | number | Maximum selections allowed. 0–1,000,000. |
charge_above_quantity | No | number | Number of free selections before additional charges apply. Optional. |
metadata | No | object | Partner-specific metadata. Defaults to {}. |
Example modifier group
{
"id": "choose-drink",
"title": { "en_us": "Choose a drink" },
"description": null,
"display_type": "LIST",
"modifier_ids": ["cola", "soda"],
"minimum_quantity": 0,
"maximum_quantity": 1,
"charge_above_quantity": null,
"metadata": {}
}
pricing
pricing
Product pricing in a composed menu:
Each
| Field | Required | Type | Description |
|---|---|---|---|
minimum_quantity | Yes | number | Minimum units per order. ≥ 0. |
maximum_quantity | Yes | number | Maximum units per order. 0–1,000,000. |
is_tax_inclusive | Yes | boolean | Whether price includes tax. |
tax_rate | Yes | number | Tax rate as a decimal (for example 0.15 for 15%). 0–1. |
price | Yes | number | List price. ≥ 0. |
anchor_price | Yes | number | Reference price for strikethrough or comparison. ≥ 0. |
anchor_price_percentage | Yes | number | Discount shown relative to anchor_price. 0–1. |
modifiers | No | array | Per-modifier pricing overrides. Defaults to []. |
modifier_group_ids | No | array | External modifier group identifiers attached to this product. Defaults to []. |
modifiers entry adds:| Field | Required | Type | Description |
|---|---|---|---|
modifier_group_id | Yes | string | External modifier group identifier. |
default_quantity | Yes | number | Pre-selected quantity. ≥ 0. |
charge_above_quantity | No | number | Free selections before charges apply. Optional. |
display_type | No | string | RADIO, CHECKBOX, or QUANTITY. |
Error responses
| Status | Description |
|---|---|
400 | Missing or invalid query parameters. |
401 | Missing or invalid access token. |
403 | Token does not have access to this merchant’s menus. |
404 | No active menu found for the requested context, and no menu has a future schedule window. |
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Query Parameters
External fulfillment identifier. Omit to receive the default menu.
Required string length:
1 - 64Pattern:
^[a-zA-Z0-9_-]+$External store identifier. Omit to receive the default menu.
Required string length:
1 - 64Pattern:
^[a-zA-Z0-9_-]+$External channel identifier. Omit to receive the default menu.
Required string length:
1 - 64Pattern:
^[a-zA-Z0-9_-]+$External brand identifier. Omit to receive the default menu.
Required string length:
1 - 64Pattern:
^[a-zA-Z0-9_-]+$Response
200 - application/json
Ok
Show child attributes
Show child attributes
⌘I