---
title: "Get Booking Detail Endpoint"
method: GET
path: "/api/v1/bookings/{booking_record_id}"
tags: ["bookings"]
deprecated: true
---

# Get Booking Detail Endpoint

`GET /api/v1/bookings/{booking_record_id}`

> **Deprecated.**

Full booking panel payload: identity/lifecycle, financials, room
lines + nights, external references, evidence links, customer links,
metric results.

## Path parameters

- `booking_record_id` string, uuid, required

## Response `200`

Successful Response

- BookingDetailResponse
  - `booking` BookingDetailRead, required
    - `id` string, uuid, required
    - `reservation_id` string, required
    - `booked_at` string, date-time, required
    - `cancelled_at` string, date-time, nullable, required
    - `cancellation_reason` string, nullable, required
    - `status` string, required
    - `status_code` 'confirmed' | 'on_hold' | 'cancelled' | 'purged', required — Normalized provider lifecycle status (WebHotelier ``statusCode``). PURGED rows keep their canonical row + evidence links but are excluded from all metrics.
    - `guest_first_name` string, nullable, required
    - `guest_last_name` string, nullable, required
    - `guest_name_raw` string, nullable, required
    - `guest_email` string, nullable, required
    - `guest_phone` string, nullable, required
    - `guest_country` string, nullable, required
    - `checkin` string, date, required
    - `checkout` string, date, required
    - `nights` integer, required
    - `adults` integer, required
    - `children` integer, required
    - `rooms` integer, required
    - `property_code` string, required
    - `property_name` string, required
    - `originating_channel` 'voice_agent' | 'text_agent' | 'hotel_agent' | 'ota' | 'website' | 'direct_pms' | 'unknown', required — Where a canonical booking originated (normalized channel attribution). NULL on ``BookingRecord`` means "not yet derived" (legacy rows before the PR 3 backfill); UNKNOWN means "derived but undeterminable" — the two are deliberately distinct (Direct Bookings ontology §6).
    - `ingestion_source` 'webhotelier_sync' | 'agent_tool' | 'legacy_backfill', required — Which pipeline wrote this canonical booking row.
    - `system_of_record` string, nullable, required
    - `wh_source` string, nullable, required
    - `wh_source_id` string, nullable, required
    - `channelstream` boolean, nullable, required
    - `offline` boolean, nullable, required
    - `referer` string, nullable, required
    - `remote_country` string, nullable, required
    - `external_id` string, nullable, required
    - `booking_group_id` string, uuid, nullable, required
    - `attribution_tier` 'verified' | 'attributed' | 'unattributed', required — Derived attribution tier of a canonical booking (settled vocabulary). Derived, never stored. VERIFIED requires an active primary link that is deterministic or human-confirmed. ATTRIBUTED means provisional conversation evidence exists, a legacy conversation pointer (``voice_call_id`` / ``text_session_id``) exists before canonical links are backfilled, **or** a determined commercial source (``originating_channel`` other than UNKNOWN / NULL) is already on the row. UNATTRIBUTED stays explicit for the true leftover: no conversation join, no legacy pointer, and no determined source — never a stand-in for OTA / website / voice_agent rows that already have a source (#2508).
    - `currency` string, required
    - `gross_total_amount` string, nullable, required
    - `room_subtotal_amount` string, nullable, required
    - `extras_amount` string, nullable, required
    - `taxes_amount` string, nullable, required
    - `total_amount` string, nullable, required
    - `total_commission_amount` string, nullable, required
    - `net_revenue_amount` string, nullable, required
    - `commission_priced` boolean, required
    - `commission_state` 'priced' | 'unpriced' | 'net_rate' | 'metasearch', required — How commission RESOLVED for one canonical booking (PR 19). PR 12 had exactly two outcomes — priced (rollups set) or unknown (rollups NULL). A net-rate booking is neither: it is fully resolved and owes nothing. Overloading NULL for it would park a wholesale channel's whole volume in the unknown-commission list forever and cap ``commission_coverage`` below 100% permanently, which turns the metric into noise an operator learns to ignore. - ``PRICED`` — cost components exist; the rollups are set. - ``UNPRICED`` — genuinely unknown: no applicable rule, missing gross for a rate rule, or a configuration error. A real coverage gap. - ``NET_RATE`` / ``METASEARCH`` — resolved, nothing payable per booking. Excluded from the ``unknown_commission`` filter and from the coverage denominator; the reason is kept rather than flattened to a single "not commissionable" so the booking panel can say the true thing. NULL on a booking means the engine has not run over it yet (the same fact as ``commission_computed_at IS NULL``) and reads as unknown.
  - `room_lines` BookingRoomLineDetail[], required
    - `id` string, uuid, required
    - `booking_record_id` string, uuid, required
    - `line_no` integer, required
    - `room_code` string, nullable, required
    - `room_name` string, nullable, required
    - `adults` integer, nullable, required
    - `children` integer, nullable, required
    - `line_total_amount` string, nullable, required
    - `tenant_id` string, uuid, required
    - `nights` BookingNightRead[]
      - `id` string, uuid, required
      - `room_line_id` string, uuid, required
      - `night_date` string, date, required
      - `price_amount` string, required
      - `tenant_id` string, uuid, required
  - `external_references` BookingExternalReferenceRead[], required
    - `id` string, uuid, required
    - `booking_record_id` string, uuid, required
    - `provider` string, required
    - `external_reservation_id` string, required
    - `tenant_id` string, uuid, required
  - `evidence_links` BookingEvidenceLinkDetail[], required
    - `id` string, uuid, required
    - `booking_record_id` string, uuid, required
    - `voice_call_id` string, uuid, nullable, required
    - `text_session_id` string, uuid, nullable, required
    - `investigation_id` string, uuid, nullable, required
    - `email_thread_id` string, uuid, nullable
    - `email_message_id` string, uuid, nullable
    - `relationship_type` string, nullable, required
    - `attribution_role` 'primary' | 'contributing', required — Role of an evidence link in a booking's attribution.
    - `confidence` number, nullable, required
    - `match_method` string, required
    - `confirmed_at` string, date-time, nullable, required
    - `superseded_at` string, date-time, nullable, required
    - `tenant_id` string, uuid, required
    - `voice_call_external_id` string, nullable
    - `email_thread_subject` string, nullable
    - `investigation_external_ticket_id` string, nullable
  - `customer_links` BookingCustomerLinkRead[], required
    - `id` string, uuid, required
    - `booking_record_id` string, uuid, required
    - `customer_profile_id` string, uuid, required
    - `role` 'booker' | 'primary_guest' | 'guest' | 'payer' | 'reservation_contact', required — Role a customer profile plays on a canonical booking.
    - `match_method` string, nullable, required
    - `tenant_id` string, uuid, required
  - `guest_identity_overrides` BookingGuestIdentityOverrideRead[], required
    - `id` string, uuid, required
    - `booking_record_id` string, uuid, required
    - `field` 'email' | 'phone', required — A guest contact field an operator can correct by hand (#2063). Deliberately narrow: email and phone are the two values identity resolution keys on, so they are the two worth a correction path. Name and stay facts stay provider-owned — a booking is a record of what the provider said, and editing those would make it a record of what we wished it said.
    - `value` string, required
    - `updated_by_user_id` string, uuid, nullable, required
    - `tenant_id` string, uuid, required
  - `metric_results` BookingMetricResultRead[], required
    - `id` string, uuid, required
    - `voice_call_id` string, uuid, nullable, required
    - `text_session_id` string, uuid, nullable, required
    - `custom_metric_id` string, uuid, required
    - `custom_metric_name` string, required
    - `result_state` 'pass' | 'fail' | 'na' | 'not_run' | 'error', required
    - `passed` boolean, nullable, required
    - `score` number, nullable, required
    - `categorical_value` string, nullable, required
    - `evaluated_at` string, date-time, required
    - `override_result_state` 'pass' | 'fail' | 'na' | 'not_run' | 'error'
    - `override_categorical_value` string, nullable
    - `override_score` number, nullable
  - `cost_components` BookingCostComponentRead[], required
    - `id` string, uuid, required
    - `booking_record_id` string, uuid, required
    - `commission_rule_id` string, uuid, required
    - `cost_type` string, required
    - `basis` 'estimated' | 'actual', required — Whether a cost component's amount is estimated or actual (PR 12). ESTIMATED = computed from an effective-dated ``CommissionRule`` at ingest/recompute time. ACTUAL = a provider-reported invoice amount (no V1 writer produces these yet; the field exists so fee lines can cite actual-vs-estimated per the settled ledger).
    - `amount` string, required
    - `currency` string, required
    - `applied_rate` string, nullable, required
    - `applied_fixed_amount` string, nullable, required
    - `rule_contract_version` string, required
    - `computed_at` string, date-time, required
    - `tenant_id` string, uuid, required

## Other responses

- `422` — Validation Error

## Changes

- **2026-09-03** `d65b8fefae34` — 14 info
  - added the optional property `detail/items/ctx` to the response with the `422` status
  - added the optional property `detail/items/input` to the response with the `422` status
  - the `booking/extras_amount/anyOf[subschema #1]/` response's property pattern `^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$` was added for the status `200`
  - the `booking/gross_total_amount/anyOf[subschema #1]/` response's property pattern `^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$` was added for the status `200`
  - …10 more

[Change history](https://skmtc.dev/getanana/apis/cleon-api/changes/api/v1/bookings/:booking_record_id/get.md)

---

[API](https://skmtc.dev/getanana/apis/cleon-api.md) · [All operations](https://skmtc.dev/getanana/apis/cleon-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/getanana/cleon-api/revisions/a9141b6e4e7e/schema)
