You are viewing a non-production environment — the API surface may differ from production.
Menu API

Menu Layouts

Menu structure and organization

GET
/api/v1/menu-layouts

Authorization

ApiKeyAuth
X-API-Key<token>

API key authentication. Format: karma_live_* or karma_dev_*

In: header

Query Parameters

locationId?number

Filter by location ID

page?number

Page number

Range1 <= value
Default1
limit?number

Items per page

Range1 <= value <= 100
Default20
availableOnly?string

Filter by schedule availability (ISO timestamp or "true")

channels?string

Filter by channels (comma-separated channel types)

templatesOnly?string

Filter to only return templates

Value in

  • "true"
  • "false"
excludeTemplates?string

Exclude templates from results

Value in

  • "true"
  • "false"
resolveReferences?string

Resolve linked template references in the context

Value in

  • "true"
  • "false"
excludeUnmapped?string

Drop product nodes whose item lacks a POS integration_resource_mappings row. Used by storefront to hide items that would silently fail at the POS. No-op when the location has no active POS integration.

Value in

  • "true"
  • "false"

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/api/v1/menu-layouts"
{  "status": "success",  "data": {    "layouts": [      {        "id": "string",        "locationId": 0,        "context": {          "id": null,          "type": null,          "title": null,          "color": null,          "data": null,          "gridWidth": null,          "gridHeight": null,          "gridRow": null,          "gridCol": null,          "gridCols": null,          "hideTitle": null,          "hideImage": null,          "resetToRoot": null,          "fontSize": null,          "storefrontStyle": null,          "productRef": null,          "presetVariantItemIds": null,          "referenceId": null,          "linked": null,          "actionType": null,          "quantityValue": null,          "coursingValue": null,          "voucherCode": null,          "voucherTitle": null,          "targetItemId": null,          "customUrl": null,          "customUrlTitle": null,          "noteText": null,          "reportScope": null,          "reportDateMode": null,          "reportPeriodMode": null,          "reportShiftId": null,          "targetPrinterGroupId": null,          "targetStationTitle": null,          "isDynamicGroup": null,          "dynamicTagKey": null,          "dynamicTagValue": null,          "scheduleRules": null,          "channelAvailability": null,          "_isResolvedReference": null,          "_referenceId": null,          "_originalReferenceNodeId": null,          "_referenceNotFound": null,          "actionBars": null,          "detachedLayouts": null,          "actionBar": null,          "actionBarPosition": null        },        "createdAt": "2019-08-24T14:15:22Z",        "updatedAt": "2019-08-24T14:15:22Z",        "sortOrder": 0,        "isTemplate": true,        "templateName": "string",        "usageCount": 0,        "scheduleRules": [          {            "id": "string",            "dayOfWeek": 0,            "startTime": "string",            "endTime": "string",            "active": true          }        ],        "channelAvailability": {          "byChannel": {            "KIOSK": true,            "POS": true,            "ONLINE": true,            "TAKEAWAY": true,            "WOLT": true,            "FOODORA": true,            "UBER_EATS": true          },          "online": true,          "qr": true,          "kiosk": true,          "pos": true,          "wolt": true,          "foodora": true,          "uberEats": true        },        "checkoutSwitchEligible": true,        "isAvailableNow": true      }    ],    "pagination": {      "page": 1,      "limit": 1,      "total": 0,      "totalPages": 0    }  },  "meta": {    "requestId": "string",    "timestamp": "2019-08-24T14:15:22Z",    "executionTimeMs": 0  }}
POST
/api/v1/menu-layouts

Authorization

ApiKeyAuth
X-API-Key<token>

API key authentication. Format: karma_live_* or karma_dev_*

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

locationId*number

Location ID

context*

The menu screen configuration to store — a recursive node tree; the root should be a type: "layout" node with the menu title and a data array. Fields documented as attached-on-read are ignored.

isTemplate?boolean

Whether this layout should be a reusable template

templateName?string

