Skip to content

Search V2 API

Preferred Search Flow

  1. List levelGET /api/v2/search (called without the packages parameter) to retrieve a destination / multi-property overview and decide which property to drill into.
  2. Detailed property levelGET /api/v2/properties/{id}/packages to fetch full room and package details for the selected property.

This 2-step search returns mapped rooms, named according to Bookit static content, and is the recommended, load-optimal integration. Keeping the overview call lightweight (no packages parameter) minimizes payload size and traffic. This flow is only allowed for the direct integrations that serve the results directly to the end user. Not allowed for the aggregators or resellers.

If the 2-step flow is not feasible for your use case, the single-request batch endpoint GET /api/v2/properties/packages is a 1-step search that returns unmapped rooms. It is convenient but heavier, it terms of traffic, — it produces substantially more traffic — so use it only as a fallback and keep batches to ≤100 hotels per request.

Aggregators & Resellers

Aggregators and resellers MUST only use the GET /api/v2/properties/packages endpoint. The GET /api/v2/properties/{id}/packages endpoint is only intended for direct integrations that serve the results directly to the end user.

Rate & Room Semantics

Topic Behavior
Room names & categories Not taken from the hotel's own website categories. In the 2-step search they follow Bookit static content (mapped); in the 1-step batch search they are unmapped (supplier-provided).
Rate name language For most properties room/rate names are in English. Some properties expose names in their local language, in which case the package name is non-English.
Market Price Available only for endpoints that return mapped rates (the 2-step search), surfaced via the marketPrice field. Not available for unmapped (1-step) results.
Rack price Not provided.
On-request rates Not supplied. All returned rates are immediate-confirmation rates, so there is nothing to disable.
Allotment / remaining rooms No parameter indicates the number of remaining rooms at the same conditions and price.

Limits & Constraints

Bookit does not impose explicit limits on the following — they are constrained only by the downstream supplier/hotel. If a requested value is not supported downstream, that property simply returns no results (no specific error is raised).

Constraint Bookit limit
Hotels per batch request (GET /api/v2/properties/packages) No hard limit; 100 hotels per request is recommended.
Rooms per reservation No explicit limit.
Occupancy per room (adults, children, adults + children) No explicit limit.
Length of stay No explicit limit.
Booking window (time between booking creation and check-in) No explicit limit.
Children ages Integers 1–17 (see Occupancy Format below).

GET /api/v2/search

Search for available properties with minimal static information and rate summaries. This is a lazy-load endpoint that returns properties with pricing information. The endpoint should be polled until the isDone field in the response is set to true. Use this endpoint when searching for a large number of properties to only see the lowest rates we offer. To fetch detailed data for a property, see the Packages Endpoint

Authentication: Required (X-Api-Key)

Query Parameters:

Required Parameters

Parameter Type Description
checkIn string (YYYY-MM-DD) Check-in date. Example: 2025-10-06
checkOut string (YYYY-MM-DD) Check-out date. Must be after checkIn. Example: 2025-10-07
occupancies string Occupancy information for all rooms. See Occupancy Format below
residency string Guest residency country code (ISO-3166-1 alpha-2). Example: FR
eager boolean If set to true, response will only be returned when the search has fully completed
Occupancy Format

The occupancies parameter uses a semicolon-separated format for multiple rooms:

{ADULT_COUNT_0}-{CHILDREN_AGE_0},{CHILDREN_AGE_1};{ADULT_COUNT_1}-{CHILDREN_AGE_1_0},{CHILDREN_AGE_1_1}
  • Each room is separated by ;
  • Format for each room: {adults}-{childAge1},{childAge2}
  • If no children, use {adults}- (trailing dash required)

Examples:

# Room 1: 2 adults, no children
# Room 2: 2 adults, children ages 5 and 4
2-;2-5,4

# Single room: 2 adults, 1 child age 8
2-8

# Single room: 3 adults, no children
3-

Children ages

Children ages are passed as integers (in occupancies here, and in rooms[].occupancy.childrenAges at the book step). Supported ages are 1–17. There is no sub-division into categories such as babies, infants, toddlers, or teens, and no automatic conversion of children to adults based on a hotel's own age policy. If the supplied occupancy is not accepted by a hotel, that property simply returns no results.

