Place an Order
The Public Order API lets external integrations place orders at a Karma location in a single call — no tab pre-creation, no user lookup, no complex payload construction.
Endpoint
Code
Authentication
All requests require an API key with the inventory.create permission:
Code
Contact Karma to obtain a key for your integration.
Quick Start
The simplest possible order
Code
That's it. A new tab is opened, a kitchen dispatch is created, and an anonymous guest is generated automatically.
Response
Code
Use the tabId in the response to add more items to the same tab before payment is collected.
Common Scenarios
Identify the guest by email
If you know the guest's email, pass it in ordering_member. If the email matches an existing
Karma account it is reused — no duplicate is created. New accounts are created automatically.
Code
You can also identify by user_id (highest priority) or phone. If nothing is provided,
a fresh anonymous guest is created for this order only.
Multiple items with variants and a voucher
A loyalty member ordering a customised burrito and a drink with a 10% welcome voucher, collected as takeaway:
Code
Add items to an existing tab
Use the tabId from a previous response to keep adding orders to the same tab:
Code
Fractional quantities
quantity_cents scales by 100: 100 = 1 unit, 50 = half a unit, 200 = 2 units.
Useful for weight-based or bulk items:
Code
Price override
Override the catalogue price for this order only — useful for promotions or custom pricing:
Code
TypeScript / Node.js
Code
Python
Code
Field Reference
Request body
| Field | Type | Required | Description |
|---|---|---|---|
location_id | number | ✅ | Location to place the order at |
items | array | ✅ | Items to order (at least one) |
ordering_member | object | — | Guest identity. Omit for an anonymous guest. |
vouchers | string[] | — | Voucher codes to apply |
order_destination | string | — | NONE (default, fresh tab), TAB, QR, KD |
order_destination_id | string | — | UUID of the target when order_destination ≠ NONE |
order_type | string | — | OTC (default), TAKEAWAY, TABLE |
items[]
| Field | Type | Required | Description |
|---|---|---|---|
id | number | ✅ | Inventory item ID |
quantity_cents | number | ✅ | Quantity × 100 (100 = 1, 50 = half) |
variants | object[] | — | Variant selections (size, milk type, etc.) |
price_cents | number | — | Price override. Defaults to catalogue price. |
coursing_order | number | — | Course number. 0 = send immediately. |
ordering_member
| Field | Type | Description |
|---|---|---|
user_id | number | Existing Karma user ID (highest priority) |
email | string | Finds or creates a guest by email |
phone | string | Finds or creates a guest by phone |
name | string | Display name for new guests |
Error codes
| Status | Code | When |
|---|---|---|
| 400 | INVALID_INPUT | Missing required fields or bad types |
| 401 | MISSING_API_KEY | No X-API-Key header |
| 403 | INSUFFICIENT_PERMISSIONS | Key lacks inventory.create |
| 403 | SCOPE_VIOLATION | Key not scoped to this location |
| 422 | ITEM_NOT_FOUND | Item does not exist at this location |
| 422 | ITEM_UNAVAILABLE | Item is currently unavailable |
| 429 | RATE_LIMIT_EXCEEDED | Too many requests |