# Tripadvisor API for agents

> API for Agents · https://apiforagents.dev/platforms/tripadvisor · HTML twin: https://apiforagents.dev/platforms/tripadvisor

Hotels, restaurants, attractions and reviews from Tripadvisor.

Endpoint: `POST https://apiforagents.dev/v1/tripadvisor`. One op per call. Quote first with `"estimateOnly": true`.

## Prices (USD per record, pay as you go)

| Record | Per record |
|---|---|
| attractions | $0.0018 |
| hotels | $0.0018 |
| restaurants | $0.0018 |
| reviews | $0.0018 |

## Operations

### hotels

Full cards for up to ten hotels by Tripadvisor URL. Rating breakdown, rank, class, rooms, amenities, price range, OTA offers for the stay.

| Field | Required | Type | Meaning |
|---|---|---|---|
| subjects | yes | list of string (1-10 items) | Tripadvisor place URLs (Hotel_Review / Restaurant_Review / Attraction_Review). |
| language | no | string (BCP-47) |  |
| currency | no | string (ISO 4217) |  |
| stay | no | object |  |
| stay.checkIn | no | string (YYYY-MM-DD) | First night, YYYY-MM-DD. Only read together with checkOut. |
| stay.checkOut | no | string (YYYY-MM-DD) | Departure day, YYYY-MM-DD, after checkIn. Leave both out for a card without prices. |

Response fields (each row of data; every field present, null when the source had nothing):

| Field | Type |
|---|---|
| taId | string |
| kind | string |
| name | string |
| tripadvisorUrl | string |
| description | string |
| address | any |
| city | string |
| country | string |
| latitude | number |
| longitude | number |
| phone | string |
| email | string |
| website | string |
| rating | number |
| reviews | integer |
| ratingBreakdown | any |
| reviewTags | any |
| rank | integer |
| rankOutOf | integer |
| photos | list of string |
| photoCount | integer |
| subcategories | list of string |
| hotelClass | string |
| rooms | integer |
| priceRange | string |
| priceLevel | string |
| amenities | list of string |
| hotelOffers | any |
| roomTips | any |
| categoryRatingBreakdown | any |
| nearbyTransit | any |
| cuisines | list of string |
| mealTypes | list of string |
| dietaryRestrictions | list of string |
| establishmentTypes | list of string |
| features | list of string |
| popularDishes | list of string |
| menuUrl | string |
| openingHours | any |
| timezone | string |
| neighborhood | any |
| closed | boolean |
| orderOnline | any |
| categoryRatings | any |
| attractionTypes | list of string |
| ticketOffers | any |
| lowestTicketPrice | number |
| bookingUrl | string |
| nearestMetroStations | any |
| details | object |

`details` is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is `{}` when there is nothing more.

Example request:

```bash
curl -X POST https://apiforagents.dev/v1/tripadvisor \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"hotels","subjects":["https://www.tripadvisor.com/Hotel_Review-<place-id>-Reviews-The_Plaza-New_York_City_New_York.html"],"currency":"USD","stay":{"checkIn":"2027-03-12","checkOut":"2027-03-15"}}'
```

Example response rows (made-up names, real field names; a live row carries every field above):

