Follow this end-to-end tutorial to build a complete Search, look and book integration for car rentals using Demand API Beta version.
🧪 Version:Beta
- Purpose: Build a Search, look and book flow for car rentals using Beta.
- Who this is for: Managed Affiliated Partners integrating car rentals into their booking flow (currently part of the pilot programme).
- Prerequisites: Basic understanding of Booking.com Demand API.
- Integration type: Search, look and book flow.
- You'll learn how to:
- Search for car rentals.
- Retrieve results and car rental details.
- Check availability.
- Determine whether a credit card is required.
- Display Terms and Conditions.
- Preview the reservation details.
- Create eligible pay at pickup booking without card details.
- Code samples: Full request/response bodies with annotations.
Before following this tutorial, complete the Getting started prerequisites.
Make sure you have:
✓ A valid API key token.
✓ Your X-Affiliate-Id
✓ Access to the try out console.
Search, look and book integration is currently available only to approved partners. Contact your Account Manager for more details.
Throughout this tutorial we'll follow a single booking journey.
A traveller wants to rent a car at Barcelona Airport (BCN)
Pickup and Drop-off: Barcelona Airport (BCN) Duration: 3 days, 2 adults, unlimited mileage preferred.
Payment: Pay at pickup. The selected offer does not require a credit card to be supplied with the booking.
We'll progressively build the booking flow using the data returned at each step.
During the availability step, you'll learn how to identify whether a pay at pickup offer requires a credit card and how this determines whether payment and card details must be included when creating the order.
The Search, look and book flow consists of these steps:

| Step | Endpoint | Purpose | Output |
|---|---|---|---|
| cars/search | Search available rental cars. | search_token, offer, car.id |
| /cars/suppliers /cars/depots /cars/details | Retrieve static reference data. | Static car.id, supplier and depot information. |
| /cars/availability | Retrieve the latest pricing, policies and optional products such as a third-party insurance. | Live pricing, products, availability and quote_reference when insurance is available. |
| /cars/terms-and-conditions | Display legal information before booking. | Rental conditions. |
| /orders/preview | Validate the booking before checkout. | order_token |
| orders/create | Complete the reservation. | Confirmed booking. |
Include your API key token and your X-Affiliate-Id in every request. See the Authentication guide for details.
You'll use several identifiers throughout the integration.
Field | Description | Used in |
|---|---|---|
car | Vehicle model and supplier combination. | /cars/details |
offer | Commercial offer returned by search. | /cars/availability, /orders/preview |
search_token | Search session context | /cars/availability, /orders/preview, /cars/terms-and-conditions |
quote_reference | Insurance quote identifier for selected insurance product. | /orders/preview |
order_token | Encapsulates all order details and validated pricing from the preview stage. | /orders/create |
Do not modify or reconstruct them. Always send them exactly as returned by the API.
→ Call the cars/search to discover available rental cars.
Example search request:
{
"booker": {
"country": "es"
},
"language": "en-gb",
"currency": "EUR",
"driver": {
"age": 30
},
"route": {
"pickup": {
"datetime": "2026-11-10T11:05:00",
"location": {
"airport": "BCN"
}
},
"dropoff": {
"datetime": "2026-11-15T11:05:00",
"location": {
"airport": "BCN"
}
}
}
}Key request fields:
route— Pickup and drop-off locations.driver.age— Required for pricing.booker.country— Determines market-specific pricing.currency— Preferred display currency.
Use the location airports and countries endpoints to resolve airport codes and ISO country codes before performing searches.
At this stage you should display enough information for travellers to compare available vehicles and choose the option that best suits their needs.
| Section | Display |
|---|---|
| Vehicle | Vehicle category, supplier, transmission, fuel type, passenger and luggage capacity. |
| Price | Total price, currency, and any available discounts. |
| Rental policies | Fuel policy, mileage policy, and cancellation policy. |
| Insurance | Indicate whether optional insurance is available. |
The search response contains only summary insurance information. Retrieve the complete insurance quote from /cars/availability after the traveller selects a vehicle.

