Check the latest availability snapshot for one train and class.
GET /v1/availability/seats
Scope availability:read · Credits 5 · Plans All plans
Returns normalized availability, waitlist pool, fare, prediction, and update time, with automatic continuity fallback when the primary source has no usable row or fails.
Send your key in the X-RailCore-Key header. This operation requires the availability:read scope. See the authentication guide.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
train_number | query | string | Required | Train number, 4 to 6 uppercase letters or digits. |
from | query | string | Required | Boarding station code. |
to | query | string | Required | Destination station code. |
date | query | string(date) | Required | Journey date in YYYY-MM-DD format. |
class | query | string | Required | Travel class code. |
quota | query | string | Optional | Reservation quota. |
Base URL https://ir.railcore.tech/v1. Keep the key in an environment variable and call from a trusted server-side environment.
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=2026-10-10&class=3A"a=GN"
const response = await fetch("https://ir.railcore.tech/v1/availability/seats?train_number=12656&from=BSL&to=ADI&date=2026-10-10&class=3A"a=GN", {
method: "GET",
headers: {
"X-RailCore-Key": process.env.RAILCORE_KEY,
},
});
const body = await response.json();
console.log(response.status, body);
import os
import requests
response = requests.request(
"GET",
"https://ir.railcore.tech/v1/availability/seats?train_number=12656&from=BSL&to=ADI&date=2026-10-10&class=3A"a=GN",
headers={"X-RailCore-Key": os.environ["RAILCORE_KEY"]},
timeout=20,
)
print(response.status_code, response.json())
This call costs 5 credits and is available on All plans. Per-minute and daily budgets, and the headers reporting remaining quota, are documented in rate limits and credits and billing.
| Field | Type | Description |
|---|---|---|
train_number | string | Train number. |
from_station_code / to_station_code | string | Requested segment. |
journey_date | string(date) | Requested journey date. |
quota | Quota | Applied quota. |
classes[].class_code | ClassCode | Travel class. |
classes[].status | string | AVAILABLE, RAC, WAITLIST, REGRET, NOT_AVAILABLE, TRAIN_CANCELLED, TRAIN_DEPARTED, or UNKNOWN. |
classes[].availability_text | string | Source availability text normalized for display. |
classes[].available_count | integer | Known available berth count. |
classes[].waitlist_count / rac_count | integer | Known waitlist and RAC positions. |
classes[].wl_pool / wl_pool_position | string | null / integer | null | Waitlist pool and position, such as RLWL and 12. Both are null when the class is not waitlisted or the source does not identify them. |
classes[].fare / total_fare | integer | null | Fare values in INR. |
classes[].confirmation_probability | object | null | Percentage, LOW/MEDIUM/HIGH label, and explanatory text. |
classes[].last_updated_at | string | null | Provider cache update time. Use this to evaluate freshness. |
{
"success": true,
"data": {
"train_number": "12656",
"from_station_code": "BSL",
"to_station_code": "ADI",
"journey_date": "2026-10-10",
"quota": "GN",
"classes": [
{
"class_code": "3A",
"status": "AVAILABLE",
"availability_text": "AVAILABLE 24",
"available_count": 24,
"waitlist_count": 0,
"rac_count": 0,
"wl_pool": null,
"fare": 1125,
"total_fare": 1125,
"confirmation_probability": {
"percentage": 96,
"label": "HIGH",
"text": "High confirmation likelihood"
},
"last_updated_at": "2026-10-03T11:46:23.350Z"
}
]
},
"meta": {
"api_version": "v1",
"request_id": "req_01J5Z7Y8N2K4M6P8R0T2V4X6Z8",
"trace_id": "trc_01J5Z7Y8N2K4M6P8R0T2V4X6Z9",
"timestamp": "2026-10-03T11:46:23.351Z",
"freshness": {
"mode": "live",
"retrieved_at": "2026-10-03T11:46:23.351Z",
"sources": [
{
"confidence": "high"
}
]
}
}
}
| Status | Code | Description | Retry |
|---|---|---|---|
| 400 | VALIDATION_ERROR | A required field is missing or invalid. | Not retryable |
| 401 | MISSING_API_KEY / INVALID_API_KEY | The credential is absent, unknown, disabled, or expired. | Not retryable |
| 403 | SCOPE_MISSING / PLAN_ENDPOINT_DISABLED | The key lacks the required scope or plan entitlement. | Not retryable |
| 402 | CREDITS_EXHAUSTED | The account balance cannot cover this operation. | Not retryable |
| 429 | RATE_LIMITED | Minute or daily request budget is exhausted. Honor Retry-After. | Retryable |
| 410 | API_VERSION_SUNSET | This API version has reached its announced sunset date. Migrate to a supported major version. | Not retryable |
| 502 | UPSTREAM_UNAVAILABLE | Live data could not be retrieved. Retry with backoff. | Retryable |
| 504 | UPSTREAM_TIMEOUT | The live-data request exceeded its deadline. Retry with backoff. | Retryable |
| 503 | METERING_UNAVAILABLE | Credit settlement is temporarily unavailable and no data was returned. | Retryable |
All RailCore Indian Railways API endpoints · Quickstart · Rate limits