```json
[
  {
    "name": "Hotel Aurel Riverside",
    "kind": "hotel",
    "city": "Prague",
    "country": "Czechia",
    "rating": 4.5,
    "reviews": 2140,
    "rank": 12,
    "rankOutOf": 610,
    "priceRange": "$$$",
    "hotelClass": 4,
    "rooms": 86,
    "taId": "1304212484",
    "tripadvisorUrl": "https://www.tripadvisor.com/hotel-aurel-riverside-1000",
    "photos": [
      "https://img.tripadvisor.com/hotel-aurel-riverside.jpg"
    ],
    "menuUrl": "https://www.tripadvisor.com/hotel-aurel-riverside-1000",
    "bookingUrl": "https://www.tripadvisor.com/hotel-aurel-riverside-1000",
    "details": {}
  },
  {
    "name": "Casa Lumen Rooms",
    "kind": "hotel",
    "city": "Seville",
    "country": "Spain",
    "rating": 4.7,
    "reviews": 864,
    "rank": 8,
    "rankOutOf": 420,
    "priceRange": "$$",
    "hotelClass": 3,
    "rooms": 14,
    "taId": "1920270898",
    "tripadvisorUrl": "https://www.tripadvisor.com/casa-lumen-rooms-1001",
    "photos": [
      "https://img.tripadvisor.com/casa-lumen-rooms.jpg"
    ],
    "menuUrl": "https://www.tripadvisor.com/casa-lumen-rooms-1001",
    "bookingUrl": "https://www.tripadvisor.com/casa-lumen-rooms-1001",
    "details": {}
  }
]
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=tripadvisor&op=hotels (sign in first).

### restaurants

Full cards for up to ten restaurants by URL. Cuisines, dishes, hours, menu link, price level, rating breakdown, rank.

| Field | Required | Type | Meaning |
|---|---|---|---|
| subjects | yes | list of string (1-10 items) | Tripadvisor place URLs (Hotel_Review / Restaurant_Review / Attraction_Review). |
| language | no | string (BCP-47) |  |
| currency | no | string (ISO 4217) |  |

Response fields (each row of data; every field present, null when the source had nothing):

| Field | Type |
|---|---|
| taId | string |
| kind | string |
| name | string |
| tripadvisorUrl | string |
| description | string |
| address | any |
| city | string |
| country | string |
| latitude | number |
| longitude | number |
| phone | string |
| email | string |
| website | string |
| rating | number |
| reviews | integer |
| ratingBreakdown | any |
| reviewTags | any |
| rank | integer |
| rankOutOf | integer |
| photos | list of string |
| photoCount | integer |
| subcategories | list of string |
| hotelClass | string |
| rooms | integer |
| priceRange | string |
| priceLevel | string |
| amenities | list of string |
| hotelOffers | any |
| roomTips | any |
| categoryRatingBreakdown | any |
| nearbyTransit | any |
| cuisines | list of string |
| mealTypes | list of string |
| dietaryRestrictions | list of string |
| establishmentTypes | list of string |
| features | list of string |
| popularDishes | list of string |
| menuUrl | string |
| openingHours | any |
| timezone | string |
| neighborhood | any |
| closed | boolean |
| orderOnline | any |
| categoryRatings | any |
| attractionTypes | list of string |
| ticketOffers | any |
| lowestTicketPrice | number |
| bookingUrl | string |
| nearestMetroStations | any |
| details | object |

`details` is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is `{}` when there is nothing more.

Example request:

```bash
curl -X POST https://apiforagents.dev/v1/tripadvisor \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"restaurants","subjects":["https://www.tripadvisor.com/Restaurant_Review-<place-id>-Reviews-Katz_s_Delicatessen-New_York_City_New_York.html"]}'
```

Example response rows (made-up names, real field names; a live row carries every field above):

```json
[
  {
    "name": "Casa Lumen",
    "kind": "restaurant",
    "city": "Seville",
    "country": "Spain",
    "rating": 4.7,
    "reviews": 864,
    "rank": 8,
    "rankOutOf": 2210,
    "priceRange": "$$",
    "cuisines": [
      "Spanish",
      "Tapas"
    ],
    "taId": "729433221",
    "tripadvisorUrl": "https://www.tripadvisor.com/casa-lumen-1000",
    "photos": [
      "https://img.tripadvisor.com/casa-lumen.jpg"
    ],
    "menuUrl": "https://www.tripadvisor.com/casa-lumen-1000",
    "bookingUrl": "https://www.tripadvisor.com/casa-lumen-1000",
    "details": {}
  },
  {
    "name": "The Copper Pot",
    "kind": "restaurant",
    "city": "Edinburgh",
    "country": "United Kingdom",
    "rating": 4.5,
    "reviews": 1210,
    "rank": 41,
    "rankOutOf": 1980,
    "priceRange": "$$$",
    "cuisines": [
      "British",
      "Seafood"
    ],
    "taId": "3523809370",
    "tripadvisorUrl": "https://www.tripadvisor.com/the-copper-pot-1001",
    "photos": [
      "https://img.tripadvisor.com/the-copper-pot.jpg"
    ],
    "menuUrl": "https://www.tripadvisor.com/the-copper-pot-1001",
    "bookingUrl": "https://www.tripadvisor.com/the-copper-pot-1001",
    "details": {}
  }
]
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=tripadvisor&op=restaurants (sign in first).

