Open Itinerary — an open format for AI-generated travel plans
v0.2 alpha
Open Itinerary
An open, token-efficient JSON format for travel plans, designed for AI agents to output and apps to consume.
GitHub<br>Try the validator
What it is
A data model for travel plans, validated by a JSON Schema, with no library, no SDK, and no lock-in. Validate it with any JSON Schema validator in any language.
Files use the extension .oitinerary.json and the MIME type application/vnd.open-itinerary+json.
It's to travel plans what iCalendar is to events: boring, useful, and open.
Design highlights
Every stop has a goal
A goal captures not just where you're going, but why you're going there, and a goal like “Scenic viewpoint — stretch and take photos” forces AI agents to be explicit about intent.
Coords are a cache, not truth
AI agents hallucinate lat/lng, so the name (and addr) is authoritative; coordinates are added by a geocoder post-generation.
Token-efficient by design
Abbreviated keys like tz, dur, and cat save 25–35% output tokens versus verbose JSON.
Flat catalogs, not deep nesting
Stops and routes are top-level, referenced by id from each day, so there is no duplication when a stop appears in multiple days.
Alternatives are first-class
Stop-level alts suggest replacements (“instead of this restaurant, try that one”), and day-level flex blocks let you choose among options (“choose N of these”).
Duration ranges, not fixed times
dur: {min: 1.5, max: 2.5} acknowledges that travel is uncertain, and fixed times are reserved for when they truly matter (flights, reservations).
Example
CA Road Trip<br>Tokyo Weekend
Visual view
Quick start
Validate any itinerary against the schema:
pip install jsonschemacopy
python -c "import json, jsonschema; schema = json.load(open('open-itin.schema.json')); data = json.load(open('your-trip.json')); jsonschema.validate(data, schema); print('Valid')"copy
Then geocode it (adds real coordinates from OpenStreetMap):
python geocode.py your-trip.jsoncopy
Validator
Paste an Open Itinerary JSON below and validate it:
Validate<br>Render
Geocode stops
Load example<br>Clear