Seat availability API for Indian Railways
Check seats for one train, class and quota on a date: availability, waitlist and RAC positions, the fare, and a confirmation chance, with the time the figure was read.
Every plan, Free included, at 1 request each. Batches, a date calendar, class lists and fares have endpoints of their own.
Not an official source. RailCore is an independent API and is not affiliated with IRCTC or Indian Railways.
Seat and fare endpoints
Every one is live and documented. Follow any of them to its reference page.
- Seat availability
GET /v1/availability/seatsCheck availability afresh for one train and class.
1 request · All plans
- Batch seat availability
POST /v1/availability/seats/batchCheck up to 25 train and class combinations.
1 request per distinct class per item, minimum 1 request · All plans
- Availability calendar
GET /v1/availability/calendarInspect availability across upcoming dates.
1 request · All plans
- Available classes
GET /v1/availability/classesList classes offered by a train on a route.
1 request · All plans
- Fare estimate
GET /v1/fares/estimateGet reserved fare by class for a train segment.
1 request · All plans
- Search fares
GET /v1/fares/searchCompare fares across trains on a route.
1 request · All plans
- Unreserved fare
GET /v1/fares/unreservedQuery UTS journey and season-ticket fares.
1 request · All plans
What a seat answer contains
Asks afresh on every request, with no RailCore cache, and returns normalized availability, waitlist pool, fare, prediction, and when the figure was read.
- classes[].status
- AVAILABLE, RAC, WAITLIST, REGRET, NOT_AVAILABLE, TRAIN_CANCELLED, TRAIN_DEPARTED, or UNKNOWN.
- classes[].availability_text
- Source availability text normalized for display.
- classes[].available_count
- Available berth count; null when the source reports availability without a quantity.
- classes[].waitlist_count / rac_count
- Current waitlist and RAC positions; null when the active status has no reported position.
- classes[].fare / total_fare
- Fare values in INR.
- classes[].confirmation_probability
- Percentage, LOW/MEDIUM/HIGH label, and explanatory text.
- enquiry_checked_at
- When RailCore asked.
When the figure was read, the waitlist pool and the rest are in the Seat availability reference.
One request, one response
One train, one class, a week ahead. The samples work the date out when they run.
GET /v1/availability/seats
JOURNEY_DATE=$(date -u -d "+7 days" +%F 2>/dev/null || date -u -v+7d +%F)
curl -sS -X GET \
-H "X-RailCore-Key: $RAILCORE_KEY" \
"https://ir.railcore.tech/v1/availability/seats?train_number=12656&from=BSL&to=ADI&date=$JOURNEY_DATE&class=3A"a=GN"import datetime
import os
import requests
journey_date = (datetime.date.today() + datetime.timedelta(days=7)).isoformat()
response = requests.request(
"GET",
f"https://ir.railcore.tech/v1/availability/seats?train_number=12656&from=BSL&to=ADI&date={journey_date}&class=3A"a=GN",
headers={"X-RailCore-Key": os.environ["RAILCORE_KEY"]},
timeout=20,
)
print(response.status_code, response.json()){
"success": true,
"data": {
"train_number": "12656",
"from_station_code": "BSL",
"to_station_code": "ADI",
"journey_date": "2026-11-17",
"quota": "GN",
"classes": [
{
"class_code": "3A",
"status": "AVAILABLE",
"availability_text": "AVAILABLE 24",
"available_count": 24,
"waitlist_count": 0,
"fare": 1125,
"confirmation_probability": {
"percentage": 96,
"label": "HIGH",
"text": "High confirmation likelihood"
}
}
]
},
"meta": {
"api_version": "v1",
"request_id": "req_01J5Z7Y8N2K4M6P8R0T2V4X6Z8"
}
}Set RAILCORE_KEY to your key first. Every field, parameter and error is in the Seat availability reference.
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
Is this the IRCTC API?
No. RailCore is an independent API and is not affiliated with IRCTC or Indian Railways. Each request makes a fresh seat enquiry and says when the figure it returns was read.
Which plans include seat availability?
Every plan, Free included. One request checks one train and class on one date, and counts as 1 request.
Can I check several trains or classes in one request?
Yes. Batch seat availability takes up to 25 items and counts as 1 request per distinct class per item, minimum 1 request. Availability calendar covers up to 30 days for one train and class, as 1 request.
How fresh is the availability figure?
RailCore asks afresh on every request and keeps no cache of its own. The upstream can answer from its cache, so each answer carries inventory_updated_at, when the figure was read, beside enquiry_checked_at, when RailCore asked.
Does it return fares?
Yes. Each class in a seat answer carries its fare in INR. For fares on their own: fare estimate, search fares and unreserved fare, 1 request each.