Live train status API for Indian Railways
A train running status API for India: one request returns where a train is now, how late it is, when it should reach its last station, and its expected time and platform at every station on the route.
REST and JSON, with a key in one header. It is on every plan, the free one included.
- 1 request per lookupEvery plan, Free included.
- At most 10 seconds behind the feedEvery answer says how old it is. Pass max_age=0 for a fresh read.
- Every station on the routeScheduled, expected and actual times, delay and platform, including stations it passes without stopping.
- Nothing guessedAnything RailCore cannot establish for a run is null, never filled in from the timetable.
What comes back
Returns one run of a train: its status and position, its delay, when it should reach its last station, and the scheduled, expected and actual times at every station on its route, including the ones it passes without stopping. Answers are at most 10 seconds older than the live feed, and say exactly how old they are.
- status
- Where the run stands. CANCELLED means the whole run is cancelled; a train cancelled for only part of its route stays RUNNING or AT_STATION and the part is in cancellation.
- status_text
- A ready-to-show line, for example Running 22 minutes late.
- current_station_code / current_station_name
- The station the train is at, or the last one it passed.
- latitude / longitude
- The train's last reported position.
- approaching_station_code / approaching_station_name
- The next station on the line ahead, even one the train will pass without stopping.
- delay_minutes
- How late the train is at the last station it reached. Negative when early.
- eta_destination_at
- Expected arrival at the last station; the actual time once the run is complete. Null for a cancelled run.
- stations[].eta / etd
- Expected arrival and departure at a station still ahead.
- stations[].actual_arrival / actual_departure
- Reported arrival and departure at a station already reached.
- stations[].platform_number
- Expected platform. Platforms can change at short notice.
- official_notice
- What the railway's own running status says differs from the timetable: reason and message, new first or last station, new departure or arrival time, and whether the train is diverted. Null when the railway reports nothing.
- freshness.state / age_seconds
- The report's age in seconds, and the state that age puts it in.
The run, cancellations and every other field are in the Live train status reference.
One request, one response
Today's run of one train. The date is the day the train left its first station, in IST; the samples work it out when they run.
GET /v1/trains/{train_number}/live
RUN_DATE=$(TZ=Asia/Kolkata date +%F)
curl -sS -X GET \
-H "X-RailCore-Key: $RAILCORE_KEY" \
"https://ir.railcore.tech/v1/trains/12723/live?date=$RUN_DATE"import datetime
import os
import requests
run_date = datetime.datetime.now(datetime.timezone(datetime.timedelta(hours=5, minutes=30))).date().isoformat()
response = requests.request(
"GET",
f"https://ir.railcore.tech/v1/trains/12723/live?date={run_date}",
headers={"X-RailCore-Key": os.environ["RAILCORE_KEY"]},
timeout=20,
)
print(response.status_code, response.json()){
"success": true,
"data": {
"train_number": "12723",
"train_name": "Telangana Express",
"journey_date": "2026-11-11",
"status": "RUNNING",
"status_text": "Running 23 minutes late",
"current_station_code": "MKDI",
"current_station_name": "MAKUDI",
"latitude": 19.551,
"longitude": 79.476,
"delay_minutes": 23,
"eta_destination_at": "2026-11-12T08:07:00+05:30",
"next_stop": {
"sequence": 65,
"station_code": "BPQ",
"station_name": "BALHARSHAH",
"eta": "2026-11-11T12:01:00+05:30",
"actual_departure": null,
"delay_arrival_minutes": 6,
"delay_departure_minutes": 6,
"platform_number": "4"
},
"stations": [
{
"sequence": 1,
"station_code": "HYB",
"station_name": "HYDERABAD DECCAN",
"eta": null,
"actual_departure": "2026-11-11T06:43:14+05:30",
"delay_arrival_minutes": null,
"delay_departure_minutes": 43,
"platform_number": "5"
}
],
"freshness": {
"state": "fresh",
"age_seconds": 13,
"railcore_cache": "bypassed"
},
"confidence": "high"
},
"meta": {
"api_version": "v1",
"request_id": "req_01J5Z7Y8N2K4M6P8R0T2V4X6Z8"
}
}Set RAILCORE_KEY to your key first. Every field, parameter and error is in the Live train status reference.
Every train at a station
For a departure board rather than one train, the live station board returns one canonical station board for trains arriving at, departing from, starting at, or terminating at the station, with schedule, estimate, platform, delay, state, confidence, and report time. It counts as 1 request, on every plan.
GET /v1/stations/{station_code}/live
What it costs
- Each request counts as 1 requestOn every plan, Free included. The response headers say what each request counted as.
- Free: 2,000 requests a month20 requests a minute and 300 a day. No card, no phone number.
- Failed requests are freeOnly successful 2xx responses are counted.
- Paid plans from ₹699 a monthStarter: 40,000 requests a month, 60 a minute · no daily cap. Pay in INR, or once in USD from outside India.
Questions
How fresh is the live train status?
A train reports about once a minute, so by default RailCore may answer from its own read of the same run made up to 10 seconds earlier, labelled freshness.railcore_cache: reused. Pass max_age=0 for a fresh read. Either way it counts as 1 request.
Which date do I send for a train that left yesterday?
The day the train leaves its first station, as YYYY-MM-DD in IST. A train that left late last night is still running under last night's date.
Can I get every train at a station instead?
Yes. Live station board: GET /v1/stations/{station_code}/live. Arrivals and departures in a rolling live window. It counts as 1 request.
What does live train status cost?
Every request counts as 1 request, on every plan. The Free plan includes 2,000 requests a month, 20 requests a minute and 300 a day. Failed requests are free.
Does it report the train's speed?
Not yet: speed_kmph is always null for now. Position comes as latitude and longitude, the current station, and the distance to the station ahead.
More from the RailCore API
- Seat availability API
- PNR status API (in development)
- Looking for an IRCTC API?
- All endpoints
- Documentation
RailCore is an independent API and is not affiliated with IRCTC or Indian Railways.