Store:
offercarsearch_token
These values are required throughout the rest of the booking flow.
The search response intentionally contains only summary information.
Use the static car reference endpoints to retrieve additional reference data that can be stored and reused:
- /cars/details
- /cars/suppliers
- /cars/depots
Booking.com recommends storing this information locally to reduce API calls and improve performance. See the Car rental static data guide for storing recommendations.
→ Call /cars/details using your regular synchronisation process.
{
"last_modified": "2026-08-31T10:00:00+00:00",
"maximum_results": 100
}Combine the dynamic search results with the static vehicle information to display a richer product page.
Recommended information includes:
- Vehicle photo.
- Transmission.
- Fuel type.
- Passenger capacity.
- Luggage capacity.
- Supplier branding.
- Depot information.

- You now have everything needed to build your search results and vehicle details pages.
- The traveller selects the vehicle they want to rent and proceeds to check live availability.
Once a traveller selects an offer, call /cars/availability using the following values returned by /cars/search:
offersearch_tokencurrency
Note: The search_token expires after 90 mins.
{
"offer": 664812451,
"search_token": "your_search_token",
"currency": "EUR"
}
See the Cars availability guide for full step-by-step details.
Check price.credit_card_required to determine whether a credit card must be supplied when the order is created.
The field can return:
Value | Description | /orders/create handling |
|---|---|---|
true | A credit card is required as a guarantee for the vehicle. | Include payment.method=card and the required card details. |
false | A credit card is explicitly not required to create the order. | For a pay_at_pickup offer with no amount payable online, payment can be omitted when creating the order. |
null | Credit card requirement information is unavailable or not applicable. | Use the card-required flow. Do not treat null as a cardless offer. |
Do not use policies.payment.timing alone to decide whether card details are required.
- A
pay_at_pickupoffer may have eithercredit_card_required=trueorcredit_card_required=false. - Only use the cardless booking flow when the offer explicitly returns
credit_card_required=falseand there is no amount to be paid online.
{
"request_id": "01kb0at8s75xpngj1gg88mpbrt",
"data": {
"offer": 664812451,
"currency": "EUR",
"policies": {
"payment": {
"timing": "pay_at_pickup"
}
},
"price": {
"base": 83.90,
"total": 83.90,
"credit_card_required": true,
"extra_charges": []
}
}
}
In this case, collect the traveller's card details and include the payment object when calling /orders/create.
{
"request_id": "01kb0at8s75xpngj1gg88mpbrt",
"data": {
"offer": 664812451,
"currency": "EUR",
"policies": {
"payment": {
"timing": "pay_at_pickup"
}
},
"price": {
"base": 83.90,
"total": 83.90,
"credit_card_required": false,
"extra_charges": []
}
}
}
In this case, if there is no amount payable online, you do not need to collect card details for the booking and can omit payment when calling /orders/create.
Some car rental offers include an optional third-party insurance product. The complete, bookable insurance quote is returned in the /cars/availability response.
If the insurance object is present:
- Display the insurance option and its price to the traveller.
- Provide access to the returned policy documentation before purchase.
- If the traveller selects the insurance, store its
quote_reference. - Pass the
quote_referencein the /orders/preview request.
Example:
{
"insurance": {
"quote_reference": "ABC123",
"name": "Full Protection",
"id": "999",
"price": {
"display": {
"value": 144.70,
"currency": "GBP"
},
"pay": {
"value": 144.70,
"currency": "EUR",
"timing": "pay_online_now"
}
},
"documents": [
{
"name": "policy_document",
"url": "https://staging.rentalcover.com/en/pds"
},
{
"name": "ipid",
"url": "https://staging.rentalcover.com/en/pds"
}
]
}
}The
quote_referenceidentifies the selected insurance quote - Do not use the insuranceidas a replacement for thequote_reference.If the insurance payment timing is
pay_online_now, include the required payment details when creating the order - The final payment requirements are determined during the preview and creation steps.
Insurance availability depends on the supplier and rental offer. For detailed guidance on retrieving, displaying and booking insurance, see the Cars insurance guide.
- Confirmed car availability.
- Final price confirmation (
price.total) - Payment timing (
policies.payment.timing) - Credit card requirement (
price.credit_card_required) - Available optional extras (
products.id) - Insurance quote details (
insurance) when available.
→ Use the cars/terms-and-conditions endpoint.
{
"offer": "664812451",
"search_token": "12456895645246585",
"currency": "EUR",
"language": "es"
}- The
credit_card_requiredfield does not replace the supplier's Terms & Conditions for pickup - It determines whether a credit card must be supplied with the booking request. - Always display the applicable payment-card, security-deposit and driver requirements returned by /cars/terms-and-conditions.
- Damage excess and deposit amounts.
- Accepted credit/debit cards.
- Driver & licence requirements.
- Mileage rules.
- Included insurance and waivers.
See the Terms and Conditions guide for details.
To implement the Search, look and book integration and process bookings directly in your application you must use the /orders API collection (currently in Beta). Requires approval and partner agreement. Contact your Account Manager for more details.
→ Use /orders/preview to confirm:
- What will be booked.
- Price and currency.
- Payment timing and amounts.
- Cancellation and policies.
To construct the orders/preview request, you need the same values returned in previous steps:
offersearch_tokencurrency
Note: The search_token expires after 90 minutes.
Example:
{
"currency": "EUR",
"car": {
"offer": 664812451,
"search_token": "eyJhbGciOiJIUzI1NiJ9..."
}
}The orders/preview response returns the validated booking information and an order_token that you use to create the order.
{
"request_id": "01fr9ez700exycb98w90w5r9sh",
"data": {
"car": {
"offer": 123456789,
"currency": {
"booker": "EUR",
"payment": "EUR"
},
"price": {
"base": {
"display": {
"value": 129.99,
"currency": "EUR",
"timing": "pay_at_pickup"
},
"pay": {
"value": 129.99,
"currency": "EUR",
"timing": "pay_at_pickup"
}
},
"extra_charges": [],
"total": {
"display": {
"value": 154.99,
"currency": "EUR",
"timing": "pay_at_pickup"
},
"pay": {
"value": 154.99,
"currency": "EUR",
"timing": "pay_at_pickup"
}
}
},
"policies": {
"cancellation": {
"details": {
"context": "before_pickup",
"duration": "PT48H"
},
"type": "free_cancellation"
},
"damage_excess": {
"amount": {
"display": {
"value": 900.00,
"currency": "EUR",
"timing": "pay_at_pickup"
},
"pay": {
"value": 900.00,
"currency": "EUR",
"timing": "pay_at_pickup"
}
}
},
"deposit": {
"amount": {
"display": {
"value": 300.00,
"currency": "EUR",
"timing": "pay_at_pickup"
},
"pay": {
"value": 300.00,
"currency": "EUR",
"timing": "pay_at_pickup"
}
}
},
"fuel_policy": "return_same",
"mileage": {
"distance_limit": 300,
"distance_unit": "kilometers",
"amount": 0.25,
"type": "limited"
},
"theft_excess": {
"amount": {
"display": {
"value": 1200.00,
"currency": "EUR",
"timing": "pay_at_pickup"
},
"pay": {
"value": 1200.00,
"currency": "EUR",
"timing": "pay_at_pickup"
}
}
}
}
},
"order_token": "eyJhIjoiYmNkIn0"
}
}
Before creating the order, use the latest selected offer and the /orders/preview response to determine whether payment details are required.
Check:
- Whether the selected offer is payable at pickup.
- Whether the offer returns
credit_card_required=false. - Whether the accepted price has any amount to be paid online.
Even when the car offer returns credit_card_required=false, card details are required if the final order includes an amount that must be payable online.
For example in this case a selected damage_excess must be paid online:
"policies": {
"cancellation": {
"details": {
"context": "before_pickup",
"duration": "PT48H"
},
"type": "free_cancellation"
},
"damage_excess": {
"amount": {
"display": {
"value": 900.00,
"currency": "EUR",
"timing": "pay_online_now"
},
"pay": {
"value": 900.00,
"currency": "EUR",
"timing": "pay_online_now"
}
}
},
"deposit": {
"amount": {
"display": {
"value": 300.00,
"currency": "EUR",
"timing": "pay_at_pickup"
},
"pay": {
"value": 300.00,
"currency": "EUR",
"timing": "pay_at_pickup"
}
}
},
"fuel_policy": "return_same",
"mileage": {
"distance_limit": 300,
"distance_unit": "kilometers",
"amount": 0.25,
"type": "limited"
},
"theft_excess": {
"amount": {
"display": {
"value": 1200.00,
"currency": "EUR",
"timing": "pay_at_pickup"
},
"pay": {
"value": 1200.00,
"currency": "EUR",
"timing": "pay_at_pickup"
}
}
}
}
},
"order_token": "eyJhIjoiYmNkIn0"
}
}
order_tokenthat encapsulates the validated order details.- Use it on your orders/create request.
You can now present the traveller with the final booking summary, including:
- What they are booking.
- What they will have to pay.
- When and how they can pay it.
- And the cancellation terms that will apply.
→ Select the data from your /orders/preview response to provide the appropriate information on your preview page.
After checking the details of the order, collect payment information when required for the selected offer, then proceed with the booking.
→ Call /orders/create to submit the car rental order request.
Include:
- Driver details in
car.driver, including the mandatorycar.driver.email. - The required
bookerdetails. - The
paymentobject when the selected offer requires payment details:- Use the latest offer and the value from the latest /cars/availability response, to determine whether you must provide card details.
- The
payment.timingvalue alone does not determine whether thepaymentobject is required.
- The
order_tokenreturned by /orders/preview.
The order_token expires after 15 minutes. You must therefore call /orders/create within this time window.
Include payment with method=card and the required card details when:
- The accepted price contains a
pay_online_nowcomponent, including when a selected add-on, such asinsuranceordamage_excess, must be paid online. - The car offer is
pay_at_pickupand returnscredit_card_required=true. - The car offer is
pay_at_pickupandcredit_card_requiredisnull, missing or unavailable.
This includes pay_online_now, pay_partial_online_now and pay_at_pickup orders where the rental company requires a card guarantee.
Example:
{
"order_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.car-preview-token",
"car": {
"driver": {
"title": "Mr",
"first_name": "John",
"last_name": "Doe",
"email": "john.doe@booking.com",
"telephone": "+44 20 1234 5678",
"address": {
"address_line1": "221B Baker Street",
"address_line2": "",
"city": "London",
"country": "gb",
"postcode": "NW1 6XE"
}
},
"label": "summer_campaign_2025"
},
"booker": {
"address": {
"address_line": "221B Baker Street",
"city": "London",
"country": "gb",
"post_code": "NW1 6XE"
},
"company": "ACME Travel",
"email": "john.doe@example.com",
"language": "en-gb",
"name": {
"first_name": "John",
"last_name": "Doe"
},
"telephone": "+44 20 1234 1111"
},
"payment": {
"timing": "pay_at_pickup",
"method": "card",
"card": {
"cardholder": "John Doe",
"number": "4111111111111111",
"expiry_date": "2028-12",
"cvc": "123",
"authentication": {
"3d_secure": {
"authentication_value": "AAABBJg0VhI0VniQEjRGAAAAAAA=",
"eci": "05",
"transaction": "3ds-trans-123456"
}
}
},
"include_receipt": true
}
}
You may omit both the payment object and booker.address only when all of the following conditions apply:
- The payment timing is
pay_at_pickup. - The latest offer information explicitly returns
credit_card_required=falsein /cars/availability. - The accepted price does not contain any
pay_online_nowcomponent.
For example, a pay-at-pickup car offer with credit_card_required=false can be booked without card details when no selected add-ons introduce an amount payable online.
If any of the three cardless conditions is not met, include the payment object, card details and booker.address.
For example, the following request creates an eligible cardless car order:
{
"order_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.car-preview-token",
"car": {
"driver": {
"title": "Mr",
"first_name": "John",
"last_name": "Doe",
"email": "john.doe@booking.com",
"telephone": "+44 20 1234 5678",
"address": {
"address_line1": "221B Baker Street",
"address_line2": "",
"city": "London",
"country": "gb",
"postcode": "NW1 6XE"
}
},
"label": "summer_campaign_2025"
},
"booker": {
"company": "ACME Travel",
"email": "john.doe@example.com",
"language": "en-gb",
"name": {
"first_name": "John",
"last_name": "Doe"
},
"telephone": "+44 20 1234 1111"
}
}If any of these conditions is not met, include booker.address and the payment object with method=card and the required card details.
The response confirms that the booking request has been accepted and contains:
order- Unique identifier for the order.reservation_id- Booking reference for the car reservation.status- Always returnsProcessing- Use /orders/details/cars/live to retrieve the latest booking status.
{
"request_id": "01kb1f9r4s8z3n7q2w5x6y8z9a",
"data": {
"order": "987654321",
"car": {
"reservation_id": "CAR-123456789",
"status": "Processing"
}
}
}
Including a car insurance in the order can affect whether card details are required when creating the order.
Insurance does not by itself require a card. However, if the selected insurance introduces an amount payable online, you must include payment with method=card and the required card details.
You may omit both payment and booker.address only when:
- The selected car offer returns
credit_card_required=false. - There are not additional amounts that must be paid online.
- The selected offer is payable at pickup.
If the selected insurance must be paid online:
- You must include the
booker.addressandpaymentobject with valid card details when calling /orders/create. - This is mandatory even if the car offer returns
credit_card_required=false.
If the selected insurance does not result in an amount that must be paid online:
- It does not by itself require card details.
- The booking can remain cardless provided the car offer returns
credit_card_required=falseand there is no online payment amounts.
🎉 Congratulations! Your booking request has been submitted successfully.
The order has been created and the order is now being processed by the supplier.
Note: The order creation does not imply direct order confirmation. It returns "Processing" status. Call /orders/details/cars/live to retrieve the latest booking status and determine whether the booking has been confirmed.
You should now support:
Checklist | |
|---|---|
| ☑ | Searching cars by route and date. |
| ☑ | Displaying real prices & availability. |
| ☑ | Optional extras and insurance. |
| ☑ | Mandatory pre-booking Terms & Conditions. |
| ☑ | Determining whether a credit card is required from the latest Cars availability. |
| ☑ | Creating Cars bookings with or without card details, according to the selected offer. |
After creating the order, choose one of the following options to keep your system up to date and provide a post-booking experience for travellers.
Call /orders/details/cars/live to retrieve the latest status and reservation details for the order.
This endpoint lets you:
- Check whether the order has been confirmed.
- Retrieve the supplier confirmation number.
- Display pickup instructions.
- Retrieve insurance documents, if purchased.
- Display the latest order details to the traveller.
You can also use the Notifications service to receive a notification in your system whenever a car order is updated.
- This allows you to keep your local order data up to date without repeatedly polling /orders/details/cars/live.
- The Notifications service is separate from the Demand API and requires additional setup. Before using it, make sure that you meet the Notifications service requirements.
Continue with the Post-booking management section to learn how to manage confirmed orders.
- Explore the Notifications service documentation for examples and details.
- Check the Orders section for more tips on how to preview and create orders.
- Learn more about Payment methods.
- Explore the Car rental API specifications.