Developer guide

Live Train Tracking API Guide

Look up a train's latest reported movement by five-digit train number and journey start date. V1 returns the full NTES route, stoppage and intermediate station times, journey metrics, Hindi names when available, and detailed coach composition.

GET /api/v1/trains/:trainNumber/live/:date

Get started

  1. Get a RailKit API key and keep it on your server.
  2. Use a five-digit train number and its journey start date in DD-MM-YYYY format. Date must be today or within the previous five days in India time.
  3. Read statusNote, lastUpdate, currentStationCode, progress, and timeline. Stoppages include actual and scheduled times; intermediate points include scheduled times only. Treat last reported position as an estimate, not GPS location.
Get an API key

Request example

Run from a server terminal. Replace example credentials and input values with your own.

export RAILKIT_API_KEY="your_api_key"
export TRAIN_NUMBER="12345"
export JOURNEY_DATE="$(TZ=Asia/Kolkata date +%d-%m-%Y)"

curl "https://api.railkit.in/api/v1/trains/$TRAIN_NUMBER/live/$JOURNEY_DATE" \
  -H "x-api-key: $RAILKIT_API_KEY" \
  -H "accept: application/json"

Response example

{
  "success": true,
  "data": {
    "trainNo": "12345",
    "trainName": "Example Express",
    "trainNameHindi": "उदाहरण एक्सप्रेस",
    "date": "17-Oct-2026",
    "statusNote": "Arrived at RAMPUR HAT (RPH)",
    "lastUpdate": "17-Oct-2026 19:19 IST",
    "currentStationCode": "RPH",
    "totalStations": 161,
    "totalStoppageStations": 18,
    "totalDistanceKm": 998,
    "averageSpeedKmph": 61.29,
    "progress": {
      "journeyStatus": "running",
      "currentStationIndex": 50,
      "totalStations": 161,
      "passedStations": 49,
      "remainingStations": 111,
      "currentDistanceKm": 207,
      "distanceRemainingKm": 791,
      "percent": 20.74
    },
    "timeline": [
      {
        "type": "stoppage",
        "status": "passed",
        "stationCode": "HWH",
        "stationName": "HOWRAH JN",
        "stationNameHindi": "हावड़ा जं",
        "platform": "15",
        "distanceKm": "0",
        "arrival": { "scheduled": "SRC", "actual": "SRC", "delay": "" },
        "departure": { "scheduled": "16:05 17-Oct", "actual": "16:06 17-Oct", "delay": "00:01" }
      },
      {
        "type": "intermediate",
        "status": "passed",
        "stationCode": "SYAE",
        "stationName": "Example intermediate station",
        "distanceKm": "3",
        "arrival": { "scheduled": "16:10" },
        "departure": { "scheduled": "16:10" }
      }
    ],
    "coachPosition": [{
      "type": "HA1",
      "number": "HA1",
      "position": "4",
      "id": "710580",
      "operatedBy": "ER",
      "coachType": "LWFCWAC",
      "coachNo": "194544",
      "manufacturedIn": 2019,
      "coachClass": "1A+2A",
      "variant": "1A-10-2A-28-V1"
    }],
    "coachPositionTimeline": [{
      "fromStationCode": "HWH",
      "fromStationName": "HOWRAH JN",
      "coachPosition": [{
        "type": "HA1", "number": "HA1", "position": "4", "id": "710580",
        "operatedBy": "ER", "coachType": "LWFCWAC", "coachNo": "194544",
        "manufacturedIn": 2019, "coachClass": "1A+2A", "variant": "1A-10-2A-28-V1"
      }]
    }]
  }
}
  • statusNote summarizes reported movement. Stoppage points carry scheduled and actual arrival/departure; intermediate points carry scheduled arrival/departure only.
  • totalStations counts stoppage and intermediate points; totalStoppageStations counts only stoppages. Hindi names appear when NTES provides them. Missing intermediate English names can be filled from the local station catalog.
  • averageSpeedKmph is route distance divided by scheduled running time after interior station dwell is subtracted.
  • Coach metadata includes position label, upstream record ID, owning railway, transportation type, stock number, derived manufacture year, class, and variant. coachPositionTimeline is present when composition changes along the route.
  • lastUpdate may be empty before movement begins. Check it before showing a 'live' badge.
  • Example response is illustrative; actual fields and times vary by journey and provider.

Data freshness

Train movement comes from upstream reports and may lag real-world location. Show the returned lastUpdate beside the status. A journey that has not started can have no fresh update; this API does not guarantee a fixed refresh interval.

Errors and recovery

  • 400: Train number or date is invalid. Use five digits and a supported journey date.
  • 401 or 403: API key is missing, invalid, or inactive.
  • 404: No live record for that train and journey date. Check whether the train runs that day.
  • 429: Request limit reached. Reduce polling frequency and retry with backoff.
  • 5xx or upstream failure: Keep the last known status with its timestamp, then retry later.