Make your first request
Run these requests from your consumer server. Replace the fictional station slug and setRADIOTOOLS_LISTENER_TOKEN to a credential with listener:read.
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 inIf-None-Match, together with the listener credential:
304 before reading JSON and keeps previous data scoped to one URL and credential. Create a new reader when either changes.
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 withGET …/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
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: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.