### attractions

Full cards for up to ten attractions by URL. Types, ticket offers, booking links, rating breakdown, rank.

| Field | Required | Type | Meaning |
|---|---|---|---|
| subjects | yes | list of string (1-10 items) | Tripadvisor place URLs (Hotel_Review / Restaurant_Review / Attraction_Review). |
| language | no | string (BCP-47) |  |
| currency | no | string (ISO 4217) |  |

Response fields (each row of data; every field present, null when the source had nothing):

| Field | Type |
|---|---|
| taId | string |
| kind | string |
| name | string |
| tripadvisorUrl | string |
| description | string |
| address | any |
| city | string |
| country | string |
| latitude | number |
| longitude | number |
| phone | string |
| email | string |
| website | string |
| rating | number |
| reviews | integer |
| ratingBreakdown | any |
| reviewTags | any |
| rank | integer |
| rankOutOf | integer |
| photos | list of string |
| photoCount | integer |
| subcategories | list of string |
| hotelClass | string |
| rooms | integer |
| priceRange | string |
| priceLevel | string |
| amenities | list of string |
| hotelOffers | any |
| roomTips | any |
| categoryRatingBreakdown | any |
| nearbyTransit | any |
| cuisines | list of string |
| mealTypes | list of string |
| dietaryRestrictions | list of string |
| establishmentTypes | list of string |
| features | list of string |
| popularDishes | list of string |
| menuUrl | string |
| openingHours | any |
| timezone | string |
| neighborhood | any |
| closed | boolean |
| orderOnline | any |
| categoryRatings | any |
| attractionTypes | list of string |
| ticketOffers | any |
| lowestTicketPrice | number |
| bookingUrl | string |
| nearestMetroStations | any |
| details | object |

`details` is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is `{}` when there is nothing more.

Example request:

```bash
curl -X POST https://apiforagents.dev/v1/tripadvisor \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"attractions","subjects":["https://www.tripadvisor.com/Attraction_Review-<place-id>-Reviews-Statue_of_Liberty-New_York_City_New_York.html"]}'
```

Example response rows (made-up names, real field names; a live row carries every field above):