Residency

There are no residency restrictions on the Bookit side — any valid residency country code is accepted. Availability and pricing for a given residency still depend on the downstream supplier.

Filter Parameters

Parameter Type Description
longitude number Longitude for geo-based search. Requires latitude and radius. Example: 2.3522
latitude number Latitude for geo-based search. Requires longitude and radius. Example: 48.8566
radius number Radius in meters. Requires longitude and latitude. Example: 5000
city string City name filter
country string Country code (ISO-3166-1 alpha-2). Example: FR
name string Property name filter (partial match)
propertyTypes string[] Property type filter. Use enum values from Property Types table. Example: propertyTypes=Hotel&propertyTypes=Resort
stars integer[] Star rating filter (0-5). Example: stars=4&stars=5
amenityTypes string[] Amenity type filter. Use enum values from Amenity Types table. Example: amenityTypes=WiFi&amenityTypes=SwimmingPool
minPrice number Minimum total price filter (in USD)
maxPrice number Maximum total price filter (in USD)
ids string[] List of property bookitId values to filter by. Example: ids=R:123&ids=R:456. Support for deprecated numeric IDs may be removed in the future.

Sort Parameters

Parameter Type Description
sortBy string Sort criteria. Options: price, discount, distance, rating, rank (default: price)
sortDirection string Sort direction. Options: asc, ascending, desc, descending (default: asc)

Pagination Parameters

Parameter Type Description
limit integer Number of results per page (default: 100)
offset integer Number of results to skip (default: 0)

Optional Parameters

Parameter Type Description
packages integer Number of cheapest packages to include for each property in the response (max: 10). If omitted or 0, the packages field is not returned
supplierTimeout number Maximum time in seconds allowed for each supplier to respond. Partial results from faster suppliers are still returned if a supplier exceeds this timeout

Example Request:

curl -H "X-Api-Key: YOUR_KEY" \
     "<BASE_URL>/api/v2/search?checkIn=2026-10-06&checkOut=2026-10-07&occupancies=2-&residency=FR&country=FR&city=Paris&limit=20&packages=2"

Responses:

  • 200 OK: JSON search results
  • 400 Bad Request: Invalid query parameters (e.g., missing required parameters, invalid date range, invalid occupancy format)
  • 401 Unauthorized: Invalid/missing API key
  • 429 Too Many Requests: Rate limit exceeded
  • 502 Bad Gateway: Upstream service failure

Response Schema (200 OK):

Field Type Description
isDone boolean Indicates if the search processing is complete. Poll until isDone = true to get all results
total integer Total number of matching properties
limit integer Number of results per page
offset integer Number of results skipped
properties array Array of property objects with minimal information
properties[].id string DEPRECATED, use bookitId instead. This value will be removed in future API updates
properties[].bookitId string Unique property identifier
properties[].name string Property name
properties[].price number Minimum total price (in USD)
properties[].discount integer Maximum discount percentage
properties[].isDone boolean Indicates if rate loading is complete for this property
properties[].packages array/undefined Cheapest packages for this property. Only present when packages query parameter > 0
properties[].packages[].room object Room information
properties[].packages[].room.id string Room identifier
properties[].packages[].room.name string Room name
properties[].packages[].package object Package/quote details
properties[].packages[].package.id string Package identifier
properties[].packages[].package.boardType string Board/meal plan. See Board Types table in packages endpoint
properties[].packages[].package.board object More detailed board description, including the count. Omitted when no board details are available. See Board Conditions in packages endpoint
properties[].packages[].package.board.type string Board/meal plan. Same values as boardType
properties[].packages[].package.board.count integer Guests the board covers. Omitted when no count is available
properties[].packages[].package.totalPrice object
properties[].packages[].package.totalPrice.amount number Total amount
properties[].packages[].package.totalPrice.currency string Currency code
properties[].packages[].package.marketPrice object/null Market price for comparison (if available)
properties[].packages[].package.marketPrice.amount number Market price amount
properties[].packages[].package.marketPrice.currency string Currency code
properties[].packages[].package.recommendedSalePrice object/null The recommended sale price for the package. Can be null or contain a value. Represents the minimum price that must be paid for this package. Must be respected when provided
properties[].packages[].package.recommendedSalePrice.amount number Recommended sale price amount
properties[].packages[].package.recommendedSalePrice.currency string Currency code
properties[].packages[].package.discountPercentage integer/null Discount percentage compared to market price
properties[].packages[].package.taxesAndFees array Taxes and mandatory fees
properties[].packages[].package.taxesAndFees[].currency string Currency code
properties[].packages[].package.taxesAndFees[].title string Fee or tax name
properties[].packages[].package.taxesAndFees[].isIncludedInPrice boolean Whether the amount is included in totalPrice
properties[].packages[].package.taxesAndFees[].isMandatory boolean
properties[].packages[].package.taxesAndFees[].value number Amount of the tax/fee
properties[].packages[].package.cancellationPolicy object Cancellation summary
properties[].packages[].package.cancellationPolicy.isRefundable boolean Indicates whether the package is refundable
properties[].packages[].package.cancellationPolicy.fullRefundability object/null Window for full refund (if refundable)
properties[].packages[].package.cancellationPolicy.fullRefundability.from string Earliest date/time for full refund
properties[].packages[].package.cancellationPolicy.fullRefundability.to string Last date/time for full refund

