Skip to content
Hotels.com

Hotels.com search

Resolve a hotel name to Hotels.com's numeric property identifier.

POST/v1/ota/hotels/search
1 credit

This uses Hotels.com's lightweight typeahead response. Add city to disambiguate common brands, then store recommended_match.property_id for headline-price and room calls. It is null when only weak or ambiguous candidates were found.

Request

POSThttps://api.scrapercompany.com/v1/ota/hotels/search

Authenticate with your API key in the x-api-key header (see Authentication).

Body

JSON object. Unknown fields are rejected with 422.

  • namestringrequiredmin length 1

    Hotel name as a guest would search for it.

  • citystringdefault

    Strongly recommended. Used both in Hotels.com's query and in local candidate ranking so same-brand hotels in other cities rank lower.

  • marketstringdefault US

    Hotels.com point-of-sale used for search results. This also matches the market accepted by the rate and room endpoints.

    One ofAUCADEEUFRGBIEITNLNZUS

  • limitintegerdefault 5min 1, max 10

    Maximum hotel candidates to return, best match first.

Example request

curl -X POST "https://api.scrapercompany.com/v1/ota/hotels/search" \
  -H "x-api-key: $SCRAPERCOMPANY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Moxy Boston Downtown",
    "city": "Boston",
    "market": "US"
  }'

Response

200 — Candidate Hotels.com numeric property ids, with city-aware ranking. Metered responses carry x-credits-charged and x-credits-remaining headers (see credit headers).

200 response
{
  "search_parameters": {
    "engine": "hotels_search",
    "name": "Moxy Boston Downtown",
    "city": "Boston",
    "market": "US",
    "limit": 5
  },
  "search_status": "matched",
  "recommended_match": {
    "property_id": "38766175",
    "name": "Moxy Boston Downtown",
    "city": "Boston",
    "address": "240 TREMONT STREET, Boston, MA",
    "country": "USA",
    "url": "https://www.hotels.com/ho38766175",
    "rank": 0,
    "score": 1,
    "name_score": 1,
    "identity_score": 1,
    "match_score": 1,
    "confidence": "high",
    "city_score": 1,
    "winner_reason": "EXACT_MATCH",
    "coordinates": {
      "latitude": 42.350952,
      "longitude": -71.064804
    }
  },
  "warnings": [],
  "matches": [
    {
      "property_id": "38766175",
      "name": "Moxy Boston Downtown",
      "city": "Boston",
      "address": "240 TREMONT STREET, Boston, MA",
      "country": "USA",
      "url": "https://www.hotels.com/ho38766175",
      "rank": 0,
      "score": 1,
      "name_score": 1,
      "identity_score": 1,
      "match_score": 1,
      "confidence": "high",
      "city_score": 1,
      "winner_reason": "EXACT_MATCH",
      "coordinates": {
        "latitude": 42.350952,
        "longitude": -71.064804
      }
    }
  ],
  "meta": {
    "source": "hotels",
    "matches": 1,
    "selection_method": "name_city_confidence",
    "match_threshold": 0.8,
    "match_margin": 0.12,
    "wire_bytes": 921,
    "elapsed_s": 0.184
  }
}

Response fields

Fields marked required are always present; others appear when they apply.

  • search_parametersobjectrequired
    Show 5 child fields
    • search_parameters.enginestringrequired

      One ofhotels_search

    • search_parameters.namestringrequired
    • search_parameters.citystringrequired
    • search_parameters.marketstringrequired
    • search_parameters.limitintegerrequired
  • search_statusstringrequired

    matched only when the top candidate clears the identity threshold and margin.

    One ofmatchedambiguousnot_found

  • recommended_matchobject | nullrequired

    Safe to store; null unless search_status is matched.

    Show 15 child fields
    • recommended_match.property_idstringrequired

      Numeric Hotels.com id (digits); pass as property_id.

    • recommended_match.namestringrequired
    • recommended_match.citystringrequired
    • recommended_match.addressstringrequired
    • recommended_match.countrystringrequired
    • recommended_match.urlstringrequired
    • recommended_match.rankintegerrequired
    • recommended_match.scorenumberrequired
    • recommended_match.name_scorenumberrequired
    • recommended_match.identity_scorenumberrequired
    • recommended_match.match_scorenumberrequired
    • recommended_match.confidencestringrequired

      One ofhighmediumlow

    • recommended_match.winner_reasonstringrequired
    • recommended_match.city_scorenumber

      Present only when city was supplied.

    • recommended_match.coordinatesobject

      Present only when the source returned coordinates.

      Show 2 child fields
      • recommended_match.coordinates.latitudenumberrequired
      • recommended_match.coordinates.longitudenumberrequired
  • warningsarray of stringrequired
  • matchesarray of objectrequired

    Candidates, best first, for manual review.

    Show 15 child fields
    • matches[].property_idstringrequired

      Numeric Hotels.com id (digits); pass as property_id.

    • matches[].namestringrequired
    • matches[].citystringrequired
    • matches[].addressstringrequired
    • matches[].countrystringrequired
    • matches[].urlstringrequired
    • matches[].rankintegerrequired
    • matches[].scorenumberrequired
    • matches[].name_scorenumberrequired
    • matches[].identity_scorenumberrequired
    • matches[].match_scorenumberrequired
    • matches[].confidencestringrequired

      One ofhighmediumlow

    • matches[].winner_reasonstringrequired
    • matches[].city_scorenumber

      Present only when city was supplied.

    • matches[].coordinatesobject

      Present only when the source returned coordinates.

      Show 2 child fields
      • matches[].coordinates.latitudenumberrequired
      • matches[].coordinates.longitudenumberrequired
  • metaobjectrequired
    Show 7 child fields
    • meta.sourcestringrequired
    • meta.matchesintegerrequired
    • meta.selection_methodstringrequired
    • meta.match_thresholdnumberrequired
    • meta.match_marginnumberrequired
    • meta.wire_bytesintegerrequired
    • meta.elapsed_snumberrequired

Errors

Errors return a JSON body with a detail field. Failed requests are not charged. See Errors for the full list and retry advice.

StatusMeaningRetry?
401Unauthorized

Missing or invalid API key.

{"detail":"missing or invalid API key"}
No, fix the request
402Payment Required

Not enough credits for this request. Only returned once credit enforcement is switched on; during the beta metering runs in shadow mode and never blocks.

{"detail":"insufficient credits: this request costs 5, 0 available. Credits renew 2026-11-01."}
No, fix the request
422Unprocessable Content

Request validation failed. detail is a list of problems for schema errors, or a string for semantic checks performed by the endpoint.

{"detail":[{"loc":["body","name"],"msg":"Field required","type":"missing"}]}
No, fix the request
429Too Many Requests

Too many requests: the key's requests-per-minute limit was exceeded, or (once credit enforcement is on) the plan's concurrent-request limit. No rate-limit or Retry-After headers are sent; back off and retry.

{"detail":"rate limit 60/min exceeded"}
Yes, with backoff
502Bad Gateway

The upstream source failed, blocked the request or returned an unusable answer. Safe to retry later; failed requests are not charged.

{"detail":"RuntimeError"}
Yes, with backoff

Try it

  1. Export your key: export SCRAPERCOMPANY_API_KEY=sk_... (no key yet? request access).
  2. Copy the cURL example above and run it in a terminal.
  3. Or open the interactive playground on api.scrapercompany.com, paste your key and pick this endpoint.

Credits

1 credit per successful call. Failed, blocked and empty results are free. Credit metering is in beta and does not block requests yet.