Booking.com data, ready when you are.
Properties, search, prices for a stay and reviews from Booking.com.
- See the price before every call
- Pay only for records that come back
- No subscription. Your balance never expires
What you can get.
- $0.0018per recordTry it →
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.
- $0.0018per recordTry it →
Search
Properties for a destination and a stay, with Booking's own filters.
- $0.0018per recordTry it →
Reviews
Guest reviews for up to ten properties. Liked/disliked text, score, date, traveler type, room, property response.
What the data looks like.
| propertyName | propertyType | city | country | starRating | guestScore | scoreLabel | reviewCount | priceFrom | currency | checkInTime | checkOutTime | propertySlug | propertyId | propertyUrl | images | mapUrl | details |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Hotel Aurel Riverside | Hotel | Prague | Czechia | 4 | 8.9 | Excellent | 2,140 | 132 | EUR | 15:00 | 11:00 | hotel-aurel-riverside | 2374999302 | https://www.booking.com/hotel-aurel-riverside-1000 |
| https://www.booking.com/hotel-aurel-riverside-1000 |
|
| Casa Lumen | Guest house | Seville | Spain | 3 | 9.3 | Wonderful | 612 | 88 | EUR | 14:00 | 11:00 | casa-lumen | 3605674781 | https://www.booking.com/casa-lumen-1001 |
| https://www.booking.com/casa-lumen-1001 |
|
| Northfold Suites | Aparthotel | Edinburgh | United Kingdom | 4 | 8.6 | Excellent | 1,305 | 154 | GBP | 16:00 | 10:00 | northfold-suites | 828209759 | https://www.booking.com/northfold-suites-1002 |
| https://www.booking.com/northfold-suites-1002 |
|
For developers
API reference.
One endpoint, POST /v1/booking. Open an operation to see its fields.
Propertiesproperties
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 | Type | Meaning |
|---|---|---|
| subjects * | list of string · 1-10 items | booking.com/hotel/<country>/<name> URLs. |
| stay | object | |
| stay.checkIn | 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 | string · YYYY-MM-DD | Departure day, YYYY-MM-DD, after checkIn. |
| stay.currency | string · ISO 4217 | ISO 4217 code the prices come back in ("USD", "INR", "EUR"). |
| stay.language | string · BCP-47 | BCP-47 tag for names and descriptions ("en-GB", "de-DE"). |
Response fields, each row of data
| 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 |
Every field is present on every row: a value the source had nothing for is null, an empty list is []. 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.
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
[
{
"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": {}
}
]An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.
Searchsearch
Properties for a destination and a stay, with Booking's own filters.
| Field | Type | Meaning |
|---|---|---|
| location * | string · ≤120 chars | |
| stay | object | |
| stay.checkIn | 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 | string · YYYY-MM-DD | Departure day, YYYY-MM-DD, after checkIn. |
| stay.currency | string · ISO 4217 | ISO 4217 code the prices come back in ("USD", "INR", "EUR"). |
| stay.language | string · BCP-47 | BCP-47 tag for names and descriptions ("en-GB", "de-DE"). |
| propertyType | string · ≤40 chars | Booking's own words: hotel, apartment, hostel, resort, villa… |
| minStars | integer · 1-5 | Official star class, at least this many. |
| minRating | number · 0-10 | Guest score on Booking's 0-10 scale. |
| priceMin | integer · 0- | For the stay, in the stay's currency. |
| priceMax | integer · 0- | Upper bound for the whole stay, in the stay's currency. |
| sort | enum | relevance · price_low · rating_high · distance |
| limit | integer · 1-100 |
Response fields, each row of data
| 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 |
Every field is present on every row: a value the source had nothing for is null, an empty list is []. 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.
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
[
{
"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": {}
}
]An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.
Reviewsreviews
Guest reviews for up to ten properties. Liked/disliked text, score, date, traveler type, room, property response.
| Field | Type | Meaning |
|---|---|---|
| subjects * | list of string · 1-10 items | booking.com/hotel/<country>/<name> URLs. |
| sort | enum | relevance · newest · oldest · rating_high · rating_low |
| since | string · YYYY-MM-DD | Stop at this date; applies with newest or oldest. |
| scoreBands | 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.superb · good · average · poor |
| limit | integer · 1-100 |
Response fields, each row of data
| 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 |
Every field is present on every row: a value the source had nothing for is null, an empty list is []. 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.
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
[
{
"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": {}
}
]An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.
Historyhistoryfree
Stored price/score series of properties already held. Free.
| Field | Type | Meaning |
|---|---|---|
| subjects * | list of string · 1-10 items | |
| metric | enum | price_from · guest_score · review_count |
| days | integer · 1-730 |