Odyssey Service API (v1)

Download OpenAPI specification:

Journey planning and fares: journeys with their fare options, saved journeys, legs and fares, rovers, seasons, travelcards, ticket and restriction validity, bike reservations and train loading.

Every path is under /odyssey.

Responses

Successes don't share one shape: some routes answer {"status": "success", "data": ...}, others {"data": ...} or {"response": ...}, each with links. Each operation shows its own. A failure is {"status": "error", "code": "...", "message": "..."}, for a 4xx as well as a 5xx; an error that isn't one of the service's own has no code.

Journey planning

Journeys between two stations, with their fare options.

Plan journeys with their fares

Plans outward (and, with inwardDate, inward) journeys between two locations and finds the fare options for them. The response is not in the usual {"status": "success", "data": ...} form: it has response, pagination, links and messages at the top level.

Journeys, legs, fare options and fares are given as links (/odyssey/journey/..., /odyssey/fare-option/...) and are all in links. They are also saved for about a day, so they can be fetched again with GET /odyssey/journey/{id}, /odyssey/leg/{id}, /odyssey/fare-option/{id} and /odyssey/fare/{id}.

Other links (/station/..., /toc/..., /ticket-type/..., /delivery/...) are resolved through link-service only when include is given.

Dates and times are UK local time. A date and time in the past is moved to now, unless the tenant (or showAlreadyDepartedTrains) shows departed trains.

Many parameters that are not about the search itself override tenant settings or are for debugging; they are marked so.

query Parameters
tenant
string
Example: tenant=rsm

The tenant, or give it as the X-Tenant header. When both are given, this one wins.

subtenant
string

The subtenant, or give it as the X-Subtenant header. When both are given, this one wins.

include
string

Which links to other services to resolve into links, as the link service takes it: comma-separated paths of resource names, dot-separated for links inside links. None when not given or empty; Odyssey's own links are resolved anyway.

requestId
string

The request ID, when there's no X-Request-Id header (this wins over the header).

sessionId
string

The session ID, when there's no X-Session-Id header (this wins over the header).

origin
required
string
Example: origin=EUS

Where the outward journey starts, as an NLC, CRS or TIPLOC code. An unknown code is a 400 (invalid-location-code).

destination
required
string
Example: destination=MAN

Where the outward journey ends, as an NLC, CRS or TIPLOC code.

via
string
Example: via=CRE

Locations the journeys must pass, as comma-separated NLC, CRS or TIPLOC codes (or a repeated parameter). At most 3.

avoid
string

Locations the journeys must not pass, as for via. At most 3.

stopAt
string
Example: stopAt=PBO,YRK

Locations the journeys' trains must call at (pick up or set down), as for via; for a group station, any of its stations. At most 3. Only the Go journey planner applies it.

tocs
string
Example: tocs=VT,NT

Comma-separated 2-character TOC codes; each journey must use at least one of them. Not with excludedTocs, and not for a tenant that sets its own (tocs-set-by-tenant).

excludedTocs
string
Example: excludedTocs=CS

Comma-separated 2-character TOC codes the journeys must not use. Only the shape is checked, so an unknown code does nothing. Not with tocs.

excludedModes
string
Example: excludedModes=bus,replacement-bus

Comma-separated leg modes the journeys must not use: train, bus, replacement bus, walk, tube, tram, funicular, ferry, cable car, metro, transfer. Case-insensitive; - and _ can stand for spaces. Another value is a 400 (invalid-excluded-mode).

minWait
integer >= 0
Example: minWait=10

The shortest wait at a change, in minutes.

maxWait
integer >= 0
Example: maxWait=60

The longest wait at a change, in minutes. Not less than minWait.

maxChanges
integer [ 0 .. 9 ]
Example: maxChanges=2

The most changes a journey can have.

adults
integer >= 0
Default: 0
Example: adults=1

The number of adults. 0 when not given. Adults and children together can't be more than the tenant's maximum group size (9 by default).

children
integer >= 0
Default: 0

