curl --request GET \
--url https://radiotools.rivi.software/api/v1/stations/{stationSlug}/weather \
--header 'Authorization: Bearer <token>'import requests
url = "https://radiotools.rivi.software/api/v1/stations/{stationSlug}/weather"
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}/weather', 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}/weather",
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}/weather"
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}/weather")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://radiotools.rivi.software/api/v1/stations/{stationSlug}/weather")
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",
"timezone": "Europe/Amsterdam",
"snapshots": [
{
"source": "open-meteo",
"coverage": {
"id": "nl:noordwest",
"name": "Noordwest",
"countryCode": "nl",
"countryName": "Netherlands",
"latitude": 52.65,
"longitude": 4.75,
"timezone": "Europe/Amsterdam"
},
"freshness": {
"status": "fresh",
"thresholdSeconds": 900,
"ageSeconds": 30,
"fetchedAt": "2026-10-05T08:00:01.000Z",
"observedAt": "2026-10-05T08:00:00.000Z",
"lastError": null
},
"current": {
"asOf": "2026-10-05T08:00:00.000Z",
"conditionCode": "PartlyCloudy",
"daylight": true,
"precipitation": 0,
"temperature": 16.5,
"temperatureApparent": 15.8,
"uvIndex": 2,
"windDirection": 225,
"windGust": 24,
"windSpeed": 14
},
"hourly": [
{
"forecastStart": "2026-10-05T09:00:00.000Z",
"conditionCode": "PartlyCloudy",
"daylight": true,
"precipitation": 0,
"precipitationChance": 0.1,
"temperature": 17,
"temperatureApparent": 16,
"windDirection": 225,
"windGust": 24,
"windSpeed": 14
}
],
"daily": [
{
"forecastStart": "2026-10-04T22:00:00.000Z",
"conditionCode": "PartlyCloudy",
"precipitationAmount": 0.2,
"precipitationChance": 0.2,
"sunriseTime": "2026-10-05T05:48:00.000Z",
"sunsetTime": "2026-10-05T17:08:00.000Z",
"temperatureMax": 18,
"temperatureMin": 11,
"uvIndex": 2,
"windDirection": 225,
"windGust": 24,
"windSpeed": 14
}
]
}
]
}Get weather
Read normalized weather for configured station coverage areas. Check each snapshot’s freshness before display. current may be null and forecast arrays may be empty. This endpoint requires an available station resource and redistribution entitlement.
curl --request GET \
--url https://radiotools.rivi.software/api/v1/stations/{stationSlug}/weather \
--header 'Authorization: Bearer <token>'import requests
url = "https://radiotools.rivi.software/api/v1/stations/{stationSlug}/weather"
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}/weather', 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}/weather",
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}/weather"
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}/weather")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://radiotools.rivi.software/api/v1/stations/{stationSlug}/weather")
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",
"timezone": "Europe/Amsterdam",
"snapshots": [
{
"source": "open-meteo",
"coverage": {
"id": "nl:noordwest",
"name": "Noordwest",
"countryCode": "nl",
"countryName": "Netherlands",
"latitude": 52.65,
"longitude": 4.75,
"timezone": "Europe/Amsterdam"
},
"freshness": {
"status": "fresh",
"thresholdSeconds": 900,
"ageSeconds": 30,
"fetchedAt": "2026-10-05T08:00:01.000Z",
"observedAt": "2026-10-05T08:00:00.000Z",
"lastError": null
},
"current": {
"asOf": "2026-10-05T08:00:00.000Z",
"conditionCode": "PartlyCloudy",
"daylight": true,
"precipitation": 0,
"temperature": 16.5,
"temperatureApparent": 15.8,
"uvIndex": 2,
"windDirection": 225,
"windGust": 24,
"windSpeed": 14
},
"hourly": [
{
"forecastStart": "2026-10-05T09:00:00.000Z",
"conditionCode": "PartlyCloudy",
"daylight": true,
"precipitation": 0,
"precipitationChance": 0.1,
"temperature": 17,
"temperatureApparent": 16,
"windDirection": 225,
"windGust": 24,
"windSpeed": 14
}
],
"daily": [
{
"forecastStart": "2026-10-04T22:00:00.000Z",
"conditionCode": "PartlyCloudy",
"precipitationAmount": 0.2,
"precipitationChance": 0.2,
"sunriseTime": "2026-10-05T05:48:00.000Z",
"sunsetTime": "2026-10-05T17:08:00.000Z",
"temperatureMax": 18,
"temperatureMin": 11,
"uvIndex": 2,
"windDirection": 225,
"windGust": 24,
"windSpeed": 14
}
]
}
]
}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 weather; 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"
IANA timezone used to interpret station calendar dates, for example Europe/Amsterdam.
1 - 100"Europe/Amsterdam"
Weather snapshots for the station's configured coverage areas.
Show child attributes
Show child attributes
[
{
"source": "open-meteo",
"coverage": {
"id": "nl:noordwest",
"name": "Noordwest",
"countryCode": "nl",
"countryName": "Netherlands",
"latitude": 52.65,
"longitude": 4.75,
"timezone": "Europe/Amsterdam"
},
"freshness": {
"status": "fresh",
"thresholdSeconds": 900,
"ageSeconds": 30,
"fetchedAt": "2026-10-05T08:00:01.000Z",
"observedAt": "2026-10-05T08:00:00.000Z",
"lastError": null
},
"current": {
"asOf": "2026-10-05T08:00:00.000Z",
"conditionCode": "PartlyCloudy",
"daylight": true,
"precipitation": 0,
"temperature": 16.5,
"temperatureApparent": 15.8,
"uvIndex": 2,
"windDirection": 225,
"windGust": 24,
"windSpeed": 14
},
"hourly": [
{
"forecastStart": "2026-10-05T09:00:00.000Z",
"conditionCode": "PartlyCloudy",
"daylight": true,
"precipitation": 0,
"precipitationChance": 0.1,
"temperature": 17,
"temperatureApparent": 16,
"windDirection": 225,
"windGust": 24,
"windSpeed": 14
}
],
"daily": [
{
"forecastStart": "2026-10-04T22:00:00.000Z",
"conditionCode": "PartlyCloudy",
"precipitationAmount": 0.2,
"precipitationChance": 0.2,
"sunriseTime": "2026-10-05T05:48:00.000Z",
"sunsetTime": "2026-10-05T17:08:00.000Z",
"temperatureMax": 18,
"temperatureMin": 11,
"uvIndex": 2,
"windDirection": 225,
"windGust": 24,
"windSpeed": 14
}
]
}
]
Was this page helpful?