The SCHEDULE feed is an extract of train schedules from Network Rail's ITPS (Integrated Train Planning System), available in JSON and CIF format.
It is recommend that, if you are just starting out with the service, you use the JSON files. The CIF data is more suited to advanced users of the service and requires additional parsing compared to the JSON data.
Types of file
The schedule files in JSON format are available for all operators, or for individual operators.
Two types of file are available:
- A full extract is produced each day, which can be used to initialise your schedule database
- An update extract is produced each day, which can be applied to the previous update extract to bring your database up-to-date
These files are generated
The schedule files in CIF format are only available for all operators. A 'full' extract is available each Friday, and an 'update' extract is available daily.
Two types of file are available:
- A full extract is produced each Friday, which can be used to initialise your schedule database
- An update extract is produced each day, including Friday, which can be applied to the previous update extract to bring your database up-to-date
The CIF User Specification is available from ATOC's website, which details the format of the CIF file and the fields within.
The schedule data is compressed using gzip and is downloaded from Amazon S3 via a private URL which is valid for a few minutes after generation. Authentication will be required either by logging in through the Data Feeds website, or by sending your username and password as part of the HTTP request. On successful authentication, you will receive a 403 redirect to the location of the schedule files. Requests are of the format:
where type determines the TOCs contained in the schedule extract and whether the file is a full schedule or an update file, and day determines which day's update file is downloaded. For example:
would download a full schedule file for all TOCs.
Values for type and day can be one of the following:
|type||day||Description||Example URL (JSON format)||Example URL (CIF format)|
|CIF_ALL_FULL_DAILY||toc-full||Daily all-TOC snapshot||Daily||Weekly|
|CIF_ALL_UPDATE_DAILY||toc-update-DAY||Daily all-TOC update||Mon, Tue, Wed, Thu, Fri, Sat, Sun||Mon, Tue, Wed, Thu, Fri, Sat, Sun|
|CIF_XX_TOC_FULL_DAILY||toc-full||Daily snapshot for TOC XX||Daily||Not available|
|CIF_XX_TOC_UPDATE_DAILY||toc-update-DAY||Daily update for TOC XX||Mon, Tue, Wed, Thu, Fri, Sat, Sun||Not available|
|CIF_FREIGHT_FULL_DAILY||toc-full||Daily FREIGHT snapshot||Daily||Not available|
|CIF_FREIGHT_UPDATE_DAILY||toc-update-DAY||Daily update for FREIGHT||Mon, Tue, Wed, Thu, Fri, Sat, Sun||Not available|
DAY should be replaced with the shortened version of the name of the previous day. For example, on Monday, Sunday's ('sun') update should be requested.
A list of TOC Codes is available. Note that the TOC code used in the URL is not the ATOC code as seen in schedule files, but the business code as used in Network Rail systems.
The JSON data files are generated overnight and will be available from around 0600. The CIF files are go through a different process and will be available from around 0100.
Downloading via curl
The schedule file can be downloaded from the command line using the curl utility (included with linux, versions available for other operating systems) with the following syntax:
curl -L -u username:password -o file.gz 'https://datafeeds.networkrail.co.uk/ntrod/CifFileAuthenticate?type=CIF_ALL_FULL_DAILY&day=toc-full'
(Thanks to Jules Self for figuring this syntax out.)
JSON File Format
The schedule data in JSON format has a single JSON record per line. The file can be parsed line-by-line to extract the data required. Each schedule file contains:
- A header row
- Zero or more TIPLOC records
- Zero or more association records
- Zero or more schedule records
- and an end-of-file (EOF) record.
Each association and schedule record has an action - either 'create' or 'delete'. These are used in update files to add or remove records from the master schedule. Deletions will not be raised for schedules that have become historic. In full files, there will be no 'delete' records. Update files must be applied sequentially to a full file.
Schedule data contains three types of records:
- Tiploc records - containing details of timing point locations in the schedules
- Association records - defining associations between services
- Schedule records - containing details of the schedules themselves
CIF File Format
The CIF file contains a sequence of records. Each record is 80 character long. The first two bytes of a record identifies the type of a record.
- HD - Header record
- TI - TIPLOC Insert record
- TA - TIPLOC Amend record
- TD - TIPLOC Delete record
- AA - Association record
- BS - Basic schedule record
- BX - Basic schedule extra details record
- LO - Origin location record
- LI - Intermediate location record
- CR - Change en Route
- LT - Terminating location record
- ZZ - Trailer record (End of File)
Associations and schedule validities are between a start date and an end date, and on particular days of the week. They each have a Short Term Planning (STP) indicator field as follows:
- C - Planned cancellation: the schedule does not apply on this date, and the train will not run. Typically seen on public holidays when an alternate schedule applies, or on Christmas Day.
- N - STP schedule: similar to a permanent schedule, but planned through the Short Term Planning process and not capable of being overlaid
- O - Overlay schedule: an alteration to a permanent schedule
- P - Permanent schedule: a schedule planned through the Long Term Planning process
Permanent ('P') schedules can be overlaid by another schedule with the same UID - either a Variation ('O') or Cancellation Variation ('C'). For any particular day, of all the schedules for that UID valid on that day, the 'C' or 'O' schedule is the one which applies. Conveniently, it also means that the lowest alphabetical STP indicator wins - 'C' and 'O' are both lower in the alphabet than 'P'.
This process allows a different schedule to be valid on particular days, or the service to not be valid on that day. For example, a schedule may be valid Monday - Friday each day of the year, but have a Cancellation Variation on Christmas Day and Boxing Day only.
Cancellation variations are usually within the validity period of the base (permanent) schedule, however it is possible to have a cancellation variation which has a 'valid from' date which is within one version of a schedule and a 'valid to' date within another version of a schedule. In this case, the variation applies to both. An example of this is schedule C33552 at the start of 2015, where a cancellation variation applied to two separate permanent schedules.
A description of the scheduling process is available on the how scheduling works page. This describes how multiple schedules can be used to describe a specific train service.
|Network Rail Open Data Feeds|
|Data Feeds||About the Feeds • Account States • Durable Subscriptions • Example Code ( PHP / C# / Java / Ruby / Node.js) • Advanced Uses • FAQ • Release Notes|
|Train Movements||Train Movements Feed • Train Activation • Train Cancellation • Train Movement • Train Reinstatement • Change of Origin • Change of Identity • Change of Location • TSPEED Field • Planned Cancellations • Cancellation Codes|
|TD||TD Feed • C-Class Messages • S-Class Messages • Train Describers • TD Berths|
|TSR||TSR Feed • Route Codes|
|SCHEDULE||SCHEDULE Feed • Schedule and Location Records • Association Records • CIF Codes • How Scheduling Works • Allowances|
|Reference Data||Reference Data Feed • TOC Codes • CIF Codes • Delay Attribution Codes • Identifying Locations (STANOX, TIPLOC, NLC and 3-Alpha Codes) • STANOX Geographical Areas • Train Planning data|