The number of children. 0 when not given.

bikes
integer >= 0
Default: 0

The number of bikes. Not more than the passengers.

pets
integer >= 0
Default: 0

The number of pet-friendly compartments (Caledonian Sleeper).

railcards
string
Example: railcards=YNG,YNG

Comma-separated railcard codes, one for each railcard (a code can repeat). An unknown code is a 400 (railcard-not-found); a code the tenant doesn't allow is left out.

promoCode
string

A promo code for a discount.

outwardDate
required
string <date>
Example: outwardDate=2025-05-21

The outward date.

outwardDepartAt
string
Example: outwardDepartAt=09:00

Outward journeys departing at or after this time (HH:mm or HH:mm:ss, two-digit hours). With no time parameter, at or after the current time. Only one of the outward time parameters is used, in this order. The inward ones work the same.

outwardDepartAfter
string

The same as outwardDepartAt.

outwardDepartBy
string

Outward journeys departing at or before this time.

outwardArriveAt
string

Outward journeys arriving at or after this time.

outwardArriveBy
string

Outward journeys arriving at or before this time.

inwardDate
string
Example: inwardDate=2025-05-23

The inward date, for a return search; open for an open return (no inward journeys, return fares). The inward date and time can't be before the outward (inward-before-outward).

inwardDepartAt
string

Inward journeys departing at or after this time.

inwardDepartAfter
string

The same as inwardDepartAt.

inwardDepartBy
string

Inward journeys departing at or before this time.

inwardArriveAt
string

Inward journeys arriving at or after this time.

inwardArriveBy
string

Inward journeys arriving at or before this time.

returnDate
string
Deprecated

The old name of inwardDate, used when there's no inwardDate. Its times are then returnDepartAt, returnDepartBy, returnArriveAt and returnArriveBy.

horizon
integer >= 1
Example: horizon=12

How many hours of trains to look through. More than 27 only for a one-way search. By default the planner tries the tenant's horizons in turn (6, then 27 hours, unless the tenant sets others). Larger groups can have a lower limit (too-many-passengers-for-horizon).

limit
integer
Default: 5
Example: limit=5

The most journeys in each direction. Above the tenant's maximum (100 by default), the maximum.

firstClass
boolean
Default: true

false for no first class fares. A B2B customer's travel policy can also turn them off. Booleans are true for true, 1, yes or on, and false for anything else.

standardClass
boolean
Default: true

false for no standard class fares.

singles
boolean
Default: true

false for no single fares.

returns
boolean
Default: true

false for no return fares (inward singles are still given).

advance
boolean
Default: true

false for no Advance fares.

ticketCategory
string
Example: ticketCategory=off-peak

Only fares in these categories, comma-separated: anytime, off-peak, advance.

fareSetters
string
Example: fareSetters=CAL,SCS

Only fares from these fare setters (or fare setter groups), comma-separated. By default the tenant's.

ticketType
string
Example: ticketType=SOS,SDS

Only fares with these ticket type codes, comma-separated. Replaces the tenant's ticket type list.

routeCode
string
Example: routeCode=00000

Only fares with these route codes, comma-separated.

allFares
boolean

All fares for all journeys, with the reasons fares aren't valid (validation, returnValidation) and bike spaces (bikeReservations). Fares of cancelled or unavailable journeys too, passing points, every Advance tier, no split tickets, every delivery method in delivery (with why it isn't available), and fares' dtdAdultPrice and dtdChildPrice. With licensee parameters, also retailability. By default the tenant's useAllFaresForAllJourneys.

licenseeType
string^[0-9]{1,4}$
Example: licenseeType=1

The RCS licensee type ID (1 to 4 digits) the fare options' delivery methods are for, added to delivery and hasETicket as licenseeType. By default the tenant's. In the allFares mode, a value delivery-service doesn't list is a 400 (invalid-licensee-type), and any licensee parameter adds retailability.

licenseeCode
string^(\*|[A-Za-z0-9]{1,20})$
Example: licenseeCode=HO

