curl --request GET \
--url https://radiotools.rivi.software/api/v1/stations/{stationSlug}/now-playing \
--header 'Authorization: Bearer <token>'import requests
url = "https://radiotools.rivi.software/api/v1/stations/{stationSlug}/now-playing"
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}/now-playing', 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}/now-playing",
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}/now-playing"
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}/now-playing")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://radiotools.rivi.software/api/v1/stations/{stationSlug}/now-playing")
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_bodyGet now playing
Tenant token with listener:read behind the public station gate. Encoder sourceTrackId is omitted. Each track may include artworkUrl (HTTPS) from ingest or from station artwork lookup (Spotify, Apple Music, or Last.fm) after the observation is stored; the field is omitted when no art is known. elapsedSeconds and endsAt are derived from track.observedAt and track.durationSeconds at response time (both null when duration is unknown or the track is not playing). The public realtime feed carries the same projection and may send a follow-up update when lookup fills art.
curl --request GET \
--url https://radiotools.rivi.software/api/v1/stations/{stationSlug}/now-playing \
--header 'Authorization: Bearer <token>'import requests
url = "https://radiotools.rivi.software/api/v1/stations/{stationSlug}/now-playing"
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}/now-playing', 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}/now-playing",
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}/now-playing"
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}/now-playing")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://radiotools.rivi.software/api/v1/stations/{stationSlug}/now-playing")
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_bodyAuthorizations
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
Current observed track independent of the planned rundown
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"
Latest reported track; null when no observation is available.
Show child attributes
Show child attributes
{ "artist": "The Riverlights", "title": "Morning Sun", "album": "Open Water", "durationSeconds": 210, "artworkUrl": "https://images.example.com/riverlights/open-water.jpg", "isPlaying": true, "observedAt": "2026-10-05T08:00:00.000Z", "receivedAt": "2026-10-05T08:00:01.000Z" }
Elapsed seconds derived at response time; null when duration is unknown or the track is not playing.
x >= 030
End timestamp. For now-playing this is derived from observedAt and durationSeconds; null when duration is unknown or the track is not playing.
"2026-10-05T08:03:30.000Z"
Age and freshness of the source observation. A successful HTTP read does not guarantee fresh data.
Show child attributes
Show child attributes
{ "status": "fresh", "thresholdSeconds": 300, "ageSeconds": 30, "observedAt": "2026-10-05T08:00:00.000Z", "receivedAt": "2026-10-05T08:00:01.000Z" }
Was this page helpful?