Skip to content

Apply channel reservation

POST
/v1/actions/hospitality.action.apply_channel_reservation/apply
curl --request POST \
--url https://api.aerandil.com/v1/actions/hospitality.action.apply_channel_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, "target": { "id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "object_type": "hospitality.channel_reservation_delivery" } }'

Land a received message in the ontology. This is the committed-upstream path, and it is the reason the seam exists: the sale completed on the partner’s side before we heard about it, so our selling ceiling and our restriction wall stop being gates. Oracle states the rule for a push channel plainly — inventory and restriction checks are bypassed because the booking is already committed upstream. Refusing here would not un-sell the room; it would only leave the house ignorant of a guest who is turning up. Where the booking goes past the ceiling the breach is counted on availability_day.committed_oversell and reported on the delivery as oversold_by, so the operator sees the exposure instead of a refusal. Booking parameters are the same set create_reservation takes, shared in code so the two cannot drift — a divergence would be a booking an OTA can make and the desk cannot represent. Serves the book intent only: a cancellation goes to cancel_channel_reservation, which needs a reservation and nothing else, and a restatement goes to restate_channel_reservation, which names both the reservation and the stay. Emits channel_reservation.applied.

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; modify hospitality.channel_reservation_delivery; link hospitality.link.reservation_delivery_produced_reservation.

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
target
required
object
id
required
string format: uuid
object_type
required
Allowed value: hospitality.channel_reservation_delivery

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 hospitality.link.reservation_delivery_produced_reservation
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 hospitality.channel_reservation_delivery
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.