Order data
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
curl --location --globoff 'https://api.demo.distribusion.com/retailers/v4/reservations/{{reservation_id}}' \
--header 'Api-Key: <YOUR-API-KEY>'
Parameter | In | Type | Description |
| path | string | The reservation ID returned by |
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.
{
"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.
{
"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:
Item | Covers | Passenger type | Fare class | Price |
|
|
|
| β¬42.40 |
|
|
|
| β¬42.40 |
|
|
|
| β¬42.40 |
|
|
|
| β¬21.30 |
Total | β¬148.50 |
To build a breakdown:
- Read
data.relationships.order_itemsfor the item IDs and resolve them inincluded. - For each item, take
pricefor the amount andpassenger_idsfor who it covers. - Resolve
applied_passenger_types[].idin included to label the line βPNOS(adult),PCIL(child) and the rest are documented under Passenger Types. Where it is not returned, readtypeon the passenger instead. - Resolve
relationships.fare_classfor the fare name andrelationships.conditionsfor 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.
Field | Type | Description |
| integer | Version counter for the order. Increments on every change. |
| integer | Total in the currency's fractional unit. Equals the sum of |
| integer | Total before any discount. Compare with |
| string |
|
| 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.
Field | Type | Description |
| UUID | Item identifier. This is what appears in |
| string |
|
| array[string] | The passengers this item covers. Resolve in included under |
| array[string] | The segments this item covers. More than one means the carrier priced those legs together. |
| integer | Current price in the currency's fractional unit |
| integer | Price before any discount |
| array | What the item delivers. Each entry has |
| array | The fare entitlement applied per passenger, as |
| object | The fare sold β see Fare Classes. Items on one reservation can carry different fare classes; see Fares Per Segment. |
| array | The refund and exchange rules for this item |
Condition
included[] entries with type: "conditions", referenced from an item.
Field | Type | Description |
| string | The carrier's condition code |
| string | Human-readable fare name |
| 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. |
| string |
|
| string |
|
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:
Status | When |
| 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.
On this page
- Order data