Discover/9292 API
live

9292 API9292.nl

Plan trips across Dutch trains, buses, trams, metros, and ferries by searching for locations and getting detailed journey information including travel times and costs. Find the best routes through the Netherlands' public transport network with real-time trip planning.

This API takes change requests — .
Endpoint health
monitored
get_journey_details
plan_trip
search_locations
Checks pendingself-healing
Endpoints
3
Updated
1h ago
Try it
Maximum number of results to return (1-50).
Free-text search query for a location name, station, stop, or address.
api.parse.bot/scraper/1f75bb0f-f76b-47f6-9036-0d839252dfe4/<endpoint>
Ready to send
Fill in the parameters and hit sign in to send to see live response data here.
Call it over HTTPgrab a free API key at signup
curl -X GET 'https://api.parse.bot/scraper/1f75bb0f-f76b-47f6-9036-0d839252dfe4/search_locations?limit=10&query=Amsterdam+Centraal' \
  -H 'X-API-Key: $PARSE_API_KEY'
Python SDK · recommended

Typed, relational, agent-ready

A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.

  • Fully typed · autocompletes
  • Objects link to objects
  • Typed errors & pagination

Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:

uv add parse-sdk
uv run parse init
uv run parse add --marketplace 9292-nl-api

uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.

"""Walkthrough: 9292 Dutch Public Transport SDK — bounded, re-runnable; every call capped."""
from parse_apis.api_9292_nl_api import NinetyTwoNinetyTwo, RequestType, LocationUnknown

client = NinetyTwoNinetyTwo()

# Search for locations to find valid station IDs.
for loc in client.locations.search(query="Utrecht", limit=3):
    print(loc.label, loc.category, loc.place)

# Plan a trip between two stations.
origin = client.locations.search(query="Amsterdam Centraal", limit=1).first()
for trip in client.trip_plans.plan(
    from_location=origin.id,
    to_location="station-rotterdam-centraal",
    request_type=RequestType.DEPARTURE,
    limit=3,
):
    print(trip.departure_time, trip.duration_minutes, "min", trip.price_euro_cents, "ct", trip.operators)

# Get full journey details for the first trip found.
trip = client.trip_plans.plan(
    from_location="station-amsterdam-centraal",
    to_location="station-rotterdam-centraal",
    limit=1,
).first()

try:
    detail = client.journey_details.get(journey_id=trip.journey_id)
    print(detail.from_, "→", detail.to, "|", detail.duration_minutes, "min")
    for leg in detail.legs:
        print(" ", leg.departure.name, leg.departure.platform, "→", leg.arrival.name, leg.modality)
except LocationUnknown as e:
    print("location not found:", e)

print("exercised: locations.search, trip_plans.plan, journey_details.get")
All endpoints · 3 totalmissing one? ·

Search for public transport locations (stations, stops, addresses) by free-text query. Returns matching locations with their unique IDs, which are used as inputs to plan_trip. Results are ranked by relevance to the query.

Input
ParamTypeDescription
limitintegerMaximum number of results to return (1-50).
queryrequiredstringFree-text search query for a location name, station, stop, or address.
Response
{
  "type": "object",
  "fields": {
    "locations": "array of location objects with id, label, category, place, lat_long, and location_type"
  },
  "sample": {
    "data": {
      "locations": [
        {
          "id": "station-amsterdam-centraal",
          "label": "Amsterdam Centraal",
          "place": "Amsterdam",
          "category": "Treinstation",
          "lat_long": "52.378706,4.900489",
          "location_type": "Station"
        }
      ]
    },
    "status": "success"
  }
}

About the 9292 API

The 9292 API on Parse exposes 3 endpoints for the publicly available data on 9292.nl. Calls return JSON over HTTPS and are billed per successful response.

Pin a release with the API-Snapshot-Version header so canonical updates don't silently change your contract.