List trip updates
Predicted arrivals and departures per trip, freshest first.
/api/trips Each trip carries its stopTimeUpdates — the per-stop predictions. These are the heaviest objects in the API; a single long trip can carry over a hundred. Use limit deliberately.
delayStatus is derived from the trip-level delay with a 60-second tolerance either side: under −60 is early, over +60 is late, between is on_time. A trip that reports no delay gets no delayStatus and never matches a delay filter — absent is not on-time.
Try it
Runs from your browser against the API in .
Query
Run this in your terminal
curl equivalent
Parameters
Query
| Parameter | Type | Default | Description |
|---|---|---|---|
routeId | string | — | GTFS route id, served from an index. |
stopId | string | — | Keeps trips that call at this stop. Platform-level ids, not station ids — trip updates reference platforms. Combined with |
scheduleRelationship | enum | — | How the trip relates to the timetable.
In this capture: 933 trips are |
delayStatus | enum | — | Bucketed trip-level delay.
Matches nothing in this capture. Not one of the 934 trip updates carries a trip-level |
minDelay | number | — | Trip-level delay at or above this many seconds. Negative is early. Matches nothing in this capture — no trip carries a trip-level delay. |
maxDelay | number | — | Trip-level delay at or below this many seconds. Matches nothing in this capture — no trip carries a trip-level delay. |
limit | integer | 50 | Page size, 1–1000. Values outside that range are a 400 rather than a silent clamp. |
offset | integer | 0 | Rows to skip. Compare against |
Response
The standard list envelope: data plus meta with count, total, limit, offset, feedTimestamp and loadedAt.
curl "$API_BASE/api/trips?limit=2" {
"data": [
{
"id": "14010000704326510",
"trip": {
"tripId": "14010000704326510",
"routeId": "9011001017600000",
"directionId": 1,
"startDate": "20260427",
"scheduleRelationship": "SCHEDULED",
"routeIdSource": "static",
"route": {
"routeId": "9011001017600000",
"agencyId": "505000000000000001",
"shortName": "176",
"type": 700
}
},
"vehicle": {
"id": "9031001001507918"
},
"timestamp": {
"epoch": 1777288948,
"iso": "2026-04-27T11:22:28.000Z"
},
"stopTimeUpdates": [
{
"stopSequence": 4,
"stopId": "9022050009232002",
"stop": {
"stopId": "9022050009232002",
"name": "Stenhamra centrum",
"latitude": 59.334597,
"longitude": 17.686531,
"locationType": 0,
"parentStation": "9232",
"platformCode": "2"
},
"arrival": {
"delay": 260,
"time": {
"epoch": 1777288368,
"iso": "2026-04-27T11:12:48.000Z"
},
"uncertainty": 0
},
"departure": {
"delay": 276,
"time": {
"epoch": 1777288384,
"iso": "2026-04-27T11:13:04.000Z"
},
"uncertainty": 0
},
"scheduleRelationship": "SCHEDULED"
},
{
"stopSequence": 5,
"stopId": "9022050006694002",
"stop": {
"stopId": "9022050006694002",
"name": "Eknäs",
"latitude": 59.33136,
"longitude": 17.700061,
"locationType": 0,
"parentStation": "6694",
"platformCode": "2"
},
"arrival": {
"delay": 286,
"time": {
"epoch": 1777288482,
"iso": "2026-04-27T11:14:42.000Z"
},
"uncertainty": 0
},
"departure": {
"delay": 286,
"time": {
"epoch": 1777288482,
"iso": "2026-04-27T11:14:42.000Z"
},
"uncertainty": 0
},
"scheduleRelationship": "SCHEDULED"
},
{
"stopSequence": 6,
"stopId": "9022050006693002",
"stop": {
"stopId": "9022050006693002",
"name": "Västeräng",
"latitude": 59.328329,
"longitude": 17.710032,
"locationType": 0,
"parentStation": "6693",
"platformCode": "2"
},
"arrival": {
"delay": 268,
"time": {
"epoch": 1777288535,
"iso": "2026-04-27T11:15:35.000Z"
},
"uncertainty": 0
},
"departure": {
"delay": 268,
"time": {
"epoch": 1777288535,
"iso": "2026-04-27T11:15:35.000Z"
},
"uncertainty": 0
},
"scheduleRelationship": "SCHEDULED"
}
]
},
{
"id": "14010000710626426",
"trip": {
"tripId": "14010000710626426",
"routeId": "9011001064300000",
"directionId": 0,
"startDate": "20260427",
"scheduleRelationship": "SCHEDULED",
"routeIdSource": "static",
"route": {
"routeId": "9011001064300000",
"agencyId": "505000000000000001",
"shortName": "643",
"type": 700
}
},
"vehicle": {
"id": "9031001004505139"
},
"timestamp": {
"epoch": 1777288948,
"iso": "2026-04-27T11:22:28.000Z"
},
"stopTimeUpdates": [
{
"stopSequence": 20,
"stopId": "9022050007431001",
"stop": {
"stopId": "9022050007431001",
"name": "Koabacken",
"latitude": 60.035368,
"longitude": 18.763211,
"locationType": 0,
"parentStation": "7431",
"platformCode": "1"
},
"arrival": {
"delay": 47,
"time": {
"epoch": 1777288409,
"iso": "2026-04-27T11:13:29.000Z"
},
"uncertainty": 0
},
"departure": {
"delay": 47,
"time": {
"epoch": 1777288409,
"iso": "2026-04-27T11:13:29.000Z"
},
"uncertainty": 0
},
"scheduleRelationship": "SCHEDULED"
},
{
"stopSequence": 21,
"stopId": "9022050007440001",
"stop": {
"stopId": "9022050007440001",
"name": "Söderängens vägskäl",
"latitude": 60.03744,
"longitude": 18.765344,
"locationType": 0,
"parentStation": "7440",
"platformCode": "1"
},
"arrival": {
"delay": 56,
"time": {
"epoch": 1777288441,
"iso": "2026-04-27T11:14:01.000Z"
},
"uncertainty": 0
},
"departure": {
"delay": 56,
"time": {
"epoch": 1777288441,
"iso": "2026-04-27T11:14:01.000Z"
},
"uncertainty": 0
},
"scheduleRelationship": "SCHEDULED"
},
{
"stopSequence": 22,
"stopId": "9022050007432001",
"stop": {
"stopId": "9022050007432001",
"name": "Barnabo",
"latitude": 60.039357,
"longitude": 18.766589,
"locationType": 0,
"parentStation": "7432",
"platformCode": "1"
},
"arrival": {
"delay": 63,
"time": {
"epoch": 1777288466,
"iso": "2026-04-27T11:14:26.000Z"
},
"uncertainty": 0
},
"departure": {
"delay": 63,
"time": {
"epoch": 1777288466,
"iso": "2026-04-27T11:14:26.000Z"
},
"uncertainty": 0
},
"scheduleRelationship": "SCHEDULED"
}
]
}
],
"meta": {
"count": 2,
"total": 934,
"limit": 2,
"offset": 0,
"feedTimestamp": "2026-04-27T11:22:38.000Z",
"loadedAt": "2026-08-07T12:01:42.748Z"
}
} Errors
{ "error": "request_failed", … } `scheduleRelationship` or `delayStatus` got an unknown value, or a delay bound was not a number.