!!! IMPORTANT: polling is required.

This endpoint uses lazy loading for rates. response.isDone = true indicates that the search has fully completedd for all of the properties. properties[].isDone = true indicates that the search has completed for that specific property. The recommended polling interval is 2 seconds.

Example Response:

{
  "isDone": false,
  "total": 150,
  "limit": 20,
  "offset": 0,
  "properties": [
    {
      "id": "12345",
      "bookitId": "R:54321",
      "name": "Grand Hotel Paris",
      "price": 245.50,
      "discount": 15,
      "isDone": true,
      "packages": [
        {
          "room": {
            "id": "room-001",
            "name": "Deluxe Room"
          },
          "package": {
            "id": "eyJTZWFyY2giOns...",
            "boardType": "Breakfast",
            "board": {
              "type": "Breakfast"
            },
            "totalPrice": {
              "amount": 245.50,
              "currency": "USD"
            },
            "marketPrice": {
              "amount": 289.00,
              "currency": "USD"
            },
            "recommendedSalePrice": {
              "amount": 255.00,
              "currency": "USD"
            },
            "discountPercentage": 15,
            "taxesAndFees": [
              {
                "currency": "USD",
                "title": "City tax",
                "isIncludedInPrice": false,
                "isMandatory": true,
                "value": 12.50
              }
            ],
            "cancellationPolicy": {
              "isRefundable": true,
              "fullRefundability": {
                "from": "2026-10-01T00:00:00Z",
                "to": "2026-10-04T23:59:59Z"
              }
            }
          }
        },
        {
          "room": {
            "id": "room-002",
            "name": "Standard Room"
          },
          "package": {
            "id": "eyJTZWFyY2giOnt...",
            "boardType": "None",
            "board": {
              "type": "Breakfast",
              "count": 2
            },
            "totalPrice": {
              "amount": 260.00,
              "currency": "USD"
            },
            "marketPrice": null,
            "recommendedSalePrice": null,
            "discountPercentage": null,
            "taxesAndFees": [],
            "cancellationPolicy": {
              "isRefundable": false,
              "fullRefundability": null
            }
          }
        }
      ]
    },
    {
      "id": "67890",
      "bookitId": "R:609876",
      "name": "Luxury Resort",
      "price": 320.00,
      "discount": 20,
      "isDone": false,
      "packages": [
        {
          "room": {
            "id": "room-010",
            "name": "Superior Suite"
          },
          "package": {
            "id": "eyJTZWFyY2giOnx...",
            "boardType": "None",
            "totalPrice": {
              "amount": 320.00,
              "currency": "USD"
            },
            "marketPrice": {
              "amount": 400.00,
              "currency": "USD"
            },
            "recommendedSalePrice": {
              "amount": 340.00,
              "currency": "USD"
            },
            "discountPercentage": 20,
            "taxesAndFees": [],
            "cancellationPolicy": {
              "isRefundable": true,
              "fullRefundability": {
                "from": "2026-10-01T00:00:00Z",
                "to": "2026-10-05T23:59:59Z"
              }
            }
          }
        }
      ]
    }
  ]
}

