---
title: "List Bookings Endpoint"
method: GET
path: "/api/v1/bookings"
tags: ["bookings"]
deprecated: true
---

# List Bookings Endpoint

`GET /api/v1/bookings`

> **Deprecated.**

Canonical bookings list. Default scope is Active (confirmed +
on-hold); pass ``status_code`` explicitly for the Cancelled view.

## Query parameters

- `property` string[], nullable
- `originating_channel` OriginatingChannel[], nullable
- `property_exclude` string[], nullable
- `originating_channel_exclude` OriginatingChannel[], nullable
- `wh_source_id` string, nullable
- `channelstream` boolean, nullable
- `status_code` BookingStatusCode[], nullable
- `origin` IngestionSource[], nullable
- `attribution_tier` AttributionTier[], nullable
- `booked_from` string, date-time, nullable
- `booked_to` string, date-time, nullable
- `stay_from` string, date, nullable
- `stay_to` string, date, nullable
- `cancelled_from` string, date-time, nullable
- `cancelled_to` string, date-time, nullable
- `discrepancy` 'feed_conflicts_human' — Booking-anchored discrepancy filter values (PR 6/PR 7). ``judged_without_reservation`` is log-anchored (a stamped log with NO canonical reservation) and therefore lives on the logs surface — a bookings list cannot show a booking that doesn't exist.
- `unknown_commission` boolean, nullable
- `limit` integer, nullable
- `offset` integer, nullable
- `page` integer, nullable — Deprecated - use offset.
- `per_page` integer, nullable — Deprecated - use limit.
- `start_date` string, date, nullable
- `end_date` string, date, nullable
- `date_field` string, nullable — Which timestamp the date range filters. Valid values differ per subject; an unknown one is a 422 listing them.
- `date_from` string, date-time, nullable — Deprecated - use start_date.
- `date_to` string, date-time, nullable — Deprecated - use end_date.
- `use_created_at` boolean, nullable — Deprecated - use date_field=created_at.
- `property_ids` string[], nullable
- `property_ids_exclude` string[], nullable
- `include_considered_hotels` boolean, nullable — Include hotels the conversation was only considered for, not just the one it was attributed to.
- `agent_id` string, uuid, nullable
- `outcome_agent_ref` string, nullable
- `outcome_agent_refs` string[], nullable
- `outcome_agent_refs_exclude` string[], nullable
- `outcome_agent_kind` 'ai_voice' | 'ai_text' | 'human', nullable
- `reviewed` boolean, nullable
- `status` string, nullable
- `has_booking_intent` boolean, nullable
- `has_booking` boolean, nullable
- `booking_made` boolean, nullable
- `booking_attributed` boolean, nullable
- `tag_ids` string[], nullable
- `country` string, nullable
- `is_after_hours` boolean, nullable
- `population_filters` string[], nullable — Named conversation-population filters: business_hours, min_call_25s, real_customer_message, exclude_spam_test, dedupe_24h.
- `search` string, nullable
- `standard_filters` string, nullable
- `metric_filters` string, nullable
- `sort_by` string, nullable
- `sort_order` 'asc' | 'desc', nullable
- `strict` boolean — Reject filters this subject cannot apply with a 422, instead of returning a wider population and reporting them in ignored_filters.
- `voice_agent_id` string, uuid, nullable — Deprecated - use agent_id.
- `metric_id` string, uuid, nullable — Deprecated - use metric_filters.
- `metric_state` 'pass' | 'fail' | 'na' | 'not_run' | 'error', nullable — Deprecated - use metric_filters.
- `booking_intent` boolean, nullable — Deprecated - use has_booking_intent.

## Response `200`

Successful Response

- LogListResponseBookingListItem
  - `items` BookingListItem[], required
    - `id` string, uuid, required
    - `reservation_id` string, required
    - `booked_at` string, date-time, required
    - `guest_name` string, nullable, required
    - `checkin` string, date, required
    - `checkout` string, date, required
    - `nights` 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).
    - `wh_source` string, nullable, required
    - `wh_source_id` string, 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).
    - `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.
    - `currency` string, required
    - `total_amount` string, nullable, required
    - `booking_group_id` string, uuid, nullable, required
  - `total` integer, required — Rows matching the filters, in `total_unit`s.
  - `limit` integer, required — Page size actually applied.
  - `offset` integer, required — Rows skipped.
  - `has_more` boolean, required — Whether another page exists.
  - `total_unit` 'logical_call' | 'row' — What `total` counts. `row` for text, email and bookings. `voice` returns `logical_call`, because a transferred call is several legs in `items` but one call in `total` — so a caller that counts `items` will legitimately disagree with `total`.
  - `applied_filters` string[] — Filters that were compiled into the query.
  - `ignored_filters` IgnoredFilter[] — Filters accepted but NOT applied by this subject, each with the reason. Send `strict=true` to make these a 422 instead.
    - `key` string, required — The query parameter that was not applied.
    - `reason` string, required — Operator-facing explanation, from the subject registry. This is the same sentence the UI shows in the disabled control's tooltip.
  - `page` integer, nullable — Deprecated — derive from `offset`/`limit`.
  - `per_page` integer, nullable — Deprecated — use `limit`.

## Other responses

- `401` — Authentication required
- `403` — Missing the required permission for these logs
- `422` — Invalid parameters: conflicting deprecated alias, inverted date range, unknown date_field, unsupported sort_by, or — with strict=true — a filter this subject cannot apply

---

[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/c0f54348e251/schema)
