Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

OpenItinerary

build PyPI Version

OpenItinerary is an open, vendor-neutral standard for representing travel itineraries as structured data.

Inspired by JSON in the data exchange space, OpenItinerary facilitates a common specification that any travel company can produce or consume without relying on proprietary formats. A single itinerary can contain flights, trains, accommodation and other travel related activities from various vendors within a single unified model.

Principles:

  • Vendor Neutral: No dependency on any particular vendor proprietary format. Instead model the underlying travel concepts.
  • Open & Interoperable: Designed to move cleanly between systems and programming languages.
  • Strongly Typed: Fields have clear semantics and avoid ambiguity. Missing concept and fields should be proposed to be added to the standard and there should be no custom metadata "escape hatches".
  • Minimal: Universal Concepts are defined at the base models and domain specifics belong in specialized types.
  • Serialization Friendly: Data model will at minimum map cleanly to JSON.
  • Versioning: Schema is versioned and follows standard semantic versioning rules.
  • Single Canonical Time: Date/Times are always stored in UTC format. Geographic Places will always store the Time zone in which they take place. Downstream applications are responsible for ensuring that time presented correctly.
  • Internationalization: International differences are handled explicitly. Textual fields will store the language they are stored in so that downstream applications can present/provide translation when needed.

Implementation

The schema is defined and maintained using Pydantic Models however this does not mean that OpenItinerary is a python project. These models are used to generate a JSON Schema which serves as the canonical schema of the project.

JSON is the default interchange format because it is universal, readable, and easy to integrate. From this format, other formats can be derived:

graph LR

Pydantic(Pydantic Models)
JSONSchema(JSON Schema)

Pydantic --> JSONSchema

JSONSchema --> Typescript
JSONSchema --> Protobuf
JSONSchema --> Flatbuffer
JSONSchema --> ...

Performance sensitive consumers may want to use binary formats such as Protobuf so the standard only states that JSON is a minimum supported format. Binary formats must represent the same model.

Python Package

Install the Python package from PyPI:

python -m pip install openitinerary

Import models from the openitinerary package:

from openitinerary.models.itinerary import Itinerary

Generate the current JSON Schema with the installed command:

openitinerary --output stdout

Adapter API configuration

The Adapter API limits each uploaded document to 10 MiB by default. Set to a positive integer to configure the limit in bytes. The value is loaded when the API process starts, so restart the process after changing it.

Environment Variables

Name Description Default
OPEN_ITINERARY_MAX_UPLOAD_SIZE_BYTES Maximum size of an uploaded document to the /adapt API 10485760 bytes (10MB)

## Concepts

  • Itinerary: An itinerary is an ordered collection of typed segments.
  • Segment: A travel activity that happens at a specified time at a specific place.
  • Place: A geographical location on the earth.

The BaseSegment defined common concepts for all travel related activities and domain specific models such as FlightSegment add stronger fields and validation.

Roadmap

Schema

  • Base Segment Types
  • Flights and Airports
  • Train and Train Stations
  • Accommodation
  • Transfers
  • Activities and Tours
  • Car Rentals
  • Ferries
  • Cruises

Implementations

  • PDF Adapter
  • HTML Adapter
  • Email Adapter
  • Calender Adapter
  • ZIP Adapter
  • Model Validation API
  • Adapter API
  • Python Package
  • JSON Schema Package
  • Batch Ingestion & Job Processing Service

Versioning and releases

This repository has two independent versions:

  • The schema version is defined by OPEN_ITINERARY_VERSION in src/openitinerary/version.py. Changes to the standard must update this version in the same pull request and regenerate the committed schemas with make generate_out.
  • The Python package version is defined in pyproject.toml. It changes when a new Python distribution is published, including releases containing only Python tooling or adapter changes. Such changes do not require a schema version bump.

Schema versions follow semantic versioning. Breaking changes increment the major version, backwards-compatible additions increment the minor version, and small corrections to schema documentation or metadata increment the patch version. Generated schema directories intentionally use only the major and minor components, for example schemas/0.1/itinerary.schema.json. A patch release updates the schema for that minor line rather than creating a new directory.

Package version changes are made by a developer in a pull request intended to create a release. Use uv version so pyproject.toml and uv.lock remain in sync, then commit both files:

uv version --bump patch --no-sync

Use minor or major instead of patch when appropriate. Pull requests are published as beta versions for testing. After a package-version change is merged to main, the committed version is built and published to PyPI. A merge that does not change the package version does not publish a stable release.

License

Copyright 2026 Kiran Patel.

Licensed under the Apache License, Version 2.0.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

openitinerary-0.1.1b73.tar.gz (24.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

openitinerary-0.1.1b73-py3-none-any.whl (40.5 kB view details)

Uploaded Python 3

File details

Details for the file openitinerary-0.1.1b73.tar.gz.

File metadata

  • Download URL: openitinerary-0.1.1b73.tar.gz
  • Upload date:
  • Size: 24.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for openitinerary-0.1.1b73.tar.gz
Algorithm Hash digest
SHA256 a377cfe9d6292d7535c2e1b15075c31a93415d550d4d35ac43e7e67dc689e0d9
MD5 a2ed36b60fbfb5adec226ff30839c71e
BLAKE2b-256 6eaa9fa6953249bf3c332c09642f985bac3e0892882d9eb02e9fd30b71a9db21

See more details on using hashes here.

File details

Details for the file openitinerary-0.1.1b73-py3-none-any.whl.

File metadata

  • Download URL: openitinerary-0.1.1b73-py3-none-any.whl
  • Upload date:
  • Size: 40.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for openitinerary-0.1.1b73-py3-none-any.whl
Algorithm Hash digest
SHA256 e4a23e3585ae6c2482e5a3112d6b94a8242fc4e363fd7ea7c749467b1aedd156
MD5 d303d477902240a99afd0d074050931c
BLAKE2b-256 7c10462349801cadfd0d2ab651aa333474d966f9da3ed3af643f512699abee34

See more details on using hashes here.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page