ASSIST | APIs | Retailer alerts

Exposes stored booking revision alerts for Retailers
Revision A: 2026-07-31 12:23:04
Image to be added

ASSIST Subject: RSPS5210: 'RARS Reservation Interface'

Version: v2

No Notes recorded
openapi.jsonFri 31-Jul-2026 11:43:37

Home (Rev B)
Revision B: 2026-07-31 12:25:23

Retailer Alerts - Home

The resources described on this page enable the following capabilities:

/bookings/revisions

This resource provides access to booking changes relating to the client making the request.

Consumers can check for stored alerts created when a booking sold by them has been re-accommodated. Responses include, booking reference, booking revision, the type of change made to the booking.


Security The client_id, user-agent and content-type headers mentioned above are there to improve security.

Note: the user-agent value should include the name of system making the request and its version number (e.g. RDGRuntime/7.41.2)

As shown in the examples, a Bearer token obtained from the RDG IAM API must always be sent in requests as the Authorization header.

Bookings Revisions (Rev A)
Revision A: 2026-07-31 15:32:09

When a Train Operator (TOC) performs a re-accommodation on a booking, an alert is generated and stored for the retailer whole sold it. Retailers are able to periodically check for stored alerts (no more frequently than every 15 mins) and receive high level details of why the alert was generated.

Alerts will be stored for four days before being deleted.

How to make a call to the Retailer Alerts API endpoint to check for stored alerts

Method: GET

Authentication: Standard Reservations authentication requirements apply

mTLS certificates are required.

Parameters

Key Value
createdAfter YYYY-MM-DDThh:mm:ssZ