```json
[
  {
    "name": "Old Town Walking Tour",
    "kind": "attraction",
    "city": "Lisbon",
    "country": "Portugal",
    "rating": 4.9,
    "reviews": 3120,
    "rank": 3,
    "rankOutOf": 640,
    "priceRange": "$",
    "lowestTicketPrice": 25,
    "taId": "3543572718",
    "tripadvisorUrl": "https://www.tripadvisor.com/old-town-walking-tour-1000",
    "photos": [
      "https://img.tripadvisor.com/old-town-walking-tour.jpg"
    ],
    "menuUrl": "https://www.tripadvisor.com/old-town-walking-tour-1000",
    "bookingUrl": "https://www.tripadvisor.com/old-town-walking-tour-1000",
    "details": {}
  },
  {
    "name": "Castle Hill Gardens",
    "kind": "attraction",
    "city": "Prague",
    "country": "Czechia",
    "rating": 4.6,
    "reviews": 5420,
    "rank": 11,
    "rankOutOf": 720,
    "priceRange": null,
    "lowestTicketPrice": null,
    "taId": "2312642660",
    "tripadvisorUrl": "https://www.tripadvisor.com/castle-hill-gardens-1001",
    "photos": [
      "https://img.tripadvisor.com/castle-hill-gardens.jpg"
    ],
    "menuUrl": "https://www.tripadvisor.com/castle-hill-gardens-1001",
    "bookingUrl": "https://www.tripadvisor.com/castle-hill-gardens-1001",
    "details": {}
  }
]
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=tripadvisor&op=attractions (sign in first).

### searchHotels

Hotels for a destination. Every hit a full card, priced for the stay when dates are given.

| Field | Required | Type | Meaning |
|---|---|---|---|
| query | yes | string (≤300 chars) | A destination, or a dish for restaurants. |
| language | no | string (BCP-47) |  |
| currency | no | string (ISO 4217) |  |
| limit | no | integer (1-100) |  |
| stay | no | object |  |
| stay.checkIn | no | string (YYYY-MM-DD) | First night, YYYY-MM-DD. Only read together with checkOut. |
| stay.checkOut | no | string (YYYY-MM-DD) | Departure day, YYYY-MM-DD, after checkIn. Leave both out for a card without prices. |

Response fields (each row of data; every field present, null when the source had nothing):

| Field | Type |
|---|---|
| taId | string |
| kind | string |
| name | string |
| tripadvisorUrl | string |
| description | string |
| address | any |
| city | string |
| country | string |
| latitude | number |
| longitude | number |
| phone | string |
| email | string |
| website | string |
| rating | number |
| reviews | integer |
| ratingBreakdown | any |
| reviewTags | any |
| rank | integer |
| rankOutOf | integer |
| photos | list of string |
| photoCount | integer |
| subcategories | list of string |
| hotelClass | string |
| rooms | integer |
| priceRange | string |
| priceLevel | string |
| amenities | list of string |
| hotelOffers | any |
| roomTips | any |
| categoryRatingBreakdown | any |
| nearbyTransit | any |
| cuisines | list of string |
| mealTypes | list of string |
| dietaryRestrictions | list of string |
| establishmentTypes | list of string |
| features | list of string |
| popularDishes | list of string |
| menuUrl | string |
| openingHours | any |
| timezone | string |
| neighborhood | any |
| closed | boolean |
| orderOnline | any |
| categoryRatings | any |
| attractionTypes | list of string |
| ticketOffers | any |
| lowestTicketPrice | number |
| bookingUrl | string |
| nearestMetroStations | any |
| details | object |

`details` is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is `{}` when there is nothing more.

Example request:

```bash
curl -X POST https://apiforagents.dev/v1/tripadvisor \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"searchHotels","query":"Lisbon","currency":"EUR","limit":20,"stay":{"checkIn":"2027-03-12","checkOut":"2027-03-15"}}'
```

Example response rows (made-up names, real field names; a live row carries every field above):

```json
[
  {
    "name": "Hotel Alfama View",
    "kind": "hotel",
    "city": "Lisbon",
    "country": "Portugal",
    "rating": 4.6,
    "reviews": 1840,
    "rank": 9,
    "rankOutOf": 540,
    "priceRange": "$$$",
    "hotelClass": 4,
    "rooms": 64,
    "taId": "241348951",
    "tripadvisorUrl": "https://www.tripadvisor.com/hotel-alfama-view-1000",
    "photos": [
      "https://img.tripadvisor.com/hotel-alfama-view.jpg"
    ],
    "menuUrl": "https://www.tripadvisor.com/hotel-alfama-view-1000",
    "bookingUrl": "https://www.tripadvisor.com/hotel-alfama-view-1000",
    "details": {}
  },
  {
    "name": "Baixa Boutique Inn",
    "kind": "hotel",
    "city": "Lisbon",
    "country": "Portugal",
    "rating": 4.4,
    "reviews": 960,
    "rank": 22,
    "rankOutOf": 540,
    "priceRange": "$$",
    "hotelClass": 3,
    "rooms": 18,
    "taId": "2808829158",
    "tripadvisorUrl": "https://www.tripadvisor.com/baixa-boutique-inn-1001",
    "photos": [
      "https://img.tripadvisor.com/baixa-boutique-inn.jpg"
    ],
    "menuUrl": "https://www.tripadvisor.com/baixa-boutique-inn-1001",
    "bookingUrl": "https://www.tripadvisor.com/baixa-boutique-inn-1001",
    "details": {}
  }
]
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=tripadvisor&op=searchHotels (sign in first).

