Skip to content

Create reservation

POST
/v1/actions/hospitality.action.create_reservation/apply
curl --request POST \
--url https://api.aerandil.com/v1/actions/hospitality.action.create_reservation/apply \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "branch": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "params": { "adults": 1, "arrival_date": "2026-04-15", "booked_at": "2026-04-15T12:00:00Z", "channel_reference": "example", "children": 1, "confirmation_number": "example", "departure_date": "2026-04-15", "deposit_due_at": "2026-04-15T12:00:00Z", "deposit_required_amount": { "amount": "example", "currency": "example" }, "external_ref": "example", "guarantee": "none", "guest_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "hold_expires_at": "2026-04-15T12:00:00Z", "market_segment": "transient", "nightly_rate": { "amount": "example", "currency": "example" }, "property_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "rate_plan_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "room_type_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "rooms": [ { "adults": 1, "children": 1, "nightly_rate": { "amount": "example", "currency": "example" }, "room_type_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0" } ], "session_id": "example", "source": "direct_web", "special_requests": "example", "visitor_id": "example" }, "return_modified": false }'

Open a new reservation against a property and rate plan. Single-room bookings pass room_type_id / adults / children / nightly_rate at top level; multi-room bookings pass one rooms entry per room instead (the handler rejects mixing the two shapes). A room’s nightly_rate is optional: passed, it books on every night; omitted, the room is priced night by night off the published rate_per_night grid for (property, rate plan, room type, adults) and a night with no published rate refuses by date. Reservation-level adults / children are the totals across rooms; the reservation-level room_type link is written only when every room shares one type — per-room truth always lives on reservation_room_for_room_type.

Effects: create hospitality.reservation; create hospitality.reservation_room; create hospitality.reservation_night; link hospitality.link.reservation_for_property; link hospitality.link.reservation_for_guest; link hospitality.link.reservation_uses_rate_plan; link hospitality.link.reservation_uses_cancellation_policy; link hospitality.link.reservation_for_room_type; link hospitality.link.reservation_has_room; link hospitality.link.reservation_room_for_room_type; link hospitality.link.reservation_room_has_night; link hospitality.link.reservation_night_uses_rate_plan; link hospitality.link.reservation_booked_in_session; modify hospitality.availability_day.

Media typeapplication/json
object
branch

Apply against an open branch’s overlay view instead of the canonical (main) plane. The action’s writes land in the branch’s copy-on-first-write overlay, its events in the branch’s own stream, and the invocation is journaled for merge-by-replay. Branch writes are action-only, so this is the write-side entry point to a branch (POST /v1/branches forks one).

string format: uuid
params
required
object
adults
Adults (single-room shape; required unless `rooms` is passed)
integer
arrival_date
required
Arrival
string format: date
booked_at
Booking instant (defaults to now; must not be in the future or after arrival)
string format: date-time
channel_reference
External channel reference (OTA confirmation / GDS locator)
string
children
Children (single-room shape; required unless `rooms` is passed)
integer
confirmation_number
Source-system confirmation number (connector loads only; defaults to a minted R-…)
string
departure_date
required
Departure
string format: date
deposit_due_at
Explicit deposit due instant (with deposit_required_amount)
string format: date-time
deposit_required_amount
Explicit deposit amount (with deposit_due_at; overrides policy derivation)
object
amount
required
string format: decimal
currency
required
string format: iso-4217
external_ref
Source-system key (connector loads only; makes creation replay-safe)
string
guarantee
Protection posture (default `none`)
string
Allowed values: none hold credit_card deposit prepaid corporate_billed voucher
guest_id
required
Primary guest
string format: uuid
hold_expires_at
When a `hold` guarantee lapses (required with hold, forbidden otherwise)
string format: date-time
market_segment
Demand segment (transient / group / contract)
string
Allowed values: transient group contract
nightly_rate
Nightly rate (omit to price off the grid)
object
amount
required
string format: decimal
currency
required
string format: iso-4217
property_id
required
Property
string format: uuid
rate_plan_id
required
Rate plan
string format: uuid
room_type_id
Room type (single-room shape; required unless `rooms` is passed)
string format: uuid
rooms
Per-room slices for a multi-room booking (one reservation_room each)
Array<object>
object
adults
required
integer
children
required
integer
nightly_rate
object
amount
required
string format: decimal
currency
required
string format: iso-4217
room_type_id
required
string format: uuid
session_id
Shopping session the booking was made in (its first offer's id)
string
source
Booking channel (defaults to direct_web)
string
Allowed values: direct_web direct_call property_direct ota gds wholesale corporate walk_in group_block agent loyalty
special_requests
Special requests (cot, dietary, accessibility, room preferences)
string
visitor_id
The booking engine's key for the browser that booked, when its tag read one
string
return_modified

When true, the response carries modified_objects and modified_links projections — the engine reads the event log inside the same transaction so the projection observes the handler’s own writes.

boolean

Action applied. modified_objects and modified_links populated when return_modified: true was supplied.

Media typeapplication/json
ApplyActionResponse

Envelope returned by the Aerandil action engine. correlation_id ties every event emitted by this invocation; modified_objects and modified_links project the events the handler emitted (per the action’s declared effects); warnings carries any non-blocking soft-validator observations.

object
correlation_id
required

Per-invocation correlation id; matches events.correlation_id for every event this action appended.

string format: uuid
modified_links
required

Links established or removed by this invocation. Empty when the caller did not request return_modified.

Array<object>
object
from_id
required
string format: uuid
from_type
required
string
kind
required
Allowed values: linked
link_type
required
Allowed values: hospitality.link.reservation_for_property hospitality.link.reservation_for_guest hospitality.link.reservation_uses_rate_plan hospitality.link.reservation_uses_cancellation_policy hospitality.link.reservation_for_room_type hospitality.link.reservation_has_room hospitality.link.reservation_room_for_room_type hospitality.link.reservation_room_has_night hospitality.link.reservation_night_uses_rate_plan hospitality.link.reservation_booked_in_session
to_id
required
string format: uuid
to_type
required
string
modified_objects
required

Objects created, modified, or soft-deleted by this invocation. Empty when the caller did not request return_modified.

Array<object>
object
id
required
string format: uuid
kind
required
Allowed values: created modified
object_type
required
Allowed values: hospitality.reservation hospitality.reservation_room hospitality.reservation_night hospitality.availability_day
warnings

Non-blocking soft-validator observations emitted during this invocation (e.g. comp-authority over-limit, recipe pour-cost over sell-price). Absent when no warnings were emitted.

Array<object>
object
message
required

Human-readable summary, suitable for logging or operator-UI surfacing.

string
object_type
required

Object type the warning was raised against.

string
property

Property the warning anchors to, when a single field is the locus. Absent for multi-field rules.

string
rule
required

Stable kebab-case rule identifier (e.g. comp-authority-over-limit).

string
Example
{
"modified_links": [
{
"kind": "linked",
"link_type": "hospitality.link.reservation_for_property"
}
],
"modified_objects": [
{
"kind": "created",
"object_type": "hospitality.reservation"
}
]
}

Conflict — concurrent modification or unique constraint violation.

Validation error — parameter validation or business-rule violation.