The RCS licensee code (1 to 20 letters or digits), or * for none, added to the delivery links as licensee. As licenseeType otherwise (invalid-licensee-code).

licenseeChannel
string^[0-9]{1,4}$
Example: licenseeChannel=6

The RCS channel ID (1 to 4 digits), added to the delivery links as channel. As licenseeType otherwise (invalid-licensee-channel).

useSplits
boolean

Tenant setting. Split tickets. Never in the allFares mode.

useSplitsForEmptyResults
boolean

Tenant setting. Split tickets for journeys with no other fares.

splitPattern
string

Only split tickets with these patterns, comma-separated.

fareAlgorithm
string
Enum: "fast" "thorough"

Tenant setting. How fare options are made. Another value is a 500.

showPassingPoints
boolean

Tenant setting. Calling points where the train doesn't stop too. Always in the allFares mode.

showAlreadyDepartedTrains
boolean

Tenant setting. Keep a date and time in the past instead of moving it to now.

showSlowExpensiveTrains
boolean

Tenant setting. Keep journeys that are both slower and dearer than others.

showEmptyFastTrains
boolean

Tenant setting. Keep fast journeys with no fares.

overlapPagingResults
boolean

Tenant setting. The earlier and later pages start at the first and last journey's time instead of a minute before or after.

useRoomCountSelector
boolean

Tenant setting. Caledonian Sleeper room counts.

useProductAvailabilityMatrix
boolean

Tenant setting. Adds productAvailability.

useBookabilityMatrix
boolean

Tenant setting. Adds canSelectSeatOnJourney and canSelectSeatOnLeg.

fixChildOriginalPrice
boolean

Tenant setting.

journeyLimitMultiplier
integer

Tenant setting. How many journeys to ask the planner for, as a multiple of limit (halved for popular station pairs).

journeyLimitMin
integer

Tenant setting. The fewest journeys to ask the planner for.

journeyLimitMax
integer

Tenant setting. The most journeys to ask the planner for.

preValidationResultMultiplier
integer

Tenant setting. How many journeys to keep before fare validation, as a multiple of limit.

extraFareOptionJourneys
integer
Default: 4

How many extra journeys to look for fare options on.

debug
boolean
Default: false

Debugging. Adds debug to the response and X-Metrics-Debug and other metrics headers.

noCache
boolean
Default: false

Debugging. Don't use cached results.

journey
string
Example: journey=/journey/141:141:EUS_MAN_C21856

Debugging. Only these journeys, as journey links (with or without /odyssey) separated by ;.

fare
string
Example: fare=/fare/1072-0438-00000-SOS-000-1----141-1-0--19300

Debugging. Only this fare, as a fare link.

availability
string
Enum: "full" "none"

Debugging. Treat every fare as fully available (full) or not available (none) instead of asking reservation-service. Other values are ignored.

fareOptionFactory
string

Debugging. The fare option generator to prefer. An unknown one is a 400 (invalid-fare-option-factory).

patterns
string

Debugging. Passed to the journey planner.

patternSource
string

Debugging. Passed to the journey planner.

showAllSplits
boolean
Default: false

Debugging. All split tickets, not only the cheapest.

suppressSalesFor
string

Debugging. Treat sales as suppressed for journeys on these trains (comma-separated train UIDs).

maxMixedCalSleeperJourneys
integer

Debugging. The most mixed Caledonian Sleeper and ScotRail journeys.

header Parameters
X-Tenant
string

The tenant, for internal callers.

X-Subtenant
string

The subtenant, for internal callers.

X-Token-Data
string

The customer's token data. For a B2B tenant, the customer's travel policy (from customer-service) can turn off first class and set a maximum price per ticket.

X-Request-Id
string <= 36 characters

The request ID, in fare options' requestId. Cut to 36 characters. A new one when not given.

X-Session-Id
string <= 36 characters

The session ID, in fare options' sessionId; its last 4 characters end the fare option IDs. Cut to 36 characters. The request ID when not given.

Responses

Response samples