### searchRestaurants

Restaurants for a destination or dish. Every hit a full card.

| Field | Required | Type | Meaning |
|---|---|---|---|
| query | yes | string (≤300 chars) | A destination, or a dish for restaurants. |
| language | no | string (BCP-47) |  |
| currency | no | string (ISO 4217) |  |
| limit | no | integer (1-100) |  |

Response fields (each row of data; every field present, null when the source had nothing):

| Field | Type |
|---|---|
| taId | string |
| kind | string |
| name | string |
| tripadvisorUrl | string |
| description | string |
| address | any |
| city | string |
| country | string |
| latitude | number |
| longitude | number |
| phone | string |
| email | string |
| website | string |
| rating | number |
| reviews | integer |
| ratingBreakdown | any |
| reviewTags | any |
| rank | integer |
| rankOutOf | integer |
| photos | list of string |
| photoCount | integer |
| subcategories | list of string |
| hotelClass | string |
| rooms | integer |
| priceRange | string |
| priceLevel | string |
| amenities | list of string |
| hotelOffers | any |
| roomTips | any |
| categoryRatingBreakdown | any |
| nearbyTransit | any |
| cuisines | list of string |
| mealTypes | list of string |
| dietaryRestrictions | list of string |
| establishmentTypes | list of string |
| features | list of string |
| popularDishes | list of string |
| menuUrl | string |
| openingHours | any |
| timezone | string |
| neighborhood | any |
| closed | boolean |
| orderOnline | any |
| categoryRatings | any |
| attractionTypes | list of string |
| ticketOffers | any |
| lowestTicketPrice | number |
| bookingUrl | string |
| nearestMetroStations | any |
| details | object |

`details` is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is `{}` when there is nothing more.

Example request:

```bash
curl -X POST https://apiforagents.dev/v1/tripadvisor \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"searchRestaurants","query":"Rome","limit":20}'
```

Example response rows (made-up names, real field names; a live row carries every field above):

