{"openapi":"3.1.0","info":{"title":"Far by Rail public data API","version":"1.0.0","summary":"Read-only access to the published Far by Rail train journey catalogue.","description":"A public, read-only JSON API over the published Far by Rail catalogue.\n\nWhat it is: source-backed editorial and practical data about train journeys, with explicit provenance, explicit unknowns and clearly labelled outbound operator links.\n\nWhat it is NOT: it holds no live timetable, no seat inventory, no fares for a given date, and no ticketing. Prices are recorded observations with a stated scope and date. Month information describes editorial and service suitability, not availability on a date.\n\nRights: public read access. Machine readability does not grant commercial reuse of editorial text or photography; every media item carries its own licence and credit.\nJourney contract version: far-by-rail/journey-v1.","contact":{"name":"Far by Rail","url":"https://farbyrail.com/data"}},"servers":[{"url":"https://farbyrail.com","description":"Current public origin"}],"security":[],"tags":[{"name":"discovery","description":"Find journeys"},{"name":"journeys","description":"Read one journey"},{"name":"collections","description":"Editorial groupings"},{"name":"platform","description":"Capability and manifest documents"}],"paths":{"/data/search.json":{"get":{"operationId":"searchJourneys","tags":["discovery"],"summary":"Search published journeys","description":"Filters apply across the whole published catalogue; `total` is the full post-filter count, never the size of one page. Unsupported parameters return 400 rather than being ignored.","parameters":[{"name":"q","in":"query","schema":{"type":"string","maxLength":120},"description":"Free text over journey names and summaries."},{"name":"country","in":"query","schema":{"type":"string"},"description":"Country slug from /data/facets.json."},{"name":"archetype","in":"query","schema":{"type":"string"},"description":"Journey type slug from /data/facets.json."},{"name":"intent","in":"query","schema":{"type":"string"}},{"name":"month","in":"query","schema":{"type":"integer","minimum":1,"maximum":12},"description":"Editorial or service suitability for a month. NOT live availability."},{"name":"max_duration_minutes","in":"query","schema":{"type":"integer","minimum":1,"maximum":100000}},{"name":"overnight","in":"query","schema":{"type":"string","enum":["overnight","daytime"]},"description":"Matches only journeys with reviewed primary-source evidence. Unverified journeys are excluded, not guessed."},{"name":"sort","in":"query","schema":{"type":"string","enum":["canonical","name","duration"]}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Matching journeys.","content":{"application/json":{"schema":{"type":"object","required":["contract_version","total","limit","offset","results"],"properties":{"contract_version":{"type":"string"},"generated_at":{"type":"string"},"applied_filters":{"type":"object"},"semantics":{"type":"object"},"total":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"},"count":{"type":"integer"},"filtered_over":{"type":"string"},"results":{"type":"array","items":{"type":"object","required":["contract_version","id","slug","name","countries","archetypes","overnight","links"],"properties":{"contract_version":{"type":"string"},"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"summary":{"type":"string"},"operator":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"}}},"countries":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"}}}},"archetypes":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"}}}},"duration_minutes":{"type":["integer","null"]},"price_band":{"type":["string","null"]},"overnight":{"type":"string","enum":["overnight","daytime","varies","unknown"]},"links":{"type":"object","properties":{"human":{"type":"string","format":"uri"},"machine":{"type":"string","format":"uri"}}}}}},"next":{"type":"string","format":"uri"},"next_offset":{"type":"integer"}}}}}},"304":{"description":"Not modified. Returned when If-None-Match matches the current ETag."},"400":{"description":"Invalid or unsupported parameter.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine error code."},"message":{"type":"string"},"status":{"type":"integer"},"supported_parameters":{"type":"array","items":{"type":"string"}},"allowed_values":{"type":"array","items":{"type":"string"}}}}}}},"502":{"description":"The canonical data source is unavailable.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine error code."},"message":{"type":"string"},"status":{"type":"integer"},"supported_parameters":{"type":"array","items":{"type":"string"}},"allowed_values":{"type":"array","items":{"type":"string"}}}}}}}}}},"/data/experiences.json":{"get":{"operationId":"listJourneys","tags":["discovery"],"summary":"Compact catalogue of all published journeys","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Catalogue page.","content":{"application/json":{"schema":{"type":"object","required":["contract_version","total","limit","offset","items"],"properties":{"contract_version":{"type":"string"},"generated_at":{"type":"string"},"total":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"},"count":{"type":"integer"},"items":{"type":"array","items":{"type":"object","required":["id","slug","name","countries","archetypes"],"properties":{"id":{"type":"string"},"canonical_id":{"type":["string","null"]},"slug":{"type":"string"},"name":{"type":"string"},"operator":{"type":["object","string","null"]},"countries":{"type":"array","items":{"type":["object","string"]}},"archetypes":{"type":"array","items":{"type":["object","string"]}},"duration_minutes":{"type":["integer","null"]},"operational_status":{"type":["string","null"]},"machine_capability":{"type":["object","string","null"]}},"additionalProperties":true}},"next":{"type":["string","null"],"format":"uri-reference"},"next_offset":{"type":["integer","null"]}}}}}},"304":{"description":"Not modified. Returned when If-None-Match matches the current ETag."},"400":{"description":"Invalid or unsupported parameter.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine error code."},"message":{"type":"string"},"status":{"type":"integer"},"supported_parameters":{"type":"array","items":{"type":"string"}},"allowed_values":{"type":"array","items":{"type":"string"}}}}}}},"502":{"description":"The canonical data source is unavailable.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine error code."},"message":{"type":"string"},"status":{"type":"integer"},"supported_parameters":{"type":"array","items":{"type":"string"}},"allowed_values":{"type":"array","items":{"type":"string"}}}}}}}}}},"/data/experiences/{slug}.json":{"get":{"operationId":"getJourney","tags":["journeys"],"summary":"One published journey, canonical machine record","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The established canonical machine record, unchanged, plus an additive `agent_context` (the same shared projection served at /data/journeys/{slug}.json) and a `published_semantics` summary.","content":{"application/json":{"schema":{"type":"object","required":["agent_context","published_semantics"],"properties":{"agent_context":{"type":"object","required":["contract_version","id","slug","name","countries","routes","duration","overnight","pricing","sources","links","rights"],"properties":{"contract_version":{"type":"string"},"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"tagline":{"type":"string"},"summary":{"type":"string"},"operator":{"type":"object","properties":{"name":{"type":"string"}}},"countries":{"type":"array","items":{"type":"object"}},"archetypes":{"type":"array","items":{"type":"object"}},"landscapes":{"type":"array","items":{"type":"string"}},"route_summary":{"type":"string"},"routes":{"type":"array","items":{"type":"object","required":["name","role","stop_count"],"properties":{"slug":{"type":"string"},"name":{"type":"string"},"role":{"type":"string","enum":["primary","alternative"]},"direction_label":{"type":"string"},"duration_minutes":{"type":"integer"},"stop_count":{"type":"integer"},"origin":{"type":"string"},"destination":{"type":"string"}}}},"duration":{"type":"object","required":["unit","precision","scope"],"properties":{"minutes":{"type":"integer"},"unit":{"type":"string","enum":["minutes"]},"precision":{"type":"string","enum":["scheduled","typical","approximate","unknown"],"description":"`typical` is the honest default: the catalogue records a typical journey length, which is not proof of an operator-published timetable figure. `scheduled` is used only where an operator timetable figure is the source."},"precision_note":{"type":["string","null"]},"route_name":{"type":["string","null"],"description":"The named variant the figure describes, when the figure belongs to one."},"scope":{"type":"string","enum":["experience","route_variant","unknown"]},"route_slug":{"type":"string"}}},"overnight":{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["overnight","daytime","varies","unknown"],"description":"`unknown` means no primary source has been reviewed and the canonical record states nothing. It never means the journey is a daytime service. `varies` is preserved as its own state and is never reduced to yes/no."},"basis":{"type":"string","enum":["canonical_record","reviewed_source","none"],"description":"Where the status came from. The canonical record wins over the reviewed registry."},"source_url":{"type":"string","format":"uri"},"evidence":{"type":"string"},"retrieved_at":{"type":"string"},"limitation":{"type":"string","description":"Explicit limit of what the reviewed source proves."}}},"pricing":{"type":"object","required":["status","scope","components","is_current_offer"],"properties":{"status":{"type":"string","enum":["established","dynamic","unknown"],"description":"`established` requires a recorded amount AND a currency. `dynamic` means the operator prices dynamically and no fixed fare is recorded."},"currency":{"type":["string","null"]},"scope":{"type":"object","description":"Every member is null unless the canonical record establishes it. Free text is never promoted into an enum value.","properties":{"payer":{"type":["string","null"],"enum":["person","cabin","package",null]},"travel_class":{"type":["string","null"]},"trip_type":{"type":["string","null"],"enum":["one_way","round_trip",null]},"season":{"type":["string","null"]},"supplements_included":{"type":["boolean","null"]}}},"basis":{"type":["string","null"],"description":"Verbatim canonical basis text: what the recorded amounts actually cover."},"components":{"type":"array","description":"Independent components. They are never summed automatically: a supplement may or may not apply to a given ticket.","items":{"type":"object","required":["kind","amount_is_usable"],"properties":{"kind":{"type":"string","enum":["recorded_from","typical_range","reservation_fee","pass_supplement"],"description":"Neutral, recorded kinds. A recorded lowest price is NOT asserted to be a base fare, and a reservation fee is NOT asserted to be a mandatory supplement, unless the record proves it."},"amount":{"type":["number","null"]},"amount_min":{"type":["number","null"]},"amount_max":{"type":["number","null"]},"currency":{"type":["string","null"]},"amount_is_usable":{"type":"boolean","description":"False when no currency is recorded: a bare number is not a usable price."},"applies_to_every_ticket":{"type":["boolean","null"],"description":"null when the record does not establish whether the component always applies."},"note":{"type":"string"}}}},"dynamic_pricing":{"type":"boolean"},"observed_at":{"type":"string"},"verified_at":{"type":"string"},"is_current_offer":{"type":"boolean","enum":[false],"description":"Always false. These are recorded observations, not bookable offers."}}},"booking_action":{"type":"object","required":["kind","url","label","note","verified_direct_booking"],"properties":{"kind":{"type":"string","enum":["booking","official","operator"],"description":"`booking` = verified reservation entry point. `official` = operator's own journey information page. `operator` = operator homepage only."},"url":{"type":"string","format":"uri"},"label":{"type":"string"},"note":{"type":"string"},"verified_direct_booking":{"type":"boolean"},"reservation_required":{"type":"boolean"},"pass_accepted":{"type":"boolean"},"checked_at":{"type":"string"}}},"seat_side":{"type":"array","items":{"type":"object"}},"onboard_features":{"type":"array","items":{"type":"object"}},"seasons":{"type":"array","items":{"type":"object"}},"scores":{"type":"object"},"sources":{"type":"array","items":{"type":"object"}},"primary_family":{"type":"string","description":"Presentation family from the shared resolver, not simply the first archetype."},"media":{"type":"array","items":{"type":"object","properties":{"role":{"type":"string"},"url":{"type":"string","format":"uri"},"alt":{"type":["string","null"]},"credit":{"type":["string","null"]},"license":{"type":["string","null"]},"license_url":{"type":["string","null"],"format":"uri"},"ai_generated":{"type":"boolean"},"rights_verified_at":{"type":"string"},"rights":{"type":"object","description":"The picture's own licence terms, kept strictly separate from our dataset-level flag.","properties":{"license":{"type":["string","null"]},"license_url":{"type":["string","null"],"format":"uri"},"license_permits_commercial_reuse":{"type":["boolean","null"],"description":"null unless the licence itself establishes it. A false catalogue eligibility flag never asserts that a CC BY photograph forbids commercial reuse."},"catalogue_commercial_eligibility":{"type":"boolean","description":"Our dataset flag only. It is not a statement about the licence."}}}}}},"provenance":{"type":"object","description":"Claim-level provenance from the canonical public RPC. Absent means not returned, never \"no sources\".","properties":{"contract_version":{"type":"string"},"experience_id":{"type":"string"},"slug":{"type":"string"},"claims":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"property_key":{"type":"string"},"review_state":{"type":"string","enum":["accepted"]},"value":{"type":["number","boolean","string","null"]},"value_exported":{"type":"boolean","description":"False means the value is withheld from export, not that it is missing."},"unit":{"type":["string","null"]},"confidence":{"type":["number","string","null"]},"observed_at":{"type":["string","null"]},"valid_from":{"type":["string","null"]},"valid_until":{"type":["string","null"]},"source":{"type":["object","null"],"properties":{"id":{"type":"string"},"name":{"type":["string","null"]},"url":{"type":["string","null"],"format":"uri"},"authority":{"type":["string","null"]}}}}}},"profile_evidence":{"type":"object","description":"Evidence associations only. A profile reference is NOT proof of every booking or price scalar.","properties":{"booking":{"type":["object","null"]},"price":{"type":["object","null"]}}},"profile_evidence_is_not_field_proof":{"type":"boolean","enum":[true]},"policy":{"type":"object"}}},"links":{"type":"object","additionalProperties":{"type":"string","format":"uri"}},"record_updated_at":{"type":"string"},"rights":{"type":"object"}}},"published_semantics":{"type":"object","properties":{"note":{"type":"string"},"contract_version":{"type":"string"},"duration":{"type":"object"},"overnight":{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["overnight","daytime","varies","unknown"],"description":"`unknown` means no primary source has been reviewed and the canonical record states nothing. It never means the journey is a daytime service. `varies` is preserved as its own state and is never reduced to yes/no."},"basis":{"type":"string","enum":["canonical_record","reviewed_source","none"],"description":"Where the status came from. The canonical record wins over the reviewed registry."},"source_url":{"type":"string","format":"uri"},"evidence":{"type":"string"},"retrieved_at":{"type":"string"},"limitation":{"type":"string","description":"Explicit limit of what the reviewed source proves."}}},"pricing_status":{"type":"string"},"booking_action_kind":{"type":["string","null"]},"primary_family":{"type":"string"},"provenance_returned":{"type":"boolean"}}}},"additionalProperties":true}}}},"304":{"description":"Not modified. Returned when If-None-Match matches the current ETag."},"400":{"description":"Invalid or unsupported parameter.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine error code."},"message":{"type":"string"},"status":{"type":"integer"},"supported_parameters":{"type":"array","items":{"type":"string"}},"allowed_values":{"type":"array","items":{"type":"string"}}}}}}},"404":{"description":"No published journey.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine error code."},"message":{"type":"string"},"status":{"type":"integer"},"supported_parameters":{"type":"array","items":{"type":"string"}},"allowed_values":{"type":"array","items":{"type":"string"}}}}}}},"502":{"description":"The canonical data source is unavailable.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine error code."},"message":{"type":"string"},"status":{"type":"integer"},"supported_parameters":{"type":"array","items":{"type":"string"}},"allowed_values":{"type":"array","items":{"type":"string"}}}}}}}}}},"/data/journeys/{slug}.json":{"get":{"operationId":"getJourneyContract","tags":["journeys"],"summary":"One published journey in the shared Far by Rail journey contract","description":"The same semantic contract the website itself renders: routes and variants, duration scope, reviewed overnight status, structured pricing components, labelled booking action, seat-side guidance, sources and media rights. Includes a `provenance` object (contract `farbyrail-public-claims/v1`) listing accepted claim-level observations with their sources. Values are exported only for numeric, boolean, date and a few public enum properties; other accepted claims appear with `value_exported: false` and no value. `profile_evidence` is an evidence association, not proof of every booking or price field: match property, value, validity and product scope before citing a field. Absent provenance means not returned, never \"no sources\".","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Journey contract.","content":{"application/json":{"schema":{"type":"object","required":["contract_version","id","slug","name","countries","routes","duration","overnight","pricing","sources","links","rights"],"properties":{"contract_version":{"type":"string"},"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"tagline":{"type":"string"},"summary":{"type":"string"},"operator":{"type":"object","properties":{"name":{"type":"string"}}},"countries":{"type":"array","items":{"type":"object"}},"archetypes":{"type":"array","items":{"type":"object"}},"landscapes":{"type":"array","items":{"type":"string"}},"route_summary":{"type":"string"},"routes":{"type":"array","items":{"type":"object","required":["name","role","stop_count"],"properties":{"slug":{"type":"string"},"name":{"type":"string"},"role":{"type":"string","enum":["primary","alternative"]},"direction_label":{"type":"string"},"duration_minutes":{"type":"integer"},"stop_count":{"type":"integer"},"origin":{"type":"string"},"destination":{"type":"string"}}}},"duration":{"type":"object","required":["unit","precision","scope"],"properties":{"minutes":{"type":"integer"},"unit":{"type":"string","enum":["minutes"]},"precision":{"type":"string","enum":["scheduled","typical","approximate","unknown"],"description":"`typical` is the honest default: the catalogue records a typical journey length, which is not proof of an operator-published timetable figure. `scheduled` is used only where an operator timetable figure is the source."},"precision_note":{"type":["string","null"]},"route_name":{"type":["string","null"],"description":"The named variant the figure describes, when the figure belongs to one."},"scope":{"type":"string","enum":["experience","route_variant","unknown"]},"route_slug":{"type":"string"}}},"overnight":{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["overnight","daytime","varies","unknown"],"description":"`unknown` means no primary source has been reviewed and the canonical record states nothing. It never means the journey is a daytime service. `varies` is preserved as its own state and is never reduced to yes/no."},"basis":{"type":"string","enum":["canonical_record","reviewed_source","none"],"description":"Where the status came from. The canonical record wins over the reviewed registry."},"source_url":{"type":"string","format":"uri"},"evidence":{"type":"string"},"retrieved_at":{"type":"string"},"limitation":{"type":"string","description":"Explicit limit of what the reviewed source proves."}}},"pricing":{"type":"object","required":["status","scope","components","is_current_offer"],"properties":{"status":{"type":"string","enum":["established","dynamic","unknown"],"description":"`established` requires a recorded amount AND a currency. `dynamic` means the operator prices dynamically and no fixed fare is recorded."},"currency":{"type":["string","null"]},"scope":{"type":"object","description":"Every member is null unless the canonical record establishes it. Free text is never promoted into an enum value.","properties":{"payer":{"type":["string","null"],"enum":["person","cabin","package",null]},"travel_class":{"type":["string","null"]},"trip_type":{"type":["string","null"],"enum":["one_way","round_trip",null]},"season":{"type":["string","null"]},"supplements_included":{"type":["boolean","null"]}}},"basis":{"type":["string","null"],"description":"Verbatim canonical basis text: what the recorded amounts actually cover."},"components":{"type":"array","description":"Independent components. They are never summed automatically: a supplement may or may not apply to a given ticket.","items":{"type":"object","required":["kind","amount_is_usable"],"properties":{"kind":{"type":"string","enum":["recorded_from","typical_range","reservation_fee","pass_supplement"],"description":"Neutral, recorded kinds. A recorded lowest price is NOT asserted to be a base fare, and a reservation fee is NOT asserted to be a mandatory supplement, unless the record proves it."},"amount":{"type":["number","null"]},"amount_min":{"type":["number","null"]},"amount_max":{"type":["number","null"]},"currency":{"type":["string","null"]},"amount_is_usable":{"type":"boolean","description":"False when no currency is recorded: a bare number is not a usable price."},"applies_to_every_ticket":{"type":["boolean","null"],"description":"null when the record does not establish whether the component always applies."},"note":{"type":"string"}}}},"dynamic_pricing":{"type":"boolean"},"observed_at":{"type":"string"},"verified_at":{"type":"string"},"is_current_offer":{"type":"boolean","enum":[false],"description":"Always false. These are recorded observations, not bookable offers."}}},"booking_action":{"type":"object","required":["kind","url","label","note","verified_direct_booking"],"properties":{"kind":{"type":"string","enum":["booking","official","operator"],"description":"`booking` = verified reservation entry point. `official` = operator's own journey information page. `operator` = operator homepage only."},"url":{"type":"string","format":"uri"},"label":{"type":"string"},"note":{"type":"string"},"verified_direct_booking":{"type":"boolean"},"reservation_required":{"type":"boolean"},"pass_accepted":{"type":"boolean"},"checked_at":{"type":"string"}}},"seat_side":{"type":"array","items":{"type":"object"}},"onboard_features":{"type":"array","items":{"type":"object"}},"seasons":{"type":"array","items":{"type":"object"}},"scores":{"type":"object"},"sources":{"type":"array","items":{"type":"object"}},"primary_family":{"type":"string","description":"Presentation family from the shared resolver, not simply the first archetype."},"media":{"type":"array","items":{"type":"object","properties":{"role":{"type":"string"},"url":{"type":"string","format":"uri"},"alt":{"type":["string","null"]},"credit":{"type":["string","null"]},"license":{"type":["string","null"]},"license_url":{"type":["string","null"],"format":"uri"},"ai_generated":{"type":"boolean"},"rights_verified_at":{"type":"string"},"rights":{"type":"object","description":"The picture's own licence terms, kept strictly separate from our dataset-level flag.","properties":{"license":{"type":["string","null"]},"license_url":{"type":["string","null"],"format":"uri"},"license_permits_commercial_reuse":{"type":["boolean","null"],"description":"null unless the licence itself establishes it. A false catalogue eligibility flag never asserts that a CC BY photograph forbids commercial reuse."},"catalogue_commercial_eligibility":{"type":"boolean","description":"Our dataset flag only. It is not a statement about the licence."}}}}}},"provenance":{"type":"object","description":"Claim-level provenance from the canonical public RPC. Absent means not returned, never \"no sources\".","properties":{"contract_version":{"type":"string"},"experience_id":{"type":"string"},"slug":{"type":"string"},"claims":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"property_key":{"type":"string"},"review_state":{"type":"string","enum":["accepted"]},"value":{"type":["number","boolean","string","null"]},"value_exported":{"type":"boolean","description":"False means the value is withheld from export, not that it is missing."},"unit":{"type":["string","null"]},"confidence":{"type":["number","string","null"]},"observed_at":{"type":["string","null"]},"valid_from":{"type":["string","null"]},"valid_until":{"type":["string","null"]},"source":{"type":["object","null"],"properties":{"id":{"type":"string"},"name":{"type":["string","null"]},"url":{"type":["string","null"],"format":"uri"},"authority":{"type":["string","null"]}}}}}},"profile_evidence":{"type":"object","description":"Evidence associations only. A profile reference is NOT proof of every booking or price scalar.","properties":{"booking":{"type":["object","null"]},"price":{"type":["object","null"]}}},"profile_evidence_is_not_field_proof":{"type":"boolean","enum":[true]},"policy":{"type":"object"}}},"links":{"type":"object","additionalProperties":{"type":"string","format":"uri"}},"record_updated_at":{"type":"string"},"rights":{"type":"object"}}}}}},"304":{"description":"Not modified. Returned when If-None-Match matches the current ETag."},"400":{"description":"Invalid or unsupported parameter.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine error code."},"message":{"type":"string"},"status":{"type":"integer"},"supported_parameters":{"type":"array","items":{"type":"string"}},"allowed_values":{"type":"array","items":{"type":"string"}}}}}}},"404":{"description":"No published journey.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine error code."},"message":{"type":"string"},"status":{"type":"integer"},"supported_parameters":{"type":"array","items":{"type":"string"}},"allowed_values":{"type":"array","items":{"type":"string"}}}}}}},"502":{"description":"The canonical data source is unavailable.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine error code."},"message":{"type":"string"},"status":{"type":"integer"},"supported_parameters":{"type":"array","items":{"type":"string"}},"allowed_values":{"type":"array","items":{"type":"string"}}}}}}}}}},"/data/compare.json":{"get":{"operationId":"compareJourneys","tags":["discovery"],"summary":"Compare up to four journeys side by side","description":"Returns each journey's own values with their scope and provenance. It never declares a winner and never sorts across journeys.","parameters":[{"name":"slugs","in":"query","required":true,"schema":{"type":"string"},"description":"Comma-separated, up to four journey slugs. Order is preserved."}],"responses":{"200":{"description":"Comparison.","content":{"application/json":{"schema":{"type":"object","required":["contract_version","journeys","semantics"],"properties":{"contract_version":{"type":"string"},"generated_at":{"type":"string"},"partial_failure":{"type":"boolean","description":"True when at least one slug could not be read upstream."},"requested":{"type":"array","items":{"type":"string"}},"semantics":{"type":"object"},"journeys":{"type":"array","description":"Supplied order is preserved. No winner is ever declared.","items":{"type":"object","required":["slug","status"],"properties":{"slug":{"type":"string"},"status":{"type":"string","enum":["published","not_found","not_available_for_machines","upstream_error"],"description":"`upstream_error` is a read failure and is explicitly NOT a statement that the journey is unpublished."},"note":{"type":"string"},"detail":{"type":"string"},"name":{"type":"string"},"operator":{"type":["object","null"],"properties":{"slug":{"type":"string"},"name":{"type":"string"}}},"countries":{"type":"array","items":{"type":"object"}},"duration":{"type":"object"},"overnight":{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["overnight","daytime","varies","unknown"],"description":"`unknown` means no primary source has been reviewed and the canonical record states nothing. It never means the journey is a daytime service. `varies` is preserved as its own state and is never reduced to yes/no."},"basis":{"type":"string","enum":["canonical_record","reviewed_source","none"],"description":"Where the status came from. The canonical record wins over the reviewed registry."},"source_url":{"type":"string","format":"uri"},"evidence":{"type":"string"},"retrieved_at":{"type":"string"},"limitation":{"type":"string","description":"Explicit limit of what the reviewed source proves."}}},"pricing":{"type":"object","required":["status","scope","components","is_current_offer"],"properties":{"status":{"type":"string","enum":["established","dynamic","unknown"],"description":"`established` requires a recorded amount AND a currency. `dynamic` means the operator prices dynamically and no fixed fare is recorded."},"currency":{"type":["string","null"]},"scope":{"type":"object","description":"Every member is null unless the canonical record establishes it. Free text is never promoted into an enum value.","properties":{"payer":{"type":["string","null"],"enum":["person","cabin","package",null]},"travel_class":{"type":["string","null"]},"trip_type":{"type":["string","null"],"enum":["one_way","round_trip",null]},"season":{"type":["string","null"]},"supplements_included":{"type":["boolean","null"]}}},"basis":{"type":["string","null"],"description":"Verbatim canonical basis text: what the recorded amounts actually cover."},"components":{"type":"array","description":"Independent components. They are never summed automatically: a supplement may or may not apply to a given ticket.","items":{"type":"object","required":["kind","amount_is_usable"],"properties":{"kind":{"type":"string","enum":["recorded_from","typical_range","reservation_fee","pass_supplement"],"description":"Neutral, recorded kinds. A recorded lowest price is NOT asserted to be a base fare, and a reservation fee is NOT asserted to be a mandatory supplement, unless the record proves it."},"amount":{"type":["number","null"]},"amount_min":{"type":["number","null"]},"amount_max":{"type":["number","null"]},"currency":{"type":["string","null"]},"amount_is_usable":{"type":"boolean","description":"False when no currency is recorded: a bare number is not a usable price."},"applies_to_every_ticket":{"type":["boolean","null"],"description":"null when the record does not establish whether the component always applies."},"note":{"type":"string"}}}},"dynamic_pricing":{"type":"boolean"},"observed_at":{"type":"string"},"verified_at":{"type":"string"},"is_current_offer":{"type":"boolean","enum":[false],"description":"Always false. These are recorded observations, not bookable offers."}}},"booking_action":{"oneOf":[{"type":"object","required":["kind","url","label","note","verified_direct_booking"],"properties":{"kind":{"type":"string","enum":["booking","official","operator"],"description":"`booking` = verified reservation entry point. `official` = operator's own journey information page. `operator` = operator homepage only."},"url":{"type":"string","format":"uri"},"label":{"type":"string"},"note":{"type":"string"},"verified_direct_booking":{"type":"boolean"},"reservation_required":{"type":"boolean"},"pass_accepted":{"type":"boolean"},"checked_at":{"type":"string"}}},{"type":"null"}]},"scores":{"type":["object","null"]},"comparison_values":{"type":"object"},"sources":{"type":"array","items":{"type":"object"}},"links":{"type":"object"}}}}}}}}},"304":{"description":"Not modified. Returned when If-None-Match matches the current ETag."},"400":{"description":"Invalid or unsupported parameter.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine error code."},"message":{"type":"string"},"status":{"type":"integer"},"supported_parameters":{"type":"array","items":{"type":"string"}},"allowed_values":{"type":"array","items":{"type":"string"}}}}}}},"502":{"description":"Every compared slug failed upstream. A partial failure is reported per journey with status `upstream_error` and `partial_failure: true`.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine error code."},"message":{"type":"string"},"status":{"type":"integer"},"supported_parameters":{"type":"array","items":{"type":"string"}},"allowed_values":{"type":"array","items":{"type":"string"}}}}}}}}}},"/data/facets.json":{"get":{"operationId":"getFacets","tags":["discovery"],"summary":"Available countries, journey types and intents with counts","responses":{"200":{"description":"Facets.","content":{"application/json":{"schema":{"type":"object","required":["contract_version","countries","archetypes","intents"],"properties":{"contract_version":{"type":"string"},"generated_at":{"type":"string"},"countries":{"type":"array","items":{"type":"object","required":["slug","name"],"properties":{"slug":{"type":"string"},"name":{"type":"string"},"count":{"type":"integer"}}}},"archetypes":{"type":"array","items":{"type":"object","required":["slug","name"],"properties":{"slug":{"type":"string"},"name":{"type":"string"},"count":{"type":"integer"}}}},"intents":{"type":"array","items":{"type":"object","required":["slug","name"],"properties":{"slug":{"type":"string"},"name":{"type":"string"},"count":{"type":"integer"}}}}}}}}},"304":{"description":"Not modified. Returned when If-None-Match matches the current ETag."},"400":{"description":"Invalid or unsupported parameter.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine error code."},"message":{"type":"string"},"status":{"type":"integer"},"supported_parameters":{"type":"array","items":{"type":"string"}},"allowed_values":{"type":"array","items":{"type":"string"}}}}}}},"502":{"description":"The canonical data source is unavailable.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine error code."},"message":{"type":"string"},"status":{"type":"integer"},"supported_parameters":{"type":"array","items":{"type":"string"}},"allowed_values":{"type":"array","items":{"type":"string"}}}}}}}}}},"/data/map.json":{"get":{"operationId":"getMap","tags":["discovery"],"summary":"Representative route geometry","description":"Polylines through published stops in order. Not exact track alignment; disconnected parts stay separate.","parameters":[{"name":"country","in":"query","schema":{"type":"string"}},{"name":"archetype","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Route geometry.","content":{"application/json":{"schema":{"type":"object","required":["contract_version","count","features","geometry_semantics"],"properties":{"contract_version":{"type":"string"},"generated_at":{"type":"string"},"applied_filters":{"type":"object","properties":{"country":{"type":["string","null"]},"archetype":{"type":["string","null"]}}},"geometry_semantics":{"type":"string"},"count":{"type":"integer"},"features":{"type":"array","items":{"type":"object","required":["slug","name","geometry"],"properties":{"slug":{"type":"string"},"name":{"type":"string"},"journey_name":{"type":"string"},"part_count":{"type":"integer"},"geometry":{"type":"object","required":["type","coordinates"],"properties":{"type":{"type":"string","enum":["MultiLineString"]},"coordinates":{"type":"array","items":{"type":"array","items":{"type":"array","items":{"type":"number"},"minItems":2,"maxItems":2}}}}},"links":{"type":"object","properties":{"human":{"type":"string","format":"uri"},"machine":{"type":"string","format":"uri"}}}}}}}}}}},"304":{"description":"Not modified. Returned when If-None-Match matches the current ETag."},"400":{"description":"Invalid or unsupported parameter.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine error code."},"message":{"type":"string"},"status":{"type":"integer"},"supported_parameters":{"type":"array","items":{"type":"string"}},"allowed_values":{"type":"array","items":{"type":"string"}}}}}}},"502":{"description":"The canonical data source is unavailable.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine error code."},"message":{"type":"string"},"status":{"type":"integer"},"supported_parameters":{"type":"array","items":{"type":"string"}},"allowed_values":{"type":"array","items":{"type":"string"}}}}}}}}}},"/data/collections.json":{"get":{"operationId":"listCollections","tags":["collections"],"summary":"Index of published collections","responses":{"200":{"description":"Collections.","content":{"application/json":{"schema":{"type":"object","required":["contract_version","collections"],"properties":{"contract_version":{"type":"string"},"generated_at":{"type":"string"},"count":{"type":"integer"},"collections":{"type":"array","items":{"type":"object","required":["slug","links"],"properties":{"slug":{"type":"string"},"title":{"type":"string"},"record_updated_at":{"type":"string"},"subtitle":{"type":"string"},"collection_type":{"type":"string"},"count":{"type":"integer"},"indexable":{"type":"boolean"},"links":{"type":"object","properties":{"human":{"type":"string","format":"uri"},"machine":{"type":"string","format":"uri"}}}}}}}}}}},"304":{"description":"Not modified. Returned when If-None-Match matches the current ETag."},"400":{"description":"Invalid or unsupported parameter.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine error code."},"message":{"type":"string"},"status":{"type":"integer"},"supported_parameters":{"type":"array","items":{"type":"string"}},"allowed_values":{"type":"array","items":{"type":"string"}}}}}}},"502":{"description":"The canonical data source is unavailable.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine error code."},"message":{"type":"string"},"status":{"type":"integer"},"supported_parameters":{"type":"array","items":{"type":"string"}},"allowed_values":{"type":"array","items":{"type":"string"}}}}}}}}}},"/data/collections/{slug}.json":{"get":{"operationId":"getCollection","tags":["collections"],"summary":"One published collection and its member journeys","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Collection.","content":{"application/json":{"schema":{"type":"object","required":["contract_version","slug","title","journeys"],"properties":{"contract_version":{"type":"string"},"generated_at":{"type":"string"},"slug":{"type":"string"},"title":{"type":"string"},"subtitle":{"type":"string"},"introduction":{"type":"string"},"collection_type":{"type":"string"},"indexable":{"type":"boolean"},"count":{"type":"integer"},"membership_note":{"type":"string"},"journeys":{"type":"array","items":{"type":"object","required":["slug","name","overnight"],"properties":{"slug":{"type":"string"},"name":{"type":"string"},"summary":{"type":"string"},"duration_minutes":{"type":"integer"},"overnight":{"type":"string","enum":["overnight","daytime","varies","unknown"]},"links":{"type":"object","properties":{"human":{"type":"string","format":"uri"},"machine":{"type":"string","format":"uri"}}}}}},"links":{"type":"object"}}}}}},"304":{"description":"Not modified. Returned when If-None-Match matches the current ETag."},"400":{"description":"Invalid or unsupported parameter.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine error code."},"message":{"type":"string"},"status":{"type":"integer"},"supported_parameters":{"type":"array","items":{"type":"string"}},"allowed_values":{"type":"array","items":{"type":"string"}}}}}}},"404":{"description":"No published collection.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine error code."},"message":{"type":"string"},"status":{"type":"integer"},"supported_parameters":{"type":"array","items":{"type":"string"}},"allowed_values":{"type":"array","items":{"type":"string"}}}}}}},"502":{"description":"The canonical data source is unavailable.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine error code."},"message":{"type":"string"},"status":{"type":"integer"},"supported_parameters":{"type":"array","items":{"type":"string"}},"allowed_values":{"type":"array","items":{"type":"string"}}}}}}}}}},"/data/manifest.json":{"get":{"operationId":"getManifest","tags":["platform"],"summary":"Machine capability manifest","responses":{"200":{"description":"Manifest.","content":{"application/json":{"schema":{"type":"object","required":["contract_version","capabilities","http_invocations"],"properties":{"contract_version":{"type":"string"},"generated_at":{"type":"string"},"product":{"type":["object","string"]},"canonical_entity":{"type":["object","string"]},"openapi":{"type":"string","format":"uri"},"documentation":{"type":"string","format":"uri"},"machine_publishable_experience_count":{"type":"integer"},"principles":{"type":["array","object"]},"capabilities":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"http":{"type":["object","null"],"properties":{"method":{"type":"string"},"url":{"type":"string","format":"uri"},"operation_id":{"type":"string"}}}},"additionalProperties":true}},"http_invocations":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string","format":"uri"},"method":{"type":"string"},"description":{"type":"string"}}}},"adapter_targets":{"type":"object","description":"Availability of each transport, restated with an explicit `available` flag so it matches /data/capabilities.json: HTTP is served now; MCP, A2A and WebMCP are NOT running. An upstream status of `contract_ready` describes contract readiness, not a callable endpoint.","additionalProperties":{"type":"object","properties":{"available":{"type":"boolean"},"url":{"type":"string","format":"uri"},"upstream_status":{"type":["string","null"]},"note":{"type":"string"}}}},"policy":{"type":"object"}}}}}},"304":{"description":"Not modified. Returned when If-None-Match matches the current ETag."},"400":{"description":"Invalid or unsupported parameter.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine error code."},"message":{"type":"string"},"status":{"type":"integer"},"supported_parameters":{"type":"array","items":{"type":"string"}},"allowed_values":{"type":"array","items":{"type":"string"}}}}}}},"502":{"description":"The canonical data source is unavailable.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine error code."},"message":{"type":"string"},"status":{"type":"integer"},"supported_parameters":{"type":"array","items":{"type":"string"}},"allowed_values":{"type":"array","items":{"type":"string"}}}}}}}}}},"/data/capabilities.json":{"get":{"operationId":"getCapabilities","tags":["platform"],"summary":"Canonical Capability Layer with actual invocation URLs","responses":{"200":{"description":"Capabilities.","content":{"application/json":{"schema":{"type":"object","required":["contract_version","transports","capabilities"],"properties":{"contract_version":{"type":"string"},"generated_at":{"type":"string"},"transports":{"type":"object","additionalProperties":{"type":"object","properties":{"available":{"type":"boolean"},"url":{"type":["string","null"],"format":"uri"},"note":{"type":"string"}}}},"capabilities":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"invocation":{"type":"object"},"available":{"type":"boolean"}}}},"policy":{"type":"object"}}}}}},"304":{"description":"Not modified. Returned when If-None-Match matches the current ETag."},"400":{"description":"Invalid or unsupported parameter.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine error code."},"message":{"type":"string"},"status":{"type":"integer"},"supported_parameters":{"type":"array","items":{"type":"string"}},"allowed_values":{"type":"array","items":{"type":"string"}}}}}}},"502":{"description":"The canonical data source is unavailable.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine error code."},"message":{"type":"string"},"status":{"type":"integer"},"supported_parameters":{"type":"array","items":{"type":"string"}},"allowed_values":{"type":"array","items":{"type":"string"}}}}}}}}}},"/api/v1/experiences/{slug}":{"get":{"operationId":"getJourneyLegacy","tags":["journeys"],"summary":"Legacy canonical publication record (kept for compatibility)","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Canonical publication record as rendered by the website. Kept for compatibility; new integrations should use /data/journeys/{slug}.json.","content":{"application/json":{"schema":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string"},"name":{"type":"string"}},"additionalProperties":true}}}},"404":{"description":"Not published.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine error code."},"message":{"type":"string"},"status":{"type":"integer"},"supported_parameters":{"type":"array","items":{"type":"string"}},"allowed_values":{"type":"array","items":{"type":"string"}}}}}}}}}}},"components":{"schemas":{"Error":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine error code."},"message":{"type":"string"},"status":{"type":"integer"},"supported_parameters":{"type":"array","items":{"type":"string"}},"allowed_values":{"type":"array","items":{"type":"string"}}}},"JourneySummary":{"type":"object","required":["contract_version","id","slug","name","countries","archetypes","overnight","links"],"properties":{"contract_version":{"type":"string"},"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"summary":{"type":"string"},"operator":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"}}},"countries":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"}}}},"archetypes":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"}}}},"duration_minutes":{"type":["integer","null"]},"price_band":{"type":["string","null"]},"overnight":{"type":"string","enum":["overnight","daytime","varies","unknown"]},"links":{"type":"object","properties":{"human":{"type":"string","format":"uri"},"machine":{"type":"string","format":"uri"}}}}},"Journey":{"type":"object","required":["contract_version","id","slug","name","countries","routes","duration","overnight","pricing","sources","links","rights"],"properties":{"contract_version":{"type":"string"},"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"tagline":{"type":"string"},"summary":{"type":"string"},"operator":{"type":"object","properties":{"name":{"type":"string"}}},"countries":{"type":"array","items":{"type":"object"}},"archetypes":{"type":"array","items":{"type":"object"}},"landscapes":{"type":"array","items":{"type":"string"}},"route_summary":{"type":"string"},"routes":{"type":"array","items":{"type":"object","required":["name","role","stop_count"],"properties":{"slug":{"type":"string"},"name":{"type":"string"},"role":{"type":"string","enum":["primary","alternative"]},"direction_label":{"type":"string"},"duration_minutes":{"type":"integer"},"stop_count":{"type":"integer"},"origin":{"type":"string"},"destination":{"type":"string"}}}},"duration":{"type":"object","required":["unit","precision","scope"],"properties":{"minutes":{"type":"integer"},"unit":{"type":"string","enum":["minutes"]},"precision":{"type":"string","enum":["scheduled","typical","approximate","unknown"],"description":"`typical` is the honest default: the catalogue records a typical journey length, which is not proof of an operator-published timetable figure. `scheduled` is used only where an operator timetable figure is the source."},"precision_note":{"type":["string","null"]},"route_name":{"type":["string","null"],"description":"The named variant the figure describes, when the figure belongs to one."},"scope":{"type":"string","enum":["experience","route_variant","unknown"]},"route_slug":{"type":"string"}}},"overnight":{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["overnight","daytime","varies","unknown"],"description":"`unknown` means no primary source has been reviewed and the canonical record states nothing. It never means the journey is a daytime service. `varies` is preserved as its own state and is never reduced to yes/no."},"basis":{"type":"string","enum":["canonical_record","reviewed_source","none"],"description":"Where the status came from. The canonical record wins over the reviewed registry."},"source_url":{"type":"string","format":"uri"},"evidence":{"type":"string"},"retrieved_at":{"type":"string"},"limitation":{"type":"string","description":"Explicit limit of what the reviewed source proves."}}},"pricing":{"type":"object","required":["status","scope","components","is_current_offer"],"properties":{"status":{"type":"string","enum":["established","dynamic","unknown"],"description":"`established` requires a recorded amount AND a currency. `dynamic` means the operator prices dynamically and no fixed fare is recorded."},"currency":{"type":["string","null"]},"scope":{"type":"object","description":"Every member is null unless the canonical record establishes it. Free text is never promoted into an enum value.","properties":{"payer":{"type":["string","null"],"enum":["person","cabin","package",null]},"travel_class":{"type":["string","null"]},"trip_type":{"type":["string","null"],"enum":["one_way","round_trip",null]},"season":{"type":["string","null"]},"supplements_included":{"type":["boolean","null"]}}},"basis":{"type":["string","null"],"description":"Verbatim canonical basis text: what the recorded amounts actually cover."},"components":{"type":"array","description":"Independent components. They are never summed automatically: a supplement may or may not apply to a given ticket.","items":{"type":"object","required":["kind","amount_is_usable"],"properties":{"kind":{"type":"string","enum":["recorded_from","typical_range","reservation_fee","pass_supplement"],"description":"Neutral, recorded kinds. A recorded lowest price is NOT asserted to be a base fare, and a reservation fee is NOT asserted to be a mandatory supplement, unless the record proves it."},"amount":{"type":["number","null"]},"amount_min":{"type":["number","null"]},"amount_max":{"type":["number","null"]},"currency":{"type":["string","null"]},"amount_is_usable":{"type":"boolean","description":"False when no currency is recorded: a bare number is not a usable price."},"applies_to_every_ticket":{"type":["boolean","null"],"description":"null when the record does not establish whether the component always applies."},"note":{"type":"string"}}}},"dynamic_pricing":{"type":"boolean"},"observed_at":{"type":"string"},"verified_at":{"type":"string"},"is_current_offer":{"type":"boolean","enum":[false],"description":"Always false. These are recorded observations, not bookable offers."}}},"booking_action":{"type":"object","required":["kind","url","label","note","verified_direct_booking"],"properties":{"kind":{"type":"string","enum":["booking","official","operator"],"description":"`booking` = verified reservation entry point. `official` = operator's own journey information page. `operator` = operator homepage only."},"url":{"type":"string","format":"uri"},"label":{"type":"string"},"note":{"type":"string"},"verified_direct_booking":{"type":"boolean"},"reservation_required":{"type":"boolean"},"pass_accepted":{"type":"boolean"},"checked_at":{"type":"string"}}},"seat_side":{"type":"array","items":{"type":"object"}},"onboard_features":{"type":"array","items":{"type":"object"}},"seasons":{"type":"array","items":{"type":"object"}},"scores":{"type":"object"},"sources":{"type":"array","items":{"type":"object"}},"primary_family":{"type":"string","description":"Presentation family from the shared resolver, not simply the first archetype."},"media":{"type":"array","items":{"type":"object","properties":{"role":{"type":"string"},"url":{"type":"string","format":"uri"},"alt":{"type":["string","null"]},"credit":{"type":["string","null"]},"license":{"type":["string","null"]},"license_url":{"type":["string","null"],"format":"uri"},"ai_generated":{"type":"boolean"},"rights_verified_at":{"type":"string"},"rights":{"type":"object","description":"The picture's own licence terms, kept strictly separate from our dataset-level flag.","properties":{"license":{"type":["string","null"]},"license_url":{"type":["string","null"],"format":"uri"},"license_permits_commercial_reuse":{"type":["boolean","null"],"description":"null unless the licence itself establishes it. A false catalogue eligibility flag never asserts that a CC BY photograph forbids commercial reuse."},"catalogue_commercial_eligibility":{"type":"boolean","description":"Our dataset flag only. It is not a statement about the licence."}}}}}},"provenance":{"type":"object","description":"Claim-level provenance from the canonical public RPC. Absent means not returned, never \"no sources\".","properties":{"contract_version":{"type":"string"},"experience_id":{"type":"string"},"slug":{"type":"string"},"claims":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"property_key":{"type":"string"},"review_state":{"type":"string","enum":["accepted"]},"value":{"type":["number","boolean","string","null"]},"value_exported":{"type":"boolean","description":"False means the value is withheld from export, not that it is missing."},"unit":{"type":["string","null"]},"confidence":{"type":["number","string","null"]},"observed_at":{"type":["string","null"]},"valid_from":{"type":["string","null"]},"valid_until":{"type":["string","null"]},"source":{"type":["object","null"],"properties":{"id":{"type":"string"},"name":{"type":["string","null"]},"url":{"type":["string","null"],"format":"uri"},"authority":{"type":["string","null"]}}}}}},"profile_evidence":{"type":"object","description":"Evidence associations only. A profile reference is NOT proof of every booking or price scalar.","properties":{"booking":{"type":["object","null"]},"price":{"type":["object","null"]}}},"profile_evidence_is_not_field_proof":{"type":"boolean","enum":[true]},"policy":{"type":"object"}}},"links":{"type":"object","additionalProperties":{"type":"string","format":"uri"}},"record_updated_at":{"type":"string"},"rights":{"type":"object"}}},"Pricing":{"type":"object","required":["status","scope","components","is_current_offer"],"properties":{"status":{"type":"string","enum":["established","dynamic","unknown"],"description":"`established` requires a recorded amount AND a currency. `dynamic` means the operator prices dynamically and no fixed fare is recorded."},"currency":{"type":["string","null"]},"scope":{"type":"object","description":"Every member is null unless the canonical record establishes it. Free text is never promoted into an enum value.","properties":{"payer":{"type":["string","null"],"enum":["person","cabin","package",null]},"travel_class":{"type":["string","null"]},"trip_type":{"type":["string","null"],"enum":["one_way","round_trip",null]},"season":{"type":["string","null"]},"supplements_included":{"type":["boolean","null"]}}},"basis":{"type":["string","null"],"description":"Verbatim canonical basis text: what the recorded amounts actually cover."},"components":{"type":"array","description":"Independent components. They are never summed automatically: a supplement may or may not apply to a given ticket.","items":{"type":"object","required":["kind","amount_is_usable"],"properties":{"kind":{"type":"string","enum":["recorded_from","typical_range","reservation_fee","pass_supplement"],"description":"Neutral, recorded kinds. A recorded lowest price is NOT asserted to be a base fare, and a reservation fee is NOT asserted to be a mandatory supplement, unless the record proves it."},"amount":{"type":["number","null"]},"amount_min":{"type":["number","null"]},"amount_max":{"type":["number","null"]},"currency":{"type":["string","null"]},"amount_is_usable":{"type":"boolean","description":"False when no currency is recorded: a bare number is not a usable price."},"applies_to_every_ticket":{"type":["boolean","null"],"description":"null when the record does not establish whether the component always applies."},"note":{"type":"string"}}}},"dynamic_pricing":{"type":"boolean"},"observed_at":{"type":"string"},"verified_at":{"type":"string"},"is_current_offer":{"type":"boolean","enum":[false],"description":"Always false. These are recorded observations, not bookable offers."}}},"BookingAction":{"type":"object","required":["kind","url","label","note","verified_direct_booking"],"properties":{"kind":{"type":"string","enum":["booking","official","operator"],"description":"`booking` = verified reservation entry point. `official` = operator's own journey information page. `operator` = operator homepage only."},"url":{"type":"string","format":"uri"},"label":{"type":"string"},"note":{"type":"string"},"verified_direct_booking":{"type":"boolean"},"reservation_required":{"type":"boolean"},"pass_accepted":{"type":"boolean"},"checked_at":{"type":"string"}}},"Overnight":{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["overnight","daytime","varies","unknown"],"description":"`unknown` means no primary source has been reviewed and the canonical record states nothing. It never means the journey is a daytime service. `varies` is preserved as its own state and is never reduced to yes/no."},"basis":{"type":"string","enum":["canonical_record","reviewed_source","none"],"description":"Where the status came from. The canonical record wins over the reviewed registry."},"source_url":{"type":"string","format":"uri"},"evidence":{"type":"string"},"retrieved_at":{"type":"string"},"limitation":{"type":"string","description":"Explicit limit of what the reviewed source proves."}}},"PriceComponent":{"type":"object","required":["kind","amount_is_usable"],"properties":{"kind":{"type":"string","enum":["recorded_from","typical_range","reservation_fee","pass_supplement"],"description":"Neutral, recorded kinds. A recorded lowest price is NOT asserted to be a base fare, and a reservation fee is NOT asserted to be a mandatory supplement, unless the record proves it."},"amount":{"type":["number","null"]},"amount_min":{"type":["number","null"]},"amount_max":{"type":["number","null"]},"currency":{"type":["string","null"]},"amount_is_usable":{"type":"boolean","description":"False when no currency is recorded: a bare number is not a usable price."},"applies_to_every_ticket":{"type":["boolean","null"],"description":"null when the record does not establish whether the component always applies."},"note":{"type":"string"}}},"PriceScope":{"type":"object","description":"Every member is null unless the canonical record establishes it. Free text is never promoted into an enum value.","properties":{"payer":{"type":["string","null"],"enum":["person","cabin","package",null]},"travel_class":{"type":["string","null"]},"trip_type":{"type":["string","null"],"enum":["one_way","round_trip",null]},"season":{"type":["string","null"]},"supplements_included":{"type":["boolean","null"]}}},"FacetValue":{"type":"object","required":["slug","name"],"properties":{"slug":{"type":"string"},"name":{"type":"string"},"count":{"type":"integer"}}},"Media":{"type":"object","properties":{"role":{"type":"string"},"url":{"type":"string","format":"uri"},"alt":{"type":["string","null"]},"credit":{"type":["string","null"]},"license":{"type":["string","null"]},"license_url":{"type":["string","null"],"format":"uri"},"ai_generated":{"type":"boolean"},"rights_verified_at":{"type":"string"},"rights":{"type":"object","description":"The picture's own licence terms, kept strictly separate from our dataset-level flag.","properties":{"license":{"type":["string","null"]},"license_url":{"type":["string","null"],"format":"uri"},"license_permits_commercial_reuse":{"type":["boolean","null"],"description":"null unless the licence itself establishes it. A false catalogue eligibility flag never asserts that a CC BY photograph forbids commercial reuse."},"catalogue_commercial_eligibility":{"type":"boolean","description":"Our dataset flag only. It is not a statement about the licence."}}}}},"Provenance":{"type":"object","description":"Claim-level provenance from the canonical public RPC. Absent means not returned, never \"no sources\".","properties":{"contract_version":{"type":"string"},"experience_id":{"type":"string"},"slug":{"type":"string"},"claims":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"property_key":{"type":"string"},"review_state":{"type":"string","enum":["accepted"]},"value":{"type":["number","boolean","string","null"]},"value_exported":{"type":"boolean","description":"False means the value is withheld from export, not that it is missing."},"unit":{"type":["string","null"]},"confidence":{"type":["number","string","null"]},"observed_at":{"type":["string","null"]},"valid_from":{"type":["string","null"]},"valid_until":{"type":["string","null"]},"source":{"type":["object","null"],"properties":{"id":{"type":"string"},"name":{"type":["string","null"]},"url":{"type":["string","null"],"format":"uri"},"authority":{"type":["string","null"]}}}}}},"profile_evidence":{"type":"object","description":"Evidence associations only. A profile reference is NOT proof of every booking or price scalar.","properties":{"booking":{"type":["object","null"]},"price":{"type":["object","null"]}}},"profile_evidence_is_not_field_proof":{"type":"boolean","enum":[true]},"policy":{"type":"object"}}},"Links":{"type":"object","properties":{"human":{"type":"string","format":"uri"},"machine":{"type":"string","format":"uri"}}}},"headers":{"ETag":{"description":"Weak validator (RFC 9110). Identical payloads always yield an identical ETag; any changed field changes it.","schema":{"type":"string"}},"Cache-Control":{"schema":{"type":"string"}},"Link":{"schema":{"type":"string"}}}},"x-caching":{"etag":"Every endpoint returns a WEAK ETag (`W/\"fbr-…\"`) over the representation excluding the per-request `generated_at` field. Send If-None-Match to receive 304; weak comparison is used, so a compressed response re-tagged by the edge still matches. `If-None-Match: *` matches any existing representation.","last_modified":"Not sent. This representation combines the canonical record with separately updated registries, claims and media, and no aggregate revision time exists; a record-only timestamp would be a false validator.","methods":"GET, HEAD and OPTIONS. CORS is open for these methods and never credentialed."},"x-transports":{"http_openapi":{"available":true,"url":"https://farbyrail.com/openapi.json"},"mcp":{"available":false,"note":"No MCP server is running. Listed as a future adapter only."},"a2a":{"available":false,"note":"Not implemented."},"webmcp":{"available":false,"note":"Not implemented."}}}