Admin Booking Creation
Create bookings and orders directly from the admin API using the orders/from-config endpoint. This bypasses the public checkout flow and is designed for back-office operations.
For the public checkout flow, see Order & Checkout Flow. For general conventions, see JSON-API Conventions.
Prerequisites
- A valid Bearer token with admin access — see Authentication
- Organization context (
?o={organization_id}) - At least one resource and service configured in the organization
When to Use
| Scenario | Use |
|---|---|
| Customer books through the website | Public Checkout |
| Admin creates a booking on behalf of a customer | This guide |
| Bulk/batch booking creation | This guide |
| Booking without availability check (override) | This guide |
Step 1 — Pre-Calculate Pricing (Optional)
Request path documentation:
paths/admin/orders.yamlforPOST /api/v1/orders/calculate
Before creating the order, preview the pricing:
POST /api/v1/orders/calculate?o={org_id}
{
"bookings": [
{
"resource_id": "{resource_uuid}",
"service_id": { "{service_uuid}": 1 },
"start_date": "2026-04-15T09:00:00+02:00",
"end_date": "2026-04-15T10:00:00+02:00"
}
],
"voucher_code": "SUMMER20"
}
Returns calculated totals, taxes, and per-booking pricing without persisting anything.
Step 2 — Create the Order
Request path documentation:
paths/admin/orders.yamlforPOST /api/v1/orders/from-config
POST /api/v1/orders/from-config?o={org_id}
{
"order_customer_id": "{customer_uuid}",
"bookings": [
{
"resource_id": "{resource_uuid}",
"service_id": { "{service_uuid}": 1 },
"start_date": "2026-04-15T09:00:00+02:00",
"end_date": "2026-04-15T10:00:00+02:00",
"quantity": 1,
"description": "Team meeting",
"booking_add_ons": [
{ "add_on_id": "{add_on_uuid}", "quantity": 2 }
]
}
],
"notify_customer": true,
"complete_order": true,
"check_availability": true,
"timezone": "Europe/Berlin"
}
Top-Level Fields
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
order_customer_id |
string | No | — | Customer UUID for the entire order |
bookings |
array | Yes | — | Array of booking configurations |
voucher_code |
string | No | — | Discount voucher code |
notify_customer |
boolean | No | true |
Send confirmation email to customer |
complete_order |
boolean | No | true |
false creates a draft order |
check_availability |
boolean | No | true |
false skips availability validation |
timezone |
string | No | — | Timezone for date interpretation |
Booking Object Fields
| Field | Type | Required | Description |
|---|---|---|---|
resource_id |
string/array | Yes | Resource UUID(s). Array for multi-resource bookings. |
service_id |
object | Yes | Map of service_uuid → quantity (e.g. {"uuid": 1}) |
start_date |
string | Yes | Booking start (Atom format) |
end_date |
string | Yes | Booking end (Atom format) |
customer_id |
string | No | Per-booking customer (overrides order_customer_id) |
quantity |
integer | No | Number of slots/participants |
description |
string | No | Internal description |
note |
string | No | Admin-visible note |
customer_note |
string | No | Customer-visible note |
booking_add_ons |
array | No | Array of { add_on_id, quantity } |
sub_bookings |
array | No | Array of { service_id, resource_id, quantity } for linked sub-bookings |
service_custom_fields |
object | No | Custom field values (UUID → value) |
order_custom_fields |
object | No | Order-level custom field values |
recurring |
object | No | Recurring rules (frequency, interval, until, count) |
timeslot_series_id |
string | No | Link to a specific timeslot series |
Response
Returns a standard JSON-API orders resource with the created bookings:
{
"data": {
"type": "orders",
"id": "order-uuid",
"attributes": {
"status": "completed",
"manually_created": true,
"total": 5000,
"currency": "EUR"
},
"relationships": {
"bookings": {
"data": [{ "type": "bookings", "id": "b1" }]
},
"customer": {
"data": { "type": "customers", "id": "c1" }
}
}
}
}
Multiple Bookings in One Order
Add multiple booking objects to create them in a single order:
{
"order_customer_id": "{customer_uuid}",
"bookings": [
{
"resource_id": "{room_uuid}",
"service_id": { "{meeting_service}": 1 },
"start_date": "2026-04-15T09:00:00+02:00",
"end_date": "2026-04-15T10:00:00+02:00"
},
{
"resource_id": "{desk_uuid}",
"service_id": { "{desk_service}": 1 },
"start_date": "2026-04-15T10:00:00+02:00",
"end_date": "2026-04-15T17:00:00+02:00"
}
]
}
Skipping Availability Checks
Set check_availability: false to override availability constraints. Use this for:
- Overbooking scenarios
- Creating bookings in the past
- Special arrangements outside normal schedules
Warning: Skipping availability checks can create conflicting bookings. Use with care.
Re-Sending Order Notifications
If the customer didn't receive the confirmation:
GET /api/v1/orders/{order_id}/send-notification?o={org_id}
Triggers the order confirmation notification to the associated customer.
Common Errors
| Error | Cause | Solution |
|---|---|---|
422 — resource_id required |
Missing resource in booking object | Include resource_id for each booking |
422 — service_id required |
Missing service mapping | Provide service_id as { "uuid": quantity } |
422 — slot unavailable |
Time conflict with existing booking | Set check_availability: false to override, or pick a different time |
422 — customer not found |
Invalid order_customer_id |
Verify the customer UUID exists in the organization |
403 — unauthorized |
Insufficient permissions | Requires order creation permission for the organization |