# Booking.com API for agents

> API for Agents · https://apiforagents.dev/platforms/booking · HTML twin: https://apiforagents.dev/platforms/booking

Properties, search, prices for a stay and reviews from Booking.com.

Endpoint: `POST https://apiforagents.dev/v1/booking`. One op per call. Quote first with `"estimateOnly": true`.

## Prices (USD per record, pay as you go)

| Record | Per record |
|---|---|
| listings | $0.0018 |
| reviews | $0.0018 |

## Operations

### properties

Full cards for up to ten properties by URL. Price from, guest score and category scores, rooms with availability and price, facilities, policies, location.

| Field | Required | Type | Meaning |
|---|---|---|---|
| subjects | yes | list of string (1-10 items) | booking.com/hotel/<country>/<name> URLs. |
| stay | no | object |  |
| stay.checkIn | no | string (YYYY-MM-DD) | First night, YYYY-MM-DD. Only read together with checkOut; without dates a property has no price to show. |
| stay.checkOut | no | string (YYYY-MM-DD) | Departure day, YYYY-MM-DD, after checkIn. |
| stay.currency | no | string (ISO 4217) | ISO 4217 code the prices come back in ("USD", "INR", "EUR"). |
| stay.language | no | string (BCP-47) | BCP-47 tag for names and descriptions ("en-GB", "de-DE"). |

Response fields (each row of data; every field present, null when the source had nothing):

| Field | Type |
|---|---|
| propertySlug | string |
| propertyId | string |
| propertyUrl | string |
| propertyName | string |
| propertyType | string |
| starRating | number |
| city | string |
| country | string |
| fullAddress | string |
| latitude | number |
| longitude | number |
| guestScore | number |
| scoreLabel | string |
| reviewCount | integer |
| categoryScores | any |
| stay | string |
| priceFrom | number |
| currency | string |
| rooms | any |
| roomTypes | any |
| mainImage | string |
| images | list of string |
| facilities | any |
| description | string |
| highlights | any |
| checkInTime | string |
| checkOutTime | string |
| policies | any |
| finePrint | string |
| surroundings | any |
| traderInfo | any |
| licenseNumbers | list of string |
| host | any |
| mapUrl | string |
| details | object |

`details` is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is `{}` when there is nothing more.

Example request:

```bash
curl -X POST https://apiforagents.dev/v1/booking \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"properties","subjects":["https://www.booking.com/hotel/gb/<hotel-name>.html"],"stay":{"checkIn":"2027-03-12","checkOut":"2027-03-15","currency":"GBP"}}'
```

Example response rows (made-up names, real field names; a live row carries every field above):

