Sign inTry it

Find RegioJet train and bus connections with prices.

Searches RegioJet's trains and buses between two cities (Czechia, Slovakia, Austria, Hungary, Poland, Germany and more) on a date: departure and arrival times, stations, travel time, transfers, train or bus, the price range for one adult in your currency, free seats and whether it can be booked, with a link to the search on regiojet.cz.

No reports yetRead-only, no login
Site
RegioJet, Czechia
Version
v1
Runs, last 7 days
No reports yet
sha256
9da1df4dcd61…

Run it with your agent

after installing Wield

Ask in plain words. Your agent finds this recipe and calls it:

“Find RegioJet train and bus connections with prices.”

Read-only: it changes nothing on the site. No login needed.

{
  "tool": "run",
  "arguments": {
    "recipe_id": "regiojet.cz/search-connections",
    "params": {
      "date": "2026-12-10",
      "from": "Prague",
      "to": "Brno"
    }
  }
}

Requests

sent from your browser, in order
  1. 1GETbrn-ybus-pubapi.sa.cz/restapi/consts/locationsRegioJet's public REST API on brn-ybus-pubapi.sa.cz (RegioJet / Student Agency's own API; regiojet.cz calls it cross-origin, CORS allows regiojet.cz): the list of countries, cities (with aliases in several languages) and stations, used to find the two city ids and to name the stations.no cookies
  2. 2GETbrn-ybus-pubapi.sa.cz/restapi/routes/search/simple?departureDate&fromLocationId&fromLocationType&tariffs&toLocationId&toLocationTypeThe route search the site makes (routes/search/simple, adult REGULAR tariff), with the city ids resolved in the one-item foreach (case-insensitive name or alias).no cookiesrepeats, max 1only when needed

Parameters

from your agent
currencyenum "EUR" | "CZK" | "PLN" | "HUF" | "UAH" = "EUR"
datestringrequiredDeparture date YYYY-MM-DD
fromstringrequiredCity as RegioJet names it (English or local name), e.g. 'Prague', 'Praha', 'Brno', 'Vienna', 'Bratislava', 'Kraków'
tostringrequired

Returns

to your agent
connectionsobject[]arrival, bookable, departure, duration_min, free_seats, from_station, price_from, price_to, to_station, transfers, url, vehicles
currencystring
datestring
fromstring
messagestringSet when a city name is not found
tostring

Where it can send

  • brn-ybus-pubapi.sa.cz

Anything else is blocked by the extension.

Reads from your session

Nothing. Your browser attaches the site's cookies by itself.

Used only in requests to the addresses on the left. Never sent to wield.run or your agent.

Checks

a run passes when
  • length(output.connections) > `10`
  • output.from == 'Prague'
  • output.to == 'Brno'
  • length(output.connections[?starts_with(departure, '2026-12-10') && price_from > `0` && duration_min > `90` && duration_min < `400`]) == length(output.connections)
  • length(output.connections[?from_station != `null` && to_station != `null`]) == length(output.connections)
  • output.message == `null`

Raw recipe

Served as canonical JSON from /api/v1/recipes/regiojet.cz/search-connections, so its sha256 matches the ETag and the index.

