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

Variant Groups

Product options and modifiers

GET
/api/v1/variant-groups

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

type?string

Filter by group type

Value in

  • "EXTRA"
  • "VARIANT"
includeVariants?boolean

Include variants in response

Defaulttrue
page?number

Page number

Range1 <= value
Default1
limit?number

Items per page

Range1 <= value <= 100
Default20

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/api/v1/variant-groups"
{  "status": "success",  "data": {    "variantGroups": [      {        "id": 0,        "locationId": 0,        "name": "string",        "type": "EXTRA",        "description": "string",        "min": 0,        "max": 0,        "isVisible": true,        "useChildCoursing": true,        "maxOptionsVisible": 5,        "variants": [          {            "id": 0,            "variantGroupId": 0,            "name": "string",            "price": 0,            "defaultSelection": true,            "description": "string",            "rank": 0,            "itemId": 0,            "quantity": 0,            "allowQuantityChange": true,            "minQuantity": 0,            "maxQuantity": 0,            "quantityCents": 0,            "minQuantityCents": 0,            "maxQuantityCents": 0,            "posOverriddenFields": [              "string"            ],            "customFields": [              {                "fieldId": "string",                "key": "string",                "label": "string",                "group": "string",                "type": "string",                "displayValue": "string",                "value": null,                "version": 0,                "status": "string"              }            ],            "metadata": {              "customFields": {}            }          }        ],        "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        },        "posOverriddenFields": [          "string"        ],        "customFields": [          {            "fieldId": "string",            "key": "string",            "label": "string",            "group": "string",            "type": "string",            "displayValue": "string",            "value": null,            "version": 0,            "status": "string"          }        ],        "metadata": {          "customFields": {}        }      }    ],    "pagination": {      "page": 1,      "limit": 1,      "total": 0,      "totalPages": 0    }  },  "meta": {    "requestId": "string",    "timestamp": "2019-08-24T14:15:22Z",    "executionTimeMs": 0  }}
POST
/api/v1/variant-groups

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

name*string

Group name

Length1 <= length
type*string

Value in

  • "EXTRA"
  • "VARIANT"
description?string|null
min?number
Range0 <= value
Default0
max?|
Range1 <= value
isVisible?boolean
Defaulttrue
useChildCoursing?boolean

When true, item-based variant children commit with their own coursing_order

Defaultfalse
maxOptionsVisible?number
Range1 <= value <= 100
Default5
variants*array<>

Initial variants for this group

customFields?array<|>

Optional custom field operations, saved atomically with this record. Omitted values are unchanged; null clears. Use fieldId or a stable key. expectedVersion is optional; supply it to reject conflicting edits.

Itemsitems <= 100

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/api/v1/variant-groups" \  -H "Content-Type: application/json" \  -d '{    "locationId": 0,    "name": "string",    "type": "EXTRA",    "variants": [      {        "name": "string"      }    ]  }'
{  "status": "success",  "data": {    "id": 0,    "locationId": 0,    "name": "string",    "type": "EXTRA",    "description": "string",    "min": 0,    "max": 0,    "isVisible": true,    "useChildCoursing": true,    "maxOptionsVisible": 5,    "variants": [      {        "id": 0,        "variantGroupId": 0,        "name": "string",        "price": 0,        "defaultSelection": true,        "description": "string",        "rank": 0,        "itemId": 0,        "quantity": 0,        "allowQuantityChange": true,        "minQuantity": 0,        "maxQuantity": 0,        "quantityCents": 0,        "minQuantityCents": 0,        "maxQuantityCents": 0,        "posOverriddenFields": [          "string"        ],        "customFields": [          {            "fieldId": "string",            "key": "string",            "label": "string",            "group": "string",            "type": "string",            "displayValue": "string",            "value": null,            "version": 0,            "status": "string"          }        ],        "metadata": {          "customFields": {}        }      }    ],    "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    },    "posOverriddenFields": [      "string"    ],    "customFields": [      {        "fieldId": "string",        "key": "string",        "label": "string",        "group": "string",        "type": "string",        "displayValue": "string",        "value": null,        "version": 0,        "status": "string"      }    ],    "metadata": {      "customFields": {}    }  },  "meta": {    "requestId": "string",    "timestamp": "2019-08-24T14:15:22Z",    "executionTimeMs": 0  }}
GET
/api/v1/variant-groups/{id}

Authorization

ApiKeyAuth
X-API-Key<token>

API key authentication. Format: karma_live_* or karma_dev_*

In: header

Path Parameters

id*string

Variant group ID

Match^[0-9]+$

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/api/v1/variant-groups/string"
{  "status": "success",  "data": {    "id": 0,    "locationId": 0,    "name": "string",    "type": "EXTRA",    "description": "string",    "min": 0,    "max": 0,    "isVisible": true,    "useChildCoursing": true,    "maxOptionsVisible": 5,    "variants": [      {        "id": 0,        "variantGroupId": 0,        "name": "string",        "price": 0,        "defaultSelection": true,        "description": "string",        "rank": 0,        "itemId": 0,        "quantity": 0,        "allowQuantityChange": true,        "minQuantity": 0,        "maxQuantity": 0,        "quantityCents": 0,        "minQuantityCents": 0,        "maxQuantityCents": 0,        "posOverriddenFields": [          "string"        ],        "customFields": [          {            "fieldId": "string",            "key": "string",            "label": "string",            "group": "string",            "type": "string",            "displayValue": "string",            "value": null,            "version": 0,            "status": "string"          }        ],        "metadata": {          "customFields": {}        }      }    ],    "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    },    "posOverriddenFields": [      "string"    ],    "customFields": [      {        "fieldId": "string",        "key": "string",        "label": "string",        "group": "string",        "type": "string",        "displayValue": "string",        "value": null,        "version": 0,        "status": "string"      }    ],    "metadata": {      "customFields": {}    }  },  "meta": {    "requestId": "string",    "timestamp": "2019-08-24T14:15:22Z",    "executionTimeMs": 0  }}
DELETE
/api/v1/variant-groups/{id}

Authorization

ApiKeyAuth
X-API-Key<token>

API key authentication. Format: karma_live_* or karma_dev_*

In: header

Path Parameters

id*string

Variant group ID

Match^[0-9]+$

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X DELETE "https://example.com/api/v1/variant-groups/string"
{  "status": "success",  "data": {    "deleted": true  },  "meta": {    "requestId": "string",    "timestamp": "2019-08-24T14:15:22Z",    "executionTimeMs": 0  }}
PUT
/api/v1/variant-groups/{id}

Authorization

ApiKeyAuth
X-API-Key<token>

API key authentication. Format: karma_live_* or karma_dev_*

In: header

Path Parameters

id*string

Variant group ID

Match^[0-9]+$

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

name?string
Length1 <= length
description?string|null
min?number
Range0 <= value
max?|
Range1 <= value
isVisible?boolean
useChildCoursing?boolean

When true, item-based variant children commit with their own coursing_order

maxOptionsVisible?number
Range1 <= value <= 100
variants?array<>

Full replacement of the group's variants. Include every selection to retain. customFields changes the linked item's values; for field-only edits use PATCH /api/v1/variants/{id}?locationId=.

customFields?array<|>

Optional custom field operations, saved atomically with this record. Omitted values are unchanged; null clears. Use fieldId or a stable key. expectedVersion is optional; supply it to reject conflicting edits.

Itemsitems <= 100

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X PUT "https://example.com/api/v1/variant-groups/string" \  -H "Content-Type: application/json" \  -d '{}'
{  "status": "success",  "data": {    "id": 0,    "locationId": 0,    "name": "string",    "type": "EXTRA",    "description": "string",    "min": 0,    "max": 0,    "isVisible": true,    "useChildCoursing": true,    "maxOptionsVisible": 5,    "variants": [      {        "id": 0,        "variantGroupId": 0,        "name": "string",        "price": 0,        "defaultSelection": true,        "description": "string",        "rank": 0,        "itemId": 0,        "quantity": 0,        "allowQuantityChange": true,        "minQuantity": 0,        "maxQuantity": 0,        "quantityCents": 0,        "minQuantityCents": 0,        "maxQuantityCents": 0,        "posOverriddenFields": [          "string"        ],        "customFields": [          {            "fieldId": "string",            "key": "string",            "label": "string",            "group": "string",            "type": "string",            "displayValue": "string",            "value": null,            "version": 0,            "status": "string"          }        ],        "metadata": {          "customFields": {}        }      }    ],    "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    },    "posOverriddenFields": [      "string"    ],    "customFields": [      {        "fieldId": "string",        "key": "string",        "label": "string",        "group": "string",        "type": "string",        "displayValue": "string",        "value": null,        "version": 0,        "status": "string"      }    ],    "metadata": {      "customFields": {}    }  },  "meta": {    "requestId": "string",    "timestamp": "2019-08-24T14:15:22Z",    "executionTimeMs": 0  }}
GET
/api/v1/variants/{id}

Authorization

ApiKeyAuth
X-API-Key<token>

API key authentication. Format: karma_live_* or karma_dev_*

In: header

Path Parameters

id*integer
Range1 <= value

Query Parameters

locationId*integer
Range1 <= value

Response Body

application/json

application/json

curl -X GET "https://example.com/api/v1/variants/1?locationId=1"
{  "status": "success",  "data": {    "id": 0,    "itemId": 0,    "locationId": 0,    "customFields": [      {        "fieldId": "string",        "key": "string",        "label": "string",        "group": "string",        "type": "string",        "displayValue": "string",        "value": null,        "version": 0,        "status": "string"      }    ],    "metadata": {      "customFields": {}    }  }}
PATCH
/api/v1/variants/{id}

Authorization

ApiKeyAuth
X-API-Key<token>

API key authentication. Format: karma_live_* or karma_dev_*

In: header

Path Parameters

id*integer
Range1 <= value

Query Parameters

locationId*integer
Range1 <= value

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

customFields*array<|>
Itemsitems <= 100

Response Body

application/json

application/json

curl -X PATCH "https://example.com/api/v1/variants/1?locationId=1" \  -H "Content-Type: application/json" \  -d '{    "customFields": [      {}    ]  }'
{  "status": "success",  "data": {    "id": 0,    "itemId": 0,    "locationId": 0,    "customFields": [      {        "fieldId": "string",        "key": "string",        "label": "string",        "group": "string",        "type": "string",        "displayValue": "string",        "value": null,        "version": 0,        "status": "string"      }    ],    "metadata": {      "customFields": {}    }  }}