BookingClub Developer Platform

BookingClub Inner API v1

Search properties, check live availability, create bookings, cancel or modify orders, and test requests in the same-origin console with a demo or live key.

Base URL https://api.bookingclub.net/v1 OpenAPI /v1/openapi.json Updated 2026-07-31
Demo and Live keysDemo keys create isolated demo bookings. Live keys use the real operational booking flow.
Hotel, tour, transferOne JSON API for internal contracts, enabled provider stock and visible WTX products.
Built-in controlsScopes, IP rules, rate limits, request logging, billing and API commissions are handled per key.

Authentication

Every API request uses a client API key. Demo keys create demo bookings. Live keys create normal operational bookings.

Authorization: Bearer YOUR_API_KEY
Content-Type: application/json

God Mode can set scopes, allowed IPs, logging mode, request limits, billing mode, request cost and API commission per key.

Common Rules

RuleDetails
Response formatAll responses are JSON: success, requestId, data, errors.
DatesUse YYYY-MM-DD.
CurrencyAny endpoint returning a new price requires currency. Booking detail, cancel quote and cancel return the original booking currency and do not accept currency.
NationalitynationalityId is optional. Use GET /reference/nationalities to list values.
ChildrenSend childrenAges only when there are children. Ages must be integers from 0 to 17; at most 10 children are accepted per room/item.
Request sizeJSON request bodies are limited to 1 MiB.
IdempotencyWrite endpoints require a 1-128 character visible ASCII Idempotency-Key without spaces. Retrying the exact same request with the same key returns the saved response without creating a duplicate booking. POST /bookings also blocks the same booking payload sent again too quickly with a different key.
VisibilityProducts include supervisor internal contracts, enabled TL/TL2 products and WTX products visible to the supervisor.
EnvironmentDemo keys can read/change only demo orders. Live keys exclude demo orders and operate on normal/live orders for the same supervisor and client.
BillingGod Mode request billing counts successful requests. Depending on key settings, requests may be free, per-request paid, or monthly quota plus paid extra.
Pagination is 1-based. Reference, tour, transfer and booking lists accept pages up to 1000.

Simulator

Requests are sent directly from this browser to https://api.bookingclub.net/v1. The key is kept only in this page's memory and is not saved. Production integrations must keep API keys server-side; never embed a live key in public browser or mobile-app code.
{}

Reference Data

EndpointQueryScope
GET /reference/countriesq, language, page, limitreference:read
GET /reference/regionscountryId, q, language, page, limitreference:read
GET /reference/citiescountryId, regionId, q, language, page, limitreference:read
GET /reference/airportscountryId, regionId, cityId, q, language, page, limitreference:read
GET /reference/currenciesq, page, limitreference:read
GET /reference/currency-ratesNonereference:read
GET /reference/nationalitiesq, page, limitreference:read
GET /reference/languagesq, language, page, limitreference:read
GET /reference/meal-plansq, page, limitreference:read

Properties

EndpointRequiredOptionalScope
GET /propertiesNonename, propertyId, countryId, regionId, cityId, source, updatedSince, page, limitproperties:read
GET /properties/{propertyId}propertyIdNoneproperties:read
A propertyId may represent an internal hotel, TL/TL2 hotel, or WTX product. Use the returned ID exactly as received. Property pages are limited to 100; use source, location, name, updatedSince, or an exact propertyId for targeted catalog discovery.

Hotel Availability

POST /hotels/availability requires scope availability:read.

FieldRequiredDetails
propertyIdYesUse ID from /properties.
checkIn, checkOutYescheckOut must be after checkIn.
currencyYesRequired because prices are returned.
rooms[].adultsYesAdult count per room.
rooms[].childrenAgesNoRequired only when children are present.
nationalityIdNoOptional nationality.
{
  "propertyId": "24",
  "checkIn": "2026-08-31",
  "checkOut": "2026-09-02",
  "currency": "USD",
  "nationalityId": 1,
  "rooms": [
    {"adults": 2, "childrenAges": []}
  ]
}

Tours