GET /api/v2/properties/{id}/packages

Retrieve available rooms and quote packages for a specific property. This endpoint shares the same search parameters as GET /api/v2/search but scopes the results to a single property and returns the full package payload (taxes, fees, and cancellation details) per room.

Authentication: Required (X-Api-Key)

Path Parameters:

Parameter Type Description
id string Property identifier. Use the bookitId value. Support for deprecated numeric IDs may be removed in the future.

Query Parameters:

Parameter Type Description
checkIn string (YYYY-MM-DD) Check-in date. Example: 2025-10-06
checkOut string (YYYY-MM-DD) Check-out date. Must be after checkIn. Example: 2025-10-07
occupancies string Occupancy information for all rooms. See Occupancy Format above
residency string Guest residency country code (ISO-3166-1 alpha-2). Example: FR
eager boolean If set to true, response will only be returned when the search has fully completed
supplierTimeout integer Maximum time in seconds per supplier. See GET /api/v2/search Optional Parameters for details

Responses:

  • 200 OK: JSON packages list
  • 400 Bad Request: Missing or invalid query parameters (e.g., invalid occupancy string)
  • 404 Bad Request: Property not found
  • 401 Unauthorized: Invalid/missing API key
  • 429 Too Many Requests: Rate limit exceeded
  • 502 Bad Gateway: Upstream service failure

Response Schema (200 OK):

Field Type Description
isDone boolean Indicates if package loading is complete
hotel object Basic property information
hotel.id string DEPRECATED, use bookitId instead. This value will be removed in future API updates
hotel.bookitId string Unique property identifier
hotel.name string Property name
rooms array
rooms[].id string Room identifier
rooms[].name string Room name
rooms[].packages array Available packages/quotes for this room
rooms[].packages[].id string
rooms[].packages[].boardType string Board/meal plan. See Board Types table below
rooms[].packages[].board object More detailed board description, including the count. Omitted when no board details are available. See Board Conditions below
rooms[].packages[].board.type string Board/meal plan. Same values as boardType
rooms[].packages[].board.count integer Guests the board covers. Omitted when no count is available
rooms[].packages[].totalPrice object
rooms[].packages[].totalPrice.amount number Total amount
rooms[].packages[].totalPrice.currency string
rooms[].packages[].recommendedSalePrice object/null The recommended sale price for the package. Can be null or contain a value. Represents the minimum price that must be paid for this package. Must be respected when provided
rooms[].packages[].recommendedSalePrice.amount number Recommended sale price amount
rooms[].packages[].recommendedSalePrice.currency string Currency code
rooms[].packages[].taxesAndFees array Taxes and mandatory fees
rooms[].packages[].taxesAndFees[].currency string Currency code
rooms[].packages[].taxesAndFees[].title string Fee or tax name
rooms[].packages[].taxesAndFees[].isIncludedInPrice boolean Whether the amount is included in totalPrice
rooms[].packages[].taxesAndFees[].isMandatory boolean
rooms[].packages[].taxesAndFees[].value number Amount of the tax/fee
rooms[].packages[].cancellationPolicy object Cancellation summary
rooms[].packages[].cancellationPolicy.isRefundable boolean Indicates whether the package is refundable
rooms[].packages[].cancellationPolicy.fullRefundability object/null Window for full refund (if refundable)
rooms[].packages[].cancellationPolicy.fullRefundability.from string Earliest date/time for full refund
rooms[].packages[].cancellationPolicy.fullRefundability.to string Last date/time for full refund

Boarding Types

Board Type
None
Breakfast
Lunch
Dinner
FullBoard
HalfBoard
AllInclusive

Board Conditions

boardType is the board for the whole occupancy you searched. Where the board cannot cover the full occupancy, boardType falls back to None, so a partner reading only boardType is never told a meal is included for guests it would not cover.

board is a more detailed description of the same rate's board, and also includes the count of guests the board covers. board.type uses the same string values as boardType.

{
  "boardType": "None",
  "board": { "type": "Breakfast", "count": 2 }
}

