{
  "actorOutputSchemaVersion": 1,
  "description": "One row per place in search/details modes and one row per review in reviews mode. Empty fields are omitted at every depth. Every record carries recordType, sourceUrl and scrapedAt. Legacy place names are kept for backward compatibility; rating, numberOfReviews, latitude and longitude are strings, while ratingValue, reviewCount, lat and lng are numeric.",
  "properties": {
    "address": {
      "description": "Full address",
      "template": "{{address}}",
      "title": "Address",
      "type": "string"
    },
    "amenities": {
      "description": "Hotel amenities",
      "template": "{{amenities}}",
      "title": "Amenities",
      "type": "string"
    },
    "author": {
      "description": "Reviewer display name",
      "template": "{{author}}",
      "title": "Author",
      "type": "string"
    },
    "authorLocation": {
      "description": "Reviewer hometown when published",
      "template": "{{authorLocation}}",
      "title": "Author location",
      "type": "string"
    },
    "city": {
      "description": "City name",
      "template": "{{city}}",
      "title": "City",
      "type": "string"
    },
    "country": {
      "description": "Country name",
      "template": "{{country}}",
      "title": "Country",
      "type": "string"
    },
    "cuisine": {
      "description": "Restaurant cuisines",
      "template": "{{cuisine}}",
      "title": "Cuisine",
      "type": "string"
    },
    "date": {
      "description": "Review submission timestamp",
      "template": "{{date}}",
      "title": "Review date",
      "type": "string"
    },
    "description": {
      "description": "Place description when published",
      "template": "{{description}}",
      "title": "Description",
      "type": "string"
    },
    "detailSource": {
      "description": "detailPage or typeaheadFallback",
      "template": "{{detailSource}}",
      "title": "Detail source",
      "type": "string"
    },
    "detailStatus": {
      "description": "complete or partial when only a TypeAhead fallback was available",
      "template": "{{detailStatus}}",
      "title": "Detail status",
      "type": "string"
    },
    "email": {
      "description": "Published email",
      "template": "{{email}}",
      "title": "Email",
      "type": "string"
    },
    "helpfulVotes": {
      "description": "Helpful votes on the review",
      "template": "{{helpfulVotes}}",
      "title": "Helpful votes",
      "type": "string"
    },
    "hotelClass": {
      "description": "Hotel star rating when published",
      "template": "{{hotelClass}}",
      "title": "Hotel class",
      "type": "string"
    },
    "hours": {
      "description": "Opening hours text when published",
      "template": "{{hours}}",
      "title": "Hours",
      "type": "string"
    },
    "id": {
      "description": "Place ID for place rows, review ID for review rows",
      "template": "{{id}}",
      "title": "ID",
      "type": "string"
    },
    "isClosed": {
      "description": "Whether the place is permanently closed, as text",
      "template": "{{isClosed}}",
      "title": "Is closed",
      "type": "string"
    },
    "language": {
      "description": "Review language tag",
      "template": "{{language}}",
      "title": "Review language",
      "type": "string"
    },
    "lat": {
      "description": "Numeric latitude",
      "template": "{{lat}}",
      "title": "Numeric latitude",
      "type": "string"
    },
    "latitude": {
      "description": "Legacy latitude as text",
      "template": "{{latitude}}",
      "title": "Legacy latitude",
      "type": "string"
    },
    "lng": {
      "description": "Numeric longitude",
      "template": "{{lng}}",
      "title": "Numeric longitude",
      "type": "string"
    },
    "locationId": {
      "description": "Legacy alias of id for place rows",
      "template": "{{locationId}}",
      "title": "Legacy location ID",
      "type": "string"
    },
    "longitude": {
      "description": "Legacy longitude as text",
      "template": "{{longitude}}",
      "title": "Legacy longitude",
      "type": "string"
    },
    "name": {
      "description": "Place name",
      "template": "{{name}}",
      "title": "Place name",
      "type": "string"
    },
    "neighborhoods": {
      "description": "Neighborhood names when published",
      "template": "{{neighborhoods}}",
      "title": "Neighborhoods",
      "type": "string"
    },
    "numberOfReviews": {
      "description": "Legacy review count as text",
      "template": "{{numberOfReviews}}",
      "title": "Legacy number of reviews",
      "type": "string"
    },
    "phone": {
      "description": "Phone number",
      "template": "{{phone}}",
      "title": "Phone",
      "type": "string"
    },
    "photoUrl": {
      "description": "Legacy alias of the first photo",
      "template": "{{photoUrl}}",
      "title": "Legacy photo URL",
      "type": "string"
    },
    "photos": {
      "description": "Place photo URLs",
      "template": "{{photos}}",
      "title": "Photos",
      "type": "string"
    },
    "placeId": {
      "description": "Place ID for review rows",
      "template": "{{placeId}}",
      "title": "Place ID",
      "type": "string"
    },
    "postalCode": {
      "description": "Postal or ZIP code",
      "template": "{{postalCode}}",
      "title": "Postal code",
      "type": "string"
    },
    "priceLevel": {
      "description": "Price level symbols when published",
      "template": "{{priceLevel}}",
      "title": "Price level",
      "type": "string"
    },
    "priceRange": {
      "description": "Price range text published by Tripadvisor",
      "template": "{{priceRange}}",
      "title": "Price range",
      "type": "string"
    },
    "ranking": {
      "description": "Tripadvisor ranking text, for example #13 of 588 hotels in New York City",
      "template": "{{ranking}}",
      "title": "Ranking",
      "type": "string"
    },
    "rankingPosition": {
      "description": "Numeric rank parsed from the ranking string",
      "template": "{{rankingPosition}}",
      "title": "Ranking position",
      "type": "string"
    },
    "rankingString": {
      "description": "Legacy alias of ranking",
      "template": "{{rankingString}}",
      "title": "Legacy ranking string",
      "type": "string"
    },
    "rating": {
      "description": "Legacy bubble rating as text, 0-5",
      "template": "{{rating}}",
      "title": "Rating",
      "type": "string"
    },
    "ratingValue": {
      "description": "Numeric bubble rating, 0-5",
      "template": "{{ratingValue}}",
      "title": "Numeric rating",
      "type": "string"
    },
    "recordType": {
      "description": "place or review",
      "template": "{{recordType}}",
      "title": "Record type",
      "type": "string"
    },
    "reviewCount": {
      "description": "Numeric total number of reviews for the place",
      "template": "{{reviewCount}}",
      "title": "Review count",
      "type": "string"
    },
    "scrapeTimestamp": {
      "description": "Legacy alias of scrapedAt",
      "template": "{{scrapeTimestamp}}",
      "title": "Legacy scrape timestamp",
      "type": "string"
    },
    "scrapedAt": {
      "description": "ISO timestamp of the run",
      "template": "{{scrapedAt}}",
      "title": "Scraped at",
      "type": "string"
    },
    "searchQuery": {
      "description": "The search query that found the place",
      "template": "{{searchQuery}}",
      "title": "Search query",
      "type": "string"
    },
    "sourceUrl": {
      "description": "Tripadvisor page the record came from",
      "template": "{{sourceUrl}}",
      "title": "Source URL",
      "type": "string"
    },
    "state": {
      "description": "State or province",
      "template": "{{state}}",
      "title": "State or province",
      "type": "string"
    },
    "street": {
      "description": "Street address",
      "template": "{{street}}",
      "title": "Street",
      "type": "string"
    },
    "subcategory": {
      "description": "Legacy specific subcategory label; falls back to the place type",
      "template": "{{subcategory}}",
      "title": "Subcategory",
      "type": "string"
    },
    "text": {
      "description": "Review body",
      "template": "{{text}}",
      "title": "Review text",
      "type": "string"
    },
    "title": {
      "description": "Review title",
      "template": "{{title}}",
      "title": "Review title",
      "type": "string"
    },
    "tripType": {
      "description": "Traveler type reported by the reviewer",
      "template": "{{tripType}}",
      "title": "Trip type",
      "type": "string"
    },
    "type": {
      "description": "hotel, restaurant or attraction",
      "template": "{{type}}",
      "title": "Place type",
      "type": "string"
    },
    "url": {
      "description": "Canonical Tripadvisor place page",
      "template": "{{url}}",
      "title": "Place URL",
      "type": "string"
    },
    "webUrl": {
      "description": "Legacy alias of url",
      "template": "{{webUrl}}",
      "title": "Legacy web URL",
      "type": "string"
    },
    "website": {
      "description": "Official website URL when published",
      "template": "{{website}}",
      "title": "Website",
      "type": "string"
    }
  },
  "required": [
    "recordType",
    "sourceUrl",
    "scrapedAt",
    "id"
  ],
  "title": "Tripadvisor Place and Review Scraper output",
  "type": "object"
}