Content type
application/json
{
  • "response": {
    },
  • "pagination": {
    },
  • "links": {
    },
  • "messages": [ ]
}

Fares

Fare options between two stations without journeys.

Search fare options between two stations (same as fares-search)

The same endpoint as /odyssey/fares-search.

query Parameters
tenant
string
Example: tenant=rsm

The tenant, or give it as the X-Tenant header. When both are given, this one wins.

include
string

Which links to other services to resolve into links, as the link service takes it: comma-separated paths of resource names, dot-separated for links inside links. None when not given or empty; Odyssey's own links are resolved anyway.

origin
required
string
Example: origin=TBW

CRS, NLC or TIPLOC code.

destination
required
string
Example: destination=BTN

CRS, NLC or TIPLOC code.

outwardDate
required
string <date>
Example: outwardDate=2026-11-02

The outward date, YYYY-MM-DD. Not in the past.

inwardDate
string <date>
Example: inwardDate=2026-11-03

The inward date, YYYY-MM-DD. Not before outwardDate.

returnDate
string <date>

Another name for inwardDate; wins when both are given.

adults
required
integer >= 0
Example: adults=2

Number of adults. Not validated.

children
required
integer >= 0
Example: children=1

Number of children. Not validated.

cycles
integer >= 0
Default: 0

Number of bikes.

railcards
string
Example: railcards=YNG

Comma-separated railcard codes; repeat a code for more than one railcard of the type. Railcards the tenant doesn't allow are ignored.

firstClass
string
Default: "true"
Enum: "true" "false"

true to include first-class fares. Anything else is false.

standardClass
string
Default: "true"
Enum: "true" "false"

true to include standard-class fares. Anything else is false.

singles
string
Default: "true"
Enum: "true" "false"

true to include singles. Anything else is false.

returns
string
Default: "true"
Enum: "true" "false"

true to include returns. Anything else is false.

advance
string
Default: "true"
Enum: "true" "false"

true to include Advance fares. Anything else is false.

ticketType
string
Example: ticketType=SDS

Comma-separated ticket type codes. Only fares with these ticket types.

routeCode
string
Example: routeCode=00073

Comma-separated route codes. Only fares with these routes.

ticketCategory
string
Enum: "advance" "off-peak" "anytime"
Example: ticketCategory=off-peak

Only fares with ticket types of this category. One value only: a comma-separated list, or an unknown value, is ignored.

tocs
string
Example: tocs=SN,GX

Comma-separated fare setter (TOC) codes. Only fares set by these.

maxPrice
integer
Example: maxPrice=5000

Highest total price of a fare option, in pence.

maxGroupSize
integer

Passed through as given (a string), not the tenant's maximum as on /odyssey/jp. Used only by the Southern DaySave fare option generator.

allFares
string
Example: allFares=true

The allFares mode: every fare, with the reasons it isn't valid or available. true, 1, yes or on for on, anything else for off. Without it, the tenant's useAllFaresForAllJourneys setting.

promoCode
string
Example: promoCode=SUMMER26

A promo code to apply to the fares, where it can be.

userGroupId
integer

The user group, for user group discounts.

licenseeType
string^[0-9]{1,4}$
Example: licenseeType=1

RCS licensee type id for the delivery links, as on /odyssey/jp. Up to 4 digits. The tenant's when not given.

licenseeCode
string^(\*|[A-Za-z0-9]{1,20})$
Example: licenseeCode=HO

RCS licensee (business) code, or * for none. The tenant's when not given.

licenseeChannel
string^[0-9]{1,4}$
Example: licenseeChannel=6

RCS channel id for the delivery links. Up to 4 digits. The tenant's when not given.

header Parameters
X-Tenant
string

The tenant, for internal callers.

Responses

Response samples

Content type
application/json
{
  • "data": {
    },
  • "links": {
    }
}

Seasons

Season tickets and their options.

Search season tickets

Season ticket fares between two stations for one passenger, by season duration. Each fare is in links (the same shape as a /odyssey/fare/{id}), and is saved so that /odyssey/fare/{id} returns it.

