For Developers

A governance-first
distribution API.

One canonical booking lifecycle. An explicit error taxonomy. Contracted idempotency. A signed webhook catalog. Queryable lineage. PMS-agnostic by contract — build against one API, not per-partner special cases.

Authentication

Scoped to your authorization.

Your token is bound to the authorization the hotel scoped for you. A token cannot exceed its scope. OAuth 2.0 for partner platforms; API keys for server-to-server integrations.

key

OAuth 2.0

Recommended for partner platforms. Client credentials flow with scoped access tokens. Token expiry: 1 hour with auto-refresh.

Authorization: Bearer {scoped_access_token}
password

API Key

For server-to-server integrations. Pass your API key in the Authorization header. Keys scoped to a single environment.

Authorization: Bearer esc_live_...
The Booking Lifecycle

Quote. Revalidate. Confirm.

One canonical flow. Read availability, create the booking with an Idempotency-Key — the platform revalidates against the source of truth before confirmation.

Hotel Availability
# Conceptual: quote availability for a scoped rate plan
# (path and field names subject to integration review)

GET  {availability endpoint}
Authorization: Bearer {scoped_access_token}

# Conceptual query
property_id={property}&check_in={date}&check_out={date}
adults={n}&currency={iso4217}

# Conceptual response — freshness state is observable per slot
{
  "property": "{property}",
  "currency": "{iso4217}",
  "rate_plans": [
    {
      "rate_plan": "{rate_plan}",
      "room_type": "{room_type}",
      "freshness": "FRESH",                # FRESH | STALE_WARNING | STALE_BLOCKED
      "available": 4,
      "total": { "amount": 1240.00, "per_night": 413.33 }
    }
  ]
}
Create Booking
# Conceptual: hold and confirm under the canonical booking lifecycle
# (path and field names subject to integration review)

POST {confirm endpoint}
Authorization: Bearer {scoped_access_token}
Idempotency-Key: {unique_key}

{
  "property":  "{property}",
  "rate_plan": "{rate_plan}",
  "room_type": "{room_type}",
  "check_in":  "{date}",
  "check_out": "{date}",
  "guest":     { "first_name": "...", "last_name": "...", "email": "..." },
  "total":     { "currency": "{iso4217}", "amount": 1240.00 }
}

# Success: booking written with lineage to governance + commission + chain
# Drift:   409 PRICE_CHANGED with revalidated total — re-accept explicitly
# Stale:   409 STALE_INVENTORY_BLOCKED — re-quote
# Degrade: 503 PMS_UNAVAILABLE — fail closed; retry safe with same Idempotency-Key
API Trust

Predictable. Idempotent.
Auditable.

gavel

Governance-first contract

Authorization is scoped to your partner identity. Tokens cannot exceed scope. Every booking carries a governance decision id and is queryable.

sync_alt

One booking lifecycle

Quote → hold → revalidate → confirm. Same flow for every partner, every PMS. No per-partner special cases. Cancellations follow governance terms.

science

Sandbox by contract

Full sandbox with synthetic properties, partners, and scopes. Every lifecycle exercised. No real money movement until production.

webhook

Signed webhook catalog

Lifecycle, authorization, settlement, and incident events. HMAC-signed, at-least-once delivery, replay-safe via event id.

replay

Idempotency-Key contract

Same key + same payload → same result. Same key + different payload → 409. Retries on 5xx and network errors are safe with the same key.

error_outline

Explicit error taxonomy

409 PRICE_CHANGED · 409 STALE_INVENTORY · 409 CAPABILITY_DEGRADED · 422 GOVERNANCE_DENIED · 429 RATE_LIMITED — categories are stable, messages may evolve.

Request sandbox access.

Synthetic properties, partners, and scopes. Every lifecycle exercisable. No real money movement until production. Migration to production preserves your scope.