Skip to content

What-if Request approval gate (rollup delta)

POST
/v1/actions/hospitality.action.request_approval_gate/whatif
curl --request POST \
--url https://api.aerandil.com/v1/actions/hospitality.action.request_approval_gate/whatif \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "branch": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "params": { "approval_strategy": "any_one", "context_snapshot": "example", "eligible_principal_ids": [ "example" ], "eligible_role_refs": [ "example" ], "excluded_principal_ids": [ "example" ], "expires_at": "2026-04-15T12:00:00Z", "external_reference": "example", "gate_key": "example", "notification_target": "in_product", "required_approval_count": 1, "risk_tier": "read_only" }, "return_modified": false }'

What-if projection of apply_hospitality_action_request_approval_gate — previews the action (execute-and-roll-back) and folds its would-be events into rollup deltas, returning the contribution an apply would make to the daily_rooms fact (ADR / RevPAR / TRevPAR / Occupancy inputs) without persisting anything. Requires the same actions:hospitality.action.request_approval_gate:apply scope as apply. An action that emits no rooms-fact events yields an empty daily_rooms.

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
approval_strategy
required
How the gate combines decisions
string
Allowed values: any_one all quorum role_based ordered_chain separation_of_duties
context_snapshot
required
Frozen, redacted facts shown to approvers
eligible_principal_ids
Exact eligible principals (Principal::stable_id() shape)
Array<string>
eligible_role_refs
Staff roles / groups that may approve
Array<string>
excluded_principal_ids
Requesting agent / author / conflicted principals
Array<string>
expires_at
Gate timeout
string format: date-time
external_reference
Slack ts, Linear issue id, PMS task id, email thread id, etc.
string
gate_key
required
Stable within the workflow run or action correlation id
string
notification_target
Where the gate notification surfaced
string
Allowed values: in_product slack linear email pms_task webhook other
required_approval_count
Required for approval_strategy = quorum
integer
risk_tier
required
Risk tier of the guarded step / action
string
Allowed values: read_only internal_write guest_message money_movement identity_or_fraud clinical_or_regulated other_high_risk
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

Rollup deltas the action would contribute, computed and rolled back.

Media typeapplication/json
object
daily_rooms
required

Per (property, business_date) additive contribution to the rooms rollup.

Array<object>
object
business_date
required
string format: date
currency

ISO 4217, when the fold observed one.

string
property_id
required
string format: uuid
rooms_revenue_net_delta
required

Decimal, net rooms revenue delta.

string
rooms_sold_delta
required
integer format: int64
total_revenue_net_delta
required

Decimal, net total revenue delta.

string
Examplegenerated
{
"daily_rooms": [
{
"business_date": "2026-04-15",
"currency": "example",
"property_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"rooms_revenue_net_delta": "example",
"rooms_sold_delta": 1,
"total_revenue_net_delta": "example"
}
]
}
Cache-Control
string
Allowed value: no-store

Always no-store — derived, uncommitted data.

Validation error — the apply would be rejected.