Hotel Details
Get one hotel's profile as the OTA you choose publishes it: name, property type, stars, address, coordinates, description, check-in/out times, guest rating with sub-scores, amenities, photos, policies, nearby landmarks and the room catalogue. No prices — not a rate, not a fee, not an offer, and the room catalogue carries no availability.
/api/v1/scraper/hotel-details/— submit/api/v1/scraper/hotel-details/{job_id}/— pollBase URL: https://api.scrapeguys.com · Auth: X-API-Key: gsk_… with the details:<slug> scope of the OTA you name · See the Overview.
details:makemytrip and details:booking; a price scope (ota:<slug>) does not include them, and they are on no existing key — ask your ScrapeGuys contact to add the ones you need. Each lookup costs 1 unit, room catalogue included, whether or not the hotel is found; polling is free.Submit a job
Send the OTA and one way to identify the hotel.
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
ota | string | Required | — | makemytrip (alias mmt) or booking. An OTA not offered here, or switched off for the environment, is a 400. |
ota_hotel_id | string | One identity required | — | That OTA's own id. MakeMyTrip: the hotelId. Booking.com: the numeric hotel id, or the web page's cc/slug (in/the-taj-mahal-palace-mumbai). |
url | string | ″ | — | That OTA's hotel page; the id is read off it at submit. A URL for another OTA, or a link without an id, is a 400 that says why. A Goibibo link with mmtId= counts as MakeMyTrip. |
place_id | string | ″ | — | Google Place ID (or a Maps link carrying place_id:). Used only to find the hotel: the OTA id already mapped to that Place ID is used directly; with no mapping, the OTA is searched by the place's name and city. Don't have it? Look it up. |
hotel_name | string | ″ (with city) | — | Searched on the OTA together with city. Beside one of the other identities it is only a hint. |
city | string | With hotel_name alone | — | Optional when another identity is sent. |
include_rooms | boolean | Optional | true | false leaves result.rooms.items empty (status: "skipped") and the answer smaller. |
If you send several identities, the most precise wins: ota_hotel_id / url, then place_id, then hotel_name + city. A stay is refused with 400 — check_in, check_out, adults, rooms, children_ages, currency and similar — because this endpoint describes the hotel, not a night's stay. For rates, use Cheapest Room or an OTA guide such as Booking.com.
A lookup takes about 2–10 seconds: one request to MakeMyTrip, or two to Booking.com (the profile with its photos and rooms, then its surroundings), plus the OTA's own search when you identify the hotel by name.
Poll for results
Poll the poll_url every ~2 seconds until status is completed or failed.
status | found | Meaning |
|---|---|---|
pending / processing | null | Not done yet. |
completed | true | The profile is in result.hotel, the rooms in result.rooms. |
completed | false | An answer, not an error: result.reason is not_found (nothing on the OTA matched what you sent; result.resolution.detail says what was tried) or not_listed (the OTA has no live listing under that id). |
failed | null | The lookup itself failed; error_message says why. Nothing is known about the hotel either way — retry. |
Response schema
Result fields
| Field | Meaning |
|---|---|
hotel_id | The OTA id the profile was read from. For Booking.com, the numeric hotel id even when you sent the web slug. |
listing_url | The OTA's own page for the hotel — a permanent URL, never a dated or tracking link. |
resolution | How the hotel was identified: input (which of your fields decided it), provenance (supplied your id; place_pinned an id we already hold for that Place ID; cache / catalog / live the OTA's search), plus match_score and matched_name when a search picked it. Never carries anything Google said. |
incomplete | Sections the OTA did not deliver on this answer — landmarks, rating, images or rooms — so an empty one is not mistaken for "the OTA lists none". Usually []; a later lookup normally fills the gap. |
hotel.star_rating.type | official (a classification) or self_rated (Booking.com marks a property's own assessment this way); null when the OTA did not say. |
hotel.rating.scale | The scale the score is on: 5 on MakeMyTrip, 10 on Booking.com. Scores are reported as the OTA states them, not rescaled. A MakeMyTrip score of 0 means unrated, not a 0/5 rating. |
hotel.address.state | Not stated by either OTA today; kept for the schema. |
hotel.policies | min_check_in_age, children and extra_bed lines, and every other house rule under the OTA's own category, all verbatim. |
hotel.landmarks[].distance | As the OTA words it ("5 min walk", "2.4 km"); distance_m is the same in metres where it can be read. |
rooms.items[] | The room catalogue: name, id, size, bed, view, capacity (max_guests, unknown when the OTA's figure is implausible), description, amenities, photos. No offers, no prices, no availability. |
rooms.status | ok, no_rooms (the OTA listed none) or skipped (include_rooms: false). |
What each OTA provides
| MakeMyTrip | Booking.com | |
|---|---|---|
| Photos | Up to 60 of the property's own photos, by category | Up to 60 from the property's gallery, uncategorised |
| Rating | Score /5, count, label, sub-scores | Score /10, count, sub-scores; no label |
| Landmarks | Up to 5 of each kind listed (attractions, restaurants, metro, ferry, airport…) | Up to 5 attractions, nearby places, beaches and restaurants; up to 2 metro, train and airport |
| Policies | Must-read and house rules, infant, child and extra-bed lines | Minimum check-in age, whether children are allowed, pets, ID/card at check-in, accepted cards, fine print. No child or extra-bed policy text |
| Rooms | Every room type, from the same call | Every room type the property lists, from the same call |
Errors
Submit — 400 (no identity, a stay sent, a URL for another OTA, an OTA not offered or switched off), 401 (missing, unknown or deactivated key), 403 (key lacks details:<slug>), 429 (per-minute limit, or daily / monthly quota exhausted). No job is created on any of these. Poll — 404 (unknown id, or another client's job), 401, 403 (key lacks the scope of the job's OTA).