Submit hopping job

Run berth-hopping analysis asynchronously.

POST /v1/jobs/hopping

Scope charts:write · Credits 10 at submission · Plans Scale and Enterprise

Creates a durable train-specific hopping job with optional completion callback and one automatic retry.

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
train_numberstringTrain to analyze.
fromstringBoarding station code.
tostringDestination station code.
datestring(date)Journey date in YYYY-MM-DD.
quotaQuotaReservation quota, default GN.
viastringComma-separated stations the plan must cross.
max_hopsintegerMaximum chain length, 1 to 12.
prefer_berth / avoid_berthstringComma-separated berth preference codes.
prefer_class / avoid_classstringComma-separated class preference codes.
include_farebooleanAdd fare details.
include_alternate_boardingbooleanEvaluate nearby boarding stations.
include_cross_classbooleanAllow class changes between hops.
strategiesstringmin_hops, min_seat_changes, cheapest, or all.
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 '{"train_number":"12656","from":"BSL","to":"ADI","date":"2026-08-27","quota":"GN","max_hops":"6","include_fare":"true","prefer_class":"3A"}' \
  "https://ir.railcore.tech/v1/jobs/hopping"

JavaScript

const response = await fetch("https://ir.railcore.tech/v1/jobs/hopping", {
  method: "POST",
  headers: {
    "X-RailCore-Key": process.env.RAILCORE_KEY,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
  "train_number": "12656",
  "from": "BSL",
  "to": "ADI",
  "date": "2026-08-27",
  "quota": "GN",
  "max_hops": "6",
  "include_fare": "true",
  "prefer_class": "3A"
}),
});

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/hopping",
    headers={"X-RailCore-Key": os.environ["RAILCORE_KEY"]},
    json=json.loads("{\"train_number\":\"12656\",\"from\":\"BSL\",\"to\":\"ADI\",\"date\":\"2026-08-27\",\"quota\":\"GN\",\"max_hops\":\"6\",\"include_fare\":\"true\",\"prefer_class\":\"3A\"}"),
    timeout=20,
)
print(response.status_code, response.json())

Rate limits and credits

This call costs 10 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": "Hopping analysis 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