Distribusion Docs Explore the Distribusion Documentation Portal for API guides, integration tutorials, and developer tools to connect with global ground transportation solutions seamlessly. ## Sections • [Getting Started](https://docs.distribusion.com/dt/api/getting-started.md): This section introduces the Distribusion Retailer API, a platform that enables online channels to access and distribute various ground transportation services globally. It covers essential information for getting started, including API authentication methods, available environments, and the use of API keys. The content also explains the differences between the demo and production environments, highlighting the purpose of each and noting content divergences. Additionally, it outlines the QA process for launching an integration with Distribusion, emphasizing the steps involved in moving from testing to production. This comprehensive overview provides developers and partners with the fundamental knowledge needed to begin working with the Distribusion API effectively. • [Intro](https://docs.distribusion.com/dt/api/getting-started/intro.md): Welcome to the Distribusion Retailer API. The Distribusion API allows online channels of all kinds to access and distribute ground transportation in the simplest way. Distribusion’s portfolio of inventory is fully standardised and encompasses intercity bus, rail, ferry, and airport transfer services from all around the world. To request a demo API key or receive an overview of the accessible inventory, please reach out to us at partner@distribusion.com and one of our Partnership Managers will be happy to get you started. This section provides an overview of everything you need to get started with the Distribusion Retailer API. • [API Authentication](https://docs.distribusion.com/dt/api/getting-started/api-authentication.md): API Keys Distribusion uses API keys to allow access to the platform’s inventory and enable the performance of successful API requests. The API Keys follow alpha-numeric format, such as ZW8FXhnBl53yTkrMvoqLp4Xq7mf9nEBGsxpTWrid , and must be passed as an Api-Key header within each request, as shown in the example below: Plain text curl 'https://api.demo.distribusion.com/retailers/v4/stations' \ --header 'Api-Key: ZW8FXhnBl53yTkrMvoqLp4Xq7mf9nEBGsxpTWrid' curl 'https://api.demo.distribusion.com/retailers/v4/stations' \ --header 'Api-Key: ZW8FXhnBl53yTkrMvoqLp4Xq7mf9nEBGsxpTWrid' Environments Distribusion has two external environments, which each require their own API key: Production environment : https://api.distribusion.com Demo environment : https://api.demo.distribusion.com Retailer Partner Number For some of the endpoints you call, besides using the API credentials, you should also include your retailer_partner_number . We often refer to this as RPN. This 6-digit number is always shared alongside your API credentials & must be used in tandem with the same credentials used for the endpoint. • [Demo Environment](https://docs.distribusion.com/dt/api/getting-started/demo-environment.md): Demo Credentials For API testing and carrier onboarding purposes, Distribusion provides a dedicated demo environment, accessible through unique credentials. The demo environment provides full access to production schedules and meta data for marketing carriers and stations. Content Differences The overall functionality in the demo environment matches the production environment, however the content is not always the exact same. Distribusion’s demo environment is not connected to external carrier demo environments to ensure a higher level of stability. As such, all other endpoints (though they can still be used and resemble behaviour on production) return dummy values for the parameters that would otherwise be returned by the carrier’s API on production. The main resulting divergences include: /connections/vacancy - A dummy price will be returned for the requested trip, which will not match the result from the corresponding /connections/find request (which comes from the Distribusion production schedules database). When you use EUR as your currency for the request the price returned will always show the value of 2500. This price is in cents, so when decimals are added the final price equals to €25.00. For other currencies it will be the equivalent amount e.g. 2768 USD, 2106 GBP etc. This rule applies for all carriers and all fares in the demo environment. /bookings/{booking_id}/tickets - Distribusion’s ticket template will always be returned on demo, while on production some carriers may provide their own ticket. These mismatches will of course not be encountered in the production environment. Should you have additional testing requirements, please reach out to your account manager who will be able to support in facilitating. Test Carriers For general testing purposes, Distribusion will give you access to a few carriers that match your requirements, ensuring that we cover all functionality needed for your use case and for a proper integration. Environment Access We can control the access of specific carriers by environment, meaning we can limit the access of a carrier content to demo environment only or keep it available to demo and production environment at the same time. • [Rate Limiting & Usage Policy](https://docs.distribusion.com/dt/api/getting-started/api-rate-limiting-and-usage-policy.md): To ensure the stability, reliability, and fair usage of our API for all partners, we've implemented a rate-limiting policy. This policy helps protect our platform from unusually high request volumes and ensures consistent performance for everyone. How Rate Limiting Works Our rate-limiting mechanism is based on the number of requests made per minute (RPM). Limits can vary by API endpoint and environment (Production vs. Demo). The system monitors requests on a sliding 60-second window. If your account exceeds the RPM threshold for a specific endpoint that we determine constitutes undue regular use, subsequent requests to that endpoint will be throttled. Error Message When your account exceeds the rate limit and requests are being throttled, the API will return the following error message: "You have exceeded the amount of requests per minute permitted for this account." Exceptions for High-Volume Usage We understand that some partners have legitimate use cases that require higher request volumes. Exceptions to the standard rate limits can be granted on a case-by-case basis. If you anticipate that your integration will require a higher RPM limit, or if you find that your requests are being frequently throttled, please get in touch with your Partnership Manager to discuss your requirements. • [Postman](https://docs.distribusion.com/dt/api/getting-started/postman.md): Sample Collection With the API Explorer you have the chance to easily test all of our endpoints without leaving our documentation. In case you prefer to use Postman we've created a sample collection. It includes: All endpoints available in our API. Sample of requests with all possible parameters and body fields. Comments for each of the parameters and body fields that are allowed for each endpoint. Use of variables for the API key, RPN and domain, so you only have to set it in one place and all endpoints will share the same details. File Click to download our Postman collection After downloading, please follow these instructions to import the Postman collection into your account. Carrier Specific Postman Collections: For carriers with specific flows or requirements, available upon request from your Retail Partnerships Manager. Title Description Title Carrier Custom collection General collection Deutsche Bahn ✅ SNCF ✅ Amtrak ✅ Renfe ✅ Trenitalia ✅ Eurostar ✅ Czech Railiways ✅ National Rail ✅ • [OpenAPI](https://docs.distribusion.com/dt/api/getting-started/open-api.md): To support your development workflow, we provide the full definition of the Distribusion API in the OpenAPI Specification (OAS) 3.1.0 format. These files allow you to explore our endpoints, validate data structures, and automatically generate client SDKs. Our OpenAPI files include: Comprehensive Resource Coverage : Detailed definitions for the entire booking lifecycle, including Connections, Reservations, Bookings, and Cancellations. JSON:API Standard Compliance : Full schemas for responses following the application/vnd.api+json format. Data Validation Rules : Clear constraints on data types, formats, and required fields to help you build robust integrations. Security Configuration : Pre-defined security schemes for ApiKeyAuth, requiring the Api-Key header for authenticated requests. Specialized Static Data Endpoints: Definitions for high-performance bulk retrieval of areas, cities, stations, and connected station mappings to power your search UI. Files You can download the specification for the Distribusion API in your preferred format below: Click to download our OpenAPI spec (JSON) Click to download our OpenAPI spec (YAML) After downloading, you can import these files into local environments like Swagger UI or Postman to begin testing against our demo server: https://api.demo.distribusion.com/retailers/v4/ . • [Carrier Access](https://docs.distribusion.com/dt/api/getting-started/carrier-access.md): While Distribusion provides access to most carriers through a single agreement, some carriers require an extra step before their content can be sold. These requirements fall into two categories: a straightforward approval process or a more formal direct contract. Carrier Approval : A review of your sales channel required by some carriers (e.g., Iryo, Itabus). This process does not involve a separate commercial contract. Direct Contracting : A formal commercial agreement signed directly with a carrier. This may be required for major rail operators (e.g., SNCF, DB). Your Partnership Manager will guide you through any necessary steps for the specific carriers you wish to sell. • [Carrier Approval](https://docs.distribusion.com/dt/api/getting-started/carrier-access/approval.md): While most carriers are automatically available via Distribusion under the general agreement, some will only allow their content to be accessed by retailers who have been approved by the carrier directly. This approval process is different from direct contracting as it does not involve signing a separate commercial agreement. Instead, the carrier needs some key information about your platform, sales channel(s) and business type in order to understand how your platform plans to market and sell their tickets. How the Approval Process Works The approval process can involve several steps, and our goal is to make it as smooth as possible. Here’s what you can expect: Initiation of Approval Request : The process is initiated by your Partnership Manager at Distribusion, who will submit the approval request to the carrier on your behalf. Carrier-Specific Requirements : Each carrier has its own set of requirements for approval. To facilitate this, our team may request additional information or specific documents from you regarding your business model, sales channels, or marketing plans. This is particularly common for major bus and rail carriers such as Itabus, National Express, iryo and WESTbahn, and providing these details promptly will help expedite the process. Communication and Timelines : Your Partnership Manager will keep you updated on the progress of your approval request. Please note that timelines can vary significantly depending on the carrier's internal processes and specific requirements. We are continuously improving our systems to provide more clarity on expected timelines and to track requests more efficiently. Once a carrier grants its approval, our team will then whitelist that carrier's content for your API credentials. At this point, you will be able to access and sell their inventory through the Distribusion API. • [Carrier Contracting](https://docs.distribusion.com/dt/api/getting-started/carrier-access/contracting.md): One of the primary benefits of integrating with Distribusion is gaining access to a vast network of ground transport carriers through a single API and a single commercial agreement. This model significantly simplifies the process for retailers, removing the need to negotiate and maintain individual contracts with numerous different operators, which saves considerable time, legal resources, and operational overhead. General vs. Direct Agreements For the majority of carriers, access to their inventory is granted directly through your general contract with Distribusion. However, a few specific carriers, particularly major national rail operators, may require retailers to sign an additional, direct agreement to access their content. A direct contract might be required for SNCF, DB, ÖBB or Trenitalia, depending on your specific case. We strongly recommend you contact your Partnership Manager for detailed information regarding your specific situation and the carriers you wish to sell. • [Accreditation](https://docs.distribusion.com/dt/api/getting-started/accreditation.md): As a final step before going live, Distribusion conducts a mandatory accreditation process on behalf of our carrier partners. The purpose of this full review is to ensure your integration presents carrier content accurately and implements the API flow correctly, using the necessary endpoints and request structures. This guarantees a high-quality, reliable experience for customers and meets the standards set by our carriers. Once our team has fully resolved any outstanding blockers that were identified during the testing phase, and after the necessary fixes have been implemented and passed our final quality assurance checks, we will securely transmit the production credentials to you, allowing you to proceed with the final deployment. Carrier-Specific Reviews While Distribusion manages the accreditation for the majority of carriers, please be aware that some partners, such as Trenitalia and SNCF, may also perform their own manual checks before granting access to their live content. Our accreditation team will help coordinate this process with you. Next Steps To assist you with this process, the following pages provide detailed checklists of the most important items required by both Distribusion and our carriers. General Accreditation Accreditation Criteria Carrier Accreditation • [Preview Distribusion Content](https://docs.distribusion.com/dt/api/getting-started/preview-distribusion-content.md): To help you visualise the breath of our content and a sample of the sort of user experience you can build with our API, see below a few links to our whitelabel solutions. If you want to learn more about this solution please check the Booking Engine section . Demo Examples As users expect a different experience depending on the region and the type of service they are purchasing here you have three different examples of our Booking Engine . These three allow users to purchase ancillaries, apply discounts and even use our Virtual Interlining features (Paris - Amsterdam on Europe). European Flow Brazil & Latam Flow Airport Flow Post Booking With Distribusion, you get more than just a booking engine, you also get an automatic after sales process. Your customers are able to download the ticket in their prefer format (pdf, apple pass or google wallet) and refund their tickets using the booking management section. As payments are disabled above, here an example of a confirmation page and the booking management page. Checkout Confirmation Booking Management Refund Visit and Play with Some of our Integrations Widget Integrations Easybus Aéroport Paris-Beauvais Website DublinExpress Alsa Airport Abu Dhabi International Airport Other Brands Amtrak NS megabus Scan to Book Flibco Alibus (open and scan QR to preview) • [Basic Integration](https://docs.distribusion.com/dt/api/basic-integration.md): This section describes the standardized and basic flow that is expected for all integrations to Distribusion API. Your Partnership Manager will be happy to guide you through the individual API endpoints to support an integration that meets the requirements of your system and existing user flow. Explore our menu on the left or view our Flow Overview . • [Flow Overview](https://docs.distribusion.com/dt/api/basic-integration/flow-overview.md): The Distribusion API facilitates a fully native search, booking and after-sales flow, consisting of these steps: Preparing Metadata : Sets the metadata from stations/areas/cities and carries in advance to support the steps in the flow. Searching for Trips : Retrieves the list of available trips for a specific departure/arrival date and time, for selected stations/areas/cities, for a defined number of passengers and other search criteria you define. Checking Price & Vacancy : Confirms if the trip selected has vacancy and if the price is still the same as in the previous step. Creating Reservation : Creates a reservation while the user completes the checkout process. Confirming Reservation : Sends a request to confirm the reservation with the carrier. Checking Reservation Status : Checks the status of the reservation until is is confirmed by the carrier. Booking Confirmation : Displays the booking details after the reservation is confirmed. Cancel Booking: Requests the cancellation conditions and process a cancellation. Optionally, you can call Quick Search before step 2 to check whether content exists on a route and show an indicative "from" price. It sits in front of the flow above and does not replace any of these steps. Important Update for Existing Partners: We have recently upgraded our core booking architecture to the new Offers API flow . While the general sequence of booking a ticket remains the same, the mechanics of the first three steps (/connections/find, /connections/vacancy, and /reservations/create) have been significantly streamlined. For information about our new flow please check the New Offers Flow Explained guide for a step-by-step walkthrough of the changes. • [New Offers Flow Explained](https://docs.distribusion.com/dt/api/basic-integration/new-offers-flow-explained.md): We recognize that updating your integration takes time, so we designed this guide to ensure a seamless transition. This structural update simplifies your workflow by replacing repetitive parameter passing with a streamlined, persistent "Offer ID" element. This new foundation unblocks advanced features like segment-specific fares and improved ancillary handling and future-proofs your integration. While we are excited to unlock these capabilities, your operational stability remains our top priority. This update is a fully backwards-compatible extension of the same API version and has been rigorously tested on our own internal frontends. These changes impact the search , vacancy and reservation creation steps, so booking finalization and post-booking endpoints remain entirely unchanged. IMPORTANT : The new Offers flow is currently enabled on a per-account basis. Please reach out to your Partnership Manager to activate it for your API credentials. Why are we implementing Offers? We are introducing this new flow to simplify the implementation of the API for your general workflow. The previous API structure relied on an outdated and counter-intuitive method where every request required repeating the same set of parameters (like station codes, times, and carrier codes). This created limitations and blockers to developing new features. The new flow aligns our API more closely with the industry standard of using persistent IDs. It provides a more flexible fare offering, ensures it is future-proof for upcoming certification requirements, and acts as a foundation for all new functionalities, including updated flows for ancillaries, seat map, and amendments. How are we doing it? This update is an extension of our existing API workflow and endpoints. We have intentionally designed this to be backwards compatible. Furthermore, this public release comes only after thorough internal implementation testing on our own frontends and selected partners to ensure stability and reliability. Key Architectural Changes From GET to POST: The recommendation is to switch from the GET method to the POST method for API requests to /connections/find and /connections/vacancy . With POST , all parameters are included in the body of the request, offering a cleaner and more standardized format. The Offer ID Paradigm: Your initial search on /connections/find generates a unique offer_id . This persistent ID is then reused for all subsequent requests, eliminating the need to repeat connection parameters. Location Parameterization: Parameters are structured differently, using a single departure_location concept instead of separate parameters like departure_station or departure_city . Unified Passenger Tracking: Passengers are now assigned unique identifiers (e.g., pax-40-1 ) early in the search flow. These IDs are referenced across subsequent steps to accurately map distinct traveler details. Endpoint-by-Endpoint Migration Guide Step 1: Searching for Trips /connections/find Feature Before New Method & Payload GET method using URL query parameters. POST method using a JSON body. Locations Separate arrays or fields like departure_stations[] or departure_city . Unified departure_location and arrival_location objects defining the type and value. Trip Context Flat departure dates and times in the query string. Grouped within a search_bounds array, utilizing an is_requested boolean to differentiate outbound and inbound contexts. Ready to support multi bounds trips. Passengers Flat array (e.g., passengers[][pax]=1 ). Structured passengers array in the JSON body that assigns unique IDs (e.g., pax-40-1 ) for tracking. Return Trips Passing a return_date in the initial search query. A two-step /connections/find process is recommended. Pass the selected outbound offer_id in the offers array when searching for the inbound leg to capture discounted fares (e.g., SNCF, Eurostar). Output Connection details. Returns a unique offer_id at the connection/fare level and granular fare_conditions Step 2: Checking Price & Vacancy /connections/vacancy Feature Before New Method & Payload GET method using URL query parameters. POST method using a JSON body. Trip Details Required reconstructing the trip by re-sending marketing_carrier , departure_station , arrival_station , and fare_class . Completely removed. You now only pass the offer_id (or multiple for return trips) retrieved from step 1. Passenger Mapping Sent flat passenger counts and types again (e.g., passengers[][type]=PNOS ). Mapped using the passenger_ids array inside the offers object to tie specific passengers (e.g., " pax-40-1 ") directly to the selected offer. Step 3: Creating a Reservation /reservations/create Feature Before New Method & Payload POST method using a JSON body. POST method using a highly simplified JSON body. Trip Details The payload root required multiple explicit trip details ( marketing_carrier , departure_station , arrival_time , fare_class , etc.). Explicit trip details are gone. You only pass the verified offer_id within the offers array. Passenger Binding Passed a completely new passengers array defining the type from scratch. The passengers array binds actual traveler data ( first_name , last_name , birthdate ) specifically to the passenger id (e.g., " pax-40-1 ") established in step 1. Next Steps: Confirming the Reservation and Subsequent Steps While the initial search and reservation creation steps have been significantly streamlined, we have intentionally preserved the stability of your high-risk booking finalization and post-booking workflows. Reservation Confirmation & Status: There are no changes to the /reservations/confirm or /reservations/{reservation_id} endpoints. You will continue to use the reservation_id exactly as you do today to ensure backward compatibility and stability. Post-Booking Operations: All retrieval and cancellation workflows remain entirely consistent. You will continue to use the booking_id with absolutely no changes required on your end. Ancillaries & Seat Maps: Historically, these had complex, carrier-dependent implementations. Moving forward, ancillaries and seat maps will be integrated using a standardized flow. • [Preparing Metadata](https://docs.distribusion.com/dt/api/basic-integration/preparing-metadata.md): In our Basic Integration flow , some of the data such as departure times and prices must be retrieved live from our API, but some other data should be stored locally to optimize the user experience and your flow. The Distribusion API enables you to search for trips on city, areas and station level, flexibly catering to what the user chooses to input. Please refer to the Searching for Trips section. In order for users to search for trips, the metadata related to marketing carriers and stations must be retrieved and stored locally, which can be achieved by making use of the dedicated endpoints mentioned below. Locations Stations Distribusion standardizes station and city data across the entire ground transportation industry, the same way in which IATA does in the flight industry. Our station codes are designed to represent specific locations using a set of 8 capital letters that make it easy for you to identify and, where applicable, assign them to existing location entities within your own system. The structure of our station codes follows a simple logic: The first two letters represent the country in which the station is located The next three represent the city in which the station is located The last three letters more precisely represent the location of the station Example GB(Great Britain) + LON(London) + VSA(Victoria station) = GBLONVSA The list of stations available from the carriers whilitested in your Distribusion account can be retrieve from the /stations endpoint. If you are looking for details of a single station, use the /stations/{station_code} endpoint. Cities Distribusion also provides harmonized location codes at city level that unite all stations within a certain city. City codes consist of 5 letters according to the following logic: The first two letters represent the country in which the city is located, The next three represent the city code Example City London (GBLON) Stations belonging to this area London Victoria Coach Station(GBLONVSA) London Park Inn Heathrow (GBLONPIH) London Lewisham (GBLONLEW) The whole list of cities available in Distribusion can be retrieve from the /cities endpoint. Areas Besides grouping stations by cities and countries, Distribusion also provides an area grouping that unites all the stations that belong to the same airport or superstation. Each Area consists of a 7-letter-code, following this logic: The first two letters represent the country in which the airport is located The next three represent the city in which the airport is located The last two letters more precisely represent the location of the airport Example Area London Heathrow Airport (GBLONLA) Stations belonging to this area London Heathrow Airport Terminal 3 (GBLONAHT) London Heathrow Airport Terminal 4 (GBLONHAI) London Heathrow Airport Terminal 5 (GBLONHAR) The whole list of areas available in Distribusion can be retrieve from the /areas endpoint. External Station & Area Codes In addition to Distribusion's standardized location codes, the API provides common industry-standard identifiers for certain types of stations and areas. These codes, such as UIC for European rail stations and IATA for airports stations and areas, can be useful for mapping to other systems or for display purposes. UIC Station Codes What it is: UIC (International Union of Railways) codes are unique identifiers for railway stations, primarily used across Europe. Availability: Provided for European rail stations. Endpoints: /stations/{station_code} & /stations Parameter: uic_station_code IATA Airport Codes What it is: IATA (International Air Transport Association) codes are three-letter codes used to identify airports worldwide. Availability: Relevant for stations and areas located at or serving airports globally. Endpoints: /stations/{station_code} & /areas Parameter: iata_code Connected Stations The /cities and /areas endpoints include all data available in Distribusion from all carriers, even carriers that are not whitelisted for your account. For a better search experience, we recommend that you don't allow users to select stations, cities or areas that have no content available. To limit the results to the content covered by your carriers only use the /connected_stations endpoint. This list should be used to build the suggestions in your search fields e.g. when a user clicks on the ‘from’ and ‘to’ fields in your search page the list of stations is limited to show only possible combinations. At the moment we don't have an equivalent endpoint for /connected_cities, so we suggest you build a list of connected cities by getting the list from the /connected_stations endpoint and using their city code (included in the response) or removing the last 3 characters to get the city codes. In case you receive an empty response from the /connected_stations endpoint, you should assume that all stations offered by the carrier are connected. For the full list of stations of the carrier use the /marketing_carriers/{marketing_carrier_id}/stations endpoint as explained below. Marketing Carrier Stations In case you already know which marketing carriers are of interest to you, please refer to /marketing_carriers/{marketing_carrier_id}/stations endpoint which allows you to retrieve a list of all stations used by a specific marketing carrier. Station Types To facilitate the distribution of different modes of ground transportation, which are clearly marked within the station_type parameter for each station in the /stations endpoint, Distribusion supports four station types: Bus station: bus_station Train station: train_station Ferry station: ferry_station Tram station: tram_station Station Mapping When it comes to mapping stations & schedules from the Distribusion API, we strongly recommend utilizing our city & area codes in the API to map to your entities. This way if an additional station is added to a city or area, your search will still pull all relevant schedules for the customer and no trips will be missing. See the image below for how the use of cities and areas can simplify your API calls: In the same thread, we strongly recommend to map our stations, cities & areas to your internal entities, and not the connections themselves. Connections are added, changed and removed frequently, leaving you with a tall task to keep the content fully mapped in this way. However, once a city or airport is mapped to your entity for that city or airport, you can be confident that all content relating to it will be displayed regardless of the ever changing schedules mapped to it. Suggestion Service To significantly enhance the user's search experience, a Suggestion Service is available. This service streamlines how users find and select locations by either providing a list of popular destinations or dynamically suggesting locations as a user types. It can further refine arrival suggestions based on a selected departure and returns helpful data like location names, codes, and types. Integrating this service can simplify the initial setup for location searching, reducing the need for extensive upfront location data mapping and local storage for the search interface, especially if you don't have an existing location database. Please note that the Suggestion Service is an enterprise API feature. For detailed implementation guidance, including all parameters and response structures, please refer to the full Suggestion Service documentation . Marketing Carriers Metadata To retrieve all marketing carriers available for your API credentials, please use the /marketing_carriers endpoint. In order to retrieve the metadata of a specific marketing carrier (e.g. its logo, terms and conditions, vehicle type, operating status, customer support contacts), please refer to the /marketing_carriers/{marketing_carrier_id} endpoint. Carrier Codes Each marketing carrier possesses a unique 4-letter-code in Distribusion’s system, regardless of which mode of transport it represents. In order to display the search results and sell tickets for a certain carrier, you will need to have previously retrieved and stored the respective metadata such as the logo, fare features, and terms & conditions. Examples Heathrow Express (Airport Transfer) = HEXR Deutsche Bahn (Rail) = DBAH Autoservizi Salemi (Intercity Bus Europe) = ASAL Aguia Branca (Intercity Bus Brazil) = ABRA Wightlink (Ferry) = WIGH Edinburgh Trams (Tram) = ETRM Prior to the launch of your integration, your account manager will configure access to all agreed upon marketing carriers for your API credentials. Fare Class Mapping We also recommend caching the fare-classes data of the carriers. By mapping all the fare-classes (as found in /connections/find & /marketing_carriers/{marketing_carrier_id} ) you are providing full parity to the customer and presenting them with the full options available, from higher comfort classes, to extra luggage and even discounted fares. Booking Schema (for checkout fields) When creating and confirming a reservation, each carrier has different requirements on the fields that must be included in the /reservations/create and /reservations/confirm request. For instance, some carriers might require a phone number or the passenger ID details while others won't. These varying requirements can include fields like passenger name, date of birth, nationality, or document details. To ensure you collect all necessary information, you can fetch these passenger field requirements dynamically as part of your booking flow. The responses from both the /connections/vacancy endpoint (when checking availability) and the /reservations/create endpoint (when initiating a reservation) will outline the necessary fields for subsequent steps. JSON { "id": "6e6e720e-1928-4cd6-8155-0cdb2640fe55", "type": "passenger_required_attributes", "attributes": { "mandatory": [ "birthdate", "first_name", "last_name" ], "endpoint": "reservations/create", "internal_source": true } }, { "id": "4370f630-04e9-4236-8d3c-23f3ac3e3c29", "type": "passenger_required_attributes", "attributes": { "mandatory": [ "birthdate", "first_name", "last_name" ], "endpoint": "reservations/confirm", "internal_source": true } }, { "id": "ea19265f-b670-48d8-9234-f7b4c14aefdd", "type": "required_attributes", "attributes": { "mandatory": [ "email", "first_name", "last_name" ], "endpoint": "reservations/create" } }, { "id": "a90a2045-a91d-40a2-ae47-44d7908b2764", "type": "required_attributes", "attributes": { "mandatory": [ "email", "first_name", "last_name", "terms_accepted" ], "endpoint": "reservations/confirm" } } We recommend integrating this logic to dynamically adapt your checkout forms. This will help you display only the required fields based on the selected carrier and specific context, enhancing user experience, reducing booking errors, and ensuring compliance. More details available in our Dynamic Passenger Details guide . Best Practices Do not call metadata endpoints during the user flow : Although we recommend integrating the search flow via live customer calls, we do not recommend the same for station & carrier information. To optimize your flow you should cache the data for stations, areas, cities and marketing carriers in advance. We recommend creating a cache of the /stations , /cities , /areas , /connected_stations and /marketing_carriers/{marketing_carrier_id} endpoints. Call the metadata endpoints regularly : For the station information, we recommend creating a cache daily or multiple times per week and for the carrier information such as logos, T&C and amenities we recommend calling the endpoint for each carrier integrated weekly or bi-weekly to keep up to date. Only show relevant stations in your search fields : Instead of showing the whole list of stations, areas and cities that you get from Distribusion (that covers the whole world) you should filter out the list to display only the relevant results using the /connected_stations . Use the carrier logo : The carrier logos are available under the white_label_logo field in the /marketing_carriers/{marketing_carrier_id} endpoint, but must be converted from the base64 format to image. This can be done with a script such as Base64 Guru . Utilize the Suggestion Service for search inputs : To enhance the user experience when they are inputting departure and arrival locations, integrate the Suggestion Service . It can provide dynamic, as-you-type suggestions or lists of popular destinations, making it easier for users to find locations without needing to know exact names or codes for their initial search. This is particularly helpful for streamlining the search query phase. API Examples Sample Response from /stations JSON { "id": "DEBERBWA", "type": "stations", "attributes": { "station_type": "train_station", "code": "DEBERBWA", "name": "Wassmannsdorf Train Station", "description": "The train platform is located at Berlin Waßmannsdorf Train Station. Passengers should find the exact platform on the information display board based on the departure time and the destination.", "street_and_number": "", "zip_code": "12529", "time_zone": "Europe/Berlin", "uic_station_code": "8084412", "longitude": 13.463564, "latitude": 52.368384 }, "relationships": { "city": { "data": { "id": "DEBER", "type": "cities" } }, "area": { "data": null } } }, { "id": "DEBERBFB", "type": "stations", "attributes": { "station_type": "train_station", "code": "DEBERBFB", "name": "Berlin Airport BER Terminal 1\u00262 Train Station", "description": "The train platform is located at Berlin Airport BER - Terminal 1-2 Train Station. Passengers should find the exact platform on the information display board based on the departure time and the destination.", "street_and_number": "", "zip_code": "12529", "time_zone": "Europe/Berlin", "uic_station_code": "8084407", "longitude": 13.509769, "latitude": 52.364481 }, "relationships": { "city": { "data": { "id": "DEBER", "type": "cities" } }, "area": { "data": { "id": "DEBERBB", "type": "areas" } } } }, { "id": "ITRROPHA", "type": "stations", "attributes": { "station_type": "bus_station", "code": "ITRROPHA", "name": "Pozzuoli Port", "description": "The port is located on Largo San Paolo", "street_and_number": "Largo S. Paolo, 80078 Pozzuoli", "zip_code": "80078", "time_zone": "Europe/Rome", "uic_station_code": null, "longitude": 14.11799, "latitude": 40.823195 }, "relationships": { "city": { "data": { "id": "ITRRO", "type": "cities" } }, "area": { "data": null } } }, { "id": "ITRROCHA", "type": "stations", "attributes": { "station_type": "bus_station", "code": "ITRROCHA", "name": "Casamicciola Port", "description": "The port is located close to Rada Hotel", "street_and_number": "Casamicciola Terme", "zip_code": "80074", "time_zone": "Europe/Rome", "uic_station_code": null, "longitude": 13.906041, "latitude": 40.749354 }, "relationships": { "city": { "data": { "id": "ITRRO", "type": "cities" } }, "area": { "data": null } } }, { "id": "ITZJJPHA", "type": "stations", "attributes": { "station_type": "bus_station", "code": "ITZJJPHA", "name": "Procida Port", "description": "The port is located on Via Roma", "street_and_number": "Via Roma, 1", "zip_code": "80079", "time_zone": "Europe/Rome", "uic_station_code": null, "longitude": 14.027073, "latitude": 40.766209 }, "relationships": { "city": { "data": { "id": "ITZJJ", "type": "cities" } }, "area": { "data": null } } }, { "id": "GBQQDDHA", "type": "stations", "attributes": { "station_type": "bus_station", "code": "GBQQDDHA", "name": "Dover Port", "description": "The port is located on Lower Road West", "street_and_number": "", "zip_code": "CT161PS", "time_zone": "Europe/London", "uic_station_code": null, "longitude": 1.332752, "latitude": 51.124942 }, "relationships": { "city": { "data": { "id": "GBQQD", "type": "cities" } }, "area": { "data": null } } }, { "id": "BEZEEZHA", "type": "stations", "attributes": { "station_type": "ferry_station", "code": "BEZEEZHA", "name": "Zeebrugge Port", "description": "The port is located on Engelandstraat", "street_and_number": "Engelandstraat", "zip_code": "8380", "time_zone": "Europe/Brussels", "uic_station_code": null, "longitude": 3.1848123, "latitude": 51.3398613 }, "relationships": { "city": { "data": { "id": "BEZEE", "type": "cities" } }, "area": { "data": null } } } ... Sample Response from /stations/{station_code} JSON { "data": { "id": "DEBERBFB", "type": "stations", "attributes": { "station_type": "train_station", "code": "DEBERBFB", "name": "Aéroport de Berlin BER Terminal 1&2 Gare", "description": "Le quai du train est situé à l'aéroport de Berlin BER - Gare Terminal 1-2. Les passagers doivent trouver le quai exact sur le panneau d'affichage d'information en fonction de l'heure de départ et de la destination.", "street_and_number": "", "zip_code": "12529", "time_zone": "Europe/Berlin", "uic_station_code": "8084407", "longitude": 13.509769, "latitude": 52.364481 }, "relationships": { "city": { "data": { "id": "DEBER", "type": "cities" } }, "area": { "data": { "id": "DEBERBB", "type": "areas" } } } }, "jsonapi": { "version": "1.0" }, "meta": { "locale": "fr" }, "included": [ { "id": "DEBER", "type": "cities", "attributes": { "code": "DEBER", "name": "Berlin", "subdivision_code": null } }, { "id": "DEBERBB", "type": "areas", "attributes": { "code": "DEBERBB", "name": "Berlin Airport BER", "iata_code": "BER" }, "relationships": { "city": { "data": { "id": "DEBER", "type": "cities" } } } } ] } Sample Response from /areas JSON … { "id": "ESBCNBA", "type": "areas", "attributes": { "code": "ESBCNBA", "name": "Barcelona El Prat Airport ", "latitude": 41.29744497927648, "longitude": 2.08327264003784, "iata_code": "BCN" }, "relationships": { "city": { "data": { "id": "ESBCN", "type": "cities" } } } }, { "id": "ITROMRA", "type": "areas", "attributes": { "code": "ITROMRA", "name": "Rome Ciampino Airport", "latitude": 41.79878567045095, "longitude": 12.59118539772346, "iata_code": "CIA" }, "relationships": { "city": { "data": { "id": "ITROM", "type": "cities" } } } }, { "id": "ITMILMA", "type": "areas", "attributes": { "code": "ITMILMA", "name": "Milan Malpensa Airport", "latitude": 45.6300999918447, "longitude": 8.72550924016874, "iata_code": "MXP" }, "relationships": { "city": { "data": { "id": "ITMIL", "type": "cities" } } } }, { "id": "FRPARPA", "type": "areas", "attributes": { "code": "FRPARPA", "name": "Paris Charles de Gaulle Airport ", "latitude": 49.00789486748711, "longitude": 2.55076076911455, "iata_code": "CDG" }, "relationships": { "city": { "data": { "id": "FRPAR", "type": "cities" } } } }, { "id": "GBLONLA", "type": "areas", "attributes": { "code": "GBLONLA", "name": "London Heathrow Airport ", "latitude": 51.47005569586732, "longitude": -0.4543062308008, "iata_code": "LHR" }, "relationships": { "city": { "data": { "id": "GBLON", "type": "cities" } } } } … Sample Response from /cities JSON … { "id": "DEAUG", "type": "cities", "attributes": { "code": "DEAUG", "name": "Augsburg", "subdivision_code": null, "time_zone": "Berlin", "country_code": "DE", "latitude": 48.3705449, "longitude": 10.89778999999999 } }, { "id": "DEBYU", "type": "cities", "attributes": { "code": "DEBYU", "name": "Bayreuth", "subdivision_code": null, "time_zone": "Berlin", "country_code": "DE", "latitude": 49.9456399, "longitude": 11.5713346 } }, { "id": "DEBER", "type": "cities", "attributes": { "code": "DEBER", "name": "Berlin", "subdivision_code": null, "time_zone": "Berlin", "country_code": "DE", "latitude": 52.52000659999999, "longitude": 13.40495399999998 } }, { "id": "DEBRU", "type": "cities", "attributes": { "code": "DEBRU", "name": "Braunschweig", "subdivision_code": "", "time_zone": "Berlin", "country_code": "DE", "latitude": 52.2688736, "longitude": 10.52676959999997 } }, { "id": "DEBRE", "type": "cities", "attributes": { "code": "DEBRE", "name": "Bremen", "subdivision_code": null, "time_zone": "Berlin", "country_code": "DE", "latitude": 53.07929619999999, "longitude": 8.80169369999999 } } … Sample Response from /connected_stations JSON … { "id": "ADALVALA-ESABCACF", "type": "connected_stations", "relationships": { "departure_station": { "data": { "id": "ADALVALA", "type": "stations" } }, "arrival_station": { "data": { "id": "ESABCACF", "type": "stations" } } } }, { "id": "ADALVALA-ESACOLCO", "type": "connected_stations", "relationships": { "departure_station": { "data": { "id": "ADALVALA", "type": "stations" } }, "arrival_station": { "data": { "id": "ESACOLCO", "type": "stations" } } } }, { "id": "ADALVALA-ESALCZOB", "type": "connected_stations", "relationships": { "departure_station": { "data": { "id": "ADALVALA", "type": "stations" } }, "arrival_station": { "data": { "id": "ESALCZOB", "type": "stations" } } } }, { "id": "ADALVALA-ESALMABU", "type": "connected_stations", "relationships": { "departure_station": { "data": { "id": "ADALVALA", "type": "stations" } }, "arrival_station": { "data": { "id": "ESALMABU", "type": "stations" } } } } … Sample Response from /marketing_carriers/{marketing_carrier_id} JSON { "data": { "id": "NTRA", "type": "marketing_carriers", "attributes": { "code": "NTRA", "trade_name": "NS", "legal_name": "NS Reizigers BV", "address": "Laan van Puntenburg 100, 3511ER, Utrecht, Netherlands", "phone": "+31307515155", "fax": "", "customer_service_phone": "+31307515155", "customer_service_email": "", "email": "", "commercial_register": "", "commercial_register_number": "", "vat_no": "NL803882804B01", "authorised_representative": "", "white_label_domain": "ns.transport-ticket.com", "white_label_logo": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABLAAAAHVCAMAAADW/vKzAAAABGdBTUEAALGP\nC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3Cc\nulE8AAADAFBMVEUAAAAAAGkAAGYAAGYAAGYAAGYAAGYAAGYAAGUAAGYAAGcA\nAGUAAGYAAGcAAGUAAGUAAGoAAGUAAGYAAGYAAGMAAGYAAGYAAGUAAGUAAGcA\nAFUAAGgAAGsAAGYAAGYAAGYAAGYAAGYAAGQAAHEAAGEAAGYAAGYAAGYAAGYA\nAGYAAGYAAGYAAGUAAG0AAGYAAGYAAGQAAGYAAGUAAGYAAGgAAGYAAGYAAGUA\nAGYAAGYAAGcAAGYAAGYAAGYAAGcAAGoAAGYAAGYAAGYAAGQAAGYAAGIAAGoA\nAGYAAGYAAGYAAGYAAGYAAGYAAGYAAGgAAGYAAGYAAGYAAGYAAGMAAGYAAGYA\nAGcAAGUAAGMAAGYAAGYAAGYAAGcAAGYAAGYAAGUAAGcAAAAAAGQAAGYAAGYA\nAGgAAGYAAGYAAGYAAGYAAFUAAGgAAGUAAGQAAGcAAGcAAIAAAGYAAGUAAGgA\nAGYAAGcAAGcAAGQAAGYAAGYAAGUAAGkAAGYAAGUAAGYAAGYAAGcAAGUAAGUA\nAGcAAGcAAGYAAGcAAGUAAGYAAGcAAGUAAGYAAGUAAGcAAGUAAGYAAGcAAGUA\nAGcAAGYAAGcAAGUAAGYAAGUAAGcAAGcAAGUAAGYAAGYAAGUAAGYAAGYAAGcA\nAGUAAGYAAGUAAGcAAGUAAGYAAGYAAGcAAGYAAGYAAGcAAGYAAGcAAF0AAGYA\nAGYAAGcAAGAAAGUAAGYAAGYAAGcAAGYAAGYAAGQAAGUAAGYAAGUAAGIAAGYA\nAGYAAGYAAGYAAGUAAGYAAGYAAGUAAGcAAGcAAGYAAIAAAGYAAGYAAGYAAGAA\nAGcAAGYAAGYAAGYAAGkAAGYAAGcAAGYAAGYAAGYAAGYAAGcAAGUAAGgAAGYA\nAGQAAG0AAGYAAGYAAGcAAGUAAGYAAGYAAGcAAGcAAGYAAGYAAGYAAGQAAGcA\nAGYAAGYAAGUAAGgAAGUAAGYAAGYAAGYAAGYAAGYAAGYAAGUAAGYAAGYAAGcA\nAGcAAGcAAGYAAGb///9lHEHtAAAA/nRSTlMAEcv07uDd1sSxn416ZkwrDDXv\n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\nQmCC\n", "white_label_colour_code": "", "terms": "NS Trip Scheduler: https://www.ns.nl/en/journeyplanner/\r\n\r\nNS Privacy Policy: https://www.ns.nl/en/privacy\r\n\r\nNS General Terms and Conditions for the transport of Travellers and Hand Luggage of Nederlandse Spoorwegen (AVR-NS): https://www.ns.nl/binaries/_ht_1698835312159/content/assets/ns-en/terms/general-terms-and-conditions-for-the-transport-of-passengers-and-hand-luggage-of-the-ns-avr-ns.pdf\r\n\r\nNS General terms and conditions urban and regional public transport 2015: https://www.ns.nl/binaries/_ht_1528981711934/content/assets/ns-en/terms/general-terms-and-conditions-urban-and-regional-public-transport.pdf\r\n\r\nNS E-ticket Terms and Conditions: https://www.ns.nl/binaries/_ht_1683189677743/content/assets/ns-en/terms/terms-and-conditions-e-ticket.pdf", "privacy_policy": null, "flight_number_required": false, "has_mobile_tickets": false, "tickets_validity_in_hours": null, "tickets_validity_info": "The one-way ticket is valid for 28 hours, from 0:00 until 04:00 the next morning.", "cancellation_type": "no_cancellation", "supports_seats": false, "ticket_printing_required": false, "status": "active", "cancellation_api_exposed": false, "passenger_data_amendment_api_exposed": false, "amendment_api_exposed": false, "live_booking_conditions_supported": false, "amendment_refund_type": "none", "cancellation_refund_type": "none", "booking_fee": 0, "cancellation_fee": 0, "cancellation_cutoff": null }, "relationships": { "default_passenger_type": { "data": { "id": "PNOS", "type": "passenger_types" } }, "passenger_types": { "data": [ { "id": "PNOS", "type": "passenger_types" }, { "id": "PCIL", "type": "passenger_types" } ] }, "extra_types": { "data": [] }, "vehicle_types": { "data": [ { "id": "TRAIN", "type": "vehicle_types" } ] }, "fare_classes": { "data": [ { "id": "NTRA-FARE-1", "type": "fare_classes" }, { "id": "NTRA-FARE-2", "type": "fare_classes" }, { "id": "NTRA-FARE-3", "type": "fare_classes" }, { "id": "NTRA-FARE-4", "type": "fare_classes" } ] } } }, "jsonapi": { "version": "1.0" }, "meta": { "locale": "en", "currency": "EUR" }, "included": [ { "id": "PNOS", "type": "passenger_types", "attributes": { "code": "PNOS", "name": "Adult", "description": "", "min_age": 12, "max_age": 99 } }, { "id": "PCIL", "type": "passenger_types", "attributes": { "code": "PCIL", "name": "Child", "description": "", "min_age": 4, "max_age": 11 } }, { "id": "TRAIN", "type": "vehicle_types", "attributes": { "code": "TRAIN", "name": "Train", "description": "Vehicle which is transporting people or goods on rails." } }, { "id": "NTRA-FARE-1", "type": "fare_classes", "attributes": { "code": "FARE-1", "name": "Second Class", "iata_category": "Economy Class", "journey_type": "single", "default": true }, "relationships": { "post_booking_condition": { "data": null }, "fare_features": { "data": [ { "id": "NTRA-WIFI", "type": "fare_features" }, { "id": "NTRA-TOIL", "type": "fare_features" }, { "id": "NTRA-ACON", "type": "fare_features" }, { "id": "NTRA-AAFO", "type": "fare_features" }, { "id": "NTRA-QCOM", "type": "fare_features" }, { "id": "NTRA-NREF", "type": "fare_features" } ] }, "ticket_validity_rules": { "data": [ { "id": "NTRA-FARE-1-TICKET_VALIDITY_RULE-0", "type": "ticket_validity_rules" } ] }, "passenger_group_rules": { "data": [ { "id": "NTRA-FARE-1-PASSENGER_GROUP_RULE-0", "type": "passenger_group_rules" } ] } } }, { "id": "NTRA-FARE-2", "type": "fare_classes", "attributes": { "code": "FARE-2", "name": "Second Class (same day return)", "iata_category": "Economy Class", "journey_type": "open_return", "default": false }, "relationships": { "post_booking_condition": { "data": null }, "fare_features": { "data": [ { "id": "NTRA-WIFI", "type": "fare_features" }, { "id": "NTRA-TOIL", "type": "fare_features" }, { "id": "NTRA-ACON", "type": "fare_features" }, { "id": "NTRA-AAFO", "type": "fare_features" }, { "id": "NTRA-QCOM", "type": "fare_features" }, { "id": "NTRA-NREF", "type": "fare_features" } ] }, "ticket_validity_rules": { "data": [ { "id": "NTRA-FARE-2-TICKET_VALIDITY_RULE-0", "type": "ticket_validity_rules" }, { "id": "NTRA-FARE-2-TICKET_VALIDITY_RULE-1", "type": "ticket_validity_rules" } ] }, "passenger_group_rules": { "data": [ { "id": "NTRA-FARE-2-PASSENGER_GROUP_RULE-0", "type": "passenger_group_rules" } ] } } }, { "id": "NTRA-FARE-3", "type": "fare_classes", "attributes": { "code": "FARE-3", "name": "First class", "iata_category": "First Class", "journey_type": "single", "default": false }, "relationships": { "post_booking_condition": { "data": null }, "fare_features": { "data": [ { "id": "NTRA-WIFI", "type": "fare_features" }, { "id": "NTRA-TOIL", "type": "fare_features" }, { "id": "NTRA-ACON", "type": "fare_features" }, { "id": "NTRA-AAFO", "type": "fare_features" }, { "id": "NTRA-QCOM", "type": "fare_features" }, { "id": "NTRA-NREF", "type": "fare_features" } ] }, "ticket_validity_rules": { "data": [ { "id": "NTRA-FARE-3-TICKET_VALIDITY_RULE-0", "type": "ticket_validity_rules" } ] }, "passenger_group_rules": { "data": [ { "id": "NTRA-FARE-3-PASSENGER_GROUP_RULE-0", "type": "passenger_group_rules" } ] } } }, { "id": "NTRA-FARE-4", "type": "fare_classes", "attributes": { "code": "FARE-4", "name": "First Class (same day return)", "iata_category": "First Class", "journey_type": "open_return", "default": false }, "relationships": { "post_booking_condition": { "data": null }, "fare_features": { "data": [ { "id": "NTRA-WIFI", "type": "fare_features" }, { "id": "NTRA-TOIL", "type": "fare_features" }, { "id": "NTRA-ACON", "type": "fare_features" }, { "id": "NTRA-AAFO", "type": "fare_features" }, { "id": "NTRA-QCOM", "type": "fare_features" }, { "id": "NTRA-NREF", "type": "fare_features" } ] }, "ticket_validity_rules": { "data": [ { "id": "NTRA-FARE-4-TICKET_VALIDITY_RULE-0", "type": "ticket_validity_rules" }, { "id": "NTRA-FARE-4-TICKET_VALIDITY_RULE-1", "type": "ticket_validity_rules" } ] }, "passenger_group_rules": { "data": [ { "id": "NTRA-FARE-4-PASSENGER_GROUP_RULE-0", "type": "passenger_group_rules" } ] } } }, { "id": "NTRA-WIFI", "type": "fare_features", "attributes": { "code": "WIFI", "name": "Wifi", "description": "Free wifi is available on board." } }, { "id": "NTRA-TOIL", "type": "fare_features", "attributes": { "code": "TOIL", "name": "Toilet", "description": "A toilet is available on board. At the moment, Sprinters are not equipped with a toilet as standard.." } }, { "id": "NTRA-ACON", "type": "fare_features", "attributes": { "code": "ACON", "name": "Air Conditioning", "description": "The bus has an air conditioning system." } }, { "id": "NTRA-AAFO", "type": "fare_features", "attributes": { "code": "AAFO", "name": "Accessible area for bicycles", "description": "Space for storing your bicycle (except in the Intercity direct)." } }, { "id": "NTRA-QCOM", "type": "fare_features", "attributes": { "code": "QCOM", "name": "Quiet compartment", "description": "Separate quiet zones available on some trains." } }, { "id": "NTRA-NREF", "type": "fare_features", "attributes": { "code": "NREF", "name": "Non-refundable", "description": "The ticket cannot be refunded." } }, { "id": "NTRA-FARE-1-TICKET_VALIDITY_RULE-0", "type": "ticket_validity_rules", "attributes": { "rule_type": "outbound", "reference_time_type": "beginning_of_departure_day", "use_type": "once", "offset_type": "minutes", "duration_type": "hours", "offset": 0, "duration": 28 } }, { "id": "NTRA-FARE-1-PASSENGER_GROUP_RULE-0", "type": "passenger_group_rules", "attributes": { "rule_type": "max_passengers", "description": "Max passengers" }, "relationships": { "parameters": { "data": [ { "id": "NTRA-FARE-1-PASSENGER_GROUP_RULE-0-PARAMETER-0", "type": "passenger_group_rule_parameters" } ] } } }, { "id": "NTRA-FARE-1-PASSENGER_GROUP_RULE-0-PARAMETER-0", "type": "passenger_group_rule_parameters", "attributes": { "name": "passengers_limit", "value": 8 } }, { "id": "NTRA-FARE-2-TICKET_VALIDITY_RULE-0", "type": "ticket_validity_rules", "attributes": { "rule_type": "outbound", "reference_time_type": "beginning_of_departure_day", "use_type": "once", "offset_type": "minutes", "duration_type": "hours", "offset": 0, "duration": 28 } }, { "id": "NTRA-FARE-2-TICKET_VALIDITY_RULE-1", "type": "ticket_validity_rules", "attributes": { "rule_type": "inbound", "reference_time_type": "beginning_of_departure_day", "use_type": "once", "offset_type": "minutes", "duration_type": "hours", "offset": 0, "duration": 28 } }, { "id": "NTRA-FARE-2-PASSENGER_GROUP_RULE-0", "type": "passenger_group_rules", "attributes": { "rule_type": "max_passengers", "description": "Max passengers" }, "relationships": { "parameters": { "data": [ { "id": "NTRA-FARE-2-PASSENGER_GROUP_RULE-0-PARAMETER-0", "type": "passenger_group_rule_parameters" } ] } } }, { "id": "NTRA-FARE-2-PASSENGER_GROUP_RULE-0-PARAMETER-0", "type": "passenger_group_rule_parameters", "attributes": { "name": "passengers_limit", "value": 8 } }, { "id": "NTRA-FARE-3-TICKET_VALIDITY_RULE-0", "type": "ticket_validity_rules", "attributes": { "rule_type": "outbound", "reference_time_type": "beginning_of_departure_day", "use_type": "once", "offset_type": "minutes", "duration_type": "hours", "offset": 0, "duration": 28 } }, { "id": "NTRA-FARE-3-PASSENGER_GROUP_RULE-0", "type": "passenger_group_rules", "attributes": { "rule_type": "max_passengers", "description": "Max passengers" }, "relationships": { "parameters": { "data": [ { "id": "NTRA-FARE-3-PASSENGER_GROUP_RULE-0-PARAMETER-0", "type": "passenger_group_rule_parameters" } ] } } }, { "id": "NTRA-FARE-3-PASSENGER_GROUP_RULE-0-PARAMETER-0", "type": "passenger_group_rule_parameters", "attributes": { "name": "passengers_limit", "value": 8 } }, { "id": "NTRA-FARE-4-TICKET_VALIDITY_RULE-0", "type": "ticket_validity_rules", "attributes": { "rule_type": "outbound", "reference_time_type": "beginning_of_departure_day", "use_type": "once", "offset_type": "minutes", "duration_type": "hours", "offset": 0, "duration": 28 } }, { "id": "NTRA-FARE-4-TICKET_VALIDITY_RULE-1", "type": "ticket_validity_rules", "attributes": { "rule_type": "inbound", "reference_time_type": "departure_time", "use_type": "once", "offset_type": "minutes", "duration_type": "hours", "offset": 0, "duration": 28 } }, { "id": "NTRA-FARE-4-PASSENGER_GROUP_RULE-0", "type": "passenger_group_rules", "attributes": { "rule_type": "max_passengers", "description": "Max passengers" }, "relationships": { "parameters": { "data": [ { "id": "NTRA-FARE-4-PASSENGER_GROUP_RULE-0-PARAMETER-0", "type": "passenger_group_rule_parameters" } ] } } }, { "id": "NTRA-FARE-4-PASSENGER_GROUP_RULE-0-PARAMETER-0", "type": "passenger_group_rule_parameters", "attributes": { "name": "passengers_limit", "value": 8 } } ] } • [Searching for Trips](https://docs.distribusion.com/dt/api/basic-integration/searching-for-trips.md): Once the cities, areas, stations and marketing carrier metadata have been on-boarded, trips can be searched by using the /connections/find endpoint. The /connections/find endpoint searches between two locations on a specified date of travel for all possible trips available for your credentials. The search itself can be used between cities, areas and stations as described in the Preparing Metadata section. For a fast, indicative check of whether content exists on a route — and a "from" price — before running a full search, see Quick Search . Quick Search results are not bookable; continue here when the customer wants real results. The response is carrier and vehicle-type agnostic and returns all available trips that fit the location parameters requested considering the carriers whitelisted for your account. The response provides all information required to display clear search results to the user including: The carrier operating the trip The mode of transport Departure and arrival station Travel times and duration Available fare classes with prices and features/amenities Cancellation/refund policies Offer id and details Important Update for Existing Partners: We have upgraded the /connections/find endpoint to our new Offers API flow. This endpoint now uses a POST request with a JSON body instead of a GET request with URL query parameters. For information about our new flow please check the New Offers Flow Explained guide for a step-by-step walkthrough of the changes. Search Parameters Locations Distribusion support 3 types of location parameters under the type field: stations area city When a user searches for a city or airport on your website/application, it is recommended to pass through the respective city or area code instead of creating a mapping to the respective stations. This is all taken care of within Distribusion’s system and will ensure that all relevant trips are returned. Please note that even if you search in our API on city or area level, the response will provide connections on a station level, implying that you still need to add metadata (such as name and location) on a station level to your system in order to correctly display available trips to users. The search workflow allows you to switch between departure and arrival location types to match the user search (particularly relevant for airport to city searches), such as below: Station to Station JSON { "locale": "en", "currency": "EUR", "search_bounds": [ { "is_requested": true, "departure_date": "2026-03-16", "departure_start_time": "09:00", "departure_location": { "type": "stations", "value": [ "FRPARPRG" ] }, "arrival_location": { "type": "stations", "value": [ "FRMRSMBU" ] } } ], "passengers": [ { "pax": 1, "max_age": 40 } ] } Station to City JSON { "locale": "en", "currency": "EUR", "search_bounds": [ { "is_requested": true, "departure_date": "2026-03-16", "departure_start_time": "09:00", "departure_location": { "type": "stations", "value": [ "FRPARPRG" ] }, "arrival_location": { "type": "city", "value": "FRMRS" } } ], "passengers": [ { "pax": 1, "max_age": 40 } ] } For more details about locations and how to get the stations, areas and city codes needed for this step, check the Preparing Metadata section. Return Trips This flow uses a 2-step search process. Unlike standard return bookings where legs are searched independently, this flow requires providing the full trip context (both outbound and inbound bounds) during both search steps to ensure compatibility and correct pricing (e.g., fixed return discounts for SNCF and Eurostar). Overview: The 2-Step Protocol To book a fixed return, the client must perform two sequential calls to connections/find: Outbound Search : Request the outbound bound while providing the inbound bound as context. Inbound Search : Request the inbound bound while providing the outbound bound as context and the specific outbound offer selected by the user. Step 1: Search Outbound (with Context) In the initial request, you must send both the outbound and inbound bounds in the search_bounds array. Outbound Bound : Set is_requested to true. Inbound Bound : Set is_requested to false. This provides the necessary context for the supplier to apply specific return logic, even though no inbound results are returned yet. Request Example JSON { "locale": "en", "currency": "EUR", "search_bounds": [ { "is_requested": true, "departure_date": "2026-03-15", "departure_start_time": "18:00", "departure_end_time": "19:00", "departure_location": { "type": "stations", "value": [ "ITGENGEZ" ] }, "arrival_location": { "type": "stations", "value": [ "ITBLQBCB" ] } }, { "is_requested": false, "departure_date": "2026-03-16", "departure_start_time": "18:00", "departure_end_time": "19:00", "departure_location": { "type": "stations", "value": [ "ITBLQBCB" ] }, "arrival_location": { "type": "stations", "value": [ "ITGENGEZ" ] } } ], "passengers": [ { "pax": 1, "max_age": 40 } ] } Step 2: Search Inbound (with Selected Offer) Once the user selects an outbound option, you perform the second search. You must again provide both bounds, but switch the is_requested flags and include the selected outbound offer ID. Outbound Bound : Set is_requested to false. Inbound Bound : Set is_requested to true. Selected Offer : You must pass the selected outbound offer_id parameter. This is used to map the connection, segment, and fare details to ensure the inbound options returned are compatible with the selected outbound trip. Request Example JSON { "locale": "en", "currency": "EUR", "search_bounds": [ { "is_requested": false, "departure_date": "2026-03-15", "departure_start_time": "18:00", "departure_location": { "type": "stations", "value": [ "ITGENGEZ" ] }, "arrival_location": { "type": "stations", "value": [ "ITBLQBCB" ] } }, { "is_requested": true, "departure_date": "2026-03-16", "departure_start_time": "18:00", "departure_location": { "type": "stations", "value": [ "ITBLQBCB" ] }, "arrival_location": { "type": "stations", "value": [ "ITGENGEZ" ] } } ], "offers": [ { "id": "66e820aa-b921-40b6-b5d9-82b51a0c8d64|0" } ], "passengers": [ { "pax": 1, "max_age": 40 } ] } Important Notes If the carrier splits pricing: The Outbound response returns the outbound price; the Inbound response returns the delta price (the cost to add the return leg). If priced as a single fare: The Outbound response returns the minimum total price; the Inbound response returns the delta. Validation: The API validates that passengers and bounds match between the two requests (e.g., you cannot change the passenger count or age between step 1 and step 2). Bound sequence: The bounds must be provided in the correct chronological sequence. Passenger Age As a default, the Distribusion API returns prices for adult passenger type. However, if the age group or exact age of passengers is collected upon search, more precise pricing can be requested through the API with the parameters pax and max_age combined. When searching for travel for multiple passengers, you should combine the relevant parameters into a single request. For example, if you need to book 2 adults aged 40, 1 baby aged 5 months, and 1 child aged 5 years, the request would look like this: JSON "passengers": [ { "pax": 2, "max_age": 40 }, { "pax": 1, "max_age": 0 }, { "pax": 1, "max_age": 5 } ] Carrier Filter To filter the results to a specific carrier you can use the parameter carrier_codes and the code of the carrier. The list of carriers available via your credentials and corresponding codes can be retrieved from the /marketing_carriers endpoint. Departure & Arrival Times To get more precise search results you can define the departure start and end times in your request. This allows users to search for a trip during a specific time of the day e.g. afternoon departing betwen 15:00 and 17:00. This is supported for the departure time with the parameters departure_start_time and departure_end_time . We recommned using these parameters to improve the search experience, particularly for carriers that are unable to deliver results for the full day such as Deutsche Bahn, SNCF and Trenitalia. For more details, check our Limited Day Content guide . Search Results Stations Regardless of whether the user searched for a specific station, area or city, the search results should display the precise station stops returned by the API for each trip so that the user can clearly see the departure and arrival locations. Carriers It is required to show the name of the carrier operating each trip that is displayed in the search results. We strongly recommend adding the carrier’s logo here as well, a great way to make use of the strong brands that some of the operators bring to your platform. This carrier metadata and much more can be retrieved from the /marketing_carriers/{marketing_carrier_id} endpoint through the parameters trade_name and white_label_logo . To understand more about marketing carriers and operating carriers check our Operating Carriers guide . Fare Classes Carriers usually have multiple fare classes available per departure. These fare classes present users with different options to book their trip. Each fare has differences in name, prices, features/amenities and cancellation policies. Carriers usually require that the full name of the fare class are displayed to users, in most cases in the local language, so we recommend not to rewrite or hide them. To understand more about it check our Fare Classes guide . By default Distribusion only allows the same fare class to be booked for the whole trip, but some carriers such as Trenitalia support booking of different fares per segment and bound. To understand more about this functionality check our Fares Per Segment guide . Offers An offer represents a specific, bookable commercial proposition for a journey. While the connection object describes when and how you travel (times, stations, vehicle types), the offer describes the cost and conditions of that travel. The API follows a normalized structure. The connections (found in the main data array) contain relationships to fares . The full details of these fares are located in the included array under "type": "fares" in the lower part of the endpoint response. offer_id : Found within attributes, in a format such as 7a9bd0be-e5c8-4995-a259-faf096e78493|0 . This is the unique token required to proceed with booking the trip in /connections/vacancy and /reservations/create endpoints. Note: This is distinct from the resource id and from offer_id under the connections array. price : The total cost for the passengers listed, in the smallest currency unit (e.g., 8200 represents €82.00). offer_expires_at : This is a UTC timestamp indicating how long the specific price and availability are guaranteed. booking_type : This indicates whether the offer is a complete, bookable product or a sub-component of a bundle. The standalone type represents the main, bookable fare. When selecting an offer to book, you should target offers with this type. The dependent type represents a sub-component of a standalone fare, such as a specific "Seat" fee or "Admission" fee. These are usually referenced within the included_fares relationship of a standalone offer and generally cannot be booked individually. Passengers When searching for trips with multiple passengers, the API maps fares to specific individuals using unique identifiers. This ensures you can distinguish which price applies to which traveler, or if a price applies to the whole group. passenger_ids : In the API response, every passenger requested is assigned a unique id (e.g., pax-25-1 representing a 25-year-old). The offers in the response use the passenger_ids array to explicitly link a fare to the passengers it covers. If you requested 2 passengers, and the passenger_ids array lists both IDs, the offer applies to both of them simultaneously. The passenger_ids is required to proceed with booking the trip in /connections/vacancy and /reservations/create endpoints. passenger_coverage_type : This field indicates how the price is calculated regarding the listed passengers. The option collective indicates that the price displayed is the total sum for all passengers listed in the passenger_ids array. You do not need to multiply this price; it is already the aggregate cost for the group defined in that specific offer. Service Type A single offer can include multiple components of travel logic. The service_type_id is used to break down exactly what a passenger is receiving for a specific segment of the journey. This is particularly relevant for rail carriers where a "ticket" may technically consist of two distinct services: the right to board the train and a specific seat reservation. Within a fare object, the services array maps specific passengers and segments to a service_type_id . SERVICE-TYPE-ADMISSION : Represents the core travel document, the right to board the vehicle for the specified journey. SERVICE-TYPE-SEAT : Represents a seat reservation. If an offer lists this service type, it implies a seat is included or auto-selected. JSON "services": [ { "passenger_ids": [ "pax-25-1" ], "segment_ids": [ "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26-0-0" ], "service_type_id": "SERVICE-TYPE-ADMISSION" } ] You can find the definitions for these IDs in the included array under the type service_types . These objects contain human-readable titles and descriptions (e.g., "Admission right to board the train") that you can display to the user. JSON { "attributes": { "category": "ADMISSION", "code": "ADMISSION", "description": "Admission right to board the train", "title": "Admission" }, "id": "SERVICE-TYPE-ADMISSION", "type": "service_types" } Journey Duration To help users easily compare journeys, it is useful to indicate the duration of each trip. Simply read and display the duration parameter under the /connections/find endpoint when displaying search results. Note that the value is displayed in seconds, so you must convert it to hours and minutes. Journey Transfers For full transparency, users should be shown whether, and how many, transfers are on the trip. Whether a journey has a transfer, it is shown in the /connections/find endpoint. An example of a trip with multiple parts, or segments, is shown below from FRNTENAN to FRPARPRB. JSON "segments": { "data": [ { "id": "TREN-ITMILMTB-ITBRIBAC-2024-09-05T14:07-2024-09-05T22:32-0", "type": "segments" }, { "id": "TREN-ITMILMTB-ITBRIBAC-2024-09-05T14:07-2024-09-05T22:32-1", "type": "segments" } ] } As you can see, the 0 and 1 at the end of each id identify that the trip is made of 2 segments. If there is only a 0, this means that the vehicle moves directly from requested origin to destination. If you would like to locate the connecting station, scroll down until you see the connections section which shows the transit point. Leg Type When return trips are requested, you can identify if the trips in the response correspond to a outbound or inbound leg by looking at the leg_type field that could return either outbound or inbound. Features & Amenities Carriers differentiate themselves by providing varying amenities, which are strongly recommended to be displayed in the search results, for example as icons. Features can be found in the /marketing_carriers/{marketing_carrier_id} endpoint, under fare_features but are also displayed in the /connections/find response. For some carriers such as Amtrak and SNCF they appear as amenities under the /connections/find response. To understand more about it check our Features & Amenities guide . Cancellation & Refund Policies The fare and carrier’s cancellation policy for the chosen trip and fare class are communicated through fare_features as well that are provided in the /marketing_carriers/{marketing_carrier_id} and /connections/find endpoints. For some carriers, such as SNCF, dynamic cancellation and refund policies are available and set at a fare class level. This content appears under the fare_conditions section in the /connections/find response. To understand more about it check our Cancellation & Refund Policies guide . Line Details Some carriers include the line details under the vehicle_number , line and line_prefix fields. We recommend adding this information to your interface to allow user to know more about the line they are booking. Seats Left Some carriers return information about the amount of seats left under the total_seats_left (total seats left in the departure) and seats_left (seats left per fare class) field. This can be used in your UI to create a sense of urgency with users. You might want to display this only when the number of seats is below a low number such as 10 or 5. A null value for seats_left means the carrier did not provide seat availability information; this should not be interpreted as an absence of vacant seats. Ticket Validity Some tickets can be used for a whole day or multiple days. This information does not appear under the /connections/find response, but it can be sourced from the /marketing_carriers/{marketing_carrier_id} endpoint. For more details check our Ticket Validity guide . Enterprise Features Refer to the our Discount Cards to further enrich the search experience. Best Practices Do not cache our search results : For the Distribusion search flow we recommend having live search calls straight to the Distribusion API. This means that customers are receiving the most up to date content available, with no issues created from large caching. If this isn’t possible, we recommend keeping the search cache as small as possible. Our search information - both pricing and vacancy - is frequently changing and therefore to reduce any change or errors on the front-end for your customers, the most up to date information is required. List all fare classes available : To give users the ability to find the best options available from the carriers we recommend displaying all the fare classes available, instead of just the cheapest one. Display all fare features with icons and descriptions (including fare amenities) : The fare features/amenities allow users to understand more about the differences in prices, so we recommend you make them visible alongside the other details of the fares. Display the cancellation, refund and amendment policies for each fare class : Whether they are presented as fare_features or fare_conditions , it is important to highlight these clearly to users to help them understand what is allowed for each fare. We recommend showing them separetely from the general fare_features such as WiFi or Power Socket. Choose the ideal currency : Distribusion can display the prices in 160+ currencies . You can allow your users to select the currency they need in your interface and send all the requests using the matching currency. When the carrier currency doesn't match the currency of the request, Distribusion applies our standard conversion rate to deliver the prices to you. In order to mitigate a difference in prices in comparison to the carrier’s own website, we recommend requesting the carrier’s local currency, which can be identified through the currency parameter in the /marketing_carriers/{marketing_carrier_id} endpoint. API Examples Sample Request to /connections/find JSON { "locale": "en", "currency": "EUR", "search_bounds": [ { "is_requested": true, "departure_date": "2026-03-18", "departure_start_time": "07:00", "departure_end_time": "07:10", "departure_location": { "type": "stations", "value": [ "ITGENGEZ" ] }, "arrival_location": { "type": "stations", "value": [ "ITBLQBCB" ] } }, { "is_requested": false, "departure_date": "2026-03-19", "departure_start_time": "11:00", "departure_end_time": "12:00", "departure_location": { "type": "stations", "value": [ "ITBLQBCB" ] }, "arrival_location": { "type": "stations", "value": [ "ITGENGEZ" ] } } ], "passengers": [ { "pax": 1, "max_age": 40 } ], "carrier_codes": [ "TTES" ] } Sample Response from /connections/find JSON { "data": [ { "attributes": { "duration": 10740, "departure_time": "2026-03-18T07:05", "arrival_time": "2026-03-18T10:04", "offer_id": null, "booked_out": false, "electronic_ticket_available": false, "cheapest_fare_class_code": "FARE-18", "total_seats_left": null, "offer_bundle": null, "leg_type": "outbound", "cheapest_total_adult_price": 8200 }, "id": "TTES-ITGENGEZ-ITBLQBCB-2026-03-18T07:05-2026-03-18T10:04-0", "type": "connections", "relationships": { "segments": { "data": [ { "id": "TTES-ITGENGEZ-ITMILMIE-2026-03-18T07:05-2026-03-18T08:35-0-0", "type": "segments" }, { "id": "TTES-ITMILMIE-ITBLQBCB-2026-03-18T08:58-2026-03-18T10:04-0-1", "type": "segments" } ] }, "fares": { "data": [ { "id": "TTES-ITGENGEZ-ITBLQBCB-2026-03-18T07:05-2026-03-18T10:04-0-STANDALONE-FARE-1", "type": "fares", "price": 12300, "fare_class": { "code": "FARE-15", "id": "TTES-FARE-15", "type": "fare_classes" }, "original_price": 12300 }, { "id": "TTES-ITGENGEZ-ITBLQBCB-2026-03-18T07:05-2026-03-18T10:04-0-STANDALONE-FARE-2", "type": "fares", "price": 10300, "fare_class": { "code": "FARE-17", "id": "TTES-FARE-17", "type": "fare_classes" }, "original_price": 10300 }, { "id": "TTES-ITGENGEZ-ITBLQBCB-2026-03-18T07:05-2026-03-18T10:04-0-STANDALONE-FARE-3", "type": "fares", "price": 8200, "fare_class": { "code": "FARE-18", "id": "TTES-FARE-18", "type": "fare_classes" }, "original_price": 8200 } ] }, "marketing_carrier": { "data": { "id": "TTES", "type": "marketing_carriers" } }, "departure_station": { "data": { "id": "ITGENGEZ", "type": "stations" } }, "arrival_station": { "data": { "id": "ITBLQBCB", "type": "stations" } }, "partial_fares": { "data": [ { "id": "TTES-ITGENGEZ-ITBLQBCB-2026-03-18T07:05-2026-03-18T10:04-0-FARE-15-C-pax-40-1-C-0", "type": "fares", "price": 4600, "fare_class": { "code": "FARE-15", "id": "TTES-FARE-15", "type": "fare_classes" }, "original_price": 4600 }, { "id": "TTES-ITGENGEZ-ITBLQBCB-2026-03-18T07:05-2026-03-18T10:04-0-FARE-17-C-pax-40-1-C-0", "type": "fares", "price": 3800, "fare_class": { "code": "FARE-17", "id": "TTES-FARE-17", "type": "fare_classes" }, "original_price": 3800 }, { "id": "TTES-ITGENGEZ-ITBLQBCB-2026-03-18T07:05-2026-03-18T10:04-0-FARE-18-C-pax-40-1-C-0", "type": "fares", "price": 3000, "fare_class": { "code": "FARE-18", "id": "TTES-FARE-18", "type": "fare_classes" }, "original_price": 3000 }, { "id": "TTES-ITGENGEZ-ITBLQBCB-2026-03-18T07:05-2026-03-18T10:04-0-FARE-13-C-pax-40-1-C-1", "type": "fares", "price": 12500, "fare_class": { "code": "FARE-13", "id": "TTES-FARE-13", "type": "fare_classes" }, "original_price": 12500 }, { "id": "TTES-ITGENGEZ-ITBLQBCB-2026-03-18T07:05-2026-03-18T10:04-0-FARE-15-C-pax-40-1-C-1", "type": "fares", "price": 7700, "fare_class": { "code": "FARE-15", "id": "TTES-FARE-15", "type": "fare_classes" }, "original_price": 7700 }, { "id": "TTES-ITGENGEZ-ITBLQBCB-2026-03-18T07:05-2026-03-18T10:04-0-FARE-16-C-pax-40-1-C-1", "type": "fares", "price": 7700, "fare_class": { "code": "FARE-16", "id": "TTES-FARE-16", "type": "fare_classes" }, "original_price": 7700 }, { "id": "TTES-ITGENGEZ-ITBLQBCB-2026-03-18T07:05-2026-03-18T10:04-0-FARE-17-C-pax-40-1-C-1", "type": "fares", "price": 6500, "fare_class": { "code": "FARE-17", "id": "TTES-FARE-17", "type": "fare_classes" }, "original_price": 6500 }, { "id": "TTES-ITGENGEZ-ITBLQBCB-2026-03-18T07:05-2026-03-18T10:04-0-FARE-18-C-pax-40-1-C-1", "type": "fares", "price": 5200, "fare_class": { "code": "FARE-18", "id": "TTES-FARE-18", "type": "fare_classes" }, "original_price": 5200 } ] } } } ], "meta": { "currency": "EUR", "locale": "en" }, "included": [ { "attributes": { "index": 0, "line": "9710", "departure_time": "2026-03-18T07:05", "arrival_time": "2026-03-18T08:35", "vehicle_number": "9710", "line_prefix": "FRECCIAROSSA" }, "id": "TTES-ITGENGEZ-ITMILMIE-2026-03-18T07:05-2026-03-18T08:35-0-0", "type": "segments", "relationships": { "fares": { "data": [] }, "marketing_carrier": { "data": { "id": "TTES", "type": "marketing_carriers" } }, "departure_station": { "data": { "id": "ITGENGEZ", "type": "stations" } }, "arrival_station": { "data": { "id": "ITMILMIE", "type": "stations" } }, "vehicle": { "data": { "id": "TRAIN-TTES-ITGENGEZ-ITMILMIE-2026-03-18T07:05-2026-03-18T08:35-0-0", "type": "vehicles" } }, "operating_carrier": { "data": { "id": "FREC", "type": "operating_carriers" } }, "amenities": { "data": [] } } }, { "attributes": { "index": 1, "line": "9615", "departure_time": "2026-03-18T08:58", "arrival_time": "2026-03-18T10:04", "vehicle_number": "9615", "line_prefix": "FRECCIAROSSA 1000" }, "id": "TTES-ITMILMIE-ITBLQBCB-2026-03-18T08:58-2026-03-18T10:04-0-1", "type": "segments", "relationships": { "fares": { "data": [] }, "marketing_carrier": { "data": { "id": "TTES", "type": "marketing_carriers" } }, "departure_station": { "data": { "id": "ITMILMIE", "type": "stations" } }, "arrival_station": { "data": { "id": "ITBLQBCB", "type": "stations" } }, "vehicle": { "data": { "id": "TRAIN-TTES-ITMILMIE-ITBLQBCB-2026-03-18T08:58-2026-03-18T10:04-0-1", "type": "vehicles" } }, "operating_carrier": { "data": { "id": "FREA", "type": "operating_carriers" } }, "amenities": { "data": [] } } }, { "id": "TRAIN-TTES-ITGENGEZ-ITMILMIE-2026-03-18T07:05-2026-03-18T08:35-0-0", "type": "vehicles", "relationships": { "vehicle_type": { "data": { "id": "TRAIN", "type": "vehicle_types" } } } }, { "id": "TRAIN-TTES-ITMILMIE-ITBLQBCB-2026-03-18T08:58-2026-03-18T10:04-0-1", "type": "vehicles", "relationships": { "vehicle_type": { "data": { "id": "TRAIN", "type": "vehicle_types" } } } }, { "attributes": { "code": "TRAIN" }, "id": "TRAIN", "type": "vehicle_types" }, { "attributes": { "price": 12300, "booking_type": "standalone", "offer_id": "90af8f9b-40e3-41d7-9a9b-ff5de2b54c21|0", "passenger_ids": [ "pax-40-1" ], "segment_ids": [ "TTES-ITGENGEZ-ITMILMIE-2026-03-18T07:05-2026-03-18T08:35-0-0", "TTES-ITMILMIE-ITBLQBCB-2026-03-18T08:58-2026-03-18T10:04-0-1" ], "segment_coverage_type": "collective", "passenger_coverage_type": "collective", "booked_out": null, "seats_left": null, "original_price": 12300, "offer_expires_at": "2026-03-16T09:36:39.520763Z" }, "id": "TTES-ITGENGEZ-ITBLQBCB-2026-03-18T07:05-2026-03-18T10:04-0-STANDALONE-FARE-1", "type": "fares", "relationships": { "applied_cards": { "data": [] }, "fare_class": { "data": { "id": "TTES-FARE-15", "type": "fare_classes" } }, "included_fares": { "data": [ { "id": "TTES-ITGENGEZ-ITBLQBCB-2026-03-18T07:05-2026-03-18T10:04-0-FARE-15-C-pax-40-1-C-0", "type": "fares" }, { "id": "TTES-ITGENGEZ-ITBLQBCB-2026-03-18T07:05-2026-03-18T10:04-0-FARE-15-C-pax-40-1-C-1", "type": "fares" } ] }, "conditions": { "data": [ { "id": "TTES-daa1c8f8be58556a4-628024a30864493e3", "type": "fare_conditions" } ] }, "products": { "data": [ { "id": "TTES-PRODUCT-4-FIRST", "type": "products" } ] }, "promotional_campaigns": { "data": [] } } }, { "attributes": { "services": [ { "passenger_ids": [ "pax-40-1" ], "segment_ids": [ "TTES-ITGENGEZ-ITMILMIE-2026-03-18T07:05-2026-03-18T08:35-0-0" ], "service_type_id": "SERVICE-TYPE-ADMISSION" }, { "passenger_ids": [ "pax-40-1" ], "segment_ids": [ "TTES-ITGENGEZ-ITMILMIE-2026-03-18T07:05-2026-03-18T08:35-0-0" ], "service_type_id": "SERVICE-TYPE-SEAT" } ], "price": 4600, "booking_type": "combinational", "offer_id": "90af8f9b-40e3-41d7-9a9b-ff5de2b54c21|1", "passenger_ids": [ "pax-40-1" ], "segment_ids": [ "TTES-ITGENGEZ-ITMILMIE-2026-03-18T07:05-2026-03-18T08:35-0-0" ], "segment_coverage_type": "collective", "passenger_coverage_type": "collective", "booked_out": null, "seats_left": null, "original_price": 4600, "offer_expires_at": "2026-03-16T09:36:39.520763Z" }, "id": "TTES-ITGENGEZ-ITBLQBCB-2026-03-18T07:05-2026-03-18T10:04-0-FARE-15-C-pax-40-1-C-0", "type": "fares", "relationships": { "applied_cards": { "data": [] }, "fare_class": { "data": { "id": "TTES-FARE-15", "type": "fare_classes" } }, "conditions": { "data": [ { "id": "TTES-daa1c8f8be58556a4-628024a30864493e3", "type": "fare_conditions" } ] }, "products": { "data": [ { "id": "TTES-PRODUCT-4-FIRST", "type": "products" } ] }, "promotional_campaigns": { "data": [] } } }, { "attributes": { "services": [ { "passenger_ids": [ "pax-40-1" ], "segment_ids": [ "TTES-ITMILMIE-ITBLQBCB-2026-03-18T08:58-2026-03-18T10:04-0-1" ], "service_type_id": "SERVICE-TYPE-ADMISSION" }, { "passenger_ids": [ "pax-40-1" ], "segment_ids": [ "TTES-ITMILMIE-ITBLQBCB-2026-03-18T08:58-2026-03-18T10:04-0-1" ], "service_type_id": "SERVICE-TYPE-SEAT" } ], "price": 7700, "booking_type": "combinational", "offer_id": "90af8f9b-40e3-41d7-9a9b-ff5de2b54c21|2", "passenger_ids": [ "pax-40-1" ], "segment_ids": [ "TTES-ITMILMIE-ITBLQBCB-2026-03-18T08:58-2026-03-18T10:04-0-1" ], "segment_coverage_type": "collective", "passenger_coverage_type": "collective", "booked_out": null, "seats_left": null, "original_price": 7700, "offer_expires_at": "2026-03-16T09:36:39.520763Z" }, "id": "TTES-ITGENGEZ-ITBLQBCB-2026-03-18T07:05-2026-03-18T10:04-0-FARE-15-C-pax-40-1-C-1", "type": "fares", "relationships": { "applied_cards": { "data": [] }, "fare_class": { "data": { "id": "TTES-FARE-15", "type": "fare_classes" } }, "conditions": { "data": [ { "id": "TTES-daa1c8f8be58556a4-628024a30864493e3", "type": "fare_conditions" } ] }, "products": { "data": [ { "id": "TTES-PRODUCT-4-FIRST", "type": "products" } ] }, "promotional_campaigns": { "data": [] } } }, { "attributes": { "price": 10300, "booking_type": "standalone", "offer_id": "90af8f9b-40e3-41d7-9a9b-ff5de2b54c21|3", "passenger_ids": [ "pax-40-1" ], "segment_ids": [ "TTES-ITGENGEZ-ITMILMIE-2026-03-18T07:05-2026-03-18T08:35-0-0", "TTES-ITMILMIE-ITBLQBCB-2026-03-18T08:58-2026-03-18T10:04-0-1" ], "segment_coverage_type": "collective", "passenger_coverage_type": "collective", "booked_out": null, "seats_left": null, "original_price": 10300, "offer_expires_at": "2026-03-16T09:36:39.520763Z" }, "id": "TTES-ITGENGEZ-ITBLQBCB-2026-03-18T07:05-2026-03-18T10:04-0-STANDALONE-FARE-2", "type": "fares", "relationships": { "applied_cards": { "data": [] }, "fare_class": { "data": { "id": "TTES-FARE-17", "type": "fare_classes" } }, "included_fares": { "data": [ { "id": "TTES-ITGENGEZ-ITBLQBCB-2026-03-18T07:05-2026-03-18T10:04-0-FARE-17-C-pax-40-1-C-0", "type": "fares" }, { "id": "TTES-ITGENGEZ-ITBLQBCB-2026-03-18T07:05-2026-03-18T10:04-0-FARE-17-C-pax-40-1-C-1", "type": "fares" } ] }, "conditions": { "data": [ { "id": "TTES-daa1c8f8be58556a4-628024a30864493e3", "type": "fare_conditions" } ] }, "products": { "data": [ { "id": "TTES-PRODUCT-5-SECOND", "type": "products" } ] }, "promotional_campaigns": { "data": [] } } }, { "attributes": { "services": [ { "passenger_ids": [ "pax-40-1" ], "segment_ids": [ "TTES-ITGENGEZ-ITMILMIE-2026-03-18T07:05-2026-03-18T08:35-0-0" ], "service_type_id": "SERVICE-TYPE-ADMISSION" }, { "passenger_ids": [ "pax-40-1" ], "segment_ids": [ "TTES-ITGENGEZ-ITMILMIE-2026-03-18T07:05-2026-03-18T08:35-0-0" ], "service_type_id": "SERVICE-TYPE-SEAT" } ], "price": 3800, "booking_type": "combinational", "offer_id": "90af8f9b-40e3-41d7-9a9b-ff5de2b54c21|4", "passenger_ids": [ "pax-40-1" ], "segment_ids": [ "TTES-ITGENGEZ-ITMILMIE-2026-03-18T07:05-2026-03-18T08:35-0-0" ], "segment_coverage_type": "collective", "passenger_coverage_type": "collective", "booked_out": null, "seats_left": null, "original_price": 3800, "offer_expires_at": "2026-03-16T09:36:39.520763Z" }, "id": "TTES-ITGENGEZ-ITBLQBCB-2026-03-18T07:05-2026-03-18T10:04-0-FARE-17-C-pax-40-1-C-0", "type": "fares", "relationships": { "applied_cards": { "data": [] }, "fare_class": { "data": { "id": "TTES-FARE-17", "type": "fare_classes" } }, "conditions": { "data": [ { "id": "TTES-daa1c8f8be58556a4-628024a30864493e3", "type": "fare_conditions" } ] }, "products": { "data": [ { "id": "TTES-PRODUCT-5-SECOND", "type": "products" } ] }, "promotional_campaigns": { "data": [] } } }, { "attributes": { "services": [ { "passenger_ids": [ "pax-40-1" ], "segment_ids": [ "TTES-ITMILMIE-ITBLQBCB-2026-03-18T08:58-2026-03-18T10:04-0-1" ], "service_type_id": "SERVICE-TYPE-ADMISSION" }, { "passenger_ids": [ "pax-40-1" ], "segment_ids": [ "TTES-ITMILMIE-ITBLQBCB-2026-03-18T08:58-2026-03-18T10:04-0-1" ], "service_type_id": "SERVICE-TYPE-SEAT" } ], "price": 6500, "booking_type": "combinational", "offer_id": "90af8f9b-40e3-41d7-9a9b-ff5de2b54c21|5", "passenger_ids": [ "pax-40-1" ], "segment_ids": [ "TTES-ITMILMIE-ITBLQBCB-2026-03-18T08:58-2026-03-18T10:04-0-1" ], "segment_coverage_type": "collective", "passenger_coverage_type": "collective", "booked_out": null, "seats_left": null, "original_price": 6500, "offer_expires_at": "2026-03-16T09:36:39.520763Z" }, "id": "TTES-ITGENGEZ-ITBLQBCB-2026-03-18T07:05-2026-03-18T10:04-0-FARE-17-C-pax-40-1-C-1", "type": "fares", "relationships": { "applied_cards": { "data": [] }, "fare_class": { "data": { "id": "TTES-FARE-17", "type": "fare_classes" } }, "conditions": { "data": [ { "id": "TTES-daa1c8f8be58556a4-628024a30864493e3", "type": "fare_conditions" } ] }, "products": { "data": [ { "id": "TTES-PRODUCT-5-SECOND", "type": "products" } ] }, "promotional_campaigns": { "data": [] } } }, { "attributes": { "price": 8200, "booking_type": "standalone", "offer_id": "90af8f9b-40e3-41d7-9a9b-ff5de2b54c21|6", "passenger_ids": [ "pax-40-1" ], "segment_ids": [ "TTES-ITGENGEZ-ITMILMIE-2026-03-18T07:05-2026-03-18T08:35-0-0", "TTES-ITMILMIE-ITBLQBCB-2026-03-18T08:58-2026-03-18T10:04-0-1" ], "segment_coverage_type": "collective", "passenger_coverage_type": "collective", "booked_out": null, "seats_left": null, "original_price": 8200, "offer_expires_at": "2026-03-16T09:36:39.520763Z" }, "id": "TTES-ITGENGEZ-ITBLQBCB-2026-03-18T07:05-2026-03-18T10:04-0-STANDALONE-FARE-3", "type": "fares", "relationships": { "applied_cards": { "data": [] }, "fare_class": { "data": { "id": "TTES-FARE-18", "type": "fare_classes" } }, "included_fares": { "data": [ { "id": "TTES-ITGENGEZ-ITBLQBCB-2026-03-18T07:05-2026-03-18T10:04-0-FARE-18-C-pax-40-1-C-0", "type": "fares" }, { "id": "TTES-ITGENGEZ-ITBLQBCB-2026-03-18T07:05-2026-03-18T10:04-0-FARE-18-C-pax-40-1-C-1", "type": "fares" } ] }, "conditions": { "data": [ { "id": "TTES-daa1c8f8be58556a4-628024a30864493e3", "type": "fare_conditions" } ] }, "products": { "data": [ { "id": "TTES-PRODUCT-6-SECOND", "type": "products" } ] }, "promotional_campaigns": { "data": [] } } }, { "attributes": { "services": [ { "passenger_ids": [ "pax-40-1" ], "segment_ids": [ "TTES-ITGENGEZ-ITMILMIE-2026-03-18T07:05-2026-03-18T08:35-0-0" ], "service_type_id": "SERVICE-TYPE-ADMISSION" }, { "passenger_ids": [ "pax-40-1" ], "segment_ids": [ "TTES-ITGENGEZ-ITMILMIE-2026-03-18T07:05-2026-03-18T08:35-0-0" ], "service_type_id": "SERVICE-TYPE-SEAT" } ], "price": 3000, "booking_type": "combinational", "offer_id": "90af8f9b-40e3-41d7-9a9b-ff5de2b54c21|7", "passenger_ids": [ "pax-40-1" ], "segment_ids": [ "TTES-ITGENGEZ-ITMILMIE-2026-03-18T07:05-2026-03-18T08:35-0-0" ], "segment_coverage_type": "collective", "passenger_coverage_type": "collective", "booked_out": null, "seats_left": null, "original_price": 3000, "offer_expires_at": "2026-03-16T09:36:39.520763Z" }, "id": "TTES-ITGENGEZ-ITBLQBCB-2026-03-18T07:05-2026-03-18T10:04-0-FARE-18-C-pax-40-1-C-0", "type": "fares", "relationships": { "applied_cards": { "data": [] }, "fare_class": { "data": { "id": "TTES-FARE-18", "type": "fare_classes" } }, "conditions": { "data": [ { "id": "TTES-daa1c8f8be58556a4-628024a30864493e3", "type": "fare_conditions" } ] }, "products": { "data": [ { "id": "TTES-PRODUCT-6-SECOND", "type": "products" } ] }, "promotional_campaigns": { "data": [] } } }, { "attributes": { "services": [ { "passenger_ids": [ "pax-40-1" ], "segment_ids": [ "TTES-ITMILMIE-ITBLQBCB-2026-03-18T08:58-2026-03-18T10:04-0-1" ], "service_type_id": "SERVICE-TYPE-ADMISSION" }, { "passenger_ids": [ "pax-40-1" ], "segment_ids": [ "TTES-ITMILMIE-ITBLQBCB-2026-03-18T08:58-2026-03-18T10:04-0-1" ], "service_type_id": "SERVICE-TYPE-SEAT" } ], "price": 5200, "booking_type": "combinational", "offer_id": "90af8f9b-40e3-41d7-9a9b-ff5de2b54c21|8", "passenger_ids": [ "pax-40-1" ], "segment_ids": [ "TTES-ITMILMIE-ITBLQBCB-2026-03-18T08:58-2026-03-18T10:04-0-1" ], "segment_coverage_type": "collective", "passenger_coverage_type": "collective", "booked_out": null, "seats_left": null, "original_price": 5200, "offer_expires_at": "2026-03-16T09:36:39.520763Z" }, "id": "TTES-ITGENGEZ-ITBLQBCB-2026-03-18T07:05-2026-03-18T10:04-0-FARE-18-C-pax-40-1-C-1", "type": "fares", "relationships": { "applied_cards": { "data": [] }, "fare_class": { "data": { "id": "TTES-FARE-18", "type": "fare_classes" } }, "conditions": { "data": [ { "id": "TTES-daa1c8f8be58556a4-628024a30864493e3", "type": "fare_conditions" } ] }, "products": { "data": [ { "id": "TTES-PRODUCT-6-SECOND", "type": "products" } ] }, "promotional_campaigns": { "data": [] } } }, { "attributes": { "services": [ { "passenger_ids": [ "pax-40-1" ], "segment_ids": [ "TTES-ITMILMIE-ITBLQBCB-2026-03-18T08:58-2026-03-18T10:04-0-1" ], "service_type_id": "SERVICE-TYPE-ADMISSION" }, { "passenger_ids": [ "pax-40-1" ], "segment_ids": [ "TTES-ITMILMIE-ITBLQBCB-2026-03-18T08:58-2026-03-18T10:04-0-1" ], "service_type_id": "SERVICE-TYPE-SEAT" } ], "price": 12500, "booking_type": "combinational", "offer_id": "90af8f9b-40e3-41d7-9a9b-ff5de2b54c21|9", "passenger_ids": [ "pax-40-1" ], "segment_ids": [ "TTES-ITMILMIE-ITBLQBCB-2026-03-18T08:58-2026-03-18T10:04-0-1" ], "segment_coverage_type": "collective", "passenger_coverage_type": "collective", "booked_out": null, "seats_left": null, "original_price": 12500, "offer_expires_at": "2026-03-16T09:36:39.520763Z" }, "id": "TTES-ITGENGEZ-ITBLQBCB-2026-03-18T07:05-2026-03-18T10:04-0-FARE-13-C-pax-40-1-C-1", "type": "fares", "relationships": { "applied_cards": { "data": [] }, "fare_class": { "data": { "id": "TTES-FARE-13", "type": "fare_classes" } }, "conditions": { "data": [ { "id": "TTES-daa1c8f8be58556a4-628024a30864493e3", "type": "fare_conditions" } ] }, "products": { "data": [ { "id": "TTES-PRODUCT-3-FIRST", "type": "products" } ] }, "promotional_campaigns": { "data": [] } } }, { "attributes": { "services": [ { "passenger_ids": [ "pax-40-1" ], "segment_ids": [ "TTES-ITMILMIE-ITBLQBCB-2026-03-18T08:58-2026-03-18T10:04-0-1" ], "service_type_id": "SERVICE-TYPE-ADMISSION" }, { "passenger_ids": [ "pax-40-1" ], "segment_ids": [ "TTES-ITMILMIE-ITBLQBCB-2026-03-18T08:58-2026-03-18T10:04-0-1" ], "service_type_id": "SERVICE-TYPE-SEAT" } ], "price": 7700, "booking_type": "combinational", "offer_id": "90af8f9b-40e3-41d7-9a9b-ff5de2b54c21|10", "passenger_ids": [ "pax-40-1" ], "segment_ids": [ "TTES-ITMILMIE-ITBLQBCB-2026-03-18T08:58-2026-03-18T10:04-0-1" ], "segment_coverage_type": "collective", "passenger_coverage_type": "collective", "booked_out": null, "seats_left": null, "original_price": 7700, "offer_expires_at": "2026-03-16T09:36:39.520763Z" }, "id": "TTES-ITGENGEZ-ITBLQBCB-2026-03-18T07:05-2026-03-18T10:04-0-FARE-16-C-pax-40-1-C-1", "type": "fares", "relationships": { "applied_cards": { "data": [] }, "fare_class": { "data": { "id": "TTES-FARE-16", "type": "fare_classes" } }, "conditions": { "data": [ { "id": "TTES-daa1c8f8be58556a4-628024a30864493e3", "type": "fare_conditions" } ] }, "products": { "data": [ { "id": "TTES-PRODUCT-9-FIRST", "type": "products" } ] }, "promotional_campaigns": { "data": [] } } }, { "attributes": { "code": "CONDITION-1", "description": "Base Ticket", "title": "BASE", "refundable": "yes", "exchangeable": "yes" }, "id": "TTES-daa1c8f8be58556a4-628024a30864493e3", "type": "fare_conditions" }, { "attributes": { "code": "PRODUCT-4", "name": "BUSINESS", "description": "BUSINESS", "travel_class": "FIRST" }, "id": "TTES-PRODUCT-4-FIRST", "type": "products" }, { "attributes": { "code": "PRODUCT-5", "name": "PREMIUM", "description": "PREMIUM", "travel_class": "SECOND" }, "id": "TTES-PRODUCT-5-SECOND", "type": "products" }, { "attributes": { "code": "PRODUCT-6", "name": "STANDARD", "description": "STANDARD", "travel_class": "SECOND" }, "id": "TTES-PRODUCT-6-SECOND", "type": "products" }, { "attributes": { "code": "PRODUCT-3", "name": "EXECUTIVE", "description": "EXECUTIVE", "travel_class": "FIRST" }, "id": "TTES-PRODUCT-3-FIRST", "type": "products" }, { "attributes": { "code": "PRODUCT-9", "name": "BUSINESS AREA SILENZIO", "description": "BUSINESS AREA SILENZIO", "travel_class": "FIRST" }, "id": "TTES-PRODUCT-9-FIRST", "type": "products" }, { "attributes": { "code": "ADMISSION", "description": "Admission right to board the train", "title": "Admission", "category": "ADMISSION" }, "id": "SERVICE-TYPE-ADMISSION", "type": "service_types" }, { "attributes": { "code": "SEAT", "description": "A Seat is included and auto-selected", "title": "Seat", "category": "SEAT" }, "id": "SERVICE-TYPE-SEAT", "type": "service_types" }, { "attributes": { "age": 40 }, "id": "pax-40-1", "type": "passengers" }, { "attributes": { "code": "TTES", "booking_fee": 0, "legal_name": "Trenitalia S.p.A.", "trade_name": "Trenitalia Test", "markup_fee_percentage": 0.0 }, "id": "TTES", "type": "marketing_carriers", "relationships": { "passenger_types": { "data": [ { "id": "PNOS", "type": "passenger_types" }, { "id": "PCIL", "type": "passenger_types" } ] }, "fare_classes": { "data": [ { "id": "TTES-FARE-1", "type": "fare_classes" }, { "id": "TTES-FARE-13", "type": "fare_classes" }, { "id": "TTES-FARE-130", "type": "fare_classes" }, { "id": "TTES-FARE-132", "type": "fare_classes" }, { "id": "TTES-FARE-14", "type": "fare_classes" }, { "id": "TTES-FARE-141", "type": "fare_classes" }, { "id": "TTES-FARE-142", "type": "fare_classes" }, { "id": "TTES-FARE-143", "type": "fare_classes" }, { "id": "TTES-FARE-144", "type": "fare_classes" }, { "id": "TTES-FARE-145", "type": "fare_classes" }, { "id": "TTES-FARE-146", "type": "fare_classes" }, { "id": "TTES-FARE-147", "type": "fare_classes" }, { "id": "TTES-FARE-15", "type": "fare_classes" }, { "id": "TTES-FARE-153", "type": "fare_classes" }, { "id": "TTES-FARE-155", "type": "fare_classes" }, { "id": "TTES-FARE-156", "type": "fare_classes" }, { "id": "TTES-FARE-158", "type": "fare_classes" }, { "id": "TTES-FARE-16", "type": "fare_classes" }, { "id": "TTES-FARE-160", "type": "fare_classes" }, { "id": "TTES-FARE-168", "type": "fare_classes" }, { "id": "TTES-FARE-169", "type": "fare_classes" }, { "id": "TTES-FARE-17", "type": "fare_classes" }, { "id": "TTES-FARE-170", "type": "fare_classes" }, { "id": "TTES-FARE-171", "type": "fare_classes" }, { "id": "TTES-FARE-172", "type": "fare_classes" }, { "id": "TTES-FARE-173", "type": "fare_classes" }, { "id": "TTES-FARE-174", "type": "fare_classes" }, { "id": "TTES-FARE-18", "type": "fare_classes" }, { "id": "TTES-FARE-180", "type": "fare_classes" }, { "id": "TTES-FARE-182", "type": "fare_classes" }, { "id": "TTES-FARE-183", "type": "fare_classes" }, { "id": "TTES-FARE-185", "type": "fare_classes" }, { "id": "TTES-FARE-186", "type": "fare_classes" }, { "id": "TTES-FARE-188", "type": "fare_classes" }, { "id": "TTES-FARE-19", "type": "fare_classes" }, { "id": "TTES-FARE-191", "type": "fare_classes" }, { "id": "TTES-FARE-194", "type": "fare_classes" }, { "id": "TTES-FARE-195", "type": "fare_classes" }, { "id": "TTES-FARE-197", "type": "fare_classes" }, { "id": "TTES-FARE-20", "type": "fare_classes" }, { "id": "TTES-FARE-200", "type": "fare_classes" }, { "id": "TTES-FARE-203", "type": "fare_classes" }, { "id": "TTES-FARE-204", "type": "fare_classes" }, { "id": "TTES-FARE-208", "type": "fare_classes" }, { "id": "TTES-FARE-209", "type": "fare_classes" }, { "id": "TTES-FARE-210", "type": "fare_classes" }, { "id": "TTES-FARE-211", "type": "fare_classes" }, { "id": "TTES-FARE-214", "type": "fare_classes" }, { "id": "TTES-FARE-217", "type": "fare_classes" }, { "id": "TTES-FARE-219", "type": "fare_classes" }, { "id": "TTES-FARE-221", "type": "fare_classes" }, { "id": "TTES-FARE-223", "type": "fare_classes" }, { "id": "TTES-FARE-227", "type": "fare_classes" }, { "id": "TTES-FARE-228", "type": "fare_classes" }, { "id": "TTES-FARE-229", "type": "fare_classes" }, { "id": "TTES-FARE-230", "type": "fare_classes" }, { "id": "TTES-FARE-231", "type": "fare_classes" }, { "id": "TTES-FARE-232", "type": "fare_classes" }, { "id": "TTES-FARE-238", "type": "fare_classes" }, { "id": "TTES-FARE-240", "type": "fare_classes" }, { "id": "TTES-FARE-241", "type": "fare_classes" }, { "id": "TTES-FARE-242", "type": "fare_classes" }, { "id": "TTES-FARE-243", "type": "fare_classes" }, { "id": "TTES-FARE-248", "type": "fare_classes" }, { "id": "TTES-FARE-249", "type": "fare_classes" }, { "id": "TTES-FARE-25", "type": "fare_classes" }, { "id": "TTES-FARE-254", "type": "fare_classes" }, { "id": "TTES-FARE-255", "type": "fare_classes" }, { "id": "TTES-FARE-257", "type": "fare_classes" }, { "id": "TTES-FARE-260", "type": "fare_classes" }, { "id": "TTES-FARE-263", "type": "fare_classes" }, { "id": "TTES-FARE-264", "type": "fare_classes" }, { "id": "TTES-FARE-27", "type": "fare_classes" }, { "id": "TTES-FARE-270", "type": "fare_classes" }, { "id": "TTES-FARE-272", "type": "fare_classes" }, { "id": "TTES-FARE-273", "type": "fare_classes" }, { "id": "TTES-FARE-274", "type": "fare_classes" }, { "id": "TTES-FARE-275", "type": "fare_classes" }, { "id": "TTES-FARE-288", "type": "fare_classes" }, { "id": "TTES-FARE-29", "type": "fare_classes" }, { "id": "TTES-FARE-290", "type": "fare_classes" }, { "id": "TTES-FARE-296", "type": "fare_classes" }, { "id": "TTES-FARE-297", "type": "fare_classes" }, { "id": "TTES-FARE-298", "type": "fare_classes" }, { "id": "TTES-FARE-299", "type": "fare_classes" }, { "id": "TTES-FARE-3", "type": "fare_classes" }, { "id": "TTES-FARE-30", "type": "fare_classes" }, { "id": "TTES-FARE-300", "type": "fare_classes" }, { "id": "TTES-FARE-306", "type": "fare_classes" }, { "id": "TTES-FARE-308", "type": "fare_classes" }, { "id": "TTES-FARE-309", "type": "fare_classes" }, { "id": "TTES-FARE-310", "type": "fare_classes" }, { "id": "TTES-FARE-312", "type": "fare_classes" }, { "id": "TTES-FARE-318", "type": "fare_classes" }, { "id": "TTES-FARE-319", "type": "fare_classes" }, { "id": "TTES-FARE-32", "type": "fare_classes" }, { "id": "TTES-FARE-320", "type": "fare_classes" }, { "id": "TTES-FARE-321", "type": "fare_classes" }, { "id": "TTES-FARE-322", "type": "fare_classes" }, { "id": "TTES-FARE-328", "type": "fare_classes" }, { "id": "TTES-FARE-330", "type": "fare_classes" }, { "id": "TTES-FARE-331", "type": "fare_classes" }, { "id": "TTES-FARE-34", "type": "fare_classes" }, { "id": "TTES-FARE-356", "type": "fare_classes" }, { "id": "TTES-FARE-357", "type": "fare_classes" }, { "id": "TTES-FARE-358", "type": "fare_classes" }, { "id": "TTES-FARE-359", "type": "fare_classes" }, { "id": "TTES-FARE-360", "type": "fare_classes" }, { "id": "TTES-FARE-366", "type": "fare_classes" }, { "id": "TTES-FARE-367", "type": "fare_classes" }, { "id": "TTES-FARE-368", "type": "fare_classes" }, { "id": "TTES-FARE-369", "type": "fare_classes" }, { "id": "TTES-FARE-370", "type": "fare_classes" }, { "id": "TTES-FARE-371", "type": "fare_classes" }, { "id": "TTES-FARE-373", "type": "fare_classes" }, { "id": "TTES-FARE-38", "type": "fare_classes" }, { "id": "TTES-FARE-384", "type": "fare_classes" }, { "id": "TTES-FARE-385", "type": "fare_classes" }, { "id": "TTES-FARE-386", "type": "fare_classes" }, { "id": "TTES-FARE-387", "type": "fare_classes" }, { "id": "TTES-FARE-388", "type": "fare_classes" }, { "id": "TTES-FARE-39", "type": "fare_classes" }, { "id": "TTES-FARE-391", "type": "fare_classes" }, { "id": "TTES-FARE-393", "type": "fare_classes" }, { "id": "TTES-FARE-394", "type": "fare_classes" }, { "id": "TTES-FARE-40", "type": "fare_classes" }, { "id": "TTES-FARE-401", "type": "fare_classes" }, { "id": "TTES-FARE-407", "type": "fare_classes" }, { "id": "TTES-FARE-408", "type": "fare_classes" }, { "id": "TTES-FARE-41", "type": "fare_classes" }, { "id": "TTES-FARE-410", "type": "fare_classes" }, { "id": "TTES-FARE-411", "type": "fare_classes" }, { "id": "TTES-FARE-412", "type": "fare_classes" }, { "id": "TTES-FARE-413", "type": "fare_classes" }, { "id": "TTES-FARE-414", "type": "fare_classes" }, { "id": "TTES-FARE-415", "type": "fare_classes" }, { "id": "TTES-FARE-416", "type": "fare_classes" }, { "id": "TTES-FARE-417", "type": "fare_classes" }, { "id": "TTES-FARE-418", "type": "fare_classes" }, { "id": "TTES-FARE-419", "type": "fare_classes" }, { "id": "TTES-FARE-42", "type": "fare_classes" }, { "id": "TTES-FARE-420", "type": "fare_classes" }, { "id": "TTES-FARE-421", "type": "fare_classes" }, { "id": "TTES-FARE-422", "type": "fare_classes" }, { "id": "TTES-FARE-423", "type": "fare_classes" }, { "id": "TTES-FARE-425", "type": "fare_classes" }, { "id": "TTES-FARE-426", "type": "fare_classes" }, { "id": "TTES-FARE-427", "type": "fare_classes" }, { "id": "TTES-FARE-428", "type": "fare_classes" }, { "id": "TTES-FARE-429", "type": "fare_classes" }, { "id": "TTES-FARE-43", "type": "fare_classes" }, { "id": "TTES-FARE-430", "type": "fare_classes" }, { "id": "TTES-FARE-431", "type": "fare_classes" }, { "id": "TTES-FARE-432", "type": "fare_classes" }, { "id": "TTES-FARE-433", "type": "fare_classes" }, { "id": "TTES-FARE-434", "type": "fare_classes" }, { "id": "TTES-FARE-435", "type": "fare_classes" }, { "id": "TTES-FARE-436", "type": "fare_classes" }, { "id": "TTES-FARE-450", "type": "fare_classes" }, { "id": "TTES-FARE-451", "type": "fare_classes" }, { "id": "TTES-FARE-452", "type": "fare_classes" }, { "id": "TTES-FARE-453", "type": "fare_classes" }, { "id": "TTES-FARE-454", "type": "fare_classes" }, { "id": "TTES-FARE-49", "type": "fare_classes" }, { "id": "TTES-FARE-501", "type": "fare_classes" }, { "id": "TTES-FARE-502", "type": "fare_classes" }, { "id": "TTES-FARE-503", "type": "fare_classes" }, { "id": "TTES-FARE-504", "type": "fare_classes" }, { "id": "TTES-FARE-51", "type": "fare_classes" }, { "id": "TTES-FARE-52", "type": "fare_classes" }, { "id": "TTES-FARE-53", "type": "fare_classes" }, { "id": "TTES-FARE-55", "type": "fare_classes" }, { "id": "TTES-FARE-601", "type": "fare_classes" }, { "id": "TTES-FARE-602", "type": "fare_classes" }, { "id": "TTES-FARE-603", "type": "fare_classes" }, { "id": "TTES-FARE-604", "type": "fare_classes" }, { "id": "TTES-FARE-63", "type": "fare_classes" }, { "id": "TTES-FARE-64", "type": "fare_classes" }, { "id": "TTES-FARE-65", "type": "fare_classes" }, { "id": "TTES-FARE-66", "type": "fare_classes" }, { "id": "TTES-FARE-67", "type": "fare_classes" }, { "id": "TTES-FARE-701", "type": "fare_classes" }, { "id": "TTES-FARE-702", "type": "fare_classes" }, { "id": "TTES-FARE-703", "type": "fare_classes" }, { "id": "TTES-FARE-704", "type": "fare_classes" }, { "id": "TTES-FARE-705", "type": "fare_classes" }, { "id": "TTES-FARE-706", "type": "fare_classes" }, { "id": "TTES-FARE-707", "type": "fare_classes" }, { "id": "TTES-FARE-73", "type": "fare_classes" }, { "id": "TTES-FARE-75", "type": "fare_classes" }, { "id": "TTES-FARE-76", "type": "fare_classes" }, { "id": "TTES-FARE-77", "type": "fare_classes" }, { "id": "TTES-FARE-79", "type": "fare_classes" }, { "id": "TTES-FARE-84", "type": "fare_classes" }, { "id": "TTES-FARE-85", "type": "fare_classes" }, { "id": "TTES-FARE-86", "type": "fare_classes" }, { "id": "TTES-FARE-87", "type": "fare_classes" }, { "id": "TTES-FARE-88", "type": "fare_classes" }, { "id": "TTES-FARE-94", "type": "fare_classes" }, { "id": "TTES-FARE-96", "type": "fare_classes" }, { "id": "TTES-FARE-97", "type": "fare_classes" }, { "id": "TTES-FARE-98", "type": "fare_classes" }, { "id": "TTES-FARE-99", "type": "fare_classes" } ] }, "extra_types": { "data": [] } } }, { "attributes": { "code": "FREA", "legal_name": "Gruppo FS", "trade_name": "Frecciarossa 1000" }, "id": "FREA", "type": "operating_carriers" }, { "attributes": { "code": "FREC", "legal_name": "Gruppo FS", "trade_name": "Frecciarossa" }, "id": "FREC", "type": "operating_carriers" }, { "attributes": { "code": "PNOS", "name": "Adult", "description": "", "max_age": 99, "min_age": 12 }, "id": "PNOS", "type": "passenger_types" }, { "attributes": { "code": "PCIL", "name": "Child", "description": "", "max_age": 11, "min_age": 0 }, "id": "PCIL", "type": "passenger_types" }, { "attributes": { "code": "ITBLQBCB", "name": "Bologna Centrale Train Station", "description": "The train station is located on Piazza delle Medaglie d'Oro road.", "time_zone": "Europe/Rome", "latitude": 44.50593393302384, "longitude": 11.3433694142632, "street_and_number": "Piazza delle Medaglie d'Oro", "zip_code": "40121" }, "id": "ITBLQBCB", "type": "stations", "relationships": { "city": { "data": { "id": "ITBLQ", "type": "cities" } }, "area": { "data": { "id": "ITBLQBC", "type": "areas" } } } }, { "attributes": { "code": "ITGENGEZ", "name": "Genoa Piazza Principe Train Station", "description": null, "time_zone": "Europe/Rome", "latitude": 44.417507, "longitude": 8.922072, "street_and_number": "Salita della Provvidenza", "zip_code": "16135" }, "id": "ITGENGEZ", "type": "stations", "relationships": { "city": { "data": { "id": "ITGEN", "type": "cities" } }, "area": { "data": null } } }, { "attributes": { "code": "ITMILMIE", "name": "Milan Centrale Train Station", "description": null, "time_zone": "Europe/Rome", "latitude": 45.487143, "longitude": 9.204828, "street_and_number": "Milano", "zip_code": "20124" }, "id": "ITMILMIE", "type": "stations", "relationships": { "city": { "data": { "id": "ITMIL", "type": "cities" } }, "area": { "data": { "id": "ITMILMM", "type": "areas" } } } }, { "attributes": { "code": "ITBLQ", "name": "Bologna" }, "id": "ITBLQ", "type": "cities" }, { "attributes": { "code": "ITGEN", "name": "Genoa" }, "id": "ITGEN", "type": "cities" }, { "attributes": { "code": "ITMIL", "name": "Milan" }, "id": "ITMIL", "type": "cities" }, { "attributes": { "code": "ITBLQBC", "name": "Bologna Central Train Station" }, "id": "ITBLQBC", "type": "areas" }, { "attributes": { "code": "ITMILMM", "name": "Milan Central Train Station" }, "id": "ITMILMM", "type": "areas" }, { "attributes": { "code": "FARE-1", "name": "BASE - 1st class", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-1", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-ACON", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-13", "name": "BASE - Executive", "journey_type": "single", "iata_category": "First Class" }, "id": "TTES-FARE-13", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-ACON", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-DRNN", "type": "fare_features" }, { "id": "TTES-LOUN", "type": "fare_features" }, { "id": "TTES-MAGA", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-130", "name": "ECONOMY - 1st class", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-130", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-132", "name": "ECONOMY - 2nd Class", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-132", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-14", "name": "BASE - Executive Area Meeting", "journey_type": "single", "iata_category": "First Class" }, "id": "TTES-FARE-14", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-ACON", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-DRNN", "type": "fare_features" }, { "id": "TTES-LOUN", "type": "fare_features" }, { "id": "TTES-MAGA", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-141", "name": "ECONOMY - Executive", "journey_type": "single", "iata_category": "First Class" }, "id": "TTES-FARE-141", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-ACON", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-DRNN", "type": "fare_features" }, { "id": "TTES-LOUN", "type": "fare_features" }, { "id": "TTES-MAGA", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-142", "name": "ECONOMY - Business", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-142", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-143", "name": "ECONOMY - Business Area Silenzio", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-143", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-144", "name": "ECONOMY - Premium", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-144", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-ASEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-145", "name": "ECONOMY - Standard", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-145", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-146", "name": "ECONOMY - Standard Area Silenzio", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-146", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-147", "name": "ECONOMY - Business Salottino", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-147", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-15", "name": "BASE - Business", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-15", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-ACON", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-153", "name": "ECONOMY - 1st class Silenzio", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-153", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-155", "name": "ECONOMY - 2nd Class Famiglia", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-155", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-156", "name": "ECONOMY - 1st Class Business", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-156", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-158", "name": "SUPER ECONOMY - 1st class", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-158", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-16", "name": "BASE - Business Area Silenzio", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-16", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-ACON", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-160", "name": "SUPER ECONOMY - 2nd Class", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-160", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-168", "name": "SUPER ECONOMY - Executive", "journey_type": "single", "iata_category": "First Class" }, "id": "TTES-FARE-168", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-DRNN", "type": "fare_features" }, { "id": "TTES-LOUN", "type": "fare_features" }, { "id": "TTES-MAGA", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-169", "name": "SUPER ECONOMY - Business", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-169", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-17", "name": "BASE - Premium", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-17", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-ACON", "type": "fare_features" }, { "id": "TTES-ASEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-170", "name": "SUPER ECONOMY - Business Area Silenzio", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-170", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-171", "name": "SUPER ECONOMY - Premium", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-171", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-ASEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-172", "name": "SUPER ECONOMY - Standard", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-172", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-173", "name": "SUPER ECONOMY - Standard Area Silenzio", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-173", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-174", "name": "SUPER ECONOMY - Business Salottino", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-174", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-18", "name": "BASE - Standard", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-18", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-ACON", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-180", "name": "SUPER ECONOMY - 1st class Silenzio", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-180", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-182", "name": "SUPER ECONOMY - 2nd Class Famiglia", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-182", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-183", "name": "SUPER ECONOMY - 1st Class Business", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-183", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-185", "name": "CHILD - 1st class", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-185", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-AMEN", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-186", "name": "CHILD - 2nd Class", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-186", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-AMEN", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-188", "name": "CHILD - 1st class Silenzio", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-188", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-19", "name": "BASE - Standard Area Silenzio", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-19", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-ACON", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-191", "name": "CHILD - 1st Class Business", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-191", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-194", "name": "STANDARD - 1st class", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-194", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-195", "name": "STANDARD - 2nd Class", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-195", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-197", "name": "STANDARD - 1st class Silenzio", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-197", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-20", "name": "BASE - Business Salottino", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-20", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-ACON", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-200", "name": "STANDARD - 1st Class Business", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-200", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-203", "name": "NOTTE_AV - 1st class", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-203", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-204", "name": "NOTTE_AV - 2nd Class", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-204", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-208", "name": "NOTTE_AV - Business", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-208", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-209", "name": "NOTTE_AV - Business Area Silenzio", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-209", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-210", "name": "NOTTE_AV - Standard", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-210", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-211", "name": "NOTTE_AV - Standard Area Silenzio", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-211", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-214", "name": "NOTTE_AV - Premium", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-214", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-ASEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-217", "name": "NOTTE_AV - 1st class Silenzio", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-217", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-219", "name": "NOTTE_AV - 2nd Class Famiglia", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-219", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-221", "name": "A/R WEEKEND - 1st class", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-221", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-223", "name": "A/R WEEKEND - 2nd Class", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-223", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-227", "name": "A/R WEEKEND - Executive", "journey_type": "single", "iata_category": "First Class" }, "id": "TTES-FARE-227", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-DRNN", "type": "fare_features" }, { "id": "TTES-LOUN", "type": "fare_features" }, { "id": "TTES-MAGA", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-228", "name": "A/R WEEKEND - Business", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-228", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-229", "name": "A/R WEEKEND - Business Area Silenzio", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-229", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-230", "name": "A/R WEEKEND - Premium", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-230", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-ASEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-231", "name": "A/R WEEKEND - Standard", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-231", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-232", "name": "A/R WEEKEND - Standard Area Silenzio", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-232", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-238", "name": "A/R WEEKEND - 1st class Silenzio", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-238", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-240", "name": "A/R WEEKEND - 2nd Class Famiglia", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-240", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-241", "name": "A/R WEEKEND - 1st Class Business", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-241", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-242", "name": "FLEXI - 1st class", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-242", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-243", "name": "FLEXI - 2nd Class", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-243", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-248", "name": "SMART - 1st class", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-248", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-249", "name": "SMART - 2nd Class", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-249", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-25", "name": "BASE - Servizio Notte", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-25", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-ACON", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-254", "name": "SMART - 1st class", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-254", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-255", "name": "SMART - 2nd Class", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-255", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-257", "name": "SMART - 1st class Silenzio", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-257", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-260", "name": "SMART - 1st Class Business", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-260", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-263", "name": "YOUNG - 1st class", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-263", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-264", "name": "YOUNG - 2nd Class", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-264", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-27", "name": "BASE - 1st class Silenzio", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-27", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-ACON", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-270", "name": "YOUNG - 1st class Silenzio", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-270", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-ACON", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-272", "name": "YOUNG - 2nd Class Famiglia", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-272", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-273", "name": "YOUNG - 1st Class Business", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-273", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-274", "name": "JUNIOR - 1st class", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-274", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-275", "name": "JUNIOR - 2nd Class", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-275", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-288", "name": "SENIOR - 1st class", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-288", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-29", "name": "BASE - 2nd Class Famiglia", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-29", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-ACON", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-290", "name": "SENIOR - 2nd Class", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-290", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-296", "name": "SENIOR - Business", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-296", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-297", "name": "SENIOR - Business Area Silenzio", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-297", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-298", "name": "SENIOR - Premium", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-298", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-ASEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-299", "name": "SENIOR - Standard", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-299", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-3", "name": "BASE - 2nd Class", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-3", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-ACON", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-30", "name": "BASE - 1st Class Business", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-30", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-ACON", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-300", "name": "SENIOR - Standard Area Silenzio", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-300", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-306", "name": "SENIOR - 1st class Silenzio", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-306", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-308", "name": "SENIOR - 2nd Class Famiglia", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-308", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-309", "name": "SENIOR - 1st Class Business", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-309", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-310", "name": "ME&YOU - 1st class", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-310", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-312", "name": "ME&YOU - 2nd Class", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-312", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-318", "name": "ME&YOU - Business", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-318", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-319", "name": "ME&YOU - Business Area Silenzio", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-319", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-32", "name": "A/R IN GIORNATA - 1st class", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-32", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-320", "name": "ME&YOU - Premium", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-320", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-ASEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-321", "name": "ME&YOU - Standard", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-321", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-322", "name": "ME&YOU - Standard Area Silenzio", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-322", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-328", "name": "ME&YOU - 1st class Silenzio", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-328", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-330", "name": "ME&YOU - 2nd Class Famiglia", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-330", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-331", "name": "ME&YOU - 1st Class Business", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-331", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-34", "name": "A/R IN GIORNATA - 2nd Class", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-34", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-356", "name": "SERENITA - Executive", "journey_type": "single", "iata_category": "First Class" }, "id": "TTES-FARE-356", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-DRNN", "type": "fare_features" }, { "id": "TTES-LOUN", "type": "fare_features" }, { "id": "TTES-MAGA", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-357", "name": "SERENITA - Business Area Silenzio", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-357", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-358", "name": "SERENITA - Business Allegro", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-358", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-359", "name": "SERENITA - Standard Area Silenzio", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-359", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-360", "name": "SERENITA - Standard Alegro", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-360", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-366", "name": "SPECIALE AV NOTTE - Business", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-366", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-367", "name": "SPECIALE AV NOTTE - Business Area Silenzio", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-367", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-368", "name": "SPECIALE AV NOTTE - Premium", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-368", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-ASEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-369", "name": "SPECIALE AV NOTTE - Standard", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-369", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-370", "name": "SPECIALE AV NOTTE - Standard Area Silenzio", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-370", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-371", "name": "INSIEME - 1st class", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-371", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-373", "name": "INSIEME - 2nd Class", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-373", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-38", "name": "A/R IN GIORNATA - Executive", "journey_type": "single", "iata_category": "First Class" }, "id": "TTES-FARE-38", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-DRNN", "type": "fare_features" }, { "id": "TTES-LOUN", "type": "fare_features" }, { "id": "TTES-MAGA", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-384", "name": "INSIEME - Standard", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-384", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-385", "name": "INSIEME - Standard Area Silenzio", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-385", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-386", "name": "INSIEME - Business", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-386", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-387", "name": "INSIEME - Business Area Silenzio", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-387", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-388", "name": "INSIEME - Premium", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-388", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-ASEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-39", "name": "A/R IN GIORNATA - Business", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-39", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-391", "name": "INSIEME - 1st class Silenzio", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-391", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-393", "name": "INSIEME - 2nd Class Famiglia", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-393", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-394", "name": "INSIEME - 1st Class Business", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-394", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-40", "name": "A/R IN GIORNATA - Business Area Silenzio", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-40", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-401", "name": "YOUNG - Standard", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-401", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-407", "name": "FRECCIAYOUNG - 2nd Class", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-407", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-408", "name": "FRECCIAYOUNG - Standard", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-408", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-41", "name": "A/R IN GIORNATA - Premium", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-41", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-ASEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-410", "name": "FRECCIAYOUNG - Standard Area Silenzio", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-410", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-411", "name": "SMART2 - 1st class", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-411", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" }, { "id": "TTES-AMEN", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-412", "name": "SMART2 - 2nd class", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-412", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" }, { "id": "TTES-AMEN", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-413", "name": "FrecciaDAYS - Standard", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-413", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" }, { "id": "TTES-NAME", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-414", "name": "FrecciaDAYS - Premium", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-414", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-ASEA", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-NAME", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-415", "name": "FrecciaDAYS - Business", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-415", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-NAME", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-416", "name": "FrecciaDAYS - Business Area Silenzio", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-416", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-ASEA", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-NAME", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-417", "name": "FRECCIA 2x1 - 1st class", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-417", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ACON", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-AMEN", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-418", "name": "FRECCIA 2x1 - 2nd Class", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-418", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-ACON", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" }, { "id": "TTES-AMEN", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-419", "name": "FRECCIA 2x1 - Standard", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-419", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-ACON", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" }, { "id": "TTES-AMEN", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-42", "name": "A/R IN GIORNATA - Standard", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-42", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-420", "name": "FRECCIA 2x1 - Business", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-420", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-NAME", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-421", "name": "FRECCIA 2x1 - Premium", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-421", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-ASEA", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-AMEN", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-422", "name": "ORDINARIA - Posto 1ª Classe", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-422", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-AMEN", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-423", "name": "ORDINARIA - Posto 2ª Classe", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-423", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-AMEN", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-425", "name": "FRECCIAFAMILY - Standard", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-425", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-ACON", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-426", "name": "FRECCIAFAMILY - Business", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-426", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ACON", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-427", "name": "FRECCIAFAMILY - Premium", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-427", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-ASEA", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-ACON", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-428", "name": "FRECCIAFAMILY - Business Area Silenzio", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-428", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ACON", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-429", "name": "FRECCIAFRIENDS - Standard", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-429", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" }, { "id": "TTES-ACON", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-43", "name": "A/R IN GIORNATA - Standard Area Silenzio", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-43", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-430", "name": "FRECCIAFRIENDS - Business", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-430", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-ACON", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-431", "name": "FRECCIAFRIENDS - Premium", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-431", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-ASEA", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-ACON", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-432", "name": "FRECCIAFAMILY - Business Salottino", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-432", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-ACON", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" }, { "id": "TTES-AMEN", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-433", "name": "FRECCIAFAMILY - Executive", "journey_type": "single", "iata_category": "First Class" }, "id": "TTES-FARE-433", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-ACON", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" }, { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-LOUN", "type": "fare_features" }, { "id": "TTES-MAGA", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-434", "name": "FRECCIAFRIENDS - Business Salottino", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-434", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-ACON", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" }, { "id": "TTES-NAME", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-435", "name": "FRECCIAFRIENDS - Executive", "journey_type": "single", "iata_category": "First Class" }, "id": "TTES-FARE-435", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-ACON", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" }, { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-LOUN", "type": "fare_features" }, { "id": "TTES-MAGA", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-436", "name": "FRECCIAFRIENDS - 2nd Class", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-436", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-450", "name": "BASE - Cuccetta Comfort 4 posti - Promiscuo", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-450", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-451", "name": "SUPER ECONOMY - Cuccetta Comfort 4 posti - Promiscuo", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-451", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-452", "name": "ECONOMY - Cuccetta Comfort 4 posti - Promiscuo", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-452", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-453", "name": "BASE - Cuccetta Comfort 4 posti - Donna", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-453", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-WOMO", "type": "fare_features" }, { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-454", "name": "BASE - Vagone Letto Relax Uso Singolo - Cabina Intera", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-454", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-49", "name": "A/R IN GIORNATA - 1st class Silenzio", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-49", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-501", "name": "FRECCIASENIOR- Standard", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-501", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" }, { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-502", "name": "FRECCIASENIOR - Premium", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-502", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-ASEA", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-NAME", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-503", "name": "FRECCIASENIOR - Business", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-503", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-NAME", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-504", "name": "FRECCIASENIOR- Business Area Silenzio", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-504", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-ASEA", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-NAME", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-51", "name": "A/R IN GIORNATA - 2nd Class Famiglia", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-51", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-52", "name": "A/R IN GIORNATA - 1st Class Business", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-52", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-53", "name": "FAMIGLIA 20% - 1st class", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-53", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-55", "name": "FAMIGLIA 20% - 2nd Class", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-55", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-601", "name": "SALA MEETING 2 PAX", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-601", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-602", "name": "SALA MEETING 3 PAX", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-602", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-603", "name": "SALA MEETING 4 PAX", "journey_type": "single", "iata_category": "First Class" }, "id": "TTES-FARE-603", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-604", "name": "SALA MEETING 5 PAX", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-604", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-63", "name": "FAMIGLIA 20% - Business", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-63", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-64", "name": "FAMIGLIA 20% - Business Area Silenzio", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-64", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-65", "name": "FAMIGLIA 20% - Premium", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-65", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-ASEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-66", "name": "FAMIGLIA 20% - Standard", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-66", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-67", "name": "FAMIGLIA 20% - Standard Area Silenzio", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-67", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-701", "name": "BASE - 2nd Class Easy", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-701", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-702", "name": "BASE - 1st Class Plus", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-702", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-703", "name": "ECONOMY - 2nd Class Easy", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-703", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-704", "name": "ECONOMY - 1st Class Plus", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-704", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-705", "name": "SUPER ECONOMY - 2nd Class Easy", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-705", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-706", "name": "SUPER ECONOMY - 1st Class Plus", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-706", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-NAME", "type": "fare_features" }, { "id": "TTES-NREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-707", "name": "Biglietto Singolo - 2nd Class", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-707", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-ACON", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-73", "name": "FAMIGLIA 20% - 1st class Silenzio", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-73", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-75", "name": "FAMIGLIA 20% - 2nd Class Famiglia", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-75", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-76", "name": "FAMIGLIA 20% - 1st Class Business", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-76", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-77", "name": "BIMBI GRATIS - 1st class", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-77", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-79", "name": "BIMBI GRATIS - 2nd Class", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-79", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-84", "name": "BIMBI GRATIS - Business", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-84", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-85", "name": "BIMBI GRATIS - Business Area Silenzio", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-85", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-86", "name": "BIMBI GRATIS - Premium", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-86", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-ASEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-87", "name": "BIMBI GRATIS - Standard", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-87", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-88", "name": "BIMBI GRATIS - Standard Area Silenzio", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-88", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-94", "name": "BIMBI GRATIS - 1st class Silenzio", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-94", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" }, { "id": "TTES-QCOM", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-96", "name": "BIMBI GRATIS - 2nd Class Famiglia", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-96", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-97", "name": "BIMBI GRATIS - 1st Class Business", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-97", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-RARM", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-WIFI", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" }, { "id": "TTES-REST", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-98", "name": "ORDINARIA - 1st class", "journey_type": "single", "iata_category": "Business Class" }, "id": "TTES-FARE-98", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-ALRO", "type": "fare_features" }, { "id": "TTES-WSEA", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-SNAN", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-99", "name": "ORDINARIA - 2nd Class", "journey_type": "single", "iata_category": "Economy Class" }, "id": "TTES-FARE-99", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "TTES-AMEN", "type": "fare_features" }, { "id": "TTES-PREF", "type": "fare_features" }, { "id": "TTES-PSOC", "type": "fare_features" }, { "id": "TTES-SNAC", "type": "fare_features" } ] } } }, { "attributes": { "code": "ACON", "name": "Air Conditioning", "description": "The train has a cooling ventilation." }, "id": "TTES-ACON", "type": "fare_features" }, { "attributes": { "code": "ALRO", "name": "Additional Leg Room", "description": "The seat has additional leg space." }, "id": "TTES-ALRO", "type": "fare_features" }, { "attributes": { "code": "AMEN", "name": "Amendable", "description": "The ticket is amendable. For further details, refer to https://www.trenitalia.com/en/html/trenitalia/Info_Tariffe_en_LeFrecce.html" }, "id": "TTES-AMEN", "type": "fare_features" }, { "attributes": { "code": "ASEA", "name": "Adjustable seats", "description": "Seats can be easily adjustable." }, "id": "TTES-ASEA", "type": "fare_features" }, { "attributes": { "code": "DRNN", "name": "Drinks included", "description": "Drinks included" }, "id": "TTES-DRNN", "type": "fare_features" }, { "attributes": { "code": "LOUN", "name": "Lounge access included", "description": "Lounge access included" }, "id": "TTES-LOUN", "type": "fare_features" }, { "attributes": { "code": "MAGA", "name": "Magazines", "description": "Magazines are available on board." }, "id": "TTES-MAGA", "type": "fare_features" }, { "attributes": { "code": "NAME", "name": "Non-amendable", "description": "The ticket is not amendable. For further details, refer to https://www.trenitalia.com/en/html/trenitalia/Info_Tariffe_en_LeFrecce.html" }, "id": "TTES-NAME", "type": "fare_features" }, { "attributes": { "code": "NREF", "name": "Non-refundable", "description": "The ticket cannot be refunded." }, "id": "TTES-NREF", "type": "fare_features" }, { "attributes": { "code": "PREF", "name": "Partially refundable", "description": "The ticket can be cancelled and partially refunded. For further details, refer to https://www.trenitalia.com/en/html/trenitalia/Info_Tariffe_en_LeFrecce.htm" }, "id": "TTES-PREF", "type": "fare_features" }, { "attributes": { "code": "PSOC", "name": "Power Socket", "description": "Power supply is available at every seat." }, "id": "TTES-PSOC", "type": "fare_features" }, { "attributes": { "code": "QCOM", "name": "Quiet compartment", "description": "More privacy in a separate section." }, "id": "TTES-QCOM", "type": "fare_features" }, { "attributes": { "code": "RARM", "name": "Reclining armchairs", "description": "Comfortable armchairs are available on board." }, "id": "TTES-RARM", "type": "fare_features" }, { "attributes": { "code": "REST", "name": "Restaurant available on board", "description": "Restaurant available on board" }, "id": "TTES-REST", "type": "fare_features" }, { "attributes": { "code": "SNAC", "name": "Snacks", "description": "Snacks are available on board." }, "id": "TTES-SNAC", "type": "fare_features" }, { "attributes": { "code": "SNAN", "name": "Snacks included", "description": "Snacks included" }, "id": "TTES-SNAN", "type": "fare_features" }, { "attributes": { "code": "WIFI", "name": "Wifi", "description": "Free wifi is available on board." }, "id": "TTES-WIFI", "type": "fare_features" }, { "attributes": { "code": "WOMO", "name": "Women-only", "description": "Compartment or area exclusively for women" }, "id": "TTES-WOMO", "type": "fare_features" }, { "attributes": { "code": "WSEA", "name": "Wider seats", "description": "Wider seats on the board." }, "id": "TTES-WSEA", "type": "fare_features" } ], "jsonapi": { "version": "1.0" } } • [Checking Price & Vacancy](https://docs.distribusion.com/dt/api/basic-integration/checking-price-and-vacancy.md): Once the user has selected a specific trip and proceeds to the checkout page on your platform, the next step is to call the /connections/vacancy endpoint. This step is important to: Ensure that the price returned at the time of search is still accurate before sending the user to the checkout page. Retrieve ancillary options for the selected trip and fare (more information can be found in the Ancillaries guide). We recommend that this request to /connections/vacancy is placed right after the user selects a specific departure from the search results page and before the user lands on the checkout page to enter their customer details. Important Update for Existing Partners: The /connections/vacancy endpoint has been streamlined as part of our new Offers API flow. It is now a POST request that uses the offer_id generated in the search step, eliminating the need to re-send explicit trip details (like carrier, stations, and times). For information about our new flow please check the New Offers Flow Explained guide for a step-by-step walkthrough of the changes. Making a Vacancy Request The vacancy request must include the offer_id captured from the /connections/find response for each bound as the minimum required field, for instance "offer_id": "0d76170a-fcc3-4942-8370-499cc9f12a8f|0" . This id includes all the information about the connection, fare, currency and other detais selected by the user for the further flow. Besides that, each passenger included in the search from /connections/find should be mapped to a corresponding passenger_types supported by the carrier and include their respective passenger_ids . For instance, a 33 years-old passenger corresponds to a PNOS passenger type with SNCF. And in the respose from the /connections/find this passenger is identified as pax-33-1 . For more details on how to handle passenger mapping please check our Passenger Types guide . JSON { "locale": "en", "currency": "EUR", "offers": [ { "id": "cfe63acc-07eb-4463-9a88-b035c935f032|0", "passenger_ids": [ "pax-40-1" ] } ], "passengers": [ { "id": "pax-40-1", "type": "PNOS", "pax": 1 } ] } Reading Price & Vacancy Response There are 3 possible outcomes in the response from /connections/vacancy : Price remains the same + vacancy ( vacant = true ): In this case, the user should be moved to the next step of the flow without restrictions. Price changes + vacancy ( vacant = true ): In this case, we recommend to alert the user that the price has changed and allow them to continue the flow. No vacancy ( vacant = false ): In this case, inform the user that the departure selected is not available and move them to the search results page to select another departure. Return Trips In the case of a return trip, please add the offer_id 's from the offers selected for each bound. This means that the /connections/vacancy request will include two offer_id values for a return journey. Required Fields for Creating a Reservation The response from the /connections/vacancy endpoint outlines which passenger fields are required or optional for the /reservations/create and /reservations/confirm request. You should store this data to dynamically show the required fields when creating a reservation . The following shows an example: JSON { "id": "PYPO-2-1764170649", "type": "passengers", "relationships": { "required_attributes": { "data": [ { "id": "4dabd987-f87e-422e-9187-0c6988d5b1d8", "type": "passenger_required_attributes" }, { "id": "86f0b1e6-ddb9-4078-a08b-c77df8df8c53", "type": "passenger_required_attributes" } ] } } }, { "id": "e94d9f32-ed2b-4432-b27e-b93179d3b850", "type": "passenger_required_attributes", "attributes": { "mandatory": [ "birthdate", "first_name", "last_name" ], "endpoint": "reservations/create", "internal_source": true } }, { "id": "0b18608d-5371-4640-a6f3-62a1722726b3", "type": "passenger_required_attributes", "attributes": { "mandatory": [ "birthdate", "first_name", "last_name" ], "endpoint": "reservations/confirm", "internal_source": true } }, { "id": "4dabd987-f87e-422e-9187-0c6988d5b1d8", "type": "passenger_required_attributes", "attributes": { "mandatory": [ "birthdate", "first_name", "last_name" ], "endpoint": "reservations/create", "internal_source": true } }, { "id": "86f0b1e6-ddb9-4078-a08b-c77df8df8c53", "type": "passenger_required_attributes", "attributes": { "mandatory": [ "birthdate", "first_name", "last_name" ], "endpoint": "reservations/confirm", "internal_source": true } }, { "id": "3f38d969-3893-42c5-9b75-70e5b18655e3", "type": "required_attributes", "attributes": { "mandatory": [ "email" ], "endpoint": "reservations/create" } }, { "id": "cf75d8ec-0256-451d-a1da-1bac65a8187a", "type": "required_attributes", "attributes": { "mandatory": [ "email", "first_name", "last_name", "terms_accepted" ], "endpoint": "reservations/confirm" } } ] } For more details check our Dynamic Passenger Fields guide . Best Practices Implement the /connections/vacancy endpoint : It might seem redundant to call the /connections/vacancy endpoint mentioned in this step, but note that the content from the /connections/find endpoint could be cached or the price may have changed while the user has selected the desired connection. Read the price from the response : It is important to read the price from the /connections/vacancy response and display the value to the user in the the following steps, to ensure the user is presented with the most updated price for the trip. After the reservation is created, the price should be taken from the response of the reservations/create response. Take note of dummy prices in demo environment : When you use EUR as your currency for the request the price returned from /connections/vacancy will always show the value of 2500. This price is in cents, so when decimals are added the final price equals to €25.00. For other currencies it will be the equivalent amount e.g. ca. 2768 USD, 2106 GBP etc. This rule applies for all carriers and all fares in the demo environment. Remove trips with no vacancy from the search results : In case the response from the /connections/vacancy request shows vacant = false , when you move the user back to the search results page we recommend that you remove the departure from the list to prevent them from choosing it again. Enterprise Features With the response of the vacancy request, you are also also able to present the list of ancillaries available to for booking for the user. For more information and to request activation of this functionality, please refer to the Ancillaries section. Moreover, If any discount or loyalty cards are applied as part of the flow, they can be added to /connections/vacancy request and will affect the price that appears in the response. The details of the cards applied also appear at the bottom of the response. For more details, check our guide on Discount Cards . Next Step After confirming price and vacancy, move the user to select a seat (in case you implement this step) or if seat selection is not implemented, right at the time of sending the user to the checkout page create a reservation with the specified trip and passenger details. API Examples Sample Request to /connections/vacancy JSON { "locale": "en", "currency": "EUR", "offers": [ { "id": "cfe63acc-07eb-4463-9a88-b035c935f032|0", "passenger_ids": [ "pax-40-1" ] } ], "passengers": [ { "id": "pax-40-1", "type": "PNOS", "pax": 1 } ] } Sample Response from /connections/vacancy JSON { "data": { "id": "TTES-FRPARPRG-FRMRSMBU-2026-03-16T11:11-2026-03-16T14:48", "type": "vacancies", "attributes": { "vacant": true, "total_price": 25000, "original_price": 25000 }, "relationships": { "agent": { "data": null }, "customer": { "data": null }, "applied_cards": { "data": [] }, "fees": { "data": [] }, "ancillary_options": { "data": [] }, "connection_passengers": { "data": [ { "id": "PNOS-1-1773652361", "type": "passengers" } ] }, "required_attributes": { "data": [ { "id": "672d1a59-7aae-4f90-8bfb-ac36cfa1c1cc", "type": "required_attributes" }, { "id": "f7bfb798-4a77-4951-b0ac-20c5f9cf0e59", "type": "required_attributes" } ] } } }, "jsonapi": { "version": "1.0" }, "meta": { "currency": "EUR" }, "included": [ { "id": "PNOS-1-1773652361", "type": "passengers", "relationships": { "required_attributes": { "data": [ { "id": "3299dace-c4d9-4de2-9fe4-bd207f15eab8", "type": "passenger_required_attributes" }, { "id": "c285453d-c9da-41ef-b9ed-6bca88738368", "type": "passenger_required_attributes" } ] } } }, { "id": "3299dace-c4d9-4de2-9fe4-bd207f15eab8", "type": "passenger_required_attributes", "attributes": { "mandatory": [], "endpoint": "reservations/create" } }, { "id": "c285453d-c9da-41ef-b9ed-6bca88738368", "type": "passenger_required_attributes", "attributes": { "mandatory": [ "first_name", "last_name" ], "endpoint": "reservations/confirm", "internal_source": true } }, { "id": "672d1a59-7aae-4f90-8bfb-ac36cfa1c1cc", "type": "required_attributes", "attributes": { "mandatory": [], "endpoint": "reservations/create" } }, { "id": "f7bfb798-4a77-4951-b0ac-20c5f9cf0e59", "type": "required_attributes", "attributes": { "mandatory": [ "email", "first_name", "last_name", "terms_accepted" ], "endpoint": "reservations/confirm" } } ] } • [Creating a Reservation](https://docs.distribusion.com/dt/api/basic-integration/creating-reservation.md): Once the price and vacancy of the trip selected by the user is confirmed (and seats/ancillaries have been added to the basket) the next step is to call the /reservations/create endpoint to create a reservation. A reservation is a temporary block of a place on the ride that ensures seat availability at the moment of purchase (confirmation). Reservations hold for 10 minutes in general, and, if not confirmed will be automatically cancelled. It is important to note that even if you have implemented the reservations workflow, your integration will still work with carriers that do not support reservations in their own system. The flow will work in a standardised way in the API, while the reservation itself is simulated. Reservations are a helpful tool to ensure that the customer retains their booking and seat throughout the checkout process. Without a reservation, it is possible that while the user is buying their ticket their bus or seat could be booked out, resulting in the user losing their trip. Important Update for Existing Partners: The payload for /reservations/create has been significantly simplified under our new Offers API flow . You no longer need to send redundant trip details (carrier, stations, fare classes) in the root of the payload; you now simply pass the verified offer_id and passenger mapping. For information about our new flow please check the New Offers Flow Explained guide for a step-by-step walkthrough of the changes. Making a Reservation Request In principle the reservation request can be simply requested by using the offer_id as the minimum required field. This id includes all the information about the connection, fare, passenger, currency constellation for the further flow. JSON { "offers": [ { "id": "a6e62c29-7141-48f1-af5f-0e829f69e5a1|0" } ] } Note that most carriers require passenger details only in the /reservations/confirm request, but there are a few that require some details to be included as part of the /reservations/create request. This information is available from the /connections/vacancy endpoint. For more details check our Dynamic Passenger Fields guide . When these are required by the carrier for the /reservations/create request, you must include these details in your request. JSON { "email": "john.smith@email.com", "offers": [ { "id": "a6e62c29-7141-48f1-af5f-0e829f69e5a1|0" } ], "passengers": [ { "type": "PNOS", "id": "pax-33-1", "first_name": "John", "last_name": "Smith", "birthdate": "1997-10-22" }, { "type": "PNOS", "id": "pax-11-2", "first_name": "Ana", "last_name": "Smith", "birthdate": "1997-10-22" } ] } Defining Passenger Type When searching for trips you can include the exact age of each passenger. However, in the request to create a reservation you must match the age of the passenger to the passenger type as defined by the carrier and included the passenger ID, the same way as done with the /connections/vacancy request. To understand more about it check our Passenger Type guide . Return Trips In the case of a return trip, please add the offer_id 's from the offers selected for each bound. This means that the /reservations/create request will include two offer_id values for a return journey. Adding Seats When creating a reservation, you can include specific seat selections for your passengers by adding a seat_selections array to your request. Seats can either be included in the main standalone offer for free, or they can come with a fee requiring a separate add-on offer . For each seat, you must provide the segment_id , the passenger_id , and the exact seat_id retrieved from the availability response. For full request payloads and detailed instructions on both free and paid seat scenarios, please refer to our comprehensive guide on Selecting Seats . Reading Expiration Time The typical reservation duration is set at 10 minutes, however some carriers can hold it for a few hours or even days (such as SNCF). The expires_at parameter indicates until when a certain reservation is valid and can be confirmed. Some carriers do not support the reservation flow in their own system. While the API workflow works in exactly the same way, the response shows the value expires_at = null . This means that in reality, the availability and seats are not reserved in the carrier's system and in this scenario we recommend to set the value to 10 minutes to match the default of most carriers to keep the flow consistent to the user. Best Practices Cancel the reservation when the user aborts the flow : If the checkout is aborted by the user by clicking on a cancel button or by moving back to the search results page, it is recommended to cancel the reservation to avoid blocking seats. This can be done from the /reservation/cancel endpoint. Read the price from the response : It is important to read the price from the /reservations/create response and display the value to the user in the the following steps, to ensure the user is presented with the most updated price for the trip. Read the list of required booking fields : Read the info in the /connections/vacancy response and check our Dynamic Passenger Fields guide . We recommend that you store this data to dynamically show the required fields when creating a reservation. Enterprise Features Before a reservation is created you can allow users to book additional ancillaries. For more details, check our guide on Ancillaries . If any discount cards are applied as part of the flow, they can be added to the /reservations/create request and will affect the price that appears in the response. The details of the cards applied also appear in the response. For more details, check our guide on Discount Cards . Next Step If the reservation is created successfully, the user can proceed to the checkout page to complete their details and payment, where the reservation can be confirmed . API Examples Sample Request to /reservations/create JSON { "email": "john.smith@email.com", "offers": [ { "id": "a6e62c29-7141-48f1-af5f-0e829f69e5a1|0" } ], "passengers": [ { "type": "PNOS", "id": "pax-33-1", "first_name": "John", "last_name": "Smith", "birthdate": "1997-10-22" }, { "type": "PNOS", "id": "pax-11-2", "first_name": "Ana", "last_name": "Smith", "birthdate": "1997-10-22" } ] } Sample Response from /reservations/create JSON { "data": { "id": "RBA643P7", "type": "reservations", "attributes": { "total_price": 9200, "original_price": 9200, "state": "created", "created_at": "2025-11-28T16:55", "confirmed_at": null, "cancelled_at": null, "failed_at": null, "processing_started_at": null, "processing_deadline": null, "expires_at": "2025-11-28T18:25", "terms_version": null, "title": null, "first_name": null, "last_name": null, "email": "john.smith@email.com", "phone": null, "city": null, "zip_code": null, "country_code": null, "street_and_number": null, "gender": null, "country_of_birth": null, "government_id_type": null, "marketing_carrier_reservation_ids": [ "CS3MGX_Smith_JCBRXV" ], "agent_id": null, "retailer_booking_number": null, "customer_id": null }, "relationships": { "fare_class": { "data": { "id": "SNCF-FARE-4", "type": "fare_classes" } }, "return_fare_class": { "data": null }, "departure_station": { "data": { "id": "FRLYSLYN", "type": "stations" } }, "arrival_station": { "data": { "id": "FRPARPRG", "type": "stations" } }, "marketing_carrier": { "data": { "id": "SNCF", "type": "marketing_carriers" } }, "booking": { "data": null }, "utm_params": { "data": null }, "errors": { "data": [] }, "segments": { "data": [ { "id": "STIO-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0", "type": "segments" } ] }, "reservation_passengers": { "data": [ { "id": "R-PNOS-1-STIO-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09", "type": "reservation_passengers" }, { "id": "R-PNOS-2-STIO-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09", "type": "reservation_passengers" } ] }, "applied_cards": { "data": [] }, "ancillaries": { "data": [] }, "required_attributes": { "data": [ { "id": "RBA643P7-87feeb31-4f5c-48c6-8eb1-015aeb7f94cf", "type": "required_attributes" } ] }, "custom_fields": { "data": [] }, "fees": { "data": [] } } }, "jsonapi": { "version": "1.0" }, "meta": { "currency": "EUR", "locale": "en" }, "included": [ { "id": "STIO-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0", "type": "segments", "attributes": { "departure_time": "2025-11-30T10:04", "arrival_time": "2025-11-30T12:09", "line": "6612", "line_prefix": "TGV INOUI" }, "relationships": { "departure_station": { "data": { "id": "FRLYSLYN", "type": "stations" } }, "arrival_station": { "data": { "id": "FRPARPRG", "type": "stations" } }, "marketing_carrier": { "data": { "id": "SNCF", "type": "marketing_carriers" } }, "segment_passengers": { "data": [ { "id": "PNOS-1-STIO-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0", "type": "segment_passengers" }, { "id": "PNOS-2-STIO-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0", "type": "segment_passengers" } ] } } }, { "id": "FRLYSLYN", "type": "stations", "attributes": { "code": "FRLYSLYN", "name": "Lyon Part Dieu Train Station" } }, { "id": "FRPARPRG", "type": "stations", "attributes": { "code": "FRPARPRG", "name": "Paris Gare de Lyon Hall 1 & 2 Train Station" } }, { "id": "SNCF", "type": "marketing_carriers", "attributes": { "code": "SNCF", "trade_name": "SNCF", "legal_name": "SNCF" } }, { "id": "PNOS-1-STIO-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0", "type": "segment_passengers", "attributes": { "seat_number": null }, "relationships": { "ancillaries": { "data": [] } } }, { "id": "PNOS-2-STIO-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0", "type": "segment_passengers", "attributes": { "seat_number": null }, "relationships": { "ancillaries": { "data": [] } } }, { "id": "R-PNOS-1-STIO-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09", "type": "reservation_passengers", "attributes": { "first_name": "John", "last_name": "Smith", "serial_code": null, "government_id_type": null, "nationality": null, "gender": null, "country_of_birth": null, "birthdate": "1997-10-22", "type": "PNOS" }, "relationships": { "required_attributes": { "data": [ { "id": "R-PNOS-1-STIO-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-b7b9af64-97d6-462d-955f-4db4d43cce92", "type": "passenger_required_attributes" } ] } } }, { "id": "R-PNOS-2-STIO-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09", "type": "reservation_passengers", "attributes": { "first_name": "Ana", "last_name": "Smith", "serial_code": null, "government_id_type": null, "nationality": null, "gender": null, "country_of_birth": null, "birthdate": "1997-10-22", "type": "PNOS" }, "relationships": { "required_attributes": { "data": [ { "id": "R-PNOS-2-STIO-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-01cb517c-79de-4d6e-8df8-32cd01f7a48b", "type": "passenger_required_attributes" } ] } } }, { "id": "R-PNOS-1-STIO-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-b7b9af64-97d6-462d-955f-4db4d43cce92", "type": "passenger_required_attributes", "attributes": { "mandatory": [ "birthdate", "first_name", "last_name" ], "endpoint": "reservations/confirm" } }, { "id": "R-PNOS-2-STIO-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-01cb517c-79de-4d6e-8df8-32cd01f7a48b", "type": "passenger_required_attributes", "attributes": { "mandatory": [ "birthdate", "first_name", "last_name" ], "endpoint": "reservations/confirm" } }, { "id": "SNCF-FARE-4", "type": "fare_classes", "attributes": { "code": "FARE-4", "name": "Second Class - Cheapest" } }, { "id": "RBA643P7-87feeb31-4f5c-48c6-8eb1-015aeb7f94cf", "type": "required_attributes", "attributes": { "mandatory": [ "email", "first_name", "last_name", "terms_accepted" ], "endpoint": "reservations/confirm" } } ] } • [Confirming Reservation](https://docs.distribusion.com/dt/api/basic-integration/confirming-reservation.md): Once the reservation is created and is on hold (when supported by the carrier) the user has enough time to enter their personal details and complete the payment. Once this is completed, the reservation can be confirmed using the /reservations/confirm endpoint. Required Fields for Confirming Reservation The response from the /connections/vacancy and /reservations/create endpoints outline which passenger fields are required or optional for the /reservations/confirm request. This helps you adapt your booking form and validation to improve user experience, reduce errors, and meet carrier requirements. For more details check our Dynamic Passenger Fields guide . Recommended Flow After the selected trip is reserved, the user can finalize the booking by entering the relevant passenger and payment details in the following sequence: Capture payment in a held status (handled outside of Distribusion) Trigger the booking by using the /reservations/confirm endpoint Receive confirmation of the reservation via /reservations/{reservation_id} endpoint Execute full capturing of the payment (handled outside of Distribusion) Display the booking confirmation page Best Practices Display correct prices: The price displayed on the checkout page and used for the further booking flow must be the price returned by the /reservations/create endpoint. Display markups : Service fees or markups added by the booking platform must be separately and transparently displayed to the user. Collect only required customer information: Different carriers require varying information during the booking process in order to fullfil their services and where possible, the collection of passenger information should be minimized. In order to facilitate a dynamic checkout that gathers only necessary information from the customer, please make use of the info from /connections/vacancy and /reservations/create endpoints and check our Dynamic Passenger Fields guide . Cancel reservation when checkout process is aborted: In case the user aborts the checkout or payment process, please use the /reservations/cancel endpoint to unblock the reserved seats in the carrier’s system. Do not just let the reservation timeout since other users won’t be able to see those seats until it does. The current status of a reservation can be checked using the /reservations/{reservation_id} endpoint. Display carrier terms and conditions: It is mandatory to display the terms and conditions of the respective carrier on the checkout page. You can find the terms and conditions of the carrier from the terms parameter in the /marketing_carriers/{marketing_carrier_id} endpoint. Note that some carriers might have multiple links or long text in this field. Process your payments : No live payments flow between your and our systems at this point. Payments are reconciled during regular settlement processes. In the /reservations/confirm request, you must specify payment_method = demand_note by default. Do not call confirm & cancel in same booking flow : You should never call /reservations/confirm & /reservations/cancel in the same flow. Once confirmed we are attempting to create the booking, calling both will respond in an error. In this case, /reservations/create will need to be called to cancel booking after confirmation. Do not confirm reservation multiple times : Calling /reservations/confirm multiple times does not change the timing or affect the finality reservation. Instead, it is much more efficient to simply call the /reservations/{reservation_id} endpoint to check on the status of the reservation. Define sender of confirmation email : At the time of confirming the reservation you can specify if the user should receive the default confirmation and cancellation emails created by Distribusion or emails created by you. For more details check our Ticket Delivery guide . Enterprise Features After ancillaries are added to the /reservations/create step they don't have to be added again to the /reservations/confirm request. For more details, check our guide on Ancillaries . When discount cards are applied to the /reservations/create step they don't have to be added again to the /reservations/confirm request. For more details, check our guide on Discount Cards . Next Step After the reservation is confirmed, the status of the reservation must be checked . API Examples Sample Request to /reservations/confirm JSON { "reservation_id": "RFK7YNAF", "execute_payment": "false", "payment_method": "demand_note", "terms_accepted": "true", "send_customer_email": "true", "title": "mr", "first_name": "John", "last_name": "Smith", "email": "john.smith@email.com", "passengers": [ { "type": "PNOS", "id": "pax-33-1", "first_name": "John", "last_name": "Smith", "birthdate": "1997-10-22" }, { "type": "PNOS", "id": "pax-11-2", "first_name": "Ana", "last_name": "Smith", "birthdate": "1997-10-22" } ] } Sample Response from /reservations/confirm JSON { "data": { "id": "RW9TP2AS", "type": "reservations", "attributes": { "total_price": 9840, "original_price": 9840, "state": "processing", "created_at": "2025-11-26T18:25", "confirmed_at": null, "cancelled_at": null, "failed_at": null, "processing_started_at": "2025-11-26T18:25", "processing_deadline": "2025-11-26T18:35", "expires_at": "2025-11-26T22:25", "terms_version": null, "title": null, "first_name": null, "last_name": null, "email": "john.smith@email.com", "phone": null, "city": null, "zip_code": null, "country_code": null, "street_and_number": null, "gender": null, "country_of_birth": null, "government_id_type": null, "marketing_carrier_reservation_ids": [ "CS2Q3Q_Doe_FAEZG3" ], "agent_id": null, "retailer_booking_number": null, "customer_id": null }, "relationships": { "fare_class": { "data": { "id": "SNCF-FARE-5", "type": "fare_classes" } }, "return_fare_class": { "data": null }, "departure_station": { "data": { "id": "FRLYSLYN", "type": "stations" } }, "arrival_station": { "data": { "id": "FRPARPRG", "type": "stations" } }, "marketing_carrier": { "data": { "id": "SNCF", "type": "marketing_carriers" } }, "booking": { "data": null }, "utm_params": { "data": null }, "errors": { "data": [] }, "segments": { "data": [ { "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26-0", "type": "segments" } ] }, "reservation_passengers": { "data": [ { "id": "R-PNOS-1-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26", "type": "reservation_passengers" }, { "id": "R-PCIL-2-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26", "type": "reservation_passengers" } ] }, "applied_cards": { "data": [] }, "ancillaries": { "data": [] }, "custom_fields": { "data": [] }, "fees": { "data": [] } } }, "jsonapi": { "version": "1.0" }, "meta": { "locale": "en", "currency": "EUR" }, "included": [ { "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26-0", "type": "segments", "attributes": { "departure_time": "2025-11-30T09:16", "arrival_time": "2025-11-30T14:26", "line": "17756", "line_prefix": "TER" }, "relationships": { "departure_station": { "data": { "id": "FRLYSLYN", "type": "stations" } }, "arrival_station": { "data": { "id": "FRPARPRG", "type": "stations" } }, "marketing_carrier": { "data": { "id": "SNCF", "type": "marketing_carriers" } }, "segment_passengers": { "data": [ { "id": "PNOS-1-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26-0", "type": "segment_passengers" }, { "id": "PCIL-2-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26-0", "type": "segment_passengers" } ] } } }, { "id": "FRLYSLYN", "type": "stations", "attributes": { "code": "FRLYSLYN", "name": "Lyon Part Dieu Train Station" } }, { "id": "FRPARPRG", "type": "stations", "attributes": { "code": "FRPARPRG", "name": "Paris Gare de Lyon Hall 1 & 2 Train Station" } }, { "id": "SNCF", "type": "marketing_carriers", "attributes": { "code": "SNCF", "trade_name": "SNCF", "legal_name": "SNCF" } }, { "id": "PNOS-1-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26-0", "type": "segment_passengers", "attributes": { "seat_number": null }, "relationships": { "ancillaries": { "data": [] } } }, { "id": "PCIL-2-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26-0", "type": "segment_passengers", "attributes": { "seat_number": null }, "relationships": { "ancillaries": { "data": [] } } }, { "id": "R-PNOS-1-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26", "type": "reservation_passengers", "attributes": { "first_name": "John", "last_name": "Doe", "serial_code": null, "government_id_type": null, "nationality": null, "gender": null, "country_of_birth": null, "birthdate": "1997-10-22", "type": "PNOS" } }, { "id": "R-PCIL-2-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26", "type": "reservation_passengers", "attributes": { "first_name": "May", "last_name": "Doe", "serial_code": null, "government_id_type": null, "nationality": null, "gender": null, "country_of_birth": null, "birthdate": "2020-05-22", "type": "PCIL" } }, { "id": "SNCF-FARE-5", "type": "fare_classes", "attributes": { "code": "FARE-5", "name": "Second Class - SemiFlexi" } } ] } • [Checking Reservation Status](https://docs.distribusion.com/dt/api/basic-integration/checking-reservation-status.md): Once the reservation is confirmed using the /reservations/confirm endpoint, the carrier usually takes some time to process it. Most carriers will complete the process in a few seconds but this can take longer, so it is important to continuously check the reservation status using the /reservations/{reservation_id} endpoint until a response is received. Reading Reservation Status After sending a request to the /reservations/confirm endpoint the status of the reservation is set to processing . Then a new request must be sent to the /reservations/{reservation_id} endpoint to check the status of the reservation. In the response, the value state shows the current state of the reservation. Values can be: created : The default value, appears right after the reservation is created . processing : Shown after /reservations/confirm is initially called. confirmed : Shown once the reservation is confirmed with the carrier. cancelled : Shown if /reservation/cancel is called (used in case the user aborts the reservation flow). failed : Shown if something goes wrong in the booking. Processing Deadline In the response from, the processing_deadline value will present the date and time deadline that the retailer should request /reservations/{reservation_id} to see if a booking was successfully created. Hence if you stop listening to it before that time frame, a discrepancy can happen. The reservation status must be continually checked every 5-10 seconds until one of the following occurs: The reservation is confirmed and you can proceed with the post-booking actions. The reservation times out, in which case it will be automatically tagged as failed . The reservation is failed , in which case the user must be notified that their booking was unsuccessful. Best Practices Wait for for entire processing deadline : The max processing deadline supported by Distribusion is 10 mins and it is essential to continue listening (calling /reservations/{reservation_id} ) until the deadline expires. If you stop listening before processing_deadline is completed and then the booking is created, there will be a discrepancy in status of the booking between you and the carrier. If this occurs, you will still be charged and incur the transaction costs. Note that in most cases the bookings are processed within 15 seconds, but it can happen that some will take longer. 10 minutes is our limit for timing out the requests. If you want to know the average processing times for selected carriers please speak to your Partnership Manager. Collect booking ID: The booking_id returned from the /reservations/{reservation_id} endpoint endpoint after a successful booking can be used for all further post-booking interaction with the Distribusion API. Enterprise Features Nothing applies to this step. For more details, check our guide on Ancillaries and Discount Cards . Next Step If the reservation is successful, check the full details of the booking and retrieve the pdf and mobile tickets . If the reservation fails, move the user back to the search results step to initiate the flow again. API Examples Sample Request to /reservations/{reservation_id} HTTP https://api.demo.distribusion.com/retailers/v4/reservations/RW9TP2AS Sample Response from /reservations/{reservation_id} JSON { "data": { "id": "RW9TP2AS", "type": "reservations", "attributes": { "total_price": 9840, "original_price": 9840, "state": "confirmed", "created_at": "2025-11-26T18:25", "confirmed_at": "2025-11-26T18:25", "cancelled_at": null, "failed_at": null, "processing_started_at": "2025-11-26T18:25", "processing_deadline": null, "expires_at": "2025-11-26T22:25", "terms_version": null, "title": null, "first_name": null, "last_name": null, "email": "john.smith@email.com", "phone": null, "city": null, "zip_code": null, "country_code": null, "street_and_number": null, "gender": null, "country_of_birth": null, "government_id_type": null, "marketing_carrier_reservation_ids": [ "CS2Q3Q_Doe_FAEZG3" ], "agent_id": null, "retailer_booking_number": null, "customer_id": null }, "relationships": { "booking": { "data": { "id": "kETChTd2nCiksUoZaJ6ejA", "type": "bookings" } }, "utm_params": { "data": null }, "errors": { "data": [] }, "reservation_passengers": { "data": [ { "id": "R-PNOS-1-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26", "type": "reservation_passengers" }, { "id": "R-PCIL-2-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26", "type": "reservation_passengers" } ] }, "applied_cards": { "data": [] }, "ancillaries": { "data": [] }, "custom_fields": { "data": [] } } }, "jsonapi": { "version": "1.0" }, "meta": { "locale": "en", "currency": "EUR" }, "included": [ { "id": "R-PNOS-1-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26", "type": "reservation_passengers", "attributes": { "first_name": "John", "last_name": "Doe", "serial_code": null, "government_id_type": null, "nationality": null, "gender": null, "country_of_birth": null, "birthdate": "1997-10-22", "type": "PNOS" } }, { "id": "R-PCIL-2-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26", "type": "reservation_passengers", "attributes": { "first_name": "May", "last_name": "Doe", "serial_code": null, "government_id_type": null, "nationality": null, "gender": null, "country_of_birth": null, "birthdate": "2020-05-22", "type": "PCIL" } }, { "id": "kETChTd2nCiksUoZaJ6ejA", "type": "bookings", "attributes": { "departure_time": "2025-11-30T09:16", "arrival_time": "2025-11-30T14:26", "duration": 18600, "title": "mr", "first_name": "John", "last_name": "Smith", "email": "andre.franchini@distribusion.com", "phone": null, "city": null, "zip_code": null, "street_and_number": null, "payment_method": "demand_note", "payment_token": null, "payer_id": null, "tax_id": null, "vat_number": null, "business_name": null, "total_price": 9840, "original_price": 9840, "marketing_carrier_booking_number": "CS2Q3Q_Doe_FAEZG3", "pax": 2, "flight_number": null, "distribusion_booking_number": "M3PSFN", "marketing_carrier_booking_numbers": [ "CS2Q3Q_Doe_FAEZG3" ], "terms_accepted": true, "send_customer_email": true, "retailer_partner_number": "730011", "connection_reference": null, "created_at": "2025-11-26T18:25" }, "relationships": { "fare_class": { "data": { "id": "SNCF-FARE-5", "type": "fare_classes" } }, "outbound_connection": { "data": { "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26", "type": "connections" } }, "inbound_connection": { "data": null }, "amended_by": { "data": null }, "result_of_amendment": { "data": null }, "segments": { "data": [ { "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26-0", "type": "segments" } ] }, "passengers": { "data": [ { "id": "PNOS-1-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26", "type": "passengers" }, { "id": "PCIL-2-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26", "type": "passengers" } ] }, "fees": { "data": [] }, "applied_cards": { "data": [] } } }, { "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26-0", "type": "segments", "attributes": { "departure_time": "2025-11-30T09:16", "arrival_time": "2025-11-30T14:26", "original_price": null, "index": 0, "vehicle_number": null, "departure_platform": null, "line": "17756", "line_prefix": "TER" }, "relationships": { "departure_station": { "data": { "id": "FRLYSLYN", "type": "stations" } }, "arrival_station": { "data": { "id": "FRPARPRG", "type": "stations" } }, "operating_carrier": { "data": { "id": "SNCF", "type": "operating_carriers" } }, "marketing_carrier": { "data": { "id": "SNCF", "type": "marketing_carriers" } }, "vehicle": { "data": { "id": "TRAIN-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26-0", "type": "vehicles" } }, "segment_passengers": { "data": [ { "id": "PNOS-1-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26-0", "type": "segment_passengers" }, { "id": "PCIL-2-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26-0", "type": "segment_passengers" } ] }, "ancillaries": { "data": [] } } }, { "id": "PNOS-1-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26-0", "type": "segment_passengers", "attributes": { "seat_number": null, "marketing_carrier_passenger_id": "000000060" }, "relationships": { "passenger": { "data": { "id": "PNOS-1-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26", "type": "passengers" } }, "ticket": { "data": null }, "applied_cards": { "data": [] }, "ancillaries": { "data": [] } } }, { "id": "PCIL-2-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26-0", "type": "segment_passengers", "attributes": { "seat_number": null, "marketing_carrier_passenger_id": "000000061" }, "relationships": { "passenger": { "data": { "id": "PCIL-2-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26", "type": "passengers" } }, "ticket": { "data": null }, "applied_cards": { "data": [] }, "ancillaries": { "data": [] } } }, { "id": "PNOS-1-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26", "type": "passengers", "attributes": { "first_name": "John", "last_name": "Doe", "serial_code": "AVVlUABKKcQACCRocJnAfrkBAJRBNJgrQZXGpSZLEdSSUFAowAgUGDG63CQEODoU+wtarmS5ytk0pNMABAFQOACJSekJwGiJ6KwTWAgkQAUAjQgJ4iwACEEACIAhdreEAQuYrgQACRVwCosLmAgAEBIAABDNAJoTS2NjK6ECowuTSzECc3uTawtgRfYsXDenUYgxhqjEABBAQBxVmFsYWJsZSBzdXIgVEVSIHVuaXF1ZW1lbnQKTm9uIMOpY2hhbmdlYWJsZS4gUmVtYm91cnNhYmxlCmp1c3F1J8OgIGxhIHZlaWxsZSBkdSBkw6lwYXJ0CmF1cHLDqHMgZHUgY2FuYWwgZCdhY2hhdC4AWmBWBChBdCkiWVvUDEu7anjiI0noKxY38gQm2np6fk2vntyOnCbE5Fb6pgMNMgA==", "type": "PNOS" } }, { "id": "PCIL-2-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26", "type": "passengers", "attributes": { "first_name": "May", "last_name": "Doe", "serial_code": "AVVlUABKKcQACCRocJnAfjkBAJRBNJgrQZXGpSZLEdSSUFAowAgUGDG63CQEODoU+wtarmS5ytk0pNMABAFQOABpqCsgaInorulYCCRABQCNCAnqLAAIQQAIgCF2t4QBC5iuBAAJFXAKiwuYCAAQEgAgEGaAmhNLY2MroQKjC5NLMQJze5NrC2BF9ixcN6dRiDGGqMQAEEBAHFWYWxhYmxlIHN1ciBURVIgdW5pcXVlbWVudApOb24gw6ljaGFuZ2VhYmxlLiBSZW1ib3Vyc2FibGUKanVzcXUnw6AgbGEgdmVpbGxlIGR1IGTDqXBhcnQKYXVwcsOocyBkdSBjYW5hbCBkJ2FjaGF0LgBcYFgEKH00W//vfwdvY2sjNj9zSCmH4fRgBCiaGpclVyxhM7Gu2CewKopGVj+3RAA==", "type": "PCIL" } }, { "id": "SNCF-FARE-5", "type": "fare_classes", "attributes": { "code": "FARE-5", "name": "Second Class - SemiFlexi", "iata_category": "Economy Class", "journey_type": "single" }, "relationships": { "post_booking_condition": { "data": { "id": "SNCF-PBC-ZPGM", "type": "post_booking_conditions" } }, "fare_features": { "data": [ { "id": "SNCF-PREF", "type": "fare_features" } ] }, "ticket_validity_rules": { "data": [ { "id": "SNCF-FARE-5-TICKET_VALIDITY_RULE-0", "type": "ticket_validity_rules" } ] }, "passenger_group_rules": { "data": [] } } }, { "id": "SNCF-PREF", "type": "fare_features", "attributes": { "code": "PREF", "name": "Partially refundable", "description": "Refund rules and times depend on the method of payment, the train company, the type of ticket and the method of collection." } }, { "id": "SNCF-FARE-5-TICKET_VALIDITY_RULE-0", "type": "ticket_validity_rules", "attributes": { "rule_type": "outbound", "reference_time_type": "departure_time", "use_type": "once", "offset_type": "minutes", "duration_type": "minutes", "offset": 0, "duration": 0 } }, { "id": "SNCF-PBC-ZPGM", "type": "post_booking_conditions", "relationships": { "rules": { "data": [ { "id": "SNCF-PBC-ZPGM-PBR-HCAA", "type": "post_booking_rules" }, { "id": "SNCF-PBC-ZPGM-PBR-LYZL", "type": "post_booking_rules" }, { "id": "SNCF-PBC-ZPGM-PBR-MMZY", "type": "post_booking_rules" }, { "id": "SNCF-PBC-ZPGM-PBR-OIZO", "type": "post_booking_rules" }, { "id": "SNCF-PBC-ZPGM-PBR-ZZSA", "type": "post_booking_rules" } ] } } }, { "id": "SNCF-PBC-ZPGM-PBR-HCAA", "type": "post_booking_rules", "attributes": { "rule_type_identifier": "general_cancellation", "allowed": true, "description": "Fully refundable up to D-7 without fee. Cancellation is allowed before 30 minutes of departure, with applicable fees. Non-refundable within 30 minutes of departure.", "cutoff_context": "before_departure", "cutoff_in_minutes": 8640, "fee_context": "per_booking", "fee_type": "fixed", "fee_currency_code": "EUR", "fee_in_percent": null, "fee_in_cents": 1900 } }, { "id": "SNCF-PBC-ZPGM-PBR-LYZL", "type": "post_booking_rules", "attributes": { "rule_type_identifier": "fare_class_amendment", "allowed": true, "description": "Can be exchanged with fare adjustment without fee up to D-7. Fees apply from D-6 to departure: €19 charge on TGV and 40% of the price (max €15) on Intercités. From 30 minutes before departure, ticket may be exchanged once", "cutoff_context": "before_departure", "cutoff_in_minutes": 8640, "fee_context": "per_booking", "fee_type": "fixed", "fee_currency_code": "EUR", "fee_in_percent": null, "fee_in_cents": 1900 } }, { "id": "SNCF-PBC-ZPGM-PBR-MMZY", "type": "post_booking_rules", "attributes": { "rule_type_identifier": "origin_destination_amendment", "allowed": true, "description": "Can be exchanged with fare adjustment without fee up to D-7. Fees apply from D-6 to departure: €19 charge on TGV and 40% of the price (max €15) on Intercités. From 30 minutes before departure, ticket may be exchanged once", "cutoff_context": "before_departure", "cutoff_in_minutes": 8640, "fee_context": "per_booking", "fee_type": "fixed", "fee_currency_code": "EUR", "fee_in_percent": null, "fee_in_cents": 1900 } }, { "id": "SNCF-PBC-ZPGM-PBR-OIZO", "type": "post_booking_rules", "attributes": { "rule_type_identifier": "date_time_amendment", "allowed": true, "description": "Can be exchanged with fare adjustment without fee up to D-7. Fees apply from D-6 to departure: €19 charge on TGV and 40% of the price (max €15) on Intercités. From 30 minutes before departure, ticket may be exchanged once", "cutoff_context": "before_departure", "cutoff_in_minutes": 8640, "fee_context": "per_booking", "fee_type": "fixed", "fee_currency_code": "EUR", "fee_in_percent": null, "fee_in_cents": 1900 } }, { "id": "SNCF-PBC-ZPGM-PBR-ZZSA", "type": "post_booking_rules", "attributes": { "rule_type_identifier": "general_amendment", "allowed": false, "description": "Can be exchanged with fare adjustment without fee up to D-7. Fees apply from D-6 to departure: €19 charge on TGV and 40% of the price (max €15) on Intercités. From 30 minutes before departure, ticket may be exchanged once", "cutoff_context": "before_departure", "cutoff_in_minutes": 10080, "fee_context": "per_booking", "fee_type": "percentage", "fee_currency_code": "EUR", "fee_in_percent": "0.0", "fee_in_cents": null } }, { "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26", "type": "connections", "attributes": { "departure_time": "2025-11-30T09:16", "arrival_time": "2025-11-30T14:26" }, "relationships": { "departure_station": { "data": { "id": "FRLYSLYN", "type": "stations" } }, "arrival_station": { "data": { "id": "FRPARPRG", "type": "stations" } }, "marketing_carrier": { "data": { "id": "SNCF", "type": "marketing_carriers" } }, "segments": { "data": [ { "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26-0", "type": "segments" } ] }, "fees": { "data": [] } } } ] } • [Booking Confirmation](https://docs.distribusion.com/dt/api/basic-integration/booking-confirmation.md): Once the booking has been confirmed by the carrier’s system , the user should be redirected to a confirmation page with their trip details and receive a confirmation email including their ticket. Retrieving Booking Details The confirmation page presented to the user should include all of the details retrieved from the /bookings/{booking_id} endpoint. It important to display the relevant booking details and codes for future reference, access to download the tickets and to manage the booking. Note that most information about the bookings details are also returned from the /reservations/{reservation_id} response, so you can use this info to create your confirmation page. But to create a booking management page we recommend using the info from /bookings and /bookings/{booking_id} endpoints. From the booking management page, users should be allowed to view all the bookings linked to their account, view the details and potentially cancel or amend the booking (when supported by the carrier). Delivering Tickets There is a choice to either send your platform’s existing confirmation email and attach the ticket(s), or for Distribusion to send the default confirmation email and ticket(s) directly to the user. This setting is defined at the time of confirming the reservation and it also affects the cancellation email. For more details refer to our Ticket Delivery guide . Ticket Types Tickets can be retrieved from the /bookings/{booking_id}/tickets endpoint. Distribusion supports pdf, mobile tickets and other formats. For more details check our Ticket Types guide . Best Practices Do not call the reservation endpoints any longer : After a reservation is confirmed and the booking is created, all the information about the booking should be visible from the /bookings/{booking_id} endpoint. There is no use in calling any of the reservation endpoints. In case a cancellation of the booking is needed, follow the steps as described in our Cancellation guide . Display the correct booking code : Users should be presented with the distribusion_booking_number and/or the marketing_carrier_booking_number . Ideally, you should include both plus any other codes returned by the carrier that appear in the response such as the marketing_carrier_passenger_id . There is no need to present the id of the booking as this is an internal id with a difficult to spell format e.g. XJUYXc0HyEoPfi6-IUn_SA . Inform if printing ticket is required : The majority of carriers accept tickets to be displayed on mobile devices, which is what users are accustomed to. The parameter ticket_printing_required in the /marketing_carriers/{marketing_carrier_id} endpoint enables you to see which carriers do not need their tickets to be printed, we recommend surfacing this to your customers with an icon or text. We also recommend indicating the necessity of a hard copy during search results or at the checkout page . Learn more about ticketing in the Ticket Types section . Enterprise Features Besides cancelling a booking, some carriers support amendments to bookings. For more details about how to handle it, check our Amendments guide . Next Step When a user is presented with their booking details, the most common next steps are to download the ticket , cancel the booking or amend it (if supported by the carrier). API Examples Sample Request to /bookings/{booking_id} HTTP https://api.demo.distribusion.com/retailers/v4/bookings/kETChTd2nCiksUoZaJ6ejA Sample Response from /bookings/{booking_id} JSON { "data": { "id": "kETChTd2nCiksUoZaJ6ejA", "type": "bookings", "attributes": { "departure_time": "2025-11-30T09:16", "arrival_time": "2025-11-30T14:26", "duration": 18600, "title": "mr", "first_name": "John", "last_name": "Smith", "email": "john.smith@email.com", "phone": null, "city": null, "zip_code": null, "street_and_number": null, "execute_payment": false, "payment_method": "demand_note", "payment_token": null, "payer_id": null, "tax_id": null, "vat_number": null, "business_name": null, "customer_id": null, "total_price": 9840, "original_price": 9840, "marketing_carrier_booking_number": "CS2Q3Q_Doe_FAEZG3", "pax": 2, "flight_number": null, "distribusion_booking_number": "M3PSFN", "marketing_carrier_booking_numbers": [ "CS2Q3Q_Doe_FAEZG3" ], "retailer_booking_number": null, "terms_accepted": true, "send_customer_email": true, "send_marketing_emails": null, "retailer_partner_number": "730011", "connection_reference": null, "serial_code": null, "status": "active", "agent_id": null, "created_at": "2025-11-26T18:25", "valid_from": null, "valid_until": null }, "relationships": { "departure_station": { "data": { "id": "FRLYSLYN", "type": "stations" } }, "installments": { "data": null }, "arrival_station": { "data": { "id": "FRPARPRG", "type": "stations" } }, "marketing_carrier": { "data": { "id": "SNCF", "type": "marketing_carriers" } }, "cancellation": { "data": null }, "fare_class": { "data": { "id": "SNCF-FARE-5", "type": "fare_classes" } }, "utm_params": { "data": null }, "outbound_connection": { "data": { "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26", "type": "connections" } }, "inbound_connection": { "data": null }, "amended_by": { "data": null }, "result_of_amendment": { "data": null }, "segments": { "data": [ { "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26-0", "type": "segments" } ] }, "passengers": { "data": [ { "id": "PNOS-1-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26", "type": "passengers" }, { "id": "PCIL-2-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26", "type": "passengers" } ] }, "extras": { "data": [] }, "custom_fields": { "data": [] }, "fees": { "data": [] }, "applied_cards": { "data": [] }, "ancillaries": { "data": [] } } }, "jsonapi": { "version": "1.0" }, "meta": { "locale": "en", "currency": "EUR" }, "included": [ { "id": "FRLYSLYN", "type": "stations", "attributes": { "station_type": "train_station", "code": "FRLYSLYN", "name": "Lyon Part Dieu Train Station", "description": "", "street_and_number": "Place Charles Béraudier", "zip_code": "69003", "time_zone": "Europe/Paris", "longitude": 4.859355, "latitude": 45.760559 }, "relationships": { "city": { "data": { "id": "FRLYS", "type": "cities" } }, "area": { "data": null } } }, { "id": "FRLYS", "type": "cities", "attributes": { "code": "FRLYS", "name": "Lyon" } }, { "id": "FRPARPRG", "type": "stations", "attributes": { "station_type": "train_station", "code": "FRPARPRG", "name": "Paris Gare de Lyon Hall 1 & 2 Train Station", "description": "", "street_and_number": "Pl. Louis-Armand hall 1", "zip_code": "75012", "time_zone": "Europe/Paris", "longitude": 2.37352, "latitude": 48.84489 }, "relationships": { "city": { "data": { "id": "FRPAR", "type": "cities" } }, "area": { "data": null } } }, { "id": "FRPAR", "type": "cities", "attributes": { "code": "FRPAR", "name": "Paris" } }, { "id": "SNCF", "type": "marketing_carriers", "attributes": { "code": "SNCF", "trade_name": "SNCF", "legal_name": "SNCF", "address": "9, rue Jean Philippe Rameau – CS 20012 – 93200 Saint Denis Cedex", "phone": "3635", "fax": "", "customer_service_phone": "3635", "customer_service_email": "", "email": "", "commercial_register": "", "commercial_register_number": "", "vat_no": "FR88519037584", "authorised_representative": "", "white_label_logo": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAGlCAYAAAACkpIqAAAABGdBTUEAALGP\nC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3Cc\nulE8AAAABmJLR0QA/wD/AP+gvaeTAABzWklEQVR42u3dd3gc1dk28PvMFvXe\nuyxLci8gg7GNGxhcSWgGEgKk8JkUSjp5kzcJ6aRDOknImxBKQjPg3nu33CXL\nsqzee1ttn/P9IWNscFEbaWb3/l2XL7Cs3TnzTNm5d86cIzAIy7HcdH366HAA\ncCqOCKhCUcwIgVCsqkcGwCSDhaqYIGQ4AAiICACKkAgBpFVABkiIYCFx4Xeg\nKhGKIhRVIkSBtL6/LAGESsDy/t8VwCSB8Av/LhUAMhTnf0dcpr0X/SwMgFkA\ngBSX+/cP/8wBwH5+ub3kJb/dBcBzhfeQAmi/+B0v+R0pXQLC9uEXKUDb+/+v\nSrQLISWgQEjZKSG8Su9Kd0MK9/k36oEUzvNLsEtFOhQpXQqETaqK1yvUTgsA\nt9r7viaTu9NrtnhNla3dj+GvbhARERERDQPRl5AxISNliirEbCEwUwBpEkgR\nQIIEAsSV3vD8Bbrow0LFhy7X+/0aAOLSQND39+hbAOnz+l3zPS6zfjppqx2A\nQwAuADYB6ZXS1CkgXVJIm4CwQcIlJNog4BZAtwRsEnApQrZDwiWgdHshexSp\nOKUi2+FV3EK4u4Qa2GMNcjgfrHy2jYccEREREQPIZT2T9niyajGvgBQrACQN\n1UUvA4huA8jQtfXq26IbgE3pDS9tkLABsAmBbkjRDilsgLQJoAsC7b13h1Sb\nEKJLCtEBeGxCKDb0eDsf7GCgISIiIjJ8AHlm3jNmb0XHNyHk9wVgHeqLXgYQ\nvw8gV36Pq6zfVZbbAYgOSHQIiA5AdkLIDqmKDkWIDkBtgxAdUhUdAug0CW8H\nFKUDLlMHYO+4r+3nHTwNEBEREY1QAHkm7fFkr8X8NoDpWl30MoAwgAxxABmK\n9WuTQKcA2gRkK6RoEwKtEGiFKnv/K2WrIpQ2ochWp0dtNZksbfc1PdPNUwgR\nERHRAAPI/2Q/EWdWTXsBZGt50csAwgCiwwBy1dcA8jI/l0Dv8zKtonfAgFZA\ntgoh2lQpe/9fKq0QslVK2ShMaLKonmZLpL1lScnvnTz1EBERkb8yv3/dpajm\n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\nMDBkf7TeAAAAAElFTkSuQmCC\n", "white_label_colour_code": "", "terms": "SNCF Conditions of Carriage:\r\nhttps://www.sncf-voyageurs.com/en/travel-with-us/in-france/mainline-cards-and-fares/legal-notices/\r\n\r\nSNCF Rail Passenger Rights Regulation:\r\nhttps://www.sncf-voyageurs.com/en/customer-service/delays/\r\n\r\nEurostar Conditions of carriage:\r\nhttps://www.eurostar.com/uk-en/conditions-carriage", "flight_number_required": false, "cancellation_type": "fee_per_booking", "booking_fee": 0, "cancellation_fee": 0, "cancellation_cutoff": 0 } }, { "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26-0", "type": "segments", "attributes": { "departure_time": "2025-11-30T09:16", "arrival_time": "2025-11-30T14:26", "original_price": null, "index": 0, "vehicle_number": null, "departure_platform": null, "line": "17756", "line_prefix": "TER" }, "relationships": { "departure_station": { "data": { "id": "FRLYSLYN", "type": "stations" } }, "arrival_station": { "data": { "id": "FRPARPRG", "type": "stations" } }, "operating_carrier": { "data": { "id": "SNCF", "type": "operating_carriers" } }, "marketing_carrier": { "data": { "id": "SNCF", "type": "marketing_carriers" } }, "vehicle": { "data": { "id": "TRAIN-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26-0", "type": "vehicles" } }, "segment_passengers": { "data": [ { "id": "PNOS-1-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26-0", "type": "segment_passengers" }, { "id": "PCIL-2-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26-0", "type": "segment_passengers" } ] }, "ancillaries": { "data": [] } } }, { "id": "SNCF", "type": "operating_carriers", "attributes": { "code": "SNCF", "trade_name": "SNCF", "legal_name": "SNCF", "vat_no": "FR88519037584", "commercial_register_number": "", "address": "9, rue Jean Philippe Rameau – CS 20012 – 93200 Saint Denis Cedex", "phone": "3635" } }, { "id": "PNOS-1-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26-0", "type": "segment_passengers", "attributes": { "seat_number": null, "marketing_carrier_passenger_id": "000000060" }, "relationships": { "passenger": { "data": { "id": "PNOS-1-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26", "type": "passengers" } }, "ticket": { "data": null }, "applied_cards": { "data": [] }, "ancillaries": { "data": [] } } }, { "id": "PCIL-2-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26-0", "type": "segment_passengers", "attributes": { "seat_number": null, "marketing_carrier_passenger_id": "000000061" }, "relationships": { "passenger": { "data": { "id": "PCIL-2-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26", "type": "passengers" } }, "ticket": { "data": null }, "applied_cards": { "data": [] }, "ancillaries": { "data": [] } } }, { "id": "TRAIN-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26-0", "type": "vehicles", "relationships": { "vehicle_type": { "data": { "id": "TRAIN", "type": "vehicle_types" } } } }, { "id": "TRAIN", "type": "vehicle_types", "attributes": { "code": "TRAIN", "name": "Train", "description": "Vehicle which is transporting people or goods on rails." } }, { "id": "PNOS-1-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26", "type": "passengers", "attributes": { "first_name": "John", "last_name": "Doe", "serial_code": "AVVlUABKKcQACCRocJnAfrkBAJRBNJgrQZXGpSZLEdSSUFAowAgUGDG63CQEODoU+wtarmS5ytk0pNMABAFQOACJSekJwGiJ6KwTWAgkQAUAjQgJ4iwACEEACIAhdreEAQuYrgQACRVwCosLmAgAEBIAABDNAJoTS2NjK6ECowuTSzECc3uTawtgRfYsXDenUYgxhqjEABBAQBxVmFsYWJsZSBzdXIgVEVSIHVuaXF1ZW1lbnQKTm9uIMOpY2hhbmdlYWJsZS4gUmVtYm91cnNhYmxlCmp1c3F1J8OgIGxhIHZlaWxsZSBkdSBkw6lwYXJ0CmF1cHLDqHMgZHUgY2FuYWwgZCdhY2hhdC4AWmBWBChBdCkiWVvUDEu7anjiI0noKxY38gQm2np6fk2vntyOnCbE5Fb6pgMNMgA==", "government_id_type": null, "nationality": null, "gender": null, "country_of_birth": null, "birthdate": "1997-10-22", "type": "PNOS", "price": 6560 } }, { "id": "PCIL-2-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26", "type": "passengers", "attributes": { "first_name": "May", "last_name": "Doe", "serial_code": "AVVlUABKKcQACCRocJnAfjkBAJRBNJgrQZXGpSZLEdSSUFAowAgUGDG63CQEODoU+wtarmS5ytk0pNMABAFQOABpqCsgaInorulYCCRABQCNCAnqLAAIQQAIgCF2t4QBC5iuBAAJFXAKiwuYCAAQEgAgEGaAmhNLY2MroQKjC5NLMQJze5NrC2BF9ixcN6dRiDGGqMQAEEBAHFWYWxhYmxlIHN1ciBURVIgdW5pcXVlbWVudApOb24gw6ljaGFuZ2VhYmxlLiBSZW1ib3Vyc2FibGUKanVzcXUnw6AgbGEgdmVpbGxlIGR1IGTDqXBhcnQKYXVwcsOocyBkdSBjYW5hbCBkJ2FjaGF0LgBcYFgEKH00W//vfwdvY2sjNj9zSCmH4fRgBCiaGpclVyxhM7Gu2CewKopGVj+3RAA==", "government_id_type": null, "nationality": null, "gender": null, "country_of_birth": null, "birthdate": "2020-05-22", "type": "PCIL", "price": 3280 } }, { "id": "SNCF-FARE-5", "type": "fare_classes", "attributes": { "code": "FARE-5", "name": "Second Class - SemiFlexi", "iata_category": "Economy Class", "journey_type": "single" }, "relationships": { "post_booking_condition": { "data": { "id": "SNCF-PBC-ZPGM", "type": "post_booking_conditions" } }, "fare_features": { "data": [ { "id": "SNCF-PREF", "type": "fare_features" } ] }, "ticket_validity_rules": { "data": [ { "id": "SNCF-FARE-5-TICKET_VALIDITY_RULE-0", "type": "ticket_validity_rules" } ] }, "passenger_group_rules": { "data": [] } } }, { "id": "SNCF-PREF", "type": "fare_features", "attributes": { "code": "PREF", "name": "Partially refundable", "description": "Refund rules and times depend on the method of payment, the train company, the type of ticket and the method of collection." } }, { "id": "SNCF-FARE-5-TICKET_VALIDITY_RULE-0", "type": "ticket_validity_rules", "attributes": { "rule_type": "outbound", "reference_time_type": "departure_time", "use_type": "once", "offset_type": "minutes", "duration_type": "minutes", "offset": 0, "duration": 0 } }, { "id": "SNCF-PBC-ZPGM", "type": "post_booking_conditions", "relationships": { "rules": { "data": [ { "id": "SNCF-PBC-ZPGM-PBR-HCAA", "type": "post_booking_rules" }, { "id": "SNCF-PBC-ZPGM-PBR-LYZL", "type": "post_booking_rules" }, { "id": "SNCF-PBC-ZPGM-PBR-MMZY", "type": "post_booking_rules" }, { "id": "SNCF-PBC-ZPGM-PBR-OIZO", "type": "post_booking_rules" }, { "id": "SNCF-PBC-ZPGM-PBR-ZZSA", "type": "post_booking_rules" } ] } } }, { "id": "SNCF-PBC-ZPGM-PBR-HCAA", "type": "post_booking_rules", "attributes": { "rule_type_identifier": "general_cancellation", "allowed": true, "description": "Fully refundable up to D-7 without fee. Cancellation is allowed before 30 minutes of departure, with applicable fees. Non-refundable within 30 minutes of departure.", "cutoff_context": "before_departure", "cutoff_in_minutes": 8640, "fee_context": "per_booking", "fee_type": "fixed", "fee_currency_code": "EUR", "fee_in_percent": null, "fee_in_cents": 1900 } }, { "id": "SNCF-PBC-ZPGM-PBR-LYZL", "type": "post_booking_rules", "attributes": { "rule_type_identifier": "fare_class_amendment", "allowed": true, "description": "Can be exchanged with fare adjustment without fee up to D-7. Fees apply from D-6 to departure: €19 charge on TGV and 40% of the price (max €15) on Intercités. From 30 minutes before departure, ticket may be exchanged once", "cutoff_context": "before_departure", "cutoff_in_minutes": 8640, "fee_context": "per_booking", "fee_type": "fixed", "fee_currency_code": "EUR", "fee_in_percent": null, "fee_in_cents": 1900 } }, { "id": "SNCF-PBC-ZPGM-PBR-MMZY", "type": "post_booking_rules", "attributes": { "rule_type_identifier": "origin_destination_amendment", "allowed": true, "description": "Can be exchanged with fare adjustment without fee up to D-7. Fees apply from D-6 to departure: €19 charge on TGV and 40% of the price (max €15) on Intercités. From 30 minutes before departure, ticket may be exchanged once", "cutoff_context": "before_departure", "cutoff_in_minutes": 8640, "fee_context": "per_booking", "fee_type": "fixed", "fee_currency_code": "EUR", "fee_in_percent": null, "fee_in_cents": 1900 } }, { "id": "SNCF-PBC-ZPGM-PBR-OIZO", "type": "post_booking_rules", "attributes": { "rule_type_identifier": "date_time_amendment", "allowed": true, "description": "Can be exchanged with fare adjustment without fee up to D-7. Fees apply from D-6 to departure: €19 charge on TGV and 40% of the price (max €15) on Intercités. From 30 minutes before departure, ticket may be exchanged once", "cutoff_context": "before_departure", "cutoff_in_minutes": 8640, "fee_context": "per_booking", "fee_type": "fixed", "fee_currency_code": "EUR", "fee_in_percent": null, "fee_in_cents": 1900 } }, { "id": "SNCF-PBC-ZPGM-PBR-ZZSA", "type": "post_booking_rules", "attributes": { "rule_type_identifier": "general_amendment", "allowed": false, "description": "Can be exchanged with fare adjustment without fee up to D-7. Fees apply from D-6 to departure: €19 charge on TGV and 40% of the price (max €15) on Intercités. From 30 minutes before departure, ticket may be exchanged once", "cutoff_context": "before_departure", "cutoff_in_minutes": 10080, "fee_context": "per_booking", "fee_type": "percentage", "fee_currency_code": "EUR", "fee_in_percent": "0.0", "fee_in_cents": null } }, { "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26", "type": "connections", "attributes": { "departure_time": "2025-11-30T09:16", "arrival_time": "2025-11-30T14:26" }, "relationships": { "departure_station": { "data": { "id": "FRLYSLYN", "type": "stations" } }, "arrival_station": { "data": { "id": "FRPARPRG", "type": "stations" } }, "marketing_carrier": { "data": { "id": "SNCF", "type": "marketing_carriers" } }, "segments": { "data": [ { "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T09:16-2025-11-30T14:26-0", "type": "segments" } ] }, "fees": { "data": [] } } } ] } • [Cancel Booking](https://docs.distribusion.com/dt/api/basic-integration/cancel-booking.md): Checking Cancellation Conditions Once a customer has booked a ticket, Distribusion enables customer facing platforms to display the cancellation conditions that apply to the user’s booking. The /cancellations/conditions endpoint requires only the booking_id to be specified and returns three parameters from which the cancellation conditions can be identified and clearly displayed: allowed : Boolean, specifies whether the booking is cancellable or not. fee : The charge that will apply to the cancellation of the booking and must be deducted from the booking price to compute the refund value. The value is provided in the carrier’s currency (fractional unit), which is also specified in the response. cutoff : The latest time at which the booking can be cancelled at this fee, e.g. 2025-06-15T06:05. Conducting a Cancellation The /cancellations/create endpoint enables the execution of the cancellation and requires only the booking_id to be specified. The response provides the information that can be displayed to the user to confirm the cancellation: total_price : The total price of the original booking. fee : The amount that has been charged for the cancellation. total_refund : The amount that can be refunded to the customer, calculated as total price - fee. created_at : Time stamp of execution of cancellation. The booking will be cancelled in the carrier’s system and accordingly accounted for in the following clearing cycle between the retail platform and Distribusion. For specific carriers like SNCF, a cancellation request may not be confirmed immediately. In these cases, the response from /cancellations/create will have a state of "pending" . This scenario requires a special asynchronous process to check for the final cancellation status. For complete details, please see the full guide on how to Support Asynchronous Cancellations . Partial Cancellations Partial cancellations are supported for select carriers, enabling you to cancel individual passengers or specific segments (outbound or inbound) from a booking without cancelling the entire reservation. Partial cancellations use the same /cancellations/conditions and /cancellations/create endpoints as full cancellations. To scope the cancellation, include one of the following optional parameters: connection_id : Cancel all passengers on a single bound (outbound or inbound) of a return trip passenger_ids[] : Cancel one or more specific passengers while keeping others active. When neither parameter is provided, the request is treated as a full cancellation. For complete implementation details, request/response examples, and parameter specifications, see the Partial Cancellations guide. Grace Period Cancellations For certain carriers, a special cancellation window known as a "grace period" is available, typically for a few hours after the booking is made. This allows for a cancellation, often without a fee, under specific conditions. Deutsche Bahn is one of the carriers that supports both regular and grace period cancellations. The duration of the grace period is not fixed; it can be 3, 6, or even 12 hours, depending on your agreement with DB. The type of cancellation you wish to perform is determined by the presence of the reason parameter in your API calls. To request a grace period cancellation for a DB booking, you must send a request to the /cancellations/conditions and /cancellations/create endpoints and include the parameter reason with value ticket_not_used . If you attempt a cancellation after the window has closed, the API will return a successful response but with allowed: false in the body, indicating that the grace period cancellation is not possible. Contact your Partnership Manager to confirm which carriers support Grace Period Cancellations. Technical Cancellations Technical cancellations, often referred to as "voids" in carrier terminology, allow retailers to cancel and refund a ticket immediately after booking, bypassing potential penalties or standard cancellation fees. This functionality is offered by Deutsche Bahn and SNCF and is intended strictly for cases where a technical issue occurred during the automated booking flow (e.g., a timeout with the Payment Service Provider where a ticket was issued but the payment failed, or a distribution channel error). To request a technical cancellation, you must include the parameter reason with value technical_cancellation in your API calls to /cancellations/conditions and /cancellations/create . If you attempt a cancellation after the window has closed, the API will return a successful response but with allowed: false in the body, indicating that the technical cancellation is not possible. SNCF usually allows technical cancellations for the duration of the current accounting session (the current day). This feature must only be used for genuine technical errors encountered during the booking flow. It must not be used as a workaround to bypass penalties for "real" functional refunds (e.g., a customer changing their mind after the booking flow is complete). Misuse of this parameter may result in compliance actions. Contact your Partnership Manager to confirm which carriers support Technical Cancellations. Best Practices Make live calls to /cancellations/conditions : The /cancellations/conditions endpoint is a live call to the carrier’s system and returns the conditions that are valid at the time of the request. These conditions can change over time if the carrier has dynamic cancellation conditions and should thus be retrieved whenever the user opens a page on which the cancellation conditions are displayed. Display the cancellation conditions to user : It is recommended to display the full conditions of cancellation to users at the time they initiate the process to request a cancellation. This could appear as a popup to confirm the cancellation, but it can also be displayed in other ways. Define sender of cancellation email : At the time of confirming the reservation you can specify if the user should receive the default confirmation and cancellation emails created by Distribusion or emails created by you. If set to false , you also have to create a version of the cancellation email. For more details check our Ticket Delivery guide . Enterprise Features Besides cancelling a booking, some carriers support amendments to bookings. For more details about how to handle it, check our Amendments guide . API Examples Sample Request to /cancellations/conditions HTTP https://api.distribusion.com/retailers/v4/cancellations/conditions?reason=ticket_not_used&booking=bKfceMXeLq_WeRIBspfsmg Sample Response from /cancellations/conditions JSON { "data": { "id": "bKfceMXeLq_WeRIBspfsmg", "type": "cancellation_conditions", "attributes": { "allowed": true, "fee": 580, "monetary_refund": 2320, "voucher_refund": 0, "reason": "ticket_not_used", "partially_cancellable": false, "cutoff": "2026-04-27T12:19" }, "relationships": { "deductions": { "data": [] }, "fees": { "data": [] } } }, "jsonapi": { "version": "1.0" }, "meta": { "currency": "EUR" }, "included": [] } Sample Request to /cancellations/create JSON { "booking": "bKfceMXeLq_WeRIBspfsmg", "reason": "ticket_not_used" } Sample Response from /cancellations/create JSON { "data": { "id": "ZRAOjgPvBje0jaLcK4VeAw", "type": "cancellations", "attributes": { "state": "confirmed", "reason": "ticket_not_used", "created_as_partial": false, "fully_cancelled": true, "total_price": 2900, "fee": 580, "latest_fee": 580, "total_refund": 2320, "latest_refund": 2320, "monetary_refund": 2320, "latest_monetary_refund": 2320, "voucher_refund": 0, "latest_voucher_refund": 0, "created_at": "2026-04-10T17:33", "confirmation_expected_at": null }, "relationships": { "agent": { "data": null }, "customer": { "data": null }, "fees": { "data": [] }, "vouchers": { "data": [] } } }, "jsonapi": { "version": "1.0" }, "meta": { "currency": "EUR" }, "included": [] } • [Enterprise Features](https://docs.distribusion.com/dt/api/enterprise-features.md): Our Enterprise customers have access to additional functionality to enrich the overall user experience. Reach out to your Partnership Manager for more information about unlocking these advanced features. Please note that these are all enterprise API features. Reach out to your Partnership Manager for more information about unlocking them and other advanced features. Selecting Seats : Allows the selection of seats (when supported by the carrier). Ancillaries : Book extras like luggage, seat preferences, and meals. Discount Cards : Supports various discounts like loyalty programs, promo codes, and specific corporate/negotiated fare cards. Negotiated & Corporate Fares : Ensures fare parity and supports custom negotiated fares for businesses with established carrier agreements. Amendments : Allows customers to modify booking details like trip specifics, passenger information, or ancillaries post-purchase, per carrier rules. Virtual Interlining : Combines trips from multiple carriers to create new route options. Emissions Data : Provides CO2 and CO2e data for trips to show environmental impact. GTFS : Enables bulk retrieval of carrier schedules in GTFS format. Suggestion Service : Offers location suggestions during search to improve user experience. Advanced Pricing Insights : Offers customers a better understanding of trip costs using a pricing calendar, pricing hints (current vs. regular price), and price trend forecasts. Real Time : Offers live tracking of trip progress and vehicle information. MCP Server : Wraps the Retailer API functionalities for AI agents using MCP server-to-server communication. Retailer Agent : An AI agent using natural language to guide users from trip search to checkout. Post-Sales AI Bot : Provides an AI chatbot for initial customer support on booking inquiries. • [Discount Cards](https://docs.distribusion.com/dt/api/enterprise-features/discount-cards.md): Particularly in rail transport, it is common for carriers to offer discounts in the form of loyalty cards, vouchers or other mechanisms. Distribusion supports retrieving and booking these reduced fares through the API. Please note that this is an enterprise API feature. Reach out to your Partnership Manager for more information about unlocking this and other advanced features. Discounts Supported Distribusion supports several types of discounts/special offers: Discount Cards : with fixed discount value or percentage: E.g. Eurostar/SNCF Corporate and Negotiated Fares. Deutsche Bahn’s Bahncard 50, Trenitalia’s Carta Verde, or PKP’s Big Family Card. This type of discount may require the input of proof and/or an association with a particular passenger type, e.g. a student discount might require the input of a student ID number and Adult as a passenger type. Loyalty Programs : E.g. Amtrak Guest Rewards. One-time Vouchers, Promo Codes : E.g. summer campaign voucher. Detailed information about the discounts supported by a specific carrier can be fetched via /cards endpoint. Information retreived from this endpoint is useful to generate descriptions and input fields to be displayed in the user interface. Parameters card_type : Type of an offer e.g. discount_card, loyalty, other name : Unique name-id of the card marketing_name : Localized text name of the discount card that can include spaces or special characters supported_carriers_fares[] : List of marketing codes of carriers and fare classes, for filtering compatible offers requires_code : If a card number/code needs to be validated during ordering to succesfully add the card (boolean) requires_presenting_card : If passenger is required to keep and present the card along with the ticket for it to be valid (boolean) context : Specifies the entity to which the card will be bound to provide its resulting advantage. Available options: Pax, Segment, Booking description : Localized text description of given discount/promo Context Types There are 2 types of discount cards available from Distribusion. They can apply to specific passengers, segments or to the whole booking. This can be seen from context type, the card has to be applied at pax , segment or booking level. When pushing the card details in the /connections/find and /connections/vacancy requests, use the correct JSON structure. If at the passenger level, include the cards array inside the specific passenger object within the passengers array. If at the booking level, use the root-level cards array. Card Application The Distribusion API supports various card types to provide discounted fares or enable loyalty tracking. Depending on the card type, they must be included at different stages of the search and booking flow. Discount Cards These are identified with the tag discount_card . When to add: Include these at the very beginning of the flow in the /connections/find request. Purpose: This ensures the search results return the best available price for the customer. Note on Carrier Support: While most carriers return the discounted price immediately in the search response, some carriers only apply the discount during the reservation step. In these cases, the price will update when calling /reservations/create. Loyalty Cards These are identified with the tag loyalty . When to add: These should typically be included at the checkout step in the /reservations/create request. Purpose: Loyalty cards generally do not affect the ticket price. Instead, they allow the carrier to track the journey and grant loyalty points or benefits to the passenger. Verifying Applied Cards Regardless of the card type or workflow stage, you can verify if a card was successfully processed by checking the response. If Distribusion and the carrier successfully process the card details, the response will include the card details within the applied_cards relationship array. For some carriers, the applied_cards array might return empty even though the cards were processed successfully. API Workflow Discounts can be leveraged through the API by filling the optional parameters at each step of the search and book workflow: Fetch supported discount card types from the /cards endpoint. Search for a trip with /connections/find and specify the precise passenger types and cards. The price returned will include the corresponding discount, or new fare classes will become available. When confirming the availability with the /connections/vacancy , again specify the applied discount cards. Create the reservation with the /reservations/create endpoint while specifying the applied discount cards. Continue with the Basic Integration flow. API Examples Sample Request to /cards HTTP https://api.demo.distribusion.com/retailers/v4/cards?locale=en&marketing_carriers[]=STES Sample Response from /cards JSON { "data": [ { "id": "DISTRIBUTION_AGREEMENT_EUROSTAR_STES", "type": "cards", "attributes": { "card_type": "discount_card", "carrier_card_id": "EUROSTAR", "name": "DISTRIBUTION_AGREEMENT_EUROSTAR_STES", "requires_code": true, "requires_presenting_card": false, "marketing_name": "Distribution agreement - Eurostar", "description": "Distribution agreement for Eurostar", "context": "pax", "supported_carrier_fares": [ { "marketing_carrier_code": "STES", "fare_class_code": "FARE-1", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-2", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-3", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-4", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-5", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-6", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null } ], "supported_passenger_type_codes": [ "PNOS", "PSOE", "PCIL", "PYPO", "PINT" ], "flow_type": "live", "source": "carrier", "supports_all_passenger_types": false, "expiration_date": null, "status": "active", "retailers": [], "supports_all_retailers": true, "requires_validity_from": false, "requires_validity_until": false } }, { "id": "ADVANTAGE_LIBERTE_STES", "type": "cards", "attributes": { "card_type": "discount_card", "carrier_card_id": "PLIB", "name": "ADVANTAGE_LIBERTE_STES", "requires_code": true, "requires_presenting_card": false, "marketing_name": "Liberte Discount Card ", "description": "Liberte Discount Card ", "context": "pax", "supported_carrier_fares": [ { "marketing_carrier_code": "STES", "fare_class_code": "FARE-1", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-2", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-3", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-4", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-5", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-6", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null } ], "supported_passenger_type_codes": [ "PNOS", "PSOE", "PCIL", "PYPO", "PINT" ], "flow_type": "live", "source": "carrier", "supports_all_passenger_types": false, "expiration_date": null, "status": "active", "retailers": [], "supports_all_retailers": true, "requires_validity_from": false, "requires_validity_until": false } }, { "id": "ADVANTAGE_FAMILLE30_SNCF", "type": "cards", "attributes": { "card_type": "discount_card", "carrier_card_id": "FN30", "name": "ADVANTAGE_FAMILLE30_SNCF", "requires_code": false, "requires_presenting_card": false, "marketing_name": "Family Discount Card 30%", "description": "Family Discount Card 30%", "context": "pax", "supported_carrier_fares": [ { "marketing_carrier_code": "STES", "fare_class_code": "FARE-1", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-2", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-3", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-4", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-5", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-6", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null } ], "supported_passenger_type_codes": [ "PNOS", "PSOE", "PCIL", "PYPO", "PINT" ], "flow_type": "live", "source": "carrier", "supports_all_passenger_types": false, "expiration_date": null, "status": "active", "retailers": [], "supports_all_retailers": true, "requires_validity_from": false, "requires_validity_until": false } }, { "id": "LOYALTY_CLUB_EUROSTAR", "type": "cards", "attributes": { "card_type": "loyalty", "carrier_card_id": "Loyalty_eurostar", "name": "LOYALTY_CLUB_EUROSTAR", "requires_code": true, "requires_presenting_card": false, "marketing_name": "Club Eurostar", "description": "Club Eurostar Loyalty Card", "context": "pax", "supported_carrier_fares": [ { "marketing_carrier_code": "STES", "fare_class_code": "FARE-1", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-2", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-3", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-4", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-5", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-6", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null } ], "supported_passenger_type_codes": [ "PNOS", "PSOE", "PCIL", "PYPO", "PINT" ], "flow_type": "live", "source": "carrier", "supports_all_passenger_types": false, "expiration_date": null, "status": "active", "retailers": [], "supports_all_retailers": true, "requires_validity_from": false, "requires_validity_until": false } }, { "id": "LOYALTY_GRAND_VOYAGEUR", "type": "cards", "attributes": { "card_type": "loyalty", "carrier_card_id": "loyalty", "name": "LOYALTY_GRAND_VOYAGEUR", "requires_code": true, "requires_presenting_card": false, "marketing_name": "Grand Voyageur", "description": "Grand Voyageur", "context": "pax", "supported_carrier_fares": [ { "marketing_carrier_code": "STES", "fare_class_code": "FARE-1", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-2", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-3", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-4", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-5", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-6", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null } ], "supported_passenger_type_codes": [ "PNOS", "PSOE", "PCIL", "PYPO", "PINT" ], "flow_type": "live", "source": "carrier", "supports_all_passenger_types": false, "expiration_date": null, "status": "active", "retailers": [], "supports_all_retailers": true, "requires_validity_from": false, "requires_validity_until": false } }, { "id": "LOYALTY_GRAND_VOYAGEUR_LE_CLUB", "type": "cards", "attributes": { "card_type": "loyalty", "carrier_card_id": "loyalty_leclub", "name": "LOYALTY_GRAND_VOYAGEUR_LE_CLUB", "requires_code": true, "requires_presenting_card": false, "marketing_name": "Grand Voyageur Le Club", "description": "Grand Voyageur Le Club", "context": "pax", "supported_carrier_fares": [ { "marketing_carrier_code": "STES", "fare_class_code": "FARE-1", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-2", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-3", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-4", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-5", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-6", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null } ], "supported_passenger_type_codes": [ "PNOS", "PSOE", "PCIL", "PYPO", "PINT" ], "flow_type": "live", "source": "carrier", "supports_all_passenger_types": false, "expiration_date": null, "status": "active", "retailers": [], "supports_all_retailers": true, "requires_validity_from": false, "requires_validity_until": false } }, { "id": "DISTRIBUTION_AGREEMENT_SNCF_STES", "type": "cards", "attributes": { "card_type": "discount_card", "carrier_card_id": "SNCF", "name": "DISTRIBUTION_AGREEMENT_SNCF_STES", "requires_code": true, "requires_presenting_card": false, "marketing_name": "Distribution agreement - SNCF", "description": "Distribution agreement for SNCF", "context": "pax", "supported_carrier_fares": [ { "marketing_carrier_code": "STES", "fare_class_code": "FARE-1", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-2", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-3", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-4", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-5", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-6", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null } ], "supported_passenger_type_codes": [ "PNOS", "PSOE", "PCIL", "PYPO", "PINT" ], "flow_type": "live", "source": "carrier", "supports_all_passenger_types": false, "expiration_date": null, "status": "active", "retailers": [], "supports_all_retailers": true, "requires_validity_from": false, "requires_validity_until": false } }, { "id": "RIT_SVI", "type": "cards", "attributes": { "card_type": "discount_card", "carrier_card_id": "RIT_SVI", "name": "RIT_SVI", "requires_code": true, "requires_presenting_card": false, "marketing_name": "RIT_SVI", "description": "RIT_SVI", "context": "pax", "supported_carrier_fares": [ { "marketing_carrier_code": "STES", "fare_class_code": "FARE-1", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-2", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-3", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-4", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-5", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-6", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null } ], "supported_passenger_type_codes": [ "PNOS" ], "flow_type": "live", "source": "carrier", "supports_all_passenger_types": false, "expiration_date": null, "status": "active", "retailers": [], "supports_all_retailers": true, "requires_validity_from": false, "requires_validity_until": false } }, { "id": "RIT_SNCF", "type": "cards", "attributes": { "card_type": "discount_card", "carrier_card_id": "RIT", "name": "RIT_SNCF", "requires_code": false, "requires_presenting_card": false, "marketing_name": "RIT SNCF Domestic", "description": "RIT Fares SNCF Domestic", "context": "booking", "supported_carrier_fares": [ { "marketing_carrier_code": "STES", "fare_class_code": "FARE-1", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-2", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-3", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-4", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-5", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null }, { "marketing_carrier_code": "STES", "fare_class_code": "FARE-6", "supports_all_fare_classes": false, "supports_all_carriers": false, "discount_value": null, "discount_type": null } ], "supported_passenger_type_codes": [ "PNOS", "PSOE", "PCIL", "PYPO", "PINT" ], "flow_type": "live", "source": "carrier", "supports_all_passenger_types": false, "expiration_date": null, "status": "active", "retailers": [], "supports_all_retailers": true, "requires_validity_from": false, "requires_validity_until": false } } ], "jsonapi": { "version": "1.0" }, "meta": { "locale": "en" } } Sample Request to /connections/find JSON { "locale": "en", "currency": "EUR", "search_bounds": [ { "is_requested": true, "departure_date": "2025-11-30", "departure_start_time": "10:00", "departure_end_time": "10:20", "departure_location": { "type": "city", "value": "FRLYS" }, "arrival_location": { "type": "city", "value": "FRPAR" } } ], "passengers": [ { "pax": 1, "max_age": 33, "cards": [ { "name": "DISTRIBUTION_AGREEMENT_EUROSTAR_STES", "code": "C002Z62" } ] } ] } Sample Response from /connections/find JSON { "data": [ { "attributes": { "arrival_time": "2025-11-30T12:09", "booked_out": false, "cheapest_fare_class_code": "FARE-4", "cheapest_total_adult_price": 4600, "departure_time": "2025-11-30T10:04", "duration": 7500, "electronic_ticket_available": false, "leg_type": "outbound", "offer_bundle": null, "offer_id": null, "total_seats_left": null }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0", "relationships": { "arrival_station": { "data": { "id": "FRPARPRG", "type": "stations" } }, "departure_station": { "data": { "id": "FRLYSLYN", "type": "stations" } }, "fares": { "data": [ { "fare_class": { "code": "FARE-4", "id": "SNCF-FARE-4", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-4-C-pax-33-1-C-0", "original_price": 4600, "price": 4600, "type": "fares" }, { "fare_class": { "code": "FARE-5", "id": "SNCF-FARE-5", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-5-C-pax-33-1-C-0", "original_price": 5900, "price": 5900, "type": "fares" }, { "fare_class": { "code": "FARE-2", "id": "SNCF-FARE-2", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-2-C-pax-33-1-C-0", "original_price": 6300, "price": 6300, "type": "fares" }, { "fare_class": { "code": "FARE-1", "id": "SNCF-FARE-1", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-1-C-pax-33-1-C-0", "original_price": 16000, "price": 16000, "type": "fares" } ] }, "marketing_carrier": { "data": { "id": "SNCF", "type": "marketing_carriers" } }, "partial_fares": { "data": [] }, "segments": { "data": [ { "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-0", "type": "segments" } ] } }, "type": "connections" }, { "attributes": { "arrival_time": "2025-11-30T12:09", "booked_out": false, "cheapest_fare_class_code": "FARE-4", "cheapest_total_adult_price": 4600, "departure_time": "2025-11-30T10:04", "duration": 7500, "electronic_ticket_available": false, "leg_type": "outbound", "offer_bundle": null, "offer_id": null, "total_seats_left": null }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0", "relationships": { "arrival_station": { "data": { "id": "FRPARPRG", "type": "stations" } }, "departure_station": { "data": { "id": "FRLYSLYN", "type": "stations" } }, "fares": { "data": [ { "fare_class": { "code": "FARE-4", "id": "SNCF-FARE-4", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-4-C-pax-33-1-C-0", "original_price": 4600, "price": 4600, "type": "fares" }, { "fare_class": { "code": "FARE-5", "id": "SNCF-FARE-5", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-5-C-pax-33-1-C-0", "original_price": 5900, "price": 5900, "type": "fares" }, { "fare_class": { "code": "FARE-2", "id": "SNCF-FARE-2", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-2-C-pax-33-1-C-0", "original_price": 6300, "price": 6300, "type": "fares" }, { "fare_class": { "code": "FARE-1", "id": "SNCF-FARE-1", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-1-C-pax-33-1-C-0", "original_price": 16000, "price": 16000, "type": "fares" } ] }, "marketing_carrier": { "data": { "id": "SNCF", "type": "marketing_carriers" } }, "partial_fares": { "data": [] }, "segments": { "data": [ { "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-0", "type": "segments" } ] } }, "type": "connections" }, { "attributes": { "arrival_time": "2025-11-30T12:09", "booked_out": false, "cheapest_fare_class_code": "FARE-4", "cheapest_total_adult_price": 4600, "departure_time": "2025-11-30T10:04", "duration": 7500, "electronic_ticket_available": false, "leg_type": "outbound", "offer_bundle": null, "offer_id": null, "total_seats_left": null }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0", "relationships": { "arrival_station": { "data": { "id": "FRPARPRG", "type": "stations" } }, "departure_station": { "data": { "id": "FRLYSLYN", "type": "stations" } }, "fares": { "data": [ { "fare_class": { "code": "FARE-4", "id": "SNCF-FARE-4", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-4-C-pax-33-1-C-0", "original_price": 4600, "price": 4600, "type": "fares" }, { "fare_class": { "code": "FARE-5", "id": "SNCF-FARE-5", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-5-C-pax-33-1-C-0", "original_price": 5900, "price": 5900, "type": "fares" }, { "fare_class": { "code": "FARE-2", "id": "SNCF-FARE-2", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-2-C-pax-33-1-C-0", "original_price": 6300, "price": 6300, "type": "fares" }, { "fare_class": { "code": "FARE-1", "id": "SNCF-FARE-1", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-1-C-pax-33-1-C-0", "original_price": 16000, "price": 16000, "type": "fares" } ] }, "marketing_carrier": { "data": { "id": "SNCF", "type": "marketing_carriers" } }, "partial_fares": { "data": [] }, "segments": { "data": [ { "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-0", "type": "segments" } ] } }, "type": "connections" }, { "attributes": { "arrival_time": "2025-11-30T12:09", "booked_out": false, "cheapest_fare_class_code": "FARE-4", "cheapest_total_adult_price": 4600, "departure_time": "2025-11-30T10:04", "duration": 7500, "electronic_ticket_available": false, "leg_type": "outbound", "offer_bundle": null, "offer_id": null, "total_seats_left": null }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0", "relationships": { "arrival_station": { "data": { "id": "FRPARPRG", "type": "stations" } }, "departure_station": { "data": { "id": "FRLYSLYN", "type": "stations" } }, "fares": { "data": [ { "fare_class": { "code": "FARE-4", "id": "SNCF-FARE-4", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-4-C-pax-33-1-C-0", "original_price": 4600, "price": 4600, "type": "fares" }, { "fare_class": { "code": "FARE-5", "id": "SNCF-FARE-5", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-5-C-pax-33-1-C-0", "original_price": 5900, "price": 5900, "type": "fares" }, { "fare_class": { "code": "FARE-2", "id": "SNCF-FARE-2", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-2-C-pax-33-1-C-0", "original_price": 6300, "price": 6300, "type": "fares" }, { "fare_class": { "code": "FARE-1", "id": "SNCF-FARE-1", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-1-C-pax-33-1-C-0", "original_price": 16000, "price": 16000, "type": "fares" } ] }, "marketing_carrier": { "data": { "id": "SNCF", "type": "marketing_carriers" } }, "partial_fares": { "data": [] }, "segments": { "data": [ { "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-0", "type": "segments" } ] } }, "type": "connections" }, { "attributes": { "arrival_time": "2025-11-30T12:09", "booked_out": false, "cheapest_fare_class_code": "FARE-4", "cheapest_total_adult_price": 4600, "departure_time": "2025-11-30T10:04", "duration": 7500, "electronic_ticket_available": false, "leg_type": "outbound", "offer_bundle": null, "offer_id": null, "total_seats_left": null }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0", "relationships": { "arrival_station": { "data": { "id": "FRPARPRG", "type": "stations" } }, "departure_station": { "data": { "id": "FRLYSLYN", "type": "stations" } }, "fares": { "data": [ { "fare_class": { "code": "FARE-4", "id": "SNCF-FARE-4", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-4-C-pax-33-1-C-0", "original_price": 4600, "price": 4600, "type": "fares" }, { "fare_class": { "code": "FARE-5", "id": "SNCF-FARE-5", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-5-C-pax-33-1-C-0", "original_price": 5900, "price": 5900, "type": "fares" }, { "fare_class": { "code": "FARE-2", "id": "SNCF-FARE-2", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-2-C-pax-33-1-C-0", "original_price": 6300, "price": 6300, "type": "fares" }, { "fare_class": { "code": "FARE-1", "id": "SNCF-FARE-1", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-1-C-pax-33-1-C-0", "original_price": 16000, "price": 16000, "type": "fares" } ] }, "marketing_carrier": { "data": { "id": "SNCF", "type": "marketing_carriers" } }, "partial_fares": { "data": [] }, "segments": { "data": [ { "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-0", "type": "segments" } ] } }, "type": "connections" }, { "attributes": { "arrival_time": "2025-11-30T12:09", "booked_out": false, "cheapest_fare_class_code": "FARE-4", "cheapest_total_adult_price": 4600, "departure_time": "2025-11-30T10:04", "duration": 7500, "electronic_ticket_available": false, "leg_type": "outbound", "offer_bundle": null, "offer_id": null, "total_seats_left": null }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0", "relationships": { "arrival_station": { "data": { "id": "FRPARPRG", "type": "stations" } }, "departure_station": { "data": { "id": "FRLYSLYN", "type": "stations" } }, "fares": { "data": [ { "fare_class": { "code": "FARE-4", "id": "SNCF-FARE-4", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-4-C-pax-33-1-C-0", "original_price": 4600, "price": 4600, "type": "fares" }, { "fare_class": { "code": "FARE-5", "id": "SNCF-FARE-5", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-5-C-pax-33-1-C-0", "original_price": 5900, "price": 5900, "type": "fares" }, { "fare_class": { "code": "FARE-2", "id": "SNCF-FARE-2", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-2-C-pax-33-1-C-0", "original_price": 6300, "price": 6300, "type": "fares" }, { "fare_class": { "code": "FARE-1", "id": "SNCF-FARE-1", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-1-C-pax-33-1-C-0", "original_price": 16000, "price": 16000, "type": "fares" } ] }, "marketing_carrier": { "data": { "id": "SNCF", "type": "marketing_carriers" } }, "partial_fares": { "data": [] }, "segments": { "data": [ { "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-0", "type": "segments" } ] } }, "type": "connections" }, { "attributes": { "arrival_time": "2025-11-30T12:09", "booked_out": false, "cheapest_fare_class_code": "FARE-4", "cheapest_total_adult_price": 4600, "departure_time": "2025-11-30T10:04", "duration": 7500, "electronic_ticket_available": false, "leg_type": "outbound", "offer_bundle": null, "offer_id": null, "total_seats_left": null }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0", "relationships": { "arrival_station": { "data": { "id": "FRPARPRG", "type": "stations" } }, "departure_station": { "data": { "id": "FRLYSLYN", "type": "stations" } }, "fares": { "data": [ { "fare_class": { "code": "FARE-4", "id": "SNCF-FARE-4", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-4-C-pax-33-1-C-0", "original_price": 4600, "price": 4600, "type": "fares" }, { "fare_class": { "code": "FARE-5", "id": "SNCF-FARE-5", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-5-C-pax-33-1-C-0", "original_price": 5900, "price": 5900, "type": "fares" }, { "fare_class": { "code": "FARE-2", "id": "SNCF-FARE-2", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-2-C-pax-33-1-C-0", "original_price": 6300, "price": 6300, "type": "fares" }, { "fare_class": { "code": "FARE-1", "id": "SNCF-FARE-1", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-1-C-pax-33-1-C-0", "original_price": 16000, "price": 16000, "type": "fares" } ] }, "marketing_carrier": { "data": { "id": "SNCF", "type": "marketing_carriers" } }, "partial_fares": { "data": [] }, "segments": { "data": [ { "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-0", "type": "segments" } ] } }, "type": "connections" }, { "attributes": { "arrival_time": "2025-11-30T12:09", "booked_out": false, "cheapest_fare_class_code": "FARE-4", "cheapest_total_adult_price": 4600, "departure_time": "2025-11-30T10:04", "duration": 7500, "electronic_ticket_available": false, "leg_type": "outbound", "offer_bundle": null, "offer_id": null, "total_seats_left": null }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0", "relationships": { "arrival_station": { "data": { "id": "FRPARPRG", "type": "stations" } }, "departure_station": { "data": { "id": "FRLYSLYN", "type": "stations" } }, "fares": { "data": [ { "fare_class": { "code": "FARE-4", "id": "SNCF-FARE-4", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-4-C-pax-33-1-C-0", "original_price": 4600, "price": 4600, "type": "fares" }, { "fare_class": { "code": "FARE-5", "id": "SNCF-FARE-5", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-5-C-pax-33-1-C-0", "original_price": 5900, "price": 5900, "type": "fares" }, { "fare_class": { "code": "FARE-2", "id": "SNCF-FARE-2", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-2-C-pax-33-1-C-0", "original_price": 6300, "price": 6300, "type": "fares" }, { "fare_class": { "code": "FARE-1", "id": "SNCF-FARE-1", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-1-C-pax-33-1-C-0", "original_price": 16000, "price": 16000, "type": "fares" } ] }, "marketing_carrier": { "data": { "id": "SNCF", "type": "marketing_carriers" } }, "partial_fares": { "data": [] }, "segments": { "data": [ { "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-0", "type": "segments" } ] } }, "type": "connections" }, { "attributes": { "arrival_time": "2025-11-30T12:09", "booked_out": false, "cheapest_fare_class_code": "FARE-4", "cheapest_total_adult_price": 4600, "departure_time": "2025-11-30T10:04", "duration": 7500, "electronic_ticket_available": false, "leg_type": "outbound", "offer_bundle": null, "offer_id": null, "total_seats_left": null }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0", "relationships": { "arrival_station": { "data": { "id": "FRPARPRG", "type": "stations" } }, "departure_station": { "data": { "id": "FRLYSLYN", "type": "stations" } }, "fares": { "data": [ { "fare_class": { "code": "FARE-4", "id": "SNCF-FARE-4", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-4-C-pax-33-1-C-0", "original_price": 4600, "price": 4600, "type": "fares" }, { "fare_class": { "code": "FARE-5", "id": "SNCF-FARE-5", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-5-C-pax-33-1-C-0", "original_price": 5900, "price": 5900, "type": "fares" }, { "fare_class": { "code": "FARE-2", "id": "SNCF-FARE-2", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-2-C-pax-33-1-C-0", "original_price": 6300, "price": 6300, "type": "fares" }, { "fare_class": { "code": "FARE-1", "id": "SNCF-FARE-1", "type": "fare_classes" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-1-C-pax-33-1-C-0", "original_price": 16000, "price": 16000, "type": "fares" } ] }, "marketing_carrier": { "data": { "id": "SNCF", "type": "marketing_carriers" } }, "partial_fares": { "data": [] }, "segments": { "data": [ { "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-0", "type": "segments" } ] } }, "type": "connections" } ], "included": [ { "attributes": { "arrival_time": "2025-11-30T12:09", "departure_time": "2025-11-30T10:04", "index": 0, "line": "6612", "line_prefix": "TGV INOUI", "vehicle_number": "6612" }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-0", "relationships": { "amenities": { "data": [ { "id": "STIO-DRFF", "type": "amenities" }, { "id": "STIO-AAFR", "type": "amenities" }, { "id": "STIO-BABF", "type": "amenities" }, { "id": "STIO-PSOC", "type": "amenities" }, { "id": "STIO-WIFI", "type": "amenities" } ] }, "arrival_station": { "data": { "id": "FRPARPRG", "type": "stations" } }, "departure_station": { "data": { "id": "FRLYSLYN", "type": "stations" } }, "fares": { "data": [] }, "marketing_carrier": { "data": { "id": "SNCF", "type": "marketing_carriers" } }, "operating_carrier": { "data": { "id": "STIO", "type": "operating_carriers" } }, "vehicle": { "data": { "id": "TRAIN-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-0", "type": "vehicles" } } }, "type": "segments" }, { "id": "TRAIN-SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-0", "relationships": { "vehicle_type": { "data": { "id": "TRAIN", "type": "vehicle_types" } } }, "type": "vehicles" }, { "attributes": { "code": "TRAIN" }, "id": "TRAIN", "type": "vehicle_types" }, { "attributes": { "booked_out": false, "booking_type": "standalone", "offer_expires_at": "2025-11-28T18:27:02.718030Z", "offer_id": "e601aea4-963b-411a-9e8f-daf695870c2c|0", "original_price": 4600, "passenger_coverage_type": "collective", "passenger_ids": [ "pax-33-1" ], "price": 4600, "seats_left": 75, "segment_coverage_type": "collective", "segment_ids": [ "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-0" ], "services": [ { "passenger_ids": [ "pax-33-1" ], "segment_ids": [ "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-0" ], "service_type_id": "SERVICE-TYPE-ADMISSION" }, { "passenger_ids": [ "pax-33-1" ], "segment_ids": [ "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-0" ], "service_type_id": "SERVICE-TYPE-SEAT" } ] }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-4-C-pax-33-1-C-0", "relationships": { "applied_cards": { "data": [] }, "conditions": { "data": [ { "id": "SNCF-65cbad5a7a8292323-9211e8bb861409e0e", "type": "fare_conditions" } ] }, "fare_class": { "data": { "id": "SNCF-FARE-4", "type": "fare_classes" } }, "products": { "data": [ { "id": "SNCF-PRODUCT-2-second", "type": "products" } ] }, "promotional_campaigns": { "data": [] } }, "type": "fares" }, { "attributes": { "booked_out": false, "booking_type": "standalone", "offer_expires_at": "2025-11-28T18:27:02.718030Z", "offer_id": "e601aea4-963b-411a-9e8f-daf695870c2c|1", "original_price": 5900, "passenger_coverage_type": "collective", "passenger_ids": [ "pax-33-1" ], "price": 5900, "seats_left": 20, "segment_coverage_type": "collective", "segment_ids": [ "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-0" ], "services": [ { "passenger_ids": [ "pax-33-1" ], "segment_ids": [ "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-0" ], "service_type_id": "SERVICE-TYPE-ADMISSION" }, { "passenger_ids": [ "pax-33-1" ], "segment_ids": [ "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-0" ], "service_type_id": "SERVICE-TYPE-SEAT" } ] }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-5-C-pax-33-1-C-0", "relationships": { "applied_cards": { "data": [] }, "conditions": { "data": [ { "id": "SNCF-28378ca1c779423b0-27364cc090635cc75", "type": "fare_conditions" } ] }, "fare_class": { "data": { "id": "SNCF-FARE-5", "type": "fare_classes" } }, "products": { "data": [ { "id": "SNCF-PRODUCT-2-second", "type": "products" } ] }, "promotional_campaigns": { "data": [] } }, "type": "fares" }, { "attributes": { "booked_out": false, "booking_type": "standalone", "offer_expires_at": "2025-11-28T18:27:02.718030Z", "offer_id": "e601aea4-963b-411a-9e8f-daf695870c2c|2", "original_price": 6300, "passenger_coverage_type": "collective", "passenger_ids": [ "pax-33-1" ], "price": 6300, "seats_left": 8, "segment_coverage_type": "collective", "segment_ids": [ "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-0" ], "services": [ { "passenger_ids": [ "pax-33-1" ], "segment_ids": [ "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-0" ], "service_type_id": "SERVICE-TYPE-ADMISSION" }, { "passenger_ids": [ "pax-33-1" ], "segment_ids": [ "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-0" ], "service_type_id": "SERVICE-TYPE-SEAT" } ] }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-2-C-pax-33-1-C-0", "relationships": { "applied_cards": { "data": [] }, "conditions": { "data": [ { "id": "SNCF-5743143faff8db09e-f871ebbda566c95f3", "type": "fare_conditions" } ] }, "fare_class": { "data": { "id": "SNCF-FARE-2", "type": "fare_classes" } }, "products": { "data": [ { "id": "SNCF-PRODUCT-1-first", "type": "products" } ] }, "promotional_campaigns": { "data": [] } }, "type": "fares" }, { "attributes": { "booked_out": false, "booking_type": "standalone", "offer_expires_at": "2025-11-28T18:27:02.718030Z", "offer_id": "e601aea4-963b-411a-9e8f-daf695870c2c|3", "original_price": 16000, "passenger_coverage_type": "collective", "passenger_ids": [ "pax-33-1" ], "price": 16000, "seats_left": 102, "segment_coverage_type": "collective", "segment_ids": [ "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-0" ], "services": [ { "passenger_ids": [ "pax-33-1" ], "segment_ids": [ "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-0" ], "service_type_id": "SERVICE-TYPE-ADMISSION" }, { "passenger_ids": [ "pax-33-1" ], "segment_ids": [ "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-0" ], "service_type_id": "SERVICE-TYPE-SEAT" } ] }, "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0-FARE-1-C-pax-33-1-C-0", "relationships": { "applied_cards": { "data": [] }, "conditions": { "data": [ { "id": "SNCF-72380adbcf89ece32-30a2f9e533d25e8c2", "type": "fare_conditions" } ] }, "fare_class": { "data": { "id": "SNCF-FARE-1", "type": "fare_classes" } }, "products": { "data": [ { "id": "SNCF-PRODUCT-1-first", "type": "products" } ] }, "promotional_campaigns": { "data": [] } }, "type": "fares" }, { "attributes": { "code": "CONDITION-6", "description": "LYON PART DIEU - PARIS GARE DE LYON - Tarif NO FLEX \nThis ticket may neither be exchanged nor refunded.\n", "exchangeable": "no", "refundable": "no", "title": "Tarif NO FLEX " }, "id": "SNCF-65cbad5a7a8292323-9211e8bb861409e0e", "type": "fare_conditions" }, { "attributes": { "code": "CONDITION-5", "description": "LYON PART DIEU - PARIS GARE DE LYON - Tarif STANDARD SECONDE\nTicket may be exchanged (with adjustment to the current fare) or refunded free of charge up to D-7. From D-6 and up to departure: €19 charge on TGV and 40% of the price (max €15) on Intercités. From 30 minutes before departure, ticket may be exchanged once and not refunded thereafter.\n", "exchangeable": "yes", "refundable": "yes", "title": "Tarif STANDARD SECONDE" }, "id": "SNCF-28378ca1c779423b0-27364cc090635cc75", "type": "fare_conditions" }, { "attributes": { "code": "CONDITION-4", "description": "LYON PART DIEU - PARIS GARE DE LYON - Tarif STANDARD PREMIÈRE\nTicket may be exchanged (with adjustment to the current fare) or refunded free of charge up to D-7. From D-6 and up to departure: €19 charge on TGV and 40% of the price (max €15) on Intercités. From 30 minutes before departure, ticket may be exchanged once and not refunded thereafter.\n", "exchangeable": "yes", "refundable": "yes", "title": "Tarif STANDARD PREMIÈRE" }, "id": "SNCF-5743143faff8db09e-f871ebbda566c95f3", "type": "fare_conditions" }, { "attributes": { "code": "CONDITION-7", "description": "LYON PART DIEU - PARIS GARE DE LYON - Tarif FLEX PREMIÈRE\nExchange or refund free of charge up to 30 minutes after departure.\nFrom 30 minutes before departure, ticket may be exchanged once and will not be refunded thereafter.\nIf you are taking another train, exchange is compulsory.\n", "exchangeable": "yes", "refundable": "yes", "title": "Tarif FLEX PREMIÈRE" }, "id": "SNCF-72380adbcf89ece32-30a2f9e533d25e8c2", "type": "fare_conditions" }, { "attributes": { "code": "DRFF", "description": "Drinks for fee", "name": "Drinks for fee" }, "id": "STIO-DRFF", "type": "amenities" }, { "attributes": { "code": "AAFR", "description": "The vehicle is easily accessible for people who use wheelchairs.", "name": "Accessible area for wheelchairs" }, "id": "STIO-AAFR", "type": "amenities" }, { "attributes": { "code": "BABF", "description": "Baby changing facilities", "name": "Baby changing facilities" }, "id": "STIO-BABF", "type": "amenities" }, { "attributes": { "code": "PSOC", "description": "Power supply is available at every seat.", "name": "Power Socket" }, "id": "STIO-PSOC", "type": "amenities" }, { "attributes": { "code": "WIFI", "description": "Wifi is available on board.", "name": "Wifi" }, "id": "STIO-WIFI", "type": "amenities" }, { "attributes": { "code": "PRODUCT-2", "description": "Second class travel option", "name": "Second Class", "travel_class": "second" }, "id": "SNCF-PRODUCT-2-second", "type": "products" }, { "attributes": { "code": "PRODUCT-1", "description": "First class travel option", "name": "First Class", "travel_class": "first" }, "id": "SNCF-PRODUCT-1-first", "type": "products" }, { "attributes": { "category": "ADMISSION", "code": "ADMISSION", "description": "Admission right to board the train", "title": "Admission" }, "id": "SERVICE-TYPE-ADMISSION", "type": "service_types" }, { "attributes": { "category": "SEAT", "code": "SEAT", "description": "A Seat is included and auto-selected", "title": "Seat" }, "id": "SERVICE-TYPE-SEAT", "type": "service_types" }, { "attributes": { "age": 33 }, "id": "pax-33-1", "type": "passengers" }, { "attributes": { "booking_fee": 0, "code": "SNCF", "legal_name": "SNCF", "markup_fee_percentage": 0.0, "trade_name": "SNCF" }, "id": "SNCF", "relationships": { "extra_types": { "data": [] }, "fare_classes": { "data": [ { "id": "SNCF-FARE-1", "type": "fare_classes" }, { "id": "SNCF-FARE-10", "type": "fare_classes" }, { "id": "SNCF-FARE-11", "type": "fare_classes" }, { "id": "SNCF-FARE-12", "type": "fare_classes" }, { "id": "SNCF-FARE-13", "type": "fare_classes" }, { "id": "SNCF-FARE-14", "type": "fare_classes" }, { "id": "SNCF-FARE-2", "type": "fare_classes" }, { "id": "SNCF-FARE-3", "type": "fare_classes" }, { "id": "SNCF-FARE-4", "type": "fare_classes" }, { "id": "SNCF-FARE-5", "type": "fare_classes" }, { "id": "SNCF-FARE-6", "type": "fare_classes" }, { "id": "SNCF-FARE-7", "type": "fare_classes" }, { "id": "SNCF-FARE-8", "type": "fare_classes" }, { "id": "SNCF-FARE-9", "type": "fare_classes" } ] }, "passenger_types": { "data": [ { "id": "PNOS", "type": "passenger_types" }, { "id": "PCIL", "type": "passenger_types" }, { "id": "PINT", "type": "passenger_types" }, { "id": "PYPO", "type": "passenger_types" }, { "id": "PSOE", "type": "passenger_types" } ] } }, "type": "marketing_carriers" }, { "attributes": { "code": "STIO", "legal_name": "SNCF", "trade_name": "TGV inOui" }, "id": "STIO", "type": "operating_carriers" }, { "attributes": { "code": "PNOS", "description": "", "max_age": 59, "min_age": 26, "name": "Adult" }, "id": "PNOS", "type": "passenger_types" }, { "attributes": { "code": "PCIL", "description": "", "max_age": 11, "min_age": 4, "name": "Child" }, "id": "PCIL", "type": "passenger_types" }, { "attributes": { "code": "PINT", "description": "", "max_age": 3, "min_age": 0, "name": "Infant" }, "id": "PINT", "type": "passenger_types" }, { "attributes": { "code": "PYPO", "description": "", "max_age": 25, "min_age": 12, "name": "Youth" }, "id": "PYPO", "type": "passenger_types" }, { "attributes": { "code": "PSOE", "description": "", "max_age": 99, "min_age": 60, "name": "Senior" }, "id": "PSOE", "type": "passenger_types" }, { "attributes": { "code": "FRLYSLYN", "description": null, "latitude": 45.760559, "longitude": 4.859355, "name": "Lyon Part Dieu Train Station", "street_and_number": "Place Charles Béraudier", "time_zone": "Europe/Paris", "zip_code": "69003" }, "id": "FRLYSLYN", "relationships": { "area": { "data": null }, "city": { "data": { "id": "FRLYS", "type": "cities" } } }, "type": "stations" }, { "attributes": { "code": "FRPARPRG", "description": null, "latitude": 48.84489, "longitude": 2.37352, "name": "Paris Gare de Lyon Hall 1 & 2 Train Station", "street_and_number": "Pl. Louis-Armand hall 1", "time_zone": "Europe/Paris", "zip_code": "75012" }, "id": "FRPARPRG", "relationships": { "area": { "data": null }, "city": { "data": { "id": "FRPAR", "type": "cities" } } }, "type": "stations" }, { "attributes": { "code": "FRLYS", "name": "Lyon" }, "id": "FRLYS", "type": "cities" }, { "attributes": { "code": "FRPAR", "name": "Paris" }, "id": "FRPAR", "type": "cities" }, { "attributes": { "code": "FARE-1", "iata_category": "First Class", "journey_type": "single", "name": "First Class - Flexi" }, "id": "SNCF-FARE-1", "relationships": { "fare_features": { "data": [ { "id": "SNCF-PREF", "type": "fare_features" } ] } }, "type": "fare_classes" }, { "attributes": { "code": "FARE-10", "iata_category": "Economy Class", "journey_type": "single", "name": "Tarif No Flex" }, "id": "SNCF-FARE-10", "relationships": { "fare_features": { "data": [] } }, "type": "fare_classes" }, { "attributes": { "code": "FARE-11", "iata_category": "Economy Class", "journey_type": "single", "name": "Tarif Standard Seconde" }, "id": "SNCF-FARE-11", "relationships": { "fare_features": { "data": [] } }, "type": "fare_classes" }, { "attributes": { "code": "FARE-12", "iata_category": "Economy Class", "journey_type": "single", "name": "Public - Eurostar Standard" }, "id": "SNCF-FARE-12", "relationships": { "fare_features": { "data": [] } }, "type": "fare_classes" }, { "attributes": { "code": "FARE-13", "iata_category": "First Class", "journey_type": "single", "name": "Public - Eurostar Premier" }, "id": "SNCF-FARE-13", "relationships": { "fare_features": { "data": [] } }, "type": "fare_classes" }, { "attributes": { "code": "FARE-14", "iata_category": "First Class", "journey_type": "single", "name": "Public - Eurostar Plus" }, "id": "SNCF-FARE-14", "relationships": { "fare_features": { "data": [] } }, "type": "fare_classes" }, { "attributes": { "code": "FARE-2", "iata_category": "First Class", "journey_type": "single", "name": "First Class - SemiFlexi" }, "id": "SNCF-FARE-2", "relationships": { "fare_features": { "data": [ { "id": "SNCF-PREF", "type": "fare_features" } ] } }, "type": "fare_classes" }, { "attributes": { "code": "FARE-3", "iata_category": "First Class", "journey_type": "single", "name": "First Class - Cheapest" }, "id": "SNCF-FARE-3", "relationships": { "fare_features": { "data": [ { "id": "SNCF-PREF", "type": "fare_features" } ] } }, "type": "fare_classes" }, { "attributes": { "code": "FARE-4", "iata_category": "Economy Class", "journey_type": "single", "name": "Second Class - Cheapest" }, "id": "SNCF-FARE-4", "relationships": { "fare_features": { "data": [ { "id": "SNCF-PREF", "type": "fare_features" } ] } }, "type": "fare_classes" }, { "attributes": { "code": "FARE-5", "iata_category": "Economy Class", "journey_type": "single", "name": "Second Class - SemiFlexi" }, "id": "SNCF-FARE-5", "relationships": { "fare_features": { "data": [ { "id": "SNCF-PREF", "type": "fare_features" } ] } }, "type": "fare_classes" }, { "attributes": { "code": "FARE-6", "iata_category": "Economy Class", "journey_type": "single", "name": "Second Class - Flexi" }, "id": "SNCF-FARE-6", "relationships": { "fare_features": { "data": [ { "id": "SNCF-PREF", "type": "fare_features" } ] } }, "type": "fare_classes" }, { "attributes": { "code": "FARE-7", "iata_category": "First Class", "journey_type": "single", "name": "Tarif Standard Premiere" }, "id": "SNCF-FARE-7", "relationships": { "fare_features": { "data": [] } }, "type": "fare_classes" }, { "attributes": { "code": "FARE-8", "iata_category": "First Class", "journey_type": "single", "name": "Tarif Flex Premiere" }, "id": "SNCF-FARE-8", "relationships": { "fare_features": { "data": [] } }, "type": "fare_classes" }, { "attributes": { "code": "FARE-9", "iata_category": "First Class", "journey_type": "single", "name": "Business Premiere" }, "id": "SNCF-FARE-9", "relationships": { "fare_features": { "data": [] } }, "type": "fare_classes" }, { "attributes": { "code": "PREF", "description": "Refund rules and times depend on the method of payment, the train company, the type of ticket and the method of collection.", "name": "Partially refundable" }, "id": "SNCF-PREF", "type": "fare_features" } ], "jsonapi": { "version": "1.0" }, "meta": { "currency": "EUR", "locale": "en" } } Sample Request to /connections/vacancy JSON { "locale": "en", "offers": [ { "id": "e601aea4-963b-411a-9e8f-daf695870c2c|0" } ], "passengers": [ { "id": "pax-33-1", "type": "PNOS", "pax": 1, "cards": [ { "name": "DISTRIBUTION_AGREEMENT_EUROSTAR_STES", "code": "C002Z62" } ] } ] } Sample Response from /connections/vacancy JSON { "data": { "id": "SNCF-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09", "type": "vacancies", "attributes": { "vacant": true, "total_price": 4600, "original_price": 4600 }, "relationships": { "applied_cards": { "data": [] }, "fees": { "data": [] }, "ancillary_options": { "data": [] }, "connection_passengers": { "data": [ { "id": "PNOS-1-1764352729", "type": "passengers" } ] }, "required_attributes": { "data": [ { "id": "129bc1d7-eece-4523-b697-fe11e75c0169", "type": "required_attributes" }, { "id": "7dc212d2-a21e-4091-88d9-15246e3db31f", "type": "required_attributes" } ] } } }, "jsonapi": { "version": "1.0" }, "meta": { "currency": "EUR" }, "included": [ { "id": "PNOS-1-1764352729", "type": "passengers", "relationships": { "required_attributes": { "data": [ { "id": "58420edf-afbe-421a-b6e9-30551ec068d3", "type": "passenger_required_attributes" }, { "id": "b6846a17-3af9-435d-91c5-ca2886afe537", "type": "passenger_required_attributes" } ] } } }, { "id": "58420edf-afbe-421a-b6e9-30551ec068d3", "type": "passenger_required_attributes", "attributes": { "mandatory": [ "birthdate", "first_name", "last_name" ], "endpoint": "reservations/create", "internal_source": true } }, { "id": "b6846a17-3af9-435d-91c5-ca2886afe537", "type": "passenger_required_attributes", "attributes": { "mandatory": [ "birthdate", "first_name", "last_name" ], "endpoint": "reservations/confirm", "internal_source": true } }, { "id": "129bc1d7-eece-4523-b697-fe11e75c0169", "type": "required_attributes", "attributes": { "mandatory": [ "email" ], "endpoint": "reservations/create" } }, { "id": "7dc212d2-a21e-4091-88d9-15246e3db31f", "type": "required_attributes", "attributes": { "mandatory": [ "email", "first_name", "last_name", "terms_accepted" ], "endpoint": "reservations/confirm" } } ] } Sample Request to /reservations/create JSON { "email": "john.smith@email.com", "offers": [ { "id": "e601aea4-963b-411a-9e8f-daf695870c2c|0" } ], "passengers": [ { "type": "PNOS", "id": "pax-33-1", "first_name": "John", "last_name": "Smith", "birthdate": "1997-10-22", "cards": [ { "name": "DISTRIBUTION_AGREEMENT_EUROSTAR_STES", "code": "C002Z62" } ] } ] } Sample Response from /reservations/create JSON { "data": { "id": "RRLFFQRR", "type": "reservations", "attributes": { "total_price": 4600, "original_price": 4600, "state": "created", "created_at": "2025-11-28T19:05", "confirmed_at": null, "cancelled_at": null, "failed_at": null, "processing_started_at": null, "processing_deadline": null, "expires_at": "2025-11-28T20:35", "terms_version": null, "title": null, "first_name": null, "last_name": null, "email": "john.smith@email.com", "phone": null, "city": null, "zip_code": null, "country_code": null, "street_and_number": null, "gender": null, "country_of_birth": null, "government_id_type": null, "marketing_carrier_reservation_ids": [ "CS4XAT_Smith_3GQ7RU" ], "agent_id": null, "retailer_booking_number": null, "customer_id": null }, "relationships": { "fare_class": { "data": { "id": "SNCF-FARE-4", "type": "fare_classes" } }, "return_fare_class": { "data": null }, "departure_station": { "data": { "id": "FRLYSLYN", "type": "stations" } }, "arrival_station": { "data": { "id": "FRPARPRG", "type": "stations" } }, "marketing_carrier": { "data": { "id": "SNCF", "type": "marketing_carriers" } }, "booking": { "data": null }, "utm_params": { "data": null }, "errors": { "data": [] }, "segments": { "data": [ { "id": "STIO-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0", "type": "segments" } ] }, "reservation_passengers": { "data": [ { "id": "R-PNOS-1-STIO-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09", "type": "reservation_passengers" } ] }, "applied_cards": { "data": [] }, "ancillaries": { "data": [] }, "required_attributes": { "data": [ { "id": "RRLFFQRR-662d27da-7b9b-498b-b8e1-06ce2c2b0a72", "type": "required_attributes" } ] }, "custom_fields": { "data": [] }, "fees": { "data": [] } } }, "jsonapi": { "version": "1.0" }, "meta": { "currency": "EUR", "locale": "en" }, "included": [ { "id": "STIO-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0", "type": "segments", "attributes": { "departure_time": "2025-11-30T10:04", "arrival_time": "2025-11-30T12:09", "line": "6612", "line_prefix": "TGV INOUI" }, "relationships": { "departure_station": { "data": { "id": "FRLYSLYN", "type": "stations" } }, "arrival_station": { "data": { "id": "FRPARPRG", "type": "stations" } }, "marketing_carrier": { "data": { "id": "SNCF", "type": "marketing_carriers" } }, "segment_passengers": { "data": [ { "id": "PNOS-1-STIO-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0", "type": "segment_passengers" } ] } } }, { "id": "FRLYSLYN", "type": "stations", "attributes": { "code": "FRLYSLYN", "name": "Lyon Part Dieu Train Station" } }, { "id": "FRPARPRG", "type": "stations", "attributes": { "code": "FRPARPRG", "name": "Paris Gare de Lyon Hall 1 & 2 Train Station" } }, { "id": "SNCF", "type": "marketing_carriers", "attributes": { "code": "SNCF", "trade_name": "SNCF", "legal_name": "SNCF" } }, { "id": "PNOS-1-STIO-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-0", "type": "segment_passengers", "attributes": { "seat_number": null }, "relationships": { "ancillaries": { "data": [] } } }, { "id": "R-PNOS-1-STIO-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09", "type": "reservation_passengers", "attributes": { "first_name": "John", "last_name": "Smith", "serial_code": null, "government_id_type": null, "nationality": null, "gender": null, "country_of_birth": null, "birthdate": "1997-10-22", "type": "PNOS" }, "relationships": { "required_attributes": { "data": [ { "id": "R-PNOS-1-STIO-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-06664a52-2b74-4c24-be25-259a68635f55", "type": "passenger_required_attributes" } ] } } }, { "id": "R-PNOS-1-STIO-FRLYSLYN-FRPARPRG-2025-11-30T10:04-2025-11-30T12:09-06664a52-2b74-4c24-be25-259a68635f55", "type": "passenger_required_attributes", "attributes": { "mandatory": [ "birthdate", "first_name", "last_name" ], "endpoint": "reservations/confirm" } }, { "id": "SNCF-FARE-4", "type": "fare_classes", "attributes": { "code": "FARE-4", "name": "Second Class - Cheapest" } }, { "id": "RRLFFQRR-662d27da-7b9b-498b-b8e1-06ce2c2b0a72", "type": "required_attributes", "attributes": { "mandatory": [ "email", "first_name", "last_name", "terms_accepted" ], "endpoint": "reservations/confirm" } } ] } • [Negotiated & Corporate Fares](https://docs.distribusion.com/dt/api/enterprise-features/negotiated-and-corporate-fares.md): Distribusion ensures fare parity across all ground transportation carriers, meaning that the fares offered through our platform match those available directly from the carriers. This allows users to access standardized pricing without discrepancies. Additionally, Distribusion supports the retrieval of negotiated fares, enabling companies to offer custom pricing agreements they’ve established with carriers. This feature is particularly valuable for businesses with high-volume travel needs or partnerships, as it streamlines the booking process and ensures their negotiated rates are seamlessly integrated. Please note that this is an enterprise API feature. Reach out to your Partnership Manager for more information about unlocking this and other advanced features. Whe re corporate codes come from Corporate codes are part of the commercial agreement between a retailer, TMC, or agency and the carrier. The carrier communicates the applicable codes directly to the retailer. Distribusion does not hold or issue corporate codes. Applying a corporate code Corporate codes are applied on connections/find , submitted as cards. The name is the identifier registered for that corporate programme; the code is your negotiated account number. JSON { "currency": "EUR", "locale": "en", "search_bounds": [ { "departure_location": { "type": "stations", "value": ["DEBERZOB"] }, "arrival_location": { "type": "stations", "value": ["DEMUCZOB"] }, "departure_date": "2026-09-15" } ], "cards": [ { "name": "BAHNCORPORATE", "code": "8100033" } ] } GET /cards returns the cards enabled for your account, including whether a code is required and whether the card is sent at booking or passenger level. The same card must be repeated on connections/vacancy, seats/availability and reservations/create. Carriers re-price on each call, so a code that is dropped after search returns the public fare. Carriers accept one corporate code per booking. Corporate codes cannot be mixed within a single booking. Depending on how the carrier works, the response returns only corporate fares, or both public and corporate fares. Both behaviors are expected. Identif ying corporate fares When a corporate code has been applied to a fare, the fare references it through its applied_cards relationship, and the card is returned in included . This is present whenever a carrier honours a code, so it is the signal to rely on. Plain text "relationships": { "applied_cards": { "data": [ { "id": "BAHNCORPORATE-8100033", "type": "applied_cards" } ] } } "relationships": { "applied_cards": { "data": [ { "id": "BAHNCORPORATE-8100033", "type": "applied_cards" } ] } } Where a carrier sells its negotiated products as separate fare classes, that fare class is additionally flagged as corporate. The flag sits on the fare_classes object referenced by the fare, not on the fare itself: Plain text "attributes": { "code": "FARE-10", "name": "Premium Empresas", "journey_type": "single", "iata_category": "Business Class", "corporate": true } "attributes": { "code": "FARE-10", "name": "Premium Empresas", "journey_type": "single", "iata_category": "Business Class", "corporate": true } corporate is a static property of the fare class and is not populated by every carrier. Carriers that price a negotiated fare against an existing public fare class return the same fare class at a reduced price, and indicate the negotiated fare through applied_cards only. The absence of corporate: true does not mean a fare is public. • [Seat Map](https://docs.distribusion.com/dt/api/enterprise-features/selecting-seats.md): Seat maps let passengers choose a specific seat for their journey. When support by the carrier, you can show the vehicle layout in your UI and let users pick from the seats that are still free right before checkout. This documentation outlines the integration flow for rendering visual seat maps and booking specific seats. To maximize performance and reduce latency, this API explicitly separates the physical shape of a vehicle from the real-time status of its seats. Please note that this is an enterprise API feature. Reach out to your Partnership Manager for more information about unlocking this and other advanced features. Splitting Static Layouts and Dynamic Availability Seat selection is split into two endpoints on purpose: one endpoint provides the live availability layer, and the other provides the layout structure. The availability response answers booking questions such as which seats are selectable, whether a seat is preselected, whether it is available as an add-on, and which seat_id must be sent later in /reservations/create. The /layouts endpoint, by contrast, is only about the visual map of the vehicle or deck: how seats are positioned and how the seat map should be rendered. This separation keeps the integration lighter and more flexible: the layout can be treated as a reusable visual template, while availability remains the real-time booking source of truth. In practice, retailers use the availability response to know what can be sold, and the layout response to decide how to display it. To help visualize how such a layout renderer could be built, AI tools such as Gemini or ChatGPT can also be useful for quickly prototyping seat-map UI concepts or frontend structures. Building Your Cache of Layouts The /layouts endpoint returns the detailed physical definition of vehicle decks. It allows retailers to cache the visual geometry (walls, seats, amenities) and render it independently of real-time availability. To build your layout cache proactively, you can request all layouts for a specific carrier at once. HTTP https://api.demo.distribusion.com/retailers/v4/layouts?marketing_carrier=IQCB Then during the seat reservation flow you should use the /seats/availability response to identify the layout_id reference and check whether you already have that layout cached locally. If not, you should call the layouts endpoint once, store the returned structure in your cache keyed by the layout identifier, and then reuse it for future requests that reference the same layout. This keeps the integration efficient, because the layout can be treated as a reusable template while availability remains the real-time source of truth for what can actually be sold. Checking Seat Availability The endpoint /seats/availability returns the dynamic inventory data for a specific offer_id . When booking a return trip or a multi bound trip, you can include multiple offer_id to the request. Sample Request HTTP https://api.demo.distribusion.com/retailers/v4/seats/availability?offers[][id]=180a4e81-6450-44a5-b6a4-338e650d8ec2%7C2&offers[][id]=8b9f97fc-777e-4aff-91d4-f47d8ff18f9b%7C0 Response Structure The availability response is deeply nested to represent the physical layout of the journey: Connections: A list of connections (bounds) associated with the requested journey. Segments: The list of legs that make up this connection. Vehicles: The physical transport units for this segment. Coaches: The list of distinct carriages making up the vehicle. Decks: The vertical levels within this coach. Contains the layout_id to reference the static layout of this deck. Compartments: Logical groupings of inventory within the deck. Seats: The list of individual seat inventory items available in this compartment. Includes seat_code to match against the layout, and overall_availability_status . Fetching Layouts In case a layout does not exist in your cache you can call the /layouts endpoint with the specific layout_id . Request Sample HTTP https://api.demo.distribusion.com/layouts?marketing_carrier=IQCB&ids[]=1cd51737-c6d5-4596-a656-1ac7fdcdab8b Response Structure id : The layout identifier for this specific physical configuration. size : Defines the bounding box of the layout grid (length, width). elements : Static visual structures and signage (Seats, Walls, Doors, Stairs, Amenities, Travel class, etc.) that form the background map. Elements have 2 types: place (bookeable accommodations) and graphic_element . Both share a visual_position object containing the {x, y, z} coordinates on the layout grid. Creating a Reservation with Seats The seat can be provided by the main standalone offer (because seat selection is free, does not incur in a fee), or it could come with a fee as an addon offer. Inside the corresponding offer, indicate as many seat_selections as necessary. For each, the segment_id , passenger_id and seat_id is needed. Example A: Seats included on the main offer The seats are included as part of the main offer, so there is no additional offer in the array. Seat selection is indicated as part of the main offer. JSON { "locale": "en", "retailer_partner_number": "123456", "email": "john.smith@email.com", "passengers": [ { "id": "pax-33-1", "type": "PNOS" }, { "id": "pax-33-2", "type": "PNOS" } ], "offers": [ { "id": "dab3d49f-e79d-4c6b-a780-6f37a0cd854a|2", "passenger_ids": [ "pax-33-1", "pax-33-2" ], "seat_selections": [ { "segment_id": "IQCB-DEBERCBS-DEDRSBSA-2026-10-09T13:00-2026-10-09T15:00-0", "passenger_id": "pax-33-1", "seat_id": "v1|IQCB|19e2627b0d047489|0|0|0|coach-0-0-0|coach-0-0-0-deck-0|E5|f7bae2273c449e5e8202b6216cec02fe4120dd81a33c8bafb709f4d24297023c" }, { "segment_id": "IQCB-DEBERCBS-DEDRSBSA-2026-10-09T13:00-2026-10-09T15:00-0", "passenger_id": "pax-33-2", "seat_id": "v1|IQCB|19e2627b0d047489|0|0|0|coach-0-0-0|coach-0-0-0-deck-0|E6|a4cbd1183c449e5e8202b6216cec02fe4120dd81a33c8bafb709f4d24297023d" } ] } ] } Example B: Add-on seats to the main offer The customers have chosen more expensive seats. Each chosen seat references an add-on offer in /seats/availability response. Hence, each seat selection is indicated under its corresponding add-on offer. If both passengers chose seats that reference the same addon offer ID, both selections are grouped under one offer entry. If selected seats reference different offer IDs, each would appear under its own offer entry. In total, for this sample request below for two passengers there are two offer_id values indicated: one for the main admission offer and one for the seat add-on offer covering both selections. JSON { "locale": "en", "retailer_partner_number": "123456", "email": "john.smith@email.com", "passengers": [ { "id": "pax-33-1", "type": "PNOS" }, { "id": "pax-33-2", "type": "PNOS" } ], "offers": [ { "id": "dab3d49f-e79d-4c6b-a780-6f37a0cd854a|2" }, { "id": "800e3599-ece4-40bb-a9e3-937f4253b7c0", "passenger_ids": [ "pax-33-1", "pax-33-2" ], "seat_selections": [ { "segment_id": "IQCB-DEBERCBS-DEDRSBSA-2026-10-09T13:00-2026-10-09T15:00-0", "passenger_id": "pax-33-1", "seat_id": "v1|IQCB|19e2627b0d047489|0|0|0|coach-0-0-0|coach-0-0-0-deck-0|E5|f7bae2273c449e5e8202b6216cec02fe4120dd81a33c8bafb709f4d24297023c" }, { "segment_id": "IQCB-DEBERCBS-DEDRSBSA-2026-10-09T13:00-2026-10-09T15:00-0", "passenger_id": "pax-33-2", "seat_id": "v1|IQCB|19e2627b0d047489|0|0|0|coach-0-0-0|coach-0-0-0-deck-0|E6|a4cbd1183c449e5e8202b6216cec02fe4120dd81a33c8bafb709f4d24297023d" } ] } ] } API Workflow The seat booking process consists of 5 main steps that should be completed for carriers that support seat map reservation. We recommend starting this flow after your /connections/vacancy request. Fetch Live Seat Availability: Triggered when a user selects a journey or a specific offer, you request /seats/availability . This returns real-time statuses, pricing, eligibility per passenger, and the specific layout_ids to display. Resolve the Visual Map: Your system checks if it has the detailed layout for that layout_id cached or stored locally. Hit: Retrieve the map instantly from your cache. Miss: Call /layouts with the specific layout_id to fetch the definition and store it for future requests. Because layout IDs are immutable, you can cache them aggressively without fear of data staleness. Render & Merge: Your application draws the visual map using the layout data (walls, seats, tables) and overlays the live inventory using the availability data by matching them via the unique seat_code . Create reservation : You send a /reservations/create request with passengers and offers (and seat selections placed in the appropriate offer object). Confirm / Check status : Follow the normal reservation confirmation flow (confirm, then poll/check booking status). • [Ancillaries](https://docs.distribusion.com/dt/api/enterprise-features/ancillaries.md): Note: This section offers an early preview of a new capability launching with selected partners. Content will be updated as the feature is finalised. Please reach out to your Partnerships Manager any time to align on the latest specifications. Ancillaries are optional add-ons that let passengers tailor a trip to their needs like extra luggage, bikes, pets, meals, insurance, or carbon offset products. They’re presented during the booking flow (where available), so customers can choose what they want before confirming their reservation. This page provides an overview of how ancillaries are represented within the offers framework in the Retailer API. Ancillaries are represented as addon offers : offer objects with booking_type: "addon" that appear alongside the standalone fare offer in the connections/vacancy response. General flow & principle When a retailer calls connections/vacancy with a selected fare offer_id , the response includes not only fare availability and pricing but also any ancillaries available for purchase alongside that connection — returned as addon offers within the offer_options relationship. An addon offer cannot be purchased alone. It must always accompany a standalone fare offer. The selected addon offers are passed alongside the fare offer_id when calling reservations/create . Coverage Coverage defines the scope of an offer — the passengers and segments it is linked to and how it must be applied. Every offer, whether a fare or an addon, references a set of passengers and segments (via passenger_ids and segment_ids ) and carries two coverage fields that govern how to apply the offer across them: passenger_coverage_type : individual the offer is applied separately to each linked passenger, and the price shown is per application. For example, if luggage costs €5 and both Jan and Alfred want it, the total is €10. collective means the offer can be applied once and then applies to all passengers linked to that offer. The price does not need to be duplicated per passenger. segment_coverage_type : individual means the offer can be applied for each linked segment, each application targets one of the segments referenced on the offer. collective means the offer is applied once across all segments linked to that offer. Collective is not booking-level. The set of passengers (or segments) linked to a collective offer may be a subset of the booking. A booking can carry multiple offers, each linked to its own passenger and segment set. collective only states that the linked passengers and segments are applied together — it does not imply the offer covers every passenger or segment in the booking. The same coverage model used for fare offers applies to addon offers. This is how an ancillary expresses whether it is applied once per linked passenger or once across them collectively, and whether it is applied once per linked segment or once across them collectively. Coverage combinations Title Description Title passenger_coverage_type segment_coverage_type What to send in reservations/create collective collective Just the offer ID — no passenger or segment specification needed individual collective Offer ID + passenger_ids — one entry per passenger collective individual Offer ID + segment_ids — one entry per segment individual individual Offer ID + passenger_ids + segment_ids — one entry per passenger/segment combination Features Addon offer concept An addon offer represents a purchasable ancillary. It shares the same offer structure as a standalone fare offer but has booking_type: "addon" and one additional distinction: max_quantity . max_quantity defines the maximum number of units this specific offer can be purchased per application. Combined with passenger_coverage_type , it determines whether the limit applies per passenger or in total. For example: a luggage offer with passenger_coverage_type: "individual" and max_quantity: 3 means each linked passenger can buy up to 3 bags independently. A carbon offset offer with passenger_coverage_type: "collective" and max_quantity: 1 means the product can be purchased once, covering all linked passengers. An addon offer's price can be 0 when the ancillary is included in the fare price but requires explicit selection (e.g. a mandatory meal choice included in a premium fare). Offer options and selection constraints Available addon offers are returned under the offer_options relationship on the connections/vacancy response. Each offer_options entity wraps a set of related offers and carries two bounds on how many selections the retailer can make from the group: min_selection — the minimum number of selections required from this group. 0 means the ancillary is optional. 1 means it is mandatory and must be selected for the booking to validate. max_selection — the maximum number of selections allowed from this group. For a single-offer group this mirrors the offer's max_quantity . Common patterns: Title Description Title Description min_selection max_selection Meaning Example 0 1 Optional, at most one Insurance 0 3 Optional, up to 3 Luggage, up to 3 bags 1 1 Mandatory, exactly one Required meal selection max_quantity vs offer_options bounds : These two mechanisms control different things and must not be conflated: max_quantity on an offer controls how many units that single offer can be purchased per application (e.g. up to 3 bags per linked passenger). min_selection / max_selection on the group control how many offers can be selected from a group of different options (e.g. pick exactly one meal from six variants). min_selection / max_selection : when not explicitly set, default to min: 0, max: 1 — meaning the ancillary is optional and at most one unit can be selected. max_quantity : when not explicitly configured, defaults to 1 . Worked example: A connection offering luggage as two separate offers: big bag and small bag. The carrier allows up to 3 bags per passenger in total, but no more than 2 big bags per passenger. The vacancy response would return: One offer_options group containing both luggage offer IDs (big bag and small bag), with min_selection: 0 , max_selection: 3 — the customer can select up to 3 bags total per passenger, combining the two offer types as they wish. The big bag offer carries max_quantity: 2 — at most 2 big bags per passenger application. The small bag offer carries max_quantity: 3 — at most 3 small bags per passenger application (the per-offer cap). So a passenger could buy 2 big + 1 small, or 0 big + 3 small, or 1 big + 2 small — but never 3 big bags, because max_quantity on the big bag offer caps it at 2 even though the group allows 3 total selections. End-to-end example The example below follows the flow connections/find → connections/vacancy → reservations/create for a one-way trip with 2 passengers across 2 segments. Two ancillaries are available: Carbon offset — a single product covering all passengers and all segments at once ( collective / collective ). Luggage — purchased per passenger, covering all segments ( individual / collective ), up to 3 bags per passenger. Step 1: connections/find A standard connections/find request is made. The response returns standalone fare offers for each connection with booking_type: "standalone" . No offer_options are present at this stage. The selected fare's offer_id is then passed to connections/vacancy in the next step. Step 2: connections/vacancy Request the vacancy endpoint with the selected fare offer to retrieve any available addon offers. The response returns two offer option groups under the offer_options relationship — one for the carbon offset, one for the luggage. Both are optional ( min_selection: 0 ). JSON { "relationships": { "offer_options": { "data": [ { "type": "offer_options", "id": "co2-group" }, { "type": "offer_options", "id": "luggage-group" } ] } }, "included": [ { "type": "offer_options", "id": "co2-group", "attributes": { "min_selection": 0, "max_selection": 1 }, "relationships": { "offers": { "data": [{ "type": "offers", "id": "co2-offer-id" }] } } }, { "type": "offer_options", "id": "luggage-group", "attributes": { "min_selection": 0, "max_selection": 3 }, "relationships": { "offers": { "data": [{ "type": "offers", "id": "luggage-offer-id" }] } } }, { "type": "offers", "id": "co2-offer-id", "attributes": { "booking_type": "addon", "passenger_coverage_type": "collective", "segment_coverage_type": "collective", "max_quantity": 1, "price": 200, "currency": "EUR", "passenger_ids": ["pax-1", "pax-2"], "segment_ids": ["segment-0", "segment-1"], "applied_passenger_types": [ { "id": "CARRIER-PNOS", "passenger_id": "pax-1" }, { "id": "CARRIER-PNOS", "passenger_id": "pax-2" } ] } }, { "type": "offers", "id": "luggage-offer-id", "attributes": { "booking_type": "addon", "passenger_coverage_type": "individual", "segment_coverage_type": "collective", "max_quantity": 3, "price": 800, "currency": "EUR", "passenger_ids": ["pax-1", "pax-2"], "segment_ids": ["segment-0", "segment-1"], "applied_passenger_types": [ { "id": "CARRIER-PNOS", "passenger_id": "pax-1" }, { "id": "CARRIER-PNOS", "passenger_id": "pax-2" } ] } } ] } Reading the key values: Carbon offset offer : both axes collective — one application covers all linked passengers across all linked segments. max_quantity: 1 means it can be purchased once. Luggage offer : passenger_coverage_type: individual — applied once per chosen passenger. max_quantity: 3 on the offer and max_selection: 3 on the group allow up to 3 bags per passenger. Step 3: reservations/create To purchase ancillaries, include the chosen addon offer IDs in the offers array alongside the main fare offer. For individual-coverage offers, specify which passengers the ancillary applies to and the quantity per passenger. In this example: the passengers buy the carbon offset (one collective application), pax-1 buys 2 bags, and pax-2 buys 1 bag. JSON { "locale": "en", "retailer_partner_number": "123456", "email": "john.smith@email.com", "currency": "EUR", "passengers": [ { "id": "pax-1", "type": "PNOS", "first_name": "Test", "last_name": "User" }, { "id": "pax-2", "type": "PNOS", "first_name": "Test", "last_name": "User" } ], "offers": [ { "id": "fare-offer-id" }, { "id": "co2-offer-id" }, { "id": "luggage-offer-id", "passenger_ids": ["pax-1"], "quantity": 2 }, { "id": "luggage-offer-id", "passenger_ids": ["pax-2"] } ] } Reading the shape: The carbon offset offer has passenger_coverage_type: collective — one entry total, no passenger_ids needed in the request. It is applied once across all linked passengers. The luggage offer has passenger_coverage_type: individual — one entry per chosen passenger, each with its own quantity (bounded by max_quantity: 3 ). • [Amendments](https://docs.distribusion.com/dt/api/enterprise-features/amendments.md): Note: This section offers an early preview of a new capability launching with selected partners. Content will be updated as the feature is finalised. Please reach out to your Partnerships Manager any time to align on the latest specifications. General principle. The search-side endpoints stay the same as in the regular booking flow. To switch them into "amendment mode" you pass the existing booking_id . Once the customer has picked the change, you actually amend the booking in two calls: POST /amendments/create (propose) followed by PUT /amendments/confirm (commit). The flow at a glance Title Description Title Step Endpoint Purpose 1. Search POST /connections/find + booking_id POST /connections/vacancy + booking_id GET /seats/availability + offer(s) + booking_id Show the customer what is available for their existing booking : new trips, new ancillaries, new seats. Same shape as a regular search — just scoped by booking_id . 2. Propose POST /amendments/create Send the new offers the customer selected. rAPI returns an amendment_id and the resulting booking preview. 3. Confirm PUT /amendments/confirm Commit the amendment using the amendment_id . A new booking is created (new booking_id + booking_number ); the original is marked as amended. Step 1 — Search, scoped to a booking Any regular search endpoint becomes an amendment search by adding booking_id to the query. The offers returned are valid for an amendment of that booking and may include delta pricing. Seats will not respond with delta prices. All examples below use the demo environment ( api.demo.distribusion.com ). Authentication via the Api-Key header is required on every request — omitted from the snippets for brevity. Carrier and station codes ( ZBUS , ZZSTN001 …) are placeholders. 1a. connections/find with search_bounds + booking_id Same as a multi-bound search; booking_id just scopes the search. JSON { "locale": "en", "currency": "GBP", "carrier_codes": ["ZBUS"], "search_bounds": [ { "departure_date": "2026-05-11", "departure_location": { "type": "stations", "value": ["ZZSTN003"] }, "arrival_location": { "type": "stations", "value": ["ZZSTN004"] }, "is_requested": true } ], "passengers": [ { "pax": 1, "max_age": 50 } ], "booking_id": "qnrL4XjM4IUJ_sy_8GDDAg" } 1b. connections/vacancy + booking_id (ancillary discovery) Used to discover what ancillaries can be added to an existing booking. JSON { "booking_id": "EpZaPpY29D3sRetM1ew_cA" } 1c. seats/availability — by selected offer(s) + booking_id After a search returns offers, fetch the seat map for one or more of them. Same endpoint as in the booking flow; you just pass the offer ids and the booking_id . Single offer HTTP https://api.demo.distribusion.com/retailers/v4/seats/availability ?offers[][id]=83166253-e124-43b4-8b1e-185421ec8245|0 &booking_id=qnrL4XjM4IUJ_sy_8GDDAg Multiple offers HTTP https://api.demo.distribusion.com/retailers/v4/seats/availability ?offers[][id]=83166253-e124-43b4-8b1e-185421ec8245|0 &offers[][id]=e25a85d6-61d5-489f-9adb-307ecb24d2bf|6 &booking_id=qnrL4XjM4IUJ_sy_8GDDAg Step 2: POST /ammendments/create Send the offers the customer chose. The body always carries the booking_id being amended plus an offers[] array. Same offer shape as in reservations/create ; the meaning of optional fields ( passenger_ids , segment_ids , quantity , seat_selections ) depends on the offer's coverage type 2a. Admission only (e.g. change date / change OD) Single offer id, no passenger/segment scoping. Carrier-specific mandatory attributes may apply. HTTP https://api.demo.distribusion.com/retailers/v4/amendments/create JSON { "booking_id": "It-2QpvR-Xf4NOSSDOiSKA", "offers": [ { "id": "fee581cd-8e0b-442f-9e88-b7b40c64e822|1" } ] } 2b. Add a collective ancillary Ancillary covers the whole booking — no passenger_ids or segment_ids needed. HTTP https://api.demo.distribusion.com/retailers/v4/amendments/create JSON { "booking_id": "It-2QpvR-Xf4NOSSDOiSKA", "offers": [ { "id": "fee581cd-8e0b-442f-9e88-b7b40c64e822|1" } ] } 2c. Add a paid seat (separate add-on offer) When seats are sold as a paid ancillary, each seat goes in its own add-on offer alongside the main admission offer. HTTP https://api.demo.distribusion.com/retailers/v4/amendments/create JSON { "booking_id": "It-2QpvR-Xf4NOSSDOiSKA", "offers": [ { "id": "main_admission_offer" }, { "id": "seat_add_on_offer_1", "passenger_ids": ["pax_1"], "seat_selections": [ { "segment_id": "seg_1", "passenger_id": "pax_1", "seat_id": "v1-AAAA-a9f83b-1:12A-x7z911" } ] }, { "id": "seat_add_on_offer_2", "passenger_ids": ["pax_2"], "seat_selections": [ { "segment_id": "seg_1", "passenger_id": "pax_2", "seat_id": "v1-AAAA-a5g87n-1:13B-v4g876" } ] } ] } Step 3: PUT /ammendments/confirm Commit the proposal returned by amendments/create . The body is small and identical regardless of what was amended. HTTP https://api.demo.distribusion.com/retailers/v4/amendments/confirm JSON { "amendment_id": "A7QPLB2K", "execute_payment": false, "terms_accepted": true, "payment_method": "demand_note" } A confirmed amendment creates a new booking. PUT /amendments/confirm does not modify the original booking in place. It creates a new booking with a new booking_id and a new booking_number , and marks the original booking as amended. Both are returned in the confirm response: booking is the new, active booking; amended_booking is the original one that was superseded. You must store the new booking_id and use it for all subsequent operations — retrieving the booking, fetching tickets, cancelling, or making a further amendment. Calls made with the original booking_id will continue to resolve to the superseded booking. The same applies to the booking_number shown to customers: after an amendment it changes, so any confirmation email, ticket or reference displayed to the passenger should be re-issued with the new number. • [Order data](https://docs.distribusion.com/dt/api/enterprise-features/order-data.md): Note: This section offers an early preview of a new capability launching with selected partners. Content will be updated as the feature is finalised. Please reach out to your Partnerships Manager any time to activate this functionality and align on the latest specifications. This page describes how a retailer reads the per-item price breakdown of a transaction — its order items — from the reservation they already hold. Reading it requires no additional call: the breakdown comes back on GET /reservations/{reservation_id} . When to use it. Whenever you need to display or reason about a committed transaction ( created / confirmed ): a Manage Booking page, an agent back-office, or a post-sale support tool. For the search-and-book flow itself, keep using connections/* and reservations/* as documented elsewhere. Get order data on a reservation GET /retailers/v4/reservations/{reservation_id} Request HTTP curl --location --globoff 'https://api.demo.distribusion.com/retailers/v4/reservations/{{reservation_id}}' \ --header 'Api-Key: <YOUR-API-KEY>' Title Description Title Description Parameter In Type Description reservation_id path string The reservation ID returned by reservations/create , e.g. Q1W2E3R4 Order items An order item is a distinct, priced component of the transaction, carrying its own refund and exchange conditions. Its level of detail matches that of an offer, so offers map directly onto order items. Each item holds one or more services, which define the entitlements for one or more travellers — anything from a one-way admission for a single passenger to a fixed return trip for a group, together with ancillaries such as extra luggage. Items are resolved from included : data.relationships.order_items.data gives you an ordered list of {id, type} pairs; look each ID up in included where type is order_items . The same applies to the conditions and fare_class referenced from each item. Unlike most objects in the response, an item states its own coverage directly — passenger_ids and segment_ids are attributes on the item, so you never have to infer who or what it covers. An item is the carrier's commercial unit An item is the smallest thing the carrier prices and lets us act on. It is not a Distribusion-side subdivision, and it is not guaranteed to be one per passenger : Where the carrier sells a ticket per passenger, you get one item per passenger. Where the carrier sells one combined ticket covering several passengers, you get one item at a single price, listing several passenger_ids . An item can likewise span several segments where the carrier prices them together, or cover a single leg where it does not. This is not a fixed carrier trait — the same operator returns either shape depending on the origin–destination priced, as the two examples below show. Read segment_ids on each item and let it tell you the shape; never infer it from the carrier or from the number of passengers. The consequence worth designing for: an exact per-passenger price does not always exist. For a combined item the carrier never priced the individual passenger, so no correct split can be derived. Don't build UI that assumes one — aggregate from items instead. Examples Both are real responses. SGRP carries SNCF Voyageurs content (TGV INOUI, LYRIA); SNCF carries regional content (TER). Carrier, station, segment and fare codes are the real values returned for these bookings — only the opaque identifiers are substituted, so order item IDs are shown as item-1 , item-2 … and condition IDs as condition-1 , condition-2 …, which makes the references between objects easy to follow. Real responses return UUIDs. Example 1 — SNCF, Laval → Chartres: one item per passenger Four passengers — three adults and one child — changing at Le Mans: TER 857950 Laval → Le Mans, then TER 862552 Le Mans → Chartres. Read after confirmation. This origin–destination is priced for the whole journey, so there are four items, one per passenger, each listing both segments. Trimmed to the order data and to two of the four items. JSON { "data": { "id": "RHGKVJ56", "type": "reservations", "attributes": { "order_version": 2, "total_price": 14850, "original_price": 14850, "state": "confirmed" }, "relationships": { "order_items": { "data": [ { "id": "item-1", "type": "order_items" }, { "id": "item-2", "type": "order_items" }, { "id": "item-3", "type": "order_items" }, { "id": "item-4", "type": "order_items" } ] }, "passenger_types": { "data": [ { "id": "SNCF-PNOS", "type": "passenger_types" }, { "id": "SNCF-PCIL", "type": "passenger_types" } ] }, "price_details": { "data": { "id": "PD-RHGKVJ56", "type": "price_details" } } } }, "meta": { "locale": "en", "currency": "EUR" }, "included": [ { "id": "item-1", "type": "order_items", "attributes": { "status": "confirmed", "passenger_ids": ["passenger-1"], "segment_ids": [ "SNCF-FRLVALAV-FRLMELEM-2026-09-03T11:05-2026-09-03T12:08-0", "SNCF-FRLMELEM-FRQTJCHR-2026-09-03T12:38-2026-09-03T14:20-1" ], "price": 4240, "original_price": 4240, "services": [ { "service_type_id": "ADMISSION", "passenger_ids": ["passenger-1"], "segment_ids": [ "SNCF-FRLVALAV-FRLMELEM-2026-09-03T11:05-2026-09-03T12:08-0", "SNCF-FRLMELEM-FRQTJCHR-2026-09-03T12:38-2026-09-03T14:20-1" ] } ], "applied_passenger_types": [ { "id": "SNCF-PNOS", "passenger_id": "passenger-1" } ] }, "relationships": { "fare_class": { "data": { "id": "SNCF-FARE-5", "type": "fare_classes" } }, "conditions": { "data": [{ "id": "condition-1", "type": "conditions" }] } } }, { "id": "item-4", "type": "order_items", "attributes": { "status": "confirmed", "passenger_ids": ["passenger-4"], "segment_ids": [ "SNCF-FRLVALAV-FRLMELEM-2026-09-03T11:05-2026-09-03T12:08-0", "SNCF-FRLMELEM-FRQTJCHR-2026-09-03T12:38-2026-09-03T14:20-1" ], "price": 2130, "original_price": 2130, "services": [ { "service_type_id": "ADMISSION", "passenger_ids": ["passenger-4"], "segment_ids": [ "SNCF-FRLVALAV-FRLMELEM-2026-09-03T11:05-2026-09-03T12:08-0", "SNCF-FRLMELEM-FRQTJCHR-2026-09-03T12:38-2026-09-03T14:20-1" ] } ], "applied_passenger_types": [ { "id": "SNCF-PCIL", "passenger_id": "passenger-4" } ] }, "relationships": { "fare_class": { "data": { "id": "SNCF-FARE-5", "type": "fare_classes" } }, "conditions": { "data": [{ "id": "condition-4", "type": "conditions" }] } } }, { "id": "PD-RHGKVJ56", "type": "price_details", "attributes": { "amount": 14850, "original_amount": 14850, "currency": "EUR", "scale": 2 } }, { "id": "condition-1", "type": "conditions", "attributes": { "code": "CONDITION-9", "title": "Tarif Normal", "description": "LAVAL - LE MANS - Tarif Normal\nLE MANS - CHARTRES - Tarif Normal\n", "refundable": "yes", "exchangeable": "no" } }, { "id": "SNCF-PNOS", "type": "passenger_types", "attributes": { "code": "PNOS", "name": "Adult", "min_age": 26, "max_age": 59 } }, { "id": "SNCF-PCIL", "type": "passenger_types", "attributes": { "code": "PCIL", "name": "Child", "min_age": 4, "max_age": 11 } }, { "id": "SNCF-FARE-5", "type": "fare_classes", "attributes": { "code": "FARE-5", "name": "Second Class - SemiFlexi", "iata_category": "Economy Class", "journey_type": "single" } } ] } Example 2 — SNCF Voyageurs (SGRP), Nantes → Lausanne: one item per passenger per leg The same four-passenger group, changing in Paris: TGV INOUI 8874 Nantes → Paris Montparnasse, then LYRIA 9277 Paris Gare de Lyon → Lausanne. Read at reservations/create . This origin–destination is priced per leg, so the response carries eight items — one per passenger per leg — and each lists a single segment_id . Trimmed to one passenger's two items. JSON { "data": { "id": "RKY5A5T9", "type": "reservations", "attributes": { "order_version": 1, "total_price": 61430, "original_price": 61430, "state": "created" }, "relationships": { "order_items": { "data": [ { "id": "item-1", "type": "order_items" }, { "id": "item-2", "type": "order_items" }, { "id": "item-3", "type": "order_items" }, { "id": "item-4", "type": "order_items" }, { "id": "item-5", "type": "order_items" }, { "id": "item-6", "type": "order_items" }, { "id": "item-7", "type": "order_items" }, { "id": "item-8", "type": "order_items" } ] } } }, "meta": { "locale": "en", "currency": "EUR" }, "included": [ { "id": "SGRP", "type": "marketing_carriers", "attributes": { "code": "SGRP", "trade_name": "SNCF", "legal_name": "SNCF Voyageurs" } }, { "id": "item-1", "type": "order_items", "attributes": { "status": "reserved", "passenger_ids": ["passenger-1"], "segment_ids": [ "STIO-FRNTENAN-FRPARPRB-2026-08-23T13:04-2026-08-23T15:22-0" ], "price": 4400, "original_price": 4400, "services": [ { "service_type_id": "ADMISSION", "passenger_ids": ["passenger-1"], "segment_ids": [ "STIO-FRNTENAN-FRPARPRB-2026-08-23T13:04-2026-08-23T15:22-0" ] }, { "service_type_id": "SEAT", "passenger_ids": ["passenger-1"], "segment_ids": [ "STIO-FRNTENAN-FRPARPRB-2026-08-23T13:04-2026-08-23T15:22-0" ] } ] }, "relationships": { "fare_class": { "data": { "id": "SGRP-FARE-5", "type": "fare_classes" } }, "conditions": { "data": [{ "id": "condition-1", "type": "conditions" }] } } }, { "id": "item-5", "type": "order_items", "attributes": { "status": "reserved", "passenger_ids": ["passenger-1"], "segment_ids": [ "STLY-FRPARPRG-CHQLSLAU-2026-08-23T17:28-2026-08-23T21:39-1" ], "price": 12510, "original_price": 12510, "services": [ { "service_type_id": "ADMISSION", "passenger_ids": ["passenger-1"], "segment_ids": [ "STLY-FRPARPRG-CHQLSLAU-2026-08-23T17:28-2026-08-23T21:39-1" ] }, { "service_type_id": "SEAT", "passenger_ids": ["passenger-1"], "segment_ids": [ "STLY-FRPARPRG-CHQLSLAU-2026-08-23T17:28-2026-08-23T21:39-1" ] } ] }, "relationships": { "fare_class": { "data": { "id": "SGRP-FARE-5", "type": "fare_classes" } }, "conditions": { "data": [{ "id": "condition-5", "type": "conditions" }] } } }, { "id": "condition-1", "type": "conditions", "attributes": { "code": "CONDITION-204", "title": "Tarif GROUPE ADULTES", "description": "NANTES - PARIS MONTPARNASSE 1 ET 2 - Tarif GROUPE ADULTES\n", "refundable": "yes", "exchangeable": "yes" } }, { "id": "condition-5", "type": "conditions", "attributes": { "code": "CONDITION-245", "title": "GROUPE ADULTES", "description": "PARIS GARE DE LYON - LAUSANNE - GROUPE ADULTES\n", "refundable": "yes", "exchangeable": "yes" } }, { "id": "SGRP-FARE-5", "type": "fare_classes", "attributes": { "code": "FARE-5", "name": "Second Class - SemiFlexi" } } ] } passenger-1 costs €44.00 on the first leg and €125.10 on the second, €169.10 in total; the four-passenger booking totals €614.30. Two further differences follow from the origin–destination rather than the operator: conditions are per leg and per passenger type, where Example 1 returns one condition whose description names both legs; and SEAT appears alongside ADMISSION in services , because this fare includes a reserved seat. Price breakdown per item Each item carries price and original_price , both integers in the currency's fractional unit. The price_details object in included states the currency and the scale to apply — 2 for EUR, so 14850 is €148.50. See Currencies for the full convention, including KRW and JPY, which are returned as full units. Discounts are not yet supported for order data, so original_price currently always equals price . The items always sum to data.attributes.total_price . For Example 1: Title Description Title Description Title Item Covers Passenger type Fare class Price item-1 passenger-1 , both segments PNOS FARE-5 €42.40 item-2 passenger-2 , both segments PNOS FARE-5 €42.40 item-3 passenger-3 , both segments PNOS FARE-5 €42.40 item-4 passenger-4 , both segments PCIL FARE-5 €21.30 Total €148.50 To build a breakdown: Read data.relationships.order_items for the item IDs and resolve them in included . For each item, take price for the amount and passenger_ids for who it covers. Resolve applied_passenger_types[].id in included to label the line — PNOS (adult), PCIL (child) and the rest are documented under Passenger Types . Where it is not returned, read type on the passenger instead. Resolve relationships.fare_class for the fare name and relationships.conditions for the refund and exchange rules that apply to that line. Do not divide an item's price by the number of passenger_ids to get a per-passenger figure. Where an item covers several passengers the carrier priced them together, and any split you compute is your own invention rather than something the customer can be held to. Field reference Order — attributes on the reservation The order-level values live on data.attributes , alongside the reservation's own attributes, which are documented with the reservation endpoints. Title Description Title Field Type Description order_version integer Version counter for the order. Increments on every change. total_price integer Total in the currency's fractional unit. Equals the sum of order_items[].price . original_price integer Total before any discount. Compare with total_price to show a change. state string confirmed once ticketed, cancelled once cancelled cancelled_at datetime? When the transaction was cancelled; null while active OrderItem included[] entries with type: "order_items" — the unit of pricing and of every post-sale operation. Not necessarily one per passenger. Title Description Title Field Type Description id UUID Item identifier. This is what appears in data.meta.actions → covered . status string reserved before ticketing, confirmed once ticketed, cancelled once cancelled passenger_ids array[string] The passengers this item covers. Resolve in included under reservation_passengers . More than one means the item is shared and cannot be cancelled per passenger. segment_ids array[string] The segments this item covers. More than one means the carrier priced those legs together. price integer Current price in the currency's fractional unit original_price integer Price before any discount services array What the item delivers. Each entry has service_type_id ( ADMISSION , SEAT , …) plus its own passenger_ids and segment_ids , which can be narrower than the item's. applied_passenger_types array The fare entitlement applied per passenger, as {id, passenger_id} . Resolve id in included — see Passenger Types . relationships.fare_class object The fare sold — see Fare Classes . Items on one reservation can carry different fare classes; see Fares Per Segment . relationships.conditions array The refund and exchange rules for this item Condition included[] entries with type: "conditions" , referenced from an item. Title Description Title Field Type Description code string The carrier's condition code title string Human-readable fare name description string Full text as supplied by the carrier, typically naming the legs it applies to. May contain line breaks where the carrier states a rule per leg. refundable string yes or no — note these are strings, not booleans exchangeable string yes or no — note these are strings, not booleans Conditions are attached per item, so a reservation can carry different rules per item. Display them against the item they belong to rather than summarising them for the whole transaction. refundable: "yes" tells you the fare permits a refund — not what the customer would get back. Errors Errors follow the standard reservation error format. The case specific to order data: Title Description Status When 404 The reservation ID does not exist, or is not visible to your API key If the reservation was not created through the Offers flow, the call succeeds and returns the reservation as normal — order_items and data.meta.actions are simply absent. Treat their absence as "order data not available for this reservation", not as an error. • [Partial Cancellations](https://docs.distribusion.com/dt/api/enterprise-features/partial-cancellations.md): Note: This section offers an early preview of a new capability launching with selected partners. Content will be updated as the feature is finalised. Please reach out to your Partnerships Manager any time to align on the latest specifications. This page describes how a retailer uses the Distribusion Retailer API (rAPI) to cancel part of a booking — either specific passengers, or an entire bound (outbound or inbound) on a return trip. General principle. Partial cancellations reuse the same endpoints as a full cancellation. To cancel just part of a booking you pass one of two scoping parameters: connection_id to cancel a whole bound, or passenger_ids[] to cancel specific passengers. With neither, the request is treated as a full cancellation. The two-step shape is the same as today: GET /cancellations/conditions (preview the fee & refund) followed by POST /cancellations/create (commit). When to use partial cancellations. Whenever the customer wants to cancel some of the passengers, or one direction of a return trip, while keeping the rest of the booking active. For a full cancellation, use the standard flow with no extra parameters. Affected endpoints Title Description Title Endpoint Purpose New parameters / fields GET /cancellations/conditions Preview the fee and refund for the planned cancellation connection_id , passenger_ids[] POST /cancellations/create Execute the cancellation connection_id , passenger_ids[] GET /bookings Inspect the booking after cancellation status: "cancelled" on affected segment_passengers Parameters Both GET /cancellations/conditions and POST /cancellations/create accept the following optional parameters. If neither is provided, the request is treated as a full cancellation. Title Description Title Parameter Type Description connection_id string Targets a single bound (outbound or inbound) of a return booking. All passengers on that bound are cancelled. passenger_ids[] array of strings Targets one or more specific passengers. Where do these IDs come from? Both IDs are returned by GET /bookings and GET /reservations . Connection IDs are under data.relationships.outbound_connection and data.relationships.inbound_connection : JSON { "outbound_connection": { "data": { "id": "ZBUS-ZZSTN001-ZZSTN002-2025-10-02T13:35-2025-10-02T13:45" } }, "inbound_connection": { "data": { "id": "ZBUS-ZZSTN002-ZZSTN001-2025-10-07T06:50-2025-10-07T06:55" } } } Passenger IDs are in the included array, on objects with type: "passengers" : JSON { "id": "ZCAR-ZZSTN003-ZZSTN004-2025-11-10T07:15-2025-11-10T08:50-0-PNOS-TESSWANN-ANA-2", "type": "passengers", "attributes": { "first_name": "Ana", "last_name": "Tesswann", "type": "PNOS" } } All examples below use the demo environment ( api.demo.distribusion.com ). Authentication via the Api-Key header is required on every request — omitted from the snippets for brevity. Carrier and station codes ( ZBUS , ZCAR , ZZSTN001 …) are placeholder s. Cancellation per bound (return bookings) Us e connection_id to cancel all passengers on a single direction of a return trip. The other bound remains active. Step 1 — Check conditions HTTP https://api.demo.distribusion.com/retailers/v4/cancellations/conditions?booking=EsEOGnFVTdwytNacNljztg &reason=customer_request &connection_id=ZBUS-ZZSTN001-ZZSTN002-2025-10-02T13:35-2025-10-02T13:45 Use the returned fee and refund to confirm the financial impact with the customer before proceeding. Step 2 — Create cancellations HTTP https://api.demo.distribusion.com/retailers/v4/cancellations/create JSON { "booking": "EsEOGnFVTdwytNacNljztg", "reason": "customer_request", "connection_id": "ZBUS-ZZSTN001-ZZSTN002-2025-10-02T13:35-2025-10-02T13:45" } Response JSON { "data": { "id": "EsEOGnFVTdwytNacNljztg", "type": "cancellations", "attributes": { "state": "confirmed", "fully_cancelled": false, "created_as_partial": true, "total_price": 1168, "total_refund": 584, "latest_refund": 584, "latest_monetary_refund": 584 } } } fully_cancelled: false means the inbound is still active. To cancel the inbound as well, repeat the call with the inbound connection_id — when the last active element is cancelled, fully_cancelled will flip to true . Cancellation per passenger Use passenger_ids[] to cancel one or more specific passengers. The remaining passengers stay on the booking. Cancel a single passenger HTTP https://api.demo.distribusion.com/retailers/v4/cancellations/conditions?booking=ABC123 &reason=customer_request &passenger_ids[]=NFCI-BRXGRNBU-BRPERRDP-2025-11-26T07:15-2025-11-26T08:50-0-PNOS-TESSWANN-ANA-2 HTTP https://api.demo.distribusion.com/retailers/v4/cancellations/create JSON { "booking": "ABC123", "reason": "customer_request", "passenger_ids": [ "ZCAR-ZZSTN003-ZZSTN004-2025-11-26T07:15-2025-11-26T08:50-0-PNOS-TESSWANN-ANA-2" ] } Cancel multiple passengers HTTP https://api.demo.distribusion.com/retailers/v4/cancellations/create JSON { "booking": "ABC123", "reason": "customer_request", "passenger_ids": [ "ZCAR-ZZSTN003-ZZSTN004-2025-11-26T07:15-2025-11-26T08:50-0-PNOS-DOE-JOHN-1", "ZCAR-ZZSTN003-ZZSTN004-2025-11-26T07:15-2025-11-26T08:50-0-PNOS-PIRES-LEO-3" ] } Response fields Both full and partial cancellations now return the following attributes on POST /cancellations/create : Title Description Title Field Type Description created_as_partial boolean true if the cancellation was started as a partial cancellation, even after all elements have been cancelled. false if it was a full cancellation from the start. fully_cancelled boolean true once all passengers and bounds on the booking have been cancelled; false while any element is still active. Booking state after cancellation After a partial cancellation, GET /bookings and GET /reservations still return the full booking structure. Cancelled elements are flagged with status: "cancelled" on the corresponding segment_passengers object: JSON { "id": "ZCAR-ZZSTN003-ZZSTN004-2025-11-26T07:15-2025-11-26T08:50-0-PNOS-DISTRIBUSION-TESTMANN-LEO-1-0", "type": "segment_passengers", "attributes": { "seat_number": "29", "status": "canceled" } } Use this attribute to render the correct state on your Manage Booking surfaces. • [GTFS](https://docs.distribusion.com/dt/api/enterprise-features/gtfs.md): Distribusion allows partners to retrieve carrier schedules in GTFS format for all carriers in the platform via the Retailer API. Retrieval intervals can be freely defined to suit your schedule data refreshment needs. This data is made available within the /marketing_carriers/{marketing_carrier_id}/gtfs endpoint. Please note that this is an enterprise API feature. Reach out to your Partnership Manager for more information about unlocking this and other advanced features. File Content GTFS files are a powerful solution to import carrier schedules in bulk and provide users on your site with relevant travel data, such as: Route information Stop sequences Departure frequencies Dates & days of service Starting prices File Structure The files are available in zip format and the structure of the files follows official GFTS documentation as displayed on gtfs.org . Some key characteristics of Distribusion GTFS include: Intermediate stop routing (within stops file) Coverage of prices (cheapest_total_adult_price) Full coverage of single-segment trips available in the Distribusion database Download our sample GTFS file for Megabus (MEGB). Update Frequency Distribusion’s GTFS files are generated every two days to enable you to present accurate and fresh travel data to users. API Examples Sample Request to /marketing_carriers/{marketing_carrier_id}/gtfs HTTP https://api.demo.distribusion.com/retailers/v4/marketing_carriers/MEGB/gtfs Sample Response from /marketing_carriers/{marketing_carrier_id}/gtfs Sample file (MEGB) (zip format) For more sample responses, check the /marketing_carriers/{marketing_carrier_id}/gtfs endpoint page. • [Suggestion Service](https://docs.distribusion.com/dt/api/enterprise-features/suggestion-service.md): Our suggestion service enhances the search experience by giving suggestions of locations to users while they search in your interface. You can view the suggestion service in action in our booking engine solution. Suggestion Options We can provide 2 solutions using this endpoint: Popular Destinations : This solution provides a list of the most popular destinations in terms of searches and bookings based on the carriers you have access to. Dynamic Search : This solution provides a list of possible locations in response to what users type into a depature and arrival location fields based on the carriers you have access to. Please note that this is an enterprise API feature. Reach out to your Partnership Manager for more information about unlocking this and other advanced features. API Workflow For Popular Destinations When the user clicks on the departure location field in your UI make a GET request to the /locations endpoint. This will populate the most common list of departure locations. Use the response to show as suggestions in the field. API Workflow For Dynamic Search When the user starts typing, update the drop-down based on the user's input. To do that make another request to the /locations endpoint by adding the q parameter with the value input by the user. For example q=berlin . Each time the text input by the user changes, you should make a new call. To make the experience better we recommend adding a delay of 300ms for the user to stop typing and then make a new request to the /locations. When the user selects a departure from the list and move to the arrival location field make a new request to /locations adding the location into the depature parameters. For example, if the user selects the city of Berlin from the list, add the parameters departureLocation=DEBER and departureLocationType=city . This will show the list of popular arrival locations. When the user starts typing the arrival location, update the drop-down based on the user's input again. Make another request to the /locations endpoint by adding the q parameter alongside the departureLocation=DEBER and departureLocationType=city parameters. This endpoint currently doesn't require authentication and is available via the URL https://global-api.distribusion.com/ . Parameters rpn : Set the retailer partner number (RPN). Contact your partnership manager to receive yours. Reference value: 012345. q : Letters typed by the user into your UI field. locale : Set the language for the content of the response. The field accepts ISO 639 language codes. If the content in the specified language is unavailable, English will be returned. For more details check our Languages guide. Reference value: en. limitTopLevel : Number of results. Reference value: 10. departureLocation : Selected departure location code. Only used to get arrival results based on the departure location selected by the user. It can be a station, area or city. Reference value: CHGVA. departureLocationType - Selected departure location type. Only used to get arrival results based on the departure location selected by the user. It can be station, area or city. Reference value: city. API Examples Sample Request to /locations Plain text https://global-api.distribusion.com/suggestion-service/v3/locations?rpn={retailer_partner_number}&limitTopLevel=10&locale=en&q=berlin https://global-api.distribusion.com/suggestion-service/v3/locations?rpn={retailer_partner_number}&limitTopLevel=10&locale=en&q=berlin Sample Response from /locations JSON { "locations": [ { "timestamp": 1729832408388, "type": "city", "code": "DEBER", "countryCode": "DE", "subdivisionCode": null, "parentLocations": [], "names": [ { "languageCode": "en", "name": "Berlin" } ], "score": 6978.9, "bestMatch": "\u003Cem\u003EBerlin\u003C/em\u003E", "childrenLocations": [ { "timestamp": 1729832408388, "type": "area", "code": "DEBERBB", "countryCode": "DE", "subdivisionCode": null, "parentLocations": [ { "code": "DEBER", "type": "city" } ], "names": [ { "languageCode": "en", "name": "Berlin Airport BER" } ], "score": 2773.9, "bestMatch": "\u003Cem\u003EBerlin\u003C/em\u003E Airport BER", "childrenLocations": [ { "timestamp": 1729832408388, "type": "station", "code": "DEBERBFB", "countryCode": "DE", "subdivisionCode": null, "parentLocations": [ { "code": "DEBERBB", "type": "area" }, { "code": "DEBER", "type": "city" } ], "names": [ { "languageCode": "en", "name": "Berlin Airport BER Terminal 1&2 Train Station" } ], "score": 2762.5, "bestMatch": "\u003Cem\u003EBerlin\u003C/em\u003E Airport BER Terminal 1&2 Train Station", "childrenLocations": [] } ] }, { "timestamp": 1729832408388, "type": "area", "code": "DEBERBC", "countryCode": "DE", "subdivisionCode": null, "parentLocations": [ { "code": "DEBER", "type": "city" } ], "names": [ { "languageCode": "en", "name": "Berlin Central Train Station" } ], "score": 1006.7, "bestMatch": "\u003Cem\u003EBerlin\u003C/em\u003E Central Train Station", "childrenLocations": [ { "timestamp": 1729832408388, "type": "station", "code": "DEBERHBF", "countryCode": "DE", "subdivisionCode": null, "parentLocations": [ { "code": "DEBERBC", "type": "area" }, { "code": "DEBER", "type": "city" } ], "names": [ { "languageCode": "en", "name": "Berlin Central Train Station" } ], "score": 1006.7, "bestMatch": "\u003Cem\u003EBerlin\u003C/em\u003E Central Train Station", "childrenLocations": [] } ] }, { "timestamp": 1729832408388, "type": "station", "code": "DEBERBAB", "countryCode": "DE", "subdivisionCode": null, "parentLocations": [ { "code": "DEBER", "type": "city" } ], "names": [ { "languageCode": "en", "name": "Berlin Alexanderplatz Train Station" } ], "score": 950.2, "bestMatch": "\u003Cem\u003EBerlin\u003C/em\u003E Alexanderplatz Train Station", "childrenLocations": [] }, { "timestamp": 1729832408388, "type": "area", "code": "DEBERBE", "countryCode": "DE", "subdivisionCode": null, "parentLocations": [ { "code": "DEBER", "type": "city" } ], "names": [ { "languageCode": "en", "name": "Berlin Central Bus Station" } ], "score": 731, "bestMatch": "\u003Cem\u003EBerlin\u003C/em\u003E Central Bus Station", "childrenLocations": [ { "timestamp": 1729832408388, "type": "station", "code": "DEBERCBS", "countryCode": "DE", "subdivisionCode": null, "parentLocations": [ { "code": "DEBERBE", "type": "area" }, { "code": "DEBER", "type": "city" } ], "names": [ { "languageCode": "en", "name": "Berlin Central Bus Station" } ], "score": 699.7, "bestMatch": "\u003Cem\u003EBerlin\u003C/em\u003E Central Bus Station", "childrenLocations": [] } ] }, { "timestamp": 1729832408388, "type": "area", "code": "DEBERBI", "countryCode": "DE", "subdivisionCode": null, "parentLocations": [ { "code": "DEBER", "type": "city" } ], "names": [ { "languageCode": "en", "name": "Berlin Südkreuz Train Station" } ], "score": 402.9, "bestMatch": "\u003Cem\u003EBerlin\u003C/em\u003E Südkreuz Train Station", "childrenLocations": [ { "timestamp": 1729832408388, "type": "station", "code": "DEBERSDE", "countryCode": "DE", "subdivisionCode": null, "parentLocations": [ { "code": "DEBERBI", "type": "area" }, { "code": "DEBER", "type": "city" } ], "names": [ { "languageCode": "en", "name": "Berlin Südkreuz" } ], "score": 402.9, "bestMatch": "\u003Cem\u003EBerlin\u003C/em\u003E Südkreuz", "childrenLocations": [] } ] } ] } ] } • [Virtual Interlining](https://docs.distribusion.com/dt/api/enterprise-features/virtual-interlining.md): The Distribusion API has the ability to interline individual trips to create new, multi-segment, bookable itineraries. These combined itineraries can include one or more carriers and enable customer facing applications to deliver a far broader range of trip options to users. Check our infosheet for more details about Virtual Interlining. Updates to this functionality are under development. More information coming soon • [Real Time](https://docs.distribusion.com/dt/api/enterprise-features/real-time.md): Note: This section offers an early preview of a new capability launching with selected partners. Content will be updated as the feature is finalised. Please reach out to your Partnerships Manager any time to align on the latest specifications. Real Time data can be used to track the progress of trips, vehicle details, route and stop information for both scheduled and live tracked trips. Overview Distribusion serves real-time transit data via GTFS-RT feeds on the Distribusion API. These feeds give retailers live vehicle positions, estimated arrival/departure times, and cancellation status for active rides. GTFS-RT feeds work only in combination with static GTFS files — the static file defines the schedule, and the real-time feed provides updates to it (estimated times, cancellations, positions). Without the static baseline, real-time data cannot be interpreted. Available Feeds Two feeds per carrier, following GTFS-RT spec v2.0. All return the full current state (FULL_DATASET) — not incremental deltas. Title Description Feed What it contains Trip Updates Estimated arrival/departure times per stop, cancellation status Vehicle Positions GPS coordinates, vehicle status (in transit / stopped), timestamp Endpoints Title Description Feed Path Trip Updates /retailers/v4/marketing_carriers/{CARRIER_CODE}/gtfs/realtime/trip-updates Vehicle Positions /retailers/v4/marketing_carriers/{CARRIER_CODE}/gtfs/realtime/vehicle-positions Auth: standard Distribusion API Api-Key header. Format: Protocol Buffers (protobuf). Prerequisites To consume GTFS-RT feeds you need: Static GTFS file for each carrier — kept in sync with Distribusion's published version. Trip IDs in real-time feeds reference the current static file. GTFS-RT parser — any standard library that reads protobuf GTFS-RT messages. Polling — pull model. Recommended intervals: 15–60s for vehicle positions, 30–120s for trip updates. Static GTFS is mandatory. Real-time feeds reference trip, route, and stop IDs from the static file. They cannot be used standalone. Feed Structure and Examples Both feeds return data in Protocol Buffers (protobuf) format only . There is no JSON interface on the API. Note on examples below: The examples in this section are shown in JSON purely for illustration purposes, to make the data structure easier to read. The actual API responses are protobuf-encoded and must be parsed with a GTFS-RT protobuf library. How trip IDs connect to static GTFS Every entity contains a trip object with a trip_id that matches a record in the trips.txt file of the corresponding static GTFS. The stop_id values in stop time updates match records in stops.txt . This is how you join real-time data with the static schedule. Trip Updates — example entity JSON { "id": "1218367546", "trip_update": { "trip": { "trip_id": "NEXP-19:55-GBBLKCCS-196e10cd", "start_date": "20260521", "schedule_relationship": "SCHEDULED" }, "stop_time_update": [ { "stop_sequence": 0, "stop_id": "GBBLKCCS", "arrival": { "time": "2026-05-21T18:58:42.997000+00:00" }, "departure": { "time": "2026-05-21T18:58:42.997000+00:00" } }, { "stop_sequence": 1, "stop_id": "GBMANCBS", "arrival": { "time": "2026-05-21T20:14:06.986000+00:00" }, "departure": { "time": "2026-05-21T20:14:06.986000+00:00" } } ], "timestamp": "2026-05-21T19:02:20+00:00" } } Key fi elds: trip.trip_id → matches trip_id in static GTFS trips.txt trip.schedule_relationship → SCHEDULED (running) or CANCELED stop_time_update[].stop_id → Distribusion station code (e.g. GBBLKCCS ), matches stop_id in static GTFS stops.txt stop_time_update[].arrival.time / departure.time → current estimated times (ISO 860 1) Vehicle Positions — example entity JSON { "id": "1218367546", "vehicle": { "trip": { "trip_id": "NEXP-19:55-GBBLKCCS-196e10cd", "start_date": "20260521", "schedule_relationship": "SCHEDULED" }, "vehicle": { "id": "vehicle_000-6bf0e592547b" }, "position": { "latitude": 53.805274963378906, "longitude": -3.0455329418182373 }, "timestamp": "2026-05-21T19:02:36+00:00" } } Key fields: trip.trip_id → same trip ID as in Trip Updates and static GTFS position.latitude / longitude → WGS84 coordinates timestamp → when the position was recorded Response envelope Both feeds wrap entities in the same envelope: JSON { "header": { "gtfs_realtime_version": "2.0", "incrementality": 0, "timestamp": "2026-05-21T19:02:20+00:00" }, "entity": [] } incrementality: 0 means FULL_DATASET — each response is the complete current state, not a delta. • [Advanced Pricing Insights](https://docs.distribusion.com/dt/api/enterprise-features/price-insights.md): The Distribusion API has the ability to offer advanced pricing insights to your customers to keep them highly informed of all things related to the cost of their trip. Please note that this is an enterprise API feature. Reach out to your Partnership Manager for more information about unlocking this and other advanced features. The advanced pricing insights are a set of features designed to enrich the customer's travel booking journey with valuable pricing information. These features are meant to be integrated into various stages of the online retail process, appearing on pages like search results (price calendar) and booking confirmation page (price hints and price forecast). The Advanced Pricing Insights functionality is not supported by all carriers. To check if your preferred carriers is supported, please reach out to your Partnership Manager. Also note that this functionality currently only works in production environment. Pricing Calendar The price calendar feature allows end user to easily select departure & return dates of interest by showing minimum price per date, that can be shown in the form of calendar, for example: It is proposed to be integrated as a support endpoints for search step, and to be called before calling /connections/find when both origin and destination is already known. There are 2 endpoints: /price-insights/calendar – used for one-way search (A→B), returns minimum price calendar for given dates and locations with ability to inclusively filter carriers. /price-insights/calendar/return – used for return search (A→B→A), returns minimum 2 way price calendar for given dates and locations and selected departure date with ability to inclusively filter carriers. Sample Request to /price-insights/calendar HTTP https://api.distribusion.com/retailers/v4/price-insights/calendar?currency=EUR&departure_city=FRNTE&arrival_city=FRLYS&departure_date_start=2025-11-15&departure_date_end=2025-11-18&retailer_partner_number=222222 Sample Response from /price-insights/calendar JSON { "calendar": [ { "date": "2025-11-15", "price": 2448 }, { "date": "2025-11-16", "price": 3748 }, { "date": "2025-11-17", "price": 2448 }, { "date": "2025-11-18", "price": 2248 } ] } The response will include all dates from departure_date_start until departure_date_end inclusively when either price is present or when corresponding OD found. If the OD is not found, no prices are returned. If the OD is found, all available prices are returned – missing prices will be null. Sample Request to /price-insights/calendar/return HTTP https://api.distribusion.com/retailers/v4/price-insights/calendar/return?currency=EUR&departure_city=FRNTE&arrival_city=FRLYS&departure_date=2025-11-15&return_date_start=2025-11-15&return_date_end=2025-11-18&retailer_partner_number=222222 Sample Response from /price-insights/calendar/return JSON { "calendar": [ { "date": "2025-11-15", "price": 5646 }, { "date": "2025-11-16", "price": 5846 }, { "date": "2025-11-17", "price": 4896 }, { "date": "2025-11-18", "price": 4696 } ] } Note that here price shown is total price with return (i.e. A→B + B→A). When asking for return price you don’t need to swap departure and arrival – it is done by service itself. E.g. you got London → Paris calendar and now want to get return calendar: you still pass London as departure and Paris as arrival. The response must include all dates from return_date_start until return_date_end inclusively when either price is present or when corresponding OD found. If the OD is not found, no prices are returned. If the OD is found, all available prices are returned – missing prices will be null. It takes into account open return prices whenever possible. Pricing Hints Price hints allow end users to easily be aware how the currently selected trip price looks compared to regular price for this trip, example: It is proposed to integrate the endpoint /price-insights/price-hints at the confirmation step, so this endpoint call should happen in parallel to /connections/vacancy endpoint. Sample Request to /price-insights/price-hints HTTP https://api.distribusion.com/retailers/v4/price-insights/price-hints?currency=EUR&departure_station=FRPARPRB&arrival_station=FRNTENAN&departure_time=2025-11-05T09:57 Sample Response from /price-insights/price-hints JSON { "reference_price_threshold": 1948, "reference_price": 2098 } Assuming that the response from /connections/vacancy is 1606 (16.06 EUR), then the /connections/vacancy price is lower than reference_price_threshold : 1606 < 1948. The difference (i.e. how much lower?) is calculated based on reference_price , i.e. (2098-1606) = 492 which translated to 4.92 EUR lower. Pricing Forecast Display to your user predictions in future pricing trends, allowing them to better understand when the price will increase. It is proposed to integrate the endpoint /price-insights/price-forecast at the confirmation step, so this endpoint call should happen in parallel to /connections/vacancy endpoint. Sample Request to /price-insights/price-forecast HTTP https://api.distribusion.com/retailers/v4/price-insights/price-forecast?marketing_carrier_code=ACOA&departure_station=GBBFSBEU&arrival_station=IEDUBDFA&departure_time=2025-11-05T09:10&fare_class=FARE-1 Sample Response from /price-insights/price-forecast JSON { "expected_price_increase_in_days" : 3 } • [Emissions Data](https://docs.distribusion.com/dt/api/enterprise-features/emissions-data.md): By harnessing the connections to many different types of carrier systems (schedule, availability, real-time, etc.), Distribusion is able to generate CO2e emissions in trip-level granularity. This data can help consumers make more sustainably conscious decisions and is made available within the search flow. Overview Figures are estimates, calculated per passenger rather than per vehicle. They are based on the vehicle operating the trip where it is known, falling back to fleet and country averages where it is not, and account for expected occupancy. Emissions are returned as attributes on each connection in the /conn response, on a well-to-wheel basis — covering both the energy used to move the vehicle and the energy used to produce and deliver its fuel. AttributeDescription co2_kg Carbon dioxide emitted for the connection, in kilograms co2e_kg Total greenhouse gas emissions for the connection, expressed as CO2 equivalent, in kilograms Emissions are decimal kilograms. Note that this differs from prices on the same object, which are integers in the smallest unit of the currency. Response Example: JSON { "id": "TTES-ITGENGEZ-ITBLQBCB-2026-06-13T13:00-2026-06-13T16:04-0", "type": "connections", "attributes": { "departure_time": "2026-06-13T13:00", "arrival_time": "2026-06-13T16:04", "duration": 11040, "cheapest_total_adult_price": 8200, "cheapest_fare_class_code": "FARE-1", "booked_out": false, "co2_kg": 15.828133583068848, "co2e_kg": 18.149818420410156 } } Please note that this is an enterprise API feature. Reach out to your Partnership Manager for more information about unlocking this and other advanced features. Where emissions cannot be calculated for a connection, the attributes are omitted rather than returned as null. Treat them as optional in your integration. • [Credit Card Payments](https://docs.distribusion.com/dt/api/enterprise-features/credit-card-payments.md): Every payment on a reservation is a payment item — its own object with its own id, status and amount, created before the reservation is confirmed. A reservation confirms only once its payment items cover the full balance. Plain text total_remaining = total_price + total_fees − Σ total_allocated (non-cancelled payment items) reservation confirms ⇔ total_remaining = 0 and every covering payment item is captured total_remaining = total_price + total_fees − Σ total_allocated (non-cancelled payment items) reservation confirms ⇔ total_remaining = 0 and every covering payment item is captured Amounts are integers in the minor unit of the currency ( 6574 = EUR 65.74). Card data goes to the tokenization proxy, not the API base URL. Any request carrying card data — number , security_code , or the tokenized equivalent — must be sent to https://secure.distribusion.com . Requests to the regular base URL are not tokenized: they are accepted, so the failure is silent and the raw card number travels on unprotected. Every other call on this page uses the regular base URL. Two Processing Paths The same endpoints serve both paths. Which one a reservation takes is configured by Distribusion per carrier and retailer — retailers do not select it, and the request shape does not change. Title Description Title DT payment Carrier payment Who charges the customer Distribusion, through the DT Payment Service The carrier, through their own payment setup Distribusion's role Full processing: authorize, 3DS, capture, settle with the carrier Secure pass-through: card data is tokenized and forwarded Payment executed at PUT /reservations/confirm (DT side, asynchronous) PUT /reservations/confirm (carrier side) Statuses observed pending → … → authorized → captured → confirmed , including action_required pending → confirmed Customer challenge (3DS, hosted payment page) Surfaced on the payment item as action_required plus redirect_url Carrier-dependent, mostly suppressed Workflow Create the reservation POST /reservations/create holds the trip and establishes the price, the currency and the open balance every payment item is measured against. Create a payment item POST /reservations/:reservation_id/payment_items , once per payment instrument the customer uses. The response carries total_fees , which you add to the basket total shown to the customer, and — where the carrier requires extra data — a custom_fields relationship. Supply custom fields Repeat the POST with the collected values when custom_fields came back non-empty. Confirm PUT /reservations/confirm . Payment items on the reservation are picked up automatically; they are not referenced in the request body. The call returns immediately with the reservation in processing and its payment items included. Poll GET /reservations/:id until the payment items leave the in-flight statuses. On the DT path a payment item may enter action_required : redirect the customer to details.redirect_url , then keep polling. The reservation reaches confirmed once payment is captured and the carrier has confirmed. Payment Methods Title Description payment_method details credit_card Card details, see below sharegroop Hosted payment page (redirect), see below voucher code , pin demand_note — cash — pos_terminal — Endpoints POST /reservations/reservation_id/payment_items Title Description Title Description Field Type Required Notes payment_method string Yes See Payment Methods details object Per method Shape depends on payment_method details for credit_card : Title Description Title Description Field Type Required Notes type string Yes visa , mastercard , amex , diners , jcb , airplus , … tokenized_data string Yes Card data tokenized by the proxy. Replaces number and security_code . number string No Raw card number, accepted instead of tokenized_data . Sandbox only. security_code string No Raw card only. holder_name string No expiry_month / expiry_year string No 03 / 2030 browser_info object No DT path, see below details for sharegroop (hosted payment page): Title Description Title Description Field Type Required Notes return_url string Yes Where the customer lands after paying browser_info object No See below details.browser_info is forwarded to the payment provider, which decides from it whether a 3DS challenge is required. Omitting it makes a challenge more likely. Title Description Field Type accept_header string user_agent string language string color_depth integer screen_height / screen_width integer time_zone_offset integer (minutes) java_enabled boolean Request JSON { "payment_method": "credit_card", "details": { "type": "visa", "tokenized_data": "tok_1M2N3B4V5C6X", "expiry_month": "03", "expiry_year": "2030", "holder_name": "PETER PAN", "browser_info": { "accept_header": "*/*", "user_agent": "Mozilla/5.0 (Linux; Android 10; K)", "language": "nb-NO", "color_depth": 24, "screen_height": 892, "screen_width": 412, "time_zone_offset": -120, "java_enabled": false } } } Response 201 . The created payment item is data ; the reservation's payable object, its fees and any required custom fields are in included . JSON { "data": { "id": "QMTQ456P6BPYRS1", "type": "payment_items", "attributes": { "id": "QMTQ456P6BPYRS1", "status": "pending", "details": {}, "processed_at": null, "currency_code": "EUR", "payment_method": "credit_card", "total_charged": 0, "total_allocated": 6574, "total_fees": 100 }, "relationships": { "payable_object": { "data": { "id": "RQVNHPLI", "type": "payable_objects" } }, "custom_fields": { "data": [ { "id": "DBTS-CORPORATECARDPAYMENT_KOSTENSTELLE", "type": "custom_fields" }, { "id": "DBTS-CORPORATECARDPAYMENT_PROJEKTNUMMER", "type": "custom_fields" } ] } } }, "included": [ { "id": "RQVNHPLI", "type": "payable_objects", "attributes": { "total_price": 6574, "total_fees": 100, "currency": "EUR", "total_charged": 0, "total_allocated": 6574, "total_remaining": 0 }, "relationships": { "payment_items": { "data": [{ "id": "QMTQ456P6BPYRS1", "type": "payment_items" }] }, "fees": { "data": [{ "id": "RQVNHPLI-PAYMENT_METHOD_SURCHARGE", "type": "fees" }] } } }, { "id": "DBTS-CORPORATECARDPAYMENT_KOSTENSTELLE", "type": "custom_fields", "attributes": { "id": "DBTS-CORPORATECARDPAYMENT_KOSTENSTELLE", "name": "corporatecardpayment_kostenstelle", "value": "" } }, { "id": "RQVNHPLI-PAYMENT_METHOD_SURCHARGE", "type": "fees", "attributes": { "code": "PAYMENT_METHOD_SURCHARGE", "name": "Payment method surcharge", "component": "carrier", "included_in_price": false, "amount": 100 } } ] } Submitted card data is never echoed back. details in a response carries only code for vouchers and redirect_url for a challenge or hosted page. GET /reservations/reservation_id/payment_items Returns the payable object as data , with the payment items in included — the mirror of the POST response shape. Plain text GET https://api.distribusion.com/retailers/v4/reservations/RVN3U21W/payment_items GET https://api.distribusion.com/retailers/v4/reservations/RVN3U21W/payment_items JSON { "data": { "id": "RQVNHPLI", "type": "payable_objects", "attributes": { "total_price": 6574, "total_fees": 0, "currency": "EUR", "total_charged": 0, "total_allocated": 6574, "total_remaining": 0 }, "relationships": { "payment_items": { "data": [{ "id": "QMTQ456P6BPYRS1", "type": "payment_items" }] }, "fees": { "data": [] } } }, "included": [ { "id": "QMTQ456P6BPYRS1", "type": "payment_items", "attributes": { "id": "QMTQ456P6BPYRS1", "status": "pending", "details": {}, "processed_at": null, "currency_code": "EUR", "payment_method": "credit_card", "total_charged": 0, "total_allocated": 6574, "total_fees": 0 }, "relationships": { "custom_fields": { "data": [] } } } ] } DELETE /reservations/reservation_id/payment_items/id Removes a payment method from a reservation. Removal is a soft delete: the payment item moves to cancelled , releases its allocation and drops out of the reservation's payment items, so total_remaining rises by the amount it covered. The response returns the removed item and the recalculated payable object. Only a pending payment item can be removed. Once it is with a payment provider ( action_required , authorized , captured ) the call is rejected with 400 / 400.800.053 Payment item is not cancellable . An in-flight payment has to resolve on its own, and a declined, failed or expired attempt reaches cancelled by itself. Plain text DELETE https://api.distribusion.com/retailers/v4/reservations/RVN3U21W/payment_items/QMTQ456P6BPYRS1 DELETE https://api.distribusion.com/retailers/v4/reservations/RVN3U21W/payment_items/QMTQ456P6BPYRS1 Plain text { "data": { "id": "QMTQ456P6BPYRS1", "type": "payment_items", "attributes": { "id": "QMTQ456P6BPYRS1" }, "relationships": { "reservation": { "data": { "id": "RQVNHPLI", "type": "reservations" } } } }, "included": [ { "id": "RQVNHPLI", "type": "payable_objects", "attributes": { "total_price": 6574, "total_fees": 0, "currency": "EUR", "total_charged": 0, "total_allocated": 0, "total_remaining": 6574 }, "relationships": { "payment_items": { "data": [] }, "fees": { "data": [] } } } ] } { "data": { "id": "QMTQ456P6BPYRS1", "type": "payment_items", "attributes": { "id": "QMTQ456P6BPYRS1" }, "relationships": { "reservation": { "data": { "id": "RQVNHPLI", "type": "reservations" } } } }, "included": [ { "id": "RQVNHPLI", "type": "payable_objects", "attributes": { "total_price": 6574, "total_fees": 0, "currency": "EUR", "total_charged": 0, "total_allocated": 0, "total_remaining": 6574 }, "relationships": { "payment_items": { "data": [] }, "fees": { "data": [] } } } ] } PUT /reservations/confirm Confirms the reservation and commits its payment items. Payment items are not referenced in the body — those on the reservation are picked up automatically. execute_payment is a boolean carried on the booking as information only. It does not decide whether the payment is executed. Do not send the legacy inline card fields ( card_number , cvv , …) alongside payment items — they take precedence and the payment items are ignored. Plain text { "reservation_id": "RVN3U21W", "execute_payment": true, "terms_accepted": true, "send_customer_email": true, "title": "mr", "first_name": "John", "last_name": "Smith", "email": "test@test.com", "phone": "+493533400275", "city": "Berlin", "zip_code": "13355", "street_and_number": "Wattstrasse 10", "retailer_booking_number": "", "transaction_reference": "", "passengers": [ { "type": "PNOS", "first_name": "John", "last_name": "Smith", "birthdate": "1970-07-21", "nationality": "DE", "government_id_type": "passport_id", "government_id": "DE1234567" } ] } { "reservation_id": "RVN3U21W", "execute_payment": true, "terms_accepted": true, "send_customer_email": true, "title": "mr", "first_name": "John", "last_name": "Smith", "email": "test@test.com", "phone": "+493533400275", "city": "Berlin", "zip_code": "13355", "street_and_number": "Wattstrasse 10", "retailer_booking_number": "", "transaction_reference": "", "passengers": [ { "type": "PNOS", "first_name": "John", "last_name": "Smith", "birthdate": "1970-07-21", "nationality": "DE", "government_id_type": "passport_id", "government_id": "DE1234567" } ] } The response carries the reservation with its payment items — processing while payment is in flight, confirmed once it is done. Plain text { "jsonapi": { "version": "1.0" }, "meta": { "locale": "en", "currency": "EUR" }, "data": { "id": "R6VLFQHF", "type": "reservations", "attributes": { "total_price": 2699, "original_price": 2699, "state": "processing", "created_at": "2026-06-30T15:05", "expires_at": "2026-06-30T15:15" }, "relationships": { "payment_items": { "data": [{ "id": "9AAGAIUNIPMJTC1U", "type": "payment_items" }] } } }, "included": [ { "id": "9AAGAIUNIPMJTC1U", "type": "payment_items", "attributes": { "id": "9AAGAIUNIPMJTC1U", "status": "action_required", "details": { "redirect_url": "https://3ds.com/path/to/challenge" }, "processed_at": null, "currency_code": "EUR", "payment_method": "credit_card", "total_charged": 0, "total_allocated": 2699, "total_fees": 0 }, "relationships": { "custom_fields": { "data": [] } } } ] } { "jsonapi": { "version": "1.0" }, "meta": { "locale": "en", "currency": "EUR" }, "data": { "id": "R6VLFQHF", "type": "reservations", "attributes": { "total_price": 2699, "original_price": 2699, "state": "processing", "created_at": "2026-06-30T15:05", "expires_at": "2026-06-30T15:15" }, "relationships": { "payment_items": { "data": [{ "id": "9AAGAIUNIPMJTC1U", "type": "payment_items" }] } } }, "included": [ { "id": "9AAGAIUNIPMJTC1U", "type": "payment_items", "attributes": { "id": "9AAGAIUNIPMJTC1U", "status": "action_required", "details": { "redirect_url": "https://3ds.com/path/to/challenge" }, "processed_at": null, "currency_code": "EUR", "payment_method": "credit_card", "total_charged": 0, "total_allocated": 2699, "total_fees": 0 }, "relationships": { "custom_fields": { "data": [] } } } ] } Payment collected by a third-party processor Where the payment was taken outside the Distribusion flow, pass it as an inline payment item at confirm instead of creating one on the reservation. psp_transaction_id marks the payment as already collected, and an inline payment item carrying it is the only kind the confirm request accepts. Title Description Title Description Field Type Required Notes payment_items[].payment_method string Yes See Payment Methods payment_items[].details.psp_transaction_id string Yes The processor's transaction id payment_items[].details.psp_provider string No Processor that took the payment payment_items[].details.purchase_order_number string No Echoed back in the payment item's details Plain text { "reservation_id": "RVN3U21W", "terms_accepted": true, "payment_items": [ { "payment_method": "sharegroop", "details": { "psp_transaction_id": "SG1234567890", "psp_provider": "sharegroop_direct", "purchase_order_number": "PO-12345" } } ] } { "reservation_id": "RVN3U21W", "terms_accepted": true, "payment_items": [ { "payment_method": "sharegroop", "details": { "psp_transaction_id": "SG1234567890", "psp_provider": "sharegroop_direct", "purchase_order_number": "PO-12345" } } ] } GET /reservations/id Carries the same payment_items relationship and is the endpoint to poll after confirming. There is no webhook and no separate 3DS endpoint. Payment Item Attributes Title Description Title Attribute Description Values id Unique identifier 16-character string status Lifecycle status See Statuses payment_method Method used See Payment Methods currency_code Payment item currency ISO 4217 total_allocated Amount this item covers. Set at creation, unchanged by charging Integer, minor units total_charged Amount actually charged. 0 until captured, then equal to total_allocated Integer, minor units total_fees Fees attached to this payment method, for example a corporate card surcharge Integer, minor units details Method-specific data returned to the retailer: code (voucher), redirect_url (challenge or hosted page), purchase_order_number Object processed_at When the item reached a final status Timestamp or null Statuses Title Description Title Status Path Meaning pending Both Registered on the reservation and counted against the balance. Intent to pay; nothing sent to a payment provider yet. Removable. action_required DT The customer must act — 3DS challenge or hosted payment page. details.redirect_url carries the link. authorized DT Funds held by the pre-authorization; capture follows. captured DT Funds captured. The booking is not created yet. confirmed Both Payment final and booked against the confirmed reservation. total_charged = total_allocated . cancelled Both No funds moved — removed by the retailer while pending , declined, challenge failed or expired, or the hold was released. Drops out of the reservation's payment items and balance; the reservation is unaffected. captured and confirmed are distinct: money is taken at captured , and the payment item becomes confirmed only once the carrier has confirmed the booking. On the carrier path the carrier charges as part of creating the booking, so pending → confirmed is the whole sequence. Plain text carrier payment pending → confirmed DT card, no challenge pending → authorized → captured → confirmed DT card, 3DS challenge pending → action_required → authorized → captured → confirmed DT hosted payment page pending → action_required → captured → confirmed declined / expired pending → [action_required] → cancelled (reservation holds) carrier payment pending → confirmed DT card, no challenge pending → authorized → captured → confirmed DT card, 3DS challenge pending → action_required → authorized → captured → confirmed DT hosted payment page pending → action_required → captured → confirmed declined / expired pending → [action_required] → cancelled (reservation holds) Customer Challenges and the Payment Window action_required means the ball is with the customer. Redirect them to details.redirect_url ; the payment item advances on its own once they are done, and the reservation state does not change while this happens. The reservation expiry is the payment window — a payment item carries no clock of its own. A challenge not completed before expiry resolves the payment item to cancelled , and any authorization landing afterwards is released. While a payment item is in flight ( action_required , authorized , captured ), amend and cancel are blocked on the reservation. Fees total_fees > 0 on the created payment item means the chosen method costs extra — a corporate card surcharge, for example. The customer pays these fees as part of the payment, so they must be added to the basket total shown at checkout and collected with it. They are not B2B fees invoiced to the retailer. The individual fees are listed in the payable object's fees relationship, and total_remaining already accounts for them. Card Data Security Card data must be tokenized before it reaches the Retailer API. Send POST /payment_items requests carrying card data to the tokenization proxy at https://secure.distribusion.com , not to the regular base URL; requests to the regular endpoint are not tokenized. Access is scoped by your retailer API key. holder_name and the expiry fields stay plain text. Custom Fields Some carriers require data beyond the card itself. Corporate card bookings, for instance, may need a cost centre or project number. The POST response then lists the required fields as a custom_fields relationship with empty values. Collect them from the customer and repeat the POST with the values filled in. An empty custom_fields array means nothing extra is needed. Treat every returned field as required. Multiple Payment Items A reservation can carry several payment items — a voucher covering part of the fare and a card covering the rest, for example. Each item carries only the amount it covers, and the sum must close the balance: voucher total_allocated 2000 + card total_allocated 4574 = total_price 6574 → total_remaining 0 A second card replaces the first rather than adding to it, while the first is still pending . Errors Errors follow the JSON:API shape, with the carrier's or payment provider's reason surfaced in title . JSON { "jsonapi": { "version": "1.0" }, "errors": [ { "code": "400.101.110", "title": "Card number is invalid" } ] } Title Description Title Condition Status Code Invalid or unsupported card data 400 Carrier-specific, e.g. 400.101.110 Missing required details field for the method (e.g. return_url ) 400 Unsupported payment_method for the carrier 400 Second primary payment item where replacement is restricted 400 400.101.223 Removing a payment item that is not pending 400 400.800.053 No payment method on the reservation at confirm 400 400.101.011 Payment item or reservation not found 404 400.800.049 Coverage of the balance is not validated at confirm. Carrier Specifics The table covers the carriers live today. More follow as the agreement with each carrier is in place. Title Description Title Description Title Carrier Path Cards Fees / additional data Challenge Deutsche Bahn (DBAH, DBTS) Carrier Airplus, Amex, Diners, Mastercard, Visa Surcharge on lodged and corporate cards; corporate card custom fields Suppressed Iryo Carrier Amex, Diners, JCB, Mastercard (credit, debit), Visa (credit, debit, electron, purchasing) None Suppressed SNCF groups DT Hosted payment page ( sharegroop ) None None Always — hosted page via action_required Amtrak coming soon Renfe coming soon • [AI Tools](https://docs.distribusion.com/dt/api/enterprise-features/ai-tools.md): Leverage the power of AI to create sophisticated, conversational experiences for your customers. Our suite of AI tools provides the core intelligence for building bots and agents that can handle the entire travel journey, from discovery and booking to post-sales support. Explore our tools for the booking flow. The Retailer Agent and the MCP Server let users find and book trips using natural language. The Retailer Agent also handles support after the purchase, like looking up an existing booking, retrieving tickets, and guiding the traveller through changes and cancellations. These enterprise features are designed to integrate seamlessly, allowing you to design the user experience while our APIs handle the AI-driven heavy lifting. • [MCP Server](https://docs.distribusion.com/dt/api/enterprise-features/ai-tools/mcp-server.md): The Retailer API MCP Server is a Model Context Protocol server that exposes Distribusion's Retailer API as typed tools for AI agents. It is designed for server-to-server use: an agentic application connects to it over MCP Streamable HTTP, discovers the available tools, and calls them to search connections, check availability and price, answer carrier policy questions, retrieve real-time trip data, and take the traveller through to checkout or a reservation. Please note that this is an enterprise API feature. Reach out to your Partnership Manager for more information about unlocking this and other advanced features. Connecting The server speaks MCP over the Streamable HTTP transport at https://api.distribusion.com/mcp/ . Authentication Every request must carry an MCP Server API key in the api-key header. This key is specific to the MCP Server and the Retailer Agent, and is not your regular Retailer API key — see API Authentication . Contact your Partnership Manager to get one. HTTP POST https://api.distribusion.com/mcp/ api-key: <RAPI_MCP_API_KEY> Content-Type: application/json Accept: application/json, text/event-stream The MCP Server resolves your MCP key to your retailer account server-side and calls the Retailer API on your behalf. Your Retailer API key is never transmitted to, or required by, the client. Every tool call is executed with your retailer's own credentials and permissions, so results, prices and carrier availability match what your Retailer API account is entitled to. Title Description Situation Response Missing, unknown or revoked api-key 401 Unauthorized Authentication service temporarily unavailable 503 Service Unavailable with a Retry-After header Key changes (including revocation) propagate within a few minutes. If you rotate a key, allow a short window before the old one stops working everywhere. How to Use The MCP Server is intended to be used in a Server-to-Server fashion, in other words, it is not intended to be used in personal AI applications, such as Claude Desktop, or Cursor. Instead, it is targeted towards Agentic application frameworks, such as LangChain , Google ADK , LlamaIndex , and many more. For instance, using Langchain MCP Adapters , the connection would be setup like this: Python from langchain_mcp_adapters.client import MultiServerMCPClient from langgraph.prebuilt import create_react_agent client = MultiServerMCPClient( { "distribusion": { "transport": "streamable_http", "url": "https://api.distribusion.com/mcp/", "headers": { "api-key": "<RAPI_MCP_API_KEY>" }, } } ) tools = await client.get_tools() agent = create_react_agent("openai:gpt-4.1", tools) response = await agent.ainvoke({"messages": "london to paris tonight"}) Here's an example of a simple agent using Google ADK : Python import os from google.adk.agents.llm_agent import Agent from google.adk.tools.mcp_tool.mcp_session_manager import StreamableHTTPConnectionParams from google.adk.tools.mcp_tool.mcp_toolset import MCPToolset root_agent = Agent( name="retailer_agent", description="An agent that searches for ground transportation trips", model="gemini-2.5-flash", instruction=""" Help the user find ground transportation trips. Follow this flow: 1. Resolve the departure and arrival places to location codes using search_location 2. Search for trips using those location codes and a departure date using connections_find 3. Present the results to the user 4. Based on the user's selection: 4.1. Check the availability and current price using connections_vacancy 4.2. If the trip is available: 4.2.1. Get the seat map (if available) and ask the user for a seat selection using get_seat_map 4.2.2. Use get_checkout_link to create a checkout link and present it to the user You may use the other tools available to answer additional questions.""", tools=[ MCPToolset( connection_params=StreamableHTTPConnectionParams( url="https://api.distribusion.com/mcp/", headers={"api-key": os.getenv("DISTRIBUSION_MCP_API_KEY", "")}, ) ), ], ) The MCP Server returns a set of server instructions during the MCP initialize handshake, describing the recommended tool flow and the guardrails around availability and checkout. Most frameworks surface these to the model automatically. If your framework does not, read them from the initialize result and prepend them to your system prompt — agents follow the flow far more reliably with them. The above example showcases a simple system prompt that instructs the agent to use the MCP Server accordingly. More detailed instructions or different combinations may be written depending on the use case, but generally, agents should follow this flow, analogous to the standard API flow described in Flow Overview : Resolve the departure and arrival locations Use search_location , which returns stations, cities and areas in one ranked result set. You can also pass IATA, UIC or geo-coordinates directly to connections_find . Search for trips Use connections_find with the resolved codes and a departure date. The search can be filtered by carrier or vehicle type, restricted to direct connections, narrowed to departure and return time windows, and can include a return trip and multiple passengers of different ages and discount cards, all in one call. Present the search results Results include rich data such as available fares, station details, intermediate stops and (optionally) walking steps. Check availability Use connections_vacancy once the traveller picks a connection and fare, to confirm the trip is still bookable and to get the most up-to-date price. Optional — get the seat map Use get_seat_map if the carrier supports seat selection, and let the traveller choose. Complete the sale Either generate a checkout URL with get_checkout_link and hand the traveller off to the Distribusion checkout page, or — if reservations are enabled for your account — hold and confirm the booking in-conversation with create_reservation and confirm_reservation . Optional — answer additional questions At any point: carrier policies, terms and conditions, fare rules, cheaper travel dates, or the live status of a departure. Note that the above setups are not time-aware. You may need to add a tool to the agent so that it knows the current date and time. Otherwise, the user must input exactly the travel dates, like “I want to travel on August 7th 2025” instead of “I want to travel next friday”. You can use the MCP Inspector to explore the MCP Server interactively before wiring it into your agent. Features Location and carrier lookup Title Description Title Tool Description Key Features search_location Preferred. Resolve any place name to a location code — station, city or area — in a single call, i.e. “Paddington”, “London” or “Berlin Airport”. Returns each match with its type (station / city / area) and a relevance score , so the agent can pick the right granularity without knowing in advance what kind of place the user named. search_carriers Search by carrier name (e.g., "Flixbus"). Used to filter search results to specific companies. Finds 4-letter carrier codes (like HEXR for Heathrow Express). Essential for filtering trips results. search_discount_cards List the discount cards, loyalty programmes and promotional offers a carrier accepts. Feeds the passenger_cards parameter of connections_find , connections_vacancy and get_checkout_link so discounted prices are reflected end to end. search_stations , search_cities and search_areas are still available but are deprecated in favour of search_location . They remain in the tool list for backwards compatibility; new integrations should not use them. Trip search, pricing and checkout Title Description Title Tool Description Key Features connections_find Search for trips from location A to location B on a specified date. Accepts station, city or area codes, IATA and UIC codes, or geo-coordinates with a radius — and can mix types (e.g. depart from an IATA code, arrive at a UIC train station). Supports one-way or return trips in one call, departure and return time windows, carrier and vehicle-type filters, direct-only search, per-passenger ages, discount cards, result sorting and optional walking steps. connections_vacancy Verify availability and price of a selected trip before checkout. Mandatory step before checkout, to confirm the seat is still available and the price has not changed. Also returns the fare and passenger breakdown used by the checkout step. get_seat_map View and select specific seats for a trip. Check window vs. aisle availability and seat surcharges. Only carriers that support pre-assigned seating return a map; for the rest the tool responds cleanly that seat selection is unavailable rather than failing the turn. get_checkout_link Generate a booking URL for the selected trip. Produces a secure Whitelabel checkout URL that carries the full selection — outbound and return legs, fare classes, passenger types, discount cards and chosen seats — plus the confirmed price, so the traveller lands on a pre-filled checkout. price_calendar Find the cheapest dates to travel. Returns the minimum price per day across a date range for a route. Ideal for travellers with flexible schedules. Reservations Where a checkout link is not the right hand-off — for example a counter agent or a fully conversational purchase — the server can hold and confirm a booking directly. Title Description Title Tool Description Key Features create_reservation Create a reservation hold before payment. Called after connections_vacancy . Returns the reservation id, the authoritative total price and currency, and an expiry timestamp — these are the values the payment step must use. confirm_reservation Confirm a held reservation and issue the tickets. Takes purchaser and passenger details plus a payment method: demand_note (settled on the retailer's monthly invoice) or cash (counter agent / terminal). Card payments mediated by a payment provider go through Whitelabel checkout instead. get_reservation_status Poll a reservation after confirmation. Confirmation is asynchronous; poll until the booking reaches a final state before telling the traveller it succeeded. cancel_reservation Release a hold. Use when the traveller aborts, or when payment fails before confirmation. Reservation tools are enabled per retailer. Once enabled, your account has its own limits — permitted carriers, maximum passengers per booking and maximum booking value. Until reservations are enabled, these tools still appear in the tool list and calls to them return an explicit “not allowed” response, so use get_checkout_link in the meantime. Talk to your Partnership Manager to have reservations enabled for your account. Carrier policies and terms Title Description Title Tool Description Key Features get_carrier_info Get carrier information: luggage policy, passenger types, general conditions. Look up luggage limits, passenger requirements and general terms for a specific carrier. get_fare_info Get information about a fare class for a carrier. Explains what a specific fare includes — refundability, ticket validity, post-booking conditions and fare features (e.g. “Economy vs. Flex”). query_terms_and_conditions Ask a natural-language question against the carrier Terms & Conditions knowledge base. Semantic search over the full T&C corpus, optionally scoped to one carrier. Lets the agent answer specific questions — “can I take a bike?”, “what happens if I miss my bus?” — with grounded, carrier-accurate text instead of guessing. Real-time trip data Title Description Title Tool Description Key Features get_realtime_for_connection Get live delay and GPS data for one specific connection. The tool to use for “where is my bus?” and “is my trip delayed?”. Matches the connection to the live feed and clearly distinguishes “running on time” from “no real-time data available for this carrier or trip”. get_realtime_trip_updates Get real-time trip updates for a carrier. Delay and schedule-change feed across a carrier's rides, for broader monitoring use cases. get_realtime_vehicle_positions Get real-time vehicle positions for a carrier. Live vehicle coordinates, suitable for driving a map view. Real-time data is only available for carriers that publish a live feed. For all other carriers these tools return an explicit “no data” result, which the agent should report as such rather than presenting it as an on-time confirmation. Notes Server-to-server only. Your MCP key authenticates your retailer account, not an end user. Keep it on your backend and never ship it to a browser, a mobile app or an end-user desktop MCP client. Tool availability varies by account. The tool list returned by tools/list reflects what your deployment exposes; reservation tools in particular are gated per retailer, as described above. Always drive your agent from the discovered tool list rather than a hard-coded one. Agents are not time-aware by default. Give your agent a current-date tool, or resolve relative dates before calling the search tools. Search results are capped. Large searches are truncated to a workable number of connections; narrow the time window, carrier list or vehicle types rather than expecting an exhaustive result set. Prices move. Always re-check with connections_vacancy immediately before checkout or reservation — the price returned there is the authoritative one. If a Retailer API capability you need is not yet exposed as a tool, raise it with your Partnership Manager. • [Retailer Agent](https://docs.distribusion.com/dt/api/enterprise-features/ai-tools/retailer-agent.md): The Retailer Agent is an AI agent that helps travellers find trips and explore alternatives through a natural-language interface — chat or voice. It guides the user through the whole journey: destination and station discovery, connection search, fare and offer comparison, vacancy and seat checks, cart and checkout-link generation, carrier terms and conditions, and post-sales support for existing bookings. The agent is exposed as a plain HTTP + WebSocket API, so it can be embedded in your own chat UI, voice channel, contact-centre tooling, or back-office application. Distribusion also ships a ready-made chat widget on top of it. Please note that this is an enterprise API feature. Reach out to your Partnership Manager for more information about unlocking this and other advanced features. We are actively developing the Retailer Agent, and we are aware that bugs may occur occasionally. If an error persists, please contact us. Base URL All endpoints are served under the /agent prefix: Title Description Host Use for https://api.distribusion.com/agent Standard requests. https://s.api.distribusion.com/agent Long-running requests — streaming chat and voice WebSockets. This host allows a 600 s request timeout; the standard host does not. Authentication The Retailer Agent endpoints expect an API key in the headers: HTTP POST https://api.distribusion.com/agent/chat api-key: <your-agent-api-key> Content-Type: application/json Accept: application/json This key is specific to the Retailer Agent and the MCP Server, and is not your regular Retailer API key — see API Authentication . Contact your Partnership Manager to get access to your Retailer Agent API key. The key identifies your retailer account, so no retailer code has to be passed in the request. The Retailer API key that the agent uses to reach Distribusion's booking services is resolved server-side and is never exposed to the client. Voice WebSockets cannot carry custom headers. There, the same key is sent as api_key inside the first JSON message on the socket (see Voice below). Conversation Model Every chat request carries two identifiers (user ID and conversation ID) that you choose and keep stable, as well as the user's message text: Title Description Field Meaning user_id Stable identifier for the end user. Conversations, history and personalisation are scoped to it. conversation_id Identifier for one conversation thread. Reuse it to continue a conversation; generate a new one to start fresh. text The user's message. Conversation state is stored server-side, so you do not have to replay the transcript on each turn. Use the /history and /conversations endpoints to re-populate a UI after a page refresh or a checkout round-trip. Endpoints Travel agent (main chat) Title Description Method & path Purpose POST /chat Run one turn and return the complete reply in a single JSON response. POST /chat/stream The primary conversational endpoint. Streams the run as newline-delimited JSON ( application/x-ndjson ). POST /chat/stop Cancel an in-flight stream for a conversation (stop-generation). GET /chat/conversations List a user's conversations, most recent first, each with a short preview. Query: user_id , optional limit . GET /chat/history Replayable transcript of one conversation. Query: user_id , conversation_id . WS /voice/stream Bidirectional voice session with the travel agent. Post-sales A dedicated agent for travellers who already hold a booking: booking lookup, ticket retrieval, change and cancellation guidance, and carrier T&C answers. It also works anonymously (FAQ and T&C only) when no booking credentials are supplied. Title Description Method & path Purpose POST /post-sales/chat Single-shot post-sales turn. POST /post-sales/chat/stream Streamed post-sales chat (NDJSON). GET /post-sales/conversations List post-sales conversations for a user. GET /post-sales/history Transcript of one post-sales conversation. WS /post-sales/voice/stream Bidirectional post-sales voice session. The post-sales request body accepts an optional bookings array. Each entry identifies a booking either by booking_id , or by booking_number + last_name + email . Omit it (or send [] ) for anonymous support. Supporting endpoints Title Description Method & path Purpose GET /settings/{rpn} Effective agent configuration and UI feature flags for a retailer. Always returns 200 — an unconfigured retailer resolves to defaults. GET /api/memories List the travel memories stored for the authenticated user. DELETE /api/memories Delete all memories for the user. DELETE /api/memories/{memory_id} Delete one memory. How to Use — Chat POST /chat Request Body JSON { "user_id": "<unique user id>", "conversation_id": "<unique conversation id>", "text": "<text input>" } Optional fields for personalisation: user_preferences , user_location ( {"latitude": …, "longitude": …} , enables "from my location" queries), context_mode ( memory | profile | none ), and bookings when the user has already verified booking credentials. Response JSON { "text": "<response from agent>", "response_event_id": "<id of the event that produced the text>" } response_event_id correlates the reply with the stored conversation — the history endpoints return the same value as event_id . It is null when the text is not agent output, for example a safety block or a fallback message. POST /chat/stream Same request body. The response is application/x-ndjson : one JSON object per line, emitted as the run progresses. Plain text { "event_type": "final_output | partial_output | function_call | function_response | unknown", "text_chunk": "<response chunk from agent>" | null, "function_calls": [{ "name": "…", "args": { … }, "thought": "…" }] | null, "function_responses": [{ "name": "…", "response": { … }, "thought": "…" }] | null, "response_event_id": "…" | null } { "event_type": "final_output | partial_output | function_call | function_response | unknown", "text_chunk": "<response chunk from agent>" | null, "function_calls": [{ "name": "…", "args": { … }, "thought": "…" }] | null, "function_responses": [{ "name": "…", "response": { … }, "thought": "…" }] | null, "response_event_id": "…" | null } Title Description event_type Meaning partial_output An incremental text chunk of the current message. Accumulate and render. function_call The agent is calling a tool. Carries name , args , and a user-facing thought such as "Finding trips to Vienna for tomorrow". function_response The tool result. The raw payload is available if you want to render it — a results list, a map, a seat plan — otherwise show the thought . final_output End of the response. unknown Anything not matching the schema above. Ignore safely Han dling the stream Open the stream Send the request and read the response line by line. Accumulate text On partial_output , append text_chunk to the message currently being rendered. Show tool activity On function_call / function_response , show the thought as a "thinking" indicator, and optionally use the raw response to render richer output. Finish the turn On final_output , the turn is over. A sequence of partial_output events followed by an event of a different type marks the end of a message , not of the turn. One turn can contain several messages, for example: "I'll search for your trip" → tool call → tool response → "I found these trips…". Example CURL curl --no-buffer -N -X POST "https://s.api.distribusion.com/agent/chat/stream" \ -H "Content-Type: application/json" \ -H "api-key: <your-agent-api-key>" \ -d '{ "user_id": "user-123", "conversation_id": "conv-456", "text": "from Mexico City to Monterrey today from 7pm" }' Plain text {"event_type":"function_call","function_calls":[{"args":{"query":"Mexico City","locale":"en"},"name":"search_cities","thought":"Searching for Mexico City"}]} {"event_type":"function_response","function_responses":[{"name":"search_cities","response":{"cities":[{"code":"MXMCI","name":"Mexico City","country_code":"MX"}]}}]} {"event_type":"function_call","function_calls":[{"args":{"departure_city_code":"MXMCI","arrival_city_code":"MXMTY","departure_date":"2026-03-20","departure_start_time":"19:00","locale":"en"},"name":"connections_find","thought":"Finding trips..."}]} {"event_type":"function_response","function_responses":[{"name":"connections_find","response":{"connections":[{"connection_id":"SDIA-MXMCICIU-MXMTYMBU-…","departure_time":"2026-03-20T19:00:00","arrival_time":"2026-03-21T08:40:00","price":61.68,"currency":"EUR","carrier":{"code":"SDIA","name":"Senda Diamante"}}]}}]} {"event_type":"partial_output","text_chunk":"Here are the connections I found from Mexico City to Monterrey"} {"event_type":"partial_output","text_chunk":" for today, departing from 7 PM: …"} {"event_type":"final_output","text_chunk":"","response_event_id":"…"} {"event_type":"function_call","function_calls":[{"args":{"query":"Mexico City","locale":"en"},"name":"search_cities","thought":"Searching for Mexico City"}]} {"event_type":"function_response","function_responses":[{"name":"search_cities","response":{"cities":[{"code":"MXMCI","name":"Mexico City","country_code":"MX"}]}}]} {"event_type":"function_call","function_calls":[{"args":{"departure_city_code":"MXMCI","arrival_city_code":"MXMTY","departure_date":"2026-03-20","departure_start_time":"19:00","locale":"en"},"name":"connections_find","thought":"Finding trips..."}]} {"event_type":"function_response","function_responses":[{"name":"connections_find","response":{"connections":[{"connection_id":"SDIA-MXMCICIU-MXMTYMBU-…","departure_time":"2026-03-20T19:00:00","arrival_time":"2026-03-21T08:40:00","price":61.68,"currency":"EUR","carrier":{"code":"SDIA","name":"Senda Diamante"}}]}}]} {"event_type":"partial_output","text_chunk":"Here are the connections I found from Mexico City to Monterrey"} {"event_type":"partial_output","text_chunk":" for today, departing from 7 PM: …"} {"event_type":"final_output","text_chunk":"","response_event_id":"…"} Voice Voice is a bidirectional WebSocket. Connect to wss://s.api.distribusion.com/agent/voice/stream (or the post-sales equivalent). Open the socket Send one JSON message first, containing user_id , conversation_id and api_key . Exchange audio Then exchange binary PCM audio frames, plus JSON control messages. The voice agent shares the travel agent's tools and conversation storage, so a voice session and a chat session on the same conversation_id continue the same thread. Suggested UI These endpoints are meant to be integrated in a chat-like UI, as showcased below (streaming response displaying function calls). Features Title Description Feature What it does Location discovery Resolves free-text place names to cities, stations and areas, including nearby-station and "from my location" queries. Connection search Finds connections for a route and date, including multi-leg itineraries, and can broaden or narrow the search conversationally. Offer and fare comparison Compares fare classes, prices and journey types, and explains the trade-offs in plain language. Vacancy and seats Confirms availability and seat/fare options before the traveller commits. Price calendar Surfaces cheaper nearby dates so the user can shift a flexible trip. Cart and checkout Builds a cart and produces a checkout link that hands the traveller to the booking flow. Carrier information and T&C Answers luggage, accessibility, pet, change and refund questions from carrier terms and conditions. Post-sales support Looks up an existing booking and helps with what comes after the sale, or answers anonymously when no booking is provided. Itinerary planning For open-ended requests, plans a more strategic itinerary before searching. Personalisation and memory Applies stated preferences and remembers useful facts across conversations. Fully controllable via context_mode and the memory endpoints. Voice Native low-latency speech-to-speech on the same agent and the same conversation. Multilingual Replies in the user's language; locale controls translatable response fields on the sub-agent surfaces. Map-ready output Station coordinates plus road-route polylines for bus and train segments. Conversation history Server-side storage with list and replay endpoints, so a UI can be rehydrated after a refresh. Safety guardrails Input and output filtering keeps the agent on-topic and prevents unsafe or off-brand replies. Per-retailer configuration Tone, enabled capabilities, carriers and booking limits are configured per retailer and readable via GET /settings/{rpn} . Notes Streaming and voice need a long-lived connection. Use s.api.distribusion.com for those; the standard host times out first. Do not buffer the NDJSON response. Disable client-side buffering (for example curl --no-buffer -N ) or the stream will only appear at the end. Errors are returned as {"error": "…", "detail": "…"} . 400 means the request or the API key is wrong, 401 / 403 an authentication or permission problem, 404 a missing conversation or resource, 422 a validation error, and 503 a temporary upstream problem worth retrying. Operational endpoints ( /health , /metrics , /docs , /openapi.json ) are not exposed publicly. • [Other Concepts](https://docs.distribusion.com/dt/api/other-concepts.md): Explore this section to learn more about how some of the data and other functionality in the Distribusion API works. • [Passenger Types](https://docs.distribusion.com/dt/api/other-concepts/passenger-types.md): Distribusion also makes it easier to integrate a large variety of carriers by harmonizing all available passenger types into standardized codes. Codes Carriers will support at least one of these 5 codes: PINT: Infant PCIL: Child PYPO: Youth PNOS: Adult PSOE: Senior Some carriers even support other passenger codes such as PSAD, PAOV, PCUU or PCUN, each with their own definition of age ranges. To start selling Distribusion inventory, at minimum the passenger type Adult (PNOS) must be integrated. We recommend integrating all passenger types in order to be able to provide full parity on discounts to your customers, where available. Age Range The availability and age range of each passenger type is dependent upon the respective marketing carrier’s policies. This information can be found in the /marketing_carriers/{marketing_carrier_id} endpoint. The response displays the available passenger types for the respective carrier and details the age brackets associated with each available passenger type. We recommend that you cache this information regularly (once a week for example) and use it for the ages of passengers to the passenger types supported by the carrier. JSON { "id": "PNOS", "type": "passenger_types", "attributes": { "code": "PNOS", "name": "Adult", "description": "", "min_age": 30, "max_age": 64 } }, { "id": "PCIL", "type": "passenger_types", "attributes": { "code": "PCIL", "name": "Child", "description": "", "min_age": 0, "max_age": 13 } }, { "id": "PYPO", "type": "passenger_types", "attributes": { "code": "PYPO", "name": "Youth", "description": "", "min_age": 14, "max_age": 29 } }, { "id": "PSOE", "type": "passenger_types", "attributes": { "code": "PSOE", "name": "Senior", "description": "", "min_age": 65, "max_age": 99 } } Infant Seats Carriers handles infant tickets in two forms. Free Infant Without Seat Some carriers don't require a ticket at all for infants as long as they don't need a seat. In this scenario there is no passenger type and there is a gap in ages you get from /marketing_carriers/{marketing_carrier_id} endpoint. For example PCIL (4-16) and PNOS (17-99). This indicates that infants (0-3) travel free and don't need to be booked, but also do not get a seat. In this case, if the pax wants a seat a ticket has to be booked as PCIL or PNOS. Free/Paid Infant With Seats Some carriers have the passenger type PINT (Infant) with 100% discount or some discount. In this case, the pax gets a seat. Passenger Restrictions Some passenger types, like children and infants, are not allowed to travel alone and must be accompanied by an adult. These requirements are defined by carriers using passenger_group_rule_parameters , which can be retrieved from the /marketing_carriers/{marketing_carrier_id} endpoint. In the example below, the carrier lists these requirements: Group Size Limit : You can book for up to 9 people at once. Adults Required : If your group includes children (PCIL) or infants (PINT), there must be at least one adult (PNOS) traveling with them. Kids and infants can’t travel alone. Infant Rule : For every infant (PINT) in the group, there must be at least one adult (PNOS). So, 2 infants need at least 2 adults, and so on. Plain text { "id": "IRYO-FARE-1-PASSENGER_GROUP_RULE-0", "type": "passenger_group_rules", "attributes": { "rule_type": "max_passengers", "description": "max passengers" }, "relationships": { "parameters": { "data": [ { "id": "IRYO-FARE-1-PASSENGER_GROUP_RULE-0-PARAMETER-0", "type": "passenger_group_rule_parameters" } ] } } }, { "id": "IRYO-FARE-1-PASSENGER_GROUP_RULE-1", "type": "passenger_group_rules", "attributes": { "rule_type": "passengers_type_requires_passengers_types", "description": "Adult required" }, "relationships": { "parameters": { "data": [ { "id": "IRYO-FARE-1-PASSENGER_GROUP_RULE-1-PARAMETER-0", "type": "passenger_group_rule_parameters" }, { "id": "IRYO-FARE-1-PASSENGER_GROUP_RULE-1-PARAMETER-1", "type": "passenger_group_rule_parameters" } ] } } }, { "id": "IRYO-FARE-1-PASSENGER_GROUP_RULE-2", "type": "passenger_group_rules", "attributes": { "rule_type": "passengers_type_ratio", "description": "1 infant per adult" }, "relationships": { "parameters": { "data": [ { "id": "IRYO-FARE-1-PASSENGER_GROUP_RULE-2-PARAMETER-0", "type": "passenger_group_rule_parameters" }, { "id": "IRYO-FARE-1-PASSENGER_GROUP_RULE-2-PARAMETER-1", "type": "passenger_group_rule_parameters" }, { "id": "IRYO-FARE-1-PASSENGER_GROUP_RULE-2-PARAMETER-2", "type": "passenger_group_rule_parameters" } ] } } }, { "id": "IRYO-FARE-1-PASSENGER_GROUP_RULE-0-PARAMETER-0", "type": "passenger_group_rule_parameters", "attributes": { "name": "passengers_limit", "value": 9 } }, { "id": "IRYO-FARE-1-PASSENGER_GROUP_RULE-1-PARAMETER-0", "type": "passenger_group_rule_parameters", "attributes": { "name": "dependent_passengers_types", "value": [ "PINT", "PCIL" ] } }, { "id": "IRYO-FARE-1-PASSENGER_GROUP_RULE-1-PARAMETER-1", "type": "passenger_group_rule_parameters", "attributes": { "name": "required_passengers_types", "value": [ "PNOS" ] } }, { "id": "IRYO-FARE-1-PASSENGER_GROUP_RULE-2-PARAMETER-0", "type": "passenger_group_rule_parameters", "attributes": { "name": "ratio_from_types", "value": [ "PINT" ] } }, { "id": "IRYO-FARE-1-PASSENGER_GROUP_RULE-2-PARAMETER-1", "type": "passenger_group_rule_parameters", "attributes": { "name": "ratio_to_types", "value": [ "PNOS" ] } }, { "id": "IRYO-FARE-1-PASSENGER_GROUP_RULE-2-PARAMETER-2", "type": "passenger_group_rule_parameters", "attributes": { "name": "ratio", "value": 1 } } { "id": "IRYO-FARE-1-PASSENGER_GROUP_RULE-0", "type": "passenger_group_rules", "attributes": { "rule_type": "max_passengers", "description": "max passengers" }, "relationships": { "parameters": { "data": [ { "id": "IRYO-FARE-1-PASSENGER_GROUP_RULE-0-PARAMETER-0", "type": "passenger_group_rule_parameters" } ] } } }, { "id": "IRYO-FARE-1-PASSENGER_GROUP_RULE-1", "type": "passenger_group_rules", "attributes": { "rule_type": "passengers_type_requires_passengers_types", "description": "Adult required" }, "relationships": { "parameters": { "data": [ { "id": "IRYO-FARE-1-PASSENGER_GROUP_RULE-1-PARAMETER-0", "type": "passenger_group_rule_parameters" }, { "id": "IRYO-FARE-1-PASSENGER_GROUP_RULE-1-PARAMETER-1", "type": "passenger_group_rule_parameters" } ] } } }, { "id": "IRYO-FARE-1-PASSENGER_GROUP_RULE-2", "type": "passenger_group_rules", "attributes": { "rule_type": "passengers_type_ratio", "description": "1 infant per adult" }, "relationships": { "parameters": { "data": [ { "id": "IRYO-FARE-1-PASSENGER_GROUP_RULE-2-PARAMETER-0", "type": "passenger_group_rule_parameters" }, { "id": "IRYO-FARE-1-PASSENGER_GROUP_RULE-2-PARAMETER-1", "type": "passenger_group_rule_parameters" }, { "id": "IRYO-FARE-1-PASSENGER_GROUP_RULE-2-PARAMETER-2", "type": "passenger_group_rule_parameters" } ] } } }, { "id": "IRYO-FARE-1-PASSENGER_GROUP_RULE-0-PARAMETER-0", "type": "passenger_group_rule_parameters", "attributes": { "name": "passengers_limit", "value": 9 } }, { "id": "IRYO-FARE-1-PASSENGER_GROUP_RULE-1-PARAMETER-0", "type": "passenger_group_rule_parameters", "attributes": { "name": "dependent_passengers_types", "value": [ "PINT", "PCIL" ] } }, { "id": "IRYO-FARE-1-PASSENGER_GROUP_RULE-1-PARAMETER-1", "type": "passenger_group_rule_parameters", "attributes": { "name": "required_passengers_types", "value": [ "PNOS" ] } }, { "id": "IRYO-FARE-1-PASSENGER_GROUP_RULE-2-PARAMETER-0", "type": "passenger_group_rule_parameters", "attributes": { "name": "ratio_from_types", "value": [ "PINT" ] } }, { "id": "IRYO-FARE-1-PASSENGER_GROUP_RULE-2-PARAMETER-1", "type": "passenger_group_rule_parameters", "attributes": { "name": "ratio_to_types", "value": [ "PNOS" ] } }, { "id": "IRYO-FARE-1-PASSENGER_GROUP_RULE-2-PARAMETER-2", "type": "passenger_group_rule_parameters", "attributes": { "name": "ratio", "value": 1 } } Passenger IDs Every passenger defined in your initial search request is assigned a unique, internal identifier by the API (e.g., pax-25-1 , representing the first passenger of age 25). This ID acts as the persistent link between your search criteria and the resulting commercial offers. Mapping Fares to Travelers In the API response, the passenger_ids array within an Offer object explicitly defines who that specific fare covers. Individual Coverage : If the array contains a single ID, that fare applies only to that specific passenger. Group Coverage : If the array lists multiple IDs (e.g., ["pax-25-1", "pax-11-2"] ), the price and conditions apply to those passengers collectively as a group. Requirement for Booking Flow These IDs are not merely for display; they are required functional parameters. When proceeding to validation with /reservations/create you must echo these exact IDs back to the API. For a few use cases this is also needed in /connections/vacancy. This ensures the system correctly maps the selected fare to the specific passenger profile (age, loyalty cards) used to generate the price. API Workflow 1. Let's assume the pax group consists of one person aged 40, two people aged 16, and one person aged 10. 2. Perform the /connections/find request specifying the exact (or max) age of each passenger. JSON "passengers": [ { "pax": 1, "max_age": 40 }, { "pax": 2, "max_age": 16 }, { "pax": 1, "max_age": 10 } ] 3. Map the ages of passengers to the passenger types supported by the carrier selected by the user. This can be done using the /marketing_carriers/{marketing_carrier_id} endpoint as explained in the ‘Age Range’ section above. 4. For Italo for example, passenger types are PCIL (0–13), PYPO (14–29), PNOS (30–64), and PSOE (65–99). Given 1 pax (40 y/o), 2 pax (16 y/o), and 1 pax (10 y/o), the breakdown is: 1 PCIL, 2 PYPO, 1 PNOS. 5. Perform the /connections/vacancy request using the passenger type codes and unique IDs retrieved from the find response: JSON "passengers": [ { "id": "pax-40-1", "type": "PNOS", "pax": 1 }, { "id": "pax-16-2", "type": "PYPO", "pax": 1 }, { "id": "pax-16-3", "type": "PYPO", "pax": 1 }, { "id": "pax-10-4", "type": "PCIL", "pax": 1 } ] (Note: Each passenger is now uniquely identified by an id generated in the search step to allow for individual fare and card assignments.) 6. In the /reservations/create request include the passenger details as in the example below. The /reservations/confirm request should be structured in a similar way. JSON { "offers": [ { "id": "6e79cca8-952c-4639-8a67-b8b68c534212|0" } ] "locale": "en", "passengers": [ { "type": "PNOS", "id": "pax-40-1" }, { "type": "PYPO", "id": "pax-16-2" }, { "type": "PYPO", "id": "pax-16-3" }, { "type": "PCIL", "id": "pax-10-4" } ] } • [Journey Types](https://docs.distribusion.com/dt/api/other-concepts/journey-types.md): Distribusion allows you to sell tickets for single and return journeys. Bounds A bound represents a single, directional leg of a journey. It defines the specific movement from an origin to a destination. In the API, bounds are submitted to the /connections/find request via the search_bounds array in the request. The composition of bounds determines the nature of the journey: Single Journey : Consists of exactly one bound (the outbound leg). Return Journey : Consists of two bounds (the outbound leg followed by the inbound leg). Multi Journey : Consists of more bounds to create a multi stop trip. This is not supported yet. Open-Jaw : Consists of multiple bounds that depart and/or arrive from different stations. This is not supported yet. Bound Ordering When requesting return trips with /connections/find, the order of bounds in the array is strict: search_bounds[0] : Represents the outbound leg (Departure → Destination). search_bounds[1] : Represents the inbound leg (Destination → Departure). Types There are three distinct journey types available. These types are displayed under the field journey_type in the response from the /connections/find endpoint. Journey Type Distribusion Journey Type Code Description Single single Trip can be booked only one-way. Open return open_return Trip can be booked for outbound & inbound legs; whereby the inbound leg is not bound to a specific date of travel but rather to a time interval (e.g. 3 months). Fixed return fixed_return Trip can be booked for outbound & inbound legs; whereby both legs are bound to specific travel dates. Journey types are defined per fare class. Please find additional details in our Fare Classes guide. Virtual Returns Even if a carrier does not support any explicit return journey types, Distribusion still allows return bookings to be placed within one user flow and request. Simply use a single journey fare class and specify a return date in the relevant API requests. Fare Classes for Return Trips When booking a return trip some carriers allow the fare class of the outbound to be different than the inbound trip. For more details check our Fares Per Segment guide. • [Fare Classes](https://docs.distribusion.com/dt/api/other-concepts/fare-classes.md): The Distribusion Retailer API also provides full parity on carrier fare class offerings. Types of Fares A fare class can describe both the class of travel such as the type of seat or compartment (e.g. standard or first class, seat or bed), as well as the journey type (single, fixed return, open return) that is on offer. Examples Carrier 1: A European Airport Transfer Carrier FARE-1 = Standard Class Single FARE-2 = Standard Class Open Return FARE-3 = First Class Single FARE-4 = First Class Open Return Carrier 2: A Brazilian Intercity Carrier FARE-1 = Convencional (standard) FARE-2 = Leito (bed) FARE-3 = Double Decker - Convencional FARE-4 = Double Decker - Leito Endpoints Fare classes are provided and detailed in two endpoints: /marketing_carriers/{marketing_carrier_id}: The response includes all fare classes that the requested marketing carrier supports. Not every fare class supported by a carrier is necessarily available for every trip served by that carrier. /connections/find: The response includes the available fare classes for the selected trip(s) and their respective prices. In case only one fare class is available for a specific trip, only one fare class will be provided. Fare Characteristics Each fare class has its own code (as shown in the examples above) and is defined by the following parameters in the API: name : As defined by the carrier and which can be displayed to the user journey_type : Single vs. return types ( more details ) fare_features : Amenities & cancellation policies ( more details ) passenger_group_rules : Limit to the number of passengers per type that can be booked ticket_validity_rules : When a ticket for this fare class is valid for one fixed trip or a longer period of time Fare Names It is important to display the official fare class names to users exactly as they are provided in the API response. The names are defined directly by the carriers and often contain specific details about the travel class (e.g., standard, first class), seat type (e.g., seat, bed), or journey type (e.g., open return), which helps users distinguish between different options. The API provides these names in the name attribute of the fare class object. We recommend using this field for display without altering or hiding the information. Carriers often require their official fare names to be shown, many of which are in the local language to ensure clarity for the end customer. • [Fares Per Segment](https://docs.distribusion.com/dt/api/other-concepts/fares-per-segment.md): This guide explains how to integrate and book journeys where different fare classes or products are selected for specific segments of a trip (e.g., traveling in First Class for one leg and Economy for another). This is a mandatory requirement when trading Trenitalia domestic. Contact your Partnership Manager for more details. In a standard booking flow for all our carriers, a single fare usually applies to the entire journey. With Fares per Segment, the API allows you to mix and match fares within a single connection. This is common for trips involving different vehicle types or when a traveler wants specific flexibility for only one portion of their journey. This functionality is only available for a few selected carriers. Contact your Partnership Manager for more details. How it Works The core of this feature is the partial_fares relationship found within the connection object. While standard fares cover all segments of a connection, each fare within partial_fares covers only a specific subset of segments and passengers. To successfully book a trip using this method, you must select a combination of partial fares that collectively cover all segments and all passengers of the connection exactly once. Step-by-Step Implementation 1. Find Connections Perform a standard search using the /connections/find endpoint. 2. Identify Partial Fares In the search response, look into the relationships of a connection. If the connection supports per-segment fares, you will see a list of offers under partial_fares . Each partial fare includes: segment_ids : The specific segments this fare covers. passenger_ids : The specific passengers this fare applies to. offer_id : The unique identifier used for booking. 3. Select a Valid Combination Choose a set of offer_id that cover every segment of the trip for every traveler. Example Selection Logic For a 2-segment outbound trip for 1 passenger: Select one offer_id from partial_fares for Segment A. Select a second offer_id from partial_fares for Segment B. 4. Validate with Vacancy Before creating a reservation, validate your selection using the /connections/vacancy endpoint. Pass the chosen offer_id in the offers array within the request body. JSON { "locale": "en", "currency": "EUR", "offers": [ { "id": "cfe63acc-07eb-4463-9a88-b035c935f032|0", "passenger_ids": [ "pax-40-1" ] }, { "id": "cee51003-5ee5-45bd-8adc-b46dd1c04b88|8", "passenger_ids": [ "pax-40-1" ] } ], "passengers": [ { "id": "pax-40-1", "type": "PNOS", "pax": 1 } ] } 5. Create and Confirm Reservation Once vacancy is confirmed, use the same array of offers in your /reservations/create request. Proceed to /reservations/confirm as usual to finalize the booking. Data Aggregation Rules When booking mixed fares, the system applies specific rules to determine the final booking attributes: Price The total price of the booking is the sum of the prices of all selected partial fares. Cancellation & Refund Conditions When segments have different policies, the conditions are concatenated. Proportional Refunds: If one segment is refundable and another is not, only the portion of the price paid for the refundable segment can be recovered (minus fees). Deadlines: The most restrictive cancellation deadline across all segments applies to the entire booking. Amendments The ability to amend a booking is governed by the most restrictive condition across the journey. Restrictive Rule: If any one segment is non-amendable, the entire booking is non-amendable. Concatenation: Unlike refunds, the binary nature of amendments means one restrictive segment blocks the action for the entire connection. Tickets The final ticketing output depends on carrier capabilities and the fare combination. Consolidation: You may receive a single consolidated ticket or individual tickets for each segment. Compatibility: Single calls to the /bookings/{id}/tickets endpoint will return all necessary documents for the journey regardless of the number of partial fares used. Fare Features (Amenities) Amenities are applied per segment based on the specific fare selected for that leg. Travelers only receive benefits (e.g., Wi-Fi, lounge access) associated with the fare class chosen for that specific segment. Important Considerations Mandatory Full Coverage Your selection must cover all segments and all passengers within the connection exactly once. Gaps : If any segment is left without an associated offer_id , the request will fail. Overlaps : You cannot provide two different offers for the same segment or passenger. Booking Response Fare Class When a booking is completed, the final booking response will only display one of the fare classes (usually the most restrictive or primary one). While your individual segment selections are recorded in the background for pricing and amenities, the high-level booking object follows a single-fare class display for compatibility. No Mixing of Fares and and Partial Fares You must choose between booking a standard connection-level fare or a per-segment combination. If you provide an offer_id from the global fares array, you cannot include any IDs from the partial_fares relationship. Our recommodation is to apply these rules: For connections with content under fares only = use fares content For connections with content under partial_fares only = use partial_fares content For connections with content under fares and partial_fares = use partial_fares content Expiration Synchronization When selecting multiple partial fares, the earliest expiration time among all selected offers becomes the effective deadline for the entire booking. Carrier-Specific Combinability Transport providers determine which fare classes are "combinable." A carrier may reject specific mixed-class pairings during the /vacancy step even if the segments do not overlap. Always rely on the /vacancy endpoint to confirm your specific combination is valid. • [Geo Coordinate Search](https://docs.distribusion.com/dt/api/other-concepts/geo-coordinate-search.md): The Geo Coordinate Search functionality is not supported by all carriers. To check if your preferred carriers are on the list, please reach out to your Partnership Manager. The /connections/find endpoint allows users to search for available connections based on departure and arrival locations. The search can be performed also using geo coordinates which enables searching based on latitude and longitude with a defined radius. The geo coordinate search can be useful in 2 cases: Your users have their exact location defined as part of the search flow e.g. they search using a hotel or an exact address as reference. You don't want to map stations between Distribusion and your database, and instead want to use the stored latitude and longitude of your list of stations in each search request. We do not recommend the use geo coordinate search when searching by city, as the radius supported by this functionality is limited to 2000 meters (2km) and cities can cover a much larger area. For example, if a user selects Paris as a departure city and you use the central point of Paris to initiate the geo coordinate search, most of the stations in Paris will not appear in the search results. Examples The search workflow allows you to search from geo coordinate point to geo coordinate point, but also to combine a geo coordinate for departure with an arrival station, for example in case a user is searching how to go from their hotel to an airport. Coordinate to Coordinate JSON { "locale": "en", "currency": "EUR", "search_bounds": [ { "is_requested": true, "departure_date": "2026-05-30", "departure_start_time": "10:00", "departure_location": { "type": "geo", "value": "51.471502,-0.488006", "radius": 2000 }, "arrival_location": { "type": "geo", "value": "51.516653,-0.176815", "radius": 1000 } } ], "passengers": [ { "pax": 1, "max_age": 33 } ] } Coordinate to Station JSON { "locale": "en", "currency": "EUR", "search_bounds": [ { "is_requested": true, "departure_date": "2026-03-19", "departure_start_time": "07:00", "departure_end_time": "16:00", "departure_location": { "type": "geo", "value": "51.471502,-0.488006", "radius": 2000 }, "arrival_location": { "type": "stations", "value": [ "GBLONLPB" ] } } ], "passengers": [ { "pax": 1, "max_age": 40 } ], "carrier_codes": [ "HEXR" ] } Parameters Parameter Required for Geo Coordinate Search Description departure[type] arrival[type] Yes Value should be set to geo . departure[value] arrival[value] Yes Latitude and longitude coordinates (decimal degrees) representing the departure/arrival point. Format: {latitude},{longitude} with exactly 6 decimal places. departure[radius] arrival[radius] Yes Radius (in meters) around the departure/arrival location to search for stations. Max 2000 meters (2 km) and min 10 meters. Walking Steps To get information about the walking distance and time from the specified geo coordinate to the station in the response add the parameter include=connections.steps.walking to the request. In this case the API response will return a segments array and a new steps array. The segments array will continue to represent traditional segments, such as bus or train rides. The steps array, however, will include additional segments that represent intermediate walking distances, such as walking from the departure coordinate to the departure station or from the arrival station to the final destination. Let's look at this sample request: JSON { "locale": "en", "currency": "EUR", "search_bounds": [ { "is_requested": true, "departure_date": "2025-07-31", "departure_start_time": "09:00", "departure_location": { "type": "geo", "value": "51.516783,-0.176895", "radius": 2000 }, "arrival_location": { "type": "geo", "value": "51.472902,-0.488006", "radius": 2000 } } ], "passengers": [ { "pax": 1, "max_age": 25 } ], "carrier_codes": [ "HEXR" ], "include": [ "connections.steps.walking" ] } Steps of a Connection In the response, below the standard segments of a connection, you will find the walking segments represented as steps . The first step STEP-DEPARTURE-GBLONLHB corresponds to the walking distance from the arrival station to the final coordinate, while the second step STEP-ARRIVAL-GBLONLPB represents the walking distance from the initial coordinate to the departure station. JSON { "attributes": { "arrival_time": "2025-07-31T09:31", "booked_out": false, "cheapest_fare_class_code": "FARE-5", "cheapest_total_adult_price": 2562, "co2_kg": 2.1942505836486816, "co2e_kg": 2.510593891143799, "co2e_savings": 0.7929726243019104, "departure_time": "2025-07-31T09:10", "duration": 1272, "electronic_ticket_available": false, "leg_type": "outbound", "offer_bundle": null, "offer_id": null, "total_seats_left": null }, ... "steps": { "data": [ { "id": "STEP-DEPARTURE-GBLONLHB", "type": "steps" }, { "id": "STEP-ARRIVAL-GBLONLPB", "type": "steps" } ] } }, "type": "connections" } }, Step Details Each step is assigned a unique ID. Below are the basic attributes of a step: travel_mode : Currently, only "WALKING" is supported distance : The total distance of the step in meters duration : The estimated walking time in seconds departure_location : Contains the location ID, which refers to latitude, longitude, and station ID for the starting point arrival_location : Contains the location ID, which refers to latitude, longitude, and station ID for the ending point Here is how the details of a step will be represented in the response related to the experience of the passenger from their starting point to the departure station GBLONLPB: Plain text ... { "attributes": { "distance": 156, "duration": 120, "travel_mode": "WALKING" }, "id": "STEP-DEPARTURE-GBLONLHB", "relationships": { "arrival_location": { "data": { "id": "LOCATION-31bfd625769244", "type": "locations" } }, "departure_location": { "data": { "id": "LOCATION-a8be18ad1236c6", "type": "locations" } } }, "type": "steps" }, { "attributes": { "latitude": "51.516783", "longitude": "-0.176895" }, "id": "LOCATION-03e5ab6a38a641", "relationships": { "station": { "data": null } }, "type": "locations" }, { "attributes": { "latitude": "51.472902", "longitude": "-0.488006" }, "id": "LOCATION-31bfd625769244", "relationships": { "station": { "data": null } }, "type": "locations" }, { "attributes": { "latitude": "51.516653", "longitude": "-0.176815" }, "id": "LOCATION-496cdb5ce61776", "relationships": { "station": { "data": { "id": "GBLONLPB", "type": "stations" } } }, "type": "locations" }, { "attributes": { "latitude": "51.47150211170094", "longitude": "-0.48800687700041" }, "id": "LOCATION-a8be18ad1236c6", "relationships": { "station": { "data": { "id": "GBLONLHB", "type": "stations" } } }, "type": "locations" } ... ], ... { "attributes": { "distance": 156, "duration": 120, "travel_mode": "WALKING" }, "id": "STEP-DEPARTURE-GBLONLHB", "relationships": { "arrival_location": { "data": { "id": "LOCATION-31bfd625769244", "type": "locations" } }, "departure_location": { "data": { "id": "LOCATION-a8be18ad1236c6", "type": "locations" } } }, "type": "steps" }, { "attributes": { "latitude": "51.516783", "longitude": "-0.176895" }, "id": "LOCATION-03e5ab6a38a641", "relationships": { "station": { "data": null } }, "type": "locations" }, { "attributes": { "latitude": "51.472902", "longitude": "-0.488006" }, "id": "LOCATION-31bfd625769244", "relationships": { "station": { "data": null } }, "type": "locations" }, { "attributes": { "latitude": "51.516653", "longitude": "-0.176815" }, "id": "LOCATION-496cdb5ce61776", "relationships": { "station": { "data": { "id": "GBLONLPB", "type": "stations" } } }, "type": "locations" }, { "attributes": { "latitude": "51.47150211170094", "longitude": "-0.48800687700041" }, "id": "LOCATION-a8be18ad1236c6", "relationships": { "station": { "data": { "id": "GBLONLHB", "type": "stations" } } }, "type": "locations" } ... ], • [IATA and UIC Codes Search](https://docs.distribusion.com/dt/api/other-concepts/iata-and-uic-codes-search.md): The IATA and UIC Codes Search functionality is not supported by all carriers. To check if your preferred carriers are on the list, please reach out to your Partnership Manager. The /connections/find endpoint allows users to search for available connections based on departure and arrival locations. The search can also be performed using industry-standard identifiers, enabling searches based on IATA airport codes and UIC train station codes. IATA Codes These are 3-letter IATA airport code. Learn more about IATA codes and search for list of codes in the IATA website . Distribusion maps airports as IATA areas. When a search is performed using an IATA code, the results may include all stations located within that airport area. UIC Codes These are 7-digit codes typically used for train stations. Distribusion establishes the concept of UIC areas, retrieving connections not only from the station identified by the provided code but also from other stations nearby. For example, if you search for Berlin Central Train Station (UIC code 8065969), you might also find results that include a nearby bus or train station with a different UIC code, such as Invalidenstraße (UIC code 8031922). Examples The search workflow allows you to search from IATA code to IATA code, UIC code to UIC code, but also to combine a IATA code for departure with a UIC code for arrival, or even with a location code or geo coordinate. IATA Code to UIC Code JSON { "locale": "en", "currency": "EUR", "search_bounds": [ { "is_requested": true, "departure_date": "2025-07-31", "departure_start_time": "09:00", "departure_location": { "type": "iata", "value": "BER" }, "arrival_location": { "type": "uic", "value": "8001071" } } ], "passengers": [ { "pax": 1, "max_age": 25 } ] } City to IATA Code JSON { "locale": "en", "currency": "EUR", "search_bounds": [ { "is_requested": true, "departure_date": "2025-07-31", "departure_start_time": "09:00", "departure_location": { "type": "city", "value": "ITROM" }, "arrival_location": { "type": "iata", "value": "MXP" } } ], "passengers": [ { "pax": 1, "max_age": 25 } ] } Parameters Parameter Required for UIC/IATA Search Description departure[type] arrival[type] Yes Value should be set to iata or uic . departure[value] arrival[value] Yes IATA value must be exactly 3 uppercase letters e.g. BER . • [Alternative Location Identifiers](https://docs.distribusion.com/dt/api/other-concepts/alternative-station-identifiers.md): This feature enhances our location data endpoints to help you map our stations and areas to your own system. By including a specific query parameter in your requests, you can receive a list of alternative identifiers (common aliases and external codes) for each location. For example, Guarulhos Airport is the name set by Distribusion for the main station in the international airport of São Paulo in Brazil, but is also known as ‘São Paulo Airport’ or ‘Cumbica’. These other names of the station can be set as alternative identifiers and would appear in our endpoint responses to assist you with building a more robust mapping layer. This could allow your users to search with familiar terms, which your system can then translate into our specific codes for making API requests. Alternative identifiers are not set by default for all stations, but can be configured for specific stations, areas or cities per request. Contact your Partnership Manager for more details. Requesting Alternative Identifiers Alternative identifiers are not included in location responses by default. You must explicitly request them by adding the include[]=alternative_identifiers query parameter to your API call. This feature is supported on the following endpoints: /stations , /stations/{station_code} , /areas and /cities . When requesting alternative identifiers from /stations , /areas and /cities endpoints, you must also include pagination parameters: page[size] : The number of items to return per page. page[after] : The cursor for pagination e.g. station code to paginate after such as DEBERBB. Sample Request for /stations HTTP https://api.demo.distribusion.com/retailers/v4/stations/ATAADANG?locale=en&include[]=alternative_identifiers Response Structure Including this parameter will add two new arrays to the attributes object of each location in the response: alternative_identifiers : Contains general, globally-recognized identifiers. carrier_alternative_identifiers : Contains identifiers specific to a particular carrier. Sample Response from /stations/{station_code} JSON { "data": { "id": "ATAADANG", "type": "stations", "attributes": { "alternative_identifiers": [ { "value": "Angern an der March Train Station" } ], "code": "ATAADANG", "name": "Angern/March Train Station", "description": "", "station_type": "train_station", "street_and_number": "Bahnstraße 28", "zip_code": "2261", "time_zone": "Europe/Vienna", "uic_station_code": "8102819", "iata_airport_code": null, "longitude": 16.82591, "latitude": 48.38438 }, "relationships": { "city": { "data": { "id": "ATAAD", "type": "cities" } }, "area": { "data": null } } }, "jsonapi": { "version": "1.0" }, "meta": { "locale": "en" }, "included": [ { "id": "ATAAD", "type": "cities", "attributes": { "code": "ATAAD", "name": "Angern an der March", "subdivision_code": null } } ] } • [Fare Features & Amenities](https://docs.distribusion.com/dt/api/other-concepts/features-and-amenities.md): Carriers differentiate themselves by providing varying fare features and amenities, which are strongly recommended to be displayed in the search results for example as icons with descriptions. Distribusion can present this data in 2 different fields in our API responses depending on the carrier, so it is important to read the information from both fields to present the full list of features and amenities possible. Fare Features Fare features are supported by the vast majority of carriers. The list of fare features available for each fare class can be found in the /marketing_carriers/{marketing_carrier_id} and in the /connections/find response when searching for a specific trip. They appear under fare_features section for each specific fare class. JSON { "id": "ITAL-FARE-1", "type": "fare_classes", "attributes": { "code": "FARE-1", "name": "Low Cost - Smart", "iata_category": "Economy Class", "journey_type": "single", "default": true }, "relationships": { "post_booking_condition": { "data": null }, "fare_features": { "data": [ { "id": "ITAL-WIFI", "type": "fare_features" }, { "id": "ITAL-UCHA", "type": "fare_features" }, { "id": "ITAL-MSYS", "type": "fare_features" }, { "id": "ITAL-NREF", "type": "fare_features" } ] }, "ticket_validity_rules": { "data": [ { "id": "ITAL-FARE-1-TICKET_VALIDITY_RULE-0", "type": "ticket_validity_rules" } ] }, "passenger_group_rules": { "data": [] } } } The name and description of each fare feature are available within the response too. Icons are not provided by Distribusion via API and can be created by your team. You can also use our set of icons used in our whitelabel solution . JSON { "id": "ITAL-WIFI", "type": "fare_features", "attributes": { "code": "WIFI", "name": "Wifi", "description": "Free wifi is available on board." } }, { "id": "ITAL-UCHA", "type": "fare_features", "attributes": { "code": "UCHA", "name": "USB charger", "description": "USB plug is available at each seat." } }, { "id": "ITAL-MSYS", "type": "fare_features", "attributes": { "code": "MSYS", "name": "Media System", "description": "A media system is available on board." } }, { "id": "ITAL-NREF", "type": "fare_features", "attributes": { "code": "NREF", "name": "Non-refundable", "description": "The ticket cannot be refunded." } }, { "id": "ITAL-SNAC", "type": "fare_features", "attributes": { "code": "SNAC", "name": "Snacks", "description": "Snacks are available on board." } }, { "id": "ITAL-DRIN", "type": "fare_features", "attributes": { "code": "DRIN", "name": "Drinks", "description": "Drinks are available on board." } }, { "id": "ITAL-ALRO", "type": "fare_features", "attributes": { "code": "ALRO", "name": "Additional Leg Room", "description": "The seat has additional leg space." } }, { "id": "ITAL-LACC", "type": "fare_features", "attributes": { "code": "LACC", "name": "Lounge Access", "description": "Lounge access" } }, { "id": "ITAL-PREF", "type": "fare_features", "attributes": { "code": "PREF", "name": "Partially refundable", "description": "The ticket can be cancelled and partially refunded." } } Fare Amenities Fare amenities are supported by just a few carriers, such as Amtrak and SNCF. The list of fare amenities available for each fare class can only be found in the /connections/find response when searching for a specific trip. They appear under amenities section for each specific trip. JSON "included": [ { "attributes": { "arrival_time": "2024-09-11T23:54", "departure_time": "2024-09-11T21:52", "index": 0, "line": "8827", "line_prefix": "TGV INOUI" }, "id": "SNCF-FRPARPRB-FRNTENAN-2024-09-11T21:52-2024-09-11T23:54", "relationships": { "amenities": { "data": [ { "id": "STIO-DRFF", "type": "amenities" }, { "id": "STIO-AAFR", "type": "amenities" }, { "id": "STIO-BABF", "type": "amenities" }, { "id": "STIO-PSOC", "type": "amenities" }, { "id": "STIO-FBIF", "type": "amenities" }, { "id": "STIO-WIFI", "type": "amenities" } ] } The name and description of each fare amenity are available within the response too. Icons are not provided by Distribusion and should be created by the retailer team. JSON { "attributes": { "code": "DRFF", "description": "Drinks for fee", "name": "Drinks for fee" }, "id": "STIO-DRFF", "type": "amenities" }, { "attributes": { "code": "AAFR", "description": "The bus is easily accessible for people on wheelchairs.", "name": "Accessible area for wheelchairs" }, "id": "STIO-AAFR", "type": "amenities" }, { "attributes": { "code": "BABF", "description": "Baby changing facilities", "name": "Baby changing facilities" }, "id": "STIO-BABF", "type": "amenities" }, { "attributes": { "code": "PSOC", "description": "Power supply is available at every seat.", "name": "Power Socket" }, "id": "STIO-PSOC", "type": "amenities" }, { "attributes": { "code": "FBIF", "description": "Bike for fee", "name": "Bike for fee" }, "id": "STIO-FBIF", "type": "amenities" }, { "attributes": { "code": "WIFI", "description": "Wifi is available on board.", "name": "Wifi" }, "id": "STIO-WIFI", "type": "amenities" }, List of Fare Features & Amenities Available You will notice that some features/amenities, such as Seat Selection, are listed as either Available, Allowed or Included. Available and Allowed simply means these items are available on board, but it doesn’t specify if they are free or must be paid for. Included means that this item is baked into the ticket price. The list of features is available in 16 languages . Code Name Description Type* CCTV 24/7 monitoring room/ CCTV 24/7 monitoring room/ CCTV Global fare feature AAFO Accessible area for bicycles Bike is allowed on board. Global fare feature AAFR Accessible area for wheelchairs The vehicle is easily accessible for people who use wheelchairs. Global fare feature ALRO Additional Leg Room The seat has additional leg space. Global fare feature APLI Adjustable personal lighting Adjustable personal lighting Global fare feature ASEA Adjustable seats Seats can be easily adjustable. Global fare feature ACON Air Conditioning The vehicle has a cooling ventilation system. Global fare feature AMEN Amendable The ticket is amendable. Global fare feature BABF Baby changing facilities Baby changing facilities Global fare feature BEDF Bed Sleeping compartment or area with bed arrangements Global fare feature FBIF Bike for fee Bike for fee Global fare feature FBIN Bike included Bike included Global fare feature BFRN Booking fee included Booking fee included Global fare feature BLUG Bulky luggage Bulky luggage is allowed on board. Global fare feature BLUF Bulky luggage for fee Bulky luggage for fee Global fare feature BLUN Bulky luggage included Bulky luggage included Global fare feature CSEA Child seat It's a seat for children under 12 years, having a special shape and equipped with safety belts and cushions. Global fare feature CSEF Child seat for fee Child seat for fee Global fare feature CSEN Child seat included Child seat included Global fare feature CTEF Children 10 and under travel for free Children 10 and under travel for free Global fare feature DCLE Deep cleaning Vehicle has daily deep cleaning and sanitization. Global fare feature DCLN Deep cleaning Deep cleaning Global fare feature DTDT Door to door transfer Door to door transfer Global fare feature DRIN Drinks Drinks are available on board. Global fare feature DRFF Drinks for fee Drinks for fee Global fare feature DRNN Drinks included Drinks included Global fare feature ELUA Extra luggage allowance Extra luggage allowance Global fare feature ELUF Extra luggage for fee Extra luggage for fee Global fare feature ELUN Extra luggage included Extra luggage included Global fare feature FVAL Flexible validity ticket Flexible validity ticket Global fare feature FBIC Folded Bicycle Only foldable bicycles are accepted on board. Global fare feature FDEP Frequent departures Frequent departures Global fare feature FRIG Fridge on board Fridge on board Global fare feature FRSE Front row seat available Front row seat available Global fare feature FRSF Front row seat for fee Front row seat for fee Global fare feature FRSN Front row seat included Front row seat included Global fare feature REFU Fully refundable The ticket can be cancelled and refunded. Global fare feature GSET Guaranteed seat Guaranteed seat Global fare feature GDOG Guide dog permitted Guide dog permitted Global fare feature HSAN Hand sanitizer Hand sanitizer available for all passengers. Global fare feature INFA Infant stroller allowance Infant stroller allowance Global fare feature INFF Infant stroller for fee Infant stroller for fee Global fare feature INFN Infant stroller included Infant stroller included Global fare feature ITWF Infants 2 and under travel for free Infants 2 and under travel for free Global fare feature LOUG Lounge access available Lounge access available Global fare feature LOUF Lounge access for fee Lounge access for fee Global fare feature LOUN Lounge access included Lounge access included Global fare feature MAGA Magazines Magazines are available on board. Global fare feature MREQ Mask required All passengers required to wear face masks while on board. Global fare feature MSYS Media System A media system is available on board. Global fare feature MDEF Missed departure flexibility Missed departure flexibility Global fare feature NOSA No offline sales The operator will not be accepting in person sales. Global fare feature NAME Non-amendable The ticket is not amendable. Global fare feature NREF Non-refundable The ticket cannot be refunded. Global fare feature ONDI Online discount Online discount Global fare feature PREF Partially refundable The ticket can be cancelled and partially refunded. Global fare feature PALL Pet allowance Pets are allowed to be on board. Global fare feature PALF Pet for fee Pet for fee Global fare feature PALN Pet included Pet included Global fare feature PSOC Power Socket Power supply is available at every seat. Global fare feature PRIV Private Private compartment or area Global fare feature QCOM Quiet compartment More privacy in a separate section. Global fare feature RTSI Real-time service information Real-time service information Global fare feature RARM Reclining armchairs Comfortable armchairs are available on board. Global fare feature REST Restaurant available on board Restaurant available on board Global fare feature SBEL Safety belts Passenger seats are equipped with safety belts to ensure a safe trip. Global fare feature SEAT Seat selection Seat selection Global fare feature SEAF Seat selection for fee Seat selection for fee Global fare feature SEAN Seat selection included Seat selection included Global fare feature SKIA Ski/snowboard bag allowance Ski/snowboard bag allowance Global fare feature SKIF Ski/snowboard bag for fee Ski/snowboard bag for fee Global fare feature SKIN Ski/snowboard bag included Ski/snowboard bag included Global fare feature SKIT Sleeping kit available Sleeping kit available Global fare feature SNAC Snacks Snacks are available on board. Global fare feature SNAF Snacks for fee Snacks for fee Global fare feature SNAN Snacks included Snacks included Global fare feature SDIS Seat display A display is available at each seat. Global fare feature TABS Table seat available Table seat available Global fare feature TABF Table seat available for fee Table seat available for fee Global fare feature TABN Table seat included Table seat included Global fare feature TOIL Toilet A toilet is available on board. Global fare feature UCHA USB charger USB plug is available at each seat. Global fare feature VMOB Vending machine on board Vending machine on board Global fare feature WSEA Wider seats Wider seats on the board. Global fare feature WIFI Wifi Free wifi is available on board. Global fare feature WIFF Wifi for fee Wifi for fee Global fare feature WIFN Wifi included Wifi included Global fare feature WOMO Women-only Compartment or area exclusively for women Global fare feature ISET 19-inch seats Hand-stitched leather 19-inch seats Carrier specific fare feature ISEA 21-inch seats Hand-stitched leather 21-inch seats Carrier specific fare feature HVAL 24hr validity The tickets for these lines are valid for the entire day. You can use them for any of the following departures till 4AM of the next day Carrier specific fare feature ATDB Access to DB Lougne Your ticket entitles you to use the DB Lounge. Carrier specific fare feature AAFP Accessible area for prams (foldable). Accessible area for prams (foldable). Carrier specific fare feature AAFW Accessible area for wheelchairs (foldable) The bus is easily accessible for people on wheelchairs (foldable). Carrier specific fare feature ACUP Adapters & charges upon request Adapters & charges upon request Carrier specific fare feature ALSE Adjustable leather seats Adjustable leather seats are suitable even for sleeping. Carrier specific fare feature BCTA Baby-changing table A special table for the needs of mothers with babies. Carrier specific fare feature BRAC Baggage racks Baggage racks Carrier specific fare feature BIKE Bike Bike Carrier specific fare feature BLAN Blanket Blanket is provided on board Carrier specific fare feature BSEA Booster seat Booster seat is provided free of charge on board, please notify carrier before travelling. Carrier specific fare feature BOWA Bottle of Water Complimentary bottle of water Carrier specific fare feature BBLA Buffer between landing and shuttle The passengers should book the shuttle for at least 1 hour later than the landing of their flight. Carrier specific fare feature BATT Bus attendant Bus attendant for assisting passangers with their luggage. Carrier specific fare feature CSER Café service Café service with a variety of meals, snacks, and beverages for sale. The Café features roomy tables and comfortable seating. Carrier specific fare feature CODE Change of departure. Change of departure date can be done at least 48 hours prior scheduled departure. Carrier specific fare feature CBAG Checked baggage Checked baggage is available for this segment of your trip. 2 bags free Up to 50 lbs. and 75 linear inches* Carrier specific fare feature CBYE Child below 15 years travel for free Child below 15 years travel for free Carrier specific fare feature CAUN Children 4 and under travel for free Children 4 and under travel for free Carrier specific fare feature IAUN Children age 15 and under travel for free (max 2 children per adult) Children age 15 and under travel for free (max 2 children per adult) Carrier specific fare feature CACA Children aged 0-4 can travel for free. Children aged 0-4 can travel for free. Carrier specific fare feature CUCA Children under 4 can travel for free Children under 4 can travel for free. Carrier specific fare feature CUAR Children under 6 are transported free of charge. Children under 6 are transported free of charge. Carrier specific fare feature CURI Children under 6 ride for free Children under 6 ride for free Carrier specific fare feature CTIN City ticket included In many cities, City ticket is automatically included in your ticket (saver and flexible fares) for journeys of over 100 km. You can find the area of validity under the keyword "City-Ticket" on https://www.bahn.com/en Carrier specific fare feature CWDE Comfortable writing desks Comfortable writing desks are available on board. Carrier specific fare feature DESM Delay SMS Passengers get an SMS if the transfer is delayed. Carrier specific fare feature DPER dog permitted Dogs and support dogs are welcome on board all Bright Bus Tours. Carrier specific fare feature DTDO Door to Door The bus provider will drop passengers off in desired location. Carrier specific fare feature DGAT Door2Gate Door2Gate Carrier specific fare feature DCAB Double Cabin Extra spacious seats available. Carrier specific fare feature DWAT Drinks (water) Drinks are available on board. Carrier specific fare feature DIWA Drinks included (water) Drinks included (water) Carrier specific fare feature EATO Easy access to floor The seat is on the ground floor and is easily accessible. Carrier specific fare feature EPOR Entertainment portal During your trip watch movies and the news, listen to music, read books or play games. We update our programme regularly. All you need is a laptop, tablet, cell phone, or you can buy a seat in the ASTRA coach with built-in LCD multimedia screens. You can borrow a headset free of charge from the on-board staff, so passengers do not disturb each other. Carrier specific fare feature ELUG Extra Luggage 2nd additional luggage (80x50x30 cm), weigh 15kg Carrier specific fare feature FTSE Fast Track Security Heathrow Airport’s Fast Track Security service included Carrier specific fare feature FDIN Flexible dining Flexible dining service as an exclusive and complimentary offering for private room customers: Carrier specific fare feature FTAB Folding Table Folding table is available on board. Carrier specific fare feature FDRI Free Drinks Free drinks are available on board and at the waiting room. Carrier specific fare feature FITR Free Infant Transport Children from 0 to 2 years have free access on the bus. Carrier specific fare feature FSNA Free snacks Free snacks are available at the waiting room. Carrier specific fare feature FTFO Free travels for infants Infants aged 0-4 can travel for free. Please bring valid ID document which mentions the infant's age. Carrier specific fare feature FVIE Front view This seat has front view of the bus Carrier specific fare feature IREQ Identification requirement You must present valid identification (national ID card, passport or BahnCard) during the ticket inspection. Carrier specific fare feature ILIG Individual Lighting Individual Lighting is available on board. Carrier specific fare feature IBAB Infinita Bistró Abierta Partially Refundable Refund 100% if canceled more than 7 days in advance, 95% if less Carrier specific fare feature IBPA Infinita Bistró Partially Refundable Refund 95% if canceled more than 7 days in advance, 90% if less Carrier specific fare feature IFPA Inicial Flexible Partially Refundable Refund 80% if canceled more than 7 days in advance, 70% if less Carrier specific fare feature INSU Insurance Insurance for passenger up to 150,000,000 VND Carrier specific fare feature LTAB Large table Large table for work and entertainment. Carrier specific fare feature LAFL Late arrival flexibility If passenger misses their transfer, they can get in next available ride. Carrier specific fare feature RFIN Late arrival flexibility If passenger misses their transfer, they can get in next available free of charge. Carrier specific fare feature LRES Leg rest Seats are equipped with leg rests. Carrier specific fare feature LACC Lounge Access Lounge access Carrier specific fare feature LINC Luggage included One checked luggage and one hand luggage are included in the ticket. Carrier specific fare feature LSTO Luggage storage Luggage storage is accessible. Carrier specific fare feature MFAN Mobile food and beverage cart Mobile food and beverage cart Carrier specific fare feature NCTI No city ticket The ticket does not contain a city ticket. Carrier specific fare feature NSRE No Seat Reservation Seat reservation is not available. Carrier specific fare feature NTBI No Train Binding With an ICE ticket you can use all trains on the day of travel, with an IC / EC ticket you can use any Intercity or Eurocity as well as local trains. Carrier specific fare feature NSAR Non-smoking area Non-smoking area Carrier specific fare feature OCUN One child under the age of 3 can travel for free with an adult. One child under the age of 3 can travel for free with an adult. Carrier specific fare feature OIBA One Infant/baby aged 0-2 travels for free when accompanied by an adult with a valid ticket. One Infant/baby aged 0-2 travels for free when accompanied by an adult with a valid ticket. Carrier specific fare feature OPLU One piece Luggage Passengers are allowed to bring one piece of luggage onboard. Carrier specific fare feature ODRE Open 30-day Return Open 30-day Return Carrier specific fare feature PRTO Partially Refundable - Top and Comfort Tickets can be cancelled directly on Itabus website and refund is only available in form of vouchers. Refund is 75% of booking value for 4 days before departures and 50% for 2-3 days before departures. No refund available for cancellations between 0-1 days before departures. *Days are counted starting from 24 hours prior to the departure time. Carrier specific fare feature PRRE Partially refundable ,70% refund before day of travel cancellation. 50% refund on same day of travel cancellation if 5 hours before travel time. 0% refund post travel time cancellation. Partially refundable ,70% refund before day of travel cancellation. 50% refund on same day of travel cancellation if 5 hours before travel time. 0% refund post travel time cancellation. Carrier specific fare feature PRFE Partially Refundable FLEX - Top Flex and Comfort Flex Tickets can be cancelled directly on Itabus website and refund is available only in form of vouchers. Refund is available for *cancellations made up until 2 hours before departures. Refund value is 90% of booking value. Carrier specific fare feature PILL Pillow Pillow is provided on board. Carrier specific fare feature PTRA Possible Transfer Carrier sometimes adds transfers based on demand and load factors. Please check your ticket carefully to change the bus at transfer point. Carrier specific fare feature PBRE Post booking requirement To board the bus, it is required to fill in the form on the carrier's website after booking: https://alpsbookings.com/my/find/. Carrier specific fare feature PBOA Priority boarding Priority boarding Carrier specific fare feature PSER Priority service Priority service of the crew on selected connections Carrier specific fare feature PZON Private zone Zones for meeting, silence and work and rest is available on train. Carrier specific fare feature QCAR Quiet car More privacy in a separate section. Carrier specific fare feature RSEA Reservable Seat This seat is reservable Carrier specific fare feature SRES Seat Reservation Seat reservation is available. Carrier specific fare feature SAPA Singular Abierta Partially Refundable Refund 90% if canceled more than 7 days in advance, 80% if less Carrier specific fare feature SFPA Singular Flexible Partially Refundable Refund 85% if canceled more than 7 days in advance, 75% if less Carrier specific fare feature SOYU Singular Only You Abierta Partially Refundable Refund 90% if canceled more than 7 days in advance, 80% if less Carrier specific fare feature SOYO Singular Only You Partially Refundable Refund 85% if canceled more than 7 days in advance, 75% if less Carrier specific fare feature SSNO Ski / Snowboard Tickets include oversized luggage for one set of Snowboards / Skis Carrier specific fare feature SBAG Ski bag One ski bag per passenger is included in the ticket. Carrier specific fare feature SSBA Ski/ Snowboard Bag Clients are allocated, per person, a ski or snowboard bag (23kg) which must be indicated on the booking. The ski or snowboard bag must not exceed 23 kg and dimensions: length 180cm, wide 33cm, deep 24 cm. Carrier specific fare feature SCAN Small cats and dogs with carrying boxes are allowed Small cats and dogs with carrying boxes are allowed. Carrier specific fare feature STAB Small table A small table for every seat. Carrier specific fare feature SEAC Stairway easily accessible Stairway is easily accessible Carrier specific fare feature STAN Standard Seating Standard seating Carrier specific fare feature TAVA Table available Table available onboard Carrier specific fare feature RTVA Ticket validity Roundtrip is valid 6 months from purchase. Carrier specific fare feature STVA Ticket validity One trip is valid 6 months from purchase. Carrier specific fare feature TVAL Ticket validity The return ticket is valid for 120 days following use of the outbound ticket. Carrier specific fare feature TBUF Time Buffer Please note: the timetable includes buffer time. Carrier specific fare feature TDIN Traditional dining As an exclusive, complimentary offering for customers traveling in private rooms, traditional dining service is provided in the Dining Car. Carrier specific fare feature TBIN Train Binding You can use any of the trains indicated on your ticket. Local trains (e.g. RE, RB, S) are not tied to a specific train. Carrier specific fare feature UTAD Up to 2 adults and 3 children can use 1 ticket Up to 2 adults and 3 children can use 1 ticket Carrier specific fare feature UTFO Up to four children under the age of five can travel for free. Up to four children under the age of five can travel for free. Carrier specific fare feature UDEC Upper deck Upper deck of the bus Carrier specific fare feature VREF Voucher refund The cancellation can be conducted via Internet/Call Center at least 30 min before departure within office hours, passengers will receive a voucher for a next trip. Carrier specific fare feature WROO Waiting Room Waiting room with massage chairs, free drinks, and snacks available for passangers. Carrier specific fare feature *The global fare features are available for most carriers, while the carrier specific fare features are only available for selected carriers. If you need a more detailed list per carrier please contact your Partnership Manager. Please note that Distribusion might include new features/amenities to the list once in a while. The name and description of fare features can also change over time. We recommend to regularly refresh the list using the /marketing_carriers/{marketing_carrier_id} endpoint as described in the Preparing Metadata step . • [Cancellation & Refund Policies](https://docs.distribusion.com/dt/api/other-concepts/cancellation-and-refund-policies.md): In the booking flow, it is highly recommended to display the carrier’s cancellation policy for the chosen trip and fare class to the user. Cancellation policies are defined on a fare class level in the Distribusion API and communicated through fare_features that are provided in the /marketing_carriers/{marketing_carrier_id} or /connections/find response. Check our Features & Amenities guide for more details about how they work. These fare features should be displayed to users during the booking flow, ideally as part of the search results. We recommend giving extra visibility to them in your flow, ideally separated from other fare features, to allow users to understand what cancellation rules apply to each fare class. Note that after a booking is completed, the cancellation and refund policies that are valid for the booking should be checked using the /cancellation/conditions endpoint as described in the Cancel Booking steps of the flow. Cancellation & Refund Features Distribusion uses three standardized fare feature codes to communicate cancellation policies and provide the relevant information to be displayed to users. Each carrier will have at least 1 of these 3 features, and will never allow more than 1 per fare class. Code Name Description REFU Fully refundable The ticket can be fully refunded according to the carrier’s policy PREF Partially refundable The ticket can be partially refunded according to the carrier’s policy NREF Non-refundable The ticket cannot be refunded Besides that, 2 other useful features that could go alongside the 3 above are the ones that inform if the fares allow amendments. Code Name Description AMEN Amendable The ticket is amendable. NAME Non-amendable The ticket is not amendable. Some carriers might have specific fare_features that include additional cancellation and refund details. Please take note of them from the list below: Carrier Code Carrier Name Fare Feature Code Fare Feature Name BCOE Bebeto Coaches PRRE Partially refundable BLAB BlaBlaCar Bus VREF Voucher refund IRYO iryo IFPA Initial IRYO iryo SFPA Singular IRYO iryo IBPA Infinita Bistró IRYO iryo IBAB Infinita Bistró Open IRYO iryo SOYO Singular Only You IRYO iryo SOYU Singular Only You Open ITAB Itabus PRTO Partially Refundable - Top and Comfort ITAB Itabus PRFE Partially Refundable FLEX - Top Flex and Comfort Flex For the full list of possible fare_features including fare names and descriptions check our Features & Amenities guide. Custom Descriptions Each cancellation/refund fare feature provides a carrier-specific description within the attributes array of the response, detailing the conditions whereby a customer can cancel a ticket. Sample PREF Feature from Westbahn JSON { "id": "WEST-PREF", "type": "fare_features", "attributes": { "code": "PREF", "name": "Partially refundable", "description": "If the ticket is cancelled within 15 minutes of purchase, the passenger is eligible for a full refund. Beyond this period, the ticket may be cancelled up to one day before the selected day of travel for a fee of 25% of the ticket price (minimum €4.99)." } } Fare Conditions SNCF and National Rail are among some of the carriers that work with the concept of micro-conditions. These are dynamic cancellation and refund policies that are set at a fare class level. This content appears under the fare_conditions section in the /connections/find response. JSON { "attributes": { "code": "CONDITION-27", "description": "LYON PART DIEU - PARIS - GARE DE LYON - HALL 1 & 2 - Découverte 12-25\nTo be between 12 and 25 years old on the date of travel. For a journey during blue (off-peak) hours. Ticket non-exchangeable. Refundable until the day before departure on the purchase channel.\nLYON PART DIEU - PARIS - GARE DE LYON - HALL 1 & 2 - Billet Tarif Normal\nValid solely on TER trains for the selected date of travel. Ticket non-exchangeable. Refundable until the day before departure on the purchase channel.\n", "exchangeable": "no", "refundable": "yes", "title": "Découverte 12-25;Billet Tarif Normal" }, "id": "SNCF-159c0f8282ec1812d-21ad8dacb0c7d631a", "type": "fare_conditions" } Displaying this information in your search flow is a requirement by SNCF and National Rail. • [Asynchronous Cancellations](https://docs.distribusion.com/dt/api/other-concepts/asynchronous-cancellations.md): Depending on cancellation conditions or if a booking is flagged as potentially fraudulent on the SNCF side, a cancellation request might not be confirmed immediately. Instead, its status may be marked as "pending" . To support this scenario, an asynchronous cancellation process must be implemented and managed on the retailer side to check for the final status of the cancellation. This guide explains the asynchronous cancellation process, which is a specific requirement for handling certain cancellations with SNCF. This process does not apply to other carriers. Creating a Cancellation The process begins similarly to a standard cancellation . After confirming the cancellation policies using the /cancellations/conditions endpoint, you create a cancellation using /cancellations/create. However, for this asynchronous flow, the response will include a state of "pending" and a confirmation_expected_at timestamp. This timestamp indicates the earliest time you should check for a final update from the carrier. Sample Response from /cancellations/create (Pending State) Plain text { "data": { "id": "hlvxV2GfWcRCHUxa-MFUwg", "type": "cancellations", "attributes": { "state": "pending", "total_price": 13300, "fee": 0, "total_refund": 13300, "monetary_refund": 13300, "voucher_refund": 0, "created_at": "2024-02-15T13:43", "confirmation_expected_at": "2024-02-15T14:14+01:00" } } } { "data": { "id": "hlvxV2GfWcRCHUxa-MFUwg", "type": "cancellations", "attributes": { "state": "pending", "total_price": 13300, "fee": 0, "total_refund": 13300, "monetary_refund": 13300, "voucher_refund": 0, "created_at": "2024-02-15T13:43", "confirmation_expected_at": "2024-02-15T14:14+01:00" } } } Checking the Cancellation Status To get the final status of a pending cancellation, you must schedule a follow-up call. Schedule the Check : Use the confirmation_expected_at timestamp from the previous response to schedule a call to check the booking's status. Poll the Booking Endpoint : Make a request to the /bookings/{booking_id} endpoint, using the ID of the original booking. Check the Final State : The updated status is available in the cancellation-related attributes within the booking response. The possible final values for the state field are: confirmed , pending , rejected , and failed . Check for Rejection Reason : If the cancellation status is rejected , the error message will appear in the rejected_reason field. By implementing this polling mechanism, you can reliably manage SNCF cancellations that require an asynchronous confirmation process. • [Terms & Conditions](https://docs.distribusion.com/dt/api/other-concepts/carrier-terms-and-conditions.md): It is a mandatory requirement to present the specific terms and conditions (T&Cs) from carriers to users during the booking flow. This ensures transparency and that the user agrees to the carrier's rules before purchase. While most carriers provide a single link for their T&Cs, some may provide multiple links. In such cases, it is required that all links are displayed to the user in your UI. Retrieving Terms & Conditions You can retrieve the terms and conditions data by making a call to the /marketing_carriers/{marketing_carrier_id} endpoint using the specific carrier's ID. Plain text ... "terms": "Conditions of Carriage:\r\nhttps://www.sncf-voyageurs.com/en/travel-with-us/in-france/mainline-cards-and-fares/legal-notices/\r\n\r\nRail Passenger Rights Regulation\r\nhttps://www.sncf-voyageurs.com/en/customer-service/delays/", ... ... "terms": "Conditions of Carriage:\r\nhttps://www.sncf-voyageurs.com/en/travel-with-us/in-france/mainline-cards-and-fares/legal-notices/\r\n\r\nRail Passenger Rights Regulation\r\nhttps://www.sncf-voyageurs.com/en/customer-service/delays/", ... The data will be available in the response body within the terms field of the attributes object. This field is a single string that may contain one or multiple URLs, each potentially preceded by a title and separated by newline characters \r\n . Display and Implementation Your application must be able to parse the terms string and correctly display both single and multiple links. A recommended way to present this information is within a pop-up modal on the checkout page, displayed to the user before they finalize their payment. This ensures the customer has a clear opportunity to review all applicable conditions. • [Carrier Cancellations](https://docs.distribusion.com/dt/api/other-concepts/carrier-cancellations.md): Understand Distribusion's cancellation policies for pre-trip, post-departure, and technical issues, and learn how to manage refunds via webhooks, email, or carrier communication. • [Dynamic Passenger Details](https://docs.distribusion.com/dt/api/other-concepts/dynamic-passenger-details.md): When creating bookings through the Distribusion API, different carriers may require different sets of passenger information. These requirements can include fields such as passenger name, date of birth, nationality, document details, and more, depending on the carrier’s operational and regulatory needs. To ensure successful bookings, get required fields from /connections/vacancy and /reservations/create endpoints. By integrating this schema into your application, you can dynamically adapt your booking forms and validation logic to enhance user experience, reduce booking errors, and ensure compliance with carrier requirements. EU Entry/Exit System (EES) Compliance Starting April 10th, 2026, the European Union is implementing the Entry/Exit System (EES) to modernize border security for non-EU nationals entering the Schengen Area. To comply with these regulations, carriers are now required to collect additional passenger data during the booking process, such as Visa Permit Type, Document Expiry Date, and Issuing Country. Our Dynamic Passenger Details solution is designed to handle these EES requirements automatically. Rather than hard-coding these new fields into your integration, our API will dynamically include any EES-mandated fields within the /connections/vacancy or /reservations/create responses based on the specific route and carrier. By following the standard dynamic workflow outlined above, your application will remain compliant with EES regulations without requiring further schema changes. Ensure EES readiness by April 10, 2026, by dynamically rendering all fields returned in the required_attributes schema. API Workflow To get the list of fields required dynamically as part of the flow you retrieve the data from the response from the /connections/vacancy and /reservations/create endpoints. /connections/vacancy Response The response from the /connections/vacancy endpoint outlines which passenger fields are required or optional for the /reservations/create and /reservations/confirm request. Plain text ... { "id": "PNOS-1-1746786426", "type": "passengers", "relationships": { "required_attributes": { "data": [ { "id": "c88e583c-c34e-4c56-bebd-55b4ec3597b4", "type": "passenger_required_attributes" }, { "id": "d819004e-c28c-429f-9751-3c3b2db0fd5a", "type": "passenger_required_attributes" } ] } } }, { "id": "c88e583c-c34e-4c56-bebd-55b4ec3597b4", "type": "passenger_required_attributes", "attributes": { "mandatory": [], "endpoint": "reservations/create" } }, { "id": "d819004e-c28c-429f-9751-3c3b2db0fd5a", "type": "passenger_required_attributes", "attributes": { "mandatory": [ "birthdate", "government_id", "government_id_type", "first_name", "last_name" ], "endpoint": "reservations/confirm" } }, { "id": "a3cee3c3-a7fe-4abf-8f7a-6d9283b7f3a1", "type": "required_attributes", "attributes": { "mandatory": [], "endpoint": "reservations/create" } }, { "id": "3371d7b7-76d1-4773-908c-0589517cc58f", "type": "required_attributes", "attributes": { "mandatory": [ "city", "email", "first_name", "last_name", "street_and_number", "title", "zip_code", "terms_accepted" ], "endpoint": "reservations/confirm" } } ] } } ... { "id": "PNOS-1-1746786426", "type": "passengers", "relationships": { "required_attributes": { "data": [ { "id": "c88e583c-c34e-4c56-bebd-55b4ec3597b4", "type": "passenger_required_attributes" }, { "id": "d819004e-c28c-429f-9751-3c3b2db0fd5a", "type": "passenger_required_attributes" } ] } } }, { "id": "c88e583c-c34e-4c56-bebd-55b4ec3597b4", "type": "passenger_required_attributes", "attributes": { "mandatory": [], "endpoint": "reservations/create" } }, { "id": "d819004e-c28c-429f-9751-3c3b2db0fd5a", "type": "passenger_required_attributes", "attributes": { "mandatory": [ "birthdate", "government_id", "government_id_type", "first_name", "last_name" ], "endpoint": "reservations/confirm" } }, { "id": "a3cee3c3-a7fe-4abf-8f7a-6d9283b7f3a1", "type": "required_attributes", "attributes": { "mandatory": [], "endpoint": "reservations/create" } }, { "id": "3371d7b7-76d1-4773-908c-0589517cc58f", "type": "required_attributes", "attributes": { "mandatory": [ "city", "email", "first_name", "last_name", "street_and_number", "title", "zip_code", "terms_accepted" ], "endpoint": "reservations/confirm" } } ] } } /reservations/create Response The response from the /reservations/create endpoint outlines which passenger fields are required or optional for the /reservations/confirm request. Plain text ... "relationships": { "required_attributes": { "data": [ { "id": "R-PNOS-1-ITES-ESBCNBSB-ESMADMAT-2025-05-19T07:05-2025-05-19T09:42-78356efe-d095-4002-888b-0c00084ecbd3", "type": "reservation_passenger_required_attributes" } ] } } }, { "id": "R-PNOS-1-ITES-ESBCNBSB-ESMADMAT-2025-05-19T07:05-2025-05-19T09:42-78356efe-d095-4002-888b-0c00084ecbd3", "type": "reservation_passenger_required_attributes", "attributes": { "mandatory": [ "birthdate", "government_id", "government_id_type", "first_name", "last_name" ], "endpoint": "reservations/confirm" } }, { "id": "RTZRVGBS-267dc866-5aac-4d2a-8ba5-7139fa448b99", "type": "required_attributes", "attributes": { "mandatory": [ "city", "email", "first_name", "last_name", "street_and_number", "title", "zip_code", "terms_accepted" ], "endpoint": "reservations/confirm" } } ] } } ... "relationships": { "required_attributes": { "data": [ { "id": "R-PNOS-1-ITES-ESBCNBSB-ESMADMAT-2025-05-19T07:05-2025-05-19T09:42-78356efe-d095-4002-888b-0c00084ecbd3", "type": "reservation_passenger_required_attributes" } ] } } }, { "id": "R-PNOS-1-ITES-ESBCNBSB-ESMADMAT-2025-05-19T07:05-2025-05-19T09:42-78356efe-d095-4002-888b-0c00084ecbd3", "type": "reservation_passenger_required_attributes", "attributes": { "mandatory": [ "birthdate", "government_id", "government_id_type", "first_name", "last_name" ], "endpoint": "reservations/confirm" } }, { "id": "RTZRVGBS-267dc866-5aac-4d2a-8ba5-7139fa448b99", "type": "required_attributes", "attributes": { "mandatory": [ "city", "email", "first_name", "last_name", "street_and_number", "title", "zip_code", "terms_accepted" ], "endpoint": "reservations/confirm" } } ] } } Understanding the Response In the case of this sample carrier, we have the following scenario: /reservations/create No fields are required /reservations/confirm Top-level: city email first_name last_name street_and_number title zip_code terms_accepted Nested in passengers[]: birthdate government_id government_id_type first_name last_name ID Types Allowed When government_id is a required field for a carrier, the list of types of ID allowed for the government_id_type field are listed in the /marketing_carriers/{marketing_carrier_id}/booking/schema endpoint. JSON { "data": { "id": "IRYO", "type": "booking_schema", "attributes": { "mandatory": [ "arrival_station", "arrival_time", "city", "currency", "departure_station", "departure_time", "email", "execute_payment", "first_name", "last_name", "locale", "marketing_carrier", "passengers", "passengers[].birthdate", "passengers[].government_id", "passengers[].government_id_type", "payment_method", "retailer_partner_number", "send_customer_email", "street_and_number", "terms_accepted", "title", "total_price", "zip_code" ], "optional": [ "discount_code", "fare_class", "flight_number", "government_id", "government_id_type", "passengers[].nationality", "passengers[].tax_id", "payer_id", "payment_token", "phone" ] }, "relationships": { "required_attributes": { "data": [ { "id": "IRYO-reservations/confirm-default-e0092493-6b69-4ac7-bf6c-9320e9ee7bea", "type": "required_attributes" }, { "id": "IRYO-reservations/create-default-4602cb0e-ba01-41ee-84b1-d7b0d90b987e", "type": "required_attributes" } ] } } }, "jsonapi": { "version": "1.0" }, "included": [ { "id": "IRYO-reservations/confirm-default-e0092493-6b69-4ac7-bf6c-9320e9ee7bea", "type": "required_attributes", "attributes": { "mandatory": [ "city", "email", "first_name", "last_name", "street_and_number", "title", "zip_code", "terms_accepted", "passengers[].birthdate", "passengers[].government_id", "passengers[].government_id_type", "passengers[].first_name", "passengers[].last_name" ], "endpoint": "reservations/confirm", "context": "default", "description": "Required data for all requests" }, "relationships": { "allowed_values": { "data": [ { "id": "IRYO-reservations/confirm-default-passengers[].government_id_type-fa118a3d-905a-4a5b-8123-185a2752c0f0", "type": "allowed_values" } ] } } }, { "id": "IRYO-reservations/create-default-4602cb0e-ba01-41ee-84b1-d7b0d90b987e", "type": "required_attributes", "attributes": { "mandatory": [], "endpoint": "reservations/create", "context": "default", "description": "Required data for all requests" }, "relationships": { "allowed_values": { "data": [] } } }, { "id": "IRYO-reservations/confirm-default-passengers[].government_id_type-fa118a3d-905a-4a5b-8123-185a2752c0f0", "type": "allowed_values", "attributes": { "attribute": "passengers[].government_id_type", "allowed": [ "birth_certificate", "drivers_license", "entry_visa", "marine_id", "military_supplement", "national_id", "naturalisation_certificate", "passport_id", "permanent_resident_id", "refugee_id", "resident_id", "tax_number", "tsa_precheck_id", "us_i872_card", "us_tribal_card", "international_passport" ] } } ] } For instance, in the case of this sample carrier the following fields are allowed: birth_certificate drivers_license entry_visa marine_id military_supplement national_id naturalisation_certificate passport_id permanent_resident_id refugee_id resident_id tax_number tsa_precheck_id us_i872_card us_tribal_card international_passport • [Required Passenger Details](https://docs.distribusion.com/dt/api/other-concepts/passenger-details.md): When creating or confirming a reservation, retailers must include the passenger's real and accurate information. It is crucial to use the actual customer's details (e.g., first and last names, email address, government ID) in the /reservations/create and /reservations/confirm requests, rather than using dummy data or an agent's booking email. Why Accurate Details are Required Providing accurate passenger information is essential for several reasons: Customer Communication : Correct contact details are required for notifying the customer in the case of cancelled trips or disruptions to their journey. Identity Verification : For some carriers, such as KAI and China Railway, accurate passenger information is mandatory for their identity verification process. Preventing Booking Failures : Supplying incorrect details may result in booking failures. Address Details While the requirement for accurate contact and identity information is strict, there is more flexibility regarding passenger address details (street, city, country, zip code). It is always best practice to provide accurate address information when possible. However, if these details are not collected in your booking flow, it is generally acceptable to use placeholder data for these specific fields. This is because most carriers do not use address data for operational purposes, with the main exception being for customer invoice generation. • [Passenger External IDs](https://docs.distribusion.com/dt/api/other-concepts/passenger-external-ids.md): Distribusion assigns every passenger in a connections/find response a generated identifier (for example pax-33-1 ). Because Distribusion might sort the passengers it returns, the order of passengers in the response does not necessarily match the order you sent them in. If you correlate the returned passengers back to your own records by position, you can end up matching the wrong passenger. The optional external_id lets you attach your own identifier to each passenger in the request. Distribusion echoes that identifier back on the matching passenger in the response, giving you a stable anchor to map passengers back to your records — independent of order. How it works Add an optional external_id (string) to any passenger object in the connections/find request. When supplied, the value is echoed back on the matching passenger as attributes.external_id in the response. The generated identifier remains the passenger's canonical id ( pax-{age}-{index} , 1-based index). All other references in the response — a fare's passenger_ids and each services[].passenger_ids — continue to use that generated id , not your external_id . If you omit external_id , behaviour is unchanged. The field is fully backwards-compatible. Request Send external_id on each passenger you want to track on c/f. Each such passenger must be queried individually ( pax: 1 ). JSON { "passengers": [ { "external_id": "my-pax-A", "max_age": 33, "pax": 1 }, { "external_id": "my-pax-B", "max_age": 11, "pax": 1 } ] } Response Your value appears as passengers.attributes.external_id on the matching passenger resource in included . Fares and services keep referencing the generated id through their passenger_ids . JSON { "included": [ { "type": "fares", "id": "fare-1", "attributes": { "passenger_ids": ["pax-33-1", "pax-11-2"], "services": [ { "service_type_id": "seat", "passenger_ids": ["pax-33-1"] } ] } }, { "type": "passengers", "id": "pax-33-1", "attributes": { "age": 33, "external_id": "my-pax-A" } }, { "type": "passengers", "id": "pax-11-2", "attributes": { "age": 11, "external_id": "my-pax-B" } } ] } To map a fare or service back to your own passenger record: read the generated id s from the fare's passenger_ids (or a services[].passenger_ids ), find the matching passenger in included , and read its attributes.external_id . Validation rules Unique per request. Each external_id must be unique within a single request. Two passengers carrying the same value are rejected with the error "Two passengers cannot have the same external_id". One passenger per object. A passenger object that sets external_id must represent a single passenger ( pax: 1 ). Setting external_id on an object with pax > 1 is rejected with the error "Please query each passenger individually when requesting with passengers[].external_id". Mixed supply is allowed. Validation is per passenger. You may set external_id on some passengers and omit it on others in the same request. Passengers that omit it simply have no external_id attribute in the response. Scope and limitations connections/find only . external_id is accepted and echoed on connections/find . It is not carried through to follow-up calls ( connections/vacancy , connections/seats , seats/availability , reservations/create ), which regenerate their own passenger identifiers. Tracked as a separate workstream. Not sent to carriers. The identifier stays within Distribusion; carriers never receive it. It exists purely to help you correlate the connections/find response back to your own data. • [Custom Fields](https://docs.distribusion.com/dt/api/other-concepts/custom-fields.md): To support operational usage and marketing analytics for retailers, the API supports the transmission and storage of additional attributes. These attributes can be passed during the reservation confirmation process and are subsequently echoed back in booking and reservation responses. Retailers often require specific custom fields to capture operational data such as project numbers, employee IDs, or cost centers. These fields are accepted in the /reservations/confirm request and can be named as preferred. They are passed as an array of objects within the custom_fields parameter. Currently, the system supports a maximum of 20 custom attributes and these fields are handled as key-value pairs. Sample Request JSON ... "custom_fields": [ { "name": "project_id_test_test", "value": "1234123412341234" }, { "name": "company_id", "value": "100" } ] ... In the API response, the custom_fields are located within the relationships object. Sample Response JSON { "data": { "type": "bookings", "id": "qeyXddMih-s7raA0voQbdg", "attributes": { ... }, "relationships": { "custom_fields": { "data": { "project_id_test_test": "1234123412341234", "company_id": "100" } } } } } UK Rail Requirements For UK Rail bookings, specific customer location data is required to correctly determine commission levels. This data is transmitted via the custom_fields array in the /reservations/confirm request. Required Fields To ensure accurate commission calculation, the following fields should be provided in the request: ip_based_location : The country code derived from the customer's IP address. Format should be ISO 3166-1 alpha-2 (e.g., GB, DE). payment_card_issuing_country : The country code where the customer's payment card was issued. Format should be ISO 3166-1 alpha-2 (e.g., GB, DE). Commission Logic The values provided in these fields directly impact the commission tier applied to the booking: Domestic Customer (Standard Commission): The system defaults to the domestic (lower) commission level if these fields are omitted. Additionally, if either ip_based_location OR payment_card_issuing_country is GB, the customer is treated as domestic. International Customer (Higher Commission): The higher commission level is applied only if both ip_based_location AND payment_card_issuing_country are provided and neither is GB. Sample Request JSON { "reservation_id": "RHQ3H237", "title": "mr", "first_name": "Mary", "last_name": "Adams", "email": "mary.adams@email.com", "phone": "4877777777777", "city": "Berlin", "zip_code": "12345", "street_and_number": "Berlinstr. 00", "execute_payment": false, "payment_method": "demand_note", "terms_accepted": true, "send_customer_email": true, "passengers": [ { "type": "PNOS", "first_name": "Mary", "last_name": "Adams", "birthdate": "1993-05-11", "gender": "F" } ], "custom_fields": [ { "id": "URAI-GBLONLDM-GBBHXBIO-ip_based_location-GB", "name": "ip_based_location", "value": "GB" }, { "id": "URAI-GBLONLDM-GBBHXBIO-payment_card_issuing_country-GB", "name": "payment_card_issuing_country", "value": "GB" } ] } }] The retailer must maintain a list of customer addresses for at least 6 months due to audits by the carrier for international commissions i.e. could be required as retrospective proof for higher commission paid. • [Operating Carriers](https://docs.distribusion.com/dt/api/other-concepts/operating-carriers.md): Within the API, we split our carriers into two separate distinct categories. These are Marketing Carriers & Operating Carriers. Marketing carrier : The carrier who defines the Fare Rules and is liable for the success of a booked trip and for customer service. Operating carrier : The carrier who operates the transportation, i.e., takes care of the actual transportation of customers. Buses are branded under OC logo. Identifying Carrier Type Perform a search using the /connections/find endpoint. The data about the operating carriers is available in the body of the response, under the included entity. The information appears under the marketing_carrier and operating_carrier sections. JSON "included": [ { "attributes": { "arrival_time": "2024-09-11T22:30", "departure_time": "2024-09-11T21:11", "index": 0, "line": "9063", "line_prefix": "EUROSTAR" }, "id": "STES-FRPARPGN-GBLONLIB-2024-09-11T21:11-2024-09-11T22:30-0", "relationships": { "amenities": { "data": [ { "id": "EURS-AAFR", "type": "amenities" } ] }, "arrival_station": { "data": { "id": "GBLONLIB", "type": "stations" } }, "departure_station": { "data": { "id": "FRPARPGN", "type": "stations" } }, "fares": { "data": [] }, "marketing_carrier": { "data": { "id": "STES", "type": "marketing_carriers" } }, "operating_carrier": { "data": { "id": "EURS", "type": "operating_carriers" } }, "vehicle": { "data": { "id": "TRAIN-STES-FRPARPGN-GBLONLIB-2024-09-11T21:11-2024-09-11T22:30-0", "type": "vehicles" } } } In most cases, the marketing carrier is also the operating carrier. However, with some integrations we receive the content of several carriers through one API integration. In the case of SNCF for example, the operating carrier can be Eurostar. When this happens, the information must be disclosed to users in the retailer UI. Operating Carriers Details Logo When an operating carrier doesn't match the marketing carrier, we recommend that you display the logo of the operating carrier. This is not mandatory, except for SNCF/Eurostar and Trenitalia. Use the /marketing_carriers/{marketing_carrier_id} endpoint to retrieve the logo under the white_label_logo field. To access the carrier and its logo you need the operating carrier to be whitelisted for your account too. Please contact your Partnership Manager to whitelist the operating carriers you need. Note that the operating carriers are like ‘shell carriers’ and won't return any trip content. Another option is to download the full list of logos from this folder prepared by Distribusion. Terms For some operating carries such as Eurostar it is mandatory to display their terms. Use the /marketing_carriers/{marketing_carrier_id} endpoint to retrieve the terms under the terms field. To access the carrier and its terms you need the operating carrier to be whitelisted for your account too. Please contact your Partnership Manager to whitelist the operating carriers you need. • [Ticket Validity](https://docs.distribusion.com/dt/api/other-concepts/ticket-validity.md): Ticket validity rules are presented under the ticket_validity_rules section available from the /marketing_carriers/{marketing_carrier_id} endpoint. Parameters They are described by a number of further parameters, which are detailed in the table below. Ticket Validity Parameter Description Type outbound; inbound The rule applies to the inbound or outbound leg of the trip Use type once; multiple Ticket can be used for a single or unlimited trips Reference time departure_time; beginning_of_departure_day; purchase_time; beginning_of_purchase_day; outbound_voucher_redemption; inbound_voucher_redemption Anchor from which the ticket validity duration begins Offset minutes; hours; days; months Buffer between reference time and start of validity duration Duration minutes; hours; days; months Time window of ticket validity starting from reference time (plus offset) Cancellation impact cancellation_impact Boolean. If true then the booking may no longer be cancelled following initial ticket retrieval. • [Ticket Types](https://docs.distribusion.com/dt/api/other-concepts/ticket-types.md): The majority of carriers accept tickets to be displayed on mobile devices, which is what users are accustomed to. The parameter ticket_printing_required in the /marketing_carriers/{marketing_carrier_id} endpoint enables you to see which carriers do not need their tickets to be printed. We recommend surfacing this to your customers with an icon or text. PDF Tickets For the wide majority of available carriers, successfully delivered tickets follow Distribusion’s standard ticket template. Please refer to the example below. In some selected cases, carriers accept only their own ticket format, which is then passed through the API in place of the regular Distribusion template. Regardless of which of these two options is true for a certain booking, all tickets for one booking are returned within one PDF file. For multi-segment trips (i.e. with a stop-over), one ticket is delivered per segment. All pages are still delivered within a single PDF file. By default, when calling the /bookings/{booking_id}/tickets endpoint the tickets are returned in PDF format. You can also include the parameter type=pdf . HTTP https://api.demo.distribusion.com/retailers/v4/bookings/8qbBSBst2XH39afW2WzAfQ/tickets?type=pdf Distribusion tickets can also be displayed on mobile devices, so we encourage you to let customers know that they do not need to print their tickets. In rare cases, carrier tickets can be print-at-home tickets which is indicated directly on the ticket itself. To know if printing is required, check the field ticket_printing_required in the /marketing_carriers/{marketing_carrier_id} endpoint. Provisional Tickets For some carriers such as Trenitalia, Eurostar and ÖBB (coming soon) a ‘provisional’ ticket is delivered via /bookings/{booking_id}/tickets endpoint. In each case, instructions on how to get the final ticket are provided in the provisional ticket. Trenitalia Tickets deliverd by Trenitalia for their regional network are not valid for travel. This is stated directly on the PDF ticket as seen below. In such cases, the booking confirmation email delivered by Distribusion automatically includes this information. When using your own email format , passengers must be informed in the body of the booking confirmation email and a link to the Trenitalia website where the permanent ticket can be retrieved must be included. See example of implementation below: The link to the Trenitalia website fom the "Open Barcode" button is built using this format: https://www.lefrecce.it/Channels.Website.WEB/#/user-area/purchase/ticketDetail?email= {email} &operation=filter&pnr= {marketing_carrier_passenger_id} The passenger email and marketing_carrier_passenger_id are available from the /bookings/{booking_id} response. https://www.lefrecce.it/Channels.Website.WEB/#/user-area/purchase/ticketDetail?email= johnsmith@email.com &operation=filter&pnr= 7685209697 Eurostar While booking Eurostar tickets for London ←> Europe journeys passengers get the provisional ticket in case the request to /reservation/create includes the minimum passenger required fields. JSON "passengers": [ { "type": "PNOS", "first_name": "John", "last_name": "Smith" } ] In this case, passengers have to login to the Eurostar website to complete the missing details and retrieve the final valid ticket. Instructions and a link are provided directly in the PDF ticket. You can also include a link to the Eurostar website in your booking confirmation email, in this case it is a static link: https://staging.eurostar.com/customer-dashboard/en/get-booking?market=uk-en . To avoid giving provisional tickets to your customers, request all their details in your checkout page and include the details in the /reservation/create request. JSON "passengers": [ { "type": "PNOS", "first_name": "John", "last_name": "Smith", "birthdate": "1994-11-29", "gender": "M", "government_id_type": "national_id", "government_id": "123456781", "government_id_issuing_country": "US", "government_id_validity_expiration": "2035-01-01", "nationality": "DE" } ] Mobile Wallet Tickets In addition to the PDF tickets described above, some carriers support mobile tickets in PKPASS and Google Wallet formats. Whether a carrier supports mobile tickets or not can be identified by checking the following parameters in the /marketing_carriers/{marketing_carrier_id} endpoint. has_mobile_tickets = PKPASS google_wallet_tickets_enabled = Google Wallet We recommend that based on what is supported by each carrier you can dynamically call the /bookings/{booking_id}/tickets endpoint to retrieve the required ticket. For PKPASS include the parameter type=pkpass and for Google Wallet include the parameter type=google-wallet . See sample of request below. HTTP https://api.demo.distribusion.com/retailers/v4/bookings/8qbBSBst2XH39afW2WzAfQ/tickets?type=pkpass For PKPASS, note that after you download the file via that link that is included in the response you must add the file extension .pkpass at the end. See a sample of PKPASS response below. JSON { "data": [ { "id": "fc1b5cf3-c110-4a0b-838b-7c3a60a23c0a", "type": "tickets", "attributes": { "url": "https://storage.googleapis.com/distribusion-next-13-prod-mobile-tickets/tickets/1729807200/ZNV81C/fc1b5cf3-c110-4a0b-838b-7c3a60a23c0a?GoogleAccessId=passta%40distribusion-next-13.iam.gserviceaccount.com&Expires=1730126436&Signature=BOM9hZuyeKVjOfkrAbJVGhg9GK9CPie20vyH1AD4xoNXjuZijpvV2F5UQ2ZKeZ4NL6RjA78FQ8Z9YLimv6bxlyHkfj%2BUTeR9QUU6QswSoAzd18E9gWQPen3CEARuxdXI1CP5i6lP%2FeMKOKBCbrKoP%2B32QO7y%2FO7C1XYuhTESp2WGcSiqXaUaWI03z0FA7G05e2NBbvLAi1UZoXYjOq0B8ls2fnLjedBZG4WOeUDAYeAiJ%2BZROEHssFfP7ZNmjtvWiWJvyDYPMiEiB87nqPeyWVgG73hduUu5hbK7l4pRLxqdCVPHOO7FmMptQX6%2BawhMAWoPNSQ4HiXlefjp1mstBw%3D%3D", "url_valid_until": "2024-10-28T16:40:36.228+01:00", "state": "created" } } ], "jsonapi": { "version": "1.0" } } Other Formats Besides PDF, PKPASS and Google Wallet, some carriers also support tickets in image , html and qr-code-png . Image Tickets The image tickets are presented in the response as base64 so they must be converted from the base64 format to image. This can be done with a script such as Base64 Guru . HTML Tickets The HTML tickets are only available for tickets using the Distribusion standard ticket template. QR Code Tickets QR Code tickets are presented in the response as base64 so they must be converted from the base64 format to image. This can be done with a script such as Base64 Guru . Examples of Tickets For examples of single and return tickets in PDF and PKPASS download here . For examples of some PDF tickets for various carriers view here . • [Ticket Delivery](https://docs.distribusion.com/dt/api/other-concepts/ticket-delivery.md): Distribusion offers two different options for ticket delivery. Email & Tickets Sent by Distribusion Distribusion can send the booking confirmation email ( including all tickets in pdf and mobile formats ) and cancellation email directly to the customer. Simply set the parameter "send_customer_email": true in the /reservations/confirm request. In this case, the customer’s email address must be collected and provided in the booking request. Distribusion will always send both the pdf and the mobile ticket where available. Booking Confirmation Email Cancellation Confirmation Email Email & Tickets Sent by Retailer Alternatively, you can send your own confirmation and cancellation email to the customer and attach the tickets to that email. Simply set the parameter "send_customer_email": false in the /reservations/confirm request. To create your own email you should use the details from /bookings/{booking_id} endpoint and retrieve the tickets from /bookings/{booking_id}/tickets endpoint. Read our Ticket Types guide for more details. Email & Tickets Sent by Carrier A few carriers, such as Amtrak, manage ticket delivery themselves by sending the confirmation and ticket directly to the customer. For these specific carriers, the carrier sends its own branded confirmation email with the official PDF ticket to the email address used at the time of booking. Consequently, the "send_customer_email": true parameter is ignored, and no email is sent by Distribusion. The /bookings/{booking_id}/tickets endpoint will also not deliver a PDF ticket. Important : For these bookings, only the official ticket sent directly by the carrier is valid for boarding the train. • [Limited Day Content](https://docs.distribusion.com/dt/api/other-concepts/limited-day-content.md): Most carriers are able to deliver a full day of trip content when a /connections/find request is performed. Some such as DB, SNCF, Trenitalia and National Rail only deliver partial content for the day. DB : 5 trips from selected departure time SNCF : 6 trips (up to 12 if ‘twin’ trains are included) from selected departure time Trenitalia : All trips within 3 hours from selected departure time National Rail : 10 trips from selected departure time To solve this limitation we recommend retailers to include the search_bounds[0][departure_start_time] parameter in the request (and optionally the search_bounds[0][departure_end_time] as well) which gives passenger more flexibility to find results for the exact time they need. HTTP https://api.demo.distribusion.com/retailers/v4/connections/find?locale=en¤cy=EUR&search_bounds[0][departure_location][type]=stations&search_bounds[0][departure_location][value][]=FRLYSLYN&search_bounds[0][arrival_location][type]=stations&search_bounds[0][arrival_location][value][]=FRPARPRG&search_bounds[0][departure_date]=2025-11-30&search_bounds[0][departure_start_time]=09%3A00&search_bounds[0][is_requested]=true&passengers[][pax]=1&passengers[][max_age]=25 To allow users to view all departures available within a day, retailers can add "earlier" and "later" links/buttons to the UI, that would make an additional call to retrieve more departures. Then if a passenger requires to load additional trips before or after the period available in the first request a new request can be performed to the /connections/find endpoint with the search_bounds[0][departure_start_time] matching the last trip available of the previous request. The same logic also applies to return trips, and in this case you can also define the departure times of the return leg using search_bounds[0][departure_start_time] and search_bounds[0][departure_end_time] parameters for the return bound. HTTP https://api.demo.distribusion.com/retailers/v4/connections/find?locale=en¤cy=EUR&search_bounds[0][departure_location][type]=stations&search_bounds[0][departure_location][value][]=FRLYSLYN&search_bounds[0][arrival_location][type]=stations&search_bounds[0][arrival_location][value][]=FRPARPRG&search_bounds[0][departure_date]=2025-11-30&search_bounds[0][departure_start_time]=09%3A00&search_bounds[0][departure_end_time]=19%3A30&search_bounds[0][is_requested]=false&search_bounds[1][departure_location][type]=stations&search_bounds[1][departure_location][value][]=FRPARPRG&search_bounds[1][arrival_location][type]=stations&search_bounds[1][arrival_location][value][]=FRLYSLYN&search_bounds[1][departure_date]=2025-12-04&search_bounds[1][departure_start_time]=10%3A30&search_bounds[1][departure_end_time]=15%3A15&offers[][id]=f4d9a54c-8cb8-4251-92ec-170aaf863f38%7C0&search_bounds[1][is_requested]=true&passengers[][pax]=1&passengers[][max_age]=25 • [Fees](https://docs.distribusion.com/dt/api/other-concepts/booking-fees.md): Retailer Fees As a retailer, you have the flexibility to add your own fees on top of the ticket prices sourced from the Distribusion API. These are commonly referred to as mark-ups or service fees and are defined and controlled entirely by you. The most important requirement when adding these fees is transparency. All retailer-added fees must be clearly differentiated from the original carrier offering and price. This means they should be displayed as a separate line item to the customer, for example, on the checkout page. Clearly showing the base ticket price versus the additional service fee builds trust and ensures clarity for the end user. The calculation and application of these fees are handled by your system. Your integration is responsible for adding your fee to the total price received from our API and charging the final combined amount to the customer. Carrier & Distribusion Fees In contrast to retailer-added fees, there are other fees that may originate directly from carriers or from your specific agreement with Distribusion. It's important to understand how each of these is handled, as some are already included in the prices you receive from the API, while others may need to be calculated and added separately. Booking Fees : These fees are set by the some of the carriers and are always already included in the price you get from Distribusion. Markup Fees : These fees might be set by Distribusion for your account (depending on your agreement) and are not included in the price you get from Distribusion. Convenience Fees : These fees are set by the some of the carriers and are always already included in the price you get from Distribusion. • [Booking Fees](https://docs.distribusion.com/dt/api/other-concepts/booking-fees/booking-fees.md): Some carriers might include a booking fee as part of the booking. To find out what carriers have booking fees please contact your partnership manager. The booking fees are chaged per booking and are always included in the prices you get from the API, but we recommend you to disclose this fee to the users as part of your booking flow. This can be done in the check out page only. Optionally, you might also choose to display the initial price on your search results without the booking fee (see more below). Booking Fee Amount Read the booking_fee field for each carrier from the /connections/find endpoint. The fee is always presented as an absolut amount in the currency specified in your request. JSON "attributes": { "booking_fee": 172, "code": "NEXP", "legal_name": "National Express Limited", "markup_fee_percentage": 0.0, "trade_name": "National Express" } Hiding Fees on Search Results Optionally, you can display the initial price on your search results without the booking fee. In this case you should deduct the booking_fee value from the /connections/find price. Therefore, when looking at the price consider the following scenario: Total price : 9.30 Booking fee : 1.81 Price without booking fee : 7.49 Please note that the booking fee is applied per booking and not per passenger, ie. a booking with 2 passengers should still only have the booking fee applied once. Setting Price on Reservation Confirmation While you might choose to show the prices in search results without the booking fee, the amount to capture from the passenger as part of the payment should always be taken including the booking fee. Therefore, it is imperative that the total_price value from the /reservations/create endpoint is taken to load the checkout page and capture the correct payment amount from the customer. API Workflow Call the /connections/find endpoint and check the booking_fee field under the attributes section. The price field for each fare class available via /connections/find endpoint includes the booking fee. All subsequent calls to other endpoints in the flow show the price including the booking fee. You may choose to disclose that price includes a booking fee in the search results page or only in the checkout page. API Examples Sample Request to /connections/find JSON { "locale": "en", "currency": "EUR", "search_bounds": [ { "is_requested": true, "departure_date": "2026-05-27", "departure_start_time": "23:00", "departure_location": { "type": "city", "value": "GBLON" }, "arrival_location": { "type": "city", "value": "GBBRS" } } ], "passengers": [ { "pax": 1, "max_age": 25 } ] } Sample Response from /connections/find JSON { "data": [ { "attributes": { "duration": 8400, "departure_time": "2026-05-27T23:30", "offer_id": null, "arrival_time": "2026-05-28T01:50", "booked_out": false, "electronic_ticket_available": false, "cheapest_fare_class_code": "FARE-2", "total_seats_left": 46, "offer_bundle": null, "leg_type": "outbound", "cheapest_total_adult_price": 736, "co2_kg": 10.237668991088867, "co2e_kg": 11.739866256713867, "co2e_savings": 11.51855182647705 }, "id": "NEXP-GBLONVSA-GBBRSCSA-2026-05-27T23:30-2026-05-28T01:50", "type": "connections", "relationships": { "segments": { "data": [ { "id": "NEXP-GBLONVSA-GBBRSCSA-2026-05-27T23:30-2026-05-28T01:50-0", "type": "segments" } ] }, "fares": { "data": [ { "id": "NEXP-GBLONVSA-GBBRSCSA-2026-05-27T23:30-2026-05-28T01:50-FARE-2", "type": "fares", "price": 736, "fare_class": { "code": "FARE-2", "id": "NEXP-FARE-2", "type": "fare_classes" }, "original_price": 736 }, { "id": "NEXP-GBLONVSA-GBBRSCSA-2026-05-27T23:30-2026-05-28T01:50-FARE-1", "type": "fares", "price": 1092, "fare_class": { "code": "FARE-1", "id": "NEXP-FARE-1", "type": "fare_classes" }, "original_price": 1092 }, { "id": "NEXP-GBLONVSA-GBBRSCSA-2026-05-27T23:30-2026-05-28T01:50-FARE-3", "type": "fares", "price": 3046, "fare_class": { "code": "FARE-3", "id": "NEXP-FARE-3", "type": "fare_classes" }, "original_price": 3046 } ] }, "partial_fares": { "data": [] }, "marketing_carrier": { "data": { "id": "NEXP", "type": "marketing_carriers" } }, "departure_station": { "data": { "id": "GBLONVSA", "type": "stations" } }, "arrival_station": { "data": { "id": "GBBRSCSA", "type": "stations" } } } }, { "attributes": { "duration": 18960, "departure_time": "2026-05-27T23:59", "offer_id": null, "arrival_time": "2026-05-28T05:15", "booked_out": false, "electronic_ticket_available": false, "cheapest_fare_class_code": "FARE-1", "total_seats_left": 50, "offer_bundle": null, "leg_type": "outbound", "cheapest_total_adult_price": 5805, "co2_kg": 10.237668991088867, "co2e_kg": 11.739866256713867, "co2e_savings": 11.51855182647705 }, "id": "NEXP-GBLONVSA-GBBRSCSA-2026-05-27T23:59-2026-05-28T05:15", "type": "connections", "relationships": { "segments": { "data": [ { "id": "NEXP-GBLONVSA-GBBRSCSA-2026-05-27T23:59-2026-05-28T05:15-0", "type": "segments" }, { "id": "NEXP-GBLONVSA-GBBRSCSA-2026-05-27T23:59-2026-05-28T05:15-1", "type": "segments" } ] }, "fares": { "data": [ { "id": "NEXP-GBLONVSA-GBBRSCSA-2026-05-27T23:59-2026-05-28T05:15-FARE-1", "type": "fares", "price": 5805, "fare_class": { "code": "FARE-1", "id": "NEXP-FARE-1", "type": "fare_classes" }, "original_price": 5805 }, { "id": "NEXP-GBLONVSA-GBBRSCSA-2026-05-27T23:59-2026-05-28T05:15-FARE-3", "type": "fares", "price": 6265, "fare_class": { "code": "FARE-3", "id": "NEXP-FARE-3", "type": "fare_classes" }, "original_price": 6265 } ] }, "partial_fares": { "data": [] }, "marketing_carrier": { "data": { "id": "NEXP", "type": "marketing_carriers" } }, "departure_station": { "data": { "id": "GBLONVSA", "type": "stations" } }, "arrival_station": { "data": { "id": "GBBRSCSA", "type": "stations" } } } } ], "meta": { "currency": "EUR", "locale": "en" }, "included": [ { "attributes": { "code": "BUS" }, "id": "BUS", "type": "vehicle_types" }, { "attributes": { "age": 25 }, "id": "pax-25-1", "type": "passengers" }, { "attributes": { "index": 0, "line": "040-N2", "departure_time": "2026-05-27T23:30", "arrival_time": "2026-05-28T01:50", "segment_type": "regular" }, "id": "NEXP-GBLONVSA-GBBRSCSA-2026-05-27T23:30-2026-05-28T01:50-0", "type": "segments", "relationships": { "fares": { "data": [] }, "marketing_carrier": { "data": { "id": "NEXP", "type": "marketing_carriers" } }, "departure_station": { "data": { "id": "GBLONVSA", "type": "stations" } }, "arrival_station": { "data": { "id": "GBBRSCSA", "type": "stations" } }, "vehicle": { "data": { "id": "BUS-NEXP-GBLONVSA-GBBRSCSA-2026-05-27T23:30-2026-05-28T01:50-0", "type": "vehicles" } }, "operating_carrier": { "data": { "id": "NEXP", "type": "operating_carriers" } }, "amenities": { "data": [] } } }, { "id": "BUS-NEXP-GBLONVSA-GBBRSCSA-2026-05-27T23:30-2026-05-28T01:50-0", "type": "vehicles", "relationships": { "vehicle_type": { "data": { "id": "BUS", "type": "vehicle_types" } } } }, { "attributes": { "price": 736, "booking_type": "standalone", "offer_id": "142d9541-80f3-4135-8f28-c5819e23abb4|1", "passenger_ids": [ "pax-25-1" ], "segment_ids": [ "NEXP-GBLONVSA-GBBRSCSA-2026-05-27T23:30-2026-05-28T01:50-0" ], "segment_coverage_type": "collective", "passenger_coverage_type": "collective", "booked_out": null, "seats_left": null, "original_price": 736, "offer_expires_at": "2026-04-14T13:00:07.949760Z" }, "id": "NEXP-GBLONVSA-GBBRSCSA-2026-05-27T23:30-2026-05-28T01:50-FARE-2", "type": "fares", "relationships": { "fare_class": { "data": { "id": "NEXP-FARE-2", "type": "fare_classes" } }, "applied_cards": { "data": [] }, "conditions": { "data": [] }, "promotional_campaigns": { "data": [] } } }, { "attributes": { "price": 1092, "booking_type": "standalone", "offer_id": "142d9541-80f3-4135-8f28-c5819e23abb4|2", "passenger_ids": [ "pax-25-1" ], "segment_ids": [ "NEXP-GBLONVSA-GBBRSCSA-2026-05-27T23:30-2026-05-28T01:50-0" ], "segment_coverage_type": "collective", "passenger_coverage_type": "collective", "booked_out": null, "seats_left": null, "original_price": 1092, "offer_expires_at": "2026-04-14T13:00:07.949760Z" }, "id": "NEXP-GBLONVSA-GBBRSCSA-2026-05-27T23:30-2026-05-28T01:50-FARE-1", "type": "fares", "relationships": { "fare_class": { "data": { "id": "NEXP-FARE-1", "type": "fare_classes" } }, "applied_cards": { "data": [] }, "conditions": { "data": [] }, "promotional_campaigns": { "data": [] } } }, { "attributes": { "price": 3046, "booking_type": "standalone", "offer_id": "142d9541-80f3-4135-8f28-c5819e23abb4|3", "passenger_ids": [ "pax-25-1" ], "segment_ids": [ "NEXP-GBLONVSA-GBBRSCSA-2026-05-27T23:30-2026-05-28T01:50-0" ], "segment_coverage_type": "collective", "passenger_coverage_type": "collective", "booked_out": null, "seats_left": null, "original_price": 3046, "offer_expires_at": "2026-04-14T13:00:07.949760Z" }, "id": "NEXP-GBLONVSA-GBBRSCSA-2026-05-27T23:30-2026-05-28T01:50-FARE-3", "type": "fares", "relationships": { "fare_class": { "data": { "id": "NEXP-FARE-3", "type": "fare_classes" } }, "applied_cards": { "data": [] }, "conditions": { "data": [] }, "promotional_campaigns": { "data": [] } } }, { "attributes": { "index": 0, "line": "030-C2", "departure_time": "2026-05-27T23:59", "arrival_time": "2026-05-28T00:35", "segment_type": "regular" }, "id": "NEXP-GBLONVSA-GBBRSCSA-2026-05-27T23:59-2026-05-28T05:15-0", "type": "segments", "relationships": { "fares": { "data": [] }, "marketing_carrier": { "data": { "id": "NEXP", "type": "marketing_carriers" } }, "departure_station": { "data": { "id": "GBLONVSA", "type": "stations" } }, "arrival_station": { "data": { "id": "GBLONHAT", "type": "stations" } }, "vehicle": { "data": { "id": "BUS-NEXP-GBLONVSA-GBBRSCSA-2026-05-27T23:59-2026-05-28T05:15-0", "type": "vehicles" } }, "operating_carrier": { "data": { "id": "NEXP", "type": "operating_carriers" } }, "amenities": { "data": [] } } }, { "attributes": { "index": 1, "line": "209-AA", "departure_time": "2026-05-28T03:10", "arrival_time": "2026-05-28T05:15", "segment_type": "regular" }, "id": "NEXP-GBLONVSA-GBBRSCSA-2026-05-27T23:59-2026-05-28T05:15-1", "type": "segments", "relationships": { "fares": { "data": [] }, "marketing_carrier": { "data": { "id": "NEXP", "type": "marketing_carriers" } }, "departure_station": { "data": { "id": "GBLONHAT", "type": "stations" } }, "arrival_station": { "data": { "id": "GBBRSCSA", "type": "stations" } }, "vehicle": { "data": { "id": "BUS-NEXP-GBLONVSA-GBBRSCSA-2026-05-27T23:59-2026-05-28T05:15-1", "type": "vehicles" } }, "operating_carrier": { "data": { "id": "NEXP", "type": "operating_carriers" } }, "amenities": { "data": [] } } }, { "id": "BUS-NEXP-GBLONVSA-GBBRSCSA-2026-05-27T23:59-2026-05-28T05:15-0", "type": "vehicles", "relationships": { "vehicle_type": { "data": { "id": "BUS", "type": "vehicle_types" } } } }, { "id": "BUS-NEXP-GBLONVSA-GBBRSCSA-2026-05-27T23:59-2026-05-28T05:15-1", "type": "vehicles", "relationships": { "vehicle_type": { "data": { "id": "BUS", "type": "vehicle_types" } } } }, { "attributes": { "price": 5805, "booking_type": "standalone", "offer_id": "142d9541-80f3-4135-8f28-c5819e23abb4|4", "passenger_ids": [ "pax-25-1" ], "segment_ids": [ "NEXP-GBLONVSA-GBBRSCSA-2026-05-27T23:59-2026-05-28T05:15-0", "NEXP-GBLONVSA-GBBRSCSA-2026-05-27T23:59-2026-05-28T05:15-1" ], "segment_coverage_type": "collective", "passenger_coverage_type": "collective", "booked_out": null, "seats_left": null, "original_price": 5805, "offer_expires_at": "2026-04-14T13:00:07.949760Z" }, "id": "NEXP-GBLONVSA-GBBRSCSA-2026-05-27T23:59-2026-05-28T05:15-FARE-1", "type": "fares", "relationships": { "fare_class": { "data": { "id": "NEXP-FARE-1", "type": "fare_classes" } }, "applied_cards": { "data": [] }, "conditions": { "data": [] }, "promotional_campaigns": { "data": [] } } }, { "attributes": { "price": 6265, "booking_type": "standalone", "offer_id": "142d9541-80f3-4135-8f28-c5819e23abb4|5", "passenger_ids": [ "pax-25-1" ], "segment_ids": [ "NEXP-GBLONVSA-GBBRSCSA-2026-05-27T23:59-2026-05-28T05:15-0", "NEXP-GBLONVSA-GBBRSCSA-2026-05-27T23:59-2026-05-28T05:15-1" ], "segment_coverage_type": "collective", "passenger_coverage_type": "collective", "booked_out": null, "seats_left": null, "original_price": 6265, "offer_expires_at": "2026-04-14T13:00:07.949760Z" }, "id": "NEXP-GBLONVSA-GBBRSCSA-2026-05-27T23:59-2026-05-28T05:15-FARE-3", "type": "fares", "relationships": { "fare_class": { "data": { "id": "NEXP-FARE-3", "type": "fare_classes" } }, "applied_cards": { "data": [] }, "conditions": { "data": [] }, "promotional_campaigns": { "data": [] } } }, { "attributes": { "code": "NEXP", "booking_fee": 172, "legal_name": "National Express Limited", "trade_name": "National Express", "markup_fee_percentage": 0.0 }, "id": "NEXP", "type": "marketing_carriers", "relationships": { "fare_classes": { "data": [ { "id": "NEXP-FARE-1", "type": "fare_classes" }, { "id": "NEXP-FARE-2", "type": "fare_classes" }, { "id": "NEXP-FARE-3", "type": "fare_classes" } ] }, "passenger_types": { "data": [ { "id": "PNOS", "type": "passenger_types" }, { "id": "PINT", "type": "passenger_types" }, { "id": "PCIL", "type": "passenger_types" } ] }, "extra_types": { "data": [] } } }, { "attributes": { "code": "NEXP", "legal_name": "National Express Limited", "trade_name": "National Express" }, "id": "NEXP", "type": "operating_carriers" }, { "attributes": { "code": "PNOS", "name": "Adult", "description": "", "max_age": 99, "min_age": 16 }, "id": "PNOS", "type": "passenger_types" }, { "attributes": { "code": "PINT", "name": "Infant", "description": "", "max_age": 2, "min_age": 0 }, "id": "PINT", "type": "passenger_types" }, { "attributes": { "code": "PCIL", "name": "Child", "description": "", "max_age": 15, "min_age": 3 }, "id": "PCIL", "type": "passenger_types" }, { "attributes": { "code": "GBBRSCSA", "name": "Bristol Bus Station", "description": "The bus station is located between Marlborough Street and 1 Whitson Street. The entrance to the waiting area building is on Whitson Street.", "time_zone": "Europe/London", "latitude": 51.4588432, "longitude": -2.59339729999999, "street_and_number": "Whitson St 1", "zip_code": null }, "id": "GBBRSCSA", "type": "stations", "relationships": { "city": { "data": { "id": "GBBRS", "type": "cities" } }, "area": { "data": null } } }, { "attributes": { "code": "GBLONHAT", "name": "London Heathrow Airport T2 and T3", "description": "The bus station is in front of Terminals 2+3 at Heathrow Airport, near to British Transport Police.", "time_zone": "Europe/London", "latitude": 51.47109, "longitude": -0.45349, "street_and_number": "Inner Ring E", "zip_code": "TW6 1BP" }, "id": "GBLONHAT", "type": "stations", "relationships": { "city": { "data": { "id": "GBLON", "type": "cities" } }, "area": { "data": { "id": "GBLONLA", "type": "areas" } } } }, { "attributes": { "code": "GBLONVSA", "name": "London Victoria Coach Station", "description": "The bus stop is on Buckingham Palace Road, south of Victoria station in the Belgravia district. London Victoria Coach Station is made up of several separate arrival and departure terminals, which have been built up along neighbouring Elizabeth Street. Please contact representative of your bus operator at the coach station to confirm where to board your coach.\nCustomers are advised that Services 702/757/758/OXT ordinarily depart from outside Victoria Coach Station. .", "time_zone": "Europe/London", "latitude": 51.49234506006851, "longitude": -0.14888283967587, "street_and_number": "164 Buckingham Palace Road", "zip_code": "SW1W 9TP" }, "id": "GBLONVSA", "type": "stations", "relationships": { "city": { "data": { "id": "GBLON", "type": "cities" } }, "area": { "data": { "id": "GBLONLV", "type": "areas" } } } }, { "attributes": { "code": "GBBRS", "name": "Bristol" }, "id": "GBBRS", "type": "cities" }, { "attributes": { "code": "GBLON", "name": "London" }, "id": "GBLON", "type": "cities" }, { "attributes": { "code": "GBLONLA", "name": "Heathrow Airport" }, "id": "GBLONLA", "type": "areas" }, { "attributes": { "code": "GBLONLV", "name": "London Victoria " }, "id": "GBLONLV", "type": "areas" }, { "attributes": { "code": "FARE-1", "name": "Standard Fare", "journey_type": "single", "iata_category": null }, "id": "NEXP-FARE-1", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "NEXP-ACON", "type": "fare_features" }, { "id": "NEXP-TOIL", "type": "fare_features" }, { "id": "NEXP-AMEN", "type": "fare_features" }, { "id": "NEXP-WIFI", "type": "fare_features" }, { "id": "NEXP-UCHA", "type": "fare_features" }, { "id": "NEXP-AAFR", "type": "fare_features" }, { "id": "NEXP-NREF", "type": "fare_features" }, { "id": "NEXP-ELUF", "type": "fare_features" }, { "id": "NEXP-STLU", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-2", "name": "Restricted Fare", "journey_type": "single", "iata_category": null }, "id": "NEXP-FARE-2", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "NEXP-ACON", "type": "fare_features" }, { "id": "NEXP-TOIL", "type": "fare_features" }, { "id": "NEXP-NAME", "type": "fare_features" }, { "id": "NEXP-WIFI", "type": "fare_features" }, { "id": "NEXP-UCHA", "type": "fare_features" }, { "id": "NEXP-AAFR", "type": "fare_features" }, { "id": "NEXP-NREF", "type": "fare_features" }, { "id": "NEXP-ELUF", "type": "fare_features" }, { "id": "NEXP-STLU", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-3", "name": "Fully Flexible", "journey_type": "single", "iata_category": null }, "id": "NEXP-FARE-3", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "NEXP-ACON", "type": "fare_features" }, { "id": "NEXP-TOIL", "type": "fare_features" }, { "id": "NEXP-AMEN", "type": "fare_features" }, { "id": "NEXP-WIFI", "type": "fare_features" }, { "id": "NEXP-UCHA", "type": "fare_features" }, { "id": "NEXP-AAFR", "type": "fare_features" }, { "id": "NEXP-REFU", "type": "fare_features" }, { "id": "NEXP-ELUF", "type": "fare_features" }, { "id": "NEXP-STLU", "type": "fare_features" } ] } } }, { "attributes": { "code": "AAFR", "name": "Accessible area for wheelchairs", "description": "Fully collapsible wheelchairs and fully collapsible pushchairs may be stowed free of charge. Passenger have to contact bus operator 36 hours before the departure." }, "id": "NEXP-AAFR", "type": "fare_features" }, { "attributes": { "code": "ACON", "name": "Air Conditioning", "description": "The bus has a cooling ventilation." }, "id": "NEXP-ACON", "type": "fare_features" }, { "attributes": { "code": "AMEN", "name": "Amendable", "description": "The ticket is amendable, passengers can modify departure date and time of the journey. Please proceed via the link https://coach.nationalexpress.com/nxbooking/mmb2ManageMyBooking. A £5 amendment fee is applicable for the Standard Fare. An excess fare may also apply." }, "id": "NEXP-AMEN", "type": "fare_features" }, { "attributes": { "code": "ELUF", "name": "Extra luggage for fee", "description": "Extra luggage for fee" }, "id": "NEXP-ELUF", "type": "fare_features" }, { "attributes": { "code": "NAME", "name": "Non-amendable", "description": "The ticket is not amendable." }, "id": "NEXP-NAME", "type": "fare_features" }, { "attributes": { "code": "NREF", "name": "Non-refundable", "description": "Non refundable." }, "id": "NEXP-NREF", "type": "fare_features" }, { "attributes": { "code": "REFU", "name": "Fully refundable", "description": "The ticket, excluding the booking fee, is refundable and can be cancelled up to 24 hours before departure." }, "id": "NEXP-REFU", "type": "fare_features" }, { "attributes": { "code": "STLU", "name": "Standard Luggage ", "description": "1 x large suitcase (up to 20 kg) and 1 x piece of soft hand luggage (such as a small backpack or handbag) that must fit in the overhead rack or under the seat." }, "id": "NEXP-STLU", "type": "fare_features" }, { "attributes": { "code": "TOIL", "name": "Toilet", "description": "A toilet is available on board." }, "id": "NEXP-TOIL", "type": "fare_features" }, { "attributes": { "code": "UCHA", "name": "USB charger", "description": "USB plug is available at each seat. " }, "id": "NEXP-UCHA", "type": "fare_features" }, { "attributes": { "code": "WIFI", "name": "Wifi", "description": "Free wifi is available on board." }, "id": "NEXP-WIFI", "type": "fare_features" } ], "jsonapi": { "version": "1.0" } } • [Markup Fees](https://docs.distribusion.com/dt/api/other-concepts/booking-fees/markup-fees.md): Depending on your agreement with Distribusion you might have to include markup fees in the prices you get via API. To find out what carriers can have markup fees applied to your account please contact your partnership manager. The markup fees are not included in the prices you get from the API, so it is important to display and charge this fee as part of your booking flow. The fee can be only displayed in the check out page, but you might want to show this upfront to the user starting from the seach results page. Markup Fee Amount Read the markup_fee_percentage field for each carrier from the /connections/find endpoint. The fee is always presented as a percentage. JSON "attributes": { "booking_fee": 0, "code": "RJET", "legal_name": "Student Agency k.s.", "markup_fee_percentage": 4.0, "trade_name": "RegioJet" } For other endpoints such as /connections/vacancy , /reservations/{reservation_id} , /bookings/{booking_id} and /cancellations/conditions , the fee is presented in the ammount field an absolute value based on the price of the trip selected. JSON "included": [ { "id": "MRKP-0", "type": "fees", "attributes": { "code": "MRKP", "name": "markup fee", "component": "retailer", "included_in_price": null, "amount": 100 } } ] Calculating Price Whether a percentage or an absolute value is presented, this should be added to the price of the trip. For the /connections/find endpoint where the fee is presented as a percentage, consider the following scenario: Price from API : 25.00 Markup percentage : 4.00% Price with markup fee (to be calculated by you) : 26.00 For the other endpoints where the fee is presented as an absolute value, consider the following scenario: Price from API : 25.00 Markup amount : 1.00 Price with markup fee (to be calculated by you) : 26.00 We highly recommend that when you decide to show the price with the markup fee, the you fully disclose to user that a fee is included. API Workflow Call the /connections/find endpoint and check the markup_fee_percentage field under the attributes section. The price field for each fare class available via /connections/find endpoint does not included the markup fee. If you want to display the fee to users in this step, use the calculation logic above. Check if the price of the trip is still the same using /connections/vacancy . If you want to display the fee to users in this step, use the calculation logic above. Create the reservation using the /reservations/create endpoint. At this point the fee must be displayed to the users using the calculation logic above and must be charged from users as part of their payment. All subsequent steps must show the price and the markup fee. API Examples Sample Request to /connections/find JSON { "locale": "en", "currency": "EUR", "search_bounds": [ { "is_requested": true, "departure_date": "2026-05-28", "departure_start_time": "19:00", "departure_location": { "type": "city", "value": "DEBER" }, "arrival_location": { "type": "city", "value": "CZPRG" } } ], "passengers": [ { "pax": 1, "max_age": 25 } ] } Sample Response from /connections/find JSON { "data": [ { "attributes": { "duration": 16200, "departure_time": "2026-05-28T19:00", "arrival_time": "2026-05-28T23:30", "offer_id": null, "booked_out": false, "electronic_ticket_available": false, "cheapest_fare_class_code": "FARE-15", "total_seats_left": 57, "offer_bundle": null, "leg_type": "outbound", "cheapest_total_adult_price": 1790, "co2_kg": 18.325712203979492, "co2e_kg": 21.019020080566406, "co2e_savings": 22.523975372314453 }, "id": "RJET-DEBERCBS-CZPRGZOB-2026-05-28T19:00-2026-05-28T23:30", "type": "connections", "relationships": { "segments": { "data": [ { "id": "RJET-DEBERCBS-CZPRGZOB-2026-05-28T19:00-2026-05-28T23:30-0", "type": "segments" } ] }, "fares": { "data": [ { "id": "RJET-DEBERCBS-CZPRGZOB-2026-05-28T19:00-2026-05-28T23:30-FARE-15", "type": "fares", "price": 1790, "fare_class": { "code": "FARE-15", "id": "RJET-FARE-15", "type": "fare_classes" }, "original_price": 1790 }, { "id": "RJET-DEBERCBS-CZPRGZOB-2026-05-28T19:00-2026-05-28T23:30-FARE-14", "type": "fares", "price": 2090, "fare_class": { "code": "FARE-14", "id": "RJET-FARE-14", "type": "fare_classes" }, "original_price": 2090 } ] }, "partial_fares": { "data": [] }, "marketing_carrier": { "data": { "id": "RJET", "type": "marketing_carriers" } }, "departure_station": { "data": { "id": "DEBERCBS", "type": "stations" } }, "arrival_station": { "data": { "id": "CZPRGZOB", "type": "stations" } } } } ], "meta": { "currency": "EUR", "locale": "en" }, "included": [ { "attributes": { "age": 25 }, "id": "pax-25-1", "type": "passengers" }, { "attributes": { "code": "BUS" }, "id": "BUS", "type": "vehicle_types" }, { "attributes": { "index": 0, "line": "263", "departure_time": "2026-05-28T19:00", "arrival_time": "2026-05-28T23:30", "segment_type": "regular" }, "id": "RJET-DEBERCBS-CZPRGZOB-2026-05-28T19:00-2026-05-28T23:30-0", "type": "segments", "relationships": { "fares": { "data": [] }, "vehicle": { "data": { "id": "BUS-RJET-DEBERCBS-CZPRGZOB-2026-05-28T19:00-2026-05-28T23:30-0", "type": "vehicles" } }, "marketing_carrier": { "data": { "id": "RJET", "type": "marketing_carriers" } }, "departure_station": { "data": { "id": "DEBERCBS", "type": "stations" } }, "arrival_station": { "data": { "id": "CZPRGZOB", "type": "stations" } }, "operating_carrier": { "data": { "id": "RJET", "type": "operating_carriers" } }, "amenities": { "data": [] } } }, { "id": "BUS-RJET-DEBERCBS-CZPRGZOB-2026-05-28T19:00-2026-05-28T23:30-0", "type": "vehicles", "relationships": { "vehicle_type": { "data": { "id": "BUS", "type": "vehicle_types" } } } }, { "attributes": { "price": 1790, "booking_type": "standalone", "offer_id": "c92ed581-7d97-4935-ba2b-390388168d81|46", "passenger_ids": [ "pax-25-1" ], "segment_ids": [ "RJET-DEBERCBS-CZPRGZOB-2026-05-28T19:00-2026-05-28T23:30-0" ], "segment_coverage_type": "collective", "passenger_coverage_type": "collective", "booked_out": false, "seats_left": 19, "original_price": 1790, "offer_expires_at": "2026-04-14T13:10:11.179794Z" }, "id": "RJET-DEBERCBS-CZPRGZOB-2026-05-28T19:00-2026-05-28T23:30-FARE-15", "type": "fares", "relationships": { "applied_cards": { "data": [] }, "fare_class": { "data": { "id": "RJET-FARE-15", "type": "fare_classes" } }, "conditions": { "data": [] }, "promotional_campaigns": { "data": [] } } }, { "attributes": { "price": 2090, "booking_type": "standalone", "offer_id": "c92ed581-7d97-4935-ba2b-390388168d81|47", "passenger_ids": [ "pax-25-1" ], "segment_ids": [ "RJET-DEBERCBS-CZPRGZOB-2026-05-28T19:00-2026-05-28T23:30-0" ], "segment_coverage_type": "collective", "passenger_coverage_type": "collective", "booked_out": false, "seats_left": 38, "original_price": 2090, "offer_expires_at": "2026-04-14T13:10:11.179794Z" }, "id": "RJET-DEBERCBS-CZPRGZOB-2026-05-28T19:00-2026-05-28T23:30-FARE-14", "type": "fares", "relationships": { "applied_cards": { "data": [] }, "fare_class": { "data": { "id": "RJET-FARE-14", "type": "fare_classes" } }, "conditions": { "data": [] }, "promotional_campaigns": { "data": [] } } }, { "attributes": { "code": "RJET", "booking_fee": 0, "legal_name": "RegioJet a.s.", "trade_name": "RegioJet", "markup_fee_percentage": 0.0 }, "id": "RJET", "type": "marketing_carriers", "relationships": { "fare_classes": { "data": [ { "id": "RJET-FARE-14", "type": "fare_classes" }, { "id": "RJET-FARE-15", "type": "fare_classes" } ] }, "passenger_types": { "data": [ { "id": "PNOS", "type": "passenger_types" }, { "id": "PSEI", "type": "passenger_types" }, { "id": "PCUN", "type": "passenger_types" }, { "id": "PCIL", "type": "passenger_types" }, { "id": "PCUT", "type": "passenger_types" } ] }, "extra_types": { "data": [] } } }, { "attributes": { "code": "RJET", "legal_name": "RegioJet a.s.", "trade_name": "RegioJet" }, "id": "RJET", "type": "operating_carriers" }, { "attributes": { "code": "PNOS", "name": "Adult", "description": "", "max_age": 64, "min_age": 18 }, "id": "PNOS", "type": "passenger_types" }, { "attributes": { "code": "PSEI", "name": "Seniors over 65", "description": "", "max_age": 99, "min_age": 65 }, "id": "PSEI", "type": "passenger_types" }, { "attributes": { "code": "PCUN", "name": "Young Adult 18-25", "description": "", "max_age": 17, "min_age": 13 }, "id": "PCUN", "type": "passenger_types" }, { "attributes": { "code": "PCIL", "name": "Child", "description": "", "max_age": 12, "min_age": 6 }, "id": "PCIL", "type": "passenger_types" }, { "attributes": { "code": "PCUT", "name": "Children 0-6", "description": "", "max_age": 5, "min_age": 0 }, "id": "PCUT", "type": "passenger_types" }, { "attributes": { "code": "CZPRGZOB", "name": "Prague Florenc Central Bus Station", "description": "The bus station is located on Křižíkova 2110/2b.\nThere's Denni Bar Florenc and Florence Tourist Center.", "time_zone": "Europe/Prague", "latitude": 50.08958911322947, "longitude": 14.44074203035995, "street_and_number": "Křižíkova 2110/2b", "zip_code": "186 00" }, "id": "CZPRGZOB", "type": "stations", "relationships": { "city": { "data": { "id": "CZPRG", "type": "cities" } }, "area": { "data": { "id": "CZPRGPB", "type": "areas" } } } }, { "attributes": { "code": "DEBERCBS", "name": "Berlin Central Bus Station", "description": "The Berlin Central Bus Station is located close to the S-Bahn Station \"Berlin Messe Nord\" (lines S41, S42 and S46).\nIn case of waiting times, a waiting area with 130 seats and a snack bar can help passengers stay relaxed and comfortable.", "time_zone": "Europe/Berlin", "latitude": 52.507589, "longitude": 13.279692, "street_and_number": "Masurenallee 4-6", "zip_code": "14057" }, "id": "DEBERCBS", "type": "stations", "relationships": { "city": { "data": { "id": "DEBER", "type": "cities" } }, "area": { "data": { "id": "DEBERBE", "type": "areas" } } } }, { "attributes": { "code": "CZPRG", "name": "Prague" }, "id": "CZPRG", "type": "cities" }, { "attributes": { "code": "DEBER", "name": "Berlin" }, "id": "DEBER", "type": "cities" }, { "attributes": { "code": "CZPRGPB", "name": "Prague Central Bus Station" }, "id": "CZPRGPB", "type": "areas" }, { "attributes": { "code": "DEBERBE", "name": "Berlin Central Bus Station" }, "id": "DEBERBE", "type": "areas" }, { "attributes": { "code": "FARE-14", "name": "Relax (Bus)", "journey_type": "single", "iata_category": "Economy Class" }, "id": "RJET-FARE-14", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "RJET-WIFI", "type": "fare_features" }, { "id": "RJET-MAGA", "type": "fare_features" }, { "id": "RJET-DRIN", "type": "fare_features" }, { "id": "RJET-MSYS", "type": "fare_features" }, { "id": "RJET-PSOC", "type": "fare_features" }, { "id": "RJET-TOIL", "type": "fare_features" }, { "id": "RJET-ACON", "type": "fare_features" }, { "id": "RJET-REFU", "type": "fare_features" } ] } } }, { "attributes": { "code": "FARE-15", "name": "Standard (Bus)", "journey_type": "single", "iata_category": "Economy Class" }, "id": "RJET-FARE-15", "type": "fare_classes", "relationships": { "fare_features": { "data": [ { "id": "RJET-WIFI", "type": "fare_features" }, { "id": "RJET-MAGA", "type": "fare_features" }, { "id": "RJET-DRIN", "type": "fare_features" }, { "id": "RJET-MSYS", "type": "fare_features" }, { "id": "RJET-PSOC", "type": "fare_features" }, { "id": "RJET-TOIL", "type": "fare_features" }, { "id": "RJET-ACON", "type": "fare_features" }, { "id": "RJET-REFU", "type": "fare_features" } ] } } }, { "attributes": { "code": "ACON", "name": "Air Conditioning", "description": "The vehicle has a cooling ventilation system." }, "id": "RJET-ACON", "type": "fare_features" }, { "attributes": { "code": "DRIN", "name": "Drinks", "description": "Drinks are available on board." }, "id": "RJET-DRIN", "type": "fare_features" }, { "attributes": { "code": "MAGA", "name": "Magazines", "description": "Magazines are available on board." }, "id": "RJET-MAGA", "type": "fare_features" }, { "attributes": { "code": "MSYS", "name": "Media System", "description": "A media system is available on board." }, "id": "RJET-MSYS", "type": "fare_features" }, { "attributes": { "code": "PSOC", "name": "Power Socket", "description": "Power supply is available at every seat." }, "id": "RJET-PSOC", "type": "fare_features" }, { "attributes": { "code": "REFU", "name": "Fully refundable", "description": "The ticket can be cancelled for a full refund up to 15 minutes before departure." }, "id": "RJET-REFU", "type": "fare_features" }, { "attributes": { "code": "TOIL", "name": "Toilet", "description": "A toilet is available on board." }, "id": "RJET-TOIL", "type": "fare_features" }, { "attributes": { "code": "WIFI", "name": "Wifi", "description": "Free wifi is available on board." }, "id": "RJET-WIFI", "type": "fare_features" } ], "jsonapi": { "version": "1.0" } } Sample Request to /connections/vacancy JSON { "locale": "en", "currency": "EUR", "offers": [ { "id": "c92ed581-7d97-4935-ba2b-390388168d81|47", "passenger_ids": [ "pax-25-1" ] } ], "passengers": [ { "id": "pax-25-1", "type": "PNOS", "pax": 1 } ] } Sample Response from /connections/vacancy JSON { "data": { "id": "RJET-DEBERCBS-CZPRGZOB-2026-05-28T19:00-2026-05-28T23:30", "type": "vacancies", "attributes": { "vacant": true, "total_price": 2500, "original_price": 2500 }, "relationships": { "agent": { "data": null }, "customer": { "data": null }, "applied_cards": { "data": [] }, "fees": { "data": [ { "id": "MRKP-0", "type": "fees" } ] }, "ancillary_options": { "data": [] }, "connection_passengers": { "data": [ { "id": "PNOS-1-1776170811", "type": "passengers" } ] }, "required_attributes": { "data": [ { "id": "82db72ce-1131-4eec-a170-84b29197538f", "type": "required_attributes" }, { "id": "24211c06-1640-4176-8778-93d3dd7b5b4a", "type": "required_attributes" } ] } } }, "jsonapi": { "version": "1.0" }, "meta": { "currency": "EUR" }, "included": [ { "id": "PNOS-1-1776170811", "type": "passengers", "relationships": { "required_attributes": { "data": [ { "id": "2dc55386-8bc7-4e78-89d5-6b84c6cf9c46", "type": "passenger_required_attributes" }, { "id": "e853c851-9f4b-4ea4-b919-95fd11f8efcc", "type": "passenger_required_attributes" } ] } } }, { "id": "2dc55386-8bc7-4e78-89d5-6b84c6cf9c46", "type": "passenger_required_attributes", "attributes": { "mandatory": [], "endpoint": "reservations/create" } }, { "id": "e853c851-9f4b-4ea4-b919-95fd11f8efcc", "type": "passenger_required_attributes", "attributes": { "mandatory": [ "first_name", "last_name" ], "endpoint": "reservations/confirm", "internal_source": true } }, { "id": "82db72ce-1131-4eec-a170-84b29197538f", "type": "required_attributes", "attributes": { "mandatory": [], "endpoint": "reservations/create" } }, { "id": "24211c06-1640-4176-8778-93d3dd7b5b4a", "type": "required_attributes", "attributes": { "mandatory": [ "city", "email", "first_name", "last_name", "street_and_number", "zip_code", "terms_accepted" ], "endpoint": "reservations/confirm" } }, { "id": "MRKP-0", "type": "fees", "attributes": { "code": "MRKP", "name": "markup fee", "component": "retailer", "included_in_price": null, "amount": 100 } } ] } • [Convenience Fees](https://docs.distribusion.com/dt/api/other-concepts/booking-fees/convenience-fees.md): PT Kereta Api Indonesia is one of the carriers that include a convenience fee as part of the booking. To be sure if any of the carriers you work with have convenience fees please contact your partnership manager. The convenience fees are included in the prices you get from the /connections/find endpoint, but info about their amount start to be presented in the subsequent endpoints in the flow: /connections/vacancy , /reservations/create , /reservations/confirm , /reservations/{reservation_id} and /bookings/{booking_id} . It is mandatory to disclose this fee to the users as part of your booking flow, ideally in the check out page. Convenience Fee Amount Read the CONV section in the response from /connections/vacancy endpoint. The fee is always presented as an absolut amount in the currency specified in your request. JSON "included": [ { "id": "CONV", "type": "fees", "attributes": { "code": "CONV", "name": "Convenience Fee", "component": "Distribusion", "included_in_price": true, "amount": 750000 } } ] Showing Convenience Fee and Ticket Price In your checkout page you must clearly identify the convenience fee. Ticket Price = total_price - convenience_fee Convenience Fee = convenience_fee Booking Fee = (added by you, if any) Total Price = total_price API Workflow Call the /connections/find endpoint and check the prices normally. These already include the convenience fee, but the response doesn't show the fee amount yet. In the /connections/vacancy endpoint the prices also include the convenience fee. The section CONV will display the amount of the convenience fee that is already included in the total_price . All subsequent API responses in the flow will show the total_price including the convenience fee. Besides that the convenience fee amount appears in the /reservations/{reservation_id} and /bookings/{booking_id} endpoints as well. In the checkout page we recommend you display the convenience fee to the user. At this point, by using the total_price info the fee will be charged from users as part of their payment. API Examples Sample Request to /connections/vacancy JSON { "locale": "en", "currency": "EUR", "offers": [ { "id": "fe374d98-da03-467d-9b28-821b19940bbf|0", "passenger_ids": [ "pax-25-1" ] } ], "passengers": [ { "id": "pax-25-1", "type": "PNOS", "pax": 1 } ] } Sample Response from /connections/vacancy JSON { "data": { "id": "JUNK-IDBDOBBA-IDJARGBA-2026-05-09T14:40-2026-05-09T14:50", "type": "vacancies", "attributes": { "vacant": true, "total_price": 200, "original_price": 200 }, "relationships": { "agent": { "data": null }, "customer": { "data": null }, "applied_cards": { "data": [] }, "fees": { "data": [ { "id": "CONV", "type": "fees" } ] }, "ancillary_options": { "data": [] }, "connection_passengers": { "data": [ { "id": "PNOS-1-1776171389", "type": "passengers" } ] }, "required_attributes": { "data": [ { "id": "9761cead-bd43-4fd1-9429-73ec1e027c42", "type": "required_attributes" }, { "id": "069b8ece-d42a-44d4-bc08-d90b00321d16", "type": "required_attributes" } ] } } }, "jsonapi": { "version": "1.0" }, "meta": { "currency": "EUR" }, "included": [ { "id": "CONV", "type": "fees", "attributes": { "code": "CONV", "name": "Convenience fee", "component": "distribusion", "included_in_price": true, "amount": 39 } }, { "id": "PNOS-1-1776171389", "type": "passengers", "relationships": { "required_attributes": { "data": [ { "id": "cb814228-3ac3-4d5a-b10c-56dc772ef4f7", "type": "passenger_required_attributes" }, { "id": "005ebde3-8d58-4c1e-940b-30e6911a0df5", "type": "passenger_required_attributes" } ] } } }, { "id": "cb814228-3ac3-4d5a-b10c-56dc772ef4f7", "type": "passenger_required_attributes", "attributes": { "mandatory": [ "birthdate", "first_name", "government_id", "government_id_type", "last_name" ], "endpoint": "reservations/create", "internal_source": true } }, { "id": "005ebde3-8d58-4c1e-940b-30e6911a0df5", "type": "passenger_required_attributes", "attributes": { "mandatory": [ "government_id", "government_id_type", "first_name", "last_name" ], "endpoint": "reservations/confirm", "internal_source": true } }, { "id": "9761cead-bd43-4fd1-9429-73ec1e027c42", "type": "required_attributes", "attributes": { "mandatory": [ "email", "first_name", "last_name", "phone" ], "endpoint": "reservations/create" } }, { "id": "069b8ece-d42a-44d4-bc08-d90b00321d16", "type": "required_attributes", "attributes": { "mandatory": [ "terms_accepted" ], "endpoint": "reservations/confirm" } } ] } Sample Request to /reservations/{reservation_id} HTTP https://api.demo.distribusion.com/retailers/v4/reservations/RHSHR6SF Sample Response from /reservations/{reservation_id} JSON { "data": { "id": "RHSHR6SF", "type": "reservations", "attributes": { "total_price": 35750000, "original_price": 35750000, "state": "confirmed", "created_at": "2025-02-24T07:51", "confirmed_at": "2025-02-24T07:56", "cancelled_at": null, "failed_at": null, "processing_started_at": "2025-02-24T07:56", "processing_deadline": null, "expires_at": "2025-02-24T07:58", "terms_version": null, "title": null, "first_name": null, "last_name": null, "email": null, "phone": null, "city": null, "zip_code": null, "country_code": null, "street_and_number": null, "gender": null, "country_of_birth": null, "government_id_type": null, "marketing_carrier_reservation_ids": [ "ZC98DVR-133" ], "agent_id": null, "retailer_booking_number": null }, "relationships": { "booking": { "data": { "id": "5RS9Tj_bwpyCuGfO-kOjHQ", "type": "bookings" } }, "utm_params": { "data": null }, "errors": { "data": [] }, "reservation_passengers": { "data": [ { "id": "R-PNOS-1-JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12", "type": "reservation_passengers" }, { "id": "R-PNOS-2-JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12", "type": "reservation_passengers" } ] }, "applied_cards": { "data": [] }, "ancillaries": { "data": [] }, "custom_fields": { "data": [] } } }, "jsonapi": { "version": "1.0" }, "meta": { "locale": "en", "currency": "IDR" }, "included": [ { "id": "R-PNOS-1-JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12", "type": "reservation_passengers", "attributes": { "first_name": "test1", "last_name": "DT", "serial_code": null, "government_id_type": "passport_id", "nationality": null, "gender": null, "country_of_birth": null, "birthdate": "1996-11-02", "type": "PNOS", "seat_number": null } }, { "id": "R-PNOS-2-JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12", "type": "reservation_passengers", "attributes": { "first_name": "test2", "last_name": "DT", "serial_code": null, "government_id_type": "passport_id", "nationality": null, "gender": null, "country_of_birth": null, "birthdate": "1996-11-20", "type": "PNOS", "seat_number": null } }, { "id": "5RS9Tj_bwpyCuGfO-kOjHQ", "type": "bookings", "attributes": { "departure_time": "2025-03-15T11:05", "arrival_time": "2025-03-15T14:12", "duration": 11220, "title": "mr", "first_name": "test1", "last_name": "DT", "email": "test@test.com", "phone": "+0 123 456 78 90", "city": "Berlin", "zip_code": "13355", "street_and_number": "Wattstrasse 10", "payment_method": "demand_note", "payment_token": null, "payer_id": null, "tax_id": null, "vat_number": null, "business_name": null, "total_price": 35750000, "original_price": 35750000, "marketing_carrier_booking_number": "ZC98DVR", "pax": 2, "flight_number": null, "distribusion_booking_number": "IVXC11", "marketing_carrier_booking_numbers": [ "ZC98DVR" ], "terms_accepted": true, "send_customer_email": true, "retailer_partner_number": "170886", "connection_reference": null, "created_at": "2025-02-24T07:56" }, "relationships": { "fare_class": { "data": { "id": "JUNK-FARE-14", "type": "fare_classes" } }, "outbound_connection": { "data": { "id": "JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12", "type": "connections" } }, "inbound_connection": { "data": null }, "amended_by": { "data": null }, "result_of_amendment": { "data": null }, "segments": { "data": [ { "id": "JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12-0", "type": "segments" } ] }, "passengers": { "data": [ { "id": "PNOS-1-JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12", "type": "passengers" }, { "id": "PNOS-2-JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12", "type": "passengers" } ] }, "fees": { "data": [ { "id": "IVXC11-0-CONV", "type": "fees" } ] }, "applied_cards": { "data": [] } } }, { "id": "JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12-0", "type": "segments", "attributes": { "departure_time": "2025-03-15T11:05", "arrival_time": "2025-03-15T14:12", "original_price": null, "index": 0, "vehicle_number": "PARAHYANGAN DEV (133)", "departure_platform": null, "line": null, "line_prefix": null }, "relationships": { "departure_station": { "data": { "id": "IDBDOBBA", "type": "stations" } }, "arrival_station": { "data": { "id": "IDJARGBA", "type": "stations" } }, "operating_carrier": { "data": { "id": "JUNK", "type": "operating_carriers" } }, "marketing_carrier": { "data": { "id": "JUNK", "type": "marketing_carriers" } }, "vehicle": { "data": { "id": "TRAIN-JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12-0", "type": "vehicles" } }, "segment_passengers": { "data": [ { "id": "PNOS-1-JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12-0", "type": "segment_passengers" }, { "id": "PNOS-2-JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12-0", "type": "segment_passengers" } ] }, "ancillaries": { "data": [] } } }, { "id": "PNOS-1-JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12-0", "type": "segment_passengers", "attributes": { "seat_number": "EKS-1,4A", "marketing_carrier_passenger_id": null }, "relationships": { "passenger": { "data": { "id": "PNOS-1-JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12", "type": "passengers" } }, "ticket": { "data": null }, "applied_cards": { "data": [] }, "ancillaries": { "data": [] } } }, { "id": "PNOS-2-JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12-0", "type": "segment_passengers", "attributes": { "seat_number": "EKS-1,4B", "marketing_carrier_passenger_id": null }, "relationships": { "passenger": { "data": { "id": "PNOS-2-JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12", "type": "passengers" } }, "ticket": { "data": null }, "applied_cards": { "data": [] }, "ancillaries": { "data": [] } } }, { "id": "PNOS-1-JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12", "type": "passengers", "attributes": { "first_name": "test1", "last_name": "DT", "serial_code": "CONNEC8055ZC98DVR1", "type": "PNOS" } }, { "id": "PNOS-2-JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12", "type": "passengers", "attributes": { "first_name": "test2", "last_name": "DT", "serial_code": "CONNEC8055ZC98DVR2", "type": "PNOS" } }, { "id": "JUNK-FARE-14", "type": "fare_classes", "attributes": { "code": "FARE-14", "name": "Executive - I", "iata_category": null, "journey_type": "single" }, "relationships": { "post_booking_condition": { "data": null }, "fare_features": { "data": [ { "id": "JUNK-ACON", "type": "fare_features" }, { "id": "JUNK-PSOC", "type": "fare_features" }, { "id": "JUNK-ALRO", "type": "fare_features" }, { "id": "JUNK-RARM", "type": "fare_features" }, { "id": "JUNK-MSYS", "type": "fare_features" }, { "id": "JUNK-TOIL", "type": "fare_features" }, { "id": "JUNK-CCTV", "type": "fare_features" }, { "id": "JUNK-TABN", "type": "fare_features" }, { "id": "JUNK-NREF", "type": "fare_features" } ] }, "ticket_validity_rules": { "data": [ { "id": "JUNK-FARE-14-TICKET_VALIDITY_RULE-0", "type": "ticket_validity_rules" } ] }, "passenger_group_rules": { "data": [ { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-0", "type": "passenger_group_rules" }, { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-1", "type": "passenger_group_rules" }, { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-2", "type": "passenger_group_rules" } ] } } }, { "id": "JUNK-ACON", "type": "fare_features", "attributes": { "code": "ACON", "name": "Air Conditioning", "description": "The vehicle has a cooling ventilation system." } }, { "id": "JUNK-PSOC", "type": "fare_features", "attributes": { "code": "PSOC", "name": "Power Socket", "description": "Power supply is available at every seat." } }, { "id": "JUNK-ALRO", "type": "fare_features", "attributes": { "code": "ALRO", "name": "Additional Leg Room", "description": "The seat has additional leg space." } }, { "id": "JUNK-RARM", "type": "fare_features", "attributes": { "code": "RARM", "name": "Reclining armchairs", "description": "Comfortable armchairs are available on board." } }, { "id": "JUNK-MSYS", "type": "fare_features", "attributes": { "code": "MSYS", "name": "Media System", "description": "A media system is available on board." } }, { "id": "JUNK-TOIL", "type": "fare_features", "attributes": { "code": "TOIL", "name": "Toilet", "description": "A toilet is available on board." } }, { "id": "JUNK-CCTV", "type": "fare_features", "attributes": { "code": "CCTV", "name": "24/7 monitoring room/ CCTV", "description": "24/7 monitoring room/ CCTV" } }, { "id": "JUNK-TABN", "type": "fare_features", "attributes": { "code": "TABN", "name": "Table seat included", "description": "Table seat included" } }, { "id": "JUNK-NREF", "type": "fare_features", "attributes": { "code": "NREF", "name": "Non-refundable", "description": "The ticket cannot be refunded." } }, { "id": "JUNK-FARE-14-TICKET_VALIDITY_RULE-0", "type": "ticket_validity_rules", "attributes": { "rule_type": "outbound", "reference_time_type": "departure_time", "use_type": "once", "offset_type": "minutes", "duration_type": "minutes", "offset": 0, "duration": 0 } }, { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-0", "type": "passenger_group_rules", "attributes": { "rule_type": "passengers_type_requires_passengers_types", "description": "1A-1F" }, "relationships": { "parameters": { "data": [ { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-0-PARAMETER-0", "type": "passenger_group_rule_parameters" }, { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-0-PARAMETER-1", "type": "passenger_group_rule_parameters" } ] } } }, { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-1", "type": "passenger_group_rules", "attributes": { "rule_type": "passengers_type_ratio", "description": "1A-1F" }, "relationships": { "parameters": { "data": [ { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-1-PARAMETER-0", "type": "passenger_group_rule_parameters" }, { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-1-PARAMETER-1", "type": "passenger_group_rule_parameters" }, { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-1-PARAMETER-2", "type": "passenger_group_rule_parameters" } ] } } }, { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-2", "type": "passenger_group_rules", "attributes": { "rule_type": "max_passengers", "description": "max_passenger" }, "relationships": { "parameters": { "data": [ { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-2-PARAMETER-0", "type": "passenger_group_rule_parameters" } ] } } }, { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-0-PARAMETER-0", "type": "passenger_group_rule_parameters", "attributes": { "name": "dependent_passengers_types", "value": [ "PINT" ] } }, { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-0-PARAMETER-1", "type": "passenger_group_rule_parameters", "attributes": { "name": "required_passengers_types", "value": [ "PNOS" ] } }, { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-1-PARAMETER-0", "type": "passenger_group_rule_parameters", "attributes": { "name": "ratio_from_types", "value": [ "PINT" ] } }, { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-1-PARAMETER-1", "type": "passenger_group_rule_parameters", "attributes": { "name": "ratio_to_types", "value": [ "PNOS" ] } }, { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-1-PARAMETER-2", "type": "passenger_group_rule_parameters", "attributes": { "name": "ratio", "value": 1 } }, { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-2-PARAMETER-0", "type": "passenger_group_rule_parameters", "attributes": { "name": "passengers_limit", "value": 8 } }, { "id": "IVXC11-0-CONV", "type": "fees", "attributes": { "code": "CONV", "name": "Convenience fee", "component": "distribusion", "included_in_price": true, "amount": 750000 } }, { "id": "JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12", "type": "connections", "attributes": { "departure_time": "2025-03-15T11:05", "arrival_time": "2025-03-15T14:12" }, "relationships": { "departure_station": { "data": { "id": "IDBDOBBA", "type": "stations" } }, "arrival_station": { "data": { "id": "IDJARGBA", "type": "stations" } }, "marketing_carrier": { "data": { "id": "JUNK", "type": "marketing_carriers" } }, "segments": { "data": [ { "id": "JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12-0", "type": "segments" } ] }, "fees": { "data": [] } } } ] } • [Timezones](https://docs.distribusion.com/dt/api/other-concepts/timezones.md): Correctly interpreting timestamps is essential when using our API. This section outlines how timezones are applied across different fields. Station-Specific Times For fields related to specific station events, such as departure_time and arrival_time , the timezone is always the local time of that particular station. This applies even if a trip spans multiple timezones. Consider a trip from Lisbon (PTLISLBS) to Milan (ITMILMVI): JSON { "attributes": { "arrival_time": "2025-05-29T05:15", "booked_out": false, "cheapest_fare_class_code": "FARE-1", "cheapest_total_adult_price": 13646, "departure_time": "2025-05-27T09:35", "duration": 153600, "electronic_ticket_available": false, "leg_type": "outbound", "offer_bundle": null, "offer_id": null, "total_seats_left": 23 }, "id": "FLIU-PTLISLBS-ITMILMVI-2025-05-27T09:35-2025-05-29T05:15", "relationships": { "arrival_station": { "data": { "id": "ITMILMVI", "type": "stations" } }, "departure_station": { "data": { "id": "PTLISLBS", "type": "stations" } }, "fares": { "data": [ { "fare_class": { "code": "FARE-1", "id": "FLIU-FARE-1", "type": "fare_classes" }, "id": "FLIU-PTLISLBS-ITMILMVI-2025-05-27T09:35-2025-05-29T05:15-FARE-1", "original_price": 13646, "price": 13646, "type": "fares" } ] }, "marketing_carrier": { "data": { "id": "FLIU", "type": "marketing_carriers" } }, "segments": { "data": [ { "id": "FLIU-PTLISLBS-ITGENGVF-2025-05-27T09:35-2025-05-28T16:05-0", "type": "segments" }, { "id": "FLIU-ITGENGVF-ITSIIFVC-2025-05-28T18:20-2025-05-28T21:00-1", "type": "segments" }, { "id": "FLIU-ITSIIFVC-ITMILMVI-2025-05-29T01:50-2025-05-29T05:15-2", "type": "segments" } ] } }, "type": "connections" } Here's how to interpret it: departure_time: "2025-05-27T09:35" is the local time in Lisbon when the trip begins. arrival_time: "2025-05-29T05:15" is the local time in Milan when the trip ends. duration: 153600 seconds (which is 42 hours and 40 minutes) is the actual, total travel time. This duration accurately bridges the local departure time in Lisbon and the local arrival time in Milan, automatically accounting for the one-hour timezone difference between them (as Milan is ahead of Lisbon). Essentially, departure_time and arrival_time tell you what the clock at the station shows. The duration confirms the true length of the journey. General System Times For non-station-specific timestamps, such as those related to reservation lifecycle or processing, the timezone is consistently Germany's local time. This means the times will be in either Central European Time (CET) or Central European Summer Time (CEST), automatically accounting for daylight saving changes. For example, in a response from the /reservations/create endpoint: JSON { "data": { "id": "RRYZCKBP", "type": "reservations", "attributes": { "total_price": 2485, "original_price": 2485, "state": "created", "created_at": "2025-05-20T16:08", "confirmed_at": null, "cancelled_at": null, "failed_at": null, "processing_started_at": null, "processing_deadline": null, "expires_at": "2025-05-20T16:38", ... created_at: "2025-05-20T16:08" means the reservation was created on May 20th, 2025, at 16:08 CEST (Central European Summer Time, UTC+2), as May falls within the daylight saving period for Germany. expires_at: "2025-05-20T16:38" means the reservation will expire at 16:38 CEST on the same day. Always interpret these general system timestamps as being in the current local time for Germany. • [Currencies](https://docs.distribusion.com/dt/api/other-concepts/currencies.md): The Distribusion API supports the majority of global currencies. Please specify your desired currency in each respective request to the API as specified in the Searching for trips section. Prices in the Distribusion API are provided in fractional currency unit, except for KRW and JPY, which are returned as full units due to the nature of the currencies. Example: 1 EUR will be presented as value 100 in the API while 1 JPY will be presented as value 1 in the API Table of supported currencies Distribusion Currency Code Currency Name AED United Arab Emirates Dirham AFN Afghan Afghani ALL Albanian Lek AMD Armenian Dram ANG Netherlands Antillean Guilder AOA Angolan Kwanza ARS Argentine Peso AUD Australian Dollar AWG Aruban Florin AZN Azerbaijani Manat BAM Bosnia-Herzegovina Convertible Mark BBD Barbadian Dollar BDT Bangladeshi Taka BGN Bulgarian Lev BHD Bahraini Dinar BIF Burundian Franc BMD Bermudan Dollar BND Brunei Dollar BOB Bolivian Boliviano BRL Brazilian Real BSD Bahamian Dollar BTN Bhutanese Ngultrum BWP Botswanan Pula BYR Belarusian Ruble BZD Belize Dollar CAD Canadian Dollar CDF Congolese Franc CHF Swiss Franc CLF Chilean Unit of Account (UF) CLP Chilean Peso CNY Chinese Yuan COP Colombian Peso CRC Costa Rican Colón CUP Cuban Peso CVE Cape Verdean Escudo CZK Czech Republic Koruna DJF Djiboutian Franc DKK Danish Krone DOP Dominican Peso DZD Algerian Dinar EGP Egyptian Pound ERN Eritrean Nakfa ETB Ethiopian Birr EUR Euro FJD Fijian Dollar FKP Falkland Islands Pound GBP British Pound Sterling GEL Georgian Lari GHS Ghanaian Cedi GIP Gibraltar Pound GMD Gambian Dalasi GNF Guinean Franc GTQ Guatemalan Quetzal GYD Guyanaese Dollar HKD Hong Kong Dollar HNL Honduran Lempira HRK Croatian Kuna HTG Haitian Gourde HUF Hungarian Forint IDR Indonesian Rupiah ILS Israeli New Sheqel INR Indian Rupee IQD Iraqi Dinar IRR Iranian Rial ISK Icelandic Króna JMD Jamaican Dollar JOD Jordanian Dinar JPY Japanese Yen KES Kenyan Shilling KGS Kyrgystani Som KHR Cambodian Riel KMF Comorian Franc KPW North Korean Won KRW South Korean Won KWD Kuwaiti Dinar KYD Cayman Islands Dollar KZT Kazakhstani Tenge LAK Laotian Kip LBP Lebanese Pound LKR Sri Lankan Rupee LRD Liberian Dollar LSL Lesotho Loti LYD Libyan Dinar MAD Moroccan Dirham MDL Moldovan Leu MGA Malagasy Ariary MKD Macedonian Denar MMK Myanma Kyat MNT Mongolian Tugrik MOP Macanese Pataca MRO Mauritanian Ouguiya MUR Mauritian Rupee MVR Maldivian Rufiyaa MWK Malawian Kwacha MXN Mexican Peso MYR Malaysian Ringgit MZN Mozambican Metical NAD Namibian Dollar NGN Nigerian Naira NIO Nicaraguan Córdoba NOK Norwegian Krone NPR Nepalese Rupee NZD New Zealand Dollar OMR Omani Rial PAB Panamanian Balboa PEN Peruvian Nuevo Sol PGK Papua New Guinean Kina PHP Philippine Peso PKR Pakistani Rupee PLN Polish Zloty PYG Paraguayan Guarani QAR Qatari Rial RON Romanian Leu RSD Serbian Dinar RUB Russian Ruble RWF Rwandan Franc SAR Saudi Riyal SBD Solomon Islands Dollar SCR Seychellois Rupee SDG Sudanese Pound SEK Swedish Krona SGD Singapore Dollar SHP Saint Helena Pound SLL Sierra Leonean Leone SOS Somali Shilling SRD Surinamese Dollar STD São Tomé and Príncipe Dobra SVC Salvadoran Colón SYP Syrian Pound SZL Swazi Lilangeni THB Thai Baht TJS Tajikistani Somoni TMT Turkmenistani Manat TND Tunisian Dinar TOP Tongan Paʻanga TRY Turkish Lira TTD Trinidad and Tobago Dollar TWD New Taiwan Dollar TZS Tanzanian Shilling UAH Ukrainian Hryvnia UGX Ugandan Shilling USD United States Dollar UYU Uruguayan Peso UZS Uzbekistan Som VND Vietnamese Dong VUV Vanuatu Vatu WST Samoan Tala XAF CFA Franc BEAC XCD East Caribbean Dollar XOF CFA Franc BCEAO XPF CFP Franc YER Yemeni Rial ZAR South African Rand ZMW Zambian Kwacha ZWL Zimbabwean Dollar • [Languages](https://docs.distribusion.com/dt/api/other-concepts/languages.md): The Distribusion API supports the majority of locales. Please specify your desired locale in each respective request to the API as specified in the Searching for trips section. Table of Supported Locales Locale Name Distribusion Locale Code Bulgarian bg Chinese zh Croatian hr Czech cs Danish da Dutch nl English en French fr German de Hungarian hu Indonesian id Italian it Polish pl Portuguese pt Romanian ro Russian ru Spanish es Swedish sv Thai th Turkish tr Ukrainian uk Vietnamese vi Where available, local language translations are provided for metadata such as station names, station descriptions, and amenities. • [Webhooks](https://docs.distribusion.com/dt/api/other-concepts/webhooks.md): Introduction Webhooks allow you to get automated notifications about specific events on Distribusion side. Currently, we are supporting the following: Booking : Notification for new bookings. Cancellation : Notification for new cancellations. Amendment : Notification for new amendments. Contact your Partnership Manager to configure your webhook. You should share your webhook URLs for both demo and production environments. In each case, we ensure immediate information about the actual booking, cancellation and amendment so the retailer can use the information received to automate their internal flows. For example, in case of a new booking a subsequent call can be made to the /bookings/{booking_id} endpoint to get the full booking details. Or in case of a carrier cancellation the retailer can also update the booking in their own data base to have status cancelled , process refunds if needed, as well as informing the customer or their internal customer support. Retry Mechanism A webhook retry is a process that resends a failed webhook notification. Retrying ensures higher reliability and successful delivery of event notifications. At Distribusion, retries are implemented with a schedule of 60 seconds, repeated up to 5 times. This approach helps ensure important messages, like cancellation events, are delivered even if the initial attempt fails. Request Details Headers The headers of the request include relevant information about the event, with the most important information being: x-distribusion-event : The type of the event, e.g. "ping", "cancellation", "booking" or “amendment”. x-distribusion-delivery : The uuid of this delivery, can be used to look up the event via api. x-distribusion-signature : The SHA256 HMAC hex digest of the secret key and body. Body Content The request body is json-api serialized data of the event. Types of events: Ping : In the case of a ping, it's empty. Booking : In case of a booking, the response includes the booking id . To retrieve the full booking details make an additional request to the /bookings/{booking_id} endpoint. Cancellation : In case of a cancellation, the response also includes the cancellation id and the booking_id . besides other info such as price, fee and refund amounts. To retrieve other booking and cancellation details make an additional request to the /bookings/{booking_id} endpoint. Amendment : In case of an amendment, the response includes the amendment id , the booking_id of the original booking that originated the amendment and new_booking_id of the new booking created as a result of the amendment. To retrieve the full booking details of each booking make an additional request to the /bookings/{booking_id} endpoint or use the amendment id in the /amendments/{amendment_id} endpoint. You should always use the x-distribusion-event header to know how to interpret the body response. Securing Your Endpoint When Distribusion configures your webhook, we share a secret key in a format such as 358fa65d-fe8c-489c-abd1-644a31abb46b . This secret key encrypted with SHA256 HMAC will appear under the x-distribusion-signature header and can used to verify that the requests to your endpoint are really from Distribusion. Booking Request Sample Headers (main items) x-distribusion-event: booking x-distribusion-delivery: 5167cf32-e877-465a-b508-59a7eba42bb9 x-distribusion-signature: sha256=f0e38064551fa02e111ed202c269cb6c1d79d587d8caf4261e736298adf1a145 Sample Body Content JSON { "data": { "id": "BAjb86Bc-qHIbpP78M8Z_g", "type": "bookings", "attributes": { "id": "BAjb86Bc-qHIbpP78M8Z_g", "created_at": "2025-03-18T17:07", "utm_params": null, "retailer_booking_number": null, "retailer_partner_number": "222222", "distribusion_booking_number": "HX1GQF", "marketing_carrier_booking_numbers": [ "DEMOBNUM01" ] } }, "jsonapi": { "version": "1.0" } } Cancellation Request Sample Headers (main items) x-distribusion-event: cancellation x-distribusion-delivery: 9a0ae763-47bf-4801-8463-9bb43e222e85 x-distribusion-signature: sha256=e4cf1b6e2ebe610db83d8819a27dc107cb62f7b3d2994ec9f0e01519b3b4bc7f Sample Body Content JSON { "data": { "id": "a7VAsfs0sE9AMTHCI0bpgg", "type": "cancellations", "attributes": { "fee": 0, "state": "confirmed", "reason": null, "created_at": "2025-01-10T14:06", "total_price": 2500, "total_refund": 2500, "voucher_refund": 0, "monetary_refund": 2500, "confirmation_expected_at": null }, "relationships": { "fees": { "data": [] }, "vouchers": { "data": [] } } }, "meta": { "source": "Retailer", "currency": "EUR", "booking_id": "Ai7ieaOteDlQIS-RVdioxg", "retailer_booking_number": null, "retailer_partner_number": "222222", "distribusion_booking_number": "AIXFPC", "marketing_carrier_booking_numbers": [ "RP4GBJIL" ] }, "jsonapi": { "version": "1.0" }, "included": [] } Amendment Request Sample Headers (main items) x-distribusion-event: amendment x-distribusion-delivery: 6a712051-b188-4efa-a346-9a403b60eddb x-distribusion-signature: sha256=2cc5383def7fdc5ef664faa497f68b4ad1fa18fb25f612a718288036f0165d41 Sample Body Content JSON { "data": { "id": "AOJIW411", "type": "amendments", "attributes": { "id": "AOJIW411", "state": "confirmed", "created_at": "2025-01-13T02:59", "delta_price": 0, "amendment_fee": 0 } }, "meta": { "locale": "en", "currency": "EUR", "booking_id": "CpYqKuAB8xGojOjusgC9TQ", "new_booking_id": "8-oYOfsrxThDkqxvKKGGGQ", "retailer_booking_number": null, "retailer_partner_number": "222222", "distribusion_booking_number": "H91FWW", "marketing_carrier_booking_numbers": [ "8892213" ] }, "jsonapi": { "version": "1.0" } } Testing If your webhook URLs are not configured from your side yet you can test our webhooks using a test tool such as Webhook Tester . Once the webhook URL is in place and registered with Distribusion, you can try communication by triggering a ping. Ping Plain text curl -X POST \ https: //api.distribusion.com/retailers/v4/webhooks/ping \ --header 'Content-Type: application/json' \ --header 'Accept: application/vnd.api+json' \ --header 'Api-Key: e3c3e6a6-6494-475c-bb7e-f96e2ce47d91' \ curl -X POST \ https: //api.distribusion.com/retailers/v4/webhooks/ping \ --header 'Content-Type: application/json' \ --header 'Accept: application/vnd.api+json' \ --header 'Api-Key: e3c3e6a6-6494-475c-bb7e-f96e2ce47d91' \ Response JSON { "data": { "id": "75d2de48-4e2f-405a-b835-5f0aeb6d2a19", "type": "webhook_deliveries" }, "jsonapi": { "version": "1.0" } } Event Look Up The ping is handled asynchronously, and you can look up the event with the ID: curl -X GET \ Plain text curl -X GET \ https: //api.distribusion.com/retailers/v4/webhooks/deliveries/75d2de48-4e2f-4 05a-b835-5f0aeb6d2a19 \ --header 'Content-Type: application/json' \ --header 'Accept: application/vnd.api+json' \ --header 'Api-Key: e3c3e6a6-6494-475c-bb7e-f96e2ce47d91' curl -X GET \ https: //api.distribusion.com/retailers/v4/webhooks/deliveries/75d2de48-4e2f-4 05a-b835-5f0aeb6d2a19 \ --header 'Content-Type: application/json' \ --header 'Accept: application/vnd.api+json' \ --header 'Api-Key: e3c3e6a6-6494-475c-bb7e-f96e2ce47d91' Response JSON { "data": { "id": "75d2de48-4e2f-405a-b835-5f0aeb6d2a19", "type": "webhook_deliveries", "attributes": { "success": true, "event_type": "ping", "payload": null, "created_at": "2019-01-01T01:00", "started_at": "2019-01-01T01:00", "duration": 1.0, "request": { "url": "http://myhost.com/my-webhook", "headers": { "X-Distribusion-Delivery": "75d2de48-4e2f-405a-b835-5f0aeb6d2a19", "X-Distribusion-Event": "ping", "X-Distribusion-Signature": "sha256=20ebc0f09344470134f35040f63ea98b1d8e414212949ee5c500429d15eab081" } }, "response": { "body": "thanks", "headers": { "Some-Response-Header-Name": "some-response-header-value" }, "http_status": 201, "error_message": "" } } }, "jsonapi": { "version": "1.0" } } • [API Endpoints](https://docs.distribusion.com/dt/api/api-endpoints.md): Below you'll find the list of endpoints available in Distribusion. • [Connections](https://docs.distribusion.com/dt/api/api-endpoints/connections.md): The Connections section of the Distribusion API allows users to access and manage connections with various transportation providers. Users can retrieve information about available routes, schedules, and pricing for different transportation services through this API section. It is also possible to check if price and vacancy are still valid and to select seats (when supported by the carrier). • [/connections/find](https://docs.distribusion.com/dt/api/api-endpoints/connections/connections-find.md) • [/connections/vacancy](https://docs.distribusion.com/dt/api/api-endpoints/connections/connections-vacancy.md): Checks the vacancy status of a connection based on the provided parameters. • [/seats_availability](https://docs.distribusion.com/dt/api/api-endpoints/seats/seats_availability.md) • [/layouts](https://docs.distribusion.com/dt/api/api-endpoints/seats/layouts.md) • [Reservations](https://docs.distribusion.com/dt/api/api-endpoints/reservations.md): The Reservations section of the Distribusion API allows users to create reservations, cancel reservations, confirm reservations and retrieve detailed information about existing reservations made through the platform. • [/reservations/create](https://docs.distribusion.com/dt/api/api-endpoints/reservations/reservations-create.md): Creates a new reservation in the system based on the provided parameters. • [/reservations/confirm](https://docs.distribusion.com/dt/api/api-endpoints/reservations/reservations-confirm.md): Confirms an existing reservation. Required fields vary per carrier — beyond the baseline ( reservation_id , execute_payment , payment_method , terms_accepted , send_customer_email , and the passengers[] array), additional fields may be required depending on the carrier. Consult mandatory_attributes (top-level fields) and passenger_mandatory_attributes (per-passenger fields) on the /connections/vacancy response to determine the exact requirements for your booking. • [/reservations/{reservation_id}](https://docs.distribusion.com/dt/api/api-endpoints/reservations/reservations-reservation_id.md): Retrieves a reservation from the system based on the provided reservation ID. • [/reservations/cancel](https://docs.distribusion.com/dt/api/api-endpoints/reservations/reservations-cancel.md): Cancel an existing reservation in the system. • [Bookings](https://docs.distribusion.com/dt/api/api-endpoints/bookings.md): The Bookings section of the Distribusion API allows users to retrieve detailed information about existing bookings made through the platform. With this functionality, users can effectively manage and track bookings, such as viewing booking status, passenger details, trip information and tickets. • [/bookings](https://docs.distribusion.com/dt/api/api-endpoints/bookings/bookings.md): Retrieves a bookings from the system based on the provided params. • [/bookings/{booking_id}](https://docs.distribusion.com/dt/api/api-endpoints/bookings/bookings-booking_id.md): Retrieves a booking from the system based on the provided booking ID. • [/bookings/{booking_id}/tickets](https://docs.distribusion.com/dt/api/api-endpoints/bookings/bookings-booking_id-tickets.md): Retrieves a booking tickets from the system based on the provided booking ID. • [/bookings/{booking_id}/resend_confirmation_email](https://docs.distribusion.com/dt/api/api-endpoints/bookings/bookings-booking_id-resend_confirmation_email.md) • [Cancellations](https://docs.distribusion.com/dt/api/api-endpoints/cancellations.md): The Bookings section of the Distribusion API allows users to check cancellation conditions of existing bookings and cancel bookings. • [/cancellations/conditions](https://docs.distribusion.com/dt/api/api-endpoints/cancellations/cancellations-conditions.md): Retrieves the cancellation conditions for a booking. • [/cancellations/create](https://docs.distribusion.com/dt/api/api-endpoints/cancellations/cancellations-create.md): Creates a cancellation request for a booking. • [Cards](https://docs.distribusion.com/dt/api/api-endpoints/cards.md): The Cards section of the Distribusion API allows users to manage payment cards associated with their account. Users can add, remove, and update card details, as well as retrieve information about stored cards. This section provides a convenient way for users to securely handle payment methods for transactions within the platform. • [/cards](https://docs.distribusion.com/dt/api/api-endpoints/cards/cards.md): Returns a list of cards available for booking. • [Stations, Areas & Cities](https://docs.distribusion.com/dt/api/api-endpoints/stations-areas-and-cities.md): The Stations, Areas & Cities section of the Distribusion API provides users with access to data related to transportation hubs, geographical areas, and urban locations. With this section, users can retrieve information about specific stations, browse through different areas, and discover various cities to enhance their travel booking and planning experiences. • [/stations](https://docs.distribusion.com/dt/api/api-endpoints/stations-areas-and-cities/stations.md): Retrieves stations for carriers activated on your credentials, with optional filtering, pagination and includes • [/stations/{station_code}](https://docs.distribusion.com/dt/api/api-endpoints/stations-areas-and-cities/stations-station_code.md): Retrieves a station from the system based on the provided station ID. • [/connected_stations](https://docs.distribusion.com/dt/api/api-endpoints/stations-areas-and-cities/connected_stations.md): Streams all available connected stations with optional filtering and pagination • [/areas](https://docs.distribusion.com/dt/api/api-endpoints/stations-areas-and-cities/areas.md): Retrieves all available areas with optional pagination and includes • [/cities](https://docs.distribusion.com/dt/api/api-endpoints/stations-areas-and-cities/cities.md): Retrieves all available cities with optional pagination and includes • [Marketing Carriers](https://docs.distribusion.com/dt/api/api-endpoints/marketing-carriers.md): The Marketing Carriers section of the Distribusion API provides users with access to detailed information about carriers that can be used for marketing purposes. Users can retrieve data related to carrier profiles, services offered, and other marketing-related details to effectively promote services and products to potential customers. This section allows users to target specific carriers and tailor marketing strategies to optimize reach and engagement. • [/marketing_carriers](https://docs.distribusion.com/dt/api/api-endpoints/marketing-carriers/marketing_carriers.md): Returns a list of all marketing carriers available to the authenticated user. • [/marketing_carriers/{marketing_carrier_id}](https://docs.distribusion.com/dt/api/api-endpoints/marketing-carriers/marketing_carriers-marketing_carrier_id.md): Retrieves detailed information about a specific marketing carrier. • [/marketing_carriers/{marketing_carrier_id}/stations](https://docs.distribusion.com/dt/api/api-endpoints/marketing-carriers/marketing_carriers-marketing_carrier_id-stations.md): Returns a list of all stations served by a specific marketing carrier. • [/marketing_carriers/{marketing_carrier_id}/booking/schema](https://docs.distribusion.com/dt/api/api-endpoints/marketing-carriers/marketing_carriers-marketing_carrier_id-booking-schema.md): Returns the booking schema for a specific marketing carrier. • [📣 What's New](https://docs.distribusion.com/dt/api/what-s-new.md): Welcome to the product hub for our API! This is your go-to place to stay informed about the latest features, enhancements, and important updates we're rolling out. We're constantly working to improve your experience and expand the capabilities of our platform. Check back often to see what's new! Launching the New Offers Flow May 14, 2026 We’ve introduced the new Offers flow as the official booking workflow in our API documentation. This update simplifies the integration process by replacing repeated trip and fare parameters with a persistent offer_id, generated during /connections/find and reused in the following /connections/vacancy and /reservations/create steps. The flow also introduces cleaner request payloads for search and vacancy, unified location objects and passenger IDs that can be tracked consistently across the booking journey. Reservation confirmation, booking retrieval, tickets and cancellation endpoints remain unchanged, helping you adopt the new flow without changing post-booking operations. For implementation details and migration guidance, please refer to the New Offers Flow Explained guide. The flow is enabled on a per-account basis, so please contact your Partnership Manager to activate it for your API credentials. Unified Support for Alternative Station Identifiers Nov 25, 2025 To provide greater flexibility when integrating with external travel systems, we’ve introduced a new conceptual framework for Alternative Station Identifiers. This enhancement allows you to use a wider variety of industry-standard codes—such as UIC, IATA, and other third-party identifiers—interchangeably across our API. This unified approach simplifies the mapping process between your internal databases and our platform, ensuring more reliable search and booking workflows when working with diverse data sources. For more details on implementation, please refer to our Alternative Station Identifiers guide . Introducing the Retailer Agent Sep 18, 2025 We are thrilled to announce the launch of our new Retailer Agent. This powerful AI tool is designed to guide your customers through the entire pre-sales journey, from searching for connections to completing a booking. The Retailer Agent acts as a virtual assistant, helping users find routes, compare options, and navigate the booking process in a conversational manner. Enhance your user experience and boost conversions by providing instant, automated assistance. For more details, please see the complete Retailer Agent documentation and contact your Partnership Manager to enable this advanced feature. Introducing our MCP Server Jul 29, 2025 We are excited to introduce our new Retailer API MCP Server , an implementation designed to wrap the functionalities of Distribusion's Retailer API. This server is intended for use by AI Agents or Agentic applications that support MCP communication, operating in a server-to-server fashion. It exposes various tools, including search_stations , search_cities , search_areas , connections_find , connections_vacancy , get_checkout_link , price_calendar , and get_carrier_info , each corresponding to a Retailer API endpoint. To learn more about connecting and utilizing this enterprise API feature, please refer to its dedicated documentation and contact your Partnership Manager for access. Search by UIC and IATA Codes Jul 17, 2025 We've expanded our search capabilities to allow querying connections using industry-standard IATA airport codes and UIC train station codes. This enhancement provides greater flexibility for integrations and caters to various search preferences, especially for European rail stations. For more details on how to implement these search methods in /connections/find , please refer to the IATA and UIC Codes Search guide . Search by Geo Coordinates Apr 1, 2025 You can now search for available connections using precise geographic coordinates (latitude and longitude with a defined radius), moving beyond reliance on predefined station lists. This feature is particularly useful when your users have exact locations (e.g., a hotel address) as part of their search in /connections/find , or if you prefer to use your own stored location data. To understand how to implement this, please refer to the Geo Coordinate Search guide . Introducing the Post-Sales AI Bot May 12, 2025 You can now elevate your customer support by integrating our new Post-Sales AI Bot, designed to power intelligent post-sales chatbots without requiring you to build the AI. This enterprise feature automates Level 1 support by enabling your chatbot to understand and answer common, booking-specific customer queries in multiple languages—from retrieving booking details and station locations to providing luggage policies and cancellation information. To learn more about its capabilities and how to get started, please check our Post-Sales AI Bot guide . Reach out to your Partnership Manager to unlock this advanced feature. Easily Handle Dynamic Passenger Data Requirements May 9, 2025 To help you streamline bookings across various carriers, we've introduced enhanced ways to dynamically determine required passenger information. As different carriers often have unique data needs (like name, date of birth, or document details), you can now ensure successful bookings and improve user experience. Simply fetch carrier-specific passenger field requirements in advance using the new /marketing_carriers/{marketing_carrier_id}/booking/schema endpoint, or retrieve these details dynamically within your booking flow from the /connections/vacancy and /reservations/create endpoint responses. Integrating this allows you to adapt your forms and validation on the fly, reducing errors and ensuring compliance. For full details, please see the Dynamic Passenger Details guide . Enhanced Search Precision with Departure Times for Return Trips Mar 19, 2025 You can now offer more precise search results for round trips by specifying desired departure time windows for the return journey. Complementing the existing departure_start_time and departure_end_time parameters available for the initial leg in /connections/find endpoint, we've introduced return_start_time and return_end_time . Using these new parameters allows users to narrow down their return travel options to specific times of day, significantly improving the search experience, especially for carriers with extensive offerings like Deutsche Bahn. Integrate these parameters into your search requests to provide more targeted and convenient results. Find out more it in our Serching for Trips guide . UIC Codes Now Available for European Rail Stations January 16, 2025 We've enhanced our station data by adding UIC (International Union of Railways) codes for European rail stations. These unique identifiers can help simplify mapping to other systems and provide a familiar, industry-standard reference. You'll find the uic_station_code attribute directly within the station object in responses from the /stations and /stations/{station_code} endpoints for relevant stations. For more details on UIC and other external location codes, please see the Preparing Metadata guide . New leg_type Field in Search Responses Nov 8, 2024 We've added a leg_type field as an attribute to /connections/find search responses, clearly labeling each leg as "outbound" or "inbound". This human-readable parameter simplifies your integration by removing the need for custom logic to determine journey direction and is consistently present for all trips. This enhancement makes directional information easier to use directly from the API. • [Errors](https://docs.distribusion.com/dt/api/errors.md): The list of errors possible are listed below and is available in English only: Error Code HTTP Status Code Description RequestInvalidError 400 400.100.000 Request invalid InvalidBodyError 400 400.100.001 Invalid Body Error BookingValidationError 400 400.100.041 Booking is invalid or missing BookingIdValidationError 400 400.100.042 Booking id is invalid AgentEmailValidationError 400 400.101.000 Agent email is invalid or missing DepartureStationsValidationError 400 400.101.002 Departure stations are invalid or missing ArrivalStationsValidationError 400 400.101.003 Arrival stations are invalid or missing DepartureStationValidationError 400 400.101.004 Departure station is invalid or missing ArrivalStationValidationError 400 400.101.005 Arrival station is invalid or missing DepartureDateValidationError 400 400.101.006 Departure date is invalid or missing DepartureTimeValidationError 400 400.101.007 Departure time is invalid or missing DepartureTimeInPastValidationError 400 400.101.007 Departure time is in the past ArrivalTimeValidationError 400 400.101.008 Arrival time is invalid or missing PaxValidationError 400 400.101.009 PAX is invalid or missing PassengerLimitReachedValidationError 400 400.101.009 (Título não definido) RetailerPartnerNumberValidationError 400 400.101.010 Retailer partner number is invalid or missing PaymentMethodValidationError 400 400.101.011 Payment method is invalid or missing PaymentTokenValidationError 400 400.101.012 Payment token is invalid or missing PayerIdValidationError 400 400.101.013 Payer ID is invalid or missing LocaleValidationError 400 400.101.014 Locale is invalid or missing CurrencyValidationError 400 400.101.015 Currency is invalid or missing DistribusionBookingNumberValidationError 400 400.101.017 Distribusion booking number is invalid or missing TitleValidationError 400 400.101.018 Title is invalid or missing FirstNameValidationError 400 400.101.019 First name is invalid or missing LastNameValidationError 400 400.101.020 Last name is invalid or missing EmailValidationError 400 400.101.021 Email is invalid or missing PhoneValidationError 400 400.101.022 Phone is invalid or missing CityValidationError 400 400.101.023 City is invalid or missing ZipCodeValidationError 400 400.101.024 Zip code is invalid or missing StreetAndNumberValidationError 400 400.101.025 Street and number is invalid or missing TotalPriceValidationError 400 400.101.026 Total price is invalid or missing CustomerCurrencyValidationError 400 400.101.027 Customer currency is invalid or missing SendCustomerEmailValidationError 400 400.101.029 Send customer email is invalid or missing PassengersFirstNameValidationError 400 400.101.030 Passenger first name is invalid or missing PassengersLastNameValidationError 400 400.101.031 Passenger last name is invalid or missing PassengersTypeValidationError 400 400.101.032 Passenger type is invalid or missing TermsAcceptedValidationError 400 400.101.035 Terms accepted is invalid or missing FlightNumberValidationError 400 400.101.036 Flight number is invalid or missing ExtrasTypeValidationError 400 400.101.037 Extras type is invalid or missing ExtrasQuantityValidationError 400 400.101.038 Extras quantity is invalid or missing MarketingCarrierValidationError 400 400.101.040 Marketing carrier is invalid or missing IdValidationError 400 400.101.041 ID is invalid or missing IdsValidationError 400 400.101.041 Ids is invalid or missing ExecutePaymentValidationError 400 400.101.042 Execute payment is invalid or missing StationValidationError 400 400.101.043 Station is invalid or missing PassengersPaxValidationError 400 400.101.048 Passenger pax is invalid or missing DepartureTimeAfterArrivalTimeValidationError 400 400.101.049 Departure time must be before arrival time ExtrasValidationError 400 400.101.050 Extras are invalid or missing PassengersValidationError 400 400.101.051 Passengers are invalid or missing CreatedAtValidationError 400 400.101.052 Created at is invalid or missing FareClassValidationError 400 400.101.053 Fare class is invalid SendMarketingEmailsValidationError 400 400.101.054 send_marketing_emails is invalid... ReturnFareClassValidationError 400 400.101.056 Return fare class is invalid RoundTripFareClassValidationError 400 400.101.057 Round trip offers must have matching fare classes GovernmentIdValidationError 400 400.101.058 Government ID is invalid or missing GovernmentIdTypeValidationError 400 400.101.059 Government ID type is invalid or missing ReturnDepartureTimeValidationError 400 400.101.060 return_departure_time is invalid or missing ReturnArrivalTimeValidationError 400 400.101.061 return_arrival_time is invalid or missing ReturnDepartureAndArrivalTimeMustBeFilledValidationError 400 400.101.062 Both return_departure_time and return_arrival_time must be filled ReturnDepartureTimeMustBeBeforeReturnArrivalTimeValidationError 400 400.101.063 return_departure_time should be a datetime before return_arrival_time ArrivalTimeMustBeBeforeReturnDepartureTimeValidationError 400 400.101.064 arrival_time should be a datetime before return_departure_time PassengersGovernmentIdValidationError 400 400.101.065 Passenger government ID is invalid or missing PassengersGovernmentIdTypeValidationError 400 400.101.066 Passenger government ID type is invalid or missing PassengersSeatsSegmentIndexValidationError 400 400.101.067 Passenger seat segment index is invalid or missing PassengersSeatsSeatCodeValidationError 400 400.101.068 Passenger seat code is invalid or missing PassengersBirthdateValidationError 400 400.101.069 Passenger birthdate is invalid or missing CustomFieldsValidationError 400 400.101.069 Custom fields max of 10 are allowed... InstallmentsNumberValidationError 400 400.101.070 Installments number invalid or missing InstallmentsMonthlyAmountValidationError 400 400.101.071 Installments monthly amount invalid or missing InstallmentsTotalAmountValidationError 400 400.101.072 Installments monthly amount invalid or missing InstallmentsInterestRateValidationError 400 400.101.073 Installments interest rate invalid or missing PassengersNationalityValidationError 400 400.101.074 Passenger nationality is invalid or missing PageNumberValidationError 400 400.101.075 Page number is invalid or missing PageSizeValidationError 400 400.101.076 Page size is invalid or missing MultValidationError 400 400.101.077 Mult is invalid IncorrectPaymentMethodValidationError 400 400.101.079 This payment method is not allowed for this pair of carrier and retailer AreaValidationError 400 400.101.082 Area is invalid or missing ReservedPassengersMissmatchValidationError 400 400.101.083 Provided passengers do not match reserved passengers PassengerDependencyMissedValidationError 400 400.101.086 (Título não definido) PassengerMaxRatioExceededValidationError 400 400.101.087 (Título não definido) ShowSeatNumberValidationError 400 400.101.088 Show seat number status is missing SerialCodeValidationError 400 400.101.089 Serial code is invalid CarrierTicketInfoValidationError 400 400.101.090 Carrier ticket info is invalid IncludeValidationError 400 400.101.091 Include is invalid MarketingCarrierCodeValidationError 400 400.101.092 Marketing carrier codes are invalid TypeValidationError 400 400.101.093 Type is invalid PassengerPaxWithCardsValidationError 400 400.101.094 Passenger pax cannot be more than 1... PassengersCardsNameValidationError 400 400.101.095 Passenger card name is invalid or missing CardsNameValidationError 400 400.101.096 Card name is invalid or missing PassengersCardsValidationError 400 400.101.097 Passenger cards are invalid or missing CardsValidationError 400 400.101.098 Cards are invalid or missing TermsVersionValidationError 400 400.101.099 Terms And Conditions Version is invalid or missing AncillariesValidationError 400 400.101.100 Ancillary does not exist AncillariesPriceValidationError 400 400.101.101 Ancillary price is invalid or missing AncillariesNotSupportedValidationError 400 400.101.102 Ancillary not supported ReservationHoldValidationError 400 400.101.103 Reservation hold is not valid PassengersCountryOfBirthValidationError 400 400.101.104 Passenger country of birth is invalid or missing PassengersGenderValidationError 400 400.101.105 Passenger gender is invalid or missing PassengersGovernmentIdIssuingCountryValidationError 400 400.101.106 Passenger government ID issuing country is invalid or missing PassengersGovernmentIdValidityStartValidationError 400 400.101.107 Passenger government ID validity start is invalid or missing PassengersGovernmentIdValidityExpirationValidationError 400 400.101.108 Passenger government ID validity expiration is invalid or missing PassengersGovernmentIdValidityStartMustBeBeforeExpirationValidationError 400 400.101.109 Passenger government ID validity start must be before expiration CardDetailsCardNumberValidationError 400 400.101.110 Card number is invalid CardDetailsCardHolderNameValidationError 400 400.101.111 Cardholder name is invalid CardDetailsCardTypeValidationError 400 400.101.112 Card type is invalid CardExpiryValidationError 400 400.101.113 Card expiry is invalid CardDetailsSecurityCodeValidationError 400 400.101.114 Security Code is invalid CvvValidationError 400 400.101.114 CVV is invalid CountryStateValidationError 400 400.101.115 Country state is invalid CountryCodeValidationError 400 400.101.116 Country code is invalid GenderValidationError 400 400.101.117 Gender is invalid CountryOfBirthValidationError 400 400.101.118 Country of birth is invalid GovernmentIdIssuingCountryValidationError 400 400.101.119 Government ID issuing country is invalid or missing GovernmentIdIssuingStateValidationError 400 400.101.120 Government ID issuing state is invalid or missing GovernmentIdValidityStartValidationError 400 400.101.121 Government ID validity start is invalid or missing GovernmentIdValidityExpirationValidationError 400 400.101.122 Government ID validity expiration is invalid or missing PassengersGovernmentIdIssuingStateValidationError 400 400.101.123 Passenger government ID issuing state is invalid or missing GovernmentIdValidityStartMustBeBeforeExpirationValidationError 400 400.101.124 Government ID validity start must be before expiration PassengersCardsCodeValidationError 400 400.101.125 Passenger card code is invalid or missing CardsCodeValidationError 400 400.101.126 Card code is invalid or missing SortValidationError 400 400.101.127 Sort is invalid or missing QueryValidationError 400 400.101.128 Query is invalid or missing MarketingCarrierCodesValidationError 400 400.101.129 Marketing carrier codes are invalid or missing ArrivalDateValidationError 400 400.101.130 Arrival date is invalid or missing StatesValidationError 400 400.101.131 States are invalid or missing ArrivalStationCodeValidationError 400 400.101.132 Arrival station code is invalid or missing DepartureStationCodeValidationError 400 400.101.133 Departure station code is invalid or missing RetailerPartnerNumbersValidationError 400 400.101.134 Retailer partner numbers are invalid or missing HoldUntilValidationError 400 400.101.135 Hold until is invalid or missing StatusValidationError 400 400.101.136 Status is invalid PassengersAncillariesValidationError 400 400.101.137 Passenger ancillaries are invalid or missing PassengersAncillariesCodeValidationError 400 400.101.138 Passenger ancillary code is invalid or missing LinkedReservationIdValidationError 400 400.101.139 Linked reservation ID is blank or invalid PassengersIdValidationError 400 400.101.140 Passenger ID is blank or invalid AncillariesCodeValidationError 400 400.101.141 Ancillary code is blank or invalid RetailerBookingNumberValidationError 400 400.101.142 Retailer booking number is blank or invalid AgentIdValidationError 400 400.101.143 Agent ID is blank or invalid PassengersAncillariesPriceValidationError 400 400.101.144 Passenger ancillary price is invalid or missing PassengersAncillariesSegmentIndexValidationError 400 400.101.145 Passenger ancillary segment index is invalid PassengersAncillariesQuantityValidationError 400 400.101.146 Passenger ancillary quantity is invalid or missing AncillariesSegmentIndexValidationError 400 400.101.147 Ancillary segment index is invalid AncillariesQuantityValidationError 400 400.101.148 Ancillary quantity is invalid or missing CurrencyDisabledForTradingValidationError 400 400.101.149 The requested currency is not supported ExecutePaymentIsRequiredValidationError 400 400.101.157 Execute payment is required when delta price is positive PaymentMethodIsRequiredValidationError 400 400.101.158 Payment method is required when delta price is positive PaymentMethodIsRedundantValidationError 400 400.101.159 Payment method is redundant when delta price is zero or negative ExecutePaymentIsTruthyValidationError 400 400.101.160 Execute payment cannot be truthy when delta price is zero or negative CustomerBelongsToValidationError 400 400.101.161 customer_belongs_to can only be equal to... PassengersAncillariesCustomAttributesValueValidationError 400 400.101.162 Passenger ancillaries custom attributes value is invalid PassengersAncillariesCustomAttributesKeyValidationError 400 400.101.163 Passenger ancillaries custom attributes key is invalid AncillariesCustomAttributesValueValidationError 400 400.101.164 Ancillaries custom attributes value is invalid AncillariesCustomAttributesKeyValidationError 400 400.101.165 Ancillaries custom attributes key is invalid PassengersTaxIdValidationError 400 400.101.166 Passenger tax_id is invalid or missing CreatedAtStartMustBeBeforeEndValidationError 400 400.101.167 Created at start must be before created at end DepartureDateStartMustBeBeforeEndValidationError 400 400.101.168 Departure date start must be before departure date end ArrivalDateStartMustBeBeforeEndValidationError 400 400.101.169 Arrival date start must be before created at end TaxIdValidationError 400 400.101.170 Tax Id is invalid or missing VatNumberValidationError 400 400.101.171 Vat Number is invalid or missing BusinessNameValidationError 400 400.101.172 Business Name is invalid or missing CustomerIdValidationError 400 400.101.173 Customer ID is invalid PassengersVisaPermitTypeValidationError 400 400.101.174 Passenger visa permit type is invalid or missing PassengersCitizenshipValidationError 400 400.101.175 Passenger citizenship is blank or invalid ItemsValidationError 400 400.101.176 Items are invalid or missing ItemsOfferIdValidationError 400 400.101.177 Item offer_id is invalid or missing ItemsStartDateValidationError 400 400.101.178 Item start_date is invalid ItemsInstantActivationValidationError 400 400.101.179 Item instant_activation is invalid PassengersTitleValidationError 400 400.101.180 Passenger title is invalid or missing PassengersEmailValidationError 400 400.101.181 Passenger email is invalid or missing PurchaserValidationError 400 400.101.182 Purchaser is invalid or missing PurchaserTitleValidationError 400 400.101.183 Purchaser title is invalid or missing PurchaserFirstNameValidationError 400 400.101.184 Purchaser first_name is invalid or missing PurchaserLastNameValidationError 400 400.101.185 Purchaser last_name is invalid or missing PurchaserBirthdateValidationError 400 400.101.186 Purchaser birthdate is invalid or missing PurchaserEmailValidationError 400 400.101.187 Purchaser email is invalid or missing PurchaserPhoneValidationError 400 400.101.188 Purchaser phone is invalid or missing PurchaserStreetAndNumberValidationError 400 400.101.189 Purchaser street_and_number is invalid or missing PurchaserCountryCodeValidationError 400 400.101.190 Purchaser country_code is invalid or missing PurchaserCityValidationError 400 400.101.191 Purchaser city is invalid or missing PurchaserZipCodeValidationError 400 400.101.192 Purchaser zip_code is invalid or missing ExtraFieldsValidationError 400 400.101.193 Extra fields is invalid ReservationIdValidationError 400 400.101.194 Cancellation reservation_id is missing CustomFieldsValueValidationError 400 400.101.196 Custom field value must be a string. CustomFieldsNameValidationError 400 400.101.197 Custom field name must be a string. PassengersForCardsValidationError 400 400.101.198 Passengers need to be present when using discount cards. BookingNumberValidationError 400 400.101.199 Booking number is blank or invalid BookingNumberAndDistribusionBookingNumberValidationError 400 400.101.199 Only one booking identifier should be provided InvalidOfferIdFormatError 400 400.101.200 Invalid offer ID format InvalidPassengerReferenceValidationError 400 400.101.201 Invalid passenger reference ExecutingRetailerPartnerNumberValidationError 400 400.101.201 Executing retailer partner number is invalid or missing OfferConnectionMismatchValidationError 400 400.101.202 Offer does not belong to the requested connection OfferCurrencyMismatchValidationError 400 400.101.203 Offer currency does not match requested currency MissingPassengerIdsForIndividualCoverageValidationError 400 400.101.204 passenger_ids required for individual coverage offers IncompleteOfferSelectionValidationError 400 400.101.205 Addon offers cannot be booked without a base offer PassengersIdRequiredWhenOffersPresentValidationError 400 400.101.206 Passenger ID is required when offers are present IncompleteCombinationalJourneyValidationError 400 400.101.207 Combinational offers must cover all journey segments and passengers MixedBookingTypesValidationError 400 400.101.208 Cannot mix combinational offers with standalone offers DuplicateSegmentCoverageValidationError 400 400.101.209 Duplicate coverage detected: same passenger-segment combination covered by multiple offers MultipleStandaloneOffersValidationError 400 400.101.210 Multiple standalone offers cannot be selected OfferValidationError 400 400.101.211 Offer is not valid anymore PassengersAncillariesCustomAttributesValidationError 400 400.101.211 Passenger Custom attributes invalid or missing SearchBoundsDepartureStationCodeValidationError 400 400.101.212 Search bounds departure station code is invalid or missing CancellationFeeValidationError 400 400.101.213 Cancellation fee is invalid or missing TransactionReferenceValidationError 400 400.101.214 Transaction reference is invalid or missing MultipleLegsValidationError 400 400.101.215 Multiple legs are invalid or missing PassengersSeatsValidationError 400 400.101.216 Passenger seats are invalid or missing CodeValidationError 400 400.101.217 Voucher code is invalid DetailsValidationError 400 400.101.218 Payment item details are invalid or missing PinValidationError 400 400.101.219 Voucher pin is invalid PassengerIdsValidationError 400 400.101.220 Passenger IDs are invalid or missing MarketingCarrierStationCodeUnknownError 400 400.102.000 Marketing carrier station code unknown MarketingCarrierMobileTicketsDisabled 400 400.300.004 Marketing carrier does not support mobile tickets MarketingCarrierHtmlTicketsNotSupportedError 400 400.300.005 Marketing carrier does not support HTML tickets MarketingCarrierSeatLayoutsNotSupportedError 400 400.300.006 Marketing carrier does not support seat layouts MarketingCarrierQrCodeNotSupportedError 400 400.300.007 Marketing carrier does not support QR Codes MarketingCarrierReservationsNotSupportedError 400 400.300.008 Marketing carrier does not support reservations MarketingCarrierBookingsNotSupportedError 400 400.300.009 Marketing carrier does not support bookings MarketingCarrierGoogleWalletDisabled 400 400.300.009 Google wallet tickets are disabled CancellationNotAllowed 400 400.500.041 Cancellation is not allowed BookingAlreadyCancelled 400 400.502.041 Booking already cancelled ReservationAlreadyCancelled 400 400.503.041 Reservation is already cancelled ReservationAlreadyConfirmed 400 400.503.042 Reservation is already confirmed ReservationExpired 400 400.503.043 Reservation expired AmendmentNotAllowed 400 400.503.044 Amendment is not allowed AmendmentAlreadyConfirmed 400 400.503.045 Amendment is already confirmed MarketingCarrierAmendmentNotAllowed 400 400.503.046 Marketing carrier amendment is not allowed CurrencyAmendmentNotAllowed 400 400.503.047 Currency amendment is not allowed PaxNumberAmendmentNotAllowed 400 400.503.048 Passenger number amendment is not allowed PaxTypeAmendmentNotAllowed 400 400.503.049 Passenger type amendment is not allowed MarketingCarrierAmendmentsNotSupportedError 400 400.503.050 Marketing carrier does not support amendments MultiPaxCarrierAmendmentNotAllowed 400 400.503.051 Amendment for multipax carrier is not allowed VirtualReturnAmendmentNotAllowed 400 400.503.052 Amendment with virtual return is not allowed AncillariesAreNotResent 400 400.503.053 Ancillaries are not resent when the trip changed EmptyAmendmentIsNotAllowedValidationError 400 400.503.054 Empty amendment is not allowed OriginalPriceMissmatchValidationError 400 400.503.055 Discounted original price missmatch total price OriginalPriceRequiredValidationError 400 400.503.056 Original price is required with retailer discount SymmetricAndCarrierCardValidationError 400 400.503.057 Symmetric and Carrier cards are not allowed together PartialCancellationNotSupported 400 400.505.001 Partial cancellation not supported... PartialPassengerCancellationNotSupported 400 400.505.002 Individual passenger cancellation... PartialCancellationConnectionNotFoundError 400 400.505.005 Connection not found for partial cancellation PartialCancellationPassengersNotFoundError 400 400.505.006 No booking items found... PartialCancellationNoItemsSelectedError 400 400.505.007 No items selected for partial cancellation PartialCancellationAllItemsSelectedError 400 400.505.008 Cannot partially cancel all booking items PartialCancellationItemsAlreadyCancelledError 400 400.505.009 Some selected booking items are already cancelled AlipayAuthCodeValidationError 400 400.700.000 Alipay auth code is invalid or missing ClientIdValidationError 400 400.800.000 Client credentials are invalid or missing ClientSecretValidationError 400 400.800.000 Client credentials are invalid or missing GrantTypeValidationError 400 400.800.000 Client credentials are invalid or missing RemoteDiscountCodeValidationError 400 600.400.001 Remote discount code is invalid or missing RemoteDiscountCodeOutOfDateError 400 600.400.002 Remote discount code is out of date RemoteDiscountCodeAlreadyRedeemedError 400 600.400.003 Remote discount code has already been redeemed RemoteDiscountCodePaxTooLowError 400 600.400.004 Number of pax too low to redeem remote discount code RemotePassengersNameValidationError 400 600.400.005 Passenger name is invalid or missing RemotePassengersGovernmentIdValidationError 400 600.400.006 Passenger government ID is invalid or missing RemoteCardCodeValidationError 400 600.400.007 Card code is invalid RemoteAncillaryIsNotThirdPartyError 400 600.400.008 Ancillary is not third party RemoteAncillaryNotFoundError 400 600.404.004 Remote Ancillary Not Found Unauthorized 401 400.200.001 API key is invalid or missing OryAuthenticationError 401 400.200.001 Api token is invalid or missing AccessTokenExpired 401 400.200.003 Access token is expired OryApiTokenExpiredError 401 400.200.003 Api token is expired AuthorizationError 403 400.200.002 Not authorized... OryAuthorizationError 403 400.200.002 Not authorized... DepartureDateInPastValidationError 404 400.101.044 Departure date is in the past NotFoundError 404 400.800.000 Not Found CityNotFoundError 404 400.800.023 City not found MarketingCarrierNotFoundError 404 400.800.040 Marketing Carrier not found BookingNotFoundError 404 400.800.041 Booking not found OrderNotFoundError 404 400.800.041 Order not found WebhookNotDefined 404 400.800.042 Webhook not defined StationNotFoundError 404 400.800.043 Station not found WebhookDeliveryNotFoundError 404 400.800.044 Webhook delivery not found ReservationNotFoundError 404 400.800.045 Reservation not found AmendmentNotFoundError 404 400.800.046 Amendment not found SubscriptionNotFoundError 404 400.800.047 Subscription not found ProductNotFoundError 404 400.800.048 Product not found AreaNotFoundError 404 400.800.082 Area not found OfferNotFoundError 404 404.101.001 Offer not found RemoteReservationNotFoundError 404 600.404.003 Remote Reservation Not Found CustomerNotFoundError 404 600.720.004 Customer not found MethodNotAllowedError 405 405.000.000 Method Not Allowed RemoteBookingPriceChangedError 409 600.702.000 Remote Booking Price Changed Error RemoteBookingPriceInconsistentError 409 600.702.001 remote booking price inconsistent error RemoteBookingSeatNotAvailableError 409 600.706.000 remote booking seat not available error RemoteSalesRestrictionError 409 600.707.000 Remote Sales Restriction Error RemoteSalesBanError 409 600.708.000 Remote Sales Ban Error RemoteReservationPriceChangedError 409 600.709.000 Remote Reservation Price Changed Error RemoteReservationSeatNotAvailableError 409 600.710.000 Remote reservation seat is not available RemoteReservationCapacityError 409 600.711.000 Remote Reservation Capacity Error RemoteReservationAlreadyConfirmedError 409 600.712.000 Remote Reservation Already Confirmed Error RemoteReservationAlreadyCancelledError 409 600.713.000 Remote Reservation Already Cancelled Error LinkedReservationNotConfirmedError 409 600.714.000 Linked reservation is not confirmed yet RemoteAncillaryCapacityError 409 600.715.000 Remote ancillary capacity error PassengerAlreadyHasAnActiveSubscriptionError 409 600.716.000 Passenger already has an active subscription OrderAlreadyConfirmed 409 600.717.000 Order is already confirmed GoneError 410 400.900.000 One or more of requested resources is no longer available SubscriptionUnprocessableEntityError 422 422.000.000 (Título não definido) MultiplePassengersOrderNotSupportedError 422 422.000.000 Currently only single passenger orders are supported MultipleItemsOrderNotSupportedError 422 422.000.000 Currently only single item orders are supported UnsupportedProductTypeOrderError 422 422.000.000 Product type is not supported CustomerAlreadyBlockedError 422 600.720.000 Customer is already blocked CustomerNotBlockedError 422 600.720.001 Customer is not currently blocked CustomerHasNoActiveSubscriptionsError 422 600.720.002 Customer has no active subscriptions CustomerHasPendingBlockingRequestError 422 600.720.003 Customer has a pending blocking/unblocking request CustomerHasNoBookingIdsError 422 600.720.005 No booking IDs found for customer BookingTicketBlockingFailedError 422 600.721.000 (Título não definido) BookingInactivationFailedError 422 600.721.001 (Título não definido) BookingAlreadyInactiveError 422 600.721.002 Booking is already inactive TooManyReservationsError 429 429.100.001 Too many reservations InternalServerError 500 500.000.000 Internal Server Error ConnectionNotFound 500 500.300.000 Connection not found ConnectionNotVacant 500 500.300.001 Connection not vacant DistribusionBookingNumberNotUnique 500 500.500.017 Unique distribusion booking number cannot be generated MarketingCarrierQrSerialCodeMissingError 500 500.500.018 Marketing carrier QR serial code missing BookingIdNotUnique 500 500.500.041 Unique booking id cannot be generated BookingNotVacant 500 500.501.000 Booking not vacant BookingUnexpectedPriceComparison 500 500.502.000 Booking unexpected price comparison BookingPriceIncreased 500 500.502.026 Booking price increased BookingPriceDecreased 500 500.502.026 Booking price decreased BosiInternalServiceError 500 500.502.100 Internal Service Error InternalServiceOutOfTimeError 500 500.502.101 Internal Service Out Of Time Error InternalServiceError 500 500.502.102 Internal Service Error PasstaServiceError 500 500.502.200 Internal Service Error SubscriptionInternalServiceError 500 500.502.300 Internal Service Error CancellationIdNotUnique 500 500.600.041 Unique cancellation id cannot be generated ReservationIdNotUnique 500 500.700.041 Unique reservation id cannot be generated InternalServiceTimeoutError 502 500.502.103 Internal Service Timeout Error OperationTimedOutError 502 500.600.100 Remote System Timeout CouldNotConnectNetworkError 502 500.600.101 Remote System Timeout RecvNetworkError 502 500.600.102 Remote System Timeout GotNothingNetworkError 502 500.600.103 Remote System Timeout BosiNetworkError 502 500.600.104 Remote System Timeout RemoteSystemUnavailableError 502 600.000.000 remote system unavailable RemoteSystemTimeoutError 502 600.100.000 Remote System Timeout RemoteSystemError 502 600.200.000 remote system error RemoteRequestUnauthenticatedError 502 600.300.000 remote request unauthenticated RemoteRequestUnauthorizedError 502 600.301.000 remote request unauthorized RemoteRequestInvalidError 502 600.400.000 remote request invalid RemoteConnectionNotFound 502 600.404.000 Remote Connection Not Found RemoteTicketsNotFound 502 600.404.001 Remote Tickets Not Found RemoteBookingNotFoundError 502 600.404.002 Remote Booking Not found RemoteConnectionUnknownError 502 600.500.000 remote connection unknown error RemoteVacancyUnknownError 502 600.600.000 remote vacancy unknown error RemoteBookingNotCancellableError 502 600.604.041 Remote booking not cancellable error RemoteBookingFailedError 502 600.700.000 remote booking failed error RemoteBookingCapacityError 502 600.701.000 remote booking capacity error RemoteBookingInconsistentCapacityError 502 600.701.001 remote booking inconsistent capacity error RemoteBookingTariffUnavailableError 502 600.703.000 remote booking tariff unavailable error RemoteBookingAlreadyCancelledError 502 600.704.000 remote booking already cancelled error RemoteBookingVacancyUnknownError 502 600.705.000 remote booking vacancy unknown error RemoteResponseUnprocessableError 502 600.900.000 response received... cannot be processed RemoteResponseInvalidError 502 600.901.000 response... logically cannot be processed RemoteAncillaryReservationFailedError 502 600.902.000 remote ancillary reservation failed error RemoteAncillaryConfirmationFailedError 502 600.902.001 remote ancillary confirmation failed AncillaryCurrencyMismatchError 502 600.903.000 remote ancillary currency was not applied ServiceUnavailableError 503 500.100.000 Service Unavailable MarketingCarrierUnavailableError 503 500.200.000 Requested marketing carrier is currently unavailable MarketingCarrierDefaultSchemasNotDefined 503 500.200.201 Default schemas for the marketing carrier are not defined RetailerTimeoutError 504 600.100.000 Remote System Timeout • [Intro](https://docs.distribusion.com/dt/booking-engine/intro.md): Distribusion offers a Booking Engine solution that allows travel companies to seamlessly offer ground transportation booking capabilities under their own brand (white label solution). This service enables businesses to offer their customers access to the vast Distribusion's network of bus, train, and airport transfer operators globally. The engine is customizable, supports multiple languages, currencies, and payment methods, and is designed to enhance the end-user experience by allowing users to search, book, and manage transportation tickets effortlessly. • [Integration Types](https://docs.distribusion.com/dt/booking-engine/integration-types.md): The goal of this section is to explain how to integrate Distribusion’s Booking Engine. Before reading, you need to decide the type of integration that you are going to have: Full Integration : With this option, Distribusion will handle the search, search results, and checkout for you on a Distribusion Hosted Page. Partial Integration : With this option, Distribusion handles the search results and the checkout on a Distribution Hosted Page. The search will be handled by you. Checkout Only Integration : With this option, you handle the search and search results, and Distribusion handles the checkout. Here is a visual way of seeing each option: • [Full Search & Book Integration](https://docs.distribusion.com/dt/booking-engine/integration-types/full-search-and-book-integration.md): With Distribusion Whitelabel full integration everything will be handled by Distribusion. You can either redirect the user to a Distribusion Whitelabel landing page for the user to search or integrate a search widget on your website. If you want to integrate the widget, please request the Distribusion JS SDK documentation. Landing Page Example https://book.distribusion.com/?retailerPartnerNumber=222222 URL Parameters Parameter Mandatory Type Description Example retailerPartnerNumber YES Numeric 6-digit number of retailer partner. 222222 marketingCarrierCode NO Array Codes of the carriers to be displayed. Leave empty if all NEXP locale NO String 2-letter alphanumeric lowercase code according to ISO 639-1 standard. en currency NO String 3-letter alphanumeric uppercase code according to ISO 4217 standard. EUR • [Partial Integration](https://docs.distribusion.com/dt/booking-engine/integration-types/partial-integration.md): With Distribusion partial integration, you will handle the search. You have three ways of handling the search: Build your search engine using our APIs. We don't recommend this option if you only work with us, since our booking engine already provides a fully featured search experience. Integrate our Search SDK : a JavaScript SDK that allows you to have the search box on your website. If you use the Search SDK, the user will be redirected to the Distribusion booking engine for the search results and checkout. Specific landing pages: on most websites, some landing pages already have predefined Origins and Destinations. In this case, you can redirect the user directly to the search results page with the appropriate URL parameters. Redirecting to Search Results Page Search result page URL example https://book.distribusion.com/result?arrivalCity=GBBHX&departureCity=GBLON&locale=en&pax=1&retailerPartnerNumber=222222 URL Parameters Mandatory Parameters Title Description Title Parameter Description Type departureCity , departureArea , or departureStation Departure point. Choose one of the options. E.g., DEBER Mandatory - String arrivalCity , arrivalArea , or arrivalStation Arrival point. Choose one of the options. E.g., GBLON Mandatory - String retailerPartnerNumber Your Distribusion account number (6 digits). Mandatory - Integer Optional Parameters Location & Carrier Title Description Title Parameter Description Type marketingCarrierCode Filter the list of carriers to return in the search results. Optional - Array returnMarketingCarrier Return trip marketing carrier code. E.g., ?returnMarketingCarrier=FLXB Optional - String trainType Train type filter code. E.g., ?trainType=ICE Optional - String Date & Time Title Description Title Parameter Description Type departureDate Departure date for the trip in ISO 8601 format YYYY-MM-DD . Defaults to today. Past dates are automatically adjusted to today. Optional - String departureTime Outbound departure time (HH:mm, 24h). E.g., ?departureTime=08:30 Optional - String departureEndTime Latest outbound departure time (HH:mm, 24h). E.g., ?departureEndTime=20:00 Optional - String arrivalDate Outbound arrival date (YYYY-MM-DD). E.g., ?arrivalDate=2025-12-10 Optional - String arrivalTime Outbound arrival time (HH:mm, 24h). E.g., ?arrivalTime=12:00 Optional - String returnDate Return date for the trip in ISO 8601 format YYYY-MM-DD . If set before departureDate , it is automatically adjusted. Optional - String returnDepartureDate Return trip departure date (YYYY-MM-DD). E.g., ?returnDepartureDate=2025-12-15 Optional - String returnDepartureTime Return trip departure time (HH:mm, 24h). E.g., ?returnDepartureTime=09:00 Optional - String returnArrivalDate Return trip arrival date (YYYY-MM-DD). E.g., ?returnArrivalDate=2025-12-15 Optional - String returnArrivalTime Return trip arrival time (HH:mm, 24h). E.g., ?returnArrivalTime=13:00 Optional - String returnStartTime Earliest return departure time (HH:mm, 24h). E.g., ?returnStartTime=07:00 Optional - String returnEndTime Latest return departure time (HH:mm, 24h). E.g., ?returnEndTime=18:00 Optional - String Passengers & Pricing Title Description Title Parameter Description Type pax Number of passengers. E.g., ?pax=2 Optional - Integer passengers[][type] Passenger type code. E.g., &passengers[0][type]=PNOS Optional - String passengers[][pax] Number of passengers of this type. E.g., &passengers[0][pax]=1 Optional - Integer passengers[][max_age] The maximum age in the group of passengers. E.g., &passengers[0][maxAge]=120 Optional - Integer cards Discount cards (comma-separated or JSON). E.g., ?cards=bahncard25 Optional - String passengersCards Cards per passenger (JSON or URL-encoded string). E.g., ?passengersCards=%5B%22bahncard25%22%5D Optional - String fareClass Outbound fare class code. E.g., ?fareClass=ECONOMY Optional - String returnFareClass Return fare class code. E.g., ?returnFareClass=BUSINESS Optional - String price Maximum price filter. E.g., ?price=100 Optional - Float travelClass Travel class code. E.g., ?travelClass=FIRST Optional - String Sorting & Filtering Title Description Title Parameter Description Type sorting Sorting method. Accepted values: price , duration , departure_time , arrival_time , transfers . E.g., ?sorting=price Optional - String fastestConnections Only show fastest connections ( true / false ). E.g., ?fastestConnections=true Optional - Boolean express Express search mode — automatically finds available trips ( true / false ). E.g., ?express=true Optional - Boolean shouldFindAvailableTrips Only show available trips ( true / false ). E.g., ?shouldFindAvailableTrips=true Optional - Boolean minTransferTime Minimum transfer time in minutes. E.g., ?minTransferTime=10 Optional - Integer Stopover & Via Parameters Title Description Title Parameter Description Type stopOverStations Stopover station codes (comma-separated). E.g., ?stopOverStations=ST1,ST2 Optional - String stopOverStationsOutbound Outbound stopover station codes (comma-separated). E.g., ?stopOverStationsOutbound=ST1,ST2 Optional - String stopOverStationsInbound Inbound stopover station codes (comma-separated). E.g., ?stopOverStationsInbound=ST3,ST4 Optional - String viasRules Via inclusion/exclusion rules (JSON or URL-encoded). Keys are station codes, values are include or exclude . E.g., ?viasRules=%7B%22STAT1%22%3A%22include%22%7D Optional - String viasRulesOutbound Via rules for outbound leg (same format as viasRules ). Optional - String viasRulesInbound Via rules for inbound leg (same format as viasRules ). Optional - String viasDwellTimes Dwell times at via stations in minutes (JSON or URL-encoded). Keys are station codes, values are minutes. E.g., ?viasDwellTimes=%7B%22STAT1%22%3A10%7D Optional - String viasDwellTimesOutbound Dwell times for outbound vias (same format as viasDwellTimes ). Optional - String viasDwellTimesInbound Dwell times for inbound vias (same format as viasDwellTimes ). Optional - String Display & UI Title Description Title Parameter Description Type mode Display mode for the booking engine UI. Accepted values: page (default, standalone page), embed (embedded in an iframe or external site), app (mobile app webview). E.g., ?mode=embed Optional - String locale Language code for the UI. A two-letter or four-letter code is accepted, like en or en-US . Optional - String currency Currency code for the UI. Three-letter ISO currency code, like EUR or USD . Optional - String tz Timezone in IANA format. E.g., ?tz=Europe%2FBerlin Optional - String hideLocations Hide location selection in the UI ( true / false ). E.g., ?hideLocations=true Optional - Boolean hideTicketDetails Hide ticket details in the UI ( true / false ). E.g., ?hideTicketDetails=true Optional - Boolean timetable Display results in timetable view ( true / false ). E.g., ?timetable=true Optional - Boolean weekly Enable weekly trip search mode ( true / false ). E.g., ?weekly=true Optional - Boolean Seat Selection Title Description Title Parameter Description Type seatProduct Enable seat reservation mode ( true / false ). E.g., ?seatProduct=true Optional - Boolean seats Pre-selected seat assignments (JSON or URL-encoded object). Structured as a nested object keyed by connection type ( outbound / inbound ) and segment. E.g., ?seats=%7B%22outbound%22%3A%7B%7D%7D Optional - String Offers & Experiments Title Description Title Parameter Description Type offers Offer codes (comma-separated). E.g., ?offers=OFFER1,OFFER2 Optional - String offerIds Offer IDs (comma-separated). E.g., ?offerIds=123,456 Optional - String inExp Experiment identifier. Used to assign the user to a specific A/B test experiment. E.g., ?inExp=42 Optional - Integer Booking & Contact Title Description Title Parameter Description Type bookingId Booking identifier. E.g., ?bookingId=BOOK123 Optional - String retailerBookingNumber Retailer booking reference. E.g., ?retailerBookingNumber=ABC123 Optional - String email Pre-filled customer email address. E.g., ?email=test%40example.com Optional - String phone Pre-filled customer phone number. E.g., ?phone=49123456789 Optional - String Season Ticket Title Description Title Parameter Description Type seasonTicket Enable season ticket search mode ( true / false ). E.g., ?seasonTicket=true Optional - Boolean Integration & Technical Title Description Title Parameter Description Type parentDomain Parent domain for embed mode. Used for postMessage communication between the iframe and the host page. E.g., ?parentDomain=example.com Optional - String retailerReturnUrl URL to redirect the user to after booking. Must be a valid http:// or https:// URL. E.g., ?retailerReturnUrl=https%3A%2F%2Fexample.com%2Freturn Optional - String seo SEO pre-rendering mode ( true / false ). Typically set automatically during server-side rendering. E.g., ?seo=true Optional - Boolean Notes Boolean values are case-insensitive ( true , false , 1 , 0 are accepted). Dates must be in YYYY-MM-DD format. Times must be in HH:mm 24-hour format. For parameters accepting JSON or arrays, use URL encoding (e.g., encodeURIComponent ). Multiple values (e.g., for cards , offers ) can be comma-separated. Past departure dates are automatically normalized to today's date. If returnDate is set before departureDate , it will be adjusted to the day after departure. The retailerPartnerNumber is required — requests to /result without it will be redirected to a 404 page. UTM tracking parameters (e.g., utm_source , utm_medium , utm_campaign ) are automatically captured and forwarded for analytics. • [Checkout Only Integration](https://docs.distribusion.com/dt/booking-engine/integration-types/checkout-only-integration.md): With Distribusion Whitelabel checkout only integration, the search will be handled by you. Redirecting to Checkout Page Example https://book.demo.distribusion.com/checkout?departureDate=2023-06-16&departureTime=13%3A10&departureStation=FRPARABE&arrivalDate=2023-06-16&arrivalTime=14%3A25&arrivalStation=FRPARPBE&fareClass=FARE-1&marketingCarrierCode=NBEA&pax=1&currency=EUR&locale=en&retailerPartnerNumber=222222 URL will not work as the departure dates and times are outdated. The example should only be used for formatting. URL Parameters Parameter Mandatory Type Description Example departureStation YES String Departure station code DEBERCBS departureDate YES Date YYYY-MM-DD Departure date for the trip in ISO 8601 format 2023-01-18 departureTime YES Hour HH:MM Departure hour 19%3A30 arrivalStation YES String Arrival point. Choose one of the options. GBLONVBU arrivalDate YES Date YYYY-MM-DD Arrival date for the trip in ISO 8601 format 2023-01-18 arrivalTime YES Hour HH:AMM Arrival hour 21%3A30 retailerPartnerNumber YES Numeric 6-digit number of retailer partner. 222222 marketingCarrierCode YES String Carrier code AAAA locale NO String 2-letter alphanumeric lowercase code according to ISO 639-1 standard. en currency NO String 3-letter alphanumeric uppercase code according to ISO 4217 standard. EUR pax NO Integer Number of passengers 1 fareClass NO String Fare class code. If none, we will display the cheapest by default. FARE-1 returnDepartureDate NO Date YYYY-MM-DD Return departure date for the trip in ISO 8601 format 2023-01-20 returnDepartureTime NO Hour HH:MM Return departure hour 19%3A30 returnArrivalDate NO Date YYYY-MM-DD Return arrival date for the trip in ISO 8601 format 2023-01-18 returnArrivalTime NO Hour HH:MM Return arrival hour 19%3A30 passengers NO offerIds NO • [SDK Widget](https://docs.distribusion.com/dt/booking-engine/sdk-widget.md): The Search SDK is a configurable widget that enables travel search integration into any website. It supports station, city, and area searches with autocomplete functionality. The widget provides: Location Search — dynamically returns matching stations, destinations, and origins based on account configuration Autocomplete — suggests stations for origin and destination fields Date Selection — trip date picker interface Journey Type — one-way, return, weekly, or open return ticket options Passenger Count — configurable number of travelers Time Selection — departure and arrival time options for high-frequency routes Predefined Options — present users with curated lists of departure/arrival locations and dates as dropdown selectors RTL Support — right-to-left text direction across the search bar UI Implementation Basic HTML Setup HTML <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="preconnect" href="https://book.distribusion.com"> <link rel="stylesheet" href="https://book.distribusion.com/sdk-fonts.1.0.0.css"> <script defer src="https://book.distribusion.com/sdk.1.0.0.js"></script> </head> <body> <div id="search-box" style="min-height: 280px;"></div> <script> document.addEventListener('DOMContentLoaded', function () { Distribusion.Search.mount({ root: document.getElementById('search-box'), partnerNumber: 123456, locale: 'en', }); }); </script> </body> </html> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="preconnect" href="https://book.distribusion.com"> <link rel="stylesheet" href="https://book.distribusion.com/sdk-fonts.1.0.0.css"> <script defer src="https://book.distribusion.com/sdk.1.0.0.js"></script> </head> <body> <div id="search-box" style="min-height: 280px;"></div> <script> document.addEventListener('DOMContentLoaded', function () { Distribusion.Search.mount({ root: document.getElementById('search-box'), partnerNumber: 123456, locale: 'en', }); }); </script> </body> </html> Configuration Parameters The Distribusion.Search.mount() method accepts a configuration object and returns an object with an unmount() method. Required Title Description Title Parameter Type Description root HTMLElement Target DOM element where the widget will render. partnerNumber number Six-digit account identifier. locale string Language code in two or four-letter format (e.g., "en" or "en-US" ). Supports RTL locales (e.g., "ar" , "he" ). Optional Title Description Title Description Parameter Type Default Description currency string — Three-letter currency code (e.g., "EUR" , "USD" ). layout string "column" Display orientation: "row" (horizontal) or "column" (vertical). Defaults to "column" on mobile regardless of setting. target string "current" Where to open the booking page: "current" (same tab) or "blank" (new tab). carrierCodes string[] — Filter autocomplete suggestions to specific carrier codes. defaults object — Preset values for form fields. See Default Values . utm object — UTM tracking parameters. See UTM Parameters . extraElements HTMLElement[] — Additional DOM elements to render alongside the widget. Default Values The defaults object allows you to preset form field values, control field visibility, and define predefined options for users. Locations Use the departure and arrival arrays to set location defaults or provide predefined dropdown options. Title Description Title Parameter Type Description departure Array<{ departureStation?: string, departureArea?: string, departureCity?: string }> List of departure location options. A single entry sets the default. Multiple entries render as a dropdown selector, and location autocomplete is automatically disabled. arrival Array<{ arrivalStation?: string, arrivalArea?: string, arrivalCity?: string }> List of arrival location options. A single entry sets the default. Multiple entries render as a dropdown selector, and location autocomplete is automatically disabled. Each entry in the array must contain exactly one of the three location properties ( Station , Area , or City ), identified by its code. Single default location: JavaScript defaults: { departure: [{ departureStation: 'DEMUCS3ZOB' }], arrival: [{ arrivalCity: 'FRPAR' }], } Multiple predefined options (rendered as dropdowns): JavaScript defaults: { departure: [ { departureStation: 'DEMUCS3ZOB' }, { departureStation: 'DEBERZOB' }, { departureCity: 'DEHAM' }, ], arrival: [ { arrivalCity: 'FRPAR' }, { arrivalCity: 'FRLYN' }, ], } Location Types Filter which types of locations appear in autocomplete suggestions. Title Description Title Parameter Type Description locationTypes Array<'station' | 'area' | 'city'> Overrides the location types returned by the locations API. When set, only the specified types are requested. By default, all types configured for the account are shown. JavaScript // Only show city-level and station-level results in autocomplete defaults: { locationTypes: ['city', 'station'], } Dates Use departureDates and returnDates arrays to set date defaults or provide predefined date options. Title Description Title Description Parameter Type Format Description departureDates string[] YYYY-MM-DD List of departure date options. A single entry sets the default date. Multiple entries render as a date dropdown. returnDates string[] YYYY-MM-DD List of return date options. A single entry sets the default date. Multiple entries render as a date dropdown. Single default date: JavaScript defaults: { departureDates: ['2026-05-01'], } Multiple predefined date options: JavaScript defaults: { departureDates: ['2026-05-01', '2026-05-08', '2026-05-15'], returnDates: ['2026-05-05', '2026-05-12', '2026-05-19'], } Return Date Logic Automatically set the return date relative to the selected departure date, without requiring an explicit return date. Title Description Title Parameter Type Description returnDateLogic 'same-day' | 'next-day' Auto-sets the return date when the user picks a departure date. 'same-day' sets return = departure. 'next-day' sets return = departure + 1 day. Ignored when returnDate or returnDates is provided. When the departure date changes, the return date updates automatically. JavaScript // Return ticket defaults to the day after departure defaults: { returnDateLogic: 'next-day', } // Same-day return (e.g., day trips) defaults: { returnDateLogic: 'same-day', tripType: ['inbound'], tripTypeSelected: 'inbound', } Times Title Description Title Description Parameter Type Format Description departureTime string HH:mm Default departure time. returnStartTime string HH:mm Default return window start time. returnEndTime string HH:mm Default return window end time. Trip Type Title Description Title Parameter Type Description tripType Array<'outbound' | 'inbound' | 'weekly' | 'openReturn'> Define the available trip type options presented to the user. tripTypeSelected 'outbound' | 'inbound' | 'weekly' | 'openReturn' Set the initially selected trip type. JavaScript defaults: { tripType: ['outbound', 'inbound'], tripTypeSelected: 'outbound', } Display Controls Toggle the visibility of specific form fields. All default to true (visible). Title Description Title Parameter Type Description arrivalDisplay boolean Show or hide the arrival location field. departureDatesDisplay boolean Show or hide the departure date picker. returnDatesDisplay boolean Show or hide the return date picker. tripTypeDisplay boolean Show or hide the trip type selector. JavaScript // Hide return date and trip type for a one-way-only widget defaults: { returnDatesDisplay: false, tripTypeDisplay: false, } Read-Only Controls Make specific fields read-only, preventing user modification while still displaying the preset value. Title Description Title Parameter Type Description arrivalReadOnly boolean Make the arrival field read-only. departureDatesReadOnly boolean Make the departure date picker read-only. returnDatesReadOnly boolean Make the return date picker read-only. Plain text // Lock the arrival to a specific station defaults: { arrival: [{ arrivalStation: 'FRPARPBE' }], arrivalReadOnly: true, } // Lock the arrival to a specific station defaults: { arrival: [{ arrivalStation: 'FRPARPBE' }], arrivalReadOnly: true, } Passengers Title Description Title Description Parameter Type Default Description pax number 1 Number of passengers (simple mode). passengers object[] — Detailed passenger configuration. Each entry: { type: string, pax: number, age?: number } . JavaScript defaults: { passengers: [ { type: 'adult', pax: 2 }, { type: 'child', pax: 1, age: 8 }, ], } Other Title Description Title Parameter Type Description accommodation boolean Enable accommodation option in the search form. weekly boolean Enable weekly ticket mode. cards object[] Array of discount/voucher card objects. Deprecated Parameters The following flat parameters are still supported for backward compatibility, but will be removed in a future version. Use the new array-based format instead. Title Description Deprecated Parameter Replacement departureStation departure: [{ departureStation: 'CODE' }] departureArea departure: [{ departureArea: 'CODE' }] departureCity departure: [{ departureCity: 'CODE' }] arrivalStation arrival: [{ arrivalStation: 'CODE' }] arrivalArea arrival: [{ arrivalArea: 'CODE' }] arrivalCity arrival: [{ arrivalCity: 'CODE' }] departureDate departureDates: ['YYYY-MM-DD'] returnDate returnDates: ['YYYY-MM-DD'] UTM Parameters The optional utm object supports standard UTM tracking parameters: Title Description Parameter Type utm_campaign string utm_content string utm_id string utm_medium string utm_source string utm_term string Full Example HTML <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="preconnect" href="https://book.distribusion.com"> <link rel="stylesheet" href="https://book.distribusion.com/sdk-fonts.1.0.0.css"> <script defer src="https://book.distribusion.com/sdk.1.0.0.js"></script> </head> <body> <div id="search-box" style="min-height: 280px;"></div> <script> document.addEventListener('DOMContentLoaded', function () { var searchWidget = Distribusion.Search.mount({ root: document.getElementById('search-box'), partnerNumber: 123456, locale: 'en-US', currency: 'EUR', layout: 'row', target: 'blank', defaults: { departure: [ { departureStation: 'DEMUCS3ZOB' }, { departureStation: 'DEBERZOB' }, ], arrival: [ { arrivalCity: 'FRPAR' }, { arrivalCity: 'FRLYN' }, ], departureDates: ['2026-05-01', '2026-05-08', '2026-05-15'], returnDateLogic: 'next-day', locationTypes: ['city', 'station'], tripType: ['outbound', 'inbound'], tripTypeSelected: 'outbound', returnDatesDisplay: false, pax: 2, }, utm: { utm_source: 'website', utm_medium: 'widget', utm_campaign: 'summer2026', }, }); // To remove the widget later: // searchWidget.unmount(); }); </script> </body> </html> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="preconnect" href="https://book.distribusion.com"> <link rel="stylesheet" href="https://book.distribusion.com/sdk-fonts.1.0.0.css"> <script defer src="https://book.distribusion.com/sdk.1.0.0.js"></script> </head> <body> <div id="search-box" style="min-height: 280px;"></div> <script> document.addEventListener('DOMContentLoaded', function () { var searchWidget = Distribusion.Search.mount({ root: document.getElementById('search-box'), partnerNumber: 123456, locale: 'en-US', currency: 'EUR', layout: 'row', target: 'blank', defaults: { departure: [ { departureStation: 'DEMUCS3ZOB' }, { departureStation: 'DEBERZOB' }, ], arrival: [ { arrivalCity: 'FRPAR' }, { arrivalCity: 'FRLYN' }, ], departureDates: ['2026-05-01', '2026-05-08', '2026-05-15'], returnDateLogic: 'next-day', locationTypes: ['city', 'station'], tripType: ['outbound', 'inbound'], tripTypeSelected: 'outbound', returnDatesDisplay: false, pax: 2, }, utm: { utm_source: 'website', utm_medium: 'widget', utm_campaign: 'summer2026', }, }); // To remove the widget later: // searchWidget.unmount(); }); </script> </body> </html> Performance Best Practices Early Mounting — use DOMContentLoaded rather than load to mount the widget as early as possible. Non-Blocking Loading — add defer to the script tag so it downloads in parallel without blocking page rendering. Layout Stability — assign a min-height (e.g., 280px ) to the container element to reduce cumulative layout shift while the widget loads. • [Seat Map SDK](https://docs.distribusion.com/dt/booking-engine/seat-map-sdk.md): Overview The Distribusion Seat Map JS SDK simplifies the integration of seat selection for API retailers. Instead of handling API calls and rendering seat maps themselves, retailers can simply add the SDK to their website. The SDK will: Fetch and display the seat map based on the provided trip details. Allow the end customer to select a seat. Return the selected seat(s) to the retailer for inclusion in the final reservations API call. Installation To integrate the SDK, include it in your website: HTML <script src="https://cdn.distribusion.com/seatmap-sdk.js"></script> <script src="https://cdn.distribusion.com/seatmap-sdk.js"></script> Initialization To initialize the SDK, call DistribusionSeatMap.init() with the required parameters: JavaScript DistribusionSeatMap.init({ marketingCarrier: 'UTIL', departureStation: 'BRBHZBHB', arrivalStation: 'BRLZSRDJ', departureTime: '2024-09-19T07:00', arrivalTime: '2024-09-19T14:30', containerId: 'seatmap-container', onSelectionConfirmed: function(selectedSeats) { console.log('Selected seats:', selectedSeats); // Pass selectedSeats to your booking API call } }); API request The SDK internally calls the following API to retrieve seat map data: Bash curl --location 'https://api.demo.distribusion.com/retailers/v4/connections/seats?marketing_carrier=UTIL&departure_station=BRBHZBHB&arrival_station=BRLZSRDJ&departure_time=2024-09-19T07%3A00&arrival_time=2024-09-19T14%3A30' Parameters Title Description Title Parameter Type Description marketingCarrier String The carrier operating the transport departureStation String The station code for departure arrivalStation String The station code for arrival departureTime String Scheduled departure time (ISO 8601) arrivalTime String Scheduled arrival time (ISO 8601) Response to Retailer Once the customer selects and confirms their seat(s), the SDK triggers the onSelectionConfirmed callback with the selected seat(s) in the following format: JSON { "selectedSeats": [ "12A", "12B" ] } The retailer should include these seat selections in their booking API request. Example Integration HTML <!DOCTYPE html> <html> <head> <script src="https://cdn.distribusion.com/seatmap-sdk.js"></script> </head> <body> <div id="seatmap-container"></div> <script> DistribusionSeatMap.init({ marketingCarrier: 'UTIL', departureStation: 'BRBHZBHB', arrivalStation: 'BRLZSRDJ', departureTime: '2024-09-19T07:00', arrivalTime: '2024-09-19T14:30', containerId: 'seatmap-container', onSelectionConfirmed: function(selectedSeats) { console.log('Seats selected:', selectedSeats); // Send these seats to the booking API } }); </script> </body> </html> <!DOCTYPE html> <html> <head> <script src="https://cdn.distribusion.com/seatmap-sdk.js"></script> </head> <body> <div id="seatmap-container"></div> <script> DistribusionSeatMap.init({ marketingCarrier: 'UTIL', departureStation: 'BRBHZBHB', arrivalStation: 'BRLZSRDJ', departureTime: '2024-09-19T07:00', arrivalTime: '2024-09-19T14:30', containerId: 'seatmap-container', onSelectionConfirmed: function(selectedSeats) { console.log('Seats selected:', selectedSeats); // Send these seats to the booking API } }); </script> </body> </html> Conclusion The Distribusion Seat Map JS SDK offers a seamless solution for retailers to integrate seat selection without handling complex API requests. By adding a simple script and configuring minimal parameters, retailers can enhance the booking experience for their customers efficiently. • [Examples of Booking Engines](https://docs.distribusion.com/dt/booking-engine/examples-of-booking-engines.md): To help you visualise the breath of our content and a sample of the sort of user experience you can build with our API, see below a few links to our whitelabel solutions. Demo Examples As users expect a different experience depending on the region and the type of service they are purchasing here you have three different examples of our Booking Engine. These three allow users to purchase ancillaries, apply discounts and even use our Virtual Interlining features (Paris - Amsterdam on Europe). European Flow Brazil & Latam Flow Airport Flow Post Booking With Distribusion, you get more than just a booking engine, you also get an automatic after sales process. Your customers are able to download the ticket in their prefer format (pdf, apple pass or google wallet) and refund their tickets using the booking management section. As payments are disabled above, here an example of a confirmation page and the booking management page. Checkout Confirmation Booking Management Refund Visit and Play with Some of our Integrations Widget Integrations Easybus Aéroport Paris-Beauvais Website DublinExpress Alsa Airport Abu Dhabi International Airport Other Brands Amtrak NS megabus Scan to Book Flibco Alibus (open and scan QR to preview) • [Custom Domain](https://docs.distribusion.com/dt/booking-engine/custom-domain.md): When using Distribusion Online booking engine you can set up your custom domain. As you own the domain, please follow the steps to make it work. Distribusion Online Booking engine as your main website Example: www.your_domain.com Send the domain you want to set up to your point of contact at Distribusion. Stop here for now until your point of contact at Distribusion confirms that the preconfiguration has been done on Distribusion side. Login into your domain hosting account (example, GoDaddy, …). Please make sure you only do this once you are ready to go live with the Distribusion Online Booking Engine. Once there, go to your domain DNS management section (or record editor). Here you have two examples of how it should look. Please keep in mind the interface may be different depending on your domain hosting. 4. Once there, add a record with the following information: Type: CNAME Name (or Host): www Target (or Destination): book.distribusion.com Sometimes the target (or destination) might need a dot at the end, like this: book.distribusion.com. 5. Once this has been done, please go here and add your domain: https://www.nslookup.io/domains/book.transport-ticket.com/dns-records/cname/ If it looks like this then you are done. Distribusion Online Booking engine as booking engine only Example: book.your_domain.com Decide which subdomain you are going to use, for example: book.your_domain.com or tickets.your_domain.com. Login into your domain hosting account (example, GoDaddy, …). Please make sure you only do this once you are ready to go live with the Distribusion Online Booking Engine. Once there, go to your domain DNS management section (or record editor). Here you have two examples of how it should look. Please keep in mind the interface may be different depending on your domain hosting. 4. Once there, add a record with the following information (on the name add the domain you have decided): Type: CNAME Name (or Host): book.your_domain.com Target (or Destination): book.distribusion.com Sometimes the target (or destination) might need a dot at the end, like this: book.distribusion.com. 6. Once this has been done, please go here and add your domain: https://www.nslookup.io/domains/book.transport-ticket.com/dns-records/cname/ If it looks like this then you are done. 7. Send your subdomain to your point of contact at Distribusion. Distribusion will do the final configuration for the go live. • [Analytics](https://docs.distribusion.com/dt/booking-engine/analytics.md): To help you measure performance, attribute conversions, and optimize marketing campaigns, the Distribusion whitelabel booking engine supports tracking through both custom booking identifiers and UTM parameters. This allows you to analyze where bookings are coming from, tie them back to specific campaigns, and monitor conversion activity using tools like Google Analytics. Booking ID Tracking You can track the booking reference by passing the retailerBookingNumber as a URL parameter. This value will appear in the Transaction Overview report that we provide monthly by default or daily upon request. Example Plain text https://book.distribusion.com/checkout?[...]&retailerBookingNumber=111111 https://book.distribusion.com/checkout?[...]&retailerBookingNumber=111111 UTM Tracking For source and campaign attribution, you can append standard UTM parameters to the whitelabel URL: URL Parameter Google Analytics Field utm_id Campaign Code utm_source Source utm_medium Medium utm_campaign Campaign utm_term Keyword utm_content Ad Content Example Plain text https://book.distribusion.com/landing ?[...]&utm_source=newsletter&utm_medium=email https://book.distribusion.com/landing ?[...]&utm_source=newsletter&utm_medium=email SDK Widget If you're embedding the booking widget via SDK, you can pass UTM parameters programmatically: Search Widget Plain text <div id="distribusion-search"></div> <script src="https://book.distribusion.com/sdk.1.0.0.js"></script> <link href="https://book.distribusion.com/sdk.1.0.0.css" rel="preload"> <script> window.addEventListener('load', () => { const root = document.getElementById('distribusion-search') Distribusion.Search.mount({ root, partnerNumber: 222222, locale: 'en', currency: 'EUR', // optional defaults: { // optional departureStation: 'CODE', // or departureArea: 'CODE', // or departureCity: 'CODE', arrivalStation: 'CODE', // or arrivalArea: 'CODE', // or arrivalCity: 'CODE' }, utm: { // optional utm_campaign: 'VALUE', utm_content: 'VALUE', utm_id: 'VALUE', utm_medium: 'VALUE', utm_source: 'VALUE', utm_term: 'VALUE' } }) }) </script> <div id="distribusion-search"></div> <script src="https://book.distribusion.com/sdk.1.0.0.js"></script> <link href="https://book.distribusion.com/sdk.1.0.0.css" rel="preload"> <script> window.addEventListener('load', () => { const root = document.getElementById('distribusion-search') Distribusion.Search.mount({ root, partnerNumber: 222222, locale: 'en', currency: 'EUR', // optional defaults: { // optional departureStation: 'CODE', // or departureArea: 'CODE', // or departureCity: 'CODE', arrivalStation: 'CODE', // or arrivalArea: 'CODE', // or arrivalCity: 'CODE' }, utm: { // optional utm_campaign: 'VALUE', utm_content: 'VALUE', utm_id: 'VALUE', utm_medium: 'VALUE', utm_source: 'VALUE', utm_term: 'VALUE' } }) }) </script> Route Widget Plain text <div id="distribusion-search"></div> <script src="https://book.distribusion.com/sdk.1.0.0.js"></script> <link href="https://book.distribusion.com/sdk.1.0.0.css" rel="preload"> <script> window.addEventListener('load', () => { const root = document.getElementById('distribusion-search') Distribusion.Search.mount({ root, partnerNumber: 222222, partnerBookingNumber: 222222, locale: 'en', currency: 'EUR', // optional defaults: { // optional departureStation: 'CODE', // or departureArea: 'CODE', // or departureCity: 'CODE', arrivalStation: 'CODE', // or arrivalArea: 'CODE', // or arrivalCity: 'CODE' }, utm: { // optional utm_campaign: 'VALUE', utm_content: 'VALUE', utm_id: 'VALUE', utm_medium: 'VALUE', utm_source: 'VALUE', utm_term: 'VALUE' } }) }) </script> <div id="distribusion-search"></div> <script src="https://book.distribusion.com/sdk.1.0.0.js"></script> <link href="https://book.distribusion.com/sdk.1.0.0.css" rel="preload"> <script> window.addEventListener('load', () => { const root = document.getElementById('distribusion-search') Distribusion.Search.mount({ root, partnerNumber: 222222, partnerBookingNumber: 222222, locale: 'en', currency: 'EUR', // optional defaults: { // optional departureStation: 'CODE', // or departureArea: 'CODE', // or departureCity: 'CODE', arrivalStation: 'CODE', // or arrivalArea: 'CODE', // or arrivalCity: 'CODE' }, utm: { // optional utm_campaign: 'VALUE', utm_content: 'VALUE', utm_id: 'VALUE', utm_medium: 'VALUE', utm_source: 'VALUE', utm_term: 'VALUE' } }) }) </script> Google Tag Manager Setup To enable conversion tracking in Google Analytics via Google Tag Manager: 1. Share your GTM Container ID with us (format: GTM-XXXXXXX) Login into https://tagmanager.google.com/ Get the GTM ID from the page 2. We will configure the whitelabel integration and expose the required data layer. 3. On your end, set up event tracking in GA using your GTM container. In your GTM account, create a Data Layer Variable (e.g., utmContent ) that matches the key (e.g. utm_Content ) used in the data layer. Add this variable to your conversion tag in GTM to start tracking If you want to, you can also share the Google Analytics container ID, for example: UA-1319168-1. • [Languages](https://docs.distribusion.com/dt/booking-engine/languages.md): The booking engine solution supports the following languages. Language Name Locale Code Albanian sq Arabic ar Bosnian bs Bulgarian bg Chinese zh Croatian hr Czech cs Danish da Dutch nl English (CAN) en-CA English (GB) en English (IE) en-IE English (USA) en-US French fr German de Greek el Hungarian hu Italian it Japanese ja Macedonian mk Norwegian no Polish pl Portuguese pt Portuguese (BR) pt-BR Romanian ro Russian ru Serbian sr Slovak sk-SK Spanish es Spanish (CO) es-CO Spanish (EC) es-EC Spanish (MX) es-MX Swedish sv Thai th-TH Turkish tr Ukrainian uk Urdu ur Vietnamese vi • [Agent Counter](https://docs.distribusion.com/dt/agent-counter.md): Distribusion’s Agency Counter is a dedicated portal for travel agents to manage ground transportation bookings. Through the tool, agents can access over 1,000 transportation providers globally, including bus, airport transfer, and ferry services. The platform streamlines the entire booking process, from searching available options and booking tickets to handling payment and financial settlement, all through a single interface. Additionally, the Agency Counter includes data-driven tools that allow agents to track booking performance, monitor trends and adjust strategies to optimize revenue. The platform’s centralized booking management ensures a smooth experience for both agents and their customers. Contact your Partnership Manager for more details about the Agency Counter. • [Connectivity Services](https://docs.distribusion.com/dt/connectivity-services.md): Transform your transportation operations with Distribusion's cutting-edge custom tech solutions. We specialize in helping retailers and carriers optimize their services, boost revenue, and enhance customer experience. Request consultation on how we can support delivering an integration into your system. • [Invoicing and Payments](https://docs.distribusion.com/dt/invoicing-and-payments.md): Transaction Overview As part of our regular settlement & invoicing processes, you receive a detailed transaction overview for each booking and cancellation made with your API credentials. For easier reconciliation, we enable you to pass your own booking number (parameter retailer_booking_number ) in your /reservations/confirm or /bookings/create request, which will be added to the respective booking in the transaction overviews. We can also send through a daily transaction overview at request. For an example transaction overview, please see this sheet . It is possible to hide all customer data on the transaction overview. With this functionality activated the following fields are hidden: customer title , customer first name , customer last name , customer street , customer city , customer zip code , customer phone number , customer e-mail address , passengers , customer flight number , discount code , extras , agent . Contact your Partnership Manager to request these fields to be hidden from your transaction overview document. Self Billing Invoice Along with the transaction overview, Distribusion will also send an invoice detailing our commissions, see example below. Invoices are distributed in the first few days of the following month, i.e. January's invoice will be received between 1st - 3rd February. Commissions from Conducted Bookings : Refers to ticket price x commission rate Commissions from Cancelled Bookings : It is a negative value and refers to ticket price x commission rate Commissions from Customer Cancellation Fees : Refers to customer cancellations fee x commission rate Demand Note Distribusion will also regularly send a demand note, which outlines what is owed to a given carrier: Revenues from Conducted Bookings : It is the total ticket price value of booking transactions Revenues from Cancelled Bookings : It is a negative value, refers to the total ticket price value of cancellation transactions Customer Cancellation Fees from Cancelled Bookings : It is the total value of customer cancellation fee value, in which customer cancellation fee is ticket price - refund amount Amount owed by Distribusion : It is a negative value, refers to the amount from the Self Billing Invoice • [Dictionary](https://docs.distribusion.com/dt/dictionary.md): In this section we lay out some of the terminology used throughout this documentation, in order to avoid any confusion. Operational & Industry Terminology Term Definition Carrier A transportation company assigned a unique 4-letter code in Distribusion's system. Can be a marketing carrier or an operating carrier. Marketing Carriers Entity defining fare rules for customers. Legally liable for trip success and mostly responsible for customer service. Operating Carriers Entity operating the trip, can also be a marketing carrier. Carrier Code A 4-letter code used as a unique identifier for every carrier in Distribusion's system. Travel Agency Online or offline agency selling tourism and mobility related products. OTA Online Travel Agency; website selling travel products to end consumers or business customers. Conducts payments and customer service to a certain degree. STA Stationary Travel Agencies; brick-and-mortar locations that sell travel products. PAX Abbreviation of "Persons approximately", used in the tourism industry for the number of passengers. Passenger type Type of passenger defined by age, which can differ between carriers (infant, child, youth, adult, senior). IATA Code A 3-letter code used as unique identifiers for airports, introduced by the International Air Transport Association. Retailer Partner Number A 6-digit code used as your internal identifier in Distribusion and also need for some of the API endpoint calls. Commercial Terminology Term Definition Booking Fee A fee charged by a marketing carrier to a customer during the booking process, added on top of the regular ticket price and independent of the number of passengers. Commission Compensation from a carrier to a retailer for successful ticket sales. Varies between OTAs, STAs, and Affiliates, defined as a net percentage of gross ticket value. Transaction fee The fee earned by Distribusion for providing distribution services to carriers. Credit Note Invoicing document showing accumulated sum of commissions earned by a retailer in a given time interval. Demand Note Invoicing document showing accumulated sum of ticket revenues generated by a retailer in a given time interval.