Skip to main content

Make your first request

Run these requests from your consumer server. Replace the fictional station slug and set RADIOTOOLS_LISTENER_TOKEN to a credential with listener:read.
The station document gives you its id, timezone, resources, and delivery policy. A slug selects the station in listener URLs; the ID identifies the station in media URLs and ingest requests. They are separate values. The operation pages include selectable fictional examples, including empty and unavailable states. They illustrate the documented shape; they are not live responses or credentials. Replace all sample identifiers with values from your own station. The schema still defines required properties, enums, formats, and bounds.

Match your parser to the response

contractVersion: 1 belongs to listener JSON projections. Media bytes, calendar text, push acknowledgments, and playback-ingest outcomes do not share that envelope.

Conditional reads

Save the ETag returned by a successful listener read. On the next request, send it unchanged in If-None-Match, together with the listener credential:
The following server-side helper handles 304 before reading JSON and keeps previous data scoped to one URL and credential. Create a new reader when either changes.
Do not poll faster than the station document’s delivery.pollIntervalSeconds. no-store prevents shared caching; ETags still allow an authenticated conditional read. Stop displaying old station data after a revoked credential or an offline response.

Retrieve a content page

Discover a type with GET …/schemas, then request its published records:
news and category are fictional schema keys. Use a published type and a text or choice delivery field from your station. Besides an exact match, filters accept category.contains:loc for a case-insensitive substring and category.anyOf:local,sport for any listed value. Add sort=updatedAt to order by latest update, and direction=asc for oldest first. Read records, then pass the returned nextCursor unchanged on the next request with the same type, filters, and sort. Stop when it is null. Content pages accept a maximum limit of 50; reported track history accepts 100. Both default to 25. Cursors are endpoint-specific; do not reuse a content cursor for track history.

Request a schedule window

These dates are inclusive. Use a window of at most 31 days. When truncated is true, split the window into smaller requests. Interpret localDate in the response’s timezone, and use the timestamp fields for actual instants.

Read published media

Use the media URL returned with the published record. It uses the media version ID, not the asset ID, and requires no listener credential:
A satisfiable single range returns 206 Partial Content; inspect Content-Range. A full read returns 200. Image variants are thumb, display, card, and square; use the URLs in the media item’s variants. See Public delivery for resource gates and the realtime feed, and Field types and empty states for interpreting JSON values.