Describe your catalog in one JSON file and upload it from Edit Logic. This page lists every field the file can carry and what each one does.
Upload a file
- In Edit Logic, choose to upload a JSON file.
- Write the file by hand from the example below, or copy the instructions in the upload dialog into an AI agent and let it write the file for you.
- Upload the file. Its items and parameters load into the editor, where you can review and change them.
- Save your changes. Your catalog is updated and your demo is regenerated.
Example
A small restaurant menu that uses every field on this page. Each section below explains one part of it.
{"items": [{"name": "pizza","url": "https://www.example.com/menu/pizza","image_url": "https://www.example.com/images/pizza.jpg","metadata": { "sku": "PZ-001" },"parameters": [{ "name": "calories", "values": [850, 1200] },{ "name": "crust", "values": ["thin", "thick"] },{"name": "size","values": ["small", "medium"],"when": [{ "parameter_name": "crust", "parameter_value": "thin" }]},{"name": "size","values": ["medium", "large"],"when": [{ "parameter_name": "crust", "parameter_value": "thick" }]},{"name": "box_type","values": ["reinforced"],"when": [{ "parameter_name": "crust", "parameter_value": "thick" },{ "parameter_name": "size", "parameter_value": "medium" }]}]},{"name": "pasta","parameters": [{ "name": "sauce", "values": ["tomato", "cream"] }]}],"top_level_parameters": [{ "name": "order_type", "values": ["delivery", "pickup"] },{ "name": "store", "values": [] }],"custom_parameters": [{ "name": "calories", "type": { "numeric": { "unit": "kcal" } } },{ "name": "size", "option_order": "catalog", "multi_select": true },{ "name": "sauce", "excluded_values": ["cream"] }]}
Top level
The file is one JSON object with these keys.
| Field | Type | Description |
|---|---|---|
itemsRequired | Item[] | The things a shopper can pick, one entry per sellable item. Must contain at least one item. |
top_level_parameters | Parameter[] | Parameters that apply to every item, no matter which one is picked, such as delivery or pickup. List each one here once instead of repeating it in every item. |
custom_parameters | CustomParameter[] | Settings for individual parameters, matched by name: how their values read, whether they are suggested, and how their options are shown. See Parameter settings below. |
- Any key not listed on this page is rejected, so a typo such as "value" for "values" fails the upload instead of being ignored.
- A name used in top_level_parameters cannot also be used for a parameter inside an item.
Items
Each entry in items is one sellable item and the parameters that belong to it.
| Field | Type | Default | Description |
|---|---|---|---|
nameRequired | string | — | The item's name, as a shopper would say it. |
parameters | Parameter[] | [] | The parameters a shopper can choose for this item. Leave it empty when the item has none. |
url | string | — | The full address of the item's page, starting with https:// or http://. Returned with the item so your integration can link to it. |
image_url | string | — | The full address of the item's picture, starting with https:// or http://. Shown on the item's product card; an item without one shows a placeholder. |
metadata | any JSON | — | Anything else your export carries for the item. It is accepted so an existing export uploads as it is, and it does not affect suggestions. |
- No two items may share a name.
- url and image_url must be full addresses. A path on its own, such as /menu/pizza, is rejected.
Parameters
A parameter is one question a shopper answers, such as size or crust. Parameters go in an item's parameters list or in top_level_parameters, with the same fields in both.
| Field | Type | Default | Description |
|---|---|---|---|
nameRequired | string | — | The parameter's name. Lowercase snake_case, such as box_type, reads best. |
values | (string | number)[] | [] | The options a shopper picks from. Each is a string, or a bare number for a numeric value such as 850. |
when | Condition[] | [] | The conditions under which this parameter appears. Leave it out when the parameter always applies. See Conditions below. |
- The name "item" is reserved and cannot be used.
- An empty values list marks a field whose options come from your app at runtime, such as stores, contacts or locations.
- The same parameter may appear more than once in one item when each copy has different conditions, such as a size list that depends on the crust.
Conditions
A condition makes a parameter appear only after another parameter has been answered with a given value. A parameter with several conditions appears only when all of them hold.
| Field | Type | Description |
|---|---|---|
parameter_nameRequired | string | The parameter that must be answered first. |
parameter_valueRequired | string | The value it must be answered with, or "<ANY>" for any value. |
- List every ancestor condition, not just the nearest one. If box_type applies only when crust is thick and size is medium, its when lists both, even though size is its direct parent.
- A condition can only name a parameter from the same place: an item's parameters name parameters of that item, and top-level parameters name other top-level parameters.
- parameter_value is text, matched without regard to case. A numeric value is matched as written, so a value of 12.50 needs "12.50", not "12.5".
- parameter_value must be one of the values the named parameter lists, or "<ANY>". A parameter cannot name itself, and cannot name the same parameter twice.
- Write "<ANY>" exactly as shown: capital letters inside angle brackets.
- One parameter's conditions must form a single chain, at most 14 conditions long.
Parameter settings
custom_parameters changes how individual parameters behave, without changing the items. Each entry names a parameter and sets only the fields it includes.
| Field | Type | Default | Description |
|---|---|---|---|
nameRequired | string | — | The parameter the settings apply to. Matched without regard to case, spaces, hyphens or underscores, so "Box Type" and "box_type" are the same parameter. |
type | Type | string | How the parameter's values read. Leave it out for plain text. See Parameter types below. |
suggestable | boolean | true | Set to false to stop offering this parameter as a question. A shopper can still mention it, and it still narrows the results. |
multi_select | boolean | false | Set to true to let a shopper choose several values of this parameter at once, such as two colors. |
excluded_values | string[] | [] | Values never offered as options. Items that carry them stay in the catalog. |
option_display | "image" | "icon" | — | What sits beside each option: "image" shows a photo of an item with that option, and "icon" shows an icon. Left out, a default is chosen for the parameter. |
option_order | "item_count" | "catalog" | — | How options are ordered: "item_count" puts the option most items offer first, and "catalog" keeps the order your file lists them in, such as S, M, L. Left out, a default is chosen. |
- A field you leave out keeps its current setting, so a file without custom_parameters changes no settings.
- "excluded_values": [] clears the list. Once option_display or option_order is set, a file cannot return it to the default.
- An entry may name a parameter the file does not declare, such as one synced from Shopify. Settings belong to the product and outlast a new upload.
- To remove a parameter, leave it out of the items. custom_parameters has no field for deleting one.
- At most 500 entries, each naming a different parameter. excluded_values takes at most 500 values. A name or an excluded value is at most 256 bytes.
Parameter types
A type is an object with exactly one key, naming the kind of value. Numbers, dates and yes/no values each get options suited to them.
| Kind | Type | Description |
|---|---|---|
string | {} | Plain text. The default when no type is set. |
numeric | { unit?, direction?: "under" | "over" } | Numbers such as prices, durations or counts. Options are shown as ranges, such as "under 10" or "at least 50", instead of one option per value. unit, such as "min" or "%", is added when a bound is shown. |
date | { date_format } | Dates, each written in date_format. |
date_range | { date_format, separator } | Two dates in date_format joined by separator, such as "2026-01-05 to 2026-01-09". |
boolean | {} | Yes or no values (true/false, yes/no, on/off, y/n). Name the parameter after what holds, such as on_sale. |
{ "type": { "string": {} } }{ "type": { "numeric": { "unit": "min", "direction": "under" } } }{ "type": { "date": { "date_format": "YYYY-MM-DD" } } }{ "type": { "date_range": { "date_format": "YYYY-MM-DD", "separator": " to " } } }{ "type": { "boolean": {} } }
- direction sets which way numeric ranges are cut. "under", the default, suits values where lower is better, such as a price: "under 10", "under 50", "at least 50". "over" suits values where higher is better, such as a rating.
- date_format is one of: YYYY-MM-DD, YYYY-MM, YYYY, DD/MM/YYYY, MM/DD/YYYY, DD-MM-YYYY, MM-DD-YYYY.
- separator is matched exactly as written, spaces included.