Flight fare observation API

Search recorded prices. Read every result state.

Query an exact one-way route and date, then check observation time and configured source coverage alongside each price.

Preview accessThe examples below are sample responses. No live airline source or public key signup is available yet. Obtain a search key from the deployment operator or run the project locally.
01 / GET STARTED

Make your first search

Send an exact departure date and two three-letter IATA codes. The API defaults to one adult, economy, EUR, and the DE market. It reads stored observations; it does not start an airline search.

  1. Obtain a search key from the deployment operator, or configure FLIGHT_API_KEY when running the project locally.
  2. Send the request from your server. Keep the key out of browser code. Replace the sample departure date with a date you want to query.
  3. Check complete and coverage before presenting any offer.
cURL · search observations
curl -X POST "https://itindb.dev/api/v1/search" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: YOUR_SEARCH_KEY" \
  -d '{"origin":"BER","destination":"BCN","departure_date":"2026-11-05"}'

For a local deployment, replace the base URL with http://localhost:5173. An unconfigured source set returns an empty, incomplete result.

Illustrative full response
{
  "search": {
    "origin": "BER", "destination": "BCN",
    "departure_date": "2026-11-05", "adults": 1,
    "cabin": "economy", "currency": "EUR", "market": "DE"
  },
  "data_mode": "observations",
  "live": false,
  "complete": true,
  "coverage": [{
    "source_id": "sample_source", "status": "ok",
    "observed_at": "2026-10-07T09:15:00Z",
    "error_code": null
  }],
  "offers": [{
    "id": "sample-offer-1", "source_id": "sample_source",
    "source_offer_id": "BER-BCN-001",
    "observed_at": "2026-10-07T09:15:00Z",
    "price": {
      "total_minor": 12900, "currency": "EUR",
      "passengers": 1, "status": "observed"
    },
    "itinerary": {
      "airline": "Example Air", "flight_numbers": ["EX 123"],
      "departure_local_date": "2026-11-05",
      "departure_at": "2026-11-05T07:30:00.000Z",
      "arrival_at": "2026-11-05T09:45:00.000Z"
    },
    "baggage": "unknown", "booking_url": null
  }]
}
02 / ACCESS

Authentication

Pass the search key in X-API-Key for POST /api/v1/search. The deployment currently has one configured search credential rather than individual developer accounts. There is no signup or key dashboard yet.

A missing or invalid key returns HTTP 401 with UNAUTHORIZED. A deployment with no configured key returns HTTP 503 with SERVICE_NOT_CONFIGURED. Source registration and ingestion use a separate operator credential, described in the operator guide.

03 / CONCEPTS

Read a result

live: false

A result is a recorded observation, not a current quote or availability check.

observed_at

The observation time: when the source recorded an offer. Use max_age_minutes to exclude older results.

coverage

The latest outcome for each configured source for this exact query.

complete

True only when at least one configured source exists and each has a recent ok or no_offers outcome.

Complete coverage describes the configured source set, not every airline. Prices use minor currency units: 12900 with EUR means €129.00. The total covers the searched adult party and mandatory taxes and fees. Optional seats and baggage can cost extra.

04 / DECISIONS

Understand every result state

Always read coverage with offers. An empty array alone cannot establish that no flights exist.

StateWhat to tell a user
No sources configuredNo source was checked; availability is unknown.
Not observedA source has no recent outcome for this route and date.
Stale or errorPrevious data is too old or the source failed.
PartialSome offers may be shown, but coverage is incomplete.
Complete + no_offersEvery configured source reported no offers for this exact search.
Typical unconfigured response · abbreviated
{
  "data_mode": "observations",
  "live": false,
  "complete": false,
  "coverage": [],
  "offers": []
}
Explore all sample states
05 / DATA MODEL

Fare fields and limits

Each offer contains its source, observation time, total price, airline, flight numbers, departure and arrival timestamps, baggage state, and a booking URL when supplied. A booking URL is a handoff, not a guarantee of the same fare at checkout.

Timestamps in actual API responses are normalized to UTC. The API does not yet return airport time zones or separate local wall times. Do not label the returned timestamp as local time.

Searches are one-way, exact-date, and adult-only. Return journeys, fare rules, live repricing, and booking are outside this version. The synthetic collection endpoints are test-only and do not provide airline quotes.

06 / TROUBLESHOOTING

Handle errors

Errors use { "error": { "code": "...", "message": "..." } }. Treat HTTP status as the category and code as the machine-readable reason.

HTTP / codeAction
400 · INVALID_REQUESTCorrect the JSON body, codes, date, or age limit.
401 · UNAUTHORIZEDCheck the server-side search key.
503 · SERVICE_NOT_CONFIGUREDAsk the deployment operator to configure the search key.
500 · INTERNAL_ERRORRetry later; the service could not complete the request.

A successful HTTP response can still have complete: false. Handle it as a data coverage state rather than an HTTP failure.

07 / REFERENCE

Exact schemas

Use the OpenAPI specification for request and response schemas and llms.txt for a concise integration summary. The raw specification also includes operator and synthetic test endpoints.

Running a source or test adapter?

Source registration, policy, ingestion, and synthetic collection are documented separately.

Open the operator guide ↗