```json
[
  {
    "propertyName": "Hotel Aurel Riverside",
    "propertyType": "Hotel",
    "city": "Prague",
    "country": "Czechia",
    "starRating": 4,
    "guestScore": 8.9,
    "scoreLabel": "Excellent",
    "reviewCount": 2140,
    "priceFrom": 132,
    "currency": "EUR",
    "checkInTime": "15:00",
    "checkOutTime": "11:00",
    "propertySlug": "hotel-aurel-riverside",
    "propertyId": "2374999302",
    "propertyUrl": "https://www.booking.com/hotel-aurel-riverside-1000",
    "images": [
      "https://img.booking.com/hotel-aurel-riverside.jpg"
    ],
    "mapUrl": "https://www.booking.com/hotel-aurel-riverside-1000",
    "details": {}
  },
  {
    "propertyName": "Casa Lumen",
    "propertyType": "Guest house",
    "city": "Seville",
    "country": "Spain",
    "starRating": 3,
    "guestScore": 9.3,
    "scoreLabel": "Wonderful",
    "reviewCount": 612,
    "priceFrom": 88,
    "currency": "EUR",
    "checkInTime": "14:00",
    "checkOutTime": "11:00",
    "propertySlug": "casa-lumen",
    "propertyId": "3605674781",
    "propertyUrl": "https://www.booking.com/casa-lumen-1001",
    "images": [
      "https://img.booking.com/casa-lumen.jpg"
    ],
    "mapUrl": "https://www.booking.com/casa-lumen-1001",
    "details": {}
  }
]
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=booking&op=properties (sign in first).

### search

Properties for a destination and a stay, with Booking's own filters.

| Field | Required | Type | Meaning |
|---|---|---|---|
| location | yes | string (≤120 chars) |  |
| stay | no | object |  |
| stay.checkIn | no | string (YYYY-MM-DD) | First night, YYYY-MM-DD. Only read together with checkOut; without dates a property has no price to show. |
| stay.checkOut | no | string (YYYY-MM-DD) | Departure day, YYYY-MM-DD, after checkIn. |
| stay.currency | no | string (ISO 4217) | ISO 4217 code the prices come back in ("USD", "INR", "EUR"). |
| stay.language | no | string (BCP-47) | BCP-47 tag for names and descriptions ("en-GB", "de-DE"). |
| propertyType | no | string (≤40 chars) | Booking's own words: hotel, apartment, hostel, resort, villa… |
| minStars | no | integer (1-5) | Official star class, at least this many. |
| minRating | no | number (0-10) | Guest score on Booking's 0-10 scale. |
| priceMin | no | integer (0-) | For the stay, in the stay's currency. |
| priceMax | no | integer (0-) | Upper bound for the whole stay, in the stay's currency. |
| sort | no | enum |  Values: relevance, price_low, rating_high, distance. |
| limit | no | integer (1-100) |  |

Response fields (each row of data; every field present, null when the source had nothing):

| Field | Type |
|---|---|
| propertySlug | string |
| propertyId | string |
| propertyUrl | string |
| propertyName | string |
| propertyType | string |
| starRating | number |
| city | string |
| country | string |
| fullAddress | string |
| latitude | number |
| longitude | number |
| guestScore | number |
| scoreLabel | string |
| reviewCount | integer |
| categoryScores | any |
| stay | string |
| priceFrom | number |
| currency | string |
| rooms | any |
| roomTypes | any |
| mainImage | string |
| images | list of string |
| facilities | any |
| description | string |
| highlights | any |
| checkInTime | string |
| checkOutTime | string |
| policies | any |
| finePrint | string |
| surroundings | any |
| traderInfo | any |
| licenseNumbers | list of string |
| host | any |
| mapUrl | string |
| details | object |

`details` is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is `{}` when there is nothing more.

Example request:

```bash
curl -X POST https://apiforagents.dev/v1/booking \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"search","location":"Barcelona","stay":{"checkIn":"2027-03-12","checkOut":"2027-03-15","currency":"EUR"},"minRating":8,"sort":"price_low","limit":20}'
```

Example response rows (made-up names, real field names; a live row carries every field above):

```json
[
  {
    "propertyName": "Hotel Alfama View",
    "propertyType": "Hotel",
    "city": "Lisbon",
    "country": "Portugal",
    "starRating": 4,
    "guestScore": 8.8,
    "scoreLabel": "Excellent",
    "reviewCount": 1840,
    "priceFrom": 142,
    "currency": "EUR",
    "propertySlug": "hotel-alfama-view",
    "propertyId": "2544813253",
    "propertyUrl": "https://www.booking.com/hotel-alfama-view-1000",
    "images": [
      "https://img.booking.com/hotel-alfama-view.jpg"
    ],
    "mapUrl": "https://www.booking.com/hotel-alfama-view-1000",
    "details": {}
  },
  {
    "propertyName": "Rio Tejo Apartments",
    "propertyType": "Apartment",
    "city": "Lisbon",
    "country": "Portugal",
    "starRating": null,
    "guestScore": 9.1,
    "scoreLabel": "Wonderful",
    "reviewCount": 420,
    "priceFrom": 110,
    "currency": "EUR",
    "propertySlug": "rio-tejo-apartments",
    "propertyId": "3318819671",
    "propertyUrl": "https://www.booking.com/rio-tejo-apartments-1001",
    "images": [
      "https://img.booking.com/rio-tejo-apartments.jpg"
    ],
    "mapUrl": "https://www.booking.com/rio-tejo-apartments-1001",
    "details": {}
  }
]
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=booking&op=search (sign in first).

