/openapi.json.
First request & response handling
Working requests, pagination, conditional reads, and non-JSON responses.
Field types & empty states
Real values, nullability, timestamps, content schemas, freshness, and units.
Public delivery
Listener JSON reads, ETags, the realtime feed, and anonymous media URLs.
GraphQL
Query published data with one request, plus an in-browser playground.
Authentication
Listener tokens, push registration, and ingest credentials.
Now-playing ingest
Send reported track metadata from external automation.
Errors & versioning
Stable error codes, pagination, and contractVersion.
HTTP operations
Interactive parameters, schemas, examples, and a request playground.
API surfaces
Open HTTP operations in the API reference sidebar for endpoint schemas, examples, and Try it. Requests are sent to
https://radiotools.rivi.software and require credentials with access to that operation.
Station administrators issue credentials in the dashboard — see Integrations.
What each endpoint returns
Paths below are relative to/api/v1/stations/{stationSlug} unless shown in full.
Each operation page pairs the contract schema with curated fictional examples. Types, required fields, and bounds remain visible alongside realistic values; examples also show empty, stale, and unavailable states where relevant.
Recommended listener integration flow
- Create a station credential with
listener:readin the dashboard and store the secret on your server. GET /api/v1/stations/{stationSlug}withAuthorization: Bearer— discoverresourceslinks anddelivery.pollIntervalSeconds.GET …/schemasthenGET …/content?type=with cursor pagination (same header on every JSON read).- Poll with
If-None-Match, or subscribe to the realtime feed described inresources.realtimefor updates. - Resolve media URLs from published records via
/api/media/public/{stationId}/{versionId}— no token on media bytes.
SDK
The RadioTools SDKs provide typed helpers for public HTTP, GraphQL, and the realtime feed, plus playback ingest. Start with@rivi-software/radiotools-sdk for TypeScript, or use a React, Vue, Svelte, or Next.js binding. Configure the SDK on the server with a tenant token (listener:read); browser clients use your app as a bridge.