Menu structure and organization
List menu layouts
List menu layouts with optional filtering by location, schedule, and channels
Permissions: 🔵 menu_layouts.read
query Parameters
locationIdFilter by location ID
pagePage number
limitItems per page
availableOnlyFilter by schedule availability (ISO timestamp or "true")
channelsFilter by channels (comma-separated channel types)
templatesOnlyFilter to only return templates
excludeTemplatesExclude templates from results
resolveReferencesResolve linked template references in the context
excludeUnmappedDrop 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.
List menu layouts › Responses
Default Response
statusCreate menu layout
Create a new menu layout
Permissions: 🟢 menu_layouts.create
Create menu layout › Request Body
locationIdLocation ID
JSON object with POS screen layout configuration
isTemplateWhether this layout should be a reusable template
templateNameDisplay name for the template (required if isTemplate is true)
Create menu layout › Responses
Default Response
statusGet menu layout
Get a single menu layout by ID. Use resolveReferences=true to expand linked template references.
Permissions: 🔵 menu_layouts.read
path Parameters
idMenu layout ID (UUID)
query Parameters
resolveReferencesResolve linked template references in the context
excludeUnmappedDrop product nodes whose item lacks a POS integration_resource_mappings row. No-op when the location has no active POS integration.
Get menu layout › Responses
Default Response
statusUpdate menu layout
Update an existing menu layout
Permissions: 🟠menu_layouts.update
path Parameters
idMenu layout ID (UUID)
Update menu layout › Request Body
Updated JSON object with POS screen layout configuration
isTemplateWhether this layout should be a reusable template
templateNameDisplay name for the template
Update menu layout › Responses
Default Response
statusDelete menu layout
Delete a menu layout. If the layout is a template that is being used, set force=true to delete anyway.
Permissions: 🔴 menu_layouts.delete
path Parameters
idMenu layout ID (UUID)
query Parameters
forceForce delete a template even if it is being used in menus
Delete menu layout › Responses
Menu layout successfully deleted
statusGet template usage
Get information about which menus are using a template
Permissions: 🔵 menu_layouts.read
path Parameters
idMenu layout ID (UUID)
Get template usage › Responses
Default Response
statusReorder menu layouts
Reorder menu layouts by updating their sort order
Permissions: 🟠menu_layouts.update
Reorder menu layouts › Request Body
layoutIdsArray of menu layout IDs in the desired display order
Reorder menu layouts › Responses
Menu layouts successfully reordered
statusWebhook: Menu layout created
Fired when a new menu layout is created. The full layout object is spread into data.
This is an outbound webhook event. Karma POSTs this payload to the URL you registered via POST /api/v1/webhooks/subscriptions. Your endpoint should respond 2xx within 30 seconds to acknowledge delivery.
Webhook: Menu layout created › Request Body
idUnique webhook delivery ID
eventresourceresourceIdString ID of the affected resource
timestampISO 8601 timestamp when the event was emitted
apiVersionWebhook: Menu layout created › Responses
Acknowledged. Karma considers any 2xx response a successful delivery; non-2xx triggers retry with exponential backoff.
Webhook: Menu layout updated
Fired when a menu layout changes — either directly via PUT, or indirectly when channel/schedule changes affect the layout. The two emission paths produce slightly different payloads.
This is an outbound webhook event. Karma POSTs this payload to the URL you registered via POST /api/v1/webhooks/subscriptions. Your endpoint should respond 2xx within 30 seconds to acknowledge delivery.
Webhook: Menu layout updated › Request Body
idUnique webhook delivery ID
eventresourceresourceIdString ID of the affected resource
timestampISO 8601 timestamp when the event was emitted
apiVersionWebhook: Menu layout updated › Responses
Acknowledged. Karma considers any 2xx response a successful delivery; non-2xx triggers retry with exponential backoff.
Webhook: Menu layout deleted
Soft delete — the layout remains in the database.
This is an outbound webhook event. Karma POSTs this payload to the URL you registered via POST /api/v1/webhooks/subscriptions. Your endpoint should respond 2xx within 30 seconds to acknowledge delivery.
Webhook: Menu layout deleted › Request Body
idUnique webhook delivery ID
eventresourceresourceIdString ID of the affected resource
timestampISO 8601 timestamp when the event was emitted
apiVersionWebhook: Menu layout deleted › Responses
Acknowledged. Karma considers any 2xx response a successful delivery; non-2xx triggers retry with exponential backoff.