Works with the best tools:
Works with the best tools:
Have a question?
Contact usThe Booking API extracts structured accommodation data from major travel and booking platforms โ hotel details, room types, pricing, availability, guest reviews, ratings, and more. Just pass the listing URL and get clean JSON back.
The Booking API handles JavaScript rendering, proxy rotation, and CAPTCHA bypassing automatically. For date-specific availability, use a target URL that already contains the platform's date parameters.
Prices & availability
Room rates, currency, availability status for your dates
Hotel details
Name, address, star rating, amenities, description
Guest reviews & ratings
Overall score, review count, category scores
Calendars & room types
Room availability per period, bed types, room descriptions
Can't find your target platform? Contact us to request it.
| Parameter | Type | Default | Description |
|---|---|---|---|
| url | string | โ | RequiredFull URL of the accommodation listing. Must include https://. |
| useChrome | boolean | false | OptionalJavaScript rendering via headless Chrome. Required for some platforms. Consumes 5 credits. |
| premiumProxy | boolean | false | +9 creditsResidential proxy for better success on protected platforms. Consumes 10 credits. |
| proxyCountry | string | null | Requires premiumProxyISO 3166-1 country code (e.g. "FR", "US"). Consumes 25 credits. |
| proxyState | string | null | Requires premiumProxyTwo-letter US state code (e.g. "NY", "CA") for granular US/Australia geo-targeting. Consumes 60 credits. |
| waitForNetworkRequests | boolean | false | OptionalWait for AJAX requests to finish. Only works when useChrome is true. |
For a full description of all available options, see the Advanced Options section.
Date-sensitive pricing: prices vary by stay date. Pass dates in the target platform URL. Standalone checkinand checkout option fields are not forwarded by the public Booking endpoint.
On success the API returns a JSON object. Fields set to null were not found on the listing page.
| Field | Type | Description |
|---|---|---|
| name | string | Name of the accommodation. |
| image | string | null | Main image URL of the property. |
| images | array | Array of all property photo URLs. |
| price | number | null | Price per night or total price for the selected period. |
| currency | string | null | ISO 4217 currency code (e.g. "EUR", "USD"). |
| siteURL | string | The canonical URL of the listing on the booking platform. |
| statusCode | number | HTTP status returned by the target website. |
| inStock | boolean | true if the property is available for the requested dates. |
| latitude | number | null | Geographic latitude of the property. |
| longitude | number | null | Geographic longitude of the property. |
| totalReviews | number | null | Total number of guest reviews. |
| host | string | Hostname of the scraped platform (e.g. "fr.hotels.com"). |
| results | array | Array of available rooms or units with individual pricing and details. |
| error | string | null | null on success. Error message if the scrape failed. |
| HTTP Code | Meaning | What to do |
|---|---|---|
| 200 + error: null | Success | Data is ready to use. |
| 200 + error: "..." | Scrape failed | The listing may be invalid, removed, or the platform temporarily unavailable. |
| 400 | Bad request | Missing or malformed url. Ensure dates use YYYY-MM-DD format. |
| 401 | Unauthorized | Invalid credentials. Check your dashboard. |
| 429 | Rate limit exceeded | Slow down your requests or upgrade your plan. |
Pro tip: For price monitoring, schedule daily requests with the same target URL and track how prices evolve. Use proxyCountry to compare prices across different markets for the same property.
const username = "{YOUR_USERNAME}";
const apiKey = "{YOUR_API_KEY}";
const url = "https://www.hotels.com/ho126461/?chkin=2026-11-10&chkout=2026-11-12";
async function scrape() {
const response = await fetch("https://api.scraping-bot.io/scrape/booking", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Basic " + Buffer.from(`${username}:${apiKey}`).toString("base64"),
},
body: JSON.stringify({
url,
options: { premiumProxy: true, useChrome: false },
}),
});
if (!response.ok) throw new Error(await response.text());
console.log(await response.json());
}
scrape();Here is an example of result you'd receive when using Airbnb scraper as above :
{
"title": "Example hotel or stay",
"currency": "EUR",
"statusCode": 200,
"host": "www.hotels.com",
"results": [
{
"name": "Example room",
"price": 540,
"pricePerNight": 270,
"currency": "EUR",
"rating": { "rate": "4.8", "countReviews": "32" }
}
]
}