Travel

Attraction & Experience

/extract/json

Tourist attraction or bookable travel experience listing from an OTA or attraction platform.

Download the schematravel/attraction-experience.json

attraction-experience.schema

// names marked ? are optional

name:string// Name of the attraction or experience. Commonly found in: Viator, GetYourGuide, TripAdvisor Experiences, attraction website.
attraction_type:string// Category of the attraction or experience. Commonly found in: platform category, listing metadata. One of: museum, tour, activity, show, class, adventure, food_experience, transport, other.
operator_name?:string// Name of the operator or organizer. Commonly found in: Viator operator, GetYourGuide supplier, listing details.
address?:string// Meeting point or address. Commonly found in: listing details, meeting point section.
city:string// City where the experience takes place. Commonly found in: listing details, platform search.
country:string// Country where the experience takes place. Commonly found in: listing details, platform search.
latitude?:number// Latitude of the meeting point or main location. Commonly found in: Google Maps, geocoding API.
longitude?:number// Longitude of the meeting point or main location. Commonly found in: Google Maps, geocoding API.
description?:string// Full description of the experience. Commonly found in: listing description, about section.
duration_minutes?:number// Duration of the experience in minutes. Commonly found in: listing details, duration field.
min_participants?:number// Minimum number of participants. Commonly found in: listing details, booking requirements.
max_participants?:number// Maximum number of participants. Commonly found in: listing details, group size.
age_minimum?:number// Minimum age requirement. Commonly found in: listing details, requirements section.
price_adult_usd?:number// Adult price in USD. Commonly found in: Viator pricing, GetYourGuide pricing, listing price.
price_child_usd?:number// Child price in USD. Commonly found in: listing price, pricing table.
price_currency?:string// Currency code for the prices. Commonly found in: listing price display.
booking_required?:boolean// Whether advance booking is required. Commonly found in: listing details, booking info.
cancellation_policy?:string// Cancellation policy description. Commonly found in: listing policies, booking terms.
languages_offered?:string[]// Languages in which the experience is offered. Commonly found in: listing details, language filter.
inclusions?:string[]// What is included in the experience. Commonly found in: listing inclusions section.
exclusions?:string[]// What is not included in the experience. Commonly found in: listing exclusions section.
review_rating?:number// Average review rating. Commonly found in: Viator rating, GetYourGuide rating, TripAdvisor rating.
review_count?:number// Total number of reviews. Commonly found in: Viator, GetYourGuide, TripAdvisor.
images?:string[]// URLs of experience images. Commonly found in: listing photos.
category_tags?:string[]// Category tags or labels. Commonly found in: platform tags, listing metadata.
booking_url?:string// URL to book the experience. Commonly found in: listing page CTA, booking link.
page_title?:string// Title of the source page. Tabstack auto-fills this from page metadata when left empty.
favicon?:string// Favicon URL of the source page. Tabstack auto-fills this from page metadata when left empty.

Try it live

A sample Attraction & Experience document, generated from the schema. Edit it, or paste a real response, and see it checked against the schema instantly. It runs in your browser, nothing is sent anywhere.

your-output.json
validation

Valid, matches Attraction & Experience

Every required field is present and each value matches its type. Extra fields are allowed. A field the page does not carry is not guaranteed to come back as null, so check values rather than only checking for null.

/extract/json

Copy-paste usage

The same call in TypeScript, Python, and curl. Point it at your own URL and go. The schema drives the response, so you get back the fields you asked for instead of a page to parse.

Features

  • Typed TypeScript and Python SDKs
  • One call, no parsing code and no second LLM pass
  • The same field names on every request, even when the page layout changes
attraction-experience.ts
// curl -sfLO https://raw.githubusercontent.com/Mozilla-Ocho/tabstack-schemas/main/travel/attraction-experience.json
import Tabstack from '@tabstack/sdk'
import schema from './attraction-experience.json' with { type: 'json' }

const client = new Tabstack() // reads TABSTACK_API_KEY from the environment

try {
  const data = await client.extract.json({
    url: 'https://example.com/hotels/example-hotel',
    json_schema: schema,
    effort: 'standard', // 'min' | 'standard' | 'max'
  })

  console.log(data)
} catch (err) {
  console.error('Extraction failed:', err)
}

Ship this schema in one call.

Pass a URL, get matching JSON back. Free to start, no extraction layer to maintain.