Display name for the template (required if isTemplate is true)

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/api/v1/menu-layouts" \  -H "Content-Type: application/json" \  -d '{    "locationId": 0,    "context": {}  }'
{  "status": "success",  "data": {    "id": "string",    "locationId": 0,    "context": {      "id": null,      "type": null,      "title": null,      "color": null,      "data": null,      "gridWidth": null,      "gridHeight": null,      "gridRow": null,      "gridCol": null,      "gridCols": null,      "hideTitle": null,      "hideImage": null,      "resetToRoot": null,      "fontSize": null,      "storefrontStyle": null,      "productRef": null,      "presetVariantItemIds": null,      "referenceId": null,      "linked": null,      "actionType": null,      "quantityValue": null,      "coursingValue": null,      "voucherCode": null,      "voucherTitle": null,      "targetItemId": null,      "customUrl": null,      "customUrlTitle": null,      "noteText": null,      "reportScope": null,      "reportDateMode": null,      "reportPeriodMode": null,      "reportShiftId": null,      "targetPrinterGroupId": null,      "targetStationTitle": null,      "isDynamicGroup": null,      "dynamicTagKey": null,      "dynamicTagValue": null,      "scheduleRules": null,      "channelAvailability": null,      "_isResolvedReference": null,      "_referenceId": null,      "_originalReferenceNodeId": null,      "_referenceNotFound": null,      "actionBars": null,      "detachedLayouts": null,      "actionBar": null,      "actionBarPosition": null    },    "createdAt": "2019-08-24T14:15:22Z",    "updatedAt": "2019-08-24T14:15:22Z",    "sortOrder": 0,    "isTemplate": true,    "templateName": "string",    "usageCount": 0,    "scheduleRules": [      {        "id": "string",        "dayOfWeek": 0,        "startTime": "string",        "endTime": "string",        "active": true      }    ],    "channelAvailability": {      "byChannel": {        "KIOSK": true,        "POS": true,        "ONLINE": true,        "TAKEAWAY": true,        "WOLT": true,        "FOODORA": true,        "UBER_EATS": true      },      "online": true,      "qr": true,      "kiosk": true,      "pos": true,      "wolt": true,      "foodora": true,      "uberEats": true    },    "checkoutSwitchEligible": true,    "isAvailableNow": true  },  "meta": {    "requestId": "string",    "timestamp": "2019-08-24T14:15:22Z",    "executionTimeMs": 0  }}
GET
/api/v1/menu-layouts/{id}

Authorization

ApiKeyAuth
X-API-Key<token>

API key authentication. Format: karma_live_* or karma_dev_*

In: header

Path Parameters

id*string

Menu layout ID (UUID)

Formatuuid

Query Parameters

resolveReferences?string

Resolve linked template references in the context

Value in

  • "true"
  • "false"
excludeUnmapped?string

Drop product nodes whose item lacks a POS integration_resource_mappings row. No-op when the location has no active POS integration.

Value in

  • "true"
  • "false"

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/api/v1/menu-layouts/497f6eca-6276-4993-bfeb-53cbbbba6f08"
{  "status": "success",  "data": {    "id": "string",    "locationId": 0,    "context": {      "id": null,      "type": null,      "title": null,      "color": null,      "data": null,      "gridWidth": null,      "gridHeight": null,      "gridRow": null,      "gridCol": null,      "gridCols": null,      "hideTitle": null,      "hideImage": null,      "resetToRoot": null,      "fontSize": null,      "storefrontStyle": null,      "productRef": null,      "presetVariantItemIds": null,      "referenceId": null,      "linked": null,      "actionType": null,      "quantityValue": null,      "coursingValue": null,      "voucherCode": null,      "voucherTitle": null,      "targetItemId": null,      "customUrl": null,      "customUrlTitle": null,      "noteText": null,      "reportScope": null,      "reportDateMode": null,      "reportPeriodMode": null,      "reportShiftId": null,      "targetPrinterGroupId": null,      "targetStationTitle": null,      "isDynamicGroup": null,      "dynamicTagKey": null,      "dynamicTagValue": null,      "scheduleRules": null,      "channelAvailability": null,      "_isResolvedReference": null,      "_referenceId": null,      "_originalReferenceNodeId": null,      "_referenceNotFound": null,      "actionBars": null,      "detachedLayouts": null,      "actionBar": null,      "actionBarPosition": null    },    "createdAt": "2019-08-24T14:15:22Z",    "updatedAt": "2019-08-24T14:15:22Z",    "sortOrder": 0,    "isTemplate": true,    "templateName": "string",    "usageCount": 0,    "scheduleRules": [      {        "id": "string",        "dayOfWeek": 0,        "startTime": "string",        "endTime": "string",        "active": true      }    ],    "channelAvailability": {      "byChannel": {        "KIOSK": true,        "POS": true,        "ONLINE": true,        "TAKEAWAY": true,        "WOLT": true,        "FOODORA": true,        "UBER_EATS": true      },      "online": true,      "qr": true,      "kiosk": true,      "pos": true,      "wolt": true,      "foodora": true,      "uberEats": true    },    "checkoutSwitchEligible": true,    "isAvailableNow": true  },  "meta": {    "requestId": "string",    "timestamp": "2019-08-24T14:15:22Z",    "executionTimeMs": 0  }}
DELETE
/api/v1/menu-layouts/{id}

