Free · Independent · Indian Railways
Live railway data,
without the guesswork.
Railway Engine is a free, independent Indian Railways API for live status, position, delay, route progress, ETA, schedules and stations — with honest freshness metadata on every response.
// railway-engine.apkscope.workers.dev
const res = await fetch(
base + "/v1/train/12919/status",
{ headers: { "x-api-key": key } }
)
const { data } = await res.json()
// RUNNING · LIVE · delay 12 min
console.log(data.state, data.freshness)What it includes
9 endpoints.
Live data, end to end.
Each endpoint maps to one clear railway data job. Your team can understand the integration at a glance.
/v1/train/:number/statusRunning state, current/previous/next station, GPS position, speed, delay, ETA and route progress.
/v1/train/:number/scheduleThe timetable for a train: origin, destination, classes and journey timing.
/v1/train/:number/routeEvery stop with scheduled and actual times, platform, distance and coordinates.
/v1/trains/search?q=Find trains by number or name in one request.
/v1/station/:codeResolve a station code such as NDLS to its name, details and location.
/v1/stations/search?q=Find stations by partial name or code, with coordinates.
/v1/health · /v1/versionLiveness, service configuration and the running version.
/v1/coverageWhat the dataset really covers — published honestly, never claiming 100%.
/v1/provider/healthUpstream provider status and measured latency.
How developers use it
Small surface.
Built for backends.
One key, plain REST, and a predictable envelope. Works in API routes, background jobs, support tools, or mobile app backends.
- Honest freshness: LIVE, RECENT or STALE
- Confidence and delay source on every response
- One envelope: status, data, error, meta
- Free forever — one plan, 60 requests/min
// free key from your dashboard
const key = process.env.RAILWAY_ENGINE_API_KEY
const base = "https://railway-engine.apkscope.workers.dev"
const res = await fetch(
base + "/v1/train/12919/status",
{ headers: { "x-api-key": key } }
)
const { data } = await res.json()
// RUNNING · LIVE · 12 min delay
console.log(data.state, data.freshness, data.delayMinutes)Live playground
Call the API
from this page.
Pick an endpoint, send a real request, and read the raw JSON envelope. Running a request needs a free key — sign in with Google when you're asked for one. No card, no credits.
Live Status
Live running status: position, delay, route progress, ETA, and data freshness.
Request parameters
Configure the request and send it to the live API.
https://railway-engine.apkscope.workers.dev/v1/train/12919/statusExactly 5 numeric digits
Optional · defaults to today (IST) · YYYY-MM-DD
Response
{
"message": "Run a request to see the response here."
}Ready to build?
Connect your app to Indian Railways.
Sign in with Google, copy your free key from the dashboard, and start calling live train endpoints from your own backend in minutes.
Get API keyRead the docsQuestions, answered
Frequently asked
questions.
Everything developers ask before integrating a live train tracking API — auth, freshness, routes, schedules and limits.
Is Railway Engine really free?
Yes. There is one free plan with every endpoint included — no tiers, no card and nothing to cancel. Sign in with Google, copy the API key issued in your dashboard, and start calling the API. The limit is about 60 requests per minute per key.
How do I track a train live?
Call GET /v1/train/:number/status?date=YYYY-MM-DD with a 5-digit train number. You get the RUNNING state, current, previous and next station, GPS position with source and observed time, speed, delay minutes with their source, ETA with its basis, route progress and exceptions such as DIVERTED or CANCELLED.
What do freshness and confidence mean?
Every live response tells you how good the data is. Freshness is reported as LIVE, RECENT or STALE, and confidence as HIGH, MEDIUM or LOW. When a fresh observation is not available, the API reports STALE or unavailable instead of guessing.
What do the schedule and route endpoints return?
GET /v1/train/:number/schedule returns the timetable for a train, and GET /v1/train/:number/route returns the station-by-station route with scheduled and actual times, platform, distance and coordinates for each stop.
How do I search for trains and stations?
GET /v1/trains/search?q= finds trains by number or name, GET /v1/station/:code resolves a single station code, and GET /v1/stations/search?q= finds stations by partial name or code. Health, version and coverage are available at /v1/health, /v1/version and /v1/coverage.
How does authentication work?
Send your free key in the x-api-key header with every request. Responses use a single JSON envelope with status, data, error and meta fields, so success and failure paths always look the same in your code.