Check it yourself
curl -s https://wield.run/api/v1/recipes/regiojet.cz/search-connections | shasum -a 256
# 9da1df4dcd61643c74fa4d7b6908f1e8f449c473021645d62420e150eed63269
regiojet.cz/search-connections.json, v1
{
  "description": "Searches RegioJet's trains and buses between two cities (Czechia, Slovakia, Austria, Hungary, Poland, Germany and more) on a date: departure and arrival times, stations, travel time, transfers, train or bus, the price range for one adult in your currency, free seats and whether it can be booked, with a link to the search on regiojet.cz.",
  "effect": "read",
  "id": "regiojet.cz/search-connections",
  "keywords": [
    "regiojet",
    "vlak",
    "autobus",
    "jízdenky",
    "spojení",
    "praha",
    "brno",
    "bratislava",
    "vienna",
    "wien",
    "budapest",
    "kraków",
    "train",
    "bus",
    "tickets",
    "czech",
    "cheap train",
    "student agency"
  ],
  "output": {
    "schema": {
      "properties": {
        "connections": {
          "items": {
            "properties": {
              "arrival": {
                "type": "string"
              },
              "bookable": {
                "type": "boolean"
              },
              "departure": {
                "description": "ISO 8601 with offset",
                "type": "string"
              },
              "duration_min": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "free_seats": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "from_station": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "price_from": {
                "description": "Cheapest fare for one adult",
                "type": [
                  "number",
                  "null"
                ]
              },
              "price_to": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "to_station": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "transfers": {
                "type": "integer"
              },
              "url": {
                "type": "string"
              },
              "vehicles": {
                "description": "TRAIN, BUS",
                "items": {
                  "type": "string"
                },
                "type": "array"
              }
            },
            "type": "object"
          },
          "type": "array"
        },
        "currency": {
          "type": "string"
        },
        "date": {
          "type": "string"
        },
        "from": {
          "type": [
            "string",
            "null"
          ]
        },
        "message": {
          "description": "Set when a city name is not found",
          "type": [
            "string",
            "null"
          ]
        },
        "to": {
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "from",
        "to",
        "connections"
      ],
      "type": "object"
    },
    "value": "let $st = steps.locations.stations, $cur = params.currency || 'EUR', $date = params.date, $f = steps.search[0].f || `null` in let $base = join('', ['https://regiojet.cz/?tariffs=REGULAR&fromLocationType=CITY&fromLocationId=', to_string($f.from.id || ''), '&toLocationType=CITY&toLocationId=', to_string($f.to.id || ''), '&departureDate=', $date]) in {from: $f.from.name || params.from, to: $f.to.name || params.to, date: $date, currency: $cur, message: $f == `null` && 'No RegioJet city matches the from or to name (use the city name, e.g. Prague, Praha, Brno, Vienna)' || `null`, connections: map(&(let $r = @ in let $t = split($r.travelTime || '00:00', ':') in {departure: $r.departureTime, arrival: $r.arrivalTime, from_station: ($st[?id == $r.departureStationId] | [0].name) || `null`, to_station: ($st[?id == $r.arrivalStationId] | [0].name) || `null`, duration_min: (length($t) == `2` && (`60` * (to_number(join('', ['1', $t[0]])) - `100`) + (to_number(join('', ['1', $t[1][0:2]])) - `100`))) || `null`, transfers: $r.transfersCount, vehicles: $r.vehicleTypes, price_from: $r.priceFrom || `null`, price_to: $r.priceTo || `null`, free_seats: $r.freeSeatsCount, bookable: $r.bookable == `true`, url: $base}), steps.search[0].routes || `[]`)}"
  },
  "params": {
    "additionalProperties": false,
    "properties": {
      "currency": {
        "default": "EUR",
        "enum": [
          "EUR",
          "CZK",
          "PLN",
          "HUF",
          "UAH"
        ],
        "type": "string"
      },
      "date": {
        "description": "Departure date YYYY-MM-DD",
        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        "type": "string"
      },
      "from": {
        "description": "City as RegioJet names it (English or local name), e.g. 'Prague', 'Praha', 'Brno', 'Vienna', 'Bratislava', 'Kraków'",
        "maxLength": 60,
        "minLength": 2,
        "type": "string"
      },
      "to": {
        "maxLength": 60,
        "minLength": 2,
        "type": "string"
      }
    },
    "required": [
      "from",
      "to",
      "date"
    ],
    "type": "object"
  },
  "provenance": {
    "method": "browser-inspect",
    "notes": "regiojet.cz's booking app calls RegioJet's public REST API at https://brn-ybus-pubapi.sa.cz/restapi (RegioJet is part of the Student Agency group; sa.cz is its API domain). /consts/locations lists countries → cities (id, name, multilingual aliases) → stations (id, fullname); /routes/search/simple?tariffs=REGULAR&fromLocationType=CITY&fromLocationId&toLocationType=CITY&toLocationId&departureDate returns routes with ISO times, travelTime 'HH:MM h', transfersCount, vehicleTypes, priceFrom/priceTo in the X-Currency currency, freeSeatsCount and bookable. No key or cookie; CORS allows https://regiojet.cz. robots.txt of regiojet.cz has no disallow rules and no rules for Claude-User or anthropic agents; the API host has no robots.txt (404). travelTime is 'HH:MM\\u00a0h' (non-breaking space), parsed as hours and the first two minute digits. Answers servers.",
    "recorded_at": "2026-11-07T22:40:00+01:00",
    "recorded_by": "C4"
  },
  "requires_login": false,
  "schema": "https://wield.run/schema/recipe/v1.json",
  "site": {
    "country": "CZ",
    "id": "regiojet.cz",
    "language": "en",
    "name": "RegioJet",
    "origin": "https://regiojet.cz",
    "origins": [
      "https://brn-ybus-pubapi.sa.cz"
    ]
  },
  "steps": [
    {
      "description": "RegioJet's public REST API on brn-ybus-pubapi.sa.cz (RegioJet / Student Agency's own API; regiojet.cz calls it cross-origin, CORS allows regiojet.cz): the list of countries, cities (with aliases in several languages) and stations, used to find the two city ids and to name the stations.",
      "expect": {
        "assert": "length(body) > `0`",
        "content_type": "json",
        "status": [
          200
        ]
      },
      "extract": {
        "json": {
          "cities": "[].cities[].{id: id, name: name, aliases: aliases || `[]`}",
          "stations": "[].cities[].stations[].{id: id, name: fullname}"
        }
      },
      "id": "locations",
      "request": {
        "credentials": "omit",
        "headers": {
          "Accept": "application/json",
          "X-Lang": "en"
        },
        "method": "GET",
        "url": "https://brn-ybus-pubapi.sa.cz/restapi/consts/locations"
      }
    },
    {
      "description": "The route search the site makes (routes/search/simple, adult REGULAR tariff), with the city ids resolved in the one-item foreach (case-insensitive name or alias).",
      "expect": {
        "assert": "body.routes != `null`",
        "content_type": "json",
        "status": [
          200
        ]
      },
      "extract": {
        "json": {
          "routes": "routes"
        }
      },
      "foreach": {
        "as": "f",
        "in": "[{from: (let $q = lower(trim(params.from)) in steps.locations.cities[?lower(name) == $q || length(aliases[?lower(@) == $q]) > `0`] | [0]), to: (let $q = lower(trim(params.to)) in steps.locations.cities[?lower(name) == $q || length(aliases[?lower(@) == $q]) > `0`] | [0])}]",
        "max": 1
      },
      "id": "search",
      "request": {
        "credentials": "omit",
        "headers": {
          "Accept": "application/json",
          "X-Currency": "{{params.currency}}",
          "X-Lang": "en"
        },
        "method": "GET",
        "query": {
          "departureDate": "{{params.date}}",
          "fromLocationId": "{{f.from.id}}",
          "fromLocationType": "CITY",
          "tariffs": "REGULAR",
          "toLocationId": "{{f.to.id}}",
          "toLocationType": "CITY"
        },
        "url": "https://brn-ybus-pubapi.sa.cz/restapi/routes/search/simple"
      },
      "when": "(let $q = lower(trim(params.from)) in steps.locations.cities[?lower(name) == $q || length(aliases[?lower(@) == $q]) > `0`] | [0]) && (let $q = lower(trim(params.to)) in steps.locations.cities[?lower(name) == $q || length(aliases[?lower(@) == $q]) > `0`] | [0])"
    }
  ],
  "task": "Find RegioJet train and bus connections with prices",
  "tos": {
    "notes": "robots.txt of regiojet.cz has no AI-agent rules (no Claude-User, ClaudeBot or anthropic-ai group, no Content-Signal); the API host has no robots.txt. Terms not reviewed yet for automated access. One person's search: 2 requests (the locations list and one route search), as the booking app makes them. Booking stays on regiojet.cz.",
    "reviewed": false
  },
  "verify": {
    "checks": [
      "length(output.connections) > `10`",
      "output.from == 'Prague'",
      "output.to == 'Brno'",
      "length(output.connections[?starts_with(departure, '2026-12-10') && price_from > `0` && duration_min > `90` && duration_min < `400`]) == length(output.connections)",
      "length(output.connections[?from_station != `null` && to_station != `null`]) == length(output.connections)",
      "output.message == `null`"
    ],
    "example_params": {
      "date": "2026-12-10",
      "from": "Prague",
      "to": "Brno"
    },
    "max_ms": 6000
  },
  "version": 1
}