# Trainline Calling Points API Documentation

<p><strong>Trainline Calling Points API Documentation</strong> Read every stop of one train leg with scheduled times, platforms and live status such as on time, delayed or cancelled. Build the request from one leg of a journey answer: timetable_id, carrier.code, departure_time, origin.code and destination.code. Coach legs have no calling points. Live status is empty more than about one day before departure. Encode the plus sign of the time offset as %2B.</p>

- **Documentation:** [https://scrappa.co/docs/trainline-api/trainline_calling_points](https://scrappa.co/docs/trainline-api/trainline_calling_points)
- **API group:** Trainline API
- **Endpoint:** `GET https://scrappa.co/api/trainline/journeys/calling-points`

## Authentication

Send your Scrappa API key in the `X-API-KEY` request header. Paid endpoints also support accountless x402 payments when called without an API key.

## Parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `timetable_id` | string | Yes | legs[].timetable_id of a journey answer. Example: W34038. |
| `carrier` | string | Yes | legs[].carrier.code. Example: urn:trainline:atoc:carrier:VT. |
| `departure_time` | string | Yes | legs[].departure_time with its offset. Example: 2026-11-03T09:13:00%2B00:00. |
| `origin` | string | Yes | legs[].origin.code. Example: urn:trainline:atoc:loc:EUS1444. |
| `destination` | string | Yes | legs[].destination.code. Example: urn:trainline:atoc:loc:MAN2968. |

## Example response

```json
{
    "data": {
        "carrier": {
            "code": "urn:trainline:atoc:carrier:VT",
            "name": "Avanti West Coast"
        },
        "cancelled": false,
        "service_date": "2026-11-03",
        "timetable_id": "W34038",
        "delay_reasons": [],
        "calling_points": [
            {
                "type": "ORIGIN",
                "index": 0,
                "arrival": null,
                "station": {
                    "code": "urn:trainline:atoc:loc:EUS1444",
                    "name": "London Euston",
                    "short_code": "EUS"
                },
                "departure": {
                    "live": null,
                    "platform": "2",
                    "scheduled_time": "2026-11-03T09:13:00+00:00"
                }
            },
            {
                "type": "NORMAL",
                "index": 1,
                "arrival": {
                    "live": null,
                    "platform": "3",
                    "scheduled_time": "2026-11-03T10:09:00+00:00"
                },
                "station": {
                    "code": "urn:trainline:atoc:loc:NUN1077",
                    "name": "Nuneaton",
                    "short_code": "NUN"
                },
                "departure": {
                    "live": null,
                    "platform": "3",
                    "scheduled_time": "2026-11-03T10:10:00+00:00"
                }
            },
            {
                "type": "NORMAL",
                "index": 2,
                "arrival": {
                    "live": null,
                    "platform": "2",
                    "scheduled_time": "2026-11-03T10:43:00+00:00"
                },
                "station": {
                    "code": "urn:trainline:atoc:loc:SOT1314",
                    "name": "Stoke-on-Trent",
                    "short_code": "SOT"
                },
                "departure": {
                    "live": null,
                    "platform": "2",
                    "scheduled_time": "2026-11-03T10:44:00+00:00"
                }
            },
            {
                "type": "DESTINATION",
                "index": 4,
                "arrival": {
                    "live": null,
                    "platform": "5",
                    "scheduled_time": "2026-11-03T11:19:00+00:00"
                },
                "station": {
                    "code": "urn:trainline:atoc:loc:MAN2968",
                    "name": "Manchester Piccadilly",
                    "short_code": "MAN"
                },
                "departure": null
            }
        ],
        "transport_mode": "TRAIN",
        "has_live_status": false,
        "cancellation_reasons": []
    },
    "meta": {
        "billable": true,
        "endpoint_family": "journeys_calling_points"
    },
    "success": true
}
```

## Errors

| Status | Error | Description |
| --- | --- | --- |
| 422 | Validation Error | A required parameter is missing or invalid. This response is not billable. |
| 404 | Resource Not Found | No service matches these leg values. Use the values of a fresh journey answer. This response is not billable. |
| 503 | Upstream Unavailable | Trainline did not answer in time. Scrappa retries on other exits first. This response is not billable. Retry after a few seconds. |

## More Scrappa resources

- [API documentation](https://scrappa.co/docs)
- [Full LLM-readable API reference](https://scrappa.co/llms-full.txt)
- [OpenAPI specification](https://scrappa.co/docs/api.json)
- [Pricing](https://scrappa.co/pricing)