For a B2B tenant, the user's travel policy (from customer-service, with the request's headers) must allow seasons; if it doesn't, the request is a 403.

400 codes: no-tenant, tenant-not-found, missing-start-date, invalid-start-date, missing_property, invalid-location-code, invalid-passenger-type, invalid-duration, railcard-not-found.

query Parameters
tenant
string
Example: tenant=rsm

The tenant, or give it as the X-Tenant header. When both are given, this one wins.

include
string

Which links to other services to resolve into links, as the link service takes it: comma-separated paths of resource names, dot-separated for links inside links. None when not given or empty; Odyssey's own links are resolved anyway.

origin
required
string
Example: origin=TBW

CRS, NLC or TIPLOC code.

destination
required
string
Example: destination=CHX

CRS, NLC or TIPLOC code.

startDate
required
string <date>
Example: startDate=2026-11-02

The first day of the season, YYYY-MM-DD. From today to the tenant's seasons limit (21 days by default) ahead.

passengerType
required
string
Enum: "adult" "child"
Example: passengerType=adult

One adult or one child.

duration
string
Example: duration=0100,0304,1200

Comma-separated season durations, each MMDD: months 00-12, days 00-30. Under a month, only 0007 and 0028. Over 10 months and 12 days is an annual (1200). Shorter than 4 characters in all, or not given, is the default: 0007, 0028, 0100, 0300, 1200.

railcards
string
Example: railcards=NGC

Comma-separated railcard codes.

railcard
string
Deprecated

Old name for railcards, used when railcards isn't given.

ticketType
string
Example: ticketType=PSS

Comma-separated ticket type codes. Only fares with these ticket types.

routeCode
string
Example: routeCode=00000

Comma-separated route codes. Only fares with these routes.

promoCode
string
Example: promoCode=SUMMER26

A promo code to apply to the fares, where it can be.

noCache
string

true, 1, yes or on to work out the zones between the stations again, not from the cache.

flatten
string
Default: "false"
Enum: "true" "false"

true gives fares as one list of fare links, not indexed by duration.

header Parameters
X-Tenant
string

The tenant, for internal callers.

Responses

Response samples

Content type
application/json
{
  • "response": {
    },
  • "links": {
    }
}

Search season tickets, as fare options

The same search as /odyssey/season-search, with the same parameters and errors, but each fare is wrapped in a fare option with one fare use, for one adult or one child as passengerType says. The fare options have hasETicket and delivery links, dated startDate. The add-ons are fare options too.

flatten has no effect: fares is always by duration.

400 codes: no-tenant, tenant-not-found, missing-start-date, invalid-start-date, missing_property, invalid-location-code, invalid-passenger-type, invalid-duration, railcard-not-found.

query Parameters
tenant
string
Example: tenant=rsm

The tenant, or give it as the X-Tenant header. When both are given, this one wins.

include
string

Which links to other services to resolve into links, as the link service takes it: comma-separated paths of resource names, dot-separated for links inside links. None when not given or empty; Odyssey's own links are resolved anyway.

origin
required
string
Example: origin=TBW

CRS, NLC or TIPLOC code.

destination
required
string
Example: destination=CHX

CRS, NLC or TIPLOC code.

startDate
required
string <date>
Example: startDate=2026-11-02

The first day of the season, YYYY-MM-DD. From today to the tenant's seasons limit (21 days by default) ahead.

passengerType
required
string
Enum: "adult" "child"
Example: passengerType=adult

One adult or one child.

duration
string
Example: duration=0100,0304,1200

Comma-separated season durations, each MMDD: months 00-12, days 00-30. Under a month, only 0007 and 0028. Over 10 months and 12 days is an annual (1200). Shorter than 4 characters in all, or not given, is the default: 0007, 0028, 0100, 0300, 1200.

railcards
string
Example: railcards=NGC

Comma-separated railcard codes.

railcard
string
Deprecated

