XooCode(){

Trip

Trip is the parent type for any travel segment that happens over time: flights, train rides, bus journeys, ferry crossings, and the generic road-trip case. Direct subtypes in the search-visible corner of schema.org are Flight, TrainTrip, BusTrip, and BoatTrip. Bare Trip is for travel that doesn't fit any of those (a multi-segment road trip, a guided tour, a custom itinerary).

Trip adds 6 properties: departureTime, arrivalTime, provider (the carrier or tour operator), offers (ticket pricing), itinerary (ordered list of stops as Place or ItemList), and subTrip / partOfTrip (for multi-leg trips).

Full example of schema.org/Trip json-ld markup

The markup is verified as valid with Rich Results Test from Google.

Highlight legend:Required by GoogleRecommendedOptional
schema.org/Trip
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Trip",
  "name": "Copenhagen to Bergen via Oslo",
  "departureTime": "2026-11-17T16:30:00+01:00",
  "arrivalTime": "2026-11-19T14:20:00+01:00",
  "provider": { "@type": "Organization", "name": "Nordic Rail + DFDS Combined Itinerary" },
  "subTrip": [
    { "@type": "BoatTrip", "departureBoatTerminal": { "@type": "BoatTerminal", "name": "Copenhagen Nordhavn Terminal" }, "arrivalBoatTerminal": { "@type": "BoatTerminal", "name": "Oslo Vippetangen Terminal" }, "departureTime": "2026-11-17T16:30:00+01:00", "arrivalTime": "2026-11-18T09:45:00+01:00" },
    { "@type": "TrainTrip", "departureStation": { "@type": "TrainStation", "name": "Oslo Sentralstasjon" }, "arrivalStation": { "@type": "TrainStation", "name": "Bergen Stasjon" }, "departureTime": "2026-11-19T07:25:00+01:00", "arrivalTime": "2026-11-19T14:20:00+01:00" }
  ],
  "offers": { "@type": "Offer", "price": "2140.00", "priceCurrency": "DKK", "availability": "https://schema.org/InStock" }
}
</script>

Trip vs Reservation

Trip is what gets travelled. Reservation is the booking that lets you travel it. The subtypes follow the same split: FlightReservation wraps a Flight, TrainReservation wraps a TrainTrip, BusReservation wraps a BusTrip, BoatReservation wraps a BoatTrip. The Trip carries the physical schedule; the Reservation carries the passenger, seat, ticket number, and booking status.

itinerary and subTrip

For multi-leg journeys, use itinerary (an ItemList of Places visited in order) or subTrip (an ordered list of Trip sub-entities, each a leg). The subTrip pattern is richer because each leg can be its own Flight or TrainTrip with its own carrier and times. Use itinerary for simple stop lists and subTrip when each leg needs full Trip markup.

Minimal valid version

The smallest markup that still produces a valid Trip entity. Use it as the floor. Reach for the advanced example above when you want search engines and AI agents to understand more about your content.

schema.org/Trip (minimal)
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Trip",
  "name": "Copenhagen to Bergen via Oslo",
  "departureTime": "2026-11-17T16:30:00+01:00",
  "arrivalTime": "2026-11-19T14:20:00+01:00"
}
</script>

Google rich results this unlocks

Markup matching this example makes your page eligible for the following Google Search rich results. The primary target drives the required / recommended property classification in the advanced code block above.

  • No dedicated rich result (subtypes drive Gmail travel cards)
    Google docs

Common Trip mistakes

Mistakes that pass validation but silently fail to earn rich results or mislead consumers walking the graph. Avoid these and your markup will be ahead of most sites in the wild.

  1. 01

    Using bare Trip when Flight / TrainTrip / BusTrip / BoatTrip fits

    Wrong
    "@type": "Trip" for a scheduled airline flight
    Right
    "@type": "Flight"

    Gmail and Google Search match travel cards by subtype. A bare Trip misses stations, terminals, gate, carrier, and everything the subtypes carry. Use the specific subtype whenever your travel has a known mode.

  2. 02

    itinerary as a flat string

    Wrong
    "itinerary": "Copenhagen, Oslo, Bergen"
    Right
    "itinerary": { "@type": "ItemList", "itemListElement": [{ "@type": "Place", "name": "Copenhagen" }, ...] }

    itinerary expects a Place or an ItemList of Places. A free-text string provides no structure for mapping or displaying the route.

About the example data

A multi-day Copenhagen to Oslo to Bergen journey combining Nora Lindgren's Copenhagen-Oslo ferry (BoatTrip) with a follow-on Oslo-Bergen train (TrainTrip).

Comments

Loading comments...

Leave a comment