EndpointRequiredOptionalScope
GET /toursNonename, countryId, cityId, page, limittours:read
GET /tours/{tourId}tourIdNonetours:read
POST /tours/availabilitytourId, checkIn, checkOut, currency, adultschildrenAges, vehicleId, languageId, nationalityIdtours:read + availability:read

Transfers

EndpointRequiredOptionalScope
GET /transfersNonename, countryId, cityId, page, limittransfers:read
GET /transfers/{transferId}transferIdNonetransfers:read
POST /transfers/availabilitytransferKind, checkIn, currency, adults, route fieldstransferId, vehicleId, childrenAges, nationalityId, flightNumber, time, hotel IDstransfers:read + availability:read
transferKindRequired route fields
1 arrivalpickupAirportId, dropOffCityId
2 point to pointpickupCityId, dropOffCityId
3 departurepickupCityId, dropOffAirportId
Hotel route fields use the numeric internal propertyId returned by GET /properties, not a user_accomodations.id row ID.

Bookings

EndpointRequiredOptionalScope
POST /bookingsholder.firstName, holder.lastName, items[].type, items[].rateToken, items[].guests[].firstName, items[].guests[].lastName, Idempotency-KeyclientReference, holder.email, holder.phone, note, specialRequests, guest gender/type/agebookings:create
GET /bookingsNonebookingNumber, clientReference, status integer 0-9, bookingDateFrom, bookingDateTo, firstCheckInFrom, firstCheckInTo, page, limitbookings:read
GET /bookings/{bookingNumber}bookingNumberNonebookings:read
{
  "clientReference": "AGENCY-123",
  "holder": {"firstName": "Ali", "lastName": "Valiyev", "email": "[email protected]"},
  "items": [
    {
      "type": "hotel",
      "rateToken": "rt_...",
      "guests": [
        {"firstName": "Ali", "lastName": "Valiyev"},
        {"firstName": "Leyla", "lastName": "Valiyeva"}
      ],
      "specialRequests": "High floor"
    }
  ]
}
List filters match runtime names: use bookingDateFrom/bookingDateTo for booking creation date and firstCheckInFrom/firstCheckInTo for the first item check-in. status is an integer code from 0 to 9; text values such as pending are rejected.
If price changed, booking returns PRICE_CHANGED. If availability is not enough, booking returns INSUFFICIENT_AVAILABILITY or NOT_AVAILABLE. Request availability again and use the new rateToken.

Cancel

EndpointRequiredOptionalScope
POST /bookings/{bookingNumber}/cancel-quotebookingNumberitemIdsbookings:cancel
POST /bookings/{bookingNumber}/cancelbookingNumber, confirm=true, cancelToken, Idempotency-KeyitemIdsbookings:cancel

Call cancel-quote first, then send back the cancelToken it returns. cancel-quote calculates penalty only and returns a top-level cancelToken (opaque signed string, prefix rt_, ~15 min TTL). cancel applies cancellation and requires a JSON body containing {"confirm": true} plus the cancelToken from the quote. Both use the original booking currency. itemIds is optional; omit it or send an empty array to target all cancellable items.

A missing cancelToken returns VALIDATION_ERROR. The token binds the booking items and their quoted state. If a penalty or booking item changed, cancellation is rejected and a fresh quote is required. If provider cancellation fails, the local item is not marked cancelled. Multiple confirmed provider items must be quoted and cancelled one at a time with explicit itemIds.

Modify

EndpointRequiredOptionalScope
POST /bookings/{bookingNumber}/modify-quotebookingNumber, itemId, at least one changeguests, specialRequests, bookingComment, customerComment, checkIn, checkOut, roomId, contractId, adults, childrenAges, currencybookings:modify
POST /bookings/{bookingNumber}/modifybookingNumber, itemId, confirm=true, at least one change, modifyToken (price-affecting changes only), Idempotency-Keyguests, specialRequests, bookingComment, customerComment, checkIn, checkOut, roomId, contractId, adults, childrenAges, currencybookings:modify
PATCH /bookings/{bookingNumber}bookingNumber, itemId, confirm=true, at least one change, modifyToken (price-affecting changes only), Idempotency-KeySame body as POST /bookings/{bookingNumber}/modify; compatibility alias for older clients.bookings:modify
Call modify-quote first, then send back the same intended changes with confirm=true and the modifyToken it returned. For a price-affecting change, the token binds the exact requested changes, booking-item state and quoted price; it is only present for price-affecting quotes. modifyToken is required only for price-affecting changes. Price-changing modify supports direct internal pending hotel items and direct TL2 API bookings when provider penalty is zero and only date/occupancy changes are requested. WTX-backed, paid or commission-paid items require manual review. If occupancy changes, send the full matching guests list. PATCH /bookings/{bookingNumber} remains a compatibility alias.
A missing modifyToken on a price-affecting modify returns VALIDATION_ERROR (field modifyToken). If the price changed since the quote, modify returns PRICE_CHANGED (field modifyToken) with details.quotedPrice and details.currentPrice; call modify-quote again for a fresh modifyToken. A price-affecting modify to a stay whose check-in is today or in the past returns NOT_MODIFIABLE.
{
  "itemId": 12345,
  "modifyToken": "rt_...",
  "changes": {
    "checkIn": "2026-08-31",
    "checkOut": "2026-09-02",
    "adults": 2,
    "childrenAges": [],
    "currency": "USD",
    "guests": [
      {"firstName": "Ali", "lastName": "Valiyev", "type": "adult"},
      {"firstName": "Leyla", "lastName": "Valiyeva", "type": "adult"}
    ]
  }
}

Errors

Errors include a stable code, developer-readable message, optional field and hint.

{
  "success": false,
  "requestId": "req_20260617_120000_ab12cd34",
  "data": null,
  "errors": [
    {
      "code": "VALIDATION_ERROR",
      "message": "holder.firstName is required.",
      "field": "holder.firstName",
      "hint": ""
    }
  ]
}
CodeMeaning
UNAUTHORIZEDMissing or invalid Authorization header.
KEY_INVALIDAPI key is invalid.
KEY_DISABLEDAPI key is disabled.
FORBIDDEN_SCOPEKey does not have the required scope.
IP_NOT_ALLOWEDRequest IP is not allowed for the key.
RATE_LIMITEDMinute, hour or day request limit exceeded.
RATE_LIMIT_UNAVAILABLERate-limit storage is temporarily unavailable; retry shortly.
PAYLOAD_TOO_LARGERequest body exceeds the 1 MiB limit.
VALIDATION_ERRORRequest body, query or route parameter is invalid.
NOT_FOUNDRequested route or resource does not exist.
METHOD_NOT_ALLOWEDHTTP method is not allowed for this route.
UNSUPPORTED_MEDIA_TYPERequest Content-Type is not supported; use application/json.
INVALID_REFERENCEA referenced id such as a rate token or currency is invalid or expired.
MISSING_PRICING_CONTEXTRequired pricing context for the request is missing.
IDEMPOTENCY_KEY_REUSEDSame idempotency key was used for a different request.
IDEMPOTENCY_IN_PROGRESSSame idempotency key is still being processed.
DUPLICATE_BOOKING_REQUESTSame booking creation payload was sent again too quickly with a different idempotency key.
PRICE_CHANGEDSelected rate price changed during booking revalidation.
BOOKING_CHANGEDBooking item changed after quote/preparation; fetch it and quote again.
PENALTY_UNAVAILABLEProvider penalty could not be verified, so cancellation was not attempted.
ACCOUNTING_STATE_INVALIDRequired debt/accounting state is missing, so the money-changing operation was not attempted.
INSUFFICIENT_AVAILABILITY, NOT_AVAILABLESelected product/rate is no longer available in the requested quantity.
NOT_CANCELLABLEBooking or item can not be cancelled through the API.
CANCEL_ITEMS_INDIVIDUALLYProvider-backed items must be quoted/cancelled one at a time.
NOT_MODIFIABLEBooking or item can not be modified through the API.
MODIFY_NOT_SUPPORTEDModification is not supported for this booking or item type.
MODIFY_PRICE_CHANGE_NOT_SUPPORTED, MODIFY_REQUIRES_MANUAL_REVIEWRequested modification can not be safely completed automatically.
EXTERNAL_API_ERRORProvider rejected or failed a synced API booking operation.
INTERNAL_ERRORUnexpected server error. Send the requestId to BookingClub support.