Skip to content

Restate channel reservation

POST
/v1/actions/hospitality.action.restate_channel_reservation/apply
curl --request POST \
--url https://api.aerandil.com/v1/actions/hospitality.action.restate_channel_reservation/apply \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "branch": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "params": { "new_arrival_date": "2026-04-15", "new_departure_date": "2026-04-15", "override_nightly_rate": { "amount": "example", "currency": "example" }, "override_reason": "example", "pricing_policy": "keep_rate", "reservation_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0" }, "return_modified": false, "target": { "id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "object_type": "hospitality.channel_reservation_delivery" } }'

Apply a partner’s modification to a booking we already hold. A modification is a full restatement on every wire — SiteMinder re-send the whole reservation, Mews re-send the whole group and treat omission as cancellation — so this takes the stay as the partner now states it and moves ours to match, through the same date-change the front desk uses. Committed upstream, like apply_channel_reservation: the guest has already been told they can stay the extra night, so the selling ceiling and the restriction wall stop being gates and become facts to record. That is the whole reason this is a verb rather than a call to modify_reservation_dates — routing a channel restatement through the gated path would silently refuse exactly the extensions that matter, and leave the house expecting a guest to leave on a day the OTA has already sold them. Any breach lands on availability_day.committed_oversell and is reported on the delivery as oversold_by. Separate from apply_channel_reservation because the required sets differ: a restatement names the reservation it restates and the stay, where a booking names only the stay. A restatement that matches what we already hold is a no-op — which is the commonest case on a wire that re-sends everything. Restating the room type is not served here: a mid-stay room swap is a different unwind (see docs/deferred.md). Emits channel_reservation.applied.

Effects: modify hospitality.channel_reservation_delivery; link hospitality.link.reservation_delivery_produced_reservation; modify hospitality.reservation; modify hospitality.reservation_room; modify hospitality.availability_day; create hospitality.reservation_night; modify hospitality.reservation_night; delete hospitality.reservation_night; link hospitality.link.reservation_room_has_night; link hospitality.link.reservation_night_uses_rate_plan; modify hospitality.payment_request.

Step-up when pricing_policy is override: a person (a User principal) needs a fresh desk step-up proof — Pricing nights at a typed-in rate overrides the house’s published price — or the call is refused 403 step_up_required before anything runs. Re-enter the passcode at POST /v1/desk/sessions/{id}/passcode and retry. Machine principals are not gated.

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
new_arrival_date
required
Arrival date as the partner now states it
string format: date
new_departure_date
required
Departure date as the partner now states it
string format: date
override_nightly_rate
Nightly rate for pricing_policy = override
object
amount
required
string format: decimal
currency
required
string format: iso-4217
override_reason
Why the override price (required with pricing_policy = override)
string
pricing_policy
required
How affected nights re-price (required; never silent)
string
Allowed values: keep_rate requote requote_added_nights_only override
reservation_id
required
The reservation the partner restated
string format: uuid
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_delivery_produced_reservation hospitality.link.reservation_room_has_night hospitality.link.reservation_night_uses_rate_plan
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: modified created deleted
object_type
required
Allowed values: hospitality.channel_reservation_delivery hospitality.reservation hospitality.reservation_room hospitality.availability_day hospitality.reservation_night hospitality.payment_request
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_delivery_produced_reservation"
}
],
"modified_objects": [
{
"kind": "modified",
"object_type": "hospitality.channel_reservation_delivery"
}
]
}

step_up_required — a person applied this without a fresh desk step-up proof; nothing ran.

Conflict — concurrent modification or unique constraint violation.

Validation error — parameter validation or business-rule violation.