{
  "openapi": "3.0.3",
  "info": {
    "title": "TripAdvisor API",
    "version": "1.0.0",
    "description": "**Get your API key:** subscribe on RapidAPI at [https://rapidapi.com/DataCrawlLabs/api/tripadvisor35](https://rapidapi.com/DataCrawlLabs/api/tripadvisor35). Your key is shown there as `X-RapidAPI-Key`.\n\nSend your key in the `X-RapidAPI-Key` header. Outside this page, RapidAPI also needs `X-RapidAPI-Host: tripadvisor35.p.rapidapi.com`."
  },
  "servers": [
    {
      "url": "https://tripadvisor35.p.rapidapi.com/api/v1"
    }
  ],
  "tags": [
    {
      "name": "Common"
    },
    {
      "name": "Search"
    },
    {
      "name": "Home"
    },
    {
      "name": "Places"
    },
    {
      "name": "Hotels"
    },
    {
      "name": "Restaurants"
    },
    {
      "name": "Attractions"
    },
    {
      "name": "Tours"
    },
    {
      "name": "Reviews"
    },
    {
      "name": "Media"
    },
    {
      "name": "Profiles"
    }
  ],
  "components": {
    "securitySchemes": {
      "RapidAPIKey": {
        "type": "apiKey",
        "in": "header",
        "name": "X-RapidAPI-Key"
      },
      "RapidAPIHost": {
        "type": "apiKey",
        "in": "header",
        "name": "X-RapidAPI-Host",
        "description": "tripadvisor35.p.rapidapi.com"
      }
    }
  },
  "paths": {
    "/search/autocomplete": {
      "get": {
        "tags": [
          "Search"
        ],
        "summary": "About 10 suggestions grouped under headings: places, \"hotels in ...\", hotels, restaurants, tours. Each says where it leads.",
        "description": "Suggestions while the user types. It works from the first letter.\n\n**Response**\n\n- Every result has a `route` with `page` and `params`. They are the inputs of the next endpoints:\n  - `AppList` with `{contentType, geoId}` is a list of a place (hotels, restaurants, things to do).\n  - `AppDetail` with `{contentId, contentType}` is one hotel, restaurant or tour.\n  - `AppSearch` with `{query}` is a full search.\n\n**Position** (`latitude` and `longitude`, send both or neither)\n\n- Suggestions favour places near the position. `query=hotel` in Paris suggests Paris hotels, in Tokyo Tokyo hotels.\n- It also adds a \"near me\" entry (group `Near you`). Its route holds your position, for `/places/nearby`.\n- Without a position the suggestions are not tied to the user.\n- An empty `query` returns only the \"Explore nearby\" entry, and needs a position.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "description": "The text typed, e.g. `new york`.\n\n**Empty:** nearby places and recent searches.",
            "schema": {
              "type": "string",
              "example": "new york"
            }
          },
          {
            "name": "latitude",
            "in": "query",
            "description": "The user's position, **sent together with `longitude`** (both or neither). Makes the suggestions favour places near it.\n\nRange: `-90` to `90`.",
            "schema": {
              "type": "number",
              "example": 48.8566
            }
          },
          {
            "name": "longitude",
            "in": "query",
            "description": "The user's position, **sent together with `latitude`**.\n\nRange: `-180` to `180`.",
            "schema": {
              "type": "number",
              "example": 2.3522
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "data.query, data.count, data.groups[] {key, title, count, results[]}. Groups (only those with results, in this order): Searches, Places, Browse by category, Hotels, Restaurants, Things to do, Tours and tickets. Every result has the same keys: title, texts[], html[], photo, icons[], ids, route {page, params, url}, next {endpoint, params}. Each result appears once",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/search/results": {
      "get": {
        "tags": [
          "Search"
        ],
        "summary": "Everything that matches a text, grouped (places, hotels, restaurants, things to do, tours), with tabs and \"show more\".",
        "description": "A full search, with the results grouped under headers.\n\n**Response**\n\n- `groups[]` are the result groups.\n- Every result has a `next`, the call that opens it: `/hotels/details`, `/restaurants/details`, `/attractions/details`, `/tours/details` or `/places/overview`.\n- `tabs[]` is the category bar: All Results, Destinations, Hotels, Things to Do, Restaurants, Forums.\n- `currentTab` names the selected tab.\n\n**How the tabs work**\n\n- Exactly one tab has `selected: true`. The `groups[]` of the same answer are the results of that tab, so you already have them.\n- Every other tab has a `next`. Call it (it is this same endpoint, with your `query` and the tab's token already filled in) to get that tab's results.\n- The selected tab has `next: null` because you are already on it. That is not an error. To leave it, call the `next` of any other tab.\n- On a first search the selected tab is always All Results, the top matches of every category. After you open Hotels, All Results gets a `next` that takes you back.\n\n**More results**\n\n- Inside a category tab, `nextPage` (\"Show more\") has a `next` that returns the following 10 results. Keep calling the `nextPage.next` of each answer until `nextPage` is `null`.\n- On All Results `nextPage` is always `null` and `hint` says so. TripAdvisor's own \"Show more\" on that tab returns the same ten results again, so it is not offered. Open a category tab to see more.\n\n**Notes**\n\n- You never need to read or copy a token. Only follow `next`. The `updateToken` parameter is how that call carries it.\n- A token belongs to the query it came from.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "required": true,
            "description": "The text to search, e.g. `new york`.",
            "schema": {
              "type": "string",
              "example": "new york"
            }
          },
          {
            "name": "updateToken",
            "in": "query",
            "description": "Already set for you inside `next.params` of a tab or of `nextPage`.\n\n**You never build it:** just follow `next`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "data.query, data.currentTab (title of the selected tab), data.count, data.tabs[] {title, selected, next (null on the selected tab)}, data.groups[] {key, title, count, results[]}, data.nextPage {title, next} (null on All Results), data.hint. Groups (only those with results, in this order): Top result, Places, Hotels, Restaurants, Things to do, Tours and tickets. Every result has the same keys: title, kind, rating {value, text, reviews}, texts[], snippet {text, html}, photo, saved, ids, route {page, params, url}, next {endpoint, params}. Each result appears once",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/places/locate": {
      "get": {
        "tags": [
          "Places"
        ],
        "summary": "The place id and name for a GPS position.",
        "description": "The place a position is in, with its `geoId`.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "latitude",
            "in": "query",
            "required": true,
            "description": "Latitude, `-90` to `90`.",
            "schema": {
              "type": "number",
              "example": 40.7128
            }
          },
          {
            "name": "longitude",
            "in": "query",
            "required": true,
            "description": "Longitude, `-180` to `180`.",
            "schema": {
              "type": "number",
              "example": -74.006
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer of a list or page screen: a title, then named parts. Lists: data.blocks[] {key, title, subtitle, seeAll, count, results[]} where every result is a card with the same keys (type, title, position, sponsored, labels, rating, texts, description, badge, price, photos, saved, links, ids, route); data.sorts[], data.filters {filters[] {id, title, kind, options[] or range}}, data.dates (date rules), data.map[] (pins with latitude and longitude), data.nextPage {updateToken}",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/places/overview": {
      "get": {
        "tags": [
          "Places"
        ],
        "summary": "Hotels, things to do and restaurants of a place as rows of cards, forum topics, a map and filters.",
        "description": "The overview page of a place.\n\n**Parameter notes**\n\n- Take `geoId` from the `route.params` of the `/search` results.\n- The tabs carry `updateToken`s.\n\n**Response**\n\n- `data.results[]` are the places (hotels, restaurants, tours ...), each with `id`, `title`, `rating{value, reviewCount}`, `price`, `photos[]`, `labels[]`, `links[]`, `map{latitude, longitude, rankingText}` and `next`, the call that opens it.\n- Lists with several shelves (overview, restaurants, things to do) put them in `data.sections[]`.\n- `data.sort` has the selected order and all options.\n- `data.filters` is the filter menu and `data.appliedFilters` what was applied.\n- `data.dates` has the date limits and a price calendar.\n- `data.nextPage.next` is the call for the next page.\n- `data.ignoredFilters` lists the filters you asked for that TripAdvisor did not apply. If none could be applied, the answer is an error that lists the valid ids and values.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "geoId",
            "in": "query",
            "required": true,
            "description": "Place id, taken from `link.route.params.geoId` in the `/search` results.",
            "schema": {
              "type": "integer",
              "example": 60763
            }
          },
          {
            "name": "currencyCode",
            "in": "query",
            "description": "Currency of the prices, **3 letters** like `EUR`. The list is `GET /common/currencies`.\n\nDefault: `USD`.",
            "schema": {
              "type": "string",
              "default": "USD",
              "example": "USD"
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          },
          {
            "name": "updateToken",
            "in": "query",
            "description": "The `updateToken` of a tab, of `nextPage`, or of an unfinished screen from the previous answer.\n\n**Copy it from `next.params`**, do not build it.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "waitForComplete",
            "in": "query",
            "description": "- `true` (default): unfinished screens (prices still loading) are polled until complete, so one call may use several provider calls.\n- `false`: return the first answer as it is.",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer of a list or page screen: a title, then named parts. Lists: data.blocks[] {key, title, subtitle, seeAll, count, results[]} where every result is a card with the same keys (type, title, position, sponsored, labels, rating, texts, description, badge, price, photos, saved, links, ids, route); data.sorts[], data.filters {filters[] {id, title, kind, options[] or range}}, data.dates (date rules), data.map[] (pins with latitude and longitude), data.nextPage {updateToken}",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/places/hotels": {
      "get": {
        "tags": [
          "Places"
        ],
        "summary": "Hotels with rating, area, price and provider for your dates, sort options, filters, map pins and the next page.",
        "description": "The hotels of a place, with rating, area, price and provider for your dates.\n\n**Parameter notes**\n\n- Prices need dates and guests. Unfinished price screens are polled and merged, so the cards carry prices.\n- `currencyCode` sets the price currency.\n- `adults` (1-4), `children` (ages) or `rooms` set the party the prices are for.\n- `sort` sets the order. Sort ids and filter ids come from `/places/filters`.\n\n**Response**\n\n- `data.results[]` are the places (hotels, restaurants, tours ...), each with `id`, `title`, `rating{value, reviewCount}`, `price`, `photos[]`, `labels[]`, `links[]`, `map{latitude, longitude, rankingText}` and `next`, the call that opens it.\n- Lists with several shelves (overview, restaurants, things to do) put them in `data.sections[]`.\n- `data.sort` has the selected order and all options.\n- `data.filters` is the filter menu and `data.appliedFilters` what was applied.\n- `data.dates` has the date limits and a price calendar.\n- `data.nextPage.next` is the call for the next page.\n- `data.ignoredFilters` lists the filters you asked for that TripAdvisor did not apply. If none could be applied, the answer is an error that lists the valid ids and values.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "geoId",
            "in": "query",
            "required": true,
            "description": "Place id, taken from `link.route.params.geoId` in the `/search` results.",
            "schema": {
              "type": "integer",
              "example": 60763
            }
          },
          {
            "name": "checkIn",
            "in": "query",
            "description": "Check-in day, `YYYY-MM-DD`.\n\nDefault: 30 days from today.",
            "schema": {
              "type": "string",
              "format": "date",
              "example": "2026-12-10"
            }
          },
          {
            "name": "checkOut",
            "in": "query",
            "description": "Check-out day, `YYYY-MM-DD`.\n\nDefault: the day after check-in. **At most 30 nights.**",
            "schema": {
              "type": "string",
              "format": "date",
              "example": "2026-12-11"
            }
          },
          {
            "name": "adults",
            "in": "query",
            "description": "Adults in the room, `1` to `4` (TripAdvisor limit per room).\n\n**Needed when `children` is sent.** For more rooms use `rooms`.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 4
            }
          },
          {
            "name": "children",
            "in": "query",
            "description": "Ages of the children in the room, `0` to `17`, comma separated, at most 10, e.g. `5,7`.\n\n**Needs `adults`.**",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "rooms",
            "in": "query",
            "description": "Several rooms, written `adults:childAges` per room and rooms separated by `;`.\n\nExample: `2:5,7;1` = room 1 with two adults and children aged 5 and 7, room 2 with one adult.\n\nAt most 8 rooms. **Cannot be combined with `adults` / `children`.**",
            "schema": {
              "type": "string",
              "example": "2:5,7;1"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "description": "Sort id from `GET /places/filters` (`contentType=hotel`):\n\n- `BEST_VALUE`\n- `POPULARITY`\n- `PRICE_LOW_TO_HIGH`\n- `DISTANCE_FROM_CITY_CENTER`\n\nAn id the list does not have is **ignored**: the list stays in Best value order.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filters",
            "in": "query",
            "description": "Filters written `id:value1,value2;id2:value`.\n\nThe filter ids and their values are listed in `data.filters` of the list itself (or `GET /places/filters`).\n\nIf **none** of the filters could be applied, the answer is an error that lists the valid ones.",
            "schema": {
              "type": "string",
              "example": "class:9566"
            }
          },
          {
            "name": "currencyCode",
            "in": "query",
            "description": "Currency of the prices, **3 letters** like `EUR`. The list is `GET /common/currencies`.\n\nDefault: `USD`.",
            "schema": {
              "type": "string",
              "default": "USD",
              "example": "USD"
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          },
          {
            "name": "updateToken",
            "in": "query",
            "description": "The `updateToken` of a tab, of `nextPage`, or of an unfinished screen from the previous answer.\n\n**Copy it from `next.params`**, do not build it.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "waitForComplete",
            "in": "query",
            "description": "- `true` (default): unfinished screens (prices still loading) are polled until complete, so one call may use several provider calls.\n- `false`: return the first answer as it is.",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer of a list or page screen: a title, then named parts. Lists: data.blocks[] {key, title, subtitle, seeAll, count, results[]} where every result is a card with the same keys (type, title, position, sponsored, labels, rating, texts, description, badge, price, photos, saved, links, ids, route); data.sorts[], data.filters {filters[] {id, title, kind, options[] or range}}, data.dates (date rules), data.map[] (pins with latitude and longitude), data.nextPage {updateToken}",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/places/restaurants": {
      "get": {
        "tags": [
          "Places"
        ],
        "summary": "Restaurants in named rows, filters and map pins.",
        "description": "The restaurants of a place. Cuisines, dining options and filters come back in the same answer.\n\n**Parameter notes**\n\n- Filter ids come from `/places/filters`.\n\n**Response**\n\n- `data.results[]` are the places (hotels, restaurants, tours ...), each with `id`, `title`, `rating{value, reviewCount}`, `price`, `photos[]`, `labels[]`, `links[]`, `map{latitude, longitude, rankingText}` and `next`, the call that opens it.\n- Lists with several shelves (overview, restaurants, things to do) put them in `data.sections[]`.\n- `data.sort` has the selected order and all options.\n- `data.filters` is the filter menu and `data.appliedFilters` what was applied.\n- `data.dates` has the date limits and a price calendar.\n- `data.nextPage.next` is the call for the next page.\n- `data.ignoredFilters` lists the filters you asked for that TripAdvisor did not apply. If none could be applied, the answer is an error that lists the valid ids and values.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "geoId",
            "in": "query",
            "required": true,
            "description": "Place id, taken from `link.route.params.geoId` in the `/search` results.",
            "schema": {
              "type": "integer",
              "example": 60763
            }
          },
          {
            "name": "partySize",
            "in": "query",
            "description": "People at the table, `1` to `20`.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 20
            }
          },
          {
            "name": "fullList",
            "in": "query",
            "description": "- `true`: the flat list of every place with sorting and paging (what \"View all\" opens).\n- `false` (default): the overview page of shelves such as Top attractions. Its \"View all\" links already carry `fullList=true`.\n\nNot needed with `filters` or for tours.",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "filters",
            "in": "query",
            "description": "Filters written `id:value1,value2;id2:value`.\n\nThe filter ids and their values are listed in `data.filters` of the list itself (or `GET /places/filters`).\n\nIf **none** of the filters could be applied, the answer is an error that lists the valid ones.",
            "schema": {
              "type": "string",
              "example": "cuisine:9908"
            }
          },
          {
            "name": "currencyCode",
            "in": "query",
            "description": "Currency of the prices, **3 letters** like `EUR`. The list is `GET /common/currencies`.\n\nDefault: `USD`.",
            "schema": {
              "type": "string",
              "default": "USD",
              "example": "USD"
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          },
          {
            "name": "updateToken",
            "in": "query",
            "description": "The `updateToken` of a tab, of `nextPage`, or of an unfinished screen from the previous answer.\n\n**Copy it from `next.params`**, do not build it.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "waitForComplete",
            "in": "query",
            "description": "- `true` (default): unfinished screens (prices still loading) are polled until complete, so one call may use several provider calls.\n- `false`: return the first answer as it is.",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer of a list or page screen: a title, then named parts. Lists: data.blocks[] {key, title, subtitle, seeAll, count, results[]} where every result is a card with the same keys (type, title, position, sponsored, labels, rating, texts, description, badge, price, photos, saved, links, ids, route); data.sorts[], data.filters {filters[] {id, title, kind, options[] or range}}, data.dates (date rules), data.map[] (pins with latitude and longitude), data.nextPage {updateToken}",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/places/things-to-do": {
      "get": {
        "tags": [
          "Places"
        ],
        "summary": "Attractions or tours in named rows, with ratings and \"from\" prices, filters and map pins.",
        "description": "The things to do of a place: attractions, tours and tickets.\n\n**Parameter notes**\n\n- Filter ids come from `/places/filters`.\n\n**Response**\n\n- `data.results[]` are the places (hotels, restaurants, tours ...), each with `id`, `title`, `rating{value, reviewCount}`, `price`, `photos[]`, `labels[]`, `links[]`, `map{latitude, longitude, rankingText}` and `next`, the call that opens it.\n- Lists with several shelves (overview, restaurants, things to do) put them in `data.sections[]`.\n- `data.sort` has the selected order and all options.\n- `data.filters` is the filter menu and `data.appliedFilters` what was applied.\n- `data.dates` has the date limits and a price calendar.\n- `data.nextPage.next` is the call for the next page.\n- `data.ignoredFilters` lists the filters you asked for that TripAdvisor did not apply. If none could be applied, the answer is an error that lists the valid ids and values.\n\n**Notes**\n\n- Two kinds of result come back: `contentType` attraction (a place you visit, details in `/attractions`) and `attraction_product` (a tour, ticket or activity, details in `/tours`).\n- A tour is not an attraction. Use `/tours` for anything with `contentType` attraction_product.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "geoId",
            "in": "query",
            "required": true,
            "description": "Place id, taken from `link.route.params.geoId` in the `/search` results.",
            "schema": {
              "type": "integer",
              "example": 60763
            }
          },
          {
            "name": "contentType",
            "in": "query",
            "description": "- `attraction` (default): attractions and sights.\n- `attraction_product`: tours, tickets and activities.\n\nUse the `contentType` of the link you followed.",
            "schema": {
              "type": "string",
              "enum": [
                "attraction",
                "attraction_product"
              ],
              "default": "attraction"
            }
          },
          {
            "name": "startDate",
            "in": "query",
            "description": "Day of the visit, `YYYY-MM-DD`.\n\nDefault: 1 day from today.",
            "schema": {
              "type": "string",
              "format": "date",
              "example": "2026-12-10"
            }
          },
          {
            "name": "fullList",
            "in": "query",
            "description": "- `true`: the flat list of every place with sorting and paging (what \"View all\" opens).\n- `false` (default): the overview page of shelves such as Top attractions. Its \"View all\" links already carry `fullList=true`.\n\nNot needed with `filters` or for tours.",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "filters",
            "in": "query",
            "description": "Filters written `id:value1,value2;id2:value`.\n\nThe filter ids and their values are listed in `data.filters` of the list itself (or `GET /places/filters`).\n\nIf **none** of the filters could be applied, the answer is an error that lists the valid ones.",
            "schema": {
              "type": "string",
              "example": "category:42"
            }
          },
          {
            "name": "currencyCode",
            "in": "query",
            "description": "Currency of the prices, **3 letters** like `EUR`. The list is `GET /common/currencies`.\n\nDefault: `USD`.",
            "schema": {
              "type": "string",
              "default": "USD",
              "example": "USD"
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          },
          {
            "name": "updateToken",
            "in": "query",
            "description": "The `updateToken` of a tab, of `nextPage`, or of an unfinished screen from the previous answer.\n\n**Copy it from `next.params`**, do not build it.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "waitForComplete",
            "in": "query",
            "description": "- `true` (default): unfinished screens (prices still loading) are polled until complete, so one call may use several provider calls.\n- `false`: return the first answer as it is.",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer of a list or page screen: a title, then named parts. Lists: data.blocks[] {key, title, subtitle, seeAll, count, results[]} where every result is a card with the same keys (type, title, position, sponsored, labels, rating, texts, description, badge, price, photos, saved, links, ids, route); data.sorts[], data.filters {filters[] {id, title, kind, options[] or range}}, data.dates (date rules), data.map[] (pins with latitude and longitude), data.nextPage {updateToken}",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/places/filters": {
      "get": {
        "tags": [
          "Places"
        ],
        "summary": "Every sort order and filter (with its choices) a list accepts.",
        "description": "Only the menus of a list: how it can be sorted and filtered.\n\n**Response**\n\n- `sort.options[]` are the sort options. Send the id as `sort` to the hotel list.\n- `filters.filters[]` are the filters with their values. Send the ids and values as `filters`.\n- `appliedFilters` shows which values are selected when you send `filters`.\n\n**Notes**\n\n- Pass the `geoId` and the `contentType` of the list.\n- Filters differ per kind of list. A filter id of one kind (for example `cuisine`, restaurants only) is an error for another.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "geoId",
            "in": "query",
            "required": true,
            "description": "Place id, taken from `link.route.params.geoId` in the `/search` results.",
            "schema": {
              "type": "integer",
              "example": 60763
            }
          },
          {
            "name": "contentType",
            "in": "query",
            "required": true,
            "description": "One of `hotel`, `restaurant`, `attraction`.",
            "schema": {
              "type": "string",
              "enum": [
                "hotel",
                "restaurant",
                "attraction"
              ],
              "example": "restaurant"
            }
          },
          {
            "name": "filters",
            "in": "query",
            "description": "Filters written `id:value1,value2;id2:value`.\n\nThe filter ids and their values are listed in `data.filters` of the list itself (or `GET /places/filters`).\n\nIf **none** of the filters could be applied, the answer is an error that lists the valid ones.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "currencyCode",
            "in": "query",
            "description": "Currency of the prices, **3 letters** like `EUR`. The list is `GET /common/currencies`.\n\nDefault: `USD`.",
            "schema": {
              "type": "string",
              "default": "USD",
              "example": "USD"
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "data.contentType, data.geoId, data.sort {selected, options[]}, data.filters {showAllText, filters[] {id, title, kind, options[] | range}}, data.appliedFilters[], data.ignoredFilters[]",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/places/nearby": {
      "get": {
        "tags": [
          "Places"
        ],
        "summary": "Places around a GPS position as map pins with name, distance, opening state and price.",
        "description": "The places around a position, for an \"Explore nearby\" map.\n\n**Response**\n\n- `data.mapSections[].mapItems[]` are the pins of the map, each with its id, position, name and photo.\n\n**Parameter notes**\n\n- Narrow the pins with `filters`. The \"near me\" entry of `/search/autocomplete` hands you the ids, for example `cuisine:10641` shows only that cuisine.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "latitude",
            "in": "query",
            "required": true,
            "description": "Latitude, `-90` to `90`.",
            "schema": {
              "type": "number",
              "example": 40.7128
            }
          },
          {
            "name": "longitude",
            "in": "query",
            "required": true,
            "description": "Longitude, `-180` to `180`.",
            "schema": {
              "type": "number",
              "example": -74.006
            }
          },
          {
            "name": "contentType",
            "in": "query",
            "description": "One of `attraction`, `hotel`, `restaurant`.",
            "schema": {
              "type": "string",
              "enum": [
                "attraction",
                "hotel",
                "restaurant"
              ]
            }
          },
          {
            "name": "filters",
            "in": "query",
            "description": "Filters written `id:value1,value2;id2:value`.\n\nThe filter ids and their values are listed in `data.filters` of the list itself (or `GET /places/filters`).\n\nIf **none** of the filters could be applied, the answer is an error that lists the valid ones.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "radiusKm",
            "in": "query",
            "description": "Radius in km, `0.1` to `50`.\n\nDefault: `2`.",
            "schema": {
              "type": "number",
              "default": 2
            }
          },
          {
            "name": "timeZone",
            "in": "query",
            "description": "Time zone name.\n\nDefault: `UTC`.",
            "schema": {
              "type": "string",
              "default": "UTC"
            }
          },
          {
            "name": "currencyCode",
            "in": "query",
            "description": "Currency of the prices, **3 letters** like `EUR`. The list is `GET /common/currencies`.\n\nDefault: `USD`.",
            "schema": {
              "type": "string",
              "default": "USD",
              "example": "USD"
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          },
          {
            "name": "updateToken",
            "in": "query",
            "description": "The `updateToken` of a tab, of `nextPage`, or of an unfinished screen from the previous answer.\n\n**Copy it from `next.params`**, do not build it.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "waitForComplete",
            "in": "query",
            "description": "- `true` (default): unfinished screens (prices still loading) are polled until complete, so one call may use several provider calls.\n- `false`: return the first answer as it is.",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer of a list or page screen: a title, then named parts. Lists: data.blocks[] {key, title, subtitle, seeAll, count, results[]} where every result is a card with the same keys (type, title, position, sponsored, labels, rating, texts, description, badge, price, photos, saved, links, ids, route); data.sorts[], data.filters {filters[] {id, title, kind, options[] or range}}, data.dates (date rules), data.map[] (pins with latitude and longitude), data.nextPage {updateToken}",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/hotels/details": {
      "get": {
        "tags": [
          "Hotels"
        ],
        "summary": "Photos, rating, address, offers, amenities, about text and health and safety.",
        "description": "The page of one hotel.\n\n**Parameter notes**\n\n- `hotelId` is `link.route.params.contentId` in the lists and search results (`contentType` hotel).",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "hotelId",
            "in": "query",
            "required": true,
            "description": "Hotel id, e.g. `99332`.",
            "schema": {
              "type": "integer",
              "example": 99332
            }
          },
          {
            "name": "checkIn",
            "in": "query",
            "description": "Check-in day, `YYYY-MM-DD`.\n\nDefault: 30 days from today.",
            "schema": {
              "type": "string",
              "format": "date",
              "example": "2026-12-10"
            }
          },
          {
            "name": "checkOut",
            "in": "query",
            "description": "Check-out day, `YYYY-MM-DD`.\n\nDefault: the day after check-in. **At most 30 nights.**",
            "schema": {
              "type": "string",
              "format": "date",
              "example": "2026-12-11"
            }
          },
          {
            "name": "adults",
            "in": "query",
            "description": "Adults in the room, `1` to `4` (TripAdvisor limit per room).\n\n**Needed when `children` is sent.** For more rooms use `rooms`.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 4
            }
          },
          {
            "name": "children",
            "in": "query",
            "description": "Ages of the children in the room, `0` to `17`, comma separated, at most 10, e.g. `5,7`.\n\n**Needs `adults`.**",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "rooms",
            "in": "query",
            "description": "Several rooms, written `adults:childAges` per room and rooms separated by `;`.\n\nExample: `2:5,7;1` = room 1 with two adults and children aged 5 and 7, room 2 with one adult.\n\nAt most 8 rooms. **Cannot be combined with `adults` / `children`.**",
            "schema": {
              "type": "string",
              "example": "2:5,7;1"
            }
          },
          {
            "name": "currencyCode",
            "in": "query",
            "description": "Currency of the prices, **3 letters** like `EUR`. The list is `GET /common/currencies`.\n\nDefault: `USD`.",
            "schema": {
              "type": "string",
              "default": "USD",
              "example": "USD"
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          },
          {
            "name": "updateToken",
            "in": "query",
            "description": "The `updateToken` of a tab, of `nextPage`, or of an unfinished screen from the previous answer.\n\n**Copy it from `next.params`**, do not build it.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "waitForComplete",
            "in": "query",
            "description": "- `true` (default): unfinished screens (prices still loading) are polled until complete, so one call may use several provider calls.\n- `false`: return the first answer as it is.",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The page as named parts, the same names on every kind of place (a part that does not apply to that kind is simply absent): name, location, rating {value, text, reviews}, ranking, price {from, button}, offer (hotels), availability (tours), reservation (restaurants), openingHours {status, today, week[]}, photos {count, items[]}, about / aboutSections / tags, keyDetails, itinerary (tours), area {address, latitude, longitude, gettingThere} and map, amenities (hotels), healthAndSafety, importantInfo, operator (tours), contacts, travellerInsights {rating, histogram[]}, reviewsSummary, reviews {filters[], items[], allReviews}, tipsAndQuestions[], travellerPhotos, nearby[] (restaurants and attractions around), similar[] (named shelves of similar places) and exploreNearby. Every place or tour inside carries a route {page, params} for the next call. Hotel prices need the dates; nothing from the app is dropped, values without a named field are kept in `extra`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/hotels/prices": {
      "get": {
        "tags": [
          "Hotels"
        ],
        "summary": "Room prices by provider for your dates, with a complete link to each deal.",
        "description": "The booking deals of one hotel for your dates and guests.\n\n**Response**\n\n- `data.offers[]` are `{provider, available, price{display, total, rate, taxes, fees, currency}, conditions[], url, logo}`.\n- Bookable deals come first, cheapest first.\n- Sites with nothing for these dates have `available: false` and `url: null`.\n- `url` is a complete link (`https://www.tripadvisor.com/Commerce?...`) that opens the deal. TripAdvisor redirects it to the booking site, so it is not the address of the booking site itself.\n\n**Parameter notes**\n\n- Use the same `hotelId`, dates and guests as in `/hotels/details`.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "hotelId",
            "in": "query",
            "required": true,
            "description": "Hotel id, e.g. `99332`.",
            "schema": {
              "type": "integer",
              "example": 99332
            }
          },
          {
            "name": "checkIn",
            "in": "query",
            "description": "Check-in day, `YYYY-MM-DD`.\n\nDefault: 30 days from today.",
            "schema": {
              "type": "string",
              "format": "date",
              "example": "2026-12-10"
            }
          },
          {
            "name": "checkOut",
            "in": "query",
            "description": "Check-out day, `YYYY-MM-DD`.\n\nDefault: the day after check-in. **At most 30 nights.**",
            "schema": {
              "type": "string",
              "format": "date",
              "example": "2026-12-11"
            }
          },
          {
            "name": "adults",
            "in": "query",
            "description": "Adults in the room, `1` to `4` (TripAdvisor limit per room).\n\n**Needed when `children` is sent.** For more rooms use `rooms`.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 4
            }
          },
          {
            "name": "children",
            "in": "query",
            "description": "Ages of the children in the room, `0` to `17`, comma separated, at most 10, e.g. `5,7`.\n\n**Needs `adults`.**",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "rooms",
            "in": "query",
            "description": "Several rooms, written `adults:childAges` per room and rooms separated by `;`.\n\nExample: `2:5,7;1` = room 1 with two adults and children aged 5 and 7, room 2 with one adult.\n\nAt most 8 rooms. **Cannot be combined with `adults` / `children`.**",
            "schema": {
              "type": "string",
              "example": "2:5,7;1"
            }
          },
          {
            "name": "currencyCode",
            "in": "query",
            "description": "Currency of the prices, **3 letters** like `EUR`. The list is `GET /common/currencies`.\n\nDefault: `USD`.",
            "schema": {
              "type": "string",
              "default": "USD",
              "example": "USD"
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          },
          {
            "name": "updateToken",
            "in": "query",
            "description": "The `updateToken` of a tab, of `nextPage`, or of an unfinished screen from the previous answer.\n\n**Copy it from `next.params`**, do not build it.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "waitForComplete",
            "in": "query",
            "description": "- `true` (default): unfinished screens (prices still loading) are polled until complete, so one call may use several provider calls.\n- `false`: return the first answer as it is.",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer of a list or page screen: a title, then named parts. Lists: data.blocks[] {key, title, subtitle, seeAll, count, results[]} where every result is a card with the same keys (type, title, position, sponsored, labels, rating, texts, description, badge, price, photos, saved, links, ids, route); data.sorts[], data.filters {filters[] {id, title, kind, options[] or range}}, data.dates (date rules), data.map[] (pins with latitude and longitude), data.nextPage {updateToken}",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/hotels/amenities": {
      "get": {
        "tags": [
          "Hotels"
        ],
        "summary": "Every amenity of the hotel, grouped.",
        "description": "The amenities of one hotel, in groups.\n\n**Response**\n\n- `data.groups[]` are `{title, icon, items[]}` (Parking, Internet, Room features ...).\n- `data.count` is the number of items.\n- Same shape as `amenities` in `/hotels/details`.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "hotelId",
            "in": "query",
            "required": true,
            "description": "Hotel id, e.g. `99332`.",
            "schema": {
              "type": "integer",
              "example": 99332
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer of a list or page screen: a title, then named parts. Lists: data.blocks[] {key, title, subtitle, seeAll, count, results[]} where every result is a card with the same keys (type, title, position, sponsored, labels, rating, texts, description, badge, price, photos, saved, links, ids, route); data.sorts[], data.filters {filters[] {id, title, kind, options[] or range}}, data.dates (date rules), data.map[] (pins with latitude and longitude), data.nextPage {updateToken}",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/restaurants/details": {
      "get": {
        "tags": [
          "Restaurants"
        ],
        "summary": "Photos, rating, cuisines, menu, opening hours, about and reservation options.",
        "description": "The page of one restaurant.\n\n**Parameter notes**\n\n- `restaurantId` is `link.route.params.contentId` in the lists and search results (`contentType` restaurant).",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "restaurantId",
            "in": "query",
            "required": true,
            "description": "Restaurant id, e.g. `543689`.",
            "schema": {
              "type": "integer",
              "example": 543689
            }
          },
          {
            "name": "partySize",
            "in": "query",
            "description": "People at the table, `1` to `20`.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "reservationTime",
            "in": "query",
            "description": "Wanted table time, like `2026-12-31T20:00:00`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "currencyCode",
            "in": "query",
            "description": "Currency of the prices, **3 letters** like `EUR`. The list is `GET /common/currencies`.\n\nDefault: `USD`.",
            "schema": {
              "type": "string",
              "default": "USD",
              "example": "USD"
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          },
          {
            "name": "updateToken",
            "in": "query",
            "description": "The `updateToken` of a tab, of `nextPage`, or of an unfinished screen from the previous answer.\n\n**Copy it from `next.params`**, do not build it.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "waitForComplete",
            "in": "query",
            "description": "- `true` (default): unfinished screens (prices still loading) are polled until complete, so one call may use several provider calls.\n- `false`: return the first answer as it is.",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The page as named parts, the same names on every kind of place (a part that does not apply to that kind is simply absent): name, location, rating {value, text, reviews}, ranking, price {from, button}, offer (hotels), availability (tours), reservation (restaurants), openingHours {status, today, week[]}, photos {count, items[]}, about / aboutSections / tags, keyDetails, itinerary (tours), area {address, latitude, longitude, gettingThere} and map, amenities (hotels), healthAndSafety, importantInfo, operator (tours), contacts, travellerInsights {rating, histogram[]}, reviewsSummary, reviews {filters[], items[], allReviews}, tipsAndQuestions[], travellerPhotos, nearby[] (restaurants and attractions around), similar[] (named shelves of similar places) and exploreNearby. Every place or tour inside carries a route {page, params} for the next call. Hotel prices need the dates; nothing from the app is dropped, values without a named field are kept in `extra`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/restaurants/menu": {
      "get": {
        "tags": [
          "Restaurants"
        ],
        "summary": "The full menu: sections, dishes, descriptions and prices.",
        "description": "The full menu of one restaurant.\n\n**Response**\n\n- `data.tabs[].sections[]` are the sections of the menu (Antipasti, Pasta ...). Each has `items[]` with `{name, description, prices[{text, label}]}`.\n- `data.itemCount` is the number of items.\n- `data.providedBy` says who supplied the menu (for example the restaurant or TheFork), with `providedByImage`.\n\n**Notes**\n\n- Some menus reach us obfuscated by TripAdvisor. They are decoded, so every text is plain.\n- Prices are the restaurant's own text in its own currency (for example US$17.00), not `currencyCode`.\n- TripAdvisor has no separate menu call, so this uses one restaurant-page call.\n- A restaurant without a menu on TripAdvisor returns `status: false`.\n- The same menu is also in `data.menu` of `/restaurants/details`, whose `menu.next` points here.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "restaurantId",
            "in": "query",
            "required": true,
            "description": "Restaurant id, e.g. `543689`.",
            "schema": {
              "type": "integer",
              "example": 12425739
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer of a list or page screen: a title, then named parts. Lists: data.blocks[] {key, title, subtitle, seeAll, count, results[]} where every result is a card with the same keys (type, title, position, sponsored, labels, rating, texts, description, badge, price, photos, saved, links, ids, route); data.sorts[], data.filters {filters[] {id, title, kind, options[] or range}}, data.dates (date rules), data.map[] (pins with latitude and longitude), data.nextPage {updateToken}",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/restaurants/hours": {
      "get": {
        "tags": [
          "Restaurants"
        ],
        "summary": "Opening hours for the week.",
        "description": "The opening hours of one restaurant.\n\n**Response**\n\n- `data.week[]` is `{day, status, hours[]}` for every day, with the hours as TripAdvisor writes them (for example 11:30 AM - 11:00 PM).\n- `data.serving` are the meals (Lunch • Dinner).\n- Same block as `openingHours` in `/restaurants/details`.\n\n**Notes**\n\n- A place without opening hours returns `status: false`.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "restaurantId",
            "in": "query",
            "required": true,
            "description": "Restaurant id, e.g. `543689`.",
            "schema": {
              "type": "integer",
              "example": 543689
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer of a list or page screen: a title, then named parts. Lists: data.blocks[] {key, title, subtitle, seeAll, count, results[]} where every result is a card with the same keys (type, title, position, sponsored, labels, rating, texts, description, badge, price, photos, saved, links, ids, route); data.sorts[], data.filters {filters[] {id, title, kind, options[] or range}}, data.dates (date rules), data.map[] (pins with latitude and longitude), data.nextPage {updateToken}",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/restaurants/about": {
      "get": {
        "tags": [
          "Restaurants"
        ],
        "summary": "The About section: description, cuisines, features.",
        "description": "The \"About\" text of one restaurant.\n\n**Response**\n\n- `data.tabs[].blocks[]` are the sections of the text. Every block has the same keys:\n  - `title`, `icon`\n  - `lines[]`, list items such as cuisines or features\n  - `text` and `html`\n  - `awards`, `place`, `rating`, `disclaimer`\n  - `contacts[]`, website and phone\n- `data.place.next` leads to the details page.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "restaurantId",
            "in": "query",
            "required": true,
            "description": "Restaurant id, e.g. `543689`.",
            "schema": {
              "type": "integer",
              "example": 543689
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer of a list or page screen: a title, then named parts. Lists: data.blocks[] {key, title, subtitle, seeAll, count, results[]} where every result is a card with the same keys (type, title, position, sponsored, labels, rating, texts, description, badge, price, photos, saved, links, ids, route); data.sorts[], data.filters {filters[] {id, title, kind, options[] or range}}, data.dates (date rules), data.map[] (pins with latitude and longitude), data.nextPage {updateToken}",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/attractions/details": {
      "get": {
        "tags": [
          "Attractions"
        ],
        "summary": "Photos, rating, tickets and tours, opening hours and about.",
        "description": "The page of one attraction.\n\n**Parameter notes**\n\n- `attractionId` is `link.route.params.contentId` in the lists and search results (`contentType` attraction).\n\n**Notes**\n\n- A tour is not an attraction. Use `/tours` for anything with `contentType` attraction_product.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "attractionId",
            "in": "query",
            "required": true,
            "description": "Attraction id.",
            "schema": {
              "type": "integer",
              "example": 107466
            }
          },
          {
            "name": "startDate",
            "in": "query",
            "description": "Day of the visit, `YYYY-MM-DD`.\n\nDefault: 1 day from today.",
            "schema": {
              "type": "string",
              "format": "date",
              "example": "2026-12-10"
            }
          },
          {
            "name": "currencyCode",
            "in": "query",
            "description": "Currency of the prices, **3 letters** like `EUR`. The list is `GET /common/currencies`.\n\nDefault: `USD`.",
            "schema": {
              "type": "string",
              "default": "USD",
              "example": "USD"
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          },
          {
            "name": "updateToken",
            "in": "query",
            "description": "The `updateToken` of a tab, of `nextPage`, or of an unfinished screen from the previous answer.\n\n**Copy it from `next.params`**, do not build it.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "waitForComplete",
            "in": "query",
            "description": "- `true` (default): unfinished screens (prices still loading) are polled until complete, so one call may use several provider calls.\n- `false`: return the first answer as it is.",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The page as named parts, the same names on every kind of place (a part that does not apply to that kind is simply absent): name, location, rating {value, text, reviews}, ranking, price {from, button}, offer (hotels), availability (tours), reservation (restaurants), openingHours {status, today, week[]}, photos {count, items[]}, about / aboutSections / tags, keyDetails, itinerary (tours), area {address, latitude, longitude, gettingThere} and map, amenities (hotels), healthAndSafety, importantInfo, operator (tours), contacts, travellerInsights {rating, histogram[]}, reviewsSummary, reviews {filters[], items[], allReviews}, tipsAndQuestions[], travellerPhotos, nearby[] (restaurants and attractions around), similar[] (named shelves of similar places) and exploreNearby. Every place or tour inside carries a route {page, params} for the next call. Hotel prices need the dates; nothing from the app is dropped, values without a named field are kept in `extra`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/attractions/hours": {
      "get": {
        "tags": [
          "Attractions"
        ],
        "summary": "Opening hours for the week.",
        "description": "The opening hours of one attraction.\n\n**Response**\n\n- `data.week[]` is `{day, status, hours[]}`, the same shape as `/restaurants/hours`.\n\n**Notes**\n\n- A place without opening hours returns `status: false`.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "attractionId",
            "in": "query",
            "required": true,
            "description": "Attraction id.",
            "schema": {
              "type": "integer",
              "example": 107466
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer of a list or page screen: a title, then named parts. Lists: data.blocks[] {key, title, subtitle, seeAll, count, results[]} where every result is a card with the same keys (type, title, position, sponsored, labels, rating, texts, description, badge, price, photos, saved, links, ids, route); data.sorts[], data.filters {filters[] {id, title, kind, options[] or range}}, data.dates (date rules), data.map[] (pins with latitude and longitude), data.nextPage {updateToken}",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/attractions/about": {
      "get": {
        "tags": [
          "Attractions"
        ],
        "summary": "The About section.",
        "description": "The \"About\" text of one attraction.\n\n**Response**\n\n- `data.tabs[].blocks[]` are the sections of the text. Every block has the same keys:\n  - `title`, `icon`\n  - `lines[]`, list items such as cuisines or features\n  - `text` and `html`\n  - `awards`, `place`, `rating`, `disclaimer`\n  - `contacts[]`, website and phone\n- `data.place.next` leads to the details page.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "attractionId",
            "in": "query",
            "required": true,
            "description": "Attraction id.",
            "schema": {
              "type": "integer",
              "example": 107466
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer of a list or page screen: a title, then named parts. Lists: data.blocks[] {key, title, subtitle, seeAll, count, results[]} where every result is a card with the same keys (type, title, position, sponsored, labels, rating, texts, description, badge, price, photos, saved, links, ids, route); data.sorts[], data.filters {filters[] {id, title, kind, options[] or range}}, data.dates (date rules), data.map[] (pins with latitude and longitude), data.nextPage {updateToken}",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/tours/details": {
      "get": {
        "tags": [
          "Tours"
        ],
        "summary": "Photos, rating, what is included, options and prices for a tour or ticket.",
        "description": "The page of one tour.\n\n**Parameter notes**\n\n- `tourId` is `link.route.params.contentId` in the lists and search results (`contentType` attraction_product), or the product id that starts with `AP_` (for example `AP_7081NYCDAY`).\n\n**Notes**\n\n- A tour is not an attraction. Use `/tours` for anything with `contentType` attraction_product.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "tourId",
            "in": "query",
            "required": true,
            "description": "Either form works:\n\n- Tour id, e.g. `11455174`\n- Product id, e.g. `AP_7081NYCDAY`",
            "schema": {
              "type": "string",
              "example": "11455174"
            }
          },
          {
            "name": "startDate",
            "in": "query",
            "description": "Day of the visit, `YYYY-MM-DD`.\n\nDefault: 1 day from today.",
            "schema": {
              "type": "string",
              "format": "date",
              "example": "2026-12-10"
            }
          },
          {
            "name": "currencyCode",
            "in": "query",
            "description": "Currency of the prices, **3 letters** like `EUR`. The list is `GET /common/currencies`.\n\nDefault: `USD`.",
            "schema": {
              "type": "string",
              "default": "USD",
              "example": "USD"
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          },
          {
            "name": "updateToken",
            "in": "query",
            "description": "The `updateToken` of a tab, of `nextPage`, or of an unfinished screen from the previous answer.\n\n**Copy it from `next.params`**, do not build it.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "waitForComplete",
            "in": "query",
            "description": "- `true` (default): unfinished screens (prices still loading) are polled until complete, so one call may use several provider calls.\n- `false`: return the first answer as it is.",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The page as named parts, the same names on every kind of place (a part that does not apply to that kind is simply absent): name, location, rating {value, text, reviews}, ranking, price {from, button}, offer (hotels), availability (tours), reservation (restaurants), openingHours {status, today, week[]}, photos {count, items[]}, about / aboutSections / tags, keyDetails, itinerary (tours), area {address, latitude, longitude, gettingThere} and map, amenities (hotels), healthAndSafety, importantInfo, operator (tours), contacts, travellerInsights {rating, histogram[]}, reviewsSummary, reviews {filters[], items[], allReviews}, tipsAndQuestions[], travellerPhotos, nearby[] (restaurants and attractions around), similar[] (named shelves of similar places) and exploreNearby. Every place or tour inside carries a route {page, params} for the next call. Hotel prices need the dates; nothing from the app is dropped, values without a named field are kept in `extra`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/tours/about": {
      "get": {
        "tags": [
          "Tours"
        ],
        "summary": "Highlights, itinerary and inclusions of a tour.",
        "description": "The \"About\" text of one tour.\n\n**Response**\n\n- Every block has the same keys: `title`, `icon`, `bulleted`, `text`, `html`, `lines`, `place`, `contacts`, `rating`, `awards`, `disclaimer`, `extra`.\n\n**Parameter notes**\n\n- `tourId` is the number of the tour.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "tourId",
            "in": "query",
            "required": true,
            "description": "Tour id, e.g. `11455174`.",
            "schema": {
              "type": "integer",
              "example": 11455174
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "data.name, data.shareUrl, data.tabs[].blocks[]",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/attractions/availability": {
      "get": {
        "tags": [
          "Attractions"
        ],
        "summary": "Tickets or tours of an attraction with prices, filters and paging.",
        "description": "The tours or the tickets of one attraction.\n\n**state `tours`**\n\n- `data.results[]` are the tours that visit the attraction. They are the same cards as the place lists, with a price.\n- `data.filters` is the filter menu (duration, language, price ...).\n- Page through `data.nextPage`.\n\n**state `tickets`**\n\n- `data.tickets[]` are the tickets of the attraction: `{id, name, description, price, rating, availability.next, details.next}`.\n- Many attractions have none.\n\n**Notes**\n\n- Nothing found returns `status: false`.\n- A filter value that contains a comma is written with a backslash: `filters=duration:1\\,60`.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "attractionId",
            "in": "query",
            "required": true,
            "description": "Attraction id.",
            "schema": {
              "type": "integer",
              "example": 104365
            }
          },
          {
            "name": "state",
            "in": "query",
            "required": true,
            "description": "One of `tickets`, `tours`.",
            "schema": {
              "type": "string",
              "enum": [
                "tickets",
                "tours"
              ]
            }
          },
          {
            "name": "filters",
            "in": "query",
            "description": "Filters written `id:value1,value2;id2:value`.\n\nThe filter ids and their values are listed in `data.filters` of the list itself (or `GET /places/filters`).\n\nIf **none** of the filters could be applied, the answer is an error that lists the valid ones.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "currencyCode",
            "in": "query",
            "description": "Currency of the prices, **3 letters** like `EUR`. The list is `GET /common/currencies`.\n\nDefault: `USD`.",
            "schema": {
              "type": "string",
              "default": "USD",
              "example": "USD"
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          },
          {
            "name": "updateToken",
            "in": "query",
            "description": "The `updateToken` of a tab, of `nextPage`, or of an unfinished screen from the previous answer.\n\n**Copy it from `next.params`**, do not build it.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "waitForComplete",
            "in": "query",
            "description": "- `true` (default): unfinished screens (prices still loading) are polled until complete, so one call may use several provider calls.\n- `false`: return the first answer as it is.",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer of a list or page screen: a title, then named parts. Lists: data.blocks[] {key, title, subtitle, seeAll, count, results[]} where every result is a card with the same keys (type, title, position, sponsored, labels, rating, texts, description, badge, price, photos, saved, links, ids, route); data.sorts[], data.filters {filters[] {id, title, kind, options[] or range}}, data.dates (date rules), data.map[] (pins with latitude and longitude), data.nextPage {updateToken}",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/tours/availability": {
      "get": {
        "tags": [
          "Tours"
        ],
        "summary": "The options of a tour with start times, prices by age and availability.",
        "description": "The dates, start times and prices of one tour.\n\n**Parameter notes**\n\n- `productCode` is `availability.options[].route.params.contentId` of `/tours/details`, for example `7081NYCDAY`.\n- The date and the party come from this request: adults at least 1, adults + children + infants at most 30.\n\n**Response**\n\n- Every start time has the same keys: `available: true` with price fields, or `available: false` with those fields `null`.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "productCode",
            "in": "query",
            "required": true,
            "description": "Code of the tour option, e.g. `7081NYCDAY`.\n\nIt is `availability.options[].route.params.contentId` of `GET /tours/details`.",
            "schema": {
              "type": "string",
              "example": "7081NYCDAY"
            }
          },
          {
            "name": "startDate",
            "in": "query",
            "description": "Day of the tour, `YYYY-MM-DD`.\n\nDefault: tomorrow.",
            "schema": {
              "type": "string",
              "format": "date",
              "example": "2026-12-10"
            }
          },
          {
            "name": "adults",
            "in": "query",
            "description": "Travellers aged 13 to 99, `1` to `30`.\n\nDefault: `2`.",
            "schema": {
              "type": "integer",
              "default": 2,
              "minimum": 1,
              "maximum": 30
            }
          },
          {
            "name": "children",
            "in": "query",
            "description": "Travellers aged 3 to 12.\n\nDefault: `0`.",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0,
              "maximum": 30
            }
          },
          {
            "name": "infants",
            "in": "query",
            "description": "Travellers aged 0 to 2.\n\nDefault: `0`.",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0,
              "maximum": 30
            }
          },
          {
            "name": "currencyCode",
            "in": "query",
            "description": "Currency of the prices, **3 letters** like `EUR`. The list is `GET /common/currencies`.\n\nDefault: `USD`.",
            "schema": {
              "type": "string",
              "default": "USD",
              "example": "USD"
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          },
          {
            "name": "updateToken",
            "in": "query",
            "description": "The `updateToken` of a tab, of `nextPage`, or of an unfinished screen from the previous answer.\n\n**Copy it from `next.params`**, do not build it.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "waitForComplete",
            "in": "query",
            "description": "- `true` (default): unfinished screens (prices still loading) are polled until complete, so one call may use several provider calls.\n- `false`: return the first answer as it is.",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "data.available (true when at least one start time can be booked), data.summary, data.date, data.travellers, data.tour, data.tourGrades[].startTimes[] (available, spotsLeft, totalPrice, priceLines ...), data.travellerRules, data.priceCalendar.days[]. When nothing can be booked data.tourGrades is empty and data.summary says why.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/reviews/list": {
      "get": {
        "tags": [
          "Reviews"
        ],
        "summary": "Reviews of a place with the rating summary, filters and paging.",
        "description": "The reviews of a hotel, restaurant, attraction or tour.\n\n**Response**\n\n- `data.reviews[]` each have `id, title, text, rating, written, visited, tripType, helpful, subratings[], ownerResponse, photos[], author{name, hometown, contributions, username, next}`.\n- `data.summary` has the total, the rating and the 5-star distribution.\n- `data.filters` is the filter menu. Its ids work in `filters`.\n- `data.nextPage.next` is the call for the next page. It carries `offset` and `updateToken`.\n\n**Parameter notes**\n\n- `locationId` is the place id.\n- `offset` only works together with the `updateToken` of `nextPage`.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "contentType",
            "in": "query",
            "required": true,
            "description": "One of `hotel`, `restaurant`, `attraction`, `attraction_product`.",
            "schema": {
              "type": "string",
              "enum": [
                "hotel",
                "restaurant",
                "attraction",
                "attraction_product"
              ]
            }
          },
          {
            "name": "locationId",
            "in": "query",
            "required": true,
            "description": "Place id, e.g. `99332`.",
            "schema": {
              "type": "integer",
              "example": 99332
            }
          },
          {
            "name": "filters",
            "in": "query",
            "description": "Filters written `id:value1,value2;id2:value`.\n\nThe filter ids and their values are listed in `data.filters` of the list itself (or `GET /places/filters`).\n\nIf **none** of the filters could be applied, the answer is an error that lists the valid ones.",
            "schema": {
              "type": "string",
              "example": "months:January;rating:5"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "description": "Start of the page, **multiples of 20** (`20`, `40` ...).\n\nOnly works **together with the `updateToken` of `nextPage`** (the call `nextPage.next` already holds). Without an `updateToken` the first page comes back.",
            "schema": {
              "type": "integer",
              "default": 0,
              "example": 0
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          },
          {
            "name": "updateToken",
            "in": "query",
            "description": "The `updateToken` of a tab, of `nextPage`, or of an unfinished screen from the previous answer.\n\n**Copy it from `next.params`**, do not build it.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "waitForComplete",
            "in": "query",
            "description": "- `true` (default): unfinished screens (prices still loading) are polled until complete, so one call may use several provider calls.\n- `false`: return the first answer as it is.",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer of a list or page screen: a title, then named parts. Lists: data.blocks[] {key, title, subtitle, seeAll, count, results[]} where every result is a card with the same keys (type, title, position, sponsored, labels, rating, texts, description, badge, price, photos, saved, links, ids, route); data.sorts[], data.filters {filters[] {id, title, kind, options[] or range}}, data.dates (date rules), data.map[] (pins with latitude and longitude), data.nextPage {updateToken}",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/reviews/filters": {
      "get": {
        "tags": [
          "Reviews"
        ],
        "summary": "The languages, months and traveller types you can filter reviews by, with counts.",
        "description": "The review sort and filter menu of one place, with counts (languages, months, traveller types ...).\n\n**Response**\n\n- `data.filters[]` are `{id, title, kind, options[{value, title, count, selected}]}`. The counts are this place's.\n\n**Notes**\n\n- Only the menu. Nothing here changes with a chosen filter, so there is no `filters` parameter.\n- To filter, pass `id:value` pairs in `filters` of `/reviews/list`.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "contentType",
            "in": "query",
            "required": true,
            "description": "One of `hotel`, `restaurant`, `attraction`.",
            "schema": {
              "type": "string",
              "enum": [
                "hotel",
                "restaurant",
                "attraction"
              ]
            }
          },
          {
            "name": "locationId",
            "in": "query",
            "required": true,
            "description": "Place id, e.g. `99332`.",
            "schema": {
              "type": "integer",
              "example": 99332
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "data.contentType, data.locationId, data.showAllText, data.filters[] {id, title, kind, options[]}",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/reviews/detail": {
      "get": {
        "tags": [
          "Reviews"
        ],
        "summary": "One full review with the owner response.",
        "description": "One review.\n\n**Parameter notes**\n\n- `reviewId` is the `id` of a review in `/reviews/list` or `/reviews/tips`.\n\n**Response**\n\n- `data.review` has the same keys as a review in the list.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "contentType",
            "in": "query",
            "required": true,
            "description": "One of `hotel`, `restaurant`, `attraction`, `attraction_product`.",
            "schema": {
              "type": "string",
              "enum": [
                "hotel",
                "restaurant",
                "attraction",
                "attraction_product"
              ]
            }
          },
          {
            "name": "locationId",
            "in": "query",
            "required": true,
            "description": "Place id, e.g. `99332`.",
            "schema": {
              "type": "integer",
              "example": 99332
            }
          },
          {
            "name": "reviewId",
            "in": "query",
            "required": true,
            "description": "Review id (`rid`).",
            "schema": {
              "type": "integer",
              "example": 1
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer of a list or page screen: a title, then named parts. Lists: data.blocks[] {key, title, subtitle, seeAll, count, results[]} where every result is a card with the same keys (type, title, position, sponsored, labels, rating, texts, description, badge, price, photos, saved, links, ids, route); data.sorts[], data.filters {filters[] {id, title, kind, options[] or range}}, data.dates (date rules), data.map[] (pins with latitude and longitude), data.nextPage {updateToken}",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/reviews/summary": {
      "get": {
        "tags": [
          "Reviews"
        ],
        "summary": "The AI summary of what guests say, by topic, with the reviews for the chosen topic.",
        "description": "The AI summary of the reviews, by topic.\n\n**Response**\n\n- `data.topics[]` is the menu: `{topic, opinion, icon, summary, selected, next}`. `next` is the call that loads that topic.\n- `data.reviews` are the reviews behind the requested topic: `{topic, count, items[]}`. TripAdvisor loads them for one topic per call.\n\n**Parameter notes**\n\n- `activeTab` is exact and case-sensitive.\n  - Hotels: Location, Atmosphere, Rooms, Value, Cleanliness, Noise level, Service, Amenities.\n  - Attractions: Atmosphere, Location, Booking, Duration, Wait, Audience, Facility, Staff.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "contentType",
            "in": "query",
            "required": true,
            "description": "One of `hotel`, `attraction`.",
            "schema": {
              "type": "string",
              "enum": [
                "hotel",
                "attraction"
              ]
            }
          },
          {
            "name": "locationId",
            "in": "query",
            "required": true,
            "description": "Place id, e.g. `99332`.",
            "schema": {
              "type": "integer",
              "example": 99332
            }
          },
          {
            "name": "activeTab",
            "in": "query",
            "description": "Topic.\n\nDefault: `Location`.",
            "schema": {
              "type": "string",
              "default": "Location"
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer of a list or page screen: a title, then named parts. Lists: data.blocks[] {key, title, subtitle, seeAll, count, results[]} where every result is a card with the same keys (type, title, position, sponsored, labels, rating, texts, description, badge, price, photos, saved, links, ids, route); data.sorts[], data.filters {filters[] {id, title, kind, options[] or range}}, data.dates (date rules), data.map[] (pins with latitude and longitude), data.nextPage {updateToken}",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/reviews/questions": {
      "get": {
        "tags": [
          "Reviews"
        ],
        "summary": "Questions and answers about the place.",
        "description": "The questions asked about a place, with the number of answers.\n\n**Response**\n\n- `data.questions[]` are `{id, text, written, answerCount, next}`. `next` opens `/reviews/question`.\n- Page with `data.nextPage.next` (`offset` and `updateToken`).",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "contentType",
            "in": "query",
            "required": true,
            "description": "One of `hotel`, `restaurant`, `attraction`, `attraction_product`.",
            "schema": {
              "type": "string",
              "enum": [
                "hotel",
                "restaurant",
                "attraction",
                "attraction_product"
              ]
            }
          },
          {
            "name": "locationId",
            "in": "query",
            "required": true,
            "description": "Place id, e.g. `99332`.",
            "schema": {
              "type": "integer",
              "example": 99332
            }
          },
          {
            "name": "offset",
            "in": "query",
            "description": "Start of the page, **multiples of 20** (`0`, `20`, `40` ...).\n\nOr send the `updateToken` of `nextPage`.",
            "schema": {
              "type": "integer",
              "default": 0,
              "example": 0
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          },
          {
            "name": "updateToken",
            "in": "query",
            "description": "The `updateToken` of a tab, of `nextPage`, or of an unfinished screen from the previous answer.\n\n**Copy it from `next.params`**, do not build it.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "waitForComplete",
            "in": "query",
            "description": "- `true` (default): unfinished screens (prices still loading) are polled until complete, so one call may use several provider calls.\n- `false`: return the first answer as it is.",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer of a list or page screen: a title, then named parts. Lists: data.blocks[] {key, title, subtitle, seeAll, count, results[]} where every result is a card with the same keys (type, title, position, sponsored, labels, rating, texts, description, badge, price, photos, saved, links, ids, route); data.sorts[], data.filters {filters[] {id, title, kind, options[] or range}}, data.dates (date rules), data.map[] (pins with latitude and longitude), data.nextPage {updateToken}",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/reviews/question": {
      "get": {
        "tags": [
          "Reviews"
        ],
        "summary": "One question with all its answers.",
        "description": "One question with its answers.\n\n**Parameter notes**\n\n- `questionId` is the `id` of a question in `/reviews/questions`.\n\n**Response**\n\n- `data.question` is the question.\n- `data.answers[]` are the answers. Each has the author, with a link to their profile.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "contentType",
            "in": "query",
            "required": true,
            "description": "One of `hotel`, `restaurant`, `attraction`, `attraction_product`.",
            "schema": {
              "type": "string",
              "enum": [
                "hotel",
                "restaurant",
                "attraction",
                "attraction_product"
              ]
            }
          },
          {
            "name": "locationId",
            "in": "query",
            "required": true,
            "description": "Place id, e.g. `99332`.",
            "schema": {
              "type": "integer",
              "example": 99332
            }
          },
          {
            "name": "questionId",
            "in": "query",
            "required": true,
            "description": "Question id.",
            "schema": {
              "type": "integer",
              "example": 1
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer of a list or page screen: a title, then named parts. Lists: data.blocks[] {key, title, subtitle, seeAll, count, results[]} where every result is a card with the same keys (type, title, position, sponsored, labels, rating, texts, description, badge, price, photos, saved, links, ids, route); data.sorts[], data.filters {filters[] {id, title, kind, options[] or range}}, data.dates (date rules), data.map[] (pins with latitude and longitude), data.nextPage {updateToken}",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/reviews/tips": {
      "get": {
        "tags": [
          "Reviews"
        ],
        "summary": "Tips from travellers.",
        "description": "The insider tips of travellers for a place.\n\n**Response**\n\n- `data.tips[]` are `{id, tip, written, visited, author, next}`. `next` opens the full review in `/reviews/detail`.\n- Page with `data.nextPage.next`.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "contentType",
            "in": "query",
            "required": true,
            "description": "One of `hotel`, `restaurant`, `attraction`, `attraction_product`.",
            "schema": {
              "type": "string",
              "enum": [
                "hotel",
                "restaurant",
                "attraction",
                "attraction_product"
              ]
            }
          },
          {
            "name": "locationId",
            "in": "query",
            "required": true,
            "description": "Place id, e.g. `99332`.",
            "schema": {
              "type": "integer",
              "example": 99332
            }
          },
          {
            "name": "offset",
            "in": "query",
            "description": "Start of the page, **multiples of 20** (`0`, `20`, `40` ...).\n\nOr send the `updateToken` of `nextPage`.",
            "schema": {
              "type": "integer",
              "default": 0,
              "example": 0
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          },
          {
            "name": "updateToken",
            "in": "query",
            "description": "The `updateToken` of a tab, of `nextPage`, or of an unfinished screen from the previous answer.\n\n**Copy it from `next.params`**, do not build it.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "waitForComplete",
            "in": "query",
            "description": "- `true` (default): unfinished screens (prices still loading) are polled until complete, so one call may use several provider calls.\n- `false`: return the first answer as it is.",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer of a list or page screen: a title, then named parts. Lists: data.blocks[] {key, title, subtitle, seeAll, count, results[]} where every result is a card with the same keys (type, title, position, sponsored, labels, rating, texts, description, badge, price, photos, saved, links, ids, route); data.sorts[], data.filters {filters[] {id, title, kind, options[] or range}}, data.dates (date rules), data.map[] (pins with latitude and longitude), data.nextPage {updateToken}",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/media/albums": {
      "get": {
        "tags": [
          "Media"
        ],
        "summary": "Photo and video albums of a place, one page of photos at a time.",
        "description": "The photo and video albums of a place.\n\n**Response**\n\n- `data.albums[]` lists the albums with `photoCount`.\n- `data.photos[]` are the photos and videos of the selected album, 50 per page. `type` is `photo` or `video`.\n  - Photos have `photo.sizes`.\n  - Videos have `video.thumbnails` and `video.sources` (m3u8 and mp4).\n- `data.nextPage.next` is the call for the next 50 photos.\n\n**Parameter notes**\n\n- `albumId` opens another album. It is an `id` from `data.albums` and can be negative (`-150` = All photos).",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "locationId",
            "in": "query",
            "required": true,
            "description": "Place id, e.g. `99332`.",
            "schema": {
              "type": "integer",
              "example": 99332
            }
          },
          {
            "name": "albumId",
            "in": "query",
            "description": "Album id, from `data.albums[].id` (e.g. `-150` = all photos).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "galleryConfig",
            "in": "query",
            "description": "One of `mvqa` (default), `ar`, `rrap`, `apdapv`.",
            "schema": {
              "type": "string",
              "enum": [
                "mvqa",
                "ar",
                "rrap",
                "apdapv"
              ],
              "default": "mvqa"
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          },
          {
            "name": "updateToken",
            "in": "query",
            "description": "The `updateToken` of a tab, of `nextPage`, or of an unfinished screen from the previous answer.\n\n**Copy it from `next.params`**, do not build it.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "waitForComplete",
            "in": "query",
            "description": "- `true` (default): unfinished screens (prices still loading) are polled until complete, so one call may use several provider calls.\n- `false`: return the first answer as it is.",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer of a list or page screen: a title, then named parts. Lists: data.blocks[] {key, title, subtitle, seeAll, count, results[]} where every result is a card with the same keys (type, title, position, sponsored, labels, rating, texts, description, badge, price, photos, saved, links, ids, route); data.sorts[], data.filters {filters[] {id, title, kind, options[] or range}}, data.dates (date rules), data.map[] (pins with latitude and longitude), data.nextPage {updateToken}",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/profiles/details": {
      "get": {
        "tags": [
          "Profiles"
        ],
        "summary": "A traveller: badges, stats, overview.",
        "description": "The profile of a traveller.\n\n**Parameter notes**\n\n- `username` is in a review (`data.reviews[].ownerResponse.username`, or the profile link of a review in `/reviews/list`).\n\n**Response**\n\n- Each review has a `next` for the review and for the place.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "username",
            "in": "query",
            "required": true,
            "description": "TripAdvisor username.",
            "schema": {
              "type": "string",
              "example": "umrodrigocunha"
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "data.username, data.memberId, data.displayName, data.avatar, data.hometown, data.contributions, data.joined, data.recentAchievements, data.photos, data.reviews, data.travelMap",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/profiles/reviews": {
      "get": {
        "tags": [
          "Profiles"
        ],
        "summary": "Reviews written by a traveller.",
        "description": "The reviews a traveller wrote.\n\n**Response**\n\n- Every review has the same keys. `next` opens the review or the place.\n\n**Notes**\n\n- Next page: pass `data.nextPage.updateToken` as `updateToken`. `data.nextPage` is `null` on the last page.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "username",
            "in": "query",
            "required": true,
            "description": "TripAdvisor username.",
            "schema": {
              "type": "string",
              "example": "umrodrigocunha"
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          },
          {
            "name": "updateToken",
            "in": "query",
            "description": "The `updateToken` of a tab, of `nextPage`, or of an unfinished screen from the previous answer.\n\n**Copy it from `next.params`**, do not build it.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "waitForComplete",
            "in": "query",
            "description": "- `true` (default): unfinished screens (prices still loading) are polled until complete, so one call may use several provider calls.\n- `false`: return the first answer as it is.",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "data.username, data.title, data.count, data.reviews[], data.nextPage",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/profiles/photos": {
      "get": {
        "tags": [
          "Profiles"
        ],
        "summary": "Photos posted by a traveller.",
        "description": "The photos a traveller shared.\n\n**Notes**\n\n- Next page: pass `data.nextPage.updateToken` as `updateToken`. It is `null` on the last page.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "username",
            "in": "query",
            "required": true,
            "description": "TripAdvisor username.",
            "schema": {
              "type": "string",
              "example": "umrodrigocunha"
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          },
          {
            "name": "updateToken",
            "in": "query",
            "description": "The `updateToken` of a tab, of `nextPage`, or of an unfinished screen from the previous answer.\n\n**Copy it from `next.params`**, do not build it.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "waitForComplete",
            "in": "query",
            "description": "- `true` (default): unfinished screens (prices still loading) are polled until complete, so one call may use several provider calls.\n- `false`: return the first answer as it is.",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "data.username, data.title, data.photos[], data.nextPage",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/profiles/achievements": {
      "get": {
        "tags": [
          "Profiles"
        ],
        "summary": "Badges and achievements.",
        "description": "The badges and achievements of a traveller.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "username",
            "in": "query",
            "required": true,
            "description": "TripAdvisor username.",
            "schema": {
              "type": "string",
              "example": "umrodrigocunha"
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "data.title, data.totals[], data.badges[], data.milestones[] (name, level, progress, steps[])",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/tours/itinerary": {
      "get": {
        "tags": [
          "Tours"
        ],
        "summary": "Every stop of a tour with position, duration, rating and photos.",
        "description": "Every stop of a tour, with position, duration, rating and photos.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "tourId",
            "in": "query",
            "required": true,
            "description": "Tour id, e.g. `11455174`.",
            "schema": {
              "type": "integer",
              "example": 11455174
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer of a list or page screen: a title, then named parts. Lists: data.blocks[] {key, title, subtitle, seeAll, count, results[]} where every result is a card with the same keys (type, title, position, sponsored, labels, rating, texts, description, badge, price, photos, saved, links, ids, route); data.sorts[], data.filters {filters[] {id, title, kind, options[] or range}}, data.dates (date rules), data.map[] (pins with latitude and longitude), data.nextPage {updateToken}",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/home": {
      "get": {
        "tags": [
          "Home"
        ],
        "summary": "The place a position is in, shortcuts, and rows of ideas such as getaways and top-rated hotels.",
        "description": "Ideas for a start page, for a position.\n\n**Response**\n\n- `data.place` is the place the position is in. Its `geoId` goes into the `/places` endpoints.\n- `data.links` are shortcuts such as \"Things to do in Paris\".\n- `data.shelves[]` are rows with a title. Each row is a list of cards with the same keys:\n  - `type`: `geo`, `hotel`, `restaurant`, `attraction` or `attraction_product`\n  - `title`, `rating`, `texts`, `badge`, `photo`, `saved`\n  - `description`, for example \"From $28 / adult\"\n  - `route`, the next call\n\n**Notes**\n\n- Some rows follow the position (weekend getaways), others are worldwide picks.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "latitude",
            "in": "query",
            "required": true,
            "description": "Latitude, `-90` to `90`.",
            "schema": {
              "type": "number",
              "example": 40.7128
            }
          },
          {
            "name": "longitude",
            "in": "query",
            "required": true,
            "description": "Longitude, `-180` to `180`.",
            "schema": {
              "type": "number",
              "example": -74.006
            }
          },
          {
            "name": "currencyCode",
            "in": "query",
            "description": "Currency of the prices, **3 letters** like `EUR`. The list is `GET /common/currencies`.\n\nDefault: `USD`.",
            "schema": {
              "type": "string",
              "default": "USD",
              "example": "USD"
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          },
          {
            "name": "waitForComplete",
            "in": "query",
            "description": "- `true` (default): unfinished screens (prices still loading) are polled until complete, so one call may use several provider calls.\n- `false`: return the first answer as it is.",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "data.place {geoId, name}, data.links[] {title, route}, data.shelves[] {key, title, subtitle, count, results[]}",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/common/languages": {
      "get": {
        "tags": [
          "Common"
        ],
        "summary": "The languages the texts can be returned in.",
        "description": "The languages you can send as `languageCode` to any endpoint.\n\n**Response**\n\n- `data.languages[].code` is the value to send as `languageCode`.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "data.default, data.count, data.languages[] (code, name, nativeName)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/common/currencies": {
      "get": {
        "tags": [
          "Common"
        ],
        "summary": "The currencies prices can be shown in.",
        "description": "The currencies you can send as `currencyCode` to any endpoint.\n\n**Response**\n\n- `data.majorCurrencies[]` are the main currencies.\n- `data.minorCurrencies[]` are the other currencies.\n- Each currency has its `code`, `name` and `symbol`.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "data.majorCurrencies[], data.minorCurrencies[]",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/common/previews": {
      "get": {
        "tags": [
          "Common"
        ],
        "summary": "Short previews of up to 10 places in one call.",
        "description": "One preview screen for each place you ask for, in the order you asked.\n\n**Notes**\n\n- Send at most 10 places per call. More than 10 returns `status: false` with a validation message.\n- One call to TripAdvisor returns one preview screen per requested place.",
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "parameters": [
          {
            "name": "items",
            "in": "query",
            "required": true,
            "description": "Comma list of `type:id`, e.g. `hotel:99332,restaurant:543689`.\n\n**Maximum 10 places per call.**",
            "schema": {
              "type": "string",
              "example": "hotel:99332,restaurant:543689"
            }
          },
          {
            "name": "currencyCode",
            "in": "query",
            "description": "Currency of the prices, **3 letters** like `EUR`. The list is `GET /common/currencies`.\n\nDefault: `USD`.",
            "schema": {
              "type": "string",
              "default": "USD",
              "example": "USD"
            }
          },
          {
            "name": "languageCode",
            "in": "query",
            "description": "Language of the texts, like `fr_FR`. The list is `GET /common/languages`.\n\nDefault: `en_IN`.",
            "schema": {
              "type": "string",
              "default": "en_IN",
              "example": "en_IN",
              "enum": [
                "ar_AE",
                "ar_SA",
                "cs_CZ",
                "da_DK",
                "de_AT",
                "de_CH",
                "de_DE",
                "de_LU",
                "el_GR",
                "en_AU",
                "en_CA",
                "en_GB",
                "en_HK",
                "en_IE",
                "en_IN",
                "en_MY",
                "en_NZ",
                "en_PH",
                "en_SG",
                "en_US",
                "en_ZA",
                "es_AR",
                "es_CL",
                "es_CO",
                "es_ES",
                "es_MX",
                "es_PE",
                "es_US",
                "es_VE",
                "fi_FI",
                "fr_BE",
                "fr_CA",
                "fr_CH",
                "fr_FR",
                "fr_LU",
                "he_IL",
                "hu_HU",
                "id_ID",
                "it_CH",
                "it_IT",
                "ja_JP",
                "ko_KR",
                "nl_BE",
                "nl_NL",
                "no_NO",
                "pl_PL",
                "pt_BR",
                "pt_PT",
                "ru_RU",
                "sk_SK",
                "sr_RS",
                "sv_SE",
                "th_TH",
                "tr_TR",
                "vi_VN",
                "zh_CN",
                "zh_HK",
                "zh_TW"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "data.previews[] (one screen per item)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/common/server-status": {
      "get": {
        "tags": [
          "Common"
        ],
        "summary": "Whether the server is up.",
        "responses": {
          "200": {
            "description": "data.server (\"online\"), data.timestamp (current server time, ISO 8601)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "boolean",
                      "description": "true on success, false on any error"
                    },
                    "message": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "RapidAPIKey": [],
            "RapidAPIHost": []
          }
        ],
        "description": "Tells you whether the server is up.\n\n**Response**\n\n- `data.server` is `online` when the server answers.\n- `data.timestamp` is the server time."
      }
    }
  }
}