Read Package sale
const url = 'https://api.aerandil.com/v1/object-types/hospitality.package_sale/objects/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url https://api.aerandil.com/v1/object-types/hospitality.package_sale/objects/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0 \ --header 'Authorization: Bearer <token>'Read an existing instance.
A reservation-attached instance of a package. Freezes the package definition at sale time via package_version_snapshot so guests cannot be re-priced when the catalog evolves — the snapshot is the structural snapshot half of the design-spec §B.2 structured-policy + immutable-snapshot pattern. contracted_price is the amount the guest agreed to pay for the wrapper; state tracks the lifecycle from pending through consumed / refunded / cancelled.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Object id (UUID v7, server-generated at create time).
Query Parameters
Section titled “Query Parameters”Read through an open branch’s copy-on-first-write overlay view instead of the canonical (main) plane. Does not compose with as_of (422). The branch must exist under the caller’s tenant.
Responses
Section titled “Responses”Object found.
object
object
Counts up by one with every consumption written through the package write (a room charge’s allowance, a roster tick-off, an operator’s consume). The write is the sale’s version check: a recorder that weighed what was left of a day’s allowance writes the sale at the version it read before summing the day’s rows, so a concurrent draw on the same sale turns the second into a version conflict instead of two draws on one remainder.
Wrapper price at sale time
object
Per-property source attribution and pins. An entry under properties means the property’s current value came from that source (on the source’s own clock, source_updated_at); an entry under pins is a human override protecting the property from sourced writes.
object
object
object
object
object
object
object
object
object
object
object
Example
{ "object_type": "hospitality.package_sale", "properties": { "state": "pending" }, "scope": { "level": "tenant" }}Headers
Section titled “Headers”Quoted strong validator (RFC 7232 §2.3) carrying the object’s monotonic version. Informational on the read path — object mutation goes through typed actions on /v1/actions/{action}/apply, not raw CRUD.
No object with that id (or soft-deleted).