```json
[
  {
    "name": "Taberna do Rio",
    "kind": "restaurant",
    "city": "Lisbon",
    "country": "Portugal",
    "rating": 4.7,
    "reviews": 2310,
    "rank": 6,
    "rankOutOf": 4800,
    "priceRange": "$$",
    "cuisines": [
      "Portuguese",
      "Seafood"
    ],
    "taId": "1280646348",
    "tripadvisorUrl": "https://www.tripadvisor.com/taberna-do-rio-1000",
    "photos": [
      "https://img.tripadvisor.com/taberna-do-rio.jpg"
    ],
    "menuUrl": "https://www.tripadvisor.com/taberna-do-rio-1000",
    "bookingUrl": "https://www.tripadvisor.com/taberna-do-rio-1000",
    "details": {}
  },
  {
    "name": "Pasteis & Co",
    "kind": "restaurant",
    "city": "Lisbon",
    "country": "Portugal",
    "rating": 4.5,
    "reviews": 1520,
    "rank": 28,
    "rankOutOf": 4800,
    "priceRange": "$",
    "cuisines": [
      "Bakery",
      "Cafe"
    ],
    "taId": "1383105578",
    "tripadvisorUrl": "https://www.tripadvisor.com/pasteis-co-1001",
    "photos": [
      "https://img.tripadvisor.com/pasteis-co.jpg"
    ],
    "menuUrl": "https://www.tripadvisor.com/pasteis-co-1001",
    "bookingUrl": "https://www.tripadvisor.com/pasteis-co-1001",
    "details": {}
  }
]
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=tripadvisor&op=searchRestaurants (sign in first).

### searchAttractions

Things to do for a destination. Every hit a full card.

| Field | Required | Type | Meaning |
|---|---|---|---|
| query | yes | string (≤300 chars) | A destination, or a dish for restaurants. |
| language | no | string (BCP-47) |  |
| currency | no | string (ISO 4217) |  |
| limit | no | integer (1-100) |  |

Response fields (each row of data; every field present, null when the source had nothing):

| Field | Type |
|---|---|
| taId | string |
| kind | string |
| name | string |
| tripadvisorUrl | string |
| description | string |
| address | any |
| city | string |
| country | string |
| latitude | number |
| longitude | number |
| phone | string |
| email | string |
| website | string |
| rating | number |
| reviews | integer |
| ratingBreakdown | any |
| reviewTags | any |
| rank | integer |
| rankOutOf | integer |
| photos | list of string |
| photoCount | integer |
| subcategories | list of string |
| hotelClass | string |
| rooms | integer |
| priceRange | string |
| priceLevel | string |
| amenities | list of string |
| hotelOffers | any |
| roomTips | any |
| categoryRatingBreakdown | any |
| nearbyTransit | any |
| cuisines | list of string |
| mealTypes | list of string |
| dietaryRestrictions | list of string |
| establishmentTypes | list of string |
| features | list of string |
| popularDishes | list of string |
| menuUrl | string |
| openingHours | any |
| timezone | string |
| neighborhood | any |
| closed | boolean |
| orderOnline | any |
| categoryRatings | any |
| attractionTypes | list of string |
| ticketOffers | any |
| lowestTicketPrice | number |
| bookingUrl | string |
| nearestMetroStations | any |
| details | object |

`details` is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is `{}` when there is nothing more.

Example request:

```bash
curl -X POST https://apiforagents.dev/v1/tripadvisor \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"searchAttractions","query":"Kyoto","limit":20}'
```

Example response rows (made-up names, real field names; a live row carries every field above):

```json
[
  {
    "name": "Tram 28 Heritage Ride",
    "kind": "attraction",
    "city": "Lisbon",
    "country": "Portugal",
    "rating": 4.3,
    "reviews": 9840,
    "rank": 14,
    "rankOutOf": 640,
    "priceRange": "$",
    "lowestTicketPrice": 3,
    "taId": "3617795509",
    "tripadvisorUrl": "https://www.tripadvisor.com/tram-28-heritage-ride-1000",
    "photos": [
      "https://img.tripadvisor.com/tram-28-heritage-ride.jpg"
    ],
    "menuUrl": "https://www.tripadvisor.com/tram-28-heritage-ride-1000",
    "bookingUrl": "https://www.tripadvisor.com/tram-28-heritage-ride-1000",
    "details": {}
  },
  {
    "name": "Belém Tower",
    "kind": "attraction",
    "city": "Lisbon",
    "country": "Portugal",
    "rating": 4.6,
    "reviews": 41200,
    "rank": 2,
    "rankOutOf": 640,
    "priceRange": "$",
    "lowestTicketPrice": 10,
    "taId": "997333992",
    "tripadvisorUrl": "https://www.tripadvisor.com/bel-m-tower-1001",
    "photos": [
      "https://img.tripadvisor.com/bel-m-tower.jpg"
    ],
    "menuUrl": "https://www.tripadvisor.com/bel-m-tower-1001",
    "bookingUrl": "https://www.tripadvisor.com/bel-m-tower-1001",
    "details": {}
  }
]
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=tripadvisor&op=searchAttractions (sign in first).

### reviews

Reviews for up to ten places of any kind. Text, rating, dates, trip type, sub-ratings, owner response, reviewer.

| Field | Required | Type | Meaning |
|---|---|---|---|
| subjects | yes | list of string (1-10 items) | Tripadvisor place URLs of any kind. |
| since | no | string (YYYY-MM-DD) |  |
| ratings | no | list of integer (each 1-5) | Star values to keep, 1-5. |
| languages | no | list of string (each BCP-47) | Keep reviews written in these languages (BCP-47 codes, "en", "fr"). Empty = every language. |
| limit | no | integer (1-100) |  |

