Changelog
Version history for the Flavours API — new endpoints, request/response changes, deprecations, and breaking changes.
This page tracks every change to the Flavours API that affects how you integrate with it: new endpoints, added or renamed request fields, changed responses, new query parameters, deprecations, and breaking changes. Entries are listed newest first.
How versions work
We follow Semantic Versioning: MAJOR.MINOR.PATCH.
- PATCH (e.g.
2.1.0→2.1.1) — bug fixes, no contract changes. Safe to upgrade. - MINOR (e.g.
2.1.0→2.2.0) — new, backward-compatible features. Safe to upgrade. - MAJOR (e.g.
2.x→3.0.0) — may include breaking changes. Review before upgrading.
Breaking changes are also called out inline with a ⚠ Breaking marker.
How to select a version
The API serves the contract that matches the X-API-Version request header
(default 2.0.0). Every change below applies only to clients that send that
version or higher — a client pinned to an older version keeps the old
behavior, so you can upgrade field-by-field on your own schedule.
2.5.0 — 2026-08-02
Minor release · backward compatible
Removed
- Legacy product-import endpoints now return
410 Goneinstead of426 Upgrade Requiredfor clients onX-API-Version: 2.5.0or higher.GET/POST /api/v2/import/products,GET /api/v2/import/products/template,POST /api/v2/import/products/full, andGET /api/v2/import/products/full/templatehave been superseded by the bulk-job import pipeline. Clients pinned below2.5.0keep receiving426. Either way, the error body always includesimport_url,template_url,upload_url,status_url, andremoved_inpointing at the replacement endpoints (/v2/bulk/products/import,/v2/bulk/products/import/template,/v2/bulk/products/import/upload-url,/v2/bulk-jobs).
2.4.0 — 2026-07-26
Minor release · backward compatible
Added
-
Payment-method config object —
target,method,scope, andsortare now returned onGET /api/v2/payment-methods/settings(and its{configId}detail) andPOST/DELETE /api/v2/payment-methods/{methodKey}/config. These fields were hidden for every client below2.4.0. WhentargetisPRODUCT,methodandscopeare still omitted (not applicable to that target).{ "id": "…", "payment_method_key": "APPLE_PAY", + "target": "MARKET", + "method": "FIXED", + "scope": "ALL", + "sort": 1 }
2.3.0 — 2026-06-29
Minor release · contains breaking changes
⚠ Breaking change
Several response fields were renamed and logo_img on payment-method creation now
expects a hosted URL instead of an uploaded file. These changes apply only to
clients sending X-API-Version: 2.3.0 or higher — clients pinned to an earlier
version keep the old field names and upload behavior, so existing integrations are
unaffected until they opt in.
Changed
-
Category reference renamed
product_category_id→category_idon every response carrying a category reference: the product object, order line items, product/category sort entries, kitchen categories, and sector categories.{ "id": "…", - "product_category_id": 12, + "category_id": 12 } -
Product object —
preparation_time→duration.{ "id": "…", "name": "Flat White", - "preparation_time": 5 + "duration": 5 } -
Modifier reference renamed
product_modifier_id→modifier_idon the product price and product ingredient objects.{ "id": "…", - "product_modifier_id": 34, + "modifier_id": 34 } -
Kitchen reference renamed
kitchen_group_id→kitchen_idon the kitchen category and printer-kitchen objects.{ "id": "…", - "kitchen_group_id": 7, + "kitchen_id": 7 } -
⚠ Breaking
POST /api/v2/payment-methods—logo_imgnow expects a URL string instead of a file upload. Upload the logo to your storage first, then send its URL. Clients below2.3.0keep uploading the image file as multipart form data.- // multipart/form-data - logo_img: <binary image file> // required|image|max:1024 + // application/json + "logo_img": "https://cdn.example.com/logos/apple-pay.png" // required|string|url -
market_idandbranch_idare no longer returned on the product ingredient and product price objects (GET /api/v2/products/{productId}/ingredients,GET /api/v2/products/{productId}/prices, and anywhere either is embedded). Clients below2.3.0keep receiving both fields.
2.2.3 — 2026-07-22
Minor release · contains breaking change
⚠ Breaking change
The product price object's pricing fields were generalized from a payment-method-only
shape to a polymorphic one that also carries order-type pricing. This applies only to
clients sending X-API-Version: 2.2.3 or higher — clients pinned below 2.2.3 keep
the old flat fields, now computed from the linked modifier.
Changed
-
Product price object —
payment_method_key,price,tax,total, andis_tax_includedreplaced bypriceable_type,priceable_id,value, andvalue_typeonGET /api/v2/products/{productId}/prices(and its{priceId}detail).priceable_typeisPAYMENT_METHODorORDER_TYPE;value_typeisNOMINALorPERCENT.{ "id": "…", - "payment_method_key": "APPLE_PAY", - "price": "10.00", - "tax": "1.50", - "total": "11.50", - "is_tax_included": false + "priceable_type": "PAYMENT_METHOD", + "priceable_id": "APPLE_PAY", + "value": "10.00", + "value_type": "NOMINAL" }
2.2.1 — 2026-07-05
Minor release · contains breaking change
⚠ Breaking change
The printer object's ten flat boolean settings flags were consolidated into a single
settings object. This applies only to clients sending X-API-Version: 2.2.1 or
higher — clients pinned below 2.2.1 keep the flat flags.
Changed
-
Printer object —
is_multi_lang,is_show_product,is_open_drawer,is_postpaid_print,is_img_print,is_auto_print,is_app_to_app,add_space,is_raster, andis_pdfreplaced by a singlesettingsobject keyed by setting name, onGET /api/v2/printers(and its{printerId}detail).{ "id": "…", - "is_multi_lang": false, - "is_show_product": true, - "is_open_drawer": false, - "is_postpaid_print": false, - "is_img_print": false, - "is_auto_print": true, - "is_app_to_app": false, - "add_space": false, - "is_raster": true, - "is_pdf": false + "settings": { + "MULTILINGUAL": false, + "PRODUCT_SHOW": true, + "DRAWER_OPEN": false, + "PRINT_POSTPAID": false, + "PRINT_IMAGE": false, + "PRINT_AUTO": true, + "APP_TO_APP": false, + "HAS_SPACE": false, + "RASTER": true, + "PDF": false + } }
2.2.0 — 2026-06-15
Minor release · contains breaking changes
⚠ Breaking change
The dashboard and report endpoints changed their response shape: flat,
prefixed keys were replaced by nested objects. Clients that read these responses
must update their parsing when adopting 2.2.0. Clients pinned below 2.2.0
continue to receive the flat structure.
Changed
-
Dashboard endpoints (
GET /api/v2/dashboards,GET /api/v2/dashboard/{admin,merchant,subscriber}) — flat keys consolidated into nested objects.interval_*keys become a nestedintervalobject, and the payload sections were renamed tochart,stats,orders,products,ingredients.{ - "interval_past_start_at": 1717200000000, - "interval_past_end_at": 1717286400000, - "interval_live_start_at": 1718064000000, - "interval_live_end_at": 1718150400000, - "chart_revenues": [ … ], - "overview_totals": { … }, - "totals_by_status": { … }, - "totals_by_type": { … }, - "recent_orders": [ … ], - "featured_products": [ … ], - "out_of_stock_items": [ … ] + "interval": { + "past": { "min": 1717200000000, "max": 1717286400000 }, + "live": { "min": 1718064000000, "max": 1718150400000 } + }, + "chart": [ … ], + "stats": { … }, + "orders": [ … ], + "products": [ … ], + "ingredients": [ … ] } -
Order statistics (the
statsblock of the dashboard) — flatprev_*/curr_*/percent_*keys replaced by nestedpast,live, andpercentobjects, each keyed bycount,total,tax,cost,cost_unit,profit. The per-type and per-status breakdowns moved undertypesandstatuses, and their inner keys dropped the_totalsuffix (e.g.overall_total→overall,success_total→success).{ - "prev_total_orders": 120, - "prev_total_sales": "4500.00", - "curr_total_orders": 150, - "curr_total_sales": "5200.00", - "percent_total_orders": 25.0 + "past": { "count": 120, "total": "4500.00", "tax": "…", "cost": "…", "cost_unit": "…", "profit": "…" }, + "live": { "count": 150, "total": "5200.00", "tax": "…", "cost": "…", "cost_unit": "…", "profit": "…" }, + "percent": { "count": 25.0, "total": 15.6, "tax": "…", "cost": "…", "cost_unit": "…", "profit": "…" } } -
GET /api/v2/reports/overview— response restructured. Thecreated_at_min/created_at_maxkeys move into a nestedintervalobject (min/max), monetary values are now returned as raw numeric strings instead ofmoney()-formatted strings, thediscountandsubtotalkeys were removed, a newcost_unitkey was added (item cost before tax), andcostnow means item cost including tax.{ - "created_at_min": 1717200000000, - "created_at_max": 1718150400000, "count": 150, - "discount": "120.00", - "subtotal": "5000.00", - "payment": "30.00", - "profit": "3800.00", - "total": "5200.00", - "cost": "1200.00", - "tax": "200.00" + "interval": { "min": 1717200000000, "max": 1718150400000 }, + "payment": "30.00", + "profit": "3800.00", + "total": "5200.00", + "cost_unit": "1200.00", + "cost": "1400.00", + "tax": "200.00" } -
Attendance report — the flat
total_*summary keys were replaced by the full report object, which now exposespayment_statsandproduct_statsas arrays. Legacy keys such astotal_order,total_revenue,total_payment_fees,total_tax,total_discount,total_cost_item,total_cost,total_profit,total_dining_order,total_dining_revenue,total_take_away_order,total_take_away_revenue,order_start_at, andorder_close_atare no longer returned for2.2.0+ clients.
Fixed
-
Product ingredient —
ingredient_idnow returns the real ingredient id. Before2.2.0this field was always1; it now reflects the actual related ingredient and is typed as a string.{ "id": "…", - "ingredient_id": 1 + "ingredient_id": "9f1c…-uuid" }
2.1.0 — 2026-04-30
Minor release · contains breaking changes
⚠ Breaking change
Time and billing fields on several objects were renamed, and the Renewal
endpoints now require X-API-Version: 2.1.0 or higher. Clients pinned below
2.1.0 keep the old field names; the Renewal endpoints reject them with
426 Upgrade Required.
Added
-
Ingredient object —
costis now returned. It was hidden for clients below2.1.0.{ "id": "…", "name": "Espresso Beans", + "cost": "0.85" }
Changed
-
Attendance object — closing-time fields renamed:
{ - "end_at": 1717286400000, - "end_cash": "150.00", - "end_schedule_at": 1717286400000 + "close_at": 1717286400000, + "close_cash": "150.00", + "close_schedule_at": 1717286400000 } -
Market setting object —
balancerenamed tocredit(now a raw decimal rather than amoney()-formatted string), the subscription keys were renamed, andcountry_codeis no longer returned (use the related country instead):{ - "balance": "1,200.00", - "subscription_key": "PRO", - "plan_option_key": "MONTHLY", - "subscription_option_key": "MONTHLY", - "country_code": "SA" + "credit": "1200.0000", + "plan_key": "PRO", + "cycle_key": "MONTHLY" } -
Renewal branch object —
end_atrenamed toclose_at, and the same subscription-key renames as the market setting object (subscription_key→plan_key,plan_option_key/subscription_option_key→cycle_key). -
Plan reconciliation queries (branch, branch-setting, and market plan data) — the aggregated
end_atcolumn was renamed toclose_atin the response rows. -
Order tax object —
taxable_idchanged type from integer to string.{ - "taxable_id": 42 + "taxable_id": "42" }
Removed
- ⚠ Breaking Renewal endpoints no longer
support clients below
2.1.0.POST/PUTcreate, update, custom, preview, and calculate routes under the Renewal API now return426 Upgrade RequiredforX-API-Version < 2.1.0.
2.0.0 — Initial release
Baseline of the Flavours v2 API. Every entry above describes changes relative to
this version. Requests that omit the X-API-Version header are served the 2.0.0
contract.