Last updated

Create your orders

Learn how to create an order using the /orders/preview and /orders/create endpoints


To complete an order, call the following endpoints in sequence:

Endpoint
Use it to...

/orders/preview

Validate order details before booking:

✓ Confirm guest allocation (prevents pricing errors)

✓ Verify the final price breakdown.

✓ Retrieve the order_token required by orders/create.

✓ Review available payment timings, methods and schedules.

/orders/create
  • Confirm the booking and process payment using the order_token.
    • This token encapsulates all order information, no need to rebuild the order.

Order creation process

Once the traveller has selected their desired products, follow these steps to create the booking.

Step 1 - Call the /orders/preview

→ Use the /orders/preview endpoint to validate the order details before proceeding.

Build the request using the product and accommodation data returned in the previous step of your integration flow.

Integration type:Retrieve data from
Search and book/accommodations/search endpoint.
Search, look and book/accommodations/availability endpoint.

Define the request

Your /orders/preview request must include:

Required / Optional:Field and value to use
Requiredbooker.platform and booker.country — Use the values provided by the traveller in the preceding response.
Requiredcurrency — Use the currency value returned from the preceding response.
Requiredaccommodation — Use these values from the preceding response for the products selected by the traveller:
  • id
  • checkin / checkout
  • products
Optionalbooker.travel_purpose and booker.user_groups — Include if returned in the preceding response; otherwise, can be omitted.

Example:

{
  "booker": {
    "country": "nl",
    "platform": "mobile",
    "travel_purpose": "leisure",
    "user_groups": [
      "authenticated"
    ]
  },
  "currency": "EUR",
  "accommodation": {
    "id": 6745031,
    "checkin": "2025-11-10",
    "checkout": "2025-11-15",
    "products": [
      {
        "id": "674503106_275710478_0_2_0",
        "allocation": {
          "number_of_adults": 1,
          "children": [
            8
          ]
        }
      },
      {
        "id": "674503113_275710486_0_1_0",
        "allocation": {
          "number_of_adults": 1,
          "children": []
        }
      }
    ]
  }
}

Guest allocation

For multi-room bookings, specify guest distribution using accommodation.products.allocation.

Example - Booking two identical rooms, with one adult allocated to each:

{
  "products": [
    {
      "id": "1050736002_377311511_0_2_0",
      "number_of_adults": 1,
      "room": 1050736002
    },
    {
      "id": "1050736002_377311511_0_2_0",
      "number_of_adults": 1,
      "room": 1050736002
    }
  ]
}

Allocation data depends on your integration type:

Integration typeGuest allocation
Search and bookGuest allocation is already included in the products from the /accommodations/search endpoint response.
Search, look and book flowGuest allocation is included in recommendation.products from the /accommodations/availability response.

Example with recommendation.products:

{
  "recommendation": {
    "products": [
      {
        "id": "1050736003_377312697_1_2_0",
        "number_of_adults": 1,
        "room": 1050736002
      },
      {
        "id": "1050736003_377312697_1_2_0",
        "number_of_adults": 1,
        "room": 1050736002
      }
    ]
  }
}

For non-recommended products, check products.maximum_occupancy from the /accommodations/availability and assign guests manually. See the Occupancy guide

Orders/preview response

A successful response from the /orders/preview endpoint includes:

Accommodation-specific data

If products support different payment options, the payment object in the preview shows only the methods and timings supported by all selected products.

Product-specific data
Order token

Step 2 - Display the order preview page

Show a preview page so travellers can:

  • Review booking details.
  • Choose a payment method and timing.
  • Provide guest and arrival information.

Example:

order-preview

Step 3 - Call the /orders/create endpoint

→ Once the traveller confirms, call /orders/create, include the order_token from the orders/preview response, and all required fields.

The /orders/create request requires the following fields:

Fields

Accommodation

FieldRequiredNotes / Details
accommodationOptionalTop-level accommodation object
accommodation.labelOptionalA free-text label used for identification, campaign attribution or reporting. See Labels for attribution guide for details.
accommodation.productsOptionalArray of products for this order
accommodation.products.idYesMust match product IDs from /orders/preview
accommodation.products.bed_configurationOptionalOptional bed configuration. Identifier for preferred bed setup returned from accommodations/details response.
accommodation.products.guestsYesArray of guest objects, each with:
- email (required)
- name (required)
accommodation.remarksOptionalTraveller’s additional requests.
accommodation.remarks.estimated_arrival_time.hourConditionalRequired if estimated arrival time is provided; allowed 0–23
accommodation.remarks.estimated_arrival_time.next_dayOptionalBoolean, default false
accommodation.remarks.special_requests OptionalOptional text (e.g. “Extra cot needed”) cannot be guaranteed.
Admonition name

