Endpoint
- Use a credential with
listener:read. See Authentication for theBearerprefix. POSTtakes a JSON body withqueryand optionalvariables,operationName, andextensions. See Query GraphQL.GETtakes the same fields as URL parameters.variablesandextensionsare JSON-encoded strings. See Query GraphQL with GET.OPTIONSanswers CORS preflight.- Responses are
Cache-Control: no-store. GraphQL has no ETag layer; use the HTTP resources when you need conditional reads. - Unknown, inactive, or public-offline stations return HTTP
404before the query runs. - Keep the token on your server. Browser clients should call your own origin, which forwards the request.
Make a request
GET. Let curl URL-encode each parameter:
GET runs queries only. Send the previewEditorial mutation with POST.
Playground
Run queries against the live API with a credential for your own station. The preset examples use the fictionalrivi-fm slug, so replace it with your station’s slug.
The playground sends the request directly from your browser to the RadioTools API. Nothing is stored, and the token is cleared when you leave the page. Listener queries only read published data.
Queries
The table summarizes each field. The GraphQL schema reference documents every argument, type, enum, error code, and JSON shape.
Dates are local
YYYY-MM-DD strings. values, document, fields, and the weather and traffic snapshots use a JSON scalar, so you cannot select sub-fields inside them. Media bytes are not inlined; use PublicMedia.url, or a smaller rendition from PublicMedia.variants.
content accepts the same sort, direction, and field filters as the HTTP collection. See Requests and response handling.
nowPlaying and trackHistory reflect encoder observations, not the planned rundown. artworkUrl is omitted when unknown.
Example queries
Published records for one content type, newest first:values.slug with the slug you requested, and redirect to the current URL when they differ. Use contentRecord(id:) when you already have the record ID.
Now playing with recent tracks:
Errors
Failures return a standard GraphQLerrors array. Branch on errors[0].extensions.code, which uses the same stable codes as the REST API, and read issues for validation details.
path and a message. An issue can also carry a stable code and a suggestion, a value you could send instead.
The HTTP status follows the most severe error code, for example 400 for VALIDATION_ERROR, 401 for UNAUTHENTICATED, 404 for NOT_FOUND, and 429 for RATE_LIMITED. A resource that is disabled for the station returns NOT_FOUND, except weather and traffic, which return null. See Errors and versioning.
Editorial preview
ThepreviewEditorial mutation renders a draft revision for a headless site’s preview mode. Send it with POST. It needs the listener Bearer token and an X-Preview-Grant header holding a 15-minute preview grant. The playground does not send that header; use it from your server.
PreviewInput takes stationId, recordId, revision, and audience. Never put the grant in a URL.
Live updates
GraphQL has no subscriptions. For live now-playing, on-air, schedule, and content changes, follow the station’s public realtime feed, whichstation.resources.realtime describes. The TypeScript SDK subscribes for you. See Public realtime feed.
Introspection
The endpoint accepts standard introspection queries, so GraphQL clients and code generators can read the schema from it. The TypeScript SDK provides typed helpers for the same operations; settransport: "graphql" to use them.