Overview
This endpoint allows you to retrieve your branch-based product catalog. It offers a multitude of filtering options such astype, category_id, and tags, and supports five main product types: GOODS, DISH, TIMER, PREPARATION, and INGREDIENT.
The returned data includes product variants (modifications), modifiers (modificator_groups), recipes (recipe), and all other related data.
Product Types and Behaviors
While all product types are fundamentally “products,” each has its own specific models and behaviors:-
GOODS: These can have variants (
modifications).- With Variants: If a product has variants, only those variants can be sold. The main product acts as a parent and cannot be sold itself. Each modification behaves like a standard
GOODSproduct without variants. - Without Variants: Standard products that can be sold directly.
- With Variants: If a product has variants, only those variants can be sold. The main product acts as a parent and cannot be sold itself. Each modification behaves like a standard
-
DISH: This type can have
modificator_groups(modifiers).- Modifiers: Modifiers (
Modificator) are used exclusively forDISHtype products. They represent add-on options like “Spice Level” or “Extra Lavash.”
- Modifiers: Modifiers (
-
TIMER: Represents time-based services (e.g., PS5 rental). Pricing is determined by rules defined in the
settingfield. -
PREPARATION: Semi-finished items that have their own recipe and are used in the production of other
DISHitems. - INGREDIENT: Raw materials used in production.
HTTP Request
Query Parameters
All parameters are standard URL query parameters. Array and filter values use PHP/Laravel bracket notation — not a JSON blob. Arrays are indexed (with[0]=category&with[1]=station), and each filter is a tuple under filters[N]: field name at filters[N][0], value at filters[N][1] (or filters[N][1][M] when the value is itself an array).
Page number for pagination.
Products per page. Maximum: 100.
Related resources to include in each product. Repeat with indexed brackets. Common values:
category, station, modifications, modifications.codes, taxes, codes, modificator_groups, recipe, packages, tags.
Example: with[0]=category&with[1]=station&with[2]=modificationsComma-separated list of fields to include in the response.
id, name, and type are always returned.
Example: selects=id,name,type,price,imageZero or more filter tuples, where
N is a 0-based index. Each tuple is [field_name, value]. value may be a scalar (filters[N][1]=...) or an array (filters[N][1][0]=...&filters[N][1][1]=...). See the Filtering section for the full list of supported fields.Filtering
Each filter occupies its own index underfilters[]. Stack multiple filters by incrementing the outer index — for example filters[0] for type, filters[1] for inventory_behavior, and so on. The outer index order does not matter; only uniqueness does.
Product type. Possible values:
GOODS, DISH, TIMER, PREPARATION, INGREDIENT.
Example: filters[0][0]=type&filters[0][1][0]=GOODS&filters[0][1][1]=DISHProducts belonging to the specified category IDs.
Example:
filters[0][0]=category_id&filters[0][1][0]=1&filters[0][1][1]=3Products assigned to the specified station IDs.
Example:
filters[0][0]=station_id&filters[0][1][0]=1&filters[0][1][1]=2Products with the specified tag IDs.
Example:
filters[0][0]=tags&filters[0][1][0]=1&filters[0][1][1]=2"1" = giftable, "0" = not giftable.
Example: filters[0][0]=giftable&filters[0][1]=1"1" = discountable, "0" = not discountable.
Example: filters[0][0]=discountable&filters[0][1]=1Inventory tracking mode. Allowed values:
"0" (MINUS_INGREDIENTS — deduct recipe ingredients on sale, typical for DISH), "1" (MINUS_SELF — deduct the product itself from stock, countable GOODS/INGREDIENT), "3" (PASSIVE — no inventory tracking, uncountable).
Example: filters[0][0]=inventory_behavior&filters[0][1]=0"1" = has a recipe/ingredients.
Example: filters[0][0]=haveIngredients&filters[0][1]=1"1" = sold by portion.
Example: filters[0][0]=sold_by_portion&filters[0][1]=1"1" = has variants (modifications).
Example: filters[0][0]=has_variants&filters[0][1]=1"1" = has a modifier group (modificator_groups).
Example: filters[0][0]=has_modifiers&filters[0][1]=1"1" = has at least one barcode. The filter still works, but the top-level barcode string on the product is deprecated — request with[]=codes and read barcodes from the codes array instead.
Example: filters[0][0]=has_barcode&filters[0][1]=1"1" = service charge applies.
Example: filters[0][0]=has_service_charge&filters[0][1]=1Combining filters
Stack filters by incrementing the outer index. Scalar and array values can be mixed freely:curl users can pass --globoff to avoid shell interpretation.)
Request Examples
Response
Field Reference
Product Object
| Field | Type | Description |
|---|---|---|
id | integer | Unique product identifier. |
parent_id | integer (nullable) | ID of the parent product for a variant. A row with type: "MODIFICATION" is a variant of the GOODS product referenced here — “modification” and “variant” mean the same thing in this API, and a variant carries the full product schema (same fields as the parent, with its own price, cost_price, stock, barcodes, etc.). |
station_id | integer (nullable) | ID of the preparation station assigned to this product. |
category_id | integer (nullable) | ID of the category this product belongs to. |
unit_id | integer | ID of the unit of measurement. |
type | string | Product type: GOODS, DISH, TIMER, PREPARATION, INGREDIENT, MODIFICATION, MODIFIER. |
name | string | Product name. |
parent_name | string | Name of the parent product (empty string if none). |
full_name | string | Full product name including variant info (e.g., “Fanta 0.5 L”). |
position | integer (nullable) | Display order position within the category. |
barcode | string (nullable) | Deprecated. Legacy single-barcode field, kept for backwards compatibility and not guaranteed to be populated. For current barcodes, request with[]=codes and read from the codes array. |
gov_code | string (nullable) | Government/tax code for the product. |
status | integer | 1 = active, 0 = inactive. |
hidden | integer | 1 = hidden from menus, 0 = visible. |
sold_by_weight | boolean | Whether the product is sold by weight rather than quantity. |
discountable | boolean | Whether discounts can be applied to this product. |
giftable | boolean | Whether this product can be given as a gift/complimentary item. |
has_modifications | boolean | If true, the product has variants in the modifications array. |
description | string (nullable) | Product description text. |
price | number | Base selling price. For parent GOODS with variants, this may be 0 since variants carry their own prices. |
cost_price | number | Cost price used for margin calculations. |
cooking_time | integer | Estimated preparation time in minutes. |
inventory_behavior | integer | Inventory tracking mode. 0 = MINUS_INGREDIENTS — on sale, deduct the recipe’s ingredients from stock (typical for DISH). 1 = MINUS_SELF — deduct the product itself from stock (countable GOODS / INGREDIENT). 3 = PASSIVE — no inventory tracking (uncountable). |
low_stock | integer | Low stock threshold for alerts. |
unit_weight | number | Physical weight of a single unit, in kilograms. For example, if unit_id resolves to pcs, this is how much one piece weighs (a single packet that weighs 3 kg is stored as 3). Independent of sold_by_weight; used for logistics, shipping, and stock-by-weight calculations, not for pricing mode. |
venues | array | Venue-specific availability and pricing overrides. |
media | array | Image attachments. See Media object. |
created_at | string | Creation timestamp. |
updated_at | string | Last update timestamp. |
Variant Object (modifications)
Represents different versions (e.g., size, color) of a GOODS type product.
A variant has the same shape as a product — every field listed in the Product Object above (id, parent_id, category_id, unit_id, price, cost_price, unit_weight, inventory_behavior, media, venues, created_at, updated_at, …) is present on each variant. The only differences worth calling out:
typeis alwaysMODIFICATION.parent_idpoints at the parentGOODSproduct instead of beingnull.full_namecombines the parent name with the variant name (e.g."Fanta 0.5 L").- The variant carries its own
price,cost_price,barcode/codes,status, stock, etc. — the parent’s values are not inherited at sale time.
Modifier Group (modificator_groups)
Defines groups of options that can be added to a DISH type product (e.g., “Pizza Toppings”).
| Field | Type | Description |
|---|---|---|
id | integer | The group’s identifier. |
name | string | The name of the group (e.g., “Spice Level”). |
type | integer | Selection rule (1: Single-choice, 0: Multi-choice). |
min_select | integer | Minimum number of selections. |
max_select | integer | Maximum number of selections. |
modificators | array | List of selectable items. See Modifier Object. |
Modifier Object (modificators)
| Field | Type | Description |
|---|---|---|
id | integer | The modifier’s identifier. |
name | string | The name of the modifier (e.g., “Medium Hot”). |
price | number | The additional price for the option. |
ingredient | object (nullable) | If the modifier is linked to an ingredient, contains ingredient information. |
Timer Settings (setting)
Contains the time-based pricing rules for TIMER type products.
| Field | Type | Description |
|---|---|---|
interval | integer | The pricing interval in minutes. |
prices | array | Prices for different time periods. [{ "price": 3, "from": 120 }] |
Recipe Item (recipe)
| Field | Type | Description |
|---|---|---|
ingredient_id | integer | The product ID of the recipe component. |
name | string | The name of the component. |
gross | string | Gross amount. |
net | string | Net amount. |
Package Object (packages)
Specifies the purchasing packages defined for INGREDIENT type products.
| Field | Type | Description |
|---|---|---|
id | integer | The package’s identifier. |
name | string | The name of the package (e.g., “Bundle 10 pcs”). |
equal | integer | The number of base units contained in the package. |