Authorization

ApiKeyAuth
X-API-Key<token>

API key authentication. Format: karma_live_* or karma_dev_*

In: header

Path Parameters

id*string

Menu layout ID (UUID)

Formatuuid

Query Parameters

force?string

Force delete a template even if it is being used in menus

Value in

  • "true"
  • "false"

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X DELETE "https://example.com/api/v1/menu-layouts/497f6eca-6276-4993-bfeb-53cbbbba6f08"
{  "status": "success",  "data": {    "deleted": true  },  "meta": {    "requestId": "string",    "timestamp": "2019-08-24T14:15:22Z",    "executionTimeMs": 0  }}
PUT
/api/v1/menu-layouts/{id}

Authorization

ApiKeyAuth
X-API-Key<token>

API key authentication. Format: karma_live_* or karma_dev_*

In: header

Path Parameters

id*string

Menu layout ID (UUID)

Formatuuid

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

context?

The updated menu screen configuration — replaces the stored context wholesale. Same recursive node tree as on create; fields documented as attached-on-read are ignored.

isTemplate?boolean

Whether this layout should be a reusable template

templateName?string

Display name for the template

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X PUT "https://example.com/api/v1/menu-layouts/497f6eca-6276-4993-bfeb-53cbbbba6f08" \  -H "Content-Type: application/json" \  -d '{}'
{  "status": "success",  "data": {    "id": "string",    "locationId": 0,    "context": {      "id": null,      "type": null,      "title": null,      "color": null,      "data": null,      "gridWidth": null,      "gridHeight": null,      "gridRow": null,      "gridCol": null,      "gridCols": null,      "hideTitle": null,      "hideImage": null,      "resetToRoot": null,      "fontSize": null,      "storefrontStyle": null,      "productRef": null,      "presetVariantItemIds": null,      "referenceId": null,      "linked": null,      "actionType": null,      "quantityValue": null,      "coursingValue": null,      "voucherCode": null,      "voucherTitle": null,      "targetItemId": null,      "customUrl": null,      "customUrlTitle": null,      "noteText": null,      "reportScope": null,      "reportDateMode": null,      "reportPeriodMode": null,      "reportShiftId": null,      "targetPrinterGroupId": null,      "targetStationTitle": null,      "isDynamicGroup": null,      "dynamicTagKey": null,      "dynamicTagValue": null,      "scheduleRules": null,      "channelAvailability": null,      "_isResolvedReference": null,      "_referenceId": null,      "_originalReferenceNodeId": null,      "_referenceNotFound": null,      "actionBars": null,      "detachedLayouts": null,      "actionBar": null,      "actionBarPosition": null    },    "createdAt": "2019-08-24T14:15:22Z",    "updatedAt": "2019-08-24T14:15:22Z",    "sortOrder": 0,    "isTemplate": true,    "templateName": "string",    "usageCount": 0,    "scheduleRules": [      {        "id": "string",        "dayOfWeek": 0,        "startTime": "string",        "endTime": "string",        "active": true      }    ],    "channelAvailability": {      "byChannel": {        "KIOSK": true,        "POS": true,        "ONLINE": true,        "TAKEAWAY": true,        "WOLT": true,        "FOODORA": true,        "UBER_EATS": true      },      "online": true,      "qr": true,      "kiosk": true,      "pos": true,      "wolt": true,      "foodora": true,      "uberEats": true    },    "checkoutSwitchEligible": true,    "isAvailableNow": true  },  "meta": {    "requestId": "string",    "timestamp": "2019-08-24T14:15:22Z",    "executionTimeMs": 0  }}
POST
/api/v1/menu-layouts/{id}/restore