Old name for railcards, used when railcards isn't given.

ticketType
string
Example: ticketType=PSS

Comma-separated ticket type codes. Only fares with these ticket types.

routeCode
string
Example: routeCode=00000

Comma-separated route codes. Only fares with these routes.

promoCode
string
Example: promoCode=SUMMER26

A promo code to apply to the fares, where it can be.

noCache
string

true, 1, yes or on to work out the zones between the stations again, not from the cache.

header Parameters
X-Tenant
string

The tenant, for internal callers.

Responses

Response samples

Content type
application/json
{
  • "response": {
    },
  • "links": {
    }
}

Travelcards

London Travelcards.

Search London Travelcards

Standalone Travelcard fare options (London zones) for a date and set of passengers: one fare option for each travelcard origin, destination and ticket type that has fares for all the passengers. Each fare option and its fares are in links and are saved, so /odyssey/fare-option/{id} and /odyssey/fare/{id} return them. The fare options have no hasETicket or delivery links.

400 codes: no-tenant, tenant-not-found, missing_property, invalid-date, railcard-not-found.

query Parameters
tenant
string
Example: tenant=rsm

The tenant, or give it as the X-Tenant header. When both are given, this one wins.

include
string

Which links to other services to resolve into links, as the link service takes it: comma-separated paths of resource names, dot-separated for links inside links. None when not given or empty; Odyssey's own links are resolved anyway.

date
required
string <date>
Example: date=2026-11-02

The day of travel, YYYY-MM-DD. Not checked against today.

adults
required
integer >= 0
Example: adults=1

Number of adults. Not validated beyond being present.

children
integer >= 0
Default: 0
Example: children=2

Number of children.

railcards
string
Example: railcards=YNG,DIS

Comma-separated railcard codes; repeat a code for more than one railcard of the type. No x multiplier (YNGx2 is railcard-not-found).

promoCode
string
Example: promoCode=SUMMER26

A promo code to apply to the fares, where it can be.

ticketType
string
Example: ticketType=ODT

Comma-separated ticket type codes. Only fares with these ticket types.

header Parameters
X-Tenant
string

The tenant, for internal callers.

Responses

Response samples

Content type
application/json
{
  • "response": {
    },
  • "links": {
    }
}

Rovers

Rover and ranger tickets.

Find Rangers and Rovers

Rover options for one rover code, start date and set of passengers: at most two, one for first class and one for standard class, each the cheapest combination of rover prices for the passengers. The rover options and their rovers are saved for 2 days, so /odyssey/rover-option/{id} and /odyssey/rover/{id} return them.

The origin of every rover is the tenant's retailer location; the destination is the rover's accounting location.

links always has the rover options and their rovers, whatever include says: they're read from the cache, not through the link service.

An unknown rover code, or one not on sale on startDate, gives an empty list.

400 codes: no-tenant, tenant-not-found, tenant-no-retailer-location, invalid-date, railcard-not-found, invalid-adults, invalid-children.

query Parameters
tenant
string
Example: tenant=rsm

The tenant, or give it as the X-Tenant header. When both are given, this one wins.

include
string

Which links to other services to resolve into links, as the link service takes it: comma-separated paths of resource names, dot-separated for links inside links. None when not given or empty; Odyssey's own links are resolved anyway.

roverCode
required
string
Example: roverCode=14R

The rover (or ranger) code.

startDate
required
string <date>
Example: startDate=2026-11-02

The first day of validity, YYYY-MM-DD. Any date; it isn't checked against today.

adults
required
integer >= 0
Example: adults=2

Number of adults, a whole number.

children
integer >= 0
Default: 0
Example: children=1

Number of children, a whole number.

railcards
string
Example: railcards=DIS

Comma-separated railcard codes. Each code once per railcard; no x multiplier. Rover prices for a railcard are used only when it's given.

header Parameters
X-Tenant
string

The tenant, for internal callers.

Responses

Response samples

Content type
application/json
{
  • "response": {
    },
  • "links": {
    }
}

Get a rover option

