OTA rate comparison
Rate parity in one call.One call fans out to Booking.com, Hotels.com, Agoda and Expedia for the same stay and returns each source with its status, plus the minimum and spread when the prices are comparable. A blocked source does not sink the others: you get a partial answer you can see.
- Look up by
- The identifier of each OTA you want compared
- Coverage
- Booking.com, Hotels.com, Agoda and Expedia
- Cost
- 30 credits a call; failed and empty calls are free
- Endpoints
- 2 endpoints
- Prices
Endpoints
Example
OTA compare, with POST /v1/ota/compare. Set SCRAPERCOMPANY_API_KEY to your key and run it; the full parameter list is in the API reference.
curl -X POST "https://api.scrapercompany.com/v1/ota/compare" \
-H "x-api-key: $SCRAPERCOMPANY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"check_in": "2026-12-25",
"nights": 1,
"currency": "USD",
"booking_pagename": "moxy-boston-downtown",
"booking_country": "us",
"hotels_property_id": "38766175",
"hotels_market": "US",
"agoda_property_id": "8795952",
"expedia_property_id": "38766175",
"expedia_market": "US"
}'200 response
{
"search_parameters": {
"engine": "ota_compare",
"check_in_date": "2026-12-20",
"check_out_date": "2026-12-21",
"adults": 2,
"currency": "USD",
"booking_pagename": "moxy-boston-downtown",
"agoda_property_id": "8795952"
},
"comparison": {
"status": "comparable",
"comparable": true,
"identifiers": {
"booking": "moxy-boston-downtown",
"agoda": "8795952"
},
"lowest_price": 285,
"lowest_source": "booking",
"spread": 47,
"prices": {
"booking": 285,
"agoda": 332
},
"currencies": {
"booking": "USD",
"agoda": "USD"
},
"price_provenance": {},
"reason": "Sources price on different bases (booking_display_average, total_including_taxes_and_fees); the headline minimum mixes them. Compare within `by_price_basis`.",
"price_basis_consistent": false,
"by_price_basis": {
"booking_display_average": {
"sources": [
"booking"
],
"currencies": [
"USD"
],
"lowest_source": "booking",
"lowest_price_per_night": 285
},
"total_including_taxes_and_fees": {
"sources": [
"agoda"
],
"currencies": [
"USD"
],
"lowest_source": "agoda",
"lowest_price_per_night": 332
}
}
},
"sources": {
"booking": {
"status": "ok",
"price_per_night": 285,
"currency": "USD",
"availability": "available",
"is_soldout": false,
"price_basis": "booking_display_average"
},
"agoda": {
"status": "ok",
"price_per_night": 332,
"currency": "USD",
"availability": "available",
"is_soldout": false,
"price_basis": "total_including_taxes_and_fees"
},
"expedia": {
"status": "no_price",
"currency": "USD",
"availability": "min_stay",
"is_soldout": false,
"availability_reason": "This property requires you to stay at least 7 nights.",
"min_length_of_stay": 7
},
"hotels": {
"status": "error",
"error": "ExpediaBlocked: HTTP 429",
"availability": "blocked",
"is_soldout": false,
"availability_reason": "ExpediaBlocked: HTTP 429"
}
},
"availability": {
"booking": "available",
"agoda": "available",
"expedia": "min_stay",
"hotels": "blocked"
},
"meta": {
"requested": 4,
"ok": 2,
"elapsed_s": 15.89
}
}Good to know
- comparison.comparable is false for a single priced source, mixed currencies or mixed price bases; minima and spreads are then left out rather than guessed.
- GET /v1/ota/sources lists what each OTA can answer and what it costs, for free.
Guides
More hotel prices and metasearch
Many sellers for one hotel at once, and forward calendars of nightly rates.
Or browse every data source.
Questions about this page?
Send the page link and your question, and the team will answer.