Authorization

ApiKeyAuth
X-API-Key<token>

API key authentication. Format: karma_live_* or karma_dev_*

In: header

Path Parameters

id*string

Menu layout ID (UUID)

Formatuuid

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/api/v1/menu-layouts/497f6eca-6276-4993-bfeb-53cbbbba6f08/restore"
{  "status": "success",  "data": {    "id": "string",    "locationId": 0,    "context": {      "id": null,      "type": null,      "title": null,      "color": null,      "data": null,      "gridWidth": null,      "gridHeight": null,      "gridRow": null,      "gridCol": null,      "gridCols": null,      "hideTitle": null,      "hideImage": null,      "resetToRoot": null,      "fontSize": null,      "storefrontStyle": null,      "productRef": null,      "presetVariantItemIds": null,      "referenceId": null,      "linked": null,      "actionType": null,      "quantityValue": null,      "coursingValue": null,      "voucherCode": null,      "voucherTitle": null,      "targetItemId": null,      "customUrl": null,      "customUrlTitle": null,      "noteText": null,      "reportScope": null,      "reportDateMode": null,      "reportPeriodMode": null,      "reportShiftId": null,      "targetPrinterGroupId": null,      "targetStationTitle": null,      "isDynamicGroup": null,      "dynamicTagKey": null,      "dynamicTagValue": null,      "scheduleRules": null,      "channelAvailability": null,      "_isResolvedReference": null,      "_referenceId": null,      "_originalReferenceNodeId": null,      "_referenceNotFound": null,      "actionBars": null,      "detachedLayouts": null,      "actionBar": null,      "actionBarPosition": null    },    "createdAt": "2019-08-24T14:15:22Z",    "updatedAt": "2019-08-24T14:15:22Z",    "sortOrder": 0,    "isTemplate": true,    "templateName": "string",    "usageCount": 0,    "scheduleRules": [      {        "id": "string",        "dayOfWeek": 0,        "startTime": "string",        "endTime": "string",        "active": true      }    ],    "channelAvailability": {      "byChannel": {        "KIOSK": true,        "POS": true,        "ONLINE": true,        "TAKEAWAY": true,        "WOLT": true,        "FOODORA": true,        "UBER_EATS": true      },      "online": true,      "qr": true,      "kiosk": true,      "pos": true,      "wolt": true,      "foodora": true,      "uberEats": true    },    "checkoutSwitchEligible": true,    "isAvailableNow": true  },  "meta": {    "requestId": "string",    "timestamp": "2019-08-24T14:15:22Z",    "executionTimeMs": 0  }}
GET
/api/v1/menu-layouts/{id}/usage

Authorization

ApiKeyAuth
X-API-Key<token>

API key authentication. Format: karma_live_* or karma_dev_*

In: header

Path Parameters

id*string

Menu layout ID (UUID)

Formatuuid

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/api/v1/menu-layouts/497f6eca-6276-4993-bfeb-53cbbbba6f08/usage"
{  "status": "success",  "data": {    "templateId": "string",    "usageCount": 0,    "usedIn": [      {        "menuId": "string",        "menuTitle": "string",        "linked": true      }    ]  },  "meta": {    "requestId": "string",    "timestamp": "2019-08-24T14:15:22Z",    "executionTimeMs": 0  }}
POST
/api/v1/menu-layouts/reorder

Authorization

ApiKeyAuth
X-API-Key<token>

API key authentication. Format: karma_live_* or karma_dev_*

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

layoutIds*array<string>

Array of menu layout IDs in the desired display order

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/api/v1/menu-layouts/reorder" \  -H "Content-Type: application/json" \  -d '{    "layoutIds": [      "string"    ]  }'
{  "status": "success",  "data": {    "success": true,    "layoutIds": [      "string"    ]  },  "meta": {    "requestId": "string",    "timestamp": "2019-08-24T14:15:22Z",    "executionTimeMs": 0  }}