# Car rental tutorial

**Follow this end-to-end tutorial to build a complete Search, look and book integration for car rentals using Demand API Beta version.**

div
strong
⏱️ Estimated time to complete:
30 – 45 minutes 
br
strong
🧪 Version:
span
Beta
ul
li
strong
Purpose:
Build a Search, look and book flow for car rentals using Beta.
li
strong
Who this is for:
Managed Affiliated Partners integrating car rentals into their booking flow (currently part of the pilot programme).
li
strong
Prerequisites:
Basic understanding of Booking.com Demand API.
li
strong
Integration type:
Search, look and book flow.
li
strong
You'll learn how to:
ol
li
Search for car rentals.
li
Retrieve results and car rental details.
li
Check availability.
li
Determine whether a credit card is required.
li
Display Terms and Conditions.
li
Preview the reservation details.
li
Create eligible pay at pickup booking without card details.
li
strong
Code samples:
Full request/response bodies with annotations.
## Before you start

Before following this tutorial, complete the [Getting started prerequisites](/demand/docs/getting-started/try-out-the-api#before-you-start---prerequisites).

Make sure you have:

✓ A [valid API key token](/demand/docs/development-guide/authentication/#api-key-management).
✓ Your `X-Affiliate-Id`
✓ Access to the [try out console](/demand/docs/getting-started/try-out-the-api#try-out-console).

Important
[Search, look and book](/demand/docs/development-guide/application-flows/search-look-book) integration is currently available only to approved partners. Contact your Account Manager for more details.

## Use case

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.

## Integration overview

The Search, look and book flow consists of these steps:

Search, look and book integration for cars
### Booking flow

| Step | Endpoint | Purpose | Output |
|  --- | --- | --- | --- |
| 1. Search

 | [cars/search](/demand/docs/open-api/3.2-beta/demand-api/cars/search) | Search available rental cars. | `search_token`, `offer`, `car.id` |
| 1. Retrieve details

 | [/cars/suppliers](/demand/docs/open-api/3.2-beta/demand-api/cars/suppliers)[/cars/depots](/demand/docs/open-api/3.2-beta/demand-api/cars/depots)[/cars/details](/demand/docs/open-api/3.2-beta/demand-api/cars/details) | Retrieve static reference data. | Static `car.id`, `supplier` and depot information. |
| 1. Check availability

 | [/cars/availability](/demand/docs/open-api/3.2-beta/demand-api/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. |
| 1. Terms & Conditions

 | [/cars/terms-and-conditions](/demand/docs/open-api/3.2-beta/demand-api/cars/terms-and-conditions) | Display legal information before booking. | Rental conditions. |
| 1. Preview

 | [/orders/preview](/demand/docs/open-api/3.2-beta/demand-api/orders/orders/preview) | Validate the booking before checkout. | `order_token` |
| 1. Create booking

 | [orders/create](/demand/docs/open-api/3.2-beta/demand-api/orders/create) | Complete the reservation. | Confirmed booking. |


Authenticate every request
Include your API key token and your `X-Affiliate-Id` in every request. See the [Authentication guide](/demand/docs/development-guide/authentication/) for details.

## Key identifiers

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 |


Treat all identifiers as opaque values
Do not modify or reconstruct them. Always send them exactly as returned by the API.

## Step 1 - Search for cars

→ Call the [cars/search](/demand/docs/open-api/3.2-beta/demand-api/cars/search) to discover available rental cars.

Search request
Example search request:

```json
{
    "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](/demand/docs/open-api/3.2-beta/demand-api/commonlocations/common/locations/airports) and [countries](/demand/docs/open-api/3.2-beta/demand-api/commonlocations/common/locations/countries) endpoints to resolve airport codes and ISO country codes before performing searches.

→ [Try it yourself](/demand/docs/open-api/3.2/demand-api/cars/search)

Search response
The response contains available rental offers together with pricing, policies and key identifiers.

```json
{
    "request_id": "01kb09hr0tn1fhnetsc1j456nj",
    "data": [
        {
            "car": 56154,
            "car_categories": [
                "suvs",
                "medium",
                "large"
            ],
            "deal": {
                "discount_percentage": 20,
                "public_price": 104.87,
                "tags": []
            },
            "offer": 664812451,
            "policies": {
                "payment": {
                    "timing": "pay_at_pickup"
                }
            },
            "price": {
                "currency": "EUR",
                "total": 83.90,
                "credit_card_required": false,
                "extra_charges": []
            },
            "route": {
                "dropoff": {
                    "depot": 184903,
                    "depot_location_type": "in_terminal"
                },
                "pickup": {
                    "depot": 184903,
                    "depot_location_type": "in_terminal"
                }
            },
            "supplier": 187,
            "url": {
                "app": "booking://cars/search?affiliate_id=956509&affiliateCode=bcars-dapi&driver_age=30&do_time=2026-01-15T11:05&do_loc_iata=BCN&do_loc_name=Barcelona%20El%20Prat%20Airport&pu_time=2026-01-10T11:05&pu_loc_iata=BCN&pu_loc_name=Barcelona%20El%20Prat%20Airport&expand_search=false",
                "web": "https://cars.booking.com/search-results?vehicleId=664812451&vehicleInfo.vehicle.id=664812451&aid=956509&affiliateCode=bcars-dapi&prefcurrency=EUR&preflang=es&driverAge=30&cor=es&doHour=11&doMinute=5&doDay=15&doMonth=1&doYear=2026&dropLocationIata=BCN&dropLocationName=Barcelona%20El%20Prat%20Airport&puHour=11&puMinute=5&puDay=10&puMonth=1&puYear=2026&locationIata=BCN&locationName=Barcelona%20El%20Prat%20Airport"
            }
        },
        {
            "car": 281688,
            "car_categories": [
                "small"
            ],
            "deal": {
                "discount_percentage": 10,
                "public_price": 59.09,
                "tags": []
            },
            "offer": 770848541,
            "policies": {
                "cancellation": {
                    "type": "free_cancellation",
                    "details": {
                        "context": "before_pickup",
                        "duration": "PT48H"
                    }
                },
                "damage_excess": {
                    "amount": 1000.00,
                    "currency": "EUR"
                },
                "deposit": {
                    "amount": 1000.00,
                    "currency": "EUR"
                },
                "insurance_package": "inclusive",
                "payment": {
                    "timing": "pay_online_now"
                },
                "fuel": "return_same",
                "mileage": {
                    "amount": 0.50,
                    "currency": "EUR",
                    "distance_limit": 1250.00,
                    "distance_unit": "kilometers",
                    "type": "limited"
                },
                "theft_excess": {
                    "amount": 1000.00,
                    "currency": "EUR"
                }
            },
            "price": {
                "currency": "EUR",
                "total": 53.18,
                "extra_charges": []
            },
            "route": {
                "dropoff": {
                    "depot": 246985,
                    "depot_location_type": "shuttle_bus"
                },
                "pickup": {
                    "depot": 246985,
                    "depot_location_type": "shuttle_bus"
                }
            },
            "supplier": 3171,
            "url": {
                "app": "booking://cars/search?affiliate_id=956509&affiliateCode=bcars-dapi&driver_age=30&do_time=2026-01-15T11:05&do_loc_iata=BCN&do_loc_name=Barcelona%20El%20Prat%20Airport&pu_time=2026-01-10T11:05&pu_loc_iata=BCN&pu_loc_name=Barcelona%20El%20Prat%20Airport&expand_search=false",
                "web": "https://cars.booking.com/search-results?vehicleId=770848541&vehicleInfo.vehicle.id=770848541&aid=956509&affiliateCode=bcars-dapi&prefcurrency=EUR&preflang=es&driverAge=30&cor=es&doHour=11&doMinute=5&doDay=15&doMonth=1&doYear=2026&dropLocationIata=BCN&dropLocationName=Barcelona%20El%20Prat%20Airport&puHour=11&puMinute=5&puDay=10&puMonth=1&puYear=2026&locationIata=BCN&locationName=Barcelona%20El%20Prat%20Airport"
            }
  "metadata": {
    "next_page": "eyJhbGciOiJIUzI1NiJ9.eyJwIjp7Im1heGltdW1fcmVzdWx0cyI6MTAsIm9mZnNldCI6MTB9LCJhdWQiOiJDQVJTX1NVUFBMSUVSUyIsImV4cCI6MTY4MzY0NzMwNX0.y7NmH48mm7lImd2WxsHdotj6n-dVQAzJCGCnIJCKy3A",
    "total_results": 122
  },
  "search_token": "eyJhbGciOiJIUzI1NiJ9.eyJwIjp7ImJvb2tlciI6eyJjb3VudHJ5IjoidXMifX0sImF1ZCI6Ii9ob3RlbHMvc2VhcmNoIiwiZXhwIjoxNzUwMDAwMDAwfQ.XYZ123AbcDefGHIjklMNOpqrsTUVwxYZ456789"
}
```

Each car group includes:

| 
| Key parameters | Description | Use in |
| `car` | ID for car model + supplier (fleet) combination. | /cars/details lookup. |
| `offer` | ID for a rental offer | /cars/availability, /orders/preview and /orders/create requests. |
| `car_categories` | Vehicle size/type labels (e.g., small, medium, large, suvs, estate, premium, carriers). | UI filtering. |
| `deal` | Promotional data (when available). Includes discount percentage, deal tags, and the original (public) price. | UI badge pricing. |
| `policies` | Cancellation, mileage, fuel, etc (`deposit`, `damage_excess`, `theft_excess`, `mileage.amount`) with amount and currency. | Display rules. |
| `policies.payment` | The timing when the payment takes place. | UI display: `pay_online_now`, `pay_partial_online_now`, `pay_at_pickup`. |
| `price` | Displayed price and credit card requirement.* Includes: `total`, any `extra_charges`, `currency`, and `credit_card_required`.

 | Result cards and booking-flow logic. |
| `route.pickup`/ `dropoff` | Pickup/dropoff depot location. | Map/UX |
| `supplier` | Rental provider ID. | /cars/suppliers lookup. |
| `metadata` | All results are [paginated](/demand/docs/development-guide/pagination) for better readability. | Data organisation. |
| `search_token` | It includes stored search context (such as the route, filters, or booker country) | Use it in next steps. |


See the [car rental search guide](/demand/docs/cars/search-for-cars) for more examples and tips.

### What to display

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.

![Car rental search page](/assets/cars-search.7f01b0c030695a291119dff61f903bf37e37cebc8d4f69ce4c091c1f4d634c4b.0f53ce39.png)

### After this step

Store:

* `offer`
* `car`
* `search_token`


These values are required throughout the rest of the booking flow.

## Step 2 - Retrieve car details

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](/demand/docs/cars/cars-static-data) for storing recommendations.

→ Call [/cars/details](/demand/docs/open-api/3.2/demand-api/cars/details) using your regular synchronisation process.

cars/details request
```json
{
    "last_modified": "2026-08-31T10:00:00+00:00",
    "maximum_results": 100
}
```

cars/details response
For each car option, it returns:

```json
{
    "request_id": "01kb0dejrepkvprn7mf8cxb33g",
    "data": [
        {
            "id": 233256,
            "capacity": {
                "bags": {
                    "large": 1,
                    "small": 1
                },
                "doors": "4",
                "seats": "5"
            },
            "country": "be",
            "features": [
                "air_conditioner"
            ],
            "image": "https://cdn2.rcstatic.com/images/car_images/default_lrg.jpg",
            "make": "citroen",
            "model": "e-c3",
            "specification": {
                "code": "ECAE",
                "description": "economy",
                "fuel": "electric",
                "transmission": "automatic"
            },
            "supplier": 102
        },
```

→ [Try it yourself](/demand/docs/open-api/3.2-beta/demand-api/cars/details)

### Build your results page

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.


![Car rental details](/assets/cars-details.bce2f44bcae24345b7020275713a9370e42dce6f0af930bc4e76852ecb2589bd.0f53ce39.png)

### After this step

* 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.


## Step 3 - Check availability

Once a traveller selects an offer, call [/cars/availability](/demand/docs/open-api/3.2-beta/demand-api/cars/availability) using the following values returned by /cars/search:

* `offer`
* `search_token`
* `currency`


Note: The `search_token` expires after 90 mins.

Cars availability request
```json
{
  "offer": 664812451,
  "search_token": "your_search_token",
  "currency": "EUR"
}
```

Cars availability response
The availability response provides the final details of the selected car, including:

* `policies` – Cancellation, deposit, mileage, and fuel.
* `price` – Final price, charges and whether a credit card is required as a guarantee for the vehicle.
* `products` – Optional extras available for purchase (e.g child seat, GPS or additional driver).
* `insurance` – An optional third-party insurance quote, including its price, payment timing, documentation and `quote_reference`, when available.


Example:

```json
{
    "request_id": "01kb0at8s75xpngj1gg88mpbrt",
    "data": {
        "offer": 664812451,
        "currency": "EUR",
        "policies": {
            "cancellation": {
                "type": "free_cancellation",
                "details": {
                    "context": "before_pickup",
                    "duration": "PT48H"
                }
            },
            "damage_excess": {
                "amount": 1200.00
            },
            "deposit": {
                "amount": 1200.00
            },
            "insurance_package": "inclusive",
            "payment": {
                "timing": "pay_at_pickup"
            },
            "fuel": "return_same",
            "mileage": {
                "distance_limit": 1250.00,
                "distance_unit": "kilometers",
                "amount": 0.35,
                "type": "limited"
            },
            "theft_excess": {
                "amount": 1200.00
            }
        },
        "price": {
            "base": 83.90,
            "total": 83.90,
            "credit_card_required": false,
            "extra_charges": []
        },
        "products": [],
        "deal": null,
        "supplier": 187,
        "depot": 31061,
        "search_token": "1234568887584"
    }
}
```

→ [Try it yourself](/demand/docs/open-api/3.2-beta/demand-api/cars/availability)

See the [Cars availability guide](/demand/docs/cars/3.2/check-cars-availability) for full step-by-step details.

### Check whether a credit card is required

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_pickup` offer may have either `credit_card_required=true` or `credit_card_required=false`.
* Only use the cardless booking flow when the offer explicitly returns `credit_card_required=false` and there is no amount to be paid online.


#### Example - Pay at pickup — card required

```json
{
    "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.

#### Example - Pay at pickup — no card required

```json
{
    "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.

### Add optional insurance

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:

1. Display the insurance option and its price to the traveller.
2. Provide access to the returned policy documentation before purchase.
3. If the traveller selects the insurance, store its `quote_reference`.
4. Pass the `quote_reference` in the /orders/preview request.


Example:

```json
{
  "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_reference` identifies the selected insurance quote - Do not use the insurance `id` as a replacement for the `quote_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](/demand/docs/cars/3.2/cars-insurance-guide).

### After this step

* 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.


## Step 4- Display Terms & Conditions

→ Use the [cars/terms-and-conditions](/demand/docs/open-api/3.2-beta/demand-api/cars/terms-and-conditions) endpoint.

Request
```json
{
  "offer": "664812451", 
  "search_token": "12456895645246585",
  "currency": "EUR",
  "language": "es"
}
```

Response
```json
{
    "request_id": "01kb0ca9q1cvje0t98sk9xxqyv",
    "data": {
        "key_info": {
            "common": {
                "credit_cards_allowed": true,
                "debit_cards_allowed": true,
                "driver_age": 30,
                "insurance_available": false,
                "rental_duration": 5
            },
            "damage_excess": {
                "content": [
                    "If the car's bodywork gets damaged, the most you'll pay towards repairs covered by the Collision Damage Waiver is the damage excess (1200.0 EUR).",
                    "This cover is only valid if you stick to the terms of the rental agreement. It doesn't cover other parts of the car (e.g. windows, wheels, interior or undercarriage), or charges (e.g. for towing or off-road time), or anything in the car (e.g. child seats, GPS devices or personal belongings)."
                ],
                "excess_value": "1200.0 EUR",
                "subtitle": "1200.0 EUR",
                "title": "Damage Excess"
            },
            "deposit": {
                "accepted_cards": [
                    {
                        "title": "MasterCard",
                        "type": "Mastercard"
                    },
                    {
                        "title": "Visa",
                        "type": "Visa"
                    }
                ],
                "accepted_cards_title": "Accepted cards",
                "content": [
                    "At pick-up, the main driver will leave a refundable security deposit of 1200.0 EUR on their credit or debit card."
                ],
                "subtitle": "1200.0 EUR",
                "title": "Security deposit"
            },
            "disclaimers": [
                "Please see the Service Provider’s full terms and conditions below, which include the full name and company registered address of your Service Provider, information on and fees of extra products and services purchasable at the counter or based on your use of the rental, such as driving cross border and, if any, pick-up and drop-off grace periods."
            ],
            "driver_and_license": {
                "needed_items": [
                    "Passport or national ID card",
                    "Driving licence",
                    "Credit or debit card"
                ],
                "title": "Driver & licence requirements",
                "top_text": "When you pick the car up, you'll need:"
            },
            "mileage": {
                "content": "If you drive more than 1250.0 kilometres during your rental, you'll pay 0.35 EUR for each additional kilometre when you drop your car off.",
                "subtitle": "1250.0 kilometres per rental",
                "title": "Mileage"
            }
        },
        "terms": [
            {
                "type": "chapters",
                "title": "Included in the rental price",
                "text": null,
                "children": [
                    {
                        "type": "sections",
                        "title": "Insurance, Covers and Waivers",
                        "text": null,
                        "children": [
                            {
                                "type": "clauses",
                                "title": "Insurance Information",
                                "text": null,
                                "children": [
                                    {
                                        "type": "sub_clauses",
                                        "title": null,
                                        "text": null,
                                        "children": [
                                            {
                                                "type": "clause_options",
                                                "title": null,
                                                "text": "Insurance information<br /> All rental cars must have Collision Damage Waiver (CDW) and Theft Protection (TP). Each policy will be either: <ul> <li>included or</li> <li>purchasable from the rental company, or</li> <li> provided by another company (e.g. your credit card company).</li> </ul>",
                                                "children": []
                                            }
                                        ]
                                    }
                                ]
                            },
                            {
                                "type": "clauses",
                                "title": "Collision Damage Waiver (CDW)",
                                "text": null,
                                "children": [
                                    {
                                        "type": "sub_clauses",
                                        "title": null,
                                        "text": null,
                                        "children": [
                                            {
                                                "type": "clause_options",
                                                "title": null,
                                                "text": "If the car’s bodywork gets damaged, the most you’ll pay towards repairs covered by the Collision Damage Waiver is the damage excess. \nThis cover is only valid if you stick to the terms of the rental agreement. It doesn’t cover other parts of the car (e.g. glass, wheels, interior, roof or undercarriage), or charges (e.g. for towing or off-road time), or anything in the car (e.g. child seats, GPS devices or personal belongings).",
                                                "children": []
                                            }
                                        ]
                                    }
                                ]
                            },
```

* The `credit_card_required` field 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.


### What to display

* Damage excess and deposit amounts.
* Accepted credit/debit cards.
* Driver & licence requirements.
* Mileage rules.
* Included insurance and waivers.


→ [Try it yourself](/demand/docs/open-api/3.2-beta/demand-api/cars/terms-and-conditions)

See the [Terms and Conditions guide](/demand/docs/cars/3.2/pre-booking-terms-and-cond) for details.

## Step 5 - Preview the order

Important
To implement the [Search, look and book](/demand/docs/development-guide/application-flows/search-look-book) integration and process bookings directly in your application you must use the [/orders API collection](/demand/docs/open-api/3.2-beta/demand-api/orders) (currently in Beta). Requires approval and partner agreement. Contact your Account Manager for more details.

→ Use [/orders/preview](/demand/docs/open-api/3.2-beta/demand-api/orders/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:

* `offer`
* `search_token`
* `currency`


Note: The `search_token` expires after 90 minutes.

Example:

```json
{
  "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.

```json
{
  "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"
  }
}
```

→ [Try it yourself](/demand/docs/open-api/3.2-beta/demand-api/orders/orders/preview)

### Validate payments

Before creating the order, check the validated payment amounts in the /orders/preview response.

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:

```json

      "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"
  }
}
```

### After this step

* `order_token` that encapsulates the validated order details.
* Use it on your orders/create request.


### Display your order preview page

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](/demand/docs/open-api/demand-api/orders/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.

## Step 6 - Create the order based on the payment requirement

→ Call [/orders/create](/demand/docs/open-api/3.2-beta/demand-api/orders/create) to submit the car rental order request.

Include:

* Driver details in `car.driver`, including the mandatory `car.driver.email`.
* The `booker` details.
* The `payment` object 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.timing` value alone does not determine whether the `payment` object is required.
* The `order_token` returned by /orders/preview.


order_token expires
The `order_token` expires after 15 minutes. You must therefore call [/orders/create](/demand/docs/open-api/3.2-beta/demand-api/orders/create) within this time window.

### Card required

Include `payment` with `method=card` and the required card details when:

* The accepted price contains a `pay_online_now` component, including when a selected add-on, such as `insurance` or `damage_excess`, must be paid online.
* The car offer is `pay_at_pickup` and returns `credit_card_required=true`.
* The car offer is `pay_at_pickup` and `credit_card_required` is `null`, 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:

```json
{
  "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
  }
}
```

→ [Try it yourself](/demand/docs/open-api/3.2/demand-api/orders/orders/create)

### Card not required

You may omit the `payment` object only when all three of the following conditions are met:

* The payment timing is `pay_at_pickup`.
* The latest offer information explicitly returns `credit_card_required=false` in /cars/availability.
* The accepted price does not contain any `pay_online_now` component.


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 and card details.

Example:

```json
{
  "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"
  }
}
```

Do not omit `payment` based only on `payment.timing=pay_at_pickup`.

* A pay at pickup offer may still require a credit card.
* Only omit `payment` when the selected offer explicitly returns `credit_card_required=false` in the latest cars/availability response and there is no amount payable online.


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 returns `Processing` - Use /orders/details/cars/live to retrieve the latest booking status.


```json

{
  "request_id": "01kb1f9r4s8z3n7q2w5x6y8z9a",
  "data": {
    "order": "987654321",
    "car": {
      "reservation_id": "CAR-123456789",
      "status": "Processing"
    }
  }
}
```

### Insurance and cardless orders

Selecting insurance can affect whether card details are required when creating the order.

For a cardless Cars rental reservation, both of the following conditions must be met:

* The selected car offer returns `credit_card_required=false`.
* There are not additional amounts that must be paid online.


**If the selected insurance must be paid online:**

* You must include the `payment` object 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=false` and 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](/demand/docs/open-api/3.2-beta/demand-api/orders/details/cars/live) to retrieve the latest booking status and determine whether the booking has been confirmed.

## Integration completion checklist

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. |


## Next steps

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.

### Retrieve the latest order details

Call [/orders/details/cars/live](/demand/docs/open-api/3.2-beta/demand-api/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.


### Receive order updates through Notifications

You can also use the [Notifications service](/demand/docs/additional-services/notifications/about-notifications) 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](/demand/docs/open-api/3.2-beta/demand-api/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](/demand/docs/additional-services/notifications/car-orders-integration-guide#before-you-begin).


Continue with the **[Post-booking management section](/demand/docs/cars/3.2/post-booking-live-order-details)** to learn how to manage confirmed orders.

Curious to know more?
* Explore the [Notifications service documentation](/demand/docs/additional-services/notifications/about-notifications) for examples and details.
* Check the [Orders section](/demand/docs/orders-api/order-preview-create) for more tips on how to preview and create orders.
* Learn more about [Payment methods](/demand/docs/payments/payments-methods#credit-cards).
* Explore the [Car rental API specifications](/demand/docs/open-api/3.2-beta/demand-api/cars).