curl --request GET \
--url https://radiotools.rivi.software/api/v1/stations/{stationSlug}/traffic \
--header 'Authorization: Bearer <token>'import requests
url = "https://radiotools.rivi.software/api/v1/stations/{stationSlug}/traffic"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://radiotools.rivi.software/api/v1/stations/{stationSlug}/traffic', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://radiotools.rivi.software/api/v1/stations/{stationSlug}/traffic",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://radiotools.rivi.software/api/v1/stations/{stationSlug}/traffic"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://radiotools.rivi.software/api/v1/stations/{stationSlug}/traffic")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://radiotools.rivi.software/api/v1/stations/{stationSlug}/traffic")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"contractVersion": 1,
"stationId": "station-rivier",
"snapshot": {
"source": "anwb",
"watch": {
"roads": [
{
"id": "nl:a10",
"code": "A10",
"name": "Ring Amsterdam"
}
]
},
"freshness": {
"status": "fresh",
"thresholdSeconds": 900,
"ageSeconds": 30,
"fetchedAt": "2026-10-05T08:00:01.000Z",
"observedAt": "2026-10-05T08:00:00.000Z",
"lastError": null
},
"incidents": [
{
"id": "anwb-a10-example",
"road": "A10",
"type": "jam",
"direction": "northbound",
"from": "Watergraafsmeer",
"to": "Zeeburg",
"lengthMeters": 2500,
"delaySeconds": 300,
"cause": null,
"closure": null,
"summary": "Slow traffic approaching Zeeburg.",
"updatedAt": "2026-10-05T08:00:00.000Z"
}
],
"totals": {
"incidentCount": 1,
"jamDistanceMeters": 2500,
"delaySeconds": 300
}
}
}Get traffic
Read normalized traffic for the station’s watched roads. Check snapshot.freshness before interpreting an empty incidents array as clear traffic. This endpoint requires an available station resource and redistribution entitlement.
curl --request GET \
--url https://radiotools.rivi.software/api/v1/stations/{stationSlug}/traffic \
--header 'Authorization: Bearer <token>'import requests
url = "https://radiotools.rivi.software/api/v1/stations/{stationSlug}/traffic"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://radiotools.rivi.software/api/v1/stations/{stationSlug}/traffic', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://radiotools.rivi.software/api/v1/stations/{stationSlug}/traffic",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://radiotools.rivi.software/api/v1/stations/{stationSlug}/traffic"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://radiotools.rivi.software/api/v1/stations/{stationSlug}/traffic")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://radiotools.rivi.software/api/v1/stations/{stationSlug}/traffic")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"contractVersion": 1,
"stationId": "station-rivier",
"snapshot": {
"source": "anwb",
"watch": {
"roads": [
{
"id": "nl:a10",
"code": "A10",
"name": "Ring Amsterdam"
}
]
},
"freshness": {
"status": "fresh",
"thresholdSeconds": 900,
"ageSeconds": 30,
"fetchedAt": "2026-10-05T08:00:01.000Z",
"observedAt": "2026-10-05T08:00:00.000Z",
"lastError": null
},
"incidents": [
{
"id": "anwb-a10-example",
"road": "A10",
"type": "jam",
"direction": "northbound",
"from": "Watergraafsmeer",
"to": "Zeeburg",
"lengthMeters": 2500,
"delaySeconds": 300,
"cause": null,
"closure": null,
"summary": "Slow traffic approaching Zeeburg.",
"updatedAt": "2026-10-05T08:00:00.000Z"
}
],
"totals": {
"incidentCount": 1,
"jamDistanceMeters": 2500,
"delaySeconds": 300
}
}
}Authorizations
Station-scoped listener credential. Send Authorization: Bearer <token>, for example Bearer rtm_…. Sending the rtm_ token alone without Bearer returns 401 UNAUTHENTICATED. In the interactive playground, enter only the raw rtm_ token; the playground adds the prefix. Listener REST and GraphQL: listener:read. Listener devices: push:register.
Path Parameters
Public station slug from the station settings; distinct from the internal station ID.
3 - 63Response
Normalized traffic; no-store so revocation applies on the next read
Public JSON contract version. The current version is 1; tolerate additional fields within this version.
1 1
Station identifier associated with this response.
"station-rivier"
Traffic report for the station's configured watched roads.
Show child attributes
Show child attributes
{
"source": "anwb",
"watch": {
"roads": [
{
"id": "nl:a10",
"code": "A10",
"name": "Ring Amsterdam"
}
]
},
"freshness": {
"status": "fresh",
"thresholdSeconds": 900,
"ageSeconds": 30,
"fetchedAt": "2026-10-05T08:00:01.000Z",
"observedAt": "2026-10-05T08:00:00.000Z",
"lastError": null
},
"incidents": [
{
"id": "anwb-a10-example",
"road": "A10",
"type": "jam",
"direction": "northbound",
"from": "Watergraafsmeer",
"to": "Zeeburg",
"lengthMeters": 2500,
"delaySeconds": 300,
"cause": null,
"closure": null,
"summary": "Slow traffic approaching Zeeburg.",
"updatedAt": "2026-10-05T08:00:00.000Z"
}
],
"totals": {
"incidentCount": 1,
"jamDistanceMeters": 2500,
"delaySeconds": 300
}
}
Was this page helpful?