A rover option that /odyssey/rover-search returned in the last 2 days, read from the cache.

An unknown or expired ID is a 404. Query parameters don't change which one is found.

path Parameters
id
required
string
Example: 1072-I662-14R-77815--2026306-1072-I662-14R-77815--2026306

The rover IDs of the option's rovers, joined with -. A rover ID is {origin NLC}-{destination NLC}-{rover code}-{price}-{railcard code}-{year}{day of year}.

query Parameters
include
string

Which links to other services to resolve into links, as the link service takes it: comma-separated paths of resource names, dot-separated for links inside links. None when not given or empty; Odyssey's own links are resolved anyway.

Responses

Response samples

Content type
application/json
{
  • "data": {
    },
  • "links": {
    }
}

Get a rover

A rover that /odyssey/rover-search returned in the last 2 days, read from the cache.

An unknown or expired ID is a 404. Query parameters don't change which one is found.

path Parameters
id
required
string
Example: 1072-I662-14R-77815--2026306

{origin NLC}-{destination NLC}-{rover code}-{price}-{railcard code}-{year}{day of year}.

query Parameters
include
string

Which links to other services to resolve into links, as the link service takes it: comma-separated paths of resource names, dot-separated for links inside links. None when not given or empty; Odyssey's own links are resolved anyway.

Responses

Response samples

Content type
application/json
{
  • "data": {
    },
  • "links": { }
}

Validity

Which trains a ticket or a restriction is valid on.

Get a restriction's calendar

When a restriction allows travel, by day and time band, with the restriction's National Rail text and its rules. Used to show a fare's restriction code and its calendar.

A known restriction code always gets its text and rules. Its calendar (hourly) is for the given origin and destination, so it's only there when their fares have the restriction. Otherwise restriction.calendarOmitted says why (for example NT on the Carlisle to Newcastle part of a Manchester to Newcastle split ticket): ask with the fare's own origin and destination.

With a railcardCode, the railcard's restrictions also limit the calendar. Without a restriction code or a railcard, every time band is valid. The response has no links.

query Parameters
origin
required
string
Example: origin=MAN

CRS or NLC. A group's member stations count too.

destination
required
string
Example: destination=NCL

CRS or NLC.

date
required
string <date>
Example: date=2026-11-02

The first day of the calendar (YYYY-MM-DD).

restrictionCode
string
Example: restrictionCode=NT

The restriction code, any case.

railcardCode
string
Example: railcardCode=NEW

A railcard, any case, whose restrictions for all fares are added to the calendar. An unknown one is ignored.

days
integer [ 1 .. 366 ]
Default: 28
Example: days=28

How many days the calendar has, a whole number from 1 to 366.

isInward
string
Example: isInward=true

1, true, yes or on (any case) for the return direction: the restriction's return rules, with the origin and destination swapped.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "data": {
    }
}

Bikes

Bike reservation availability by day.

Loading

How full trains are, coach by coach.

List train loading

How full the tenant's operator's trains around now are, from the journey planner. Only some tenants have loading; for the others the planner's 400 is passed on. Times are local, to the minute.

The tenant is sent on to the planner as the X-Tenant header and the tenant parameter; the planner uses the header when there are both. The response has no resolved links: links is the planner's own.

query Parameters
tenant
string
Example: tenant=rsm

The tenant, or give it as the X-Tenant header. When both are given, this one wins.

header Parameters
X-Tenant
string

The tenant, for internal callers.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "data": [
    ],
  • "links": { }
}

Get one train's loading

How full one train is, by train UID, from the journey planner: the latest run it has for the UID. The same shape as an item of /odyssey/loading. The planner gets no tenant: tenant is only logged. The response has no resolved links.

path Parameters
tuid
required
string^[A-Za-z0-9]{1,16}$
Example: P89003

The Darwin train UID.

query Parameters
tenant
string
Example: tenant=rsm

The tenant, or give it as the X-Tenant header. When both are given, this one wins.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "data": {
    },
  • "links": { }
}