Response fields (each row of data; every field present, null when the source had nothing):

| Field | Type |
|---|---|
| reviewId | string |
| reviewUrl | string |
| reviewTitle | string |
| reviewText | string |
| rating | number |
| postedDate | string |
| travelDate | string |
| tripType | string |
| language | string |
| helpfulVotes | integer |
| subratings | any |
| photos | list of string |
| ownerResponse | any |
| reviewerName | string |
| reviewerProfile | string |
| reviewerLocation | string |
| reviewerContributions | integer |
| reviewerAvatar | string |
| details | object |

`details` is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is `{}` when there is nothing more.

Example request:

```bash
curl -X POST https://apiforagents.dev/v1/tripadvisor \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"reviews","subjects":["https://www.tripadvisor.com/Attraction_Review-<place-id>-Reviews-Statue_of_Liberty-New_York_City_New_York.html"],"since":"2026-01-01","languages":["en"],"limit":25}'
```

Example response rows (made-up names, real field names; a live row carries every field above):

```json
[
  {
    "reviewerName": "Hannah W.",
    "reviewerLocation": "Berlin, Germany",
    "rating": 5,
    "reviewTitle": "Worth every penny",
    "reviewText": "River view rooms are stunning. Ask for floor 5.",
    "tripType": "Couples",
    "travelDate": "2026-09",
    "postedDate": "2026-10-02",
    "helpfulVotes": 12,
    "reviewId": "2801231053",
    "reviewUrl": "https://www.tripadvisor.com/worth-every-penny-1000",
    "photos": [
      "https://img.tripadvisor.com/worth-every-penny.jpg"
    ],
    "details": {}
  },
  {
    "reviewerName": "Arjun S.",
    "reviewerLocation": "Pune, India",
    "rating": 4,
    "reviewTitle": "Great breakfast, slow check-in",
    "reviewText": "Breakfast was excellent; check-in took 40 minutes.",
    "tripType": "Friends",
    "travelDate": "2026-09",
    "postedDate": "2026-09-28",
    "helpfulVotes": 4,
    "reviewId": "1539881488",
    "reviewUrl": "https://www.tripadvisor.com/great-breakfast-slow-check-in-1001",
    "photos": [
      "https://img.tripadvisor.com/great-breakfast-slow-check-in.jpg"
    ],
    "details": {}
  }
]
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=tripadvisor&op=reviews (sign in first).

### history (free)

Stored rating/review-count/rank series of places already held. Free.

| Field | Required | Type | Meaning |
|---|---|---|---|
| subjects | yes | list of string (1-10 items) |  |
| metric | no | enum |  Values: rating, reviews, rank. |
| days | no | integer (1-730) |  |

Request shape:

```json
{
  "op": "history",
  "subjects": [
    "example"
  ]
}
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=tripadvisor&op=history (sign in first).

## Notes for the agent

Measured Tripadvisor data, one operation per call. Places are named by their Tripadvisor URL (Hotel_Review / Restaurant_ Review / Attraction_Review). Every fetch adds rating, review count and rank to the place's history. ops: hotels, restaurants, attractions (full cards for up to ten places of that kind. Contact, address and coordinates, rating with breakdown and review tags, rank out of, photos count; hotels add class, rooms, amenities, price range and OTA offers for a stay; restaurants add cuisines, dishes, hours, menu, price level; attractions add types, ticket offers, booking links), searchHotels, searchRestaurants, searchAttractions (a destination or dish, every hit a full card), reviews (reviews for up to ten places of any kind. Text, rating, dates, trip type, sub-ratings, owner response; filter by minimum date, ratings, languages), history (stored rating/review-count/rank series for places already held, free). Ops are independent. Issue several as PARALLEL tool calls. Fresh fetches are charged per record; your own answer is free while fresh.
