RailCore Developer API · Live status

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

cURL
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"
Python
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())
Response (shortened)
{
  "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

RailCore is an independent API and is not affiliated with IRCTC or Indian Railways.