Headers required Authorization: Bearer {{token}} client_id: {{client_id} User-Agent: {{User-Agent}}

Example Retailer Alerts request

GET  {{URL}}?createdAfter=2026-07-02T10:00:00Z

Example Retailer Alerts response

The below example displays that a booking with reference number GQ516116 had to be re-accomodated by the TOC on the 2nd of July 2026 at 10:53. We can see this due to the changeField value of productItemsUpdated.

If the retailer performs a recall booking using the given reference number, they will be able to see the change details.

{
    "latestStoredBookingChange": "2026-07-02T10:53:42Z",
    "hasMaxRequestPeriodExceeded": false,
    "createdAfter": "2026-07-01T08:07:24Z",
    "bookingRevisions": [
        {
            "bookingReference": "GQ516116",
            "revisionNumber": 3,
            "revisionCreatedOn": "2026-07-02T10:53:42Z",
            "bookingRevisionChanges": [
                {
                    "changeFieldDataType": "uuids",
                    "uuidsData": [
                        "9ac0dcb2-61fe-4a2c-af8f-20f48135bbb9"
                    ],
                    "changedField": "productItemsUpdated"
                }
            ]
        }
    ]
}

Example recall booking response

An example recall booking response for this booking is seen below. From this we can see the notes section reveals the alert was generated because of "type": "AFTERSALES_SEATCHANGE". Looking at the required products section of the response, it shows the current seat assigned to this booking as D22.

When making a recall booking, only the current seat assignment is displayed but we know there has been a seat change. Therefore, we know the seat has been changed to D22.

{
    "data": {
        "uniqueTicketNumber": "",
        "agent": {
            "organisation": "P2_BAT",
            "contractCode": "JP",
            "username": "r2d2"
        },
        "outboundBookingTariffLegs": [
{
                "uuid": "135f06d3-0618-4fe7-91af-1d3422054e07",
                "routeCode": "00000",
                "validityStartDate": "2026-07-03",
                "journeyConditions": {
                    "journeyOD": {
                        "journeyDestination": "6121",
                        "journeyOrigin": "8487"
                    }
                },
                "boardLocation": "LDS",
                "classOfTravel": "2",
                "validityEndDate": "2026-07-03",
                "journeyLeg": {
                    "carrierCode": "GR",
                    "alightLocation": "KGX",
                    "departureDateTime": "2026-07-03T05:00:00+0100",
                    "rsid": "GR102000",
                    "arrivalDateTime": "2026-07-03T07:30:00+0100",
                    "boardLocation": "LDS"
                },
                "serviceIdentifier": "0:R|GR102000|TRAIN|2026-07-03",
                "validityRsid": "GR102000",
                "additionalProducts": [],
                "alightLocation": "KGX",
                "id": "segment_1",
                "serviceOriginDate": "2026-07-03",
                "requiredProducts": [
                    {
                        "canBeRebooked": true,
                        "isCancelled": false,
                        "itemRef": 27252829,
                        "isProvisional": false,
                        "inventoryClass": "2S",
                        "tariffCode": "SOS",
                        "updatedRevision": 3,
                        "createdRevision": 1,
                        "description": "ANYTIME S",
                        "confirmedOn": "2026-07-02T10:53:12Z",
                        "seat": {
                            "id": "22",
                            "coachId": "D"
                        },
                        "productBookingId": "GQ516116-001",
                        "ticketTypeCode": "SOS",
                        "canBeCancelled": true,
                        "canChangeName": true,
                        "canBeUpgraded": true,
                        "name": "ANYTIME S",
                        "passengerId": "passenger_1",
                        "canChangeSeat": true,
                        "seatProperties": [
                            "IDR",
                            "AISL"
                        ],
                        "productType": "ST",
                        "uuid": "9ac0dcb2-61fe-4a2c-af8f-20f48135bbb9"
                    }
                ]
            }
        ],
        "passengers": [
            {
                "firstName": "",
                "lastName": "Norris",
                "protectPrivacy": true,
                "phoneNumber": "07700900982",
                "discountedOrSeasonCode": [],
                "createdRevision": 1,
                "id": "passenger_1",
                "uuid": "ca11091e-5328-39ef-a267-47d6a478cd7f",
                "statusCode": "000"
            }
        ],
        "notes": [
            {
                "createdBy": "r2d2",
                "createdRevision": 3,
                "type": "AFTERSALES_CONFIRM",
                "createdOn": "2026-07-02T11:53:42+0100",
                "content": ""
            },
            {
                "createdBy": "uyv7rk6iz7878p4yx5raz727y95b4qm52a46vh222z458t8x9z (r2d2)",
                "createdRevision": 2,
                "type": "AFTERSALES_SEATCHANGE",
                "createdOn": "2026-07-02T11:53:36+0100",
                "content": ""
            }
   ],
        "revisionNumber": 3,
        "inboundBookingTariffLegs": [],
        "bookingRef": "GQ516116",
        "updatedOn": "2026-07-02T10:53:42Z",
        "createdOn": "2026-07-02T10:53:09Z",
        "confirmedOn": "2026-07-02T10:53:12Z",
        "retailersBookingRef": "",
        "salesChannelCode": "P2_ACCTS",
        "canBeUpgraded": true,
        "recordStructureVersion": "v2",
        "customer": {
            "firstName": "",
            "lastName": "Norris",
            "phoneNumber": "07700900982",
            "updatedRevision": 1,
            "initials": "",
            "title": ""
        }
    }
}

Use cases

Use case 1 A TOC is forced to re-accommodate booked passengers due to unexpected out of service carriages. New seat details are amended on the bookings impacted. When this occurs, an entry is made in the Retailer Alerts database with the retailer of the booking also recorded.

When the retailer who sold these bookings makes their next periodic call to the Retailer Alerts API endpoint, they receive the following details from the above Retailer alerts response in each stored alert. The key fields are;

The retailer can then use this information to decide whether to recall the booking using the provided reference in order to see all of the booking details. When they have this information, the retailer can inform the customer of the new booking details.


Example high level process to implement Retailer Alerts

The following is one possible implementation of Retailer Alerts and serves as an example only.

  1. A batch process is created by a retailer to make a request to the Retailer Alerts API endpoint every 15 mins: GET {{URL}}??createdAfter=2026-07-02T10:00:00Z. The batch process is configured so that it amends the value for the createdAfter parameter to match the frequency of requests so they don't receive alerts they have already processed. For example, if the first run is at 10:00 on 2nd July and the next run is at 10:15, it should amend the createdAfter value to 2026-07-02T10:15:00Z.
  2. The response to this retailer alerts request (see examples above), should be examined for changes that might require customers to be notified of a change. The example response received above is, productItemsUpdated for booking reference GQ516116.
  3. The retailer decides to recall this booking to get more details and the notes section reveals the alert was generated because of "type": "AFTERSALES_SEATCHANGE". When we look at the required products section of the response, it shows the current seat assigned to this booking as D22.
  4. Since there was a booking revision involving an after sales seat change and, since a recall booking only ever returns the current seat assigned to the booking, we can know the seat assigned to this booking has been changed to D22.
  5. The customer can be informed their new seat number is now D22

Error handling (Rev A)
Revision A: 2026-07-31 15:32:18

Error Handling


Whilst every effort will be made to capture all errors which may be returned for these API resources on this page, consumers are advised that as RDG are using a common service (frequently known as Software as a Service or SaaS) for the underlying technology within the reservation service, additional error cases may be added to the product at any time. If you are returned an error not recorded here, please provide details to RDG, including the request which generated the error and the error message itself, and we will investigate and add to this page.


If a request passes the policy checks it will be submitted to the relevant RDG API which may then result in an RDG specific error as opposed to a generic platform error. APIs on the RDG Developer Portal use the following common error format to contain and return these errors to consumers (See RDG Error Object data type):

{
    "errors": [
        {
            "code": "error_code",
            "message": "error message",
            "timestamp": "YYYY-MM-DDTHH:MM:SS",
            "context": {
                "{key}": "value"
            }
        }
    ]
}

The (optional) context object is an unspecified list of key value pairs, allowing contextual information to be provided without requiring a schema definition.

Reservations specific error handling

For the reservations service, the below list represents the known context keys which may be returned by the source service. This list is not within RDG control and is subject to change at any time. Please report any context keys which are not in the list below to cci-support@raildeliverygroup.com and RDG will review and update this page to include them.

Field name keys:

There may also be context items which are not field names, such as:

Known Error Cases

General

Code Message Comment
GBR-AUTH-2000 Security Error When RDG fails to process request due to client side or server side security failure
GBR-AUTH-2001 Unauthorised User When user’s token is invalid
GBR-AUTH-2002 Security validation: precondition failed -
GBR-AUTH-2003 Security validation: Bad request When request payload has failed to process
GBR_EXCEPTION_0000 Unknown Error Catch all for any unknown errors
GBR_EXCEPTION_0001 Undefined error by 3rd party system Unknown error from 3rd party APIs
GBR_EXCEPTION_3000 Invalid schema/ Invalid payload Bad request due to payload not conforming to the json/xml schema definition
GBR_EXCEPTION_3001 Internal Error Unable to complete operation
GBR_EXCEPTION_3006 Resource not found When API resource request is not found or not defined in the specification
GBR_EXCEPTION_3007 Method not allowed When API resource request doesn’t conform to the API specfication e.g. method GET is expected for a resource but POST or PUT call is made
GBR_EXCEPTION_3009 Unsupported media type When API resource request media type (e.g. application/json) doesn’t conform to the expected media type
GBR_EXCEPTION_3010 HTTP too many requests Rate-limit exceeded
GBR_EXCEPTION_3011 AWS S3 bad request error When AWS S3 throws error due to processing error of the request
GBR_EXCEPTION_3012 Invalid schema/ Invalid payload Bad request due to payload not conforming to the json/xml schema definition
GBR_EXCEPTION_3013 Invalid schema/ Invalid payload Bad request due to payload not conforming to the json/xml schema definition
GBR_EXCEPTION_3014 Forbidden Error When source system doesn’t allow access to a particular resource for a specfic client
GBR_EXCEPTION_3015 Validation Error [Email is valid] The structural conformation of email is checked and throws error if doesn’t match the built in REGEX pattern
GBR_EXCEPTION_3063 Expression error When any form of REGEX failed to excute due to incorrect inputs
GBR_EXCEPTION_3065 Retry exhausted, Redelivery Exhausted Retry component reaches the threshold number with respect to HTTP requests made
GBR_EXCEPTION_3066 Connectivity issue or service is not available When cannot reach the resource URL or underneath service doesn’t respond
GBR_EXCEPTION_3067 HTTP time out When the HTTP request gets timed out
RAML_ERROR Invalid schema/ Invalid payload Bad request due to payload not conforming to the json/xml schema definition