Section 05 of 12
Endpoints
Base URL https://api.quavern.net/v1. All routes are GET. JSON examples are illustrative: ids, names and times are plausible, not live data. Each route costs 1 unit unless stated otherwise.
Common parameters#
| Parameter | Type | Notes |
|---|---|---|
limit | integer | 1–100, default 20 (departures: 1–50, default 10; places: ≤ 20; journeys: ≤ 6) |
cursor | string | opaque, from meta.next_cursor |
network / networks | slug / comma list | restricts cross-network endpoints |
near | lat,lon | decimal degrees, WGS 84 |
radius | metres | 50–5000, default 500 |
bbox | min_lon,min_lat,max_lon,max_lat | at most 0.5° × 0.5° |
modes | comma list | tram,bus,… |
q | string | 1–120 characters, prefix search on names |
when | RFC 3339 or now | default now |
horizon | minutes | 5–180, default 60 |
include | comma list | expansions, per route |
lang | string | accepted and ignored; data is in the operator's language |
Invalid values answer 400 transit_query_invalid or 400 invalid_location.
Health and status#
GET /health#
Try it
Replace the key and the ids; the base URL is this site's API.
curl -sS "https://api.quavern.net/v1/health" \
-H "Accept: application/json"Public, unmetered. {"status": "ok", "service": "quavsit-api"}.
GET /status#
Try it
Replace the key and the ids; the base URL is this site's API.
curl -sS "https://api.quavern.net/v1/status" \
-H "Accept: application/json"Public, unmetered, cached 30 s. One entry per network with its static refresh time, realtime state (ok, degraded, down), upstream daily budgets and the last error.
{"data": [
{"network": "idfm", "static_refreshed_at": "2026-09-07T03:40:10+02:00", "realtime": "ok",
"budgets": {"idfm_siri_sm": {"used": 412, "limit": 1000, "resets_at": "2026-09-08T00:00:00+02:00"}},
"last_error": null}
], "meta": {"generated_at": "2026-09-07T12:00:00Z", "units": 0}}Networks#
GET /networks#
Try it
Replace the key and the ids; the base URL is this site's API.
curl -sS "https://api.quavern.net/v1/networks" \
-H "Authorization: Bearer $QUAVSIT_KEY" \
-H "Accept: application/json"List of Network objects (see Networks for the full shape). No parameters.
{"data": [
{"id": "tbm", "name": "TBM · Bordeaux Métropole", "city": "Bordeaux", "timezone": "Europe/Paris",
"modes": ["tram", "bus", "ferry"], "capabilities": {"realtime_departures": true, "vehicles": "gps",
"alerts": true, "journeys": "quavsit", "shapes": true, "places": true, "streams": true},
"static_refreshed_at": "2026-09-07T03:12:44+02:00"}
], "meta": {"generated_at": "2026-09-07T12:00:00Z", "units": 1, "count": 8}}GET /networks/{network}#
Try it
Replace the key and the ids; the base URL is this site's API.
curl -sS "https://api.quavern.net/v1/networks/tbm" \
-H "Authorization: Bearer $QUAVSIT_KEY" \
-H "Accept: application/json"The Network plus stats.
{"data": {"id": "star", "name": "STAR", "city": "Rennes", "timezone": "Europe/Paris",
"stats": {"lines": 167, "stops": 1832, "areas": 940, "shapes": 590}},
"meta": {"generated_at": "2026-09-07T12:00:00Z", "units": 1, "network": "star", "freshness": "scheduled",
"attribution": ["Rennes Métropole / Keolis Rennes (STAR) — ODbL"]}}GET /networks/{network}/lines#
Try it
Replace the key and the ids; the base URL is this site's API.
curl -sS "https://api.quavern.net/v1/networks/tbm/lines" \
-H "Authorization: Bearer $QUAVSIT_KEY" \
-H "Accept: application/json"List of Line (directions without stops). Parameters: modes, q. Sorted by sort_order, then natural code order (1, 2, 10).
{"data": [
{"id": "tbm:line:59", "network": "tbm", "code": "59", "name": "Gare Saint-Jean – Ambarès", "mode": "bus",
"color": "#8A2E8A", "text_color": "#FFFFFF", "operator": "Keolis Bordeaux Métropole", "sort_order": 59, "accessible": true,
"directions": [{"id": "0", "name": "Ambarès", "headsign": "Ambarès Centre"}, {"id": "1", "name": "Gare Saint-Jean", "headsign": "Gare Saint-Jean"}]}
], "meta": {"generated_at": "2026-09-07T12:00:00Z", "units": 1, "count": 1, "limit": 20, "next_cursor": null}}Lines#
GET /lines/{line_id}#
Try it
Replace the key and the ids; the base URL is this site's API.
curl -sS "https://api.quavern.net/v1/lines/tbm:line:59" \
-H "Authorization: Bearer $QUAVSIT_KEY" \
-H "Accept: application/json"One Line with directions[].stops (ordered stop ids). include=geometry adds shapes (GeoJSON LineString or MultiLineString per direction).
{"data": {"id": "idfm:line:C01371", "network": "idfm", "code": "1", "name": "Métro 1", "mode": "metro",
"color": "#FFCD00", "text_color": "#000000",
"directions": [{"id": "0", "name": "La Défense", "headsign": "La Défense", "stops": ["idfm:stop:31481", "idfm:stop:31482"]}],
"shapes": [{"line_id": "idfm:line:C01371", "direction_id": "0", "geometry": {"type": "LineString", "coordinates": [[2.4, 48.85], [2.39, 48.85]]}}]},
"meta": {"generated_at": "2026-09-07T12:00:00Z", "units": 1, "network": "idfm", "freshness": "scheduled"}}GET /lines/{line_id}/stops#
Try it
Replace the key and the ids; the base URL is this site's API.
curl -sS "https://api.quavern.net/v1/lines/tbm:line:59/stops" \
-H "Authorization: Bearer $QUAVSIT_KEY" \
-H "Accept: application/json"Ordered stops per direction: [{direction_id, stops: [Stop]}].
{"data": [
{"direction_id": "0", "stops": [
{"id": "tbm:stop:3824", "network": "tbm", "kind": "stop", "name": "Quinconces", "lat": 44.8437, "lon": -0.5742,
"parent_id": "tbm:area:BEPIS66", "line_ids": ["tbm:line:B", "tbm:line:C"], "modes": ["tram"], "town": "Bordeaux",
"accessible": true, "platform_code": "A", "children": []}
]}
], "meta": {"generated_at": "2026-09-07T12:00:00Z", "units": 1, "network": "tbm"}}GET /lines/{line_id}/vehicles#
Try it
Replace the key and the ids; the base URL is this site's API.
curl -sS "https://api.quavern.net/v1/lines/tbm:line:59/vehicles" \
-H "Authorization: Bearer $QUAVSIT_KEY" \
-H "Accept: application/json"Live Vehicle list for the line. 404 capability_unsupported when the network has no vehicles (idfm, sncf, ilevia, STAR metro).
{"data": [
{"id": "tam:vehicle:2087", "network": "tam", "line_id": "tam:line:1", "direction_id": "1", "headsign": "Odysseum",
"lat": 43.6087, "lon": 3.8797, "bearing": 112.0, "speed_kmh": 24.5, "delay_seconds": 40, "status": "in_transit",
"current_stop_id": null, "next_stop_id": "tam:stop:1204", "trip_id": "tam:trip:11-4-A-2", "position_source": "gps",
"recorded_at": "2026-09-07T14:10:51+02:00", "occupancy": null}
], "meta": {"generated_at": "2026-09-07T12:10:55Z", "units": 1, "network": "tam", "freshness": "realtime"}}GET /lines/{line_id}/alerts#
Try it
Replace the key and the ids; the base URL is this site's API.
curl -sS "https://api.quavern.net/v1/lines/tbm:line:59/alerts" \
-H "Authorization: Bearer $QUAVSIT_KEY" \
-H "Accept: application/json"Alerts active now (or at when) for the line.
{"data": [
{"id": "tisseo:alert:8123", "network": "tisseo", "severity": "warning", "title": "Travaux ligne A",
"message": "Trafic interrompu entre Jean-Jaurès et Marengo à partir de 21 h.", "cause": "construction", "effect": "reduced_service",
"line_ids": ["tisseo:line:11821949021891696"], "stop_ids": [], "starts_at": "2026-09-07T21:00:00+02:00",
"ends_at": "2026-09-08T05:00:00+02:00", "updated_at": "2026-09-06T16:02:00+02:00", "url": null, "source": "tisseo:messages"}
], "meta": {"generated_at": "2026-09-07T12:00:00Z", "units": 1, "network": "tisseo", "count": 1}}Stops#
GET /networks/{network}/stops#
Try it
Replace the key and the ids; the base URL is this site's API.
curl -sS "https://api.quavern.net/v1/networks/tbm/stops" \
-H "Authorization: Bearer $QUAVSIT_KEY" \
-H "Accept: application/json"Search or list stops. Parameters: q (prefix search, accent-insensitive), near + radius, bbox, line (line id), kind (stop or area), limit, cursor. Sorted by relevance for q, by distance for near.
{"data": [
{"id": "idfm:area:71264", "network": "idfm", "kind": "area", "name": "Châtelet", "lat": 48.8584, "lon": 2.3470,
"parent_id": null, "line_ids": ["idfm:line:C01371", "idfm:line:C01374"], "modes": ["metro", "rail"], "town": "Paris",
"accessible": false, "platform_code": null, "children": ["idfm:stop:31481", "idfm:stop:31482"]}
], "meta": {"generated_at": "2026-09-07T12:00:00Z", "units": 1, "count": 1, "limit": 20, "next_cursor": null}}GET /stops/{stop_id}#
Try it
Replace the key and the ids; the base URL is this site's API.
curl -sS "https://api.quavern.net/v1/stops/tbm:stop:3824" \
-H "Authorization: Bearer $QUAVSIT_KEY" \
-H "Accept: application/json"One Stop with lines (compact Line objects).
{"data": {"id": "tisseo:area:SA_1715", "network": "tisseo", "kind": "area", "name": "Jean Jaurès", "lat": 43.6055, "lon": 1.4490,
"children": ["tisseo:stop:SP_1012"], "lines": [{"id": "tisseo:line:11821949021891696", "code": "A", "name": "Métro A", "mode": "metro", "color": "#E4032E"}]},
"meta": {"generated_at": "2026-09-07T12:00:00Z", "units": 1, "network": "tisseo"}}GET /stops/{stop_id}/alerts#
Try it
Replace the key and the ids; the base URL is this site's API.
curl -sS "https://api.quavern.net/v1/stops/tbm:stop:3824/alerts" \
-H "Authorization: Bearer $QUAVSIT_KEY" \
-H "Accept: application/json"Alerts touching the stop (or any child of an area). Same shape as line alerts.
{"data": [], "meta": {"generated_at": "2026-09-07T12:00:00Z", "units": 1, "network": "sncf", "count": 0}}Departures#
GET /stops/{stop_id}/departures#
Try it
Replace the key and the ids; the base URL is this site's API.
curl -sS "https://api.quavern.net/v1/stops/tbm:stop:3824/departures?limit=5" \
-H "Authorization: Bearer $QUAVSIT_KEY" \
-H "Accept: application/json"Next departures sorted by expected_at or scheduled_at. Parameters: limit (1–50, default 10), line, direction, horizon, when. An area id aggregates its children.
{"data": [
{"stop_id": "tbm:stop:3824", "line_id": "tbm:line:B", "line_code": "B", "line_name": "Tram B", "mode": "tram",
"color": "#E3007D", "text_color": "#FFFFFF", "direction_id": "0", "headsign": "Berges de la Garonne",
"scheduled_at": "2026-09-07T14:12:00+02:00", "expected_at": "2026-09-07T14:13:20+02:00", "delay_seconds": 80,
"realtime": true, "status": "delayed", "trip_id": "tbm:trip:B-14-0-118", "vehicle_id": "tbm:vehicle:2311",
"platform": "A", "source": "tbm:xtradata:horai"},
{"stop_id": "tbm:stop:3824", "line_id": "tbm:line:B", "line_code": "B", "line_name": "Tram B", "mode": "tram",
"color": "#E3007D", "text_color": "#FFFFFF", "direction_id": "0", "headsign": "Berges de la Garonne",
"scheduled_at": "2026-09-07T14:20:00+02:00", "expected_at": null, "delay_seconds": null,
"realtime": false, "status": "unknown", "trip_id": "tbm:trip:B-14-0-119", "vehicle_id": null, "platform": "A", "source": "gtfs"}
], "meta": {"generated_at": "2026-09-07T12:11:03Z", "units": 1, "network": "tbm", "freshness": "realtime",
"sources": [{"id": "tbm:xtradata:horai", "fetched_at": "2026-09-07T12:10:58Z", "age_seconds": 5, "freshness": "realtime"}],
"attribution": ["Bordeaux Métropole / TBM — Licence Ouverte 2.0"], "count": 2, "limit": 10}}GET /stops/{stop_id}/departures/stream#
Try it
Replace the key and the ids; the base URL is this site's API.
curl -sS -N "https://api.quavern.net/v1/stops/tbm:stop:3824/departures/stream?interval=20" \
-H "Authorization: Bearer $QUAVSIT_KEY" \
-H "Accept: text/event-stream"Server-sent events with the same data as above, pushed every interval seconds. See Streams.
GET /lines/{line_id}/vehicles/stream#
Try it
Replace the key and the ids; the base URL is this site's API.
curl -sS -N "https://api.quavern.net/v1/lines/tbm:line:59/vehicles/stream?interval=10" \
-H "Authorization: Bearer $QUAVSIT_KEY" \
-H "Accept: text/event-stream"Server-sent events with the vehicles of a line. See Streams.
Nearby#
GET /stops/nearby#
Try it
Replace the key and the ids; the base URL is this site's API.
curl -sS "https://api.quavern.net/v1/stops/nearby?near=44.8378%2C-0.5792&radius=500" \
-H "Authorization: Bearer $QUAVSIT_KEY" \
-H "Accept: application/json"Stops around a point across networks: each Stop gains distance_meters. Parameters: near (required), radius, networks, modes, limit.
{"data": [
{"id": "star:area:1234", "network": "star", "kind": "area", "name": "République", "lat": 48.1103, "lon": -1.6790,
"modes": ["metro", "bus"], "distance_meters": 84}
], "meta": {"generated_at": "2026-09-07T12:00:00Z", "units": 1, "count": 1, "limit": 20}}GET /departures/nearby#
Try it
Replace the key and the ids; the base URL is this site's API.
curl -sS "https://api.quavern.net/v1/departures/nearby?near=44.8378%2C-0.5792&radius=500" \
-H "Authorization: Bearer $QUAVSIT_KEY" \
-H "Accept: application/json"Merged departures around a point: [{stop, distance_meters, departures}]. Parameters: near (required), radius (≤ 1500), networks, modes, horizon (≤ 90), limit (stops, ≤ 10).
{"data": [
{"stop": {"id": "star:area:1234", "network": "star", "kind": "area", "name": "République", "lat": 48.1103, "lon": -1.6790},
"distance_meters": 84,
"departures": [{"stop_id": "star:stop:1234-1", "line_id": "star:line:0006", "line_code": "C6", "mode": "bus", "headsign": "Rigourdière",
"scheduled_at": "2026-09-07T14:15:00+02:00", "expected_at": "2026-09-07T14:15:40+02:00", "delay_seconds": 40, "realtime": true, "status": "delayed", "source": "star:ods:passages"}]}
], "meta": {"generated_at": "2026-09-07T12:11:03Z", "units": 1, "freshness": "realtime", "count": 1}}GET /vehicles/nearby#
Try it
Replace the key and the ids; the base URL is this site's API.
curl -sS "https://api.quavern.net/v1/vehicles/nearby?near=44.8378%2C-0.5792&radius=1500" \
-H "Authorization: Bearer $QUAVSIT_KEY" \
-H "Accept: application/json"Live vehicles within radius (≤ 5000) across networks that publish or estimate positions. Parameters: near (required), radius, networks, modes, limit.
{"data": [
{"id": "rla:vehicle:512", "network": "rla", "line_id": "rla:line:T1", "direction_id": "0", "headsign": "Hôpital Pasteur",
"lat": 43.7031, "lon": 7.2661, "bearing": 45.0, "speed_kmh": 18.0, "status": "in_transit", "position_source": "gps",
"recorded_at": "2026-09-07T14:10:40+02:00"}
], "meta": {"generated_at": "2026-09-07T12:10:45Z", "units": 1, "freshness": "realtime", "count": 1}}Alerts#
GET /networks/{network}/alerts#
Try it
Replace the key and the ids; the base URL is this site's API.
curl -sS "https://api.quavern.net/v1/networks/tbm/alerts" \
-H "Authorization: Bearer $QUAVSIT_KEY" \
-H "Accept: application/json"Active alerts of a network. Parameters: severity, line, when, limit, cursor.
{"data": [
{"id": "sncf:alert:c9a1", "network": "sncf", "severity": "critical", "title": "Train supprimé",
"message": "TER 866412 Bordeaux – Arcachon est supprimé.", "line_ids": ["sncf:line:SNCF:FR:Line::9f472c56-1a2b-4c3d-9e8f-000000000000:"],
"stop_ids": ["sncf:area:87581009"], "starts_at": "2026-09-07T06:00:00+02:00", "ends_at": "2026-09-07T23:59:00+02:00",
"updated_at": "2026-09-07T07:12:00+02:00", "url": null, "source": "sncf:navitia:disruptions"}
], "meta": {"generated_at": "2026-09-07T12:00:00Z", "units": 1, "network": "sncf", "count": 1, "limit": 20, "next_cursor": null}}GET /alerts#
Try it
Replace the key and the ids; the base URL is this site's API.
curl -sS "https://api.quavern.net/v1/alerts?networks=tbm%2Ctisseo" \
-H "Authorization: Bearer $QUAVSIT_KEY" \
-H "Accept: application/json"Alerts across several networks. networks is required; other parameters as above.
{"data": [], "meta": {"generated_at": "2026-09-07T12:00:00Z", "units": 1, "count": 0, "limit": 20, "next_cursor": null}}Places#
GET /places#
Try it
Replace the key and the ids; the base URL is this site's API.
curl -sS "https://api.quavern.net/v1/places?q=quinconces" \
-H "Authorization: Bearer $QUAVSIT_KEY" \
-H "Accept: application/json"Unified search over stops and areas (store) and addresses (BAN). Parameters: q (required), near (bias), networks, providers (stops, addresses; default both), limit (≤ 20). See Places.
{"data": [
{"id": "tbm:area:BEPIS66", "kind": "area", "name": "Quinconces", "label": "Quinconces, Bordeaux", "lat": 44.8437, "lon": -0.5742,
"network": "tbm", "stop_id": "tbm:area:BEPIS66", "town": "Bordeaux", "postcode": null, "source": "store", "score": 0.98},
{"id": "ban:33063_6120_00012", "kind": "address", "name": "12 Cours du Chapeau Rouge", "label": "12 Cours du Chapeau Rouge 33000 Bordeaux",
"lat": 44.8412, "lon": -0.5716, "network": null, "stop_id": null, "town": "Bordeaux", "postcode": "33000", "source": "ban", "score": 0.71}
], "meta": {"generated_at": "2026-09-07T12:00:00Z", "units": 1, "count": 2, "limit": 10}}GET /places/reverse#
Try it
Replace the key and the ids; the base URL is this site's API.
curl -sS "https://api.quavern.net/v1/places/reverse?near=44.8378%2C-0.5792" \
-H "Authorization: Bearer $QUAVSIT_KEY" \
-H "Accept: application/json"near required. Nearest address (BAN) and nearest stops.
{"data": {"address": {"id": "ban:33063_6120_00012", "kind": "address", "label": "12 Cours du Chapeau Rouge 33000 Bordeaux", "lat": 44.8412, "lon": -0.5716, "source": "ban"},
"stops": [{"id": "tbm:area:BEPIS66", "kind": "area", "name": "Quinconces", "lat": 44.8437, "lon": -0.5742, "network": "tbm", "distance_meters": 310}]},
"meta": {"generated_at": "2026-09-07T12:00:00Z", "units": 1}}Journeys#
GET /journeys#
Try it
Replace the key and the ids; the base URL is this site's API.
curl -sS "https://api.quavern.net/v1/journeys?from=tbm%3Astop%3A3824&to=tbm%3Aarea%3ABEPIS66" \
-H "Authorization: Bearer $QUAVSIT_KEY" \
-H "Accept: application/json"Itineraries between two points inside one network. Costs 5 units. Parameters: from, to (stop id, lat,lon, or free text), when, arrive_by, modes, planner (auto, native, quavsit), max_walk (metres, default 1000, ≤ 2500), network, limit (≤ 6). Rules and the Section shape are in Journeys.
{"data": [
{"id": "j_7f3a", "departure_at": "2026-09-07T14:15:00+02:00", "arrival_at": "2026-09-07T14:41:00+02:00", "duration_seconds": 1560,
"transfers": 1, "walking_seconds": 420, "walking_meters": 510, "fare": {"amount": 210, "currency": "EUR", "text": "2,10 €"}, "co2_grams": 62.0,
"source": "idfm", "realtime": true,
"sections": [
{"kind": "walk", "departure_at": "2026-09-07T14:15:00+02:00", "arrival_at": "2026-09-07T14:19:00+02:00", "duration_seconds": 240, "distance_meters": 290,
"from_place": {"kind": "address", "label": "10 Rue de Rivoli 75004 Paris", "lat": 48.8556, "lon": 2.3592}, "to_place": {"kind": "area", "stop_id": "idfm:area:71264", "name": "Châtelet", "lat": 48.8584, "lon": 2.3470}, "realtime": false},
{"kind": "transit", "departure_at": "2026-09-07T14:21:00+02:00", "arrival_at": "2026-09-07T14:35:00+02:00", "duration_seconds": 840,
"line": {"id": "idfm:line:C01371", "code": "1", "name": "Métro 1", "mode": "metro", "color": "#FFCD00", "text_color": "#000000"}, "headsign": "La Défense", "direction_id": "0",
"stop_ids": ["idfm:stop:31481", "idfm:stop:31490"], "realtime": true}
]}
], "meta": {"generated_at": "2026-09-07T12:11:03Z", "units": 5, "network": "idfm", "freshness": "realtime", "count": 1, "limit": 3}}Usage#
GET /usage#
Try it
Replace the key and the ids; the base URL is this site's API.
curl -sS "https://api.quavern.net/v1/usage" \
-H "Authorization: Bearer $QUAVSIT_KEY" \
-H "Accept: application/json"The caller's plan, period, units used and remaining, overage state, spend, and per-key figures. Costs 0 units.
{"data": {"plan": "starter", "period": "2026-09", "included_units": 50000, "units": 12840, "remaining": 37160,
"overage_available": true, "overage_enabled": false, "overage_unit_amount_decimal": "0.02",
"billable_units": 0, "spent_cents": 0, "spend_cap_cents": 2000, "resets_at": "2026-10-01T00:00:00+00:00",
"keys": [{"id": "3f0c…", "name": "Quavsit key", "prefix": "qv_p_3f0c", "last_four": "9k2Q", "units_today": 412, "units_period": 12840, "last_used_at": "2026-09-07T11:58:41+00:00"}]},
"meta": {"generated_at": "2026-09-07T12:00:00Z", "units": 0}}