---
title: "List Booking Providers"
method: GET
path: "/api/v1/bookings/providers"
tags: ["commission-rules"]
---

# List Booking Providers

`GET /api/v1/bookings/providers`

The tenant's observed OTAs plus the effective-date default.

``wh_source_id`` is a raw filter value everywhere else in the product
with no facet endpoint behind it; a rule form that asked for it as free
text would be asking a hotelier to type "171". This returns the label
to show, the id to submit, and the booking count that makes a
mis-scoped rule obvious before it prices anything.

## Response `200`

Successful Response

- BookingProvidersResponse — Provider facet + the effective-date default for the rule form. ``earliest_booked_at`` is the tenant's oldest booking date and the default for ``CommissionRule.effective_from``; NULL when the tenant has no bookings at all.
  - `providers` BookingProviderOption[], required
    - `wh_source_id` string, required
    - `wh_source` string, nullable, required
    - `booking_count` integer, required
    - `suggested_default` SourceContractSuggestion — A catalog suggestion for one source (never a saved rule). ``requires_rate`` is the honesty boundary: a commissionable suggestion is INCOMPLETE — we know the shape of the contract but not the customer's rate, and the band is a hint for them to correct, not a number we will price with. Only non-charging suggestions (``requires_rate`` false) are complete enough for a confirmed bulk "start from suggested defaults" to create.
      - `source_label` string, required
      - `contract_basis` 'commissionable' | 'net_rate' | 'metasearch' | 'own_cost', required — What kind of commercial arrangement a ``CommissionRule`` records (PR 19). A rate is not a contract. "18% of gross" and "we are paid a contracted net amount" are different economics, and applying the first shape to the second produces a confident €0.00 rather than a missing number — the most expensive channel in the portfolio rendered as free. - ``COMMISSIONABLE`` — the hotel sets the rate and the provider invoices a percentage (or a flat fee). The PR 12 behaviour, and the default so every pre-PR-19 row keeps exactly the meaning it had. - ``NET_RATE`` — the hotel is paid a contracted net amount; the provider's margin is not a cost the hotel pays. No commission is computed, and the reported value (when present) already IS the net. - ``METASEARCH`` — billed per click or per campaign, never per booking. The rule records the arrangement so the source does not read as free; CPC spend has no per-booking home and this PR does not invent one. - ``OWN_COST`` — the hotel's own per-booking costs on direct business (payment gateway, booking engine). Computes exactly like ``COMMISSIONABLE``; kept separate so "distribution cost" and "cost of taking a direct booking" never render as the same line. ``NET_RATE`` and ``METASEARCH`` carry NO charge (a CHECK enforces it): a percentage on a net-rate rule is a configuration error that would otherwise price silently.
      - `typical_rate_low` string, nullable, required
      - `typical_rate_high` string, nullable, required
      - `requires_rate` boolean, required
      - `note` string, required
  - `earliest_booked_at` string, date, nullable, required

---

[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)
