Run route scanning asynchronously.
POST /v1/jobs/route-scan
Scope charts:write · Credits 25 at submission · Plans Scale and Enterprise
Creates a durable route-scan job, retries once on processing failure, and optionally calls your callback URL at completion.
Send your key in the X-RailCore-Key header. This operation requires the charts:write scope. See the authentication guide.
This operation takes no path or query parameters.
| Field | Type | Description |
|---|---|---|
from | string | Boarding station code or station name. |
to | string | Destination station code or station name. |
date | string(date) | Journey date in YYYY-MM-DD. |
quota | Quota | Reservation quota, default GN. |
max_trains | integer | Maximum trains to scan, 1 to 100. |
min_score | number | Drop matches scoring below 0 to 100. |
only_running | boolean | Keep only trains that run on the requested day. |
only_chart_prepared | boolean | Keep only trains with a prepared chart. |
sort_by | string | departure, departure_desc, duration, score, or chart_ready. |
include_detail | boolean | Include the full hopping result per train. |
train_types | string | Comma-separated train-type allow list. |
avoid_train_types | string | Comma-separated train-type deny list. |
max_hops | integer | Maximum hopping chain length, 1 to 12. |
prefer_berth / avoid_berth | string | Comma-separated berth preference codes. |
prefer_class / avoid_class | string | Comma-separated class preference codes. |
include_fare | boolean | Decorate direct and hopping options with fare data. |
include_alternate_boarding | boolean | Evaluate nearby boarding points. |
strategies | string | min_hops, min_seat_changes, cheapest, or all. |
alternate_boarding_mode | string | lightweight or extended. |
alternate_boarding_max_candidates | integer | Extended candidate cap, 1 to 5. |
include_cross_class | boolean | Allow a plan that changes class between hops. |
callback_url | string(uri) | Optional HTTPS endpoint that receives terminal status and result or error. |
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 POST \
-H "X-RailCore-Key: $RAILCORE_KEY" \
-H "Content-Type: application/json" \
--data '{"from":"BSL","to":"ADI","date":"2026-08-27","quota":"GN","max_trains":"8","only_running":"true","include_fare":"false","prefer_class":"3A,2A"}' \
"https://ir.railcore.tech/v1/jobs/route-scan"
const response = await fetch("https://ir.railcore.tech/v1/jobs/route-scan", {
method: "POST",
headers: {
"X-RailCore-Key": process.env.RAILCORE_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"from": "BSL",
"to": "ADI",
"date": "2026-08-27",
"quota": "GN",
"max_trains": "8",
"only_running": "true",
"include_fare": "false",
"prefer_class": "3A,2A"
}),
});
const body = await response.json();
console.log(response.status, body);
import json
import os
import requests
response = requests.request(
"POST",
"https://ir.railcore.tech/v1/jobs/route-scan",
headers={"X-RailCore-Key": os.environ["RAILCORE_KEY"]},
json=json.loads("{\"from\":\"BSL\",\"to\":\"ADI\",\"date\":\"2026-08-27\",\"quota\":\"GN\",\"max_trains\":\"8\",\"only_running\":\"true\",\"include_fare\":\"false\",\"prefer_class\":\"3A,2A\"}"),
timeout=20,
)
print(response.status_code, response.json())
This call costs 25 at submission credits and is available on Scale and Enterprise. Per-minute and daily budgets, and the headers reporting remaining quota, are documented in rate limits and credits and billing.
| Field | Type | Description |
|---|---|---|
job_id | string | Use this identifier for polling, streaming, or cancellation. |
status | processing | Initial job state. |
poll_url | string | Relative polling endpoint. |
stream_url | string | Relative SSE endpoint. |
message | string | Submission summary. |
{
"success": true,
"data": {
"job_id": "job_01J5Z7Y8N2K4M6P8R0T2V4X6Z8",
"status": "processing",
"poll_url": "/v1/jobs/job_01J5Z7Y8N2K4M6P8R0T2V4X6Z8",
"stream_url": "/v1/jobs/job_01J5Z7Y8N2K4M6P8R0T2V4X6Z8/stream",
"message": "Route scan submitted. Poll the poll_url for results."
},
"meta": {
"api_version": "v1",
"request_id": "req_01J5Z7Y8N2K4M6P8R0T2V4X6Z8",
"trace_id": "trc_01J5Z7Y8N2K4M6P8R0T2V4X6Z9",
"timestamp": "2026-08-20T17:12:23.305Z",
"freshness": {
"mode": "live",
"retrieved_at": "2026-08-20T17:12:23.305Z",
"sources": [
{
"confidence": "high"
}
]
}
}
}
| Status | Code | Description | Retry |
|---|---|---|---|
| 429 | JOB_LIMIT_EXCEEDED | Five jobs are already active for this API key. | Retryable |
| 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