accommodation.products.id in /orders/create must exactly match /orders/preview. This is a key validation step.

Booker fields

FieldRequiredNotes / Details
bookerYesTop-level booker object.
address ConditionalRequired if booker_address_required=true from /accommodations/details. If used, all subfields (address_line, city, country, and post_code) are mandatory.
companyOptionalBooker's company name. For B2B or invoicing purposes.
emailYesRequired
languageOptionale.g., en-us, nl
nameYesIncludes first_name and last_name
telephoneYesRequired

Payment

FieldRequiredNotes / Details
paymentYesTop-level payment object.
payment.methodYesOne of airplus, card, wallet
payment.timing YesOne of pay_at_the_property, pay_online_now, pay_online_later
payment.cardConditionalRequired if method=card; must include:
- cardholder
- cvc
- expiry_date
- number.
payment.airplus ConditionalRequired if method=airplus; must include number and optional dbi info.
payment.business_informationConditionalRequired for some authorisation forms (e.g., virtual credit card)
payment.include_receiptOptionalBoolean, determines if receipt_url is returned in response. Is set to "false" by default. Set to "true" if you wish to generate a payment receipt.

See the Payments section for best practices and use cases

Receipt generation
Payment timing
Receipt behaviour
pay_online_nowReceipt generated immediately via /orders/create.
pay_online_laterRetrieve a credit slip from orders/details/accommodations endpoint once payment is due (e.g. 3 days before arrival).

Order token

  • order_token

  • Token from the /orders/preview response.

    Expires after 15 minutes. Repeat /orders/preview if expired.

The order_token is only valid for 15 minutes after it is issued. If the order_token expires, repeat the /orders/preview call to generate a new one.

Best practices for optional fields

Only provide optional fields if:

  • They are relevant to your integration.
  • Your business logic requires them.
  • They’re explicitly needed for a specific endpoint or booking context.

This keeps requests lightweight and easier to maintain.

Example - order/ create request

This example includes optional fields: products bed_configuration, remarks and receipt generation:

{
  "accommodation": {
    "products": [
      {
        "id": "333",
        "bed_configuration": "123456",
        "guests": [
          {
            "email": "test.name@booking.com",
            "name": "Test Name"
          }
        ]
      }
    ],
    "remarks": {
      "estimated_arrival_time": {
        "hour": 12
      },
      "special_requests": "We will need an extra cot."
    }
  },
  "booker": {
    "address": {
      "address_line": "Road-1, house-2",
      "city": "Amsterdam",
      "country": "nl",
      "post_code": "11111"
    },
    "company": "Booking B.V",
    "email": "test.name@booking.com",
    "language": "en-gb",
    "name": {
      "first_name": "Test",
      "last_name": "Name"
    },
    "telephone": "12345678"
  },
  "order_token": "sample-token",
  "payment": {
    "card": {
      "cardholder": "Test Name",
      "cvc": "111",
      "expiry_date": "2030-10",
      "number": "23333333333333"
    },
    "include_receipt": true,
    "method": "card",
    "timing": "pay_at_the_property"
  }
}

Example - orders/create response

A successful response returns key order and payment details:

Field
Description
request_idAlways returned (for support)
payment.receipt_urlLink to the payment receipt (if available).
authorisation_form_urlLink to the authorisation form (For Corporate Partners using VCC) required to pay at the property. May be null.
accommodation.orderUnique identifier for the booking, which can be used for cancellations, customer support or post-booking tasks (see /orders/details/*)
accommodation.pincodeShort authorisation code required for specific operations (used with third_party_inventory if applicable).
accommodation.reservationFor backward compatibility with V2, only used if you need to access legacy accommodation orders.
accommodation.third_party_inventoryOptional, only for TPI orders. See TPI rates guide

Example response

{
  "request_id": "01j69mtd91x3pdcmqyj0spebt9",
  "data": {
    "payment": {
      "receipt_url": "https://secure.booking.com/payment_receipt.html?product_type=BookingBudget&aid=2373042&auth_key=8riKJJ0XuxDhk4ds&lang=en",
      "authorisation_form_url": null
    },
    "accommodation": {
      "order": "5006302528200239",
      "pincode": "884512",
      "reservation": 55303962
    }
  }
}

Step 4 - Confirm the booking with the traveller

Use the /orders/create data to:

  • Display a booking confirmation page.
  • Notify the traveller that their booking is confirmed.

Curious to know more?