Submit route-scan job

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.

Authentication

Send your key in the X-RailCore-Key header. This operation requires the charts:write scope. See the authentication guide.

Request parameters

This operation takes no path or query parameters.

JSON body

FieldTypeDescription
fromstringBoarding station code or station name.
tostringDestination station code or station name.
datestring(date)Journey date in YYYY-MM-DD.
quotaQuotaReservation quota, default GN.
max_trainsintegerMaximum trains to scan, 1 to 100.
min_scorenumberDrop matches scoring below 0 to 100.
only_runningbooleanKeep only trains that run on the requested day.
only_chart_preparedbooleanKeep only trains with a prepared chart.
sort_bystringdeparture, departure_desc, duration, score, or chart_ready.
include_detailbooleanInclude the full hopping result per train.
train_typesstringComma-separated train-type allow list.
avoid_train_typesstringComma-separated train-type deny list.
max_hopsintegerMaximum hopping chain length, 1 to 12.
prefer_berth / avoid_berthstringComma-separated berth preference codes.
prefer_class / avoid_classstringComma-separated class preference codes.
include_farebooleanDecorate direct and hopping options with fare data.
include_alternate_boardingbooleanEvaluate nearby boarding points.
strategiesstringmin_hops, min_seat_changes, cheapest, or all.
alternate_boarding_modestringlightweight or extended.
alternate_boarding_max_candidatesintegerExtended candidate cap, 1 to 5.
include_cross_classbooleanAllow a plan that changes class between hops.
callback_urlstring(uri)Optional HTTPS endpoint that receives terminal status and result or error.

Code examples

Base URL https://ir.railcore.tech/v1. Keep the key in an environment variable and call from a trusted server-side environment.

cURL

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"

JavaScript

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);

Python

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())

Rate limits and credits

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.

Response fields

FieldTypeDescription
job_idstringUse this identifier for polling, streaming, or cancellation.
statusprocessingInitial job state.
poll_urlstringRelative polling endpoint.
stream_urlstringRelative SSE endpoint.
messagestringSubmission summary.

Example response

{
  "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"
        }
      ]
    }
  }
}

Errors

StatusCodeDescriptionRetry
429JOB_LIMIT_EXCEEDEDFive jobs are already active for this API key.Retryable
400VALIDATION_ERRORA required field is missing or invalid.Not retryable
401MISSING_API_KEY / INVALID_API_KEYThe credential is absent, unknown, disabled, or expired.Not retryable
403SCOPE_MISSING / PLAN_ENDPOINT_DISABLEDThe key lacks the required scope or plan entitlement.Not retryable
402CREDITS_EXHAUSTEDThe account balance cannot cover this operation.Not retryable
429RATE_LIMITEDMinute or daily request budget is exhausted. Honor Retry-After.Retryable
410API_VERSION_SUNSETThis API version has reached its announced sunset date. Migrate to a supported major version.Not retryable
502UPSTREAM_UNAVAILABLELive data could not be retrieved. Retry with backoff.Retryable
504UPSTREAM_TIMEOUTThe live-data request exceeded its deadline. Retry with backoff.Retryable
503METERING_UNAVAILABLECredit settlement is temporarily unavailable and no data was returned.Retryable

Related Jobs endpoints

All RailCore Indian Railways API endpoints · Quickstart · Rate limits