### reviews

Guest reviews for up to ten properties. Liked/disliked text, score, date, traveler type, room, property response.

| Field | Required | Type | Meaning |
|---|---|---|---|
| subjects | yes | list of string (1-10 items) | booking.com/hotel/<country>/<name> URLs. |
| sort | no | enum |  Values: relevance, newest, oldest, rating_high, rating_low. |
| since | no | string (YYYY-MM-DD) | Stop at this date; applies with newest or oldest. |
| scoreBands | no | list of enum | Booking's own 10-point score bands: superb 9+, good 7-9, average 5-7, poor <5. Not ratings. That name is a star filter elsewhere. Values: superb, good, average, poor. |
| limit | no | integer (1-100) |  |

Response fields (each row of data; every field present, null when the source had nothing):

| Field | Type |
|---|---|
| reviewId | string |
| reviewTitle | string |
| liked | string |
| disliked | string |
| rating | number |
| postedDate | string |
| language | string |
| travelerType | string |
| room | string |
| checkIn | string |
| checkOut | string |
| helpfulVotes | integer |
| photos | list of string |
| propertyResponse | string |
| reviewerName | string |
| reviewerLocation | string |
| reviewerAvatar | string |
| details | object |

`details` is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is `{}` when there is nothing more.

Example request:

```bash
curl -X POST https://apiforagents.dev/v1/booking \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"reviews","subjects":["https://www.booking.com/hotel/gb/<hotel-name>.html"],"sort":"newest","scoreBands":["average","poor"],"limit":25}'
```

Example response rows (made-up names, real field names; a live row carries every field above):

```json
[
  {
    "reviewerName": "Emma",
    "reviewerLocation": "Netherlands",
    "rating": 9,
    "reviewTitle": "Great location, friendly staff",
    "liked": "Five minutes from the old town.",
    "disliked": "Coffee at breakfast.",
    "travelerType": "Couple",
    "room": "Double Room with River View",
    "postedDate": "2026-10-10",
    "reviewId": "2742165313",
    "photos": [
      "https://img.booking.com/great-location-friendly-staff.jpg"
    ],
    "details": {}
  },
  {
    "reviewerName": "Daniel",
    "reviewerLocation": "United States",
    "rating": 7.5,
    "reviewTitle": "Good value, small rooms",
    "liked": "Clean and quiet.",
    "disliked": "Tiny bathroom.",
    "travelerType": "Solo traveller",
    "room": "Standard Single Room",
    "postedDate": "2026-10-06",
    "reviewId": "3690182538",
    "photos": [
      "https://img.booking.com/good-value-small-rooms.jpg"
    ],
    "details": {}
  }
]
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=booking&op=reviews (sign in first).

### history (free)

Stored price/score series of properties already held. Free.

| Field | Required | Type | Meaning |
|---|---|---|---|
| subjects | yes | list of string (1-10 items) |  |
| metric | no | enum |  Values: price_from, guest_score, review_count. |
| days | no | integer (1-730) |  |

Request shape:

```json
{
  "op": "history",
  "subjects": [
    "example"
  ]
}
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=booking&op=history (sign in first).

## Notes for the agent

Measured Booking.com data, one operation per call. Properties are named by their booking.com/hotel/<country>/<name> URL. A `stay` (checkIn, checkOut, currency, language) is part of every price and every priced fetch adds a point to the property's history tagged with that stay. ops: properties (full cards for up to ten properties. Price from, guest score and label, category scores, review count, rooms with availability and price, facilities, policies, check-in times, address and coordinates), search (properties for a destination and stay with propertyType, minStars, minRating, priceMin/Max and sort), reviews (guest reviews for up to ten properties. Liked/disliked, score, date, traveler type, room, property response; sort, since, scoreBands), history (stored price/score series for properties already held, free). Ops are independent. Issue several as PARALLEL tool calls. Fresh fetches are charged per record; your own answer is free while fresh.