Read together: boardType is what applies to the whole occupancy, and board is the meal plan with the number of guests it covers — here, breakfast for 2 of the guests searched.

boardType is always present; board accompanies it whenever board details are available. Both appear on the package objects of this endpoint, of GET /api/v2/properties/{id}/unmapped-packages, of the batch GET /api/v2/properties/packages, and on properties[].packages[].package in GET /api/v2/search.

Case What it means
board.type equals boardType The board applies to the whole occupancy
board.type differs from boardType The board does not cover the full occupancy, so boardType is None
board.count absent No count is available for this board
board absent entirely No board details are available for this rate — not a room-only rate

An absent board does not mean room only

board is omitted from the payload when no board details are available — for instance a rate quoted before this field existed. That is different from a room-only rate, which is returned as "board": { "type": "None" }. Treat an absent board as "no details available" and fall back to boardType.

count is omitted, never null

When a board has no count, count is left out of the JSON entirely rather than sent as null. The same applies to board itself. Parsers should test for the key's presence, not for a null value.

!!! IMPORTANT: polling is required.

This endpoint uses lazy loading for rates. response.isDone = true indicates that the search has completed. The recommended polling interval is 2 seconds.

Example Request:

curl -H "X-Api-Key: YOUR_KEY" \
     "<BASE_URL>/api/v2/properties/R:5234099/packages?checkIn=2026-10-06&checkOut=2026-10-07&occupancies=2-;2-&residency=FR"

Example Response:

{
  "isDone": true,
  "hotel": {
    "id": "12345",
    "bookitId": "R:54321",
    "name": "Grand Hotel Paris"
  },
  "rooms": [
    {
      "id": "room-001",
      "name": "Deluxe Room",
      "packages": [
        {
          "id": "eyJTZWFyY2giOns...",
          "boardType": "Breakfast",
          "board": {
            "type": "Breakfast",
            "count": 2
          },
          "totalPrice": {
            "amount": 512.35,
            "currency": "USD"
          },
          "recommendedSalePrice": {
            "amount": 530.00,
            "currency": "USD"
          },
          "taxesAndFees": [
            {
              "currency": "USD",
              "title": "City tax",
              "isIncludedInPrice": false,
              "isMandatory": true,
              "value": 12.5
            }
          ],
          "cancellationPolicy": {
            "isRefundable": true,
            "fullRefundability": {
              "from": "2025-10-01T00:00:00Z",
              "to": "2025-10-04T23:59:59Z"
            }
          }
        }
      ]
    }
  ]
}

GET /api/v2/properties/packages

This is a batch version of the GET /api/v2/properties/{id}/packages that allows fetching packages for multiple properties at once. !!! IMPORTANT: This endpoint is optimized for performance and returns only unmapped packages.

Query Parameters:

Parameter Type Description
properties string[] Array of property bookitId values. Example: R:5234099,R:2059144. Up to 100 properties per request is recommended. Support for deprecated numeric IDs may be removed in the future.
checkIn string (YYYY-MM-DD) Check-in date. Example: 2025-10-06
checkOut string (YYYY-MM-DD) Check-out date. Must be after checkIn. Example: 2025-10-07
occupancies string Occupancy information for all rooms. See Occupancy Format above
residency string Guest residency country code (ISO-3166-1 alpha-2). Example: FR
eager boolean If set to true, response will only be returned when the search has fully completed
supplierTimeout integer Maximum time in seconds per supplier. See GET /api/v2/search Optional Parameters for details

Responses

The response is an array of objects with the same schema as GET /api/v2/properties/{id}/packages response.

Common Use Cases

Search with filters

curl -H "X-Api-Key: YOUR_KEY" \
     "<BASE_URL>/api/v2/search?checkIn=2025-10-06&checkOut=2025-10-07&occupancies=2-&residency=FR&country=FR&stars=4&stars=5&minPrice=100&maxPrice=500&sortBy=price&sortDirection=asc&limit=20"

Search by coordinates

curl -H "X-Api-Key: YOUR_KEY" \
     "<BASE_URL>/api/v2/search?checkIn=2025-10-06&checkOut=2025-10-07&occupancies=2-&residency=FR&latitude=48.8566&longitude=2.3522&radius=5000&limit=20"