Irmu
API Reference

Search Tripadvisor hotels

GET /tripadvisor/search — bearer auth, JSON responses, billed per successful request.

GET/tripadvisor/search

Search Tripadvisor hotels

Searches Tripadvisor for hotels and returns one row per hotel card, including rating, subratings, ranking, price, amenities, and the quoted review. The crawler interacts with the page as a visitor would: typing the destination, selecting dates, setting rooms and guests, applying filters, entering a price range, and choosing sort order. Only destination is required; omitted parameters leave the page unchanged rather than applying defaults.

When to use it

Use this when you need structured hotel data from Tripadvisor's search results, including properties that appear nearby or as sponsored listings. Use max_pages to control result volume and credit cost. Use checkin and checkout together when you need stay-specific pricing; omit both when you only need hotel listings without rates.

Notes

  • A broader result set than expected means a filter or step could not be applied and was skipped; check nearby and sponsored flags to identify non-matching entries.
  • Each page in max_pages costs 30 credits upfront, charged when the crawl starts, even if no results are found or fewer pages exist.
  • Authentication via Authorization header takes precedence over ?key=; if both are present, the query parameter is ignored.
ParameterInTypeDescription
destination *querystringWhere to stay, as you would type it into Tripadvisor's search. The first suggestion that starts with it is taken -- not "Nearby", and not a sponsored place.
checkinquerystring<date>The first night, as `YYYY-MM-DD`, today or later. **Requires `checkout`.** Optional: without dates Tripadvisor still lists the hotels, it just prices them for no stay in particular. With them, `price` is for the stay, and a hotel with no rate for it has none.
checkoutquerystring<date>The day you leave, as `YYYY-MM-DD`, after `checkin`. **Requires `checkin`.**
roomsqueryintegerHow many rooms. Left as the page has it when absent.
adultsqueryintegerHow many adults. Left as the page has it when absent.
childrenqueryintegerHow many children. Their ages are not set.
filtersquerystringFilters to tick, named the way the page prints them -- `Pets Allowed`, `3 Star`, `Budget` -- or by the value on their checkbox, such as `amenity:9167`. Comma-separated, or repeated as `filters[]=`. Up to 20. Which filters a list offers depends on the destination, so one it does not offer is skipped rather than refused.
price_minqueryintegerThe lowest nightly price, in the currency the page shows (US dollars on the English site).
price_maxqueryintegerThe highest nightly price, at least `price_min`. One past the end of Tripadvisor's slider means no upper bound.
sortquerybest_value | traveler_ranked | price | distanceHow the list is ordered: `best_value`, `traveler_ranked`, `price` (low to high) or `distance` (to the city center). Left as the page has it when absent.
max_pagesqueryintegerHow many pages of results to read, through "Next page". **Each one is 30 credits**, charged for when the crawl starts whether or not the list turns out to have that many.
premiumquerystringGo through the premium proxy pool rather than the standard one. **On by default**, because Tripadvisor sits behind DataDome, which turns the standard pool away; send `false` to use the standard pool. Free either way. `true`, `false`, `1`, `0`, `yes`, `no`, `on`, `off`, in any case. Anything else is refused rather than read as `false`.
countryquerystringThe country to appear to be browsing from, as a two-letter ISO 3166-1 alpha-2 code. Free. Required to use `city`.
cityquerystringThe city inside that country, as the pool spells it. **Requires `country`.** Free here, where on `/crawl` it doubles the price.
keyquerystringThe API key, as an alternative to the `Authorization` header. Ignored when a header is present.
request.sh
curl -X GET "https://app.irmu.com/api/tripadvisor/search?destination=&checkin=&checkout=&rooms=&adults=&children=&filters=&price_min=&price_max=&sort=&max_pages=&premium=&country=&city=&key=" \
  -H "Authorization: Bearer $IRMU_API_KEY"
200.json
{
  "url": "https://www.tripadvisor.com/Hotels-g227870-Sabadell_Catalonia-Hotels.html",
  "destination": "Sabadell",
  "checkin": "2026-11-24",
  "checkout": "2026-11-28",
  "rooms": 1,
  "adults": 2,
  "children": null,
  "filters": [
    "Pets Allowed",
    "3 Star"
  ],
  "price_min": 50,
  "price_max": 150,
  "sort": "traveler_ranked",
  "max_pages": 1,
  "hotels": [
    {
      "position": 3,
      "name": "Catalonia Sabadell",
      "url": "https://www.tripadvisor.com/Hotel_Review-g227870-d284272-Reviews-Catalonia_Sabadell-Sabadell_Catalonia.html",
      "id": "284272",
      "geoId": "227870",
      "rating": 3.7,
      "reviewCount": 554,
      "ratingWord": "Average",
      "subratings": {
        "Location": 4.1,
        "Cleanliness": 4,
        "Service": 4.1,
        "Value": 3.7
      },
      "stars": 4,
      "ranking": {
        "text": "#3 Best Value of 20 places to stay in Sabadell",
        "position": 3,
        "total": 20
      },
      "price": {
        "amount": 112,
        "currency": "USD"
      },
      "amenities": [
        "Restaurant",
        "Bar/Lounge",
        "Free Wifi"
      ],
      "badges": [
        "Breakfast included"
      ],
      "tags": [
        "Fully refundable"
      ],
      "roomsLeft": 2,
      "image": "https://dynamic-media-cdn.tripadvisor.com/media/photo-o/1.jpg",
      "review": {
        "author": "Alejandro M",
        "text": "Very good infrastructure. Comfy room..."
      },
      "sponsored": false,
      "nearby": false,
      "page": 1
    }
  ],
  "credits_charged": 30,
  "credits_remaining": 970,
  "job_id": "0198a9b6-1f4c-7c3e-9a2b-5d8e6f0a1b23_0198a9b6-2a71-7f0d-8c44-9e1b3c5d7f02",
  "status": "done",
  "position": null,
  "debug": null,
  "error": null
}

Guides using this endpoint

    Tripadvisor API overview →
    request.js
    const res = await fetch("https://app.irmu.com/api/tripadvisor/search", {
      method: "GET",
      headers: {
        Authorization: `Bearer ${process.env.IRMU_API_KEY}`,
        "Content-Type": "application/json",
      }
    });
    
    const data = await res.json();
    request.py
    import os, requests
    
    res = requests.get(
        "https://app.irmu.com/api/tripadvisor/search",
        headers={"Authorization": f"Bearer {os.environ['IRMU_API_KEY']}"}
    )
    
    print(res.json())
    StatusMeaning
    200The hotels.
    202Paid for and still going. Collect it from `/crawl/{job}`, free, as a slow crawl is collected. That endpoint answers the crawl envelope, so what is lifted into `hotels` here arrives under `data` there.
    401No key, an unknown key, or a caller that is not an organization.
    402Not enough credits, or the daily limit is reached. Nothing is charged and no attempt is recorded.
    422A malformed request -- no destination, one date without the other, dates in the past, a `price_max` under the `price_min`, a sort that is not one of the four, too many pages, or a flag that is not a yes or a no.
    500The crawl failed outright. **The credits are refunded**, so `credits_charged` is `0`. The attempt is still recorded against `www.tripadvisor.com`.
    503The crawl could not be routed through a proxy pool. Nothing is charged.

    Start building with Irmu today

    200 free credits every month, no card required. Every API, every integration, one key.