KDS Orders
| Route | Description |
|---|---|
| GET KDS Active Orders | Returns all active orders on a specific screen |
| POST Create KDS Order | Create a KDS order to display on one or more screens |
| PUT Update KDS Order | Updates a KDS order on one or more screens. Requires entire order payload. |
| PUT Partial Update KDS Order | Updates a KDS order on one or more screens. Does not require entire order payload. |
| PUT Cancel KDS Order | Cancels a KDS order on one or more screens |
GET /integrators/kds-orders/active
x-integration-token: {token}
x-location-id: {locationId}
x-device-ids: {deviceId}
For device ids you can pass a single device id, a list of device ids separated by commas, or ‘all’ to get information for all the location’s devices
Fresh KDS will return information for all requested screens, including the total active order count per screen and an array of active orders. The orderId and orderName properties in the response correspond to the id and name values passed in when creating the order.
[
{
"deviceId": "49d0d0a9-e7a8-438c-9e14-e26198e637df",
"deviceName": "Device 2",
"orderCount": 2,
"orders": [
{
"orderId": "223456789",
"orderName": "2 Test Order"
},
{
"orderId": "323456789",
"orderName": "2 Test Order 2"
}
]
},
{
"deviceId": "74b6041f-c095-47b9-ba4f-340b89142935",
"deviceName": "Device 3",
"orderCount": 1,
"orders": [
{
"orderId": "423456789",
"orderName": "3 Test Order"
}
]
}
]
POST /integrators/kds-orders
x-integration-token: {token}
x-location-id: {locationId}
x-device-ids: {deviceId}
*For device ids you can pass a single device id, a list of device ids separated by commas, or ‘all’ to send the KDS order to all the location’s devices
| Property | Required | Type | Description |
|---|---|---|---|
| id | yes | string | unique id of this KDS order |
| name | yes | string | order/customer name |
| time | yes | date | date/time order is placed in ISO 8601 format |
| pickupTime | no | date | date/time for order pickup in ISO 8601 format |
| phoneNumber | no | string | customer phone number in E.164 format |
| optInForSms | no | bool | if false KDS will not message customer for this order; default is true |
| deliveryAddress | no | string | delivery address for order |
| mode | yes | string | accepted values: For Here, ToGo, Pickup, DriveThru, Delivery, Curbside |
| deliveryHandoff | no | bool | if mode is Delivery and this is true the order will display as Delivery Handoff |
| server | no | string | name of employee creating the order |
| items | yes | KdsItem[ ] | array of menu items |
| terminal | no | string | POS terminal creating the order |
| specialInstructions | no | string | special instructions for the order |
| customerArrivedUrl | no | url | if present the URL will be added to the order received and order ready messages |
| vehicleModel | no | string | vehicle make and model |
| vehicleColor | no | string | vehicle color |
| costs | no | Costs | object with order costs |
| deliveryService | no | DeliveryService | object with delivery service information |
| originSource | no | string | third party order source |
| checkNumber | no | string | optional parameter that gets appended to the order name |
| priority | no | bool | if true order card will be flagged as priority and moved to front of queue |
| prepTimeDuration | no | ISO 8601 string | time it takes to prepare order; example: PT30M; only applied if auto hold future orders is true |
| covers | no | int | The number of covers/guests on the order. |
| loyaltyMember | no | bool | if true a badge will be displayed on the order card |
| Property | Required | Type | Description |
|---|---|---|---|
| lineId | yes | string | must be unique; used for processing subsequent order update commands |
| name | yes | string | name of item |
| qty | yes | int | quantity of item |
| price | no | string | price of item; can include currency symbol |
| mods | yes | Modifier[ ] | array of item modifiers; send empty array for items without modifiers |
| specialInstructions | no | string | special instructions for item |
| course | no | string | course name/number of the item |
| courseStatus | no | string | valid values are “straightFire”, “hold”, “fire”, and “pickup” |
| seat | no | string | seat number of the item |
| itemGroup | no | ItemGroup | Include if this item belongs to an item group / combo. It’s a way to tie together items on the order card UI. |
| Property | Required | Type | Description |
|---|---|---|---|
| name | yes | string | name of modifier |
| qty | no | int | Quantity of modifier. Shows on the order card if qty > 1. |
previously item.mods was a string[], which is still supported for backwards compatibility
| Property | Required | Type | Description |
|---|---|---|---|
| subtotal | no | string | subtotal of order |
| tax | no | string | tax on order |
| deliveryFee | no | string | delivery fee on order |
| surcharge | no | string | surcharge on order |
| convenienceFee | no | string | convenience fee on order |
| tip | no | string | tip on order |
| additionalFees | no | additionalFees[ ] | array of additional fees |
| total | no | string | total of order |
| promoCodes | no | promoCodes[ ] | array of promo codes on order |
all properties in the Costs object are strings and can include currency symbols for display
| Property | Required | Type | Description |
|---|---|---|---|
| name | yes | string | name of fee |
| amount | yes | string | amount of fee; can include currency symbol |
| Property | Required | Type | Description |
|---|---|---|---|
| name | no | string | name of promo code |
| amount | yes | string | amount of promo; can include currency symbol |
| Property | Required | Type | Description |
|---|---|---|---|
| name | yes | string | name of delivery service |
| orderId | yes | string | delivery service order ID |
| driverPhone | no | string | delivery driver phone number in E.164 format |
| Property | Required | Type | Description |
|---|---|---|---|
| id | yes | string | the id that will tie together multiple items on an order. |
| name | yes | string | the item group name that will display on the order cards. |
| note | no | string | optional field to include a note for the item group. Displays at the bottom of the group. |
All properties of an itemGroup should be the same for all items in the group. Items of the same group cannot be split on KDS. This means that the course, seat, and courseStatus of items in the same group must be the same. Unexpected behavior may occur if not.
{
"id": "123",
"name": "John Doe",
"time": "2026-01-01T12:00:00.000Z",
"pickupTime": "2026-01-01T13:00:00.000Z",
"mode": "Pickup",
"terminal": "My POS",
"items": [
{
"lineId": "1",
"name": "Hamburger",
"qty": 1,
"mods": [
{
"name": "No Ketchup",
"qty": 1
},
{
"name": "Side Fries",
"qty": 1
}
],
"course": "Course 1",
"seat": "Seat 1",
"courseStatus": "fire"
},
{
"lineId": "2",
"name": "Vanilla Shake",
"qty": 1,
"mods": [],
"course": "Course 2",
"seat": "Seat 1",
"courseStatus": "hold"
}
]
}



Payload included on each item in the group:
"itemGroup": {
"id": "1",
"name": "Burger Combo",
"note": "Sauce on side"
}

HTTP Response Code: 201 - Created
{
"orderId" : "123",
"deliveryStatuses": [
{
"device": "e1675528-aba9-4b97-8482-a72380870fd5",
"status": "success",
"type": "android"
}
]
}
the orderId value in the response will match the id provided in the request payload
HTTP Response Code: 409 - Conflict
{
"message": "Could not create resource. Id already exists"
}
you will get this response if the id already exists for an order at the location
PUT /integrators/kds-orders
x-integration-token: {token}
x-location-id: {locationId}
x-device-ids: {deviceId}
*For device ids you can pass a single device id, a list of device ids separated by commas, or ‘all’ to update the KDS order on all the location’s devices
The body parameters for the request are identical to the Create KDS Order request. The id provided in the update request must match the id from the original create request. Non-matching id values will be ignored.
The update request must include all the properties for the KDS order, even if there has been no change.
To apply changes to the KDS items array you must provide the same lineId values as the original request. Items on the KDS order that are no longer present in the update request will be removed from the KDS order and flagged as “deleted” on the screen.
HTTP Response Code: 200 - OK
{
"orderId" : "123",
"deliveryStatuses": [
{
"device": "e1675528-aba9-4b97-8482-a72380870fd5",
"status": "success"
}
]
}
HTTP Response Code: 404 - Not Found
{
"message": "Could not update. No resource found"
}
you will get this response if the id does not exist for an order at the location
PUT /integrators/kds-orders/partial
x-integration-token: {token}
x-location-id: {locationId}
x-device-ids: {deviceId}
*For device ids you can pass a single device id, a list of device ids separated by commas, or ‘all’ to update the KDS order on all the location’s devices
A partial order update does not require all order properties to be included in the body request. This request should include only the properties that you wish to change. This may be helpful if your system operates on an eventual consistency model, where the order state may not be immediately synced between terminals. Using partial updates, you may rely on the KDS to manage the final order state.
| Property | Required | Type | Description |
|---|---|---|---|
| id | yes | string | unique id of this KDS order. Must match the id from the original create request. |
| name | no | string | order/customer name |
| mode | no | string | accepted values: For Here, ToGo, Pickup, DriveThru, Delivery, Curbside |
| pickupTime | no | date | date/time for order pickup in ISO 8601 format |
| phoneNumber | no | string | customer phone number in E.164 format |
| server | no | string | name of employee creating the order |
| specialInstructions | no | string | special instructions for the order |
| vehicleModel | no | string | vehicle make and model |
| vehicleColor | no | string | vehicle color |
| priority | no | bool | if true order card will be flagged as priority and moved to front of queue |
| deliveryAddress | no | string | delivery address for order |
| deliveryService | no | DeliveryService | object with delivery service information |
| costs | no | Costs | object with order costs |
| originSource | no | string | third party order source |
| checkNumber | no | string | optional parameter that gets appended to the order name |
| deliveryHandoff | no | bool | if mode is Delivery and this is true the order will display as Delivery Handoff |
| prepTimeDuration | no | ISO 8601 string | time it takes to prepare order; example: PT30M; only applied if auto hold future orders is true |
| itemsToAdd | no | KdsItem[ ] | array of menu items to add to the order |
| itemsToUpdate | no | KdsItem[ ] | array of menu items to update on the order |
| itemsToRemove | no | string[ ] | array of lineId’s to remove from the order |
| covers | no | int | The number of covers/guests on the order |
| loyaltyMember | no | bool | if true a badge will be displayed on the order card |
iditemsToAdd: Uses the provided lineId on the Item to determine if this is a new Item on the order. Duplicate lineId’s will be ignored.itemsToUpdate: Uses the provided lineId on the Item to determine which Items to update on the order. NonexistentlineId’s will be ignored. Include all item properties when updating - partial item updates are not supported.itemsToRemove: Takes an array of lineId to determine which Items to remove from the order. Nonexistent lineId’s will be ignored.Only include order properties that should be updated. If a property is included on the request it will attempt to overwrite it on the order. Either send properties as null or do not include them in the body at all.
Update the order name and add an item to the order already on the KDS screen. Both of these requests are valid and yield the same result:
{
"id": "123",
"name": "New order name",
"mode": null,
"pickupTime": null,
"phoneNumber": null,
"server": null,
"specialInstructions": null,
"vehicleModel": null,
"vehicleColor": null,
"priority": null,
"deliveryAddress": null,
"deliveryService": null,
"costs": null,
"originSource": null,
"checkNumber": null,
"deliveryHandoff": null,
"prepTimeDuration": null,
"covers": null,
"loyaltyMember": null,
"itemsToAdd": [
{
"lineId": "3",
"qty": 1,
"name": "Hamburger",
"mods": [
{
"name": "no tomato",
"qty": 1
}
]
}
],
"itemsToUpdate": null,
"itemsToRemove": null
}
OR
{
"id": "123",
"name": "New order name",
"itemsToAdd": [
{
"lineId": "3",
"qty": 1,
"name": "Hamburger",
"mods": [
{
"name": "no tomato",
"qty": 1
}
]
}
]
}
Same responses as Update KDS Order Responses
PUT /integrators/kds-orders/cancel
x-integration-token: {token}
x-location-id: {locationId}
x-device-ids: {deviceId}
*For device ids you can pass a single device id, a list of device ids separated by commas, or ‘all’ to cancel the KDS order on all the location’s devices
| Property | Required | Type | Description |
|---|---|---|---|
| id | yes | string | id of the KDS order to cancel |
Non-matching id values will be ignored. When a KDS order is successfully canceled the appearance on the KDS screen will change to include a red banner to indicate the canceled status.