Conventions
Unless stated otherwise, every v2 endpoint follows the same pattern:
- Method:
POSTwith a JSON body. - Content type: the response is served as
application/json; charset:UTF-8. - CORS:
Access-Control-Allow-Origin: *is set on all endpoints. - Routing: the path after
/radio/v2/is matched by prefix. An unrecognised path returns HTTP 400 with“The endpoint you have requested does not exist.”
Response envelopes
Endpoints that return data echo their JSON payload directly (for example {"Tracks": [...]}). Endpoints that only perform an action use one of three different envelope shapes — check which one applies before writing a client:
| Shape | Used by | Example |
|---|---|---|
message / subcode / submessage | All failures on the data endpoints, plus nextup. | {"message":"Failure","subcode":"FALSE","submessage":"You need to specify a StationID."} |
Success / Message | addrequest and settings. Note the capitalised keys. | {"Success":"Success","Message":"Override updated."} |
success / message | rating. success is a real JSON boolean here, not a string. | {"success":true,"message":"Stars updated."} |
Status codes
| Code | Meaning |
|---|---|
200 | Success. The body is the endpoint’s payload or a success envelope. |
204 | Nothing has changed since the Sequence value you sent. Keep displaying the previously received data. |
400 | Validation failure, missing/invalid credentials, unknown endpoint, or a caller outside the allowed IP range. |
429 | Rate limited — see below. |
message field of the body.Rate limiting (HTTP 429)
Every endpoint runs a shared per-IP throttle before doing any work. Each caller gets a rolling window with a maximum request count; exceeding it starts a temporary ban, and the request that triggered the ban is itself rejected. While banned, every request — to any endpoint — returns:
Retry-After: <seconds>{
"message": "Failure",
"subcode": "Too Many Requests",
"submessage": "You have been throttled due to too many requests. Please try again in 600 seconds."
}
| Attribute | Description | Example |
|---|---|---|
Retry-After (header) | Seconds remaining on the ban. Honour this value rather than retrying on a fixed timer. | 600 |
message | Always Failure. | Failure |
subcode | Always Too Many Requests. Use this to distinguish a throttle from an ordinary failure. | Too Many Requests |
submessage | Human-facing message including the remaining wait, suitable for display. | You have been throttled due to too many requests. Please try again in 600 seconds. |
Retry-After elapses. Polling clients should use the Sequence mechanism on Now Playing, or the Station Data WebSocket, instead of a tight poll loop. Whitelisted addresses bypass the throttle entirely.Station IDs
| StationID | Station |
|---|---|
1 | ericade.radio — 24/7 tracked music |
2 | Best of ericade.radio — podcast station |
Authentication
All endpoints require a JWT token. Obtain one by making a GET request to the token endpoint:
The response is a raw JWT string. Pass it in your POST body — but note that the field name is not the same on every endpoint. Most read Token; a handful read Password. Sending the wrong one leaves the call unauthenticated.
| Field name | Endpoints |
|---|---|
Token | nowplaying, getnextup, songs/<trackid>, search, songs, artists, artists/<artistid>, sitemapartists, songhistory, playout, new-songs, news/<id>, stats, stats/<filtertype>, requests, rating |
Password | news, addrequest, settings |
The ingest endpoints do not use a JWT at all — they authenticate with a pre-shared secret, also sent as Password, and are additionally restricted by IP.
Now Playing
Returns what is currently playing on a station, with comprehensive metadata about the artist and track. Also supports a bandwidth-saving sequence mechanism that returns HTTP 204 when nothing has changed.
Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
Token | Yes | JWT token that authenticates the call. | Get from the get-token endpoint. |
StationID | Yes | The station to get data from. | 1 = ericade.radio 2 = Best of ericade.radio |
Sequence | Yes | Bandwidth-saving mechanism. Send 0 to always receive a full response, or send the TimeStamp value from the previous response. If the current track’s timestamp matches the sent value the API returns HTTP 204 (no body); if it differs, a full response is returned with an updated TimeStamp. | Set to 0 on non-metered connections. |
DisableBufferCompensation | No | 0 = use buffer compensation (default), 1 = disable. The API holds the current track for a preset number of seconds to compensate for stream buffering. | Should always be 0 or omitted unless explicitly needed. |
ReturnPlayList | No | 0 = do not return PlayList (default), 1 = return PlayList. | Also needed for NowPlayingOnPlaylist to be populated. |
NowPlaying, ReturnNextUp, ReturnArtistDescription, ReturnArtistLongDescription and ReturnProductionNotes are all forced to 1 by the router, so the response always includes NextUp, the artist biography and the podcast production notes. Sending those fields has no effect — earlier revisions of this document listed NowPlaying, ReturnNextUp and ReturnArtistDescription as caller-controlled, which was incorrect. Use Track by ID if you need to switch the artist description off.Example request
{
"Token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"StationID": 1,
"Sequence": 0,
"ReturnPlayList": 1
}
Sequence value matches the current track’s TimeStamp. The caller should display the previously received data unchanged.Response
Returns a {"Tracks": [...]} object. The array normally contains one entry for now-playing requests.
| Attribute | Description | Example |
|---|---|---|
Artist | Complete artist field including all collaborators. | Cube |
Title | Track title. | My pixels are weapons |
TrackUpdatedAt | When the track’s metadata was last updated. | 2026-06-12 09:41:02 |
TrackArtists | Array of all artists linked to this track (a track can have more than one). | Array[] |
TrackArtists => ArtistID | Unique artist identifier. | 4821 |
TrackArtists => Artist | Artist name. | Cube |
TrackArtists => ShortDescription | Short artist bio. | (text) |
TrackArtists => LongDescription | Full artist bio. | (text) |
TrackArtists => CompositeRating | Artist rating from 0.0–5.0. | 4.6 |
TrackArtists => Votes | Number of votes the artist has received. | 12 |
TrackArtists => TotalPlays | Number of times this artist has been played. | 6789 |
TrackArtists => Demozoo | Link to the artist’s profile on demozoo.org. | |
TrackArtists => Wikipedia | Link to the artist’s Wikipedia entry. | |
TrackArtists => CSDB | Link to the artist’s C64 Scene Database profile. | |
TrackArtists => OtherUrl | Link to the artist’s homepage or other point of interest. | |
TrackArtists => ModArchive | Link to the artist’s ModArchive profile. | |
TrackArtists => Bandcamp | Link to the artist’s Bandcamp page. | |
TrackArtists => SoundCloud | Link to the artist’s SoundCloud profile. | |
TrackArtists => YouTube | Link to the artist’s YouTube channel. | |
TrackArtists => Pouet | Link to the artist’s Pouet profile. | |
TrackArtists => isBroadcastProhibited | Whether broadcasting this artist’s tracks is prohibited. | 0 or 1 |
TrackArtists => isDownloadProhibited | Whether downloading this artist’s tracks is prohibited. | 0 or 1 |
StationName | Station name in plain text. | 24/7 tracked music |
Slug | URL-friendly slug for the track. | https://ericade.radio/#/song/14820/mindstorm-trackerartist |
StationID | Station number. | 1 = ericade.radio 2 = Best of ericade.radio |
WebStreamingOffset | Web streaming offset for the station in seconds. Used for webplayers. | 12 |
StreamingOffset | Streaming offset for the station in seconds. Used for all other players. | 10 |
TrackCanBeRequested | Whether this track can be requested right now. | 0 or 1 |
RequestVerdict | Human-readable reason why the track cannot be requested. Echo this string to the user. | Song was played recently |
CreationDateHR | When the track was first added to the station, human-readable. | 2026-03-30 15:45:04 |
CreationDate | When the track was first added, Unix epoch string. | 1774885504 |
AddedDate | (Deprecated) Same as CreationDateHR. | 2026-03-30 15:45:04 |
TrackCanBeStarred | Whether this track can receive a star rating right now. | 0 or 1 |
PodcastURL | [Podcast] URL to the podcast audio file. | https://radio.ericade.net/Flashback/97.mp3 |
EpisodeNumber | [Podcast] Episode number. Empty for non-podcast tracks. | 97 |
Image | Image URL for this track. | https://radio.ericade.net/images/demoscene.png |
BroadcastDate | [Podcast] Broadcast date of the podcast episode. | 2022-07-16 |
TitleID | (Deprecated) Not in use. | 13770 |
TrackID | Unique, stable track identifier. Use this in all requests that reference a specific track. | 15717 |
TrackerType | Type/format of the track. | Modern remix (demo scene) |
Type | Stated/inferred song type from PlayIT Live. Not actively used. | Song |
Tags | (Deprecated) Tags associated with the track. | “” |
TagList | List of tags associated with the track. | [] |
PlayLength | Length between Cue In and Cue Out in seconds (decimal, “.” separator). | 193.12099773243 |
PlayLengthHR | Play length expressed as HH:MM. | 03:13 |
Batch | Batch number auto-parsed from the Album field. Format: <StationShortName>-<MonMMMYYYY>-<nn>. | TERN-mar2026-03 |
Album | Album tag from the audio file’s metadata. | OriginalName:!Cube - My Pixels Are Weapons.ogg Imported:2026-03-29 (TERN-mar2026-03). |
About | Short description from the song or podcast episode. | |
ProductionNotes | [Podcast] Production notes. Empty for non-podcast tracks. | |
PlayList | [Podcast] Chapter list for the podcast episode. Empty for non-podcast tracks. Only returns when a specific TrackID is requested. | 00:00 Introduction… |
Transcript | [Podcast] Full transcript of the episode. Empty for non-podcast tracks. | |
Footer | [Podcast] Footer text/show notes appended to the episode. Empty for non-podcast tracks. | |
Equipment | [Podcast] Equipment used to record the episode. Empty for non-podcast tracks. | |
CompositeRating | Track rating from 0.0–5.0. Higher is better. | 4.3 |
Votes | Number of votes the track has received. | 2 |
ArtistCompositeRating | Artist rating from 0.0–5.0. | 4.9 |
ArtistVotes | Number of votes the artist has received. | 0 |
TimeStamp | Track start time as Unix epoch. Required for progress bar calculations and the Sequence mechanism. | 1774885504 |
TimeStampHumanReadable | Track start time as a human-readable date string. | 2026-03-30 15:45:04 |
TrackTotalPlays | Number of times this track has been played on the station. | 313 |
ArtistTotalPlays | Number of times the artist has been played. Currently reflects the first artist only; will be revised. | 206 |
ArtistLongDescription | Full artist biography. Only populated when ReturnArtistDescription=1. Currently reflects the first artist only; will be revised. | (text) |
ArtistShortDescription | (Deprecated) Do not use. | |
Demozoo, Wikipedia, CSDB, OtherUrl, ModArchive, Bandcamp, SoundCloud, YouTube, Pouet | Top-level copies of the first linked artist’s external links. Prefer the per-artist values inside TrackArtists, which are correct for every collaborator. | https://demozoo.org/sceners/7637/ |
NowPlayingOnPlaylist | [Podcast] [Best of ericade.radio(StationID=2)] returns the current chapter. Requires ReturnPlayList to be set to 1 in the call to work. | Love connection by Lavizh |
isListenerRequested | "0" = regular rotation, "1" = listener-requested track. | "0" or "1" |
isOverride | If set to 0 (default), the returned data will show the currently playing track. This is the normal behavior. If set to 1, it will show a preset text from the database. This is used to show special messages or tell the listener what live-show they're listening to. | "0" or "1" |
isLive | This value only counts if the isOverride is set to 1. It will indicate that you are listening to a live show. | "0" or "1" |
isRemote | This value only counts if the isOverride is set to 1. It will indicate that you are listening to a live show, broadcast from a remote location. | "0" or "1" |
isNew | "0" = not new, "1" = new track. | "0" or "1" |
NewDays | Shows the number of days a track is considered new. | 7 |
Podcast | Present in all responses. Empty string for non-podcast tracks. | “” |
musicURL | Direct URL to the track’s audio file. | https://radio.ericade.net/mods/cube-my_pixels_are_weapons.ogg |
musicURLFlac | Direct URL to the track’s FLAC audio file, when available. Empty if no FLAC version exists. | |
musicURLOriginal | (Not yet implemented) Intended to be the direct URL to the track’s original tracker file (.mod, .it, .xm and so on). The resolver behind it is a stub, so it is currently an empty string on every endpoint — as is the original entry in Media. Do not build a download option on it yet. | |
Media | The three URLs above expressed as a typed list, in the fixed order mp3, flac, original. Convenience wrapper for players that iterate over available formats instead of reading each field by name. | Array[] |
Media => type | Which representation this entry describes. The original entry’s URL is currently always empty (see musicURLOriginal). | mp3, flac or original |
Media => url | Direct URL to the file, or an empty string when the track has no file of that type. | https://radio.ericade.net/mods/custom.rmx |
isBroadcastProhibited | Whether broadcasting this track is prohibited. | 0 or 1 |
isDownloadProhibited | Whether downloading this track is prohibited. If 1, the music URLs and every Media entry are empty. | 0 or 1 |
NextUp | Array of the next track’s info. Only populated when ReturnNextUp=1. Station IDs and adverts are excluded. | Array[] |
NextUp => Artist | Artist name of the next track. | MA2E |
NextUp => Title | Title of the next track. | Thrilled 4 noise |
NextUp => AddedDate | When the next track was first added, human-readable. | 2022-04-09 14:41:38 |
NextUp => CompositeRating | Rating 0.0–5.0. | 3.5 |
NextUp => Voters | Vote count. | 0 |
NextUp => Image | Image URL. | https://radio.ericade.net/wp-content/uploads/2020/12/amiga_flashback-1024x1024.jpg |
NextUp => StationID | Station the next track belongs to. | 1 |
NextUp => TrackerType | Track type/format. | Amiga 4-channel module |
NextUp => TrackID | Unique track identifier. | 11971 |
Playlog | Array of recent play timestamps for this track on this station. | Array[] |
Playlog => timestamphr | Human-readable datetime the track was last played. | 2026-03-30 16:00:06 |
Example response
{
"Tracks": [
{
"Artist": "Chris Huelsbeck",
"Title": "Dressed to chill",
"TrackUpdatedAt": "2026-06-12 09:41:02",
"TrackArtists": [
{
"ArtistID": 4821,
"Artist": "Chris Huelsbeck",
"ShortDescription": "A true legend on the Amiga and other systems.",
"LongDescription": "A true legend on the Amiga and other systems. He's most famous for the music from Turrican I, II and III. His music can be found in many games and demos on various systems.",
"CompositeRating": 4.6,
"Votes": 12,
"TotalPlays": 6789,
"Demozoo": "https://demozoo.org/sceners/7637/",
"Wikipedia": "",
"CSDB": "",
"OtherUrl": "",
"ModArchive": "",
"Bandcamp": "https://chrishuelsbeck.bandcamp.com/",
"SoundCloud": "",
"YouTube": "",
"Pouet": "",
"isBroadcastProhibited": 0,
"isDownloadProhibited": 0
}
],
"StationID": 1,
"StationName": "24/7 tracked music",
"Slug": "https://radio.ericade.net/#/song/14051/dressed to chill-chris-huelsbeck",
"WebStreamingOffset": 12,
"StreamingOffset": 10,
"TrackCanBeRequested": 0,
"RequestVerdict": "Artist was played recently",
"CreationDateHR": "2022-11-01 16:19:08",
"CreationDate": "1667315948",
"AddedDate": "2022-11-01 16:19:08",
"TrackCanBeStarred": 1,
"PodcastURL": "",
"EpisodeNumber": "",
"Image": "https://radio.ericade.net/images/rmx.png",
"BroadcastDate": "",
"TitleID": 12098,
"TrackID": 14051,
"TrackerType": "Modern remix",
"Type": "Song",
"Tags": "",
"TagList": [
"Revision",
"Revision 2026"
],
"PlayLength": 273.39934240363,
"PlayLengthHR": "04:33",
"Batch": "TERN-oct2022-05",
"Album": "OriginalName:custom.rmx Imported:2022-11-01 (TERN-oct2022-05).",
"About": "",
"ProductionNotes": "",
"PlayList": "",
"Transcript": "",
"Footer": "",
"Equipment": "",
"CompositeRating": 0,
"Votes": 0,
"ArtistCompositeRating": 4.6,
"ArtistVotes": 12,
"TimeStamp": 1778939868,
"TimeStampHumanReadable": "2026-05-16 13:57:48",
"TrackTotalPlays": 216,
"ArtistLongDescription": "A true legend on the Amiga and other systems. He's most famous for the music from Turrican I, II and III. His music can be found in many games and demos on various systems.",
"ArtistShortDescription": "A true legend on the Amiga and other systems. He's most famous for the music from Turrican I, II and III. His music can be found in many games and demos on various systems.",
"NowPlayingOnPlaylist": "",
"Demozoo": "https://demozoo.org/sceners/7637/",
"Wikipedia": "",
"CSDB": "",
"OtherUrl": "",
"ModArchive": "",
"Bandcamp": "https://chrishuelsbeck.bandcamp.com/",
"SoundCloud": "",
"YouTube": "",
"Pouet": "",
"isListenerRequested": "0",
"isOverride": 0,
"isLive": 0,
"isRemote": 0,
"isNew": 0,
"NewDays": 7,
"Podcast": "",
"musicURL": "https://radio.ericade.net/mods/custom.rmx",
"musicURLFlac": "",
"musicURLOriginal": "",
"Media": [
{ "type": "mp3", "url": "https://radio.ericade.net/mods/custom.rmx" },
{ "type": "flac", "url": "" },
{ "type": "original", "url": "" }
],
"isBroadcastProhibited": 0,
"isDownloadProhibited": 0,
"ArtistTotalPlays": 6789,
"NextUp": [
{
"Artist": "SoundLogic",
"Title": "Monty on the run",
"AddedDate": "2024-09-15 14:12:50",
"CompositeRating": "5.0",
"Voters": "1",
"Image": "https://radio.ericade.net/images/demoscene.png",
"StationID": "1",
"TrackerType": "Modern remix (demo scene)",
"TrackID": "14925"
}
],
"Playlog": [
{
"timestamphr": "2026-05-16 13:57:48"
},
{
"timestamphr": "2026-05-07 22:38:33"
},
{
"timestamphr": "2026-04-28 16:05:51"
}
]
}
]
}
Next Up
Returns the station’s upcoming queue on its own, without the surrounding track record. Equivalent to the NextUp array that Now Playing embeds, but small enough to poll separately.
Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
Token | Yes | JWT token that authenticates the call. | Get from the get-token endpoint. |
StationID | Yes | The station to read the queue for. Defaults to 1 when omitted. | 1 = ericade.radio 2 = Best of ericade.radio |
Example request
{
"Token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"StationID": 1
}
Response
Returns a {"NextUp": [...]} object with up to three entries. Each entry has the same fields as NextUp in the Now Playing response.
ericade.radio, title Back to normal broadcast, tracker type Normal broadcast, AddedDate and ratings zeroed.Example response
{
"NextUp": [
{
"Artist": "SoundLogic",
"Title": "Monty on the run",
"AddedDate": "2024-09-15 14:12:50",
"CompositeRating": "5.0",
"Voters": "1",
"Image": "https://radio.ericade.net/images/demoscene.png",
"StationID": "1",
"TrackerType": "Modern remix (demo scene)",
"TrackID": "14925"
}
]
}
next-up event on the Station Data WebSocket fires whenever the queue changes, avoiding the need to poll.Track by ID
Returns full metadata for a specific track. The response schema is identical to the Now Playing endpoint.
Replace <trackid> in the URL with the numeric TrackID. The path segment wins — a TrackID in the body is ignored.
Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
Token | Yes | JWT token that authenticates the call. | Password is accepted as an alias. |
StationID | Yes | The station the track belongs to. | 1 = ericade.radio 2 = Best of ericade.radio |
LastPlaysToReturn | No | Number of Playlog entries to return. Defaults to 3, hard-capped at 15. | 3 |
ReturnTranscripts | No | [Podcast] 0 = return an empty Transcript (default), 1 = return the full transcript text. | |
ReturnProductionNotes | No | [Podcast] 0 = off (default), 1 = include ProductionNotes. | |
EligibilityFilter | No | 0 = return the track regardless (default), 1 = omit it when it cannot be requested right now. | |
Sequence | No | Same change-detection mechanism as Now Playing. Rarely useful here. |
ReturnArtistDescription, ReturnArtistLongDescription and ReturnPlayList are forced to 1, so the artist biography and podcast chapter list are always included. NowPlaying, ReturnNextUp and DisableBufferCompensation are not applicable and are not forwarded.Limit switches this endpoint into paginated search mode, which ignores the track id in the path and returns a page of the whole library instead. Do not send Limit when you want one track.Example request
{
"Token": "eyJ0eXAiOiJKV1Qi...",
"StationID": 1,
"LastPlaysToReturn": 3,
"ReturnTranscripts": 1
}
Search
Searches the station’s track library by a free-text term and returns matching tracks. The response schema is identical to the Now Playing response.
Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
Token | Yes | JWT token that authenticates the call. | Get from the get-token endpoint. |
StationID | Yes | The station to search. | 1 = ericade.radio 2 = Best of ericade.radio |
Term | Yes | Search string, matched against both title and artist, e.g. “my wolf”. Prefix with Tags: to search the tag list instead. | my wolf Tags: Revision 2026 |
Limit | No | Maximum number of results to return. Defaults to 10 and is capped at 30. | 20 |
Skip | No | Number of results to skip from the start (for pagination). | 0 |
ReturnPlayList | No | [Podcast] 0 = off (default), 1 = include PlayList. | |
ReturnTranscripts | No | [Podcast] 0 = return an empty Transcript (default), 1 = return the full transcript text. |
ReturnArtistDescription, ReturnArtistLongDescription, ReturnProductionNotes and ReturnShowNotes are forced to 1, and eligibility filtering is forced off, so every match is returned with its full artist biography. Search runs across the whole library — StationID is used for the station name and offsets in the response, not as a filter on which tracks match.Example request
{
"Token": "eyJ0eXAiOiJKV1Qi...",
"StationID": 1,
"Term": "my wolf",
"Limit": 20,
"Skip": 0
}
Response
Returns a {"Tracks": [...]} object. Each entry has the same fields as the Now Playing response (Artist, Title, StationID, StationName, TrackCanBeRequested, RequestVerdict, TrackID, TrackerType, CompositeRating, Image, Media, Playlog, etc.). NextUp is omitted — it is not meaningful for search results.
Track Listing
Paged listing of the station’s track library with a total count, for browse and report views. The record is much lighter than the full track object — no ratings, artist links, podcast fields or play history. Use Track by ID when you need the full record for one track.
Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
Token | Yes | JWT token that authenticates the call. | Get from the get-token endpoint. |
StationID | Yes | The station to list tracks from. | 1 = ericade.radio 2 = Best of ericade.radio |
Limit | No | Number of tracks to return. Defaults to 10; values outside 0–9000 are rejected. | 25 |
Skip | No | Number of tracks to skip from the start (for pagination). Values outside 0–10000 are rejected. | 0 |
Search | No | Free-text term matched against artist and title. Prefix with Tag: to search the tag list instead. Max 30 characters. When omitted, station-ID jingles (artist ericade.radio) are excluded. | virgill Tag:Revision |
Example request
{
"Token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"StationID": 1,
"Skip": 0,
"Limit": 25,
"Search": "virgill"
}
Response
| Attribute | Description | Example |
|---|---|---|
Query => ResultCount | Number of tracks in this response. | 25 |
Query => TotalCount | Total number of tracks matching the query, ignoring Skip/Limit. | 312 |
Tracks => ID | Unique track identifier. Same value as TrackID elsewhere in the API — only the key name differs here. | 10147 |
Tracks => StationID | The station this track belongs to. | 1 |
Tracks => StationName | Human-readable station name. | 24/7 tracked music |
Tracks => Title | Track title. | Bratgrumbeere |
Tracks => Fullartist | Complete artist field including all collaborators. | Virgill |
Tracks => TrackUpdatedAt | When the track’s metadata was last updated. | 2026-06-12 09:41:02 |
Tracks => Album | Album tag from the audio file’s metadata. | Original Amiga Works (.mod) TERN-Okt2020-S1 |
Tracks => Image | Image URL derived from the album/format. | https://radio.ericade.net/images/mod.png |
Tracks => Creationdatehr | When the track was first added, human-readable. | 2020-10-14 12:02:11 |
Tracks => Length | Length between Cue In and Cue Out, in seconds. | 292.757 |
Tracks => Lengthhr | Length expressed as MM:SS. | 04:52 |
Tracks => Tracktype | Type/format of the track. | Amiga 4-channel module |
Tracks => musicURL | Direct URL to the track’s audio file. | https://radio.ericade.net/mods/virgill-bratgrumbeere.mod |
Tracks => Path | Internal playout path of the file. | |
Tracks => Guid | Internal GUID from PlayIT Live. Not intended for public use. | aace857b-366a-46fe-9208-1d5b9fc0caae |
Tracks => Tags | Comma-separated tag list. | Revision, Revision 2026 |
{ "Software":["No track information was found."]} with HTTP 200 — there is no Query or Tracks key at all. Handle that shape explicitly.Example response
{
"Query": [
{
"ResultCount": "1",
"TotalCount": "312"
}
],
"Tracks": [
{
"ID": 10147,
"StationID": 1,
"StationName": "24/7 tracked music",
"Title": "Bratgrumbeere",
"Fullartist": "Virgill",
"TrackUpdatedAt": "2026-06-12 09:41:02",
"Album": "Original Amiga Works (.mod) TERN-Okt2020-S1",
"Image": "https://radio.ericade.net/images/mod.png",
"Creationdatehr": "2020-10-14 12:02:11",
"Length": "292.757",
"Lengthhr": "04:52",
"Tracktype": "Amiga 4-channel module",
"musicURL": "https://radio.ericade.net/mods/virgill-bratgrumbeere.mod",
"Path": "\\mods\\virgill-bratgrumbeere.mod",
"Guid": "aace857b-366a-46fe-9208-1d5b9fc0caae",
"Tags": ""
}
]
}
Artists
Paged listing of artists, each with their biography, external links, rating and the complete list of tracks credited to them.
Tracks array of full track objects, so a page of 30 prolific artists can run to several megabytes. Limit is capped at 30 for that reason. Use Sitemap Artists when you only need the flat artist records.Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
Token | Yes | JWT token that authenticates the call. | Get from the get-token endpoint. |
StationID | Yes | Validated against the station configuration, but does not filter the result set — artist records are not station-scoped. | 1 = ericade.radio 2 = Best of ericade.radio |
Limit | No | Number of artists to return. Defaults to 10; more than 30 is rejected. | 10 |
Skip | No | Number of artists to skip from the start (for pagination). Values outside 0–10000 are rejected. | 0 |
Search | No | Free-text term matched against the artist name. Max 30 characters. When omitted, the ericade.radio station identity is excluded. | huelsbeck |
Example request
{
"Token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"StationID": 1,
"Skip": 0,
"Limit": 10,
"Search": "huelsbeck"
}
Response
| Attribute | Description | Example |
|---|---|---|
Query => ResultCount | Number of artists in this response. | 1 |
Query => TotalCount | Total number of artists matching the query. | 1 |
Artists => ArtistID | Unique artist identifier. Matches TrackArtists => ArtistID on the track endpoints. | 4821 |
Artists => Artist | Artist name. | Chris Huelsbeck |
Artists => ShortDescription | Short artist bio. | (text) |
Artists => LongDescription | Full artist bio. | (text) |
Artists => CompositeRating | Artist rating from 0.0–5.0. | 4.6 |
Artists => Votes | Number of votes the artist has received. | 12 |
Artists => TotalPlays | Number of times this artist has been played. | 6789 |
Artists => Album | (Not populated) Always an empty string. | |
Artists => Demozoo, Wikipedia, CSDB, OtherUrl, ModArchive, Bandcamp, SoundCloud, YouTube, Pouet | External links for the artist. | https://demozoo.org/sceners/7637/ |
Artists => isBroadcastProhibited | Whether broadcasting this artist’s tracks is prohibited. | 0 or 1 |
Artists => isDownloadProhibited | Whether downloading this artist’s tracks is prohibited. | 0 or 1 |
Artists => Tracks | Every track credited to this artist, each a full track object with the same fields as the Now Playing response. | Array[] |
{ "Tracks":["No track information was found."]} — note both the unexpected key (Tracks, not Artists) and the array-of-strings shape. Handle it explicitly.Example response
{
"Query": [
{
"ResultCount": "1",
"TotalCount": "1"
}
],
"Artists": [
{
"ArtistID": 4821,
"Artist": "Chris Huelsbeck",
"ShortDescription": "A true legend on the Amiga and other systems.",
"LongDescription": "A true legend on the Amiga and other systems. He's most famous for the music from Turrican I, II and III.",
"CompositeRating": 4.6,
"Votes": 12,
"TotalPlays": 6789,
"Album": "",
"Demozoo": "https://demozoo.org/sceners/7637/",
"Wikipedia": "",
"CSDB": "",
"OtherUrl": "",
"ModArchive": "",
"Bandcamp": "https://chrishuelsbeck.bandcamp.com/",
"SoundCloud": "",
"YouTube": "",
"Pouet": "",
"isBroadcastProhibited": 0,
"isDownloadProhibited": 0,
"Tracks": [
{
"Artist": "Chris Huelsbeck",
"Title": "Dressed to chill",
"TrackID": 14051,
"TrackerType": "Modern remix",
"CompositeRating": 0,
"Votes": 0,
"Image": "https://radio.ericade.net/images/rmx.png"
}
]
}
]
}
Tracks entries are abbreviated above. In a real response each is a full track record with the same field set as the Now Playing response — see that table for every field. Nested track objects always carry NextUp as an empty array; the upcoming queue is only meaningful on the now-playing endpoints.Artist by ID
Returns one artist. The response schema is identical to the Artists endpoint.
Replace <artistid> with the numeric ArtistID, which you can obtain from the TrackArtists array on any track record.
Request fields are the same as Artists (Token, StationID, optional Limit and Skip).
Search value overrides the path segment: the search takes precedence and the artist id is ignored. Send one or the other, not both.Sitemap Artists
Exports artists as flat records without the nested track list, plus the last-modified timestamp a sitemap needs. Because nothing is nested, Limit goes up to 10000 here rather than the 30 of the Artists endpoint.
Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
Token | Yes | JWT token that authenticates the call. | Get from the get-token endpoint. |
StationID | Yes | Validated against the station configuration, but does not filter the result set. | 1 = ericade.radio 2 = Best of ericade.radio |
Limit | No | Number of artists to return. Defaults to 10; more than 10000 is rejected. | 5000 |
Skip | No | Number of artists to skip from the start (for pagination). Values outside 0–10000 are rejected. | 0 |
Search | No | Free-text term matched against the artist name. Max 30 characters. |
Response
Returns the same Query counters as the other list endpoints, followed by an Artists array.
| Attribute | Description | Example |
|---|---|---|
ArtistID | Unique artist identifier. | 4821 |
Artist | Artist name. | Chris Huelsbeck |
ShortDescription / LongDescription | Artist bio. | (text) |
TotalPlays | Number of times this artist has been played. | 6789 |
LastPlayed | Unix epoch of the artist’s most recent play. | 1780262202 |
CompositeRating / Votes | Artist rating and vote count. | 4.6 / 12 |
Demozoo, Wikipedia, CSDB, OtherUrl, ModArchive, Bandcamp, SoundCloud, YouTube, Pouet | External links for the artist. | |
Guid | Internal identifier. Not intended for public use. | |
EligibilityTime | Request-eligibility timer for the artist, Unix epoch. | 1780262202 |
ArtistUpdatedAt | When the artist record was last updated. This is the value to use as <lastmod> in a sitemap. | 2026-06-12 09:41:02 |
Example response
{
"Query": [
{
"ResultCount": "1",
"TotalCount": "5312"
}
],
"Artists": [
{
"ArtistID": 4821,
"Artist": "Chris Huelsbeck",
"ShortDescription": "A true legend on the Amiga and other systems.",
"LongDescription": "A true legend on the Amiga and other systems.",
"TotalPlays": 6789,
"LastPlayed": "1780262202",
"CompositeRating": "4.6",
"Votes": "12",
"Demozoo": "https://demozoo.org/sceners/7637/",
"Wikipedia": "",
"CSDB": "",
"OtherUrl": "",
"ModArchive": "",
"Bandcamp": "https://chrishuelsbeck.bandcamp.com/",
"SoundCloud": "",
"YouTube": "",
"Pouet": "",
"Guid": "",
"EligibilityTime": "1780262202",
"ArtistUpdatedAt": "2026-06-12 09:41:02"
}
]
}
Song History
Returns the recently played tracks on a station.
Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
Token | Yes | JWT token that authenticates the call. | Get from the get-token endpoint. Password is accepted as an alias. |
StationID | Yes | The station to get history for. | 1 = ericade.radio 2 = Best of ericade.radio |
Limit | No | Number of history entries to return. Defaults to 10; more than 9000 is rejected. | 8 |
LastAddedMode | No | 0 = recently played, newest first (default). 1 = recently added to the library, newest first. |
Example request
{
"Token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"StationID": 1,
"Limit": 8
}
Response
Returns a {"Tracks": [...]} array ordered most-recent first.
| Attribute | Description | Example |
|---|---|---|
TrackID | Unique, stable track identifier. | 10147 |
TimeStampHR | When this track started playing, as a human-readable date string. | 2026-03-30 20:44:32 |
TimeStamp | When this track started playing, as a Unix epoch. | 1774903472 |
Artist | Complete artist field. | Virgill |
Title | Track title. | Bratgrumbeere |
TrackArtists | Array of all artists linked to this track. Same object structure as TrackArtists in the Now Playing response. | Array[] |
CreationDate | When the track was first added, Unix epoch. Populated in last-added mode; empty in the default mode. | |
CreationDateHR | (Not implemented) Always an empty string — the value is fetched but never written to the response. | |
Album | Album tag from audio file metadata. | Original Amiga Works (.mod) TERN-Okt2020-S1 |
Duration | Duration of the track in seconds. | 292.75718820861700000000 |
TrackerType | Type of tracker used for the track. | Amiga 4-channel module |
musicURL | Direct URL to the track’s audio file. Empty when downloading the track is prohibited. Song history returns only this one audio URL — there is no Media array or FLAC/original variant here. | https://radio.ericade.net/mods/dr_awesome-gone_for_good.mod |
Image | URL to the track's image. | https://radio.ericade.net/images/mod.png |
IsListenerRequested | Indicates if the track was requested by a listener (0 = no, 1 = yes). | 0 |
StationID | The station this track belongs to. | 1 |
Guid | (Will be removed) Internal GUID from PlayIT Live. Not intended for public use. | 6894ac27-abc9-4c4a-aad2-15879dda4dff |
Example response
{
"Tracks": [
{
"TrackID": "10147",
"TimeStampHR": "2026-05-31 21:16:42",
"TimeStamp": "1780262202",
"Artist": "Dr. Awesome",
"Title": "Gone For Good",
"TrackArtists": [
{
"ArtistID": 5133,
"Artist": "Dr. Awesome",
"ShortDescription": "",
"LongDescription": "",
"CompositeRating": 4.2,
"Votes": 8,
"TotalPlays": 412,
"Demozoo": "",
"Wikipedia": "",
"CSDB": "",
"OtherUrl": "",
"ModArchive": "",
"Bandcamp": "",
"SoundCloud": "",
"YouTube": "",
"Pouet": "",
"isBroadcastProhibited": 0,
"isDownloadProhibited": 0
}
],
"CreationDate": "",
"CreationDateHR": "",
"Album": "Original Amiga Works (.mod) TERN-Okt2020-S1",
"Duration": "292.75718820861700000000",
"TrackerType": "Amiga 4-channel module",
"musicURL": "https://radio.ericade.net/mods/dr_awesome-gone_for_good.mod",
"Image": "https://radio.ericade.net/images/mod.png",
"IsListenerRequested": "0",
"StationID": "1",
"Guid": "aace857b-366a-46fe-9208-1d5b9fc0caae"
},
{
"TrackID": "12115",
"TimeStampHR": "2026-05-31 21:16:34",
"TimeStamp": "1780262194",
"Artist": "ericade.radio",
"Title": "You want to hear your favorite song on this station. Go to ericade.radio-song",
"TrackArtists": [],
"CreationDate": "",
"CreationDateHR": "",
"Album": "Format:.stn TERN.",
"Duration": "10.44897959183670000000",
"TrackerType": "StationID",
"musicURL": "https://radio.ericade.net/mods/ericade_stationid_12115.stn",
"Image": "https://radio.ericade.net/images/stn.png",
"IsListenerRequested": "0",
"StationID": "1",
"Guid": "3933ca49-d5f3-426e-bbfd-494695977262"
}
]
}
Playout
Returns either the recently played tracks or the recently added ones, selected by LastAddedMode. This is the older, differently shaped sibling of Song History — it carries rating and request-eligibility fields that song history does not.
LastAddedMode: 1. In the default mode the underlying query does not select the creation-date columns, and the endpoint emits "CreationDate": with no value — strict JSON parsers reject the body. Until that is fixed, use last-added mode here, or use Song History for play history.Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
Token | Yes | JWT token that authenticates the call. | Get from the get-token endpoint. |
StationID | Yes | The station to read from. | 1 = ericade.radio 2 = Best of ericade.radio |
Limit | No | Number of entries to return. Defaults to 10; more than 100 is rejected. | 20 |
LastAddedMode | No | 0 = recently played, newest first (default — see the warning above). 1 = recently added to the library, newest first, with the rating and eligibility fields included. | 1 |
Example request
{
"Token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"StationID": 1,
"Limit": 20,
"LastAddedMode": 1
}
Response
Returns a {"Tracks": [...]} object. Fields marked [LastAddedMode=1] are present only in last-added mode.
| Attribute | Description | Example |
|---|---|---|
TimeStampHR | When the track played, or was added in last-added mode, human-readable. | 2026-03-30 20:44:32 |
TimeStamp | The same moment as a Unix epoch. | 1774903472 |
Artist | Complete artist field. | Dr. Awesome |
Title | Track title. | Gone For Good |
TrackArtists | Array of all artists linked to this track. Same object structure as TrackArtists in the Now Playing response. | Array[] |
PlayLengthHR | [LastAddedMode=1] Play length as MM:SS. | 04:52 |
PlayLength | [LastAddedMode=1] Duration in seconds. | 292.757 |
TrackerType | [LastAddedMode=1] Type/format of the track. | Amiga 4-channel module |
CompositeRating | [LastAddedMode=1] Track rating from 0.0–5.0. | 4.2 |
Votes | [LastAddedMode=1] Number of votes the track has received. | 8 |
TrackTotalPlays | [LastAddedMode=1] Number of times this track has been played. | 313 |
TrackCanBeRequested | [LastAddedMode=1] Whether the track can be requested right now. | 0 or 1 |
RequestVerdict | [LastAddedMode=1] Human-readable reason why it cannot be requested. Echo this string to the user. | Song was played recently |
TrackID | Unique, stable track identifier. | 10147 |
CreationDate | [LastAddedMode=1] When the track was first added, Unix epoch. | 1667315948 |
CreationDateHR | [LastAddedMode=1] The same moment, human-readable. | 2022-11-01 16:19:08 |
Album | [LastAddedMode=1] Album tag from the audio file’s metadata. | Original Amiga Works (.mod) TERN-Okt2020-S1 |
Image | URL to the track’s image. | https://radio.ericade.net/images/mod.png |
musicURL | Direct URL to the track’s audio file. | https://radio.ericade.net/mods/dr_awesome-gone_for_good.mod |
StationID | The station this track belongs to. | 1 |
Guid | Internal GUID from PlayIT Live. Not intended for public use. | aace857b-366a-46fe-9208-1d5b9fc0caae |
Example response
{
"Tracks": [
{
"TimeStampHR": "2026-05-31 21:16:42",
"TimeStamp": 1780262202,
"Artist": "Dr. Awesome",
"Title": "Gone For Good",
"TrackArtists": [
{
"ArtistID": 5133,
"Artist": "Dr. Awesome",
"ShortDescription": "",
"LongDescription": "",
"CompositeRating": 4.2,
"Votes": 8,
"TotalPlays": 412,
"Demozoo": "",
"Wikipedia": "",
"CSDB": "",
"OtherUrl": "",
"ModArchive": "",
"Bandcamp": "",
"SoundCloud": "",
"YouTube": "",
"Pouet": "",
"isBroadcastProhibited": 0,
"isDownloadProhibited": 0
}
],
"PlayLengthHR": "04:52",
"PlayLength": 292.757,
"TrackerType": "Amiga 4-channel module",
"CompositeRating": 4.2,
"Votes": 8,
"TrackTotalPlays": 313,
"TrackCanBeRequested": 1,
"RequestVerdict": "Track can be requested",
"TrackID": 10147,
"CreationDate": 1667315948,
"CreationDateHR": "2022-11-01 16:19:08",
"Album": "Original Amiga Works (.mod) TERN-Okt2020-S1",
"Image": "https://radio.ericade.net/images/mod.png",
"musicURL": "https://radio.ericade.net/mods/dr_awesome-gone_for_good.mod",
"StationID": 1,
"Guid": "aace857b-366a-46fe-9208-1d5b9fc0caae"
}
]
}
New Songs
Returns the tracks most recently added to the station’s library, newest first, together with their ratings and current request eligibility. Use this to build a “new on the station” panel.
This is the last-added view of Playout with the mode fixed server-side, so every entry always carries the rating and eligibility fields and the malformed-JSON caveat on that endpoint does not apply here.
Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
Token | Yes | JWT token that authenticates the call. | Get from the get-token endpoint. |
StationID | Yes | The station to read from. | 1 = ericade.radio 2 = Best of ericade.radio |
Limit | No | Number of tracks to return. Defaults to 10; more than 100 is rejected. | 20 |
Example request
{
"Token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"StationID": 1,
"Limit": 20
}
Response
Identical to the Playout response in last-added mode.
isNew and NewDays fields on the Now Playing record — they reflect the station’s own definition of “new”.News & Podcasts
Lists news posts and podcast episodes, with pagination, free-text and tag search, and optional transcripts. This is the endpoint behind the podcast display pages and the RSS feed builder.
Password, not Token. The by-id variant reads Token. Sending the wrong field leaves the call unauthenticated.Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
Password | Yes | JWT token that authenticates the call. | Note the field name — not Token. |
StationID | Yes | The station to read from. | 1 = ericade.radio 2 = Best of ericade.radio |
Podcasts | No | 0 = do not filter on podcasts (default), 1 = only podcast entries, 2 = only podcast entries including the Length and LengthHR columns. | 2 |
News | No | 0 = off (default), 1 = include news entries. Combine with Podcasts to get both kinds in one response. | |
ID | No | Return only the entry linked to this TrackID. Also switches on the length columns. | 13770 |
Limit | No | Number of entries to return. Defaults to 200; values outside 0–200 are rejected. | 20 |
Skip | No | Number of entries to skip from the start (for pagination). Values outside 0–300 are rejected. | 0 |
Search | No | Free-text term matched against artist and title. Prefix with Tag: to search the tag list instead. Max 30 characters. | Tag:Revision 2026 |
IncludeTags | No | 0 = off (default), 1 = join in the tag column so Tags and TagList are populated. | |
ReturnTranscripts | No | 0 = return an empty Transcript (default), 1 = return the full transcript text. Transcripts are large — leave this off unless you display them. |
Example request
{
"Password": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"StationID": 2,
"Podcasts": 2,
"Limit": 10,
"Skip": 0,
"IncludeTags": 1,
"ReturnTranscripts": 0
}
Response
Returns the Query paging counters followed by a Tracks array. Fields marked [Podcast] are empty for news posts.
| Attribute | Description | Example |
|---|---|---|
Query => ResultCount | Number of entries in this response. | 10 |
Query => TotalCount | Total number of entries matching the query. | 97 |
TrackID | Identifier of the track the post is linked to. | 13770 |
Title | Episode or post title. | Flashback episode 97 |
Artist | Show or author name. | ericade.radio |
TrackUpdatedAt | When the entry was last updated. | 2026-06-12 09:41:02 |
About | Short description of the episode or post. | |
Slug | URL-friendly slug for the entry. | https://radio.ericade.net/#/song/13770/flashback-97 |
Episode | [Podcast] Episode number as a string. | 97 |
Explicit | Explicit-content flag for the podcast feed. | 0 or 1 |
LastBuild | Timestamp of the last RSS feed build. Only present when the stats row exists. | 2026-08-01 04:00:02 |
Length | Track length in seconds. Only present when Podcasts=2 or ID is set. | 3612.4 |
LengthHR | Track length as MM:SS (HH:MM:SS when over an hour). Same condition as Length. | 01:00:12 |
BroadcastDate | [Podcast] Broadcast date of the episode. | 2022-07-16 |
Image | Image URL for the entry. | https://radio.ericade.net/wp-content/uploads/2020/12/amiga_flashback.jpg |
PodcastImage | [Podcast] Dedicated podcast artwork URL, when set. | |
CompositeRating | Rating from 0.0–5.0. | 4.3 |
TrackVotes | Number of votes the entry has received. Note the name — it is Votes on the track endpoints. | 12 |
Tags | Comma-separated tag list. Empty unless IncludeTags=1 or a tag search was performed. | Amiga, Flashback |
TagList | The same tags as an array. | [] |
Equipment | [Podcast] Equipment used to record the episode. | |
PlayList | [Podcast] Chapter list for the episode. | 00:00 Introduction… |
ProductionNotes | [Podcast] Production notes. | |
hasTranscript | 1 when a transcript exists. Use it to decide whether a second call with ReturnTranscripts=1 is worth making. | 0 or 1 |
Transcript | Full transcript text. Empty unless ReturnTranscripts=1. | |
ShowNotes | [Podcast] Show notes for the episode. | |
Footer | [Podcast] Footer text appended to the episode. | |
isNews | 1 when the entry is a news post. | 0 or 1 |
isPodcast | 1 when the entry is a podcast episode. | 0 or 1 |
isRSS | 1 when the entry is published in the RSS feed. | 0 or 1 |
News | Body text of the news post. | |
PodcastFileLength | [Podcast] Size of the audio file in bytes, for the RSS enclosure. | 57829120 |
PodcastURL | [Podcast] URL to the podcast audio file. | https://radio.ericade.net/Flashback/97.mp3 |
EpisodeNumber | [Podcast] Episode number as a number. 0 for news posts. | 97 |
{ "Tracks":["No news information was found."]} — an array of strings rather than of objects. Handle that shape explicitly.Example response
{
"Query": [
{
"ResultCount": "1",
"TotalCount": "97"
}
],
"Tracks": [
{
"TrackID": "13770",
"Title": "Flashback episode 97",
"Artist": "ericade.radio",
"TrackUpdatedAt": "2026-06-12 09:41:02",
"About": "A trip back to the Amiga demo scene of 1992.",
"Slug": "https://radio.ericade.net/#/song/13770/flashback-episode-97-ericade-radio",
"Episode": "97",
"Explicit": "0",
"LastBuild": "2026-08-01 04:00:02",
"Length": "3612.4",
"LengthHR": "01:00:12",
"BroadcastDate": "2022-07-16",
"Image": "https://radio.ericade.net/wp-content/uploads/2020/12/amiga_flashback.jpg",
"PodcastImage": "",
"CompositeRating": "4.3",
"TrackVotes": "12",
"Tags": "Amiga, Flashback",
"TagList": ["Amiga", "Flashback"],
"Equipment": "",
"PlayList": "00:00 Introduction...",
"ProductionNotes": "",
"hasTranscript": "1",
"Transcript": "",
"ShowNotes": "",
"Footer": "",
"isNews": "0",
"isPodcast": "1",
"isRSS": "1",
"News": "",
"PodcastFileLength": "57829120",
"PodcastURL": "https://radio.ericade.net/Flashback/97.mp3",
"EpisodeNumber": 97
}
]
}
News by ID
Returns one news post or podcast episode. The response schema is identical to the News & Podcasts endpoint.
Replace <id> with the TrackID the entry is linked to. Addressing a single entry also switches on the Length and LengthHR columns.
Request fields are the same as News & Podcasts (StationID, optional Podcasts, News, Limit, Skip, Search, ReturnTranscripts), with one difference: this route reads the JWT from Token, not Password.
Example request
{
"Token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"StationID": 2,
"ReturnTranscripts": 1
}
Statistics
Returns various statistics for a station.
Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
Token | Yes | JWT token that authenticates the call. | Get from the get-token endpoint. |
StationID | Yes | (Not implemented) Accepted, but the response always covers every station. | 1 = ericade.radio 2 = Best of ericade.radio |
Limit and Days are not forwarded on this path — the router only reads them on Statistics by FilterType. On this endpoint every top/bottom list is fixed at 10 rows and the rating and request windows are fixed at 30 days. Earlier revisions of this document listed both fields here as working; that was incorrect.Example request
{
"Token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"StationID": 1
}
Response
Returns a {"Stations": [...]} array. Each element in Stations represents one station and contains the fields below.
| Attribute | Description | Example |
|---|---|---|
StationID | The station identifier. | 1 |
StationName | Human-readable station name. | 24/7 tracked music |
TotalLength | Total combined length of all tracks on the station, in hours. | 180.4 |
TracksOnStation | Total number of tracks on the station. | 3125 |
Trackerstats | Array of tracker-type breakdowns. Each object contains TrackerType (name of the tracker format), Tracks (number of tracks of that type), Percent (percentage of total), and StationID. | Array[] |
Requests | Array of the most-requested tracks within the last Days days. Each object is a full Track record (see Now Playing response) plus a Count field (number of times requested in the period). | Array[] |
TopTracks | Array of the highest-rated tracks within the last Days days. Each object is a full Track record (see Now Playing response). | Array[] |
BottomTracks | Array of the lowest-rated tracks within the last Days days. Same structure as TopTracks. | Array[] |
TopArtists | Array of the highest-rated artists. Each object contains Artist, CompositeRating, and Voters. | Array[] |
BottomArtists | Array of the lowest-rated artists. Same fields as TopArtists. | Array[] |
StreamingCountries | Array of listener countries ordered by session count. Each object contains Country (country name) and Count (number of streaming sessions). | Array[] |
StreamingAgents | Array of user-agent strings seen in streaming sessions, ordered by count. Each object contains Agent and Count. | Array[] |
LogoffPlay | Array of tracks most commonly playing when listeners disconnect. Each object contains Track (formatted "Artist-Title." string), NumberOfPlays, and StationID. | Array[] |
Duplicates | Array of tracks that appear more than once in the library (same artist and title, different IDs). Each object contains FullArtist, Title, and TrackID. | Array[] |
Requests, TopTracks and BottomTracks entries in the example below are abbreviated for readability. In a real response each object is a full track record with the same field set as the Now Playing response (see that table for every field), plus a Count field on Requests entries.Example response
{
"Stations": [
{
"StationID": "1",
"StationName": "24/7 tracked music",
"TotalLength": "180.4",
"TracksOnStation": "3125",
"Trackerstats": [
{
"TrackerType": "Amiga 4-channel module",
"Tracks": "1180",
"Percent": "37.8",
"StationID": "1"
},
{
"TrackerType": "Fasttracker",
"Tracks": "873",
"Percent": "27.9",
"StationID": "1"
},
{
"TrackerType": "Impulsetracker",
"Tracks": "539",
"Percent": "17.2",
"StationID": "1"
},
{
"TrackerType": "Modern remix",
"Tracks": "169",
"Percent": "5.4",
"StationID": "1"
},
{
"TrackerType": "Screamtracker",
"Tracks": "138",
"Percent": "4.4",
"StationID": "1"
},
{
"TrackerType": "Modern remix (demo scene)",
"Tracks": "131",
"Percent": "4.2",
"StationID": "1"
},
{
"TrackerType": "Multitracker",
"Tracks": "49",
"Percent": "1.6",
"StationID": "1"
},
{
"TrackerType": "Pretracker",
"Tracks": "24",
"Percent": "0.8",
"StationID": "1"
},
{
"TrackerType": "OctaMed/MED",
"Tracks": "6",
"Percent": "0.2",
"StationID": "1"
},
{
"TrackerType": "AHX Synth-tracker",
"Tracks": "4",
"Percent": "0.1",
"StationID": "1"
},
{
"TrackerType": "MO3",
"Tracks": "3",
"Percent": "0.1",
"StationID": "1"
},
{
"TrackerType": "C64 Sidtune",
"Tracks": "3",
"Percent": "0.1",
"StationID": "1"
},
{
"TrackerType": "Digi Booster Pro",
"Tracks": "2",
"Percent": "0.1",
"StationID": "1"
},
{
"TrackerType": "Unknown",
"Tracks": "1",
"Percent": "0.0",
"StationID": "1"
},
{
"TrackerType": "Digi Booster",
"Tracks": "1",
"Percent": "0.0",
"StationID": "1"
},
{
"TrackerType": "Scream tracker 2",
"Tracks": "1",
"Percent": "0.0",
"StationID": "1"
},
{
"TrackerType": "SoundFX / MultiMedia Sound",
"Tracks": "1",
"Percent": "0.0",
"StationID": "1"
}
],
"Requests": [
{
"Artist": "Ekorren",
"Title": "Little Danyjel",
"TrackID": "14050",
"Count": "20"
},
{
"Artist": "Synthesized World 2",
"Title": "Radio Smile",
"TrackID": "",
"Count": "20"
},
{
"Artist": "Drakonpod",
"Title": "Goa-ing",
"TrackID": "",
"Count": "16"
},
{
"Artist": "Maf",
"Title": "Mafland remix",
"TrackID": "14907",
"Count": "16"
},
{
"Artist": "Arpegiator of Chryseis",
"Title": "My wolf 2",
"TrackID": "10663",
"Count": "13"
},
{
"Artist": "Yannis Brown",
"Title": "Tres Dilettantes",
"TrackID": "",
"Count": "12"
},
{
"Artist": "Xyce",
"Title": "Mirage",
"TrackID": "",
"Count": "11"
},
{
"Artist": "CyberZip",
"Title": "Ahh My Goddess!",
"TrackID": "13528",
"Count": "10"
},
{
"Artist": "Dr Vector",
"Title": "Auto rock",
"TrackID": "15441",
"Count": "9"
},
{
"Artist": "Arcane toaster",
"Title": "Fly Little Dino",
"TrackID": "",
"Count": "8"
}
],
"TopTracks": [
{
"Artist": "Xyce",
"Title": "Rymdkraft - Dolph's aerobics (remix)",
"CompositeRating": "5.0",
"Voters": "5",
"TrackID": "12003"
},
{
"Artist": "Nusrat",
"Title": "Summertime",
"CompositeRating": "5.0",
"Voters": "4",
"TrackID": "13229"
},
{
"Artist": "Trackerartist",
"Title": "Dragons lair",
"CompositeRating": "5.0",
"Voters": "4",
"TrackID": "10186"
},
{
"Artist": "Vogue of Triton",
"Title": "Ambient power",
"CompositeRating": "5.0",
"Voters": "4",
"TrackID": "10445"
},
{
"Artist": "Mister E",
"Title": "Dedic8ed 2 AsmoDeon",
"CompositeRating": "5.0",
"Voters": "4",
"TrackID": "13194"
},
{
"Artist": "Blackstar (Oddgeir Hvidsten) and Time Traveller (Geir Rune Ladehaug)",
"Title": "Blue stars",
"CompositeRating": "5.0",
"Voters": "3",
"TrackID": "10688"
},
{
"Artist": "Phobium",
"Title": "Tonik Funture (phob)",
"CompositeRating": "5.0",
"Voters": "3",
"TrackID": "14504"
},
{
"Artist": "4-mat",
"Title": "Eternity",
"CompositeRating": "5.0",
"Voters": "3",
"TrackID": "13491"
},
{
"Artist": "Malmen",
"Title": "Edison Glam",
"CompositeRating": "5.0",
"Voters": "3",
"TrackID": "14849"
},
{
"Artist": "Alexander Brandon",
"Title": "Menu song (Jazz Jackrabbit Intro)",
"CompositeRating": "5.0",
"Voters": "3",
"TrackID": "14114"
},
{
"Artist": "Riku Nuottajarvi",
"Title": "Hyperspace (From star control)",
"CompositeRating": "5.0",
"Voters": "3",
"TrackID": "11087"
},
{
"Artist": "Malmen of Brainstorm",
"Title": "Devotion shuttle",
"CompositeRating": "5.0",
"Voters": "3",
"TrackID": "13373"
},
{
"Artist": "MyVoice",
"Title": "Alertia",
"CompositeRating": "5.0",
"Voters": "3",
"TrackID": "14915"
},
{
"Artist": "Danko and Jogeir Liljedahl",
"Title": "1992",
"CompositeRating": "5.0",
"Voters": "3",
"TrackID": "12380"
},
{
"Artist": "Blue orian",
"Title": "Spiral galaxy",
"CompositeRating": "5.0",
"Voters": "3",
"TrackID": "14160"
},
{
"Artist": "Sudokan",
"Title": "Thoughts Per Second",
"CompositeRating": "5.0",
"Voters": "3",
"TrackID": "13150"
},
{
"Artist": "Selecta Novel",
"Title": "Simon the Sorcerer - Dragon's Winter Cave",
"CompositeRating": "5.0",
"Voters": "3",
"TrackID": "14421"
},
{
"Artist": "Nicsure",
"Title": "Occ-san-geen",
"CompositeRating": "5.0",
"Voters": "3",
"TrackID": "14422"
},
{
"Artist": "Arpegiator of Chryseis",
"Title": "My wolf 2",
"CompositeRating": "5.0",
"Voters": "3",
"TrackID": "10663"
},
{
"Artist": "Dr. Awesome",
"Title": "Session",
"CompositeRating": "5.0",
"Voters": "3",
"TrackID": "10927"
}
],
"BottomTracks": [
{
"Artist": "Sysfins",
"Title": "The aooga mooca song",
"CompositeRating": "1.0",
"Voters": "3",
"TrackID": "15657"
},
{
"Artist": "Uctumi",
"Title": "Flimbo's quest medley",
"CompositeRating": "1.0",
"Voters": "2",
"TrackID": "14045"
},
{
"Artist": "Audiomonster",
"Title": "Florence",
"CompositeRating": "1.0",
"Voters": "1",
"TrackID": "11963"
},
{
"Artist": "RawArgon",
"Title": "They drew 1st Blood Orangeade",
"CompositeRating": "1.0",
"Voters": "1",
"TrackID": "14518"
},
{
"Artist": "Jam & Spoon productions",
"Title": "Dansa uppa dekki",
"CompositeRating": "1.0",
"Voters": "1",
"TrackID": "12486"
},
{
"Artist": "Bst",
"Title": "Mayan Paradise*Dim System",
"CompositeRating": "1.0",
"Voters": "1",
"TrackID": "14267"
},
{
"Artist": "mA2E / Desire",
"Title": "Overjoyed by groove",
"CompositeRating": "1.0",
"Voters": "1",
"TrackID": "11977"
},
{
"Artist": "Beldoroon",
"Title": "Come allye (remix)",
"CompositeRating": "1.0",
"Voters": "1",
"TrackID": "13778"
},
{
"Artist": "Phaser",
"Title": "The return of music",
"CompositeRating": "1.0",
"Voters": "1",
"TrackID": "10996"
},
{
"Artist": "Speechless",
"Title": "Mistake",
"CompositeRating": "1.0",
"Voters": "1",
"TrackID": "13284"
},
{
"Artist": "Dr. Awesome",
"Title": "Empty Spaces",
"CompositeRating": "1.0",
"Voters": "1",
"TrackID": "10762"
},
{
"Artist": "Psirius",
"Title": "Musical cloister",
"CompositeRating": "1.0",
"Voters": "1",
"TrackID": "14102"
},
{
"Artist": "The Muzycant",
"Title": "Guitar Slinger V2",
"CompositeRating": "1.0",
"Voters": "1",
"TrackID": "14385"
},
{
"Artist": "Liam the Lemming",
"Title": "Auf wiedersehen Monty theme",
"CompositeRating": "1.0",
"Voters": "1",
"TrackID": "14156"
},
{
"Artist": "Crk",
"Title": "Beatex",
"CompositeRating": "1.0",
"Voters": "1",
"TrackID": "10624"
},
{
"Artist": "Mark M. Salud",
"Title": "1-2-3-DanceMon",
"CompositeRating": "1.0",
"Voters": "1",
"TrackID": "14953"
},
{
"Artist": "Necros of FM",
"Title": "The grey note",
"CompositeRating": "1.0",
"Voters": "1",
"TrackID": "13936"
},
{
"Artist": "Ceekayed",
"Title": "Battle beyond the dark",
"CompositeRating": "1.0",
"Voters": "1",
"TrackID": "13946"
},
{
"Artist": "K. Jose",
"Title": "It's Time",
"CompositeRating": "1.0",
"Voters": "1",
"TrackID": "13957"
},
{
"Artist": "Madminder",
"Title": "Shadow Angel",
"CompositeRating": "1.0",
"Voters": "1",
"TrackID": "14478"
}
],
"TopArtists": [
{
"Artist": "Xyce",
"CompositeRating": "5.0",
"Voters": "19"
},
{
"Artist": "Slash_Atd",
"CompositeRating": "5.0",
"Voters": "10"
},
{
"Artist": "Arachno",
"CompositeRating": "5.0",
"Voters": "6"
},
{
"Artist": "ArchAngel",
"CompositeRating": "5.0",
"Voters": "5"
},
{
"Artist": "Maktone",
"CompositeRating": "5.0",
"Voters": "5"
},
{
"Artist": "Vogue",
"CompositeRating": "5.0",
"Voters": "5"
},
{
"Artist": "Nusrat",
"CompositeRating": "5.0",
"Voters": "4"
},
{
"Artist": "Warder",
"CompositeRating": "5.0",
"Voters": "4"
},
{
"Artist": "cs127",
"CompositeRating": "5.0",
"Voters": "4"
},
{
"Artist": "AceMan",
"CompositeRating": "5.0",
"Voters": "4"
},
{
"Artist": "Mister%20E",
"CompositeRating": "5.0",
"Voters": "4"
},
{
"Artist": "Laamaa",
"CompositeRating": "5.0",
"Voters": "4"
},
{
"Artist": "Riku%20Nuottajarvi",
"CompositeRating": "5.0",
"Voters": "3"
},
{
"Artist": "Danko",
"CompositeRating": "5.0",
"Voters": "3"
},
{
"Artist": "Saga%20Musix",
"CompositeRating": "5.0",
"Voters": "3"
},
{
"Artist": "Arpegiator",
"CompositeRating": "5.0",
"Voters": "3"
},
{
"Artist": "Bacter%20vs%20Saga%20musix",
"CompositeRating": "5.0",
"Voters": "3"
},
{
"Artist": "Phobium",
"CompositeRating": "5.0",
"Voters": "3"
},
{
"Artist": "Blackstar%20(Oddgeir%20Hvidsten)",
"CompositeRating": "5.0",
"Voters": "3"
},
{
"Artist": "Dippy",
"CompositeRating": "5.0",
"Voters": "3"
}
],
"BottomArtists": [
{
"Artist": "Sysfins",
"CompositeRating": "1.0",
"Voters": "3"
},
{
"Artist": "Crk",
"CompositeRating": "1.0",
"Voters": "1"
},
{
"Artist": "Madminder",
"CompositeRating": "1.0",
"Voters": "1"
},
{
"Artist": "Sam",
"CompositeRating": "1.0",
"Voters": "1"
},
{
"Artist": "RawArgon",
"CompositeRating": "1.0",
"Voters": "1"
},
{
"Artist": "Beldoroon",
"CompositeRating": "1.0",
"Voters": "1"
},
{
"Artist": "Ceekayed",
"CompositeRating": "1.0",
"Voters": "1"
},
{
"Artist": "Jam%20&%20Spoon%20productions",
"CompositeRating": "1.0",
"Voters": "1"
},
{
"Artist": "Speechless",
"CompositeRating": "1.0",
"Voters": "1"
},
{
"Artist": "mA2E%20/%20Desire",
"CompositeRating": "1.0",
"Voters": "1"
},
{
"Artist": "Mark%20M.%20Salud",
"CompositeRating": "1.0",
"Voters": "1"
},
{
"Artist": "NaBo",
"CompositeRating": "1.0",
"Voters": "1"
},
{
"Artist": "UsE",
"CompositeRating": "1.0",
"Voters": "1"
},
{
"Artist": "The%20Muzycant",
"CompositeRating": "1.0",
"Voters": "1"
},
{
"Artist": "Efenstor",
"CompositeRating": "2.0",
"Voters": "2"
},
{
"Artist": "Audiomonster",
"CompositeRating": "2.0",
"Voters": "2"
},
{
"Artist": "View",
"CompositeRating": "2.0",
"Voters": "1"
},
{
"Artist": "Tomi%20Blinnikka",
"CompositeRating": "2.0",
"Voters": "1"
},
{
"Artist": "Galaxy",
"CompositeRating": "2.0",
"Voters": "1"
},
{
"Artist": "Higher%20(than)",
"CompositeRating": "2.0",
"Voters": "1"
}
],
"StreamingCountries": [
{
"Country": "Germany",
"Count": "930"
},
{
"Country": "Canada",
"Count": "590"
},
{
"Country": "United States",
"Count": "442"
},
{
"Country": "Croatia",
"Count": "332"
},
{
"Country": "Russia",
"Count": "314"
}
],
"StreamingAgents": [
{
"Agent": "FreeAmp/2.x",
"Count": "559"
},
{
"Agent": "BASS/2.4",
"Count": "401"
},
{
"Agent": "Screamer Radio v0.4.4 beta (20100924)",
"Count": "327"
}
],
"LogoffPlay": [
{
"Track": "Berluskani-Flimbo in tyrol (Arok-remix).",
"NumberOfPlays": "8",
"StationID": "1"
},
{
"Track": "Yannis Brown-Banjo Jamming.",
"NumberOfPlays": "7",
"StationID": "1"
},
{
"Track": "Trackerartist-Ec#24.",
"NumberOfPlays": "7",
"StationID": "1"
}
],
"Duplicates": [
{
"FullArtist": "4-mat",
"Title": "Eternity",
"TrackID": "13491"
},
{
"FullArtist": "4-mat",
"Title": "Eternity",
"TrackID": "15212"
},
{
"FullArtist": "Arpegiator of Chryseis",
"Title": "My wolf 2",
"TrackID": "10663"
},
{
"FullArtist": "Arpegiator of Chryseis",
"Title": "My wolf 2",
"TrackID": "11987"
},
{
"FullArtist": "C512w",
"Title": "Going to the moon",
"TrackID": "15273"
}
]
},
{
"StationID": "2",
"StationName": "Best of ERICADE.radio",
"TotalLength": "199.2",
"TracksOnStation": "178",
"Trackerstats": [
{
"TrackerType": "Podcast episode",
"Tracks": "169",
"Percent": "94.9",
"StationID": "2"
},
{
"TrackerType": "Live broadcast rerun",
"Tracks": "8",
"Percent": "4.5",
"StationID": "2"
},
{
"TrackerType": "Amiga 4-channel module",
"Tracks": "1",
"Percent": "0.6",
"StationID": "2"
}
],
"Requests": [],
"TopTracks": [
{
"Artist": "Flashback",
"Title": "144. A tracked christmas",
"CompositeRating": "5.0",
"Voters": "4",
"TrackID": "15436"
},
{
"Artist": "Flashback",
"Title": "134. Xmas special",
"CompositeRating": "5.0",
"Voters": "3",
"TrackID": "15011"
},
{
"Artist": "Flashback",
"Title": "92. As featured on the radio",
"CompositeRating": "5.0",
"Voters": "3",
"TrackID": "12222"
},
{
"Artist": "Flashback",
"Title": "133. Xmas 2024",
"CompositeRating": "5.0",
"Voters": "2",
"TrackID": "15009"
},
{
"Artist": "Amiga Flashback",
"Title": "16. Doing miscellaneous stuff",
"CompositeRating": "5.0",
"Voters": "2",
"TrackID": "9675"
},
{
"Artist": "Flashback",
"Title": "53. The creation of a station",
"CompositeRating": "5.0",
"Voters": "2",
"TrackID": "9682"
},
{
"Artist": "Flashback",
"Title": "70. Cautious optimism",
"CompositeRating": "5.0",
"Voters": "2",
"TrackID": "9933"
},
{
"Artist": "The ERICADE Radio Network",
"Title": "The \"One year anniversary broadcast 2021\" - third hour",
"CompositeRating": "5.0",
"Voters": "2",
"TrackID": "9696"
},
{
"Artist": "Flashback",
"Title": "72. 8!ghtBM on every chart",
"CompositeRating": "5.0",
"Voters": "2",
"TrackID": "9981"
},
{
"Artist": "Amiga Flashback",
"Title": "11. Two shades of new year. Hour 2/3.",
"CompositeRating": "5.0",
"Voters": "2",
"TrackID": "9733"
},
{
"Artist": "Flashback",
"Title": "143. Another mix tape",
"CompositeRating": "5.0",
"Voters": "2",
"TrackID": "15414"
},
{
"Artist": "ericade.radio",
"Title": "Its news time",
"CompositeRating": "5.0",
"Voters": "2",
"TrackID": "9589"
},
{
"Artist": "Flashback",
"Title": "115. The Spirit of Retro and Xmas Part 1",
"CompositeRating": "5.0",
"Voters": "2",
"TrackID": "14426"
},
{
"Artist": "Flashback",
"Title": "69. A new year - 2022, second hour",
"CompositeRating": "5.0",
"Voters": "2",
"TrackID": "9913"
},
{
"Artist": "Edison Party 2021",
"Title": "The Edison 2021 Live Broadcast hour 3",
"CompositeRating": "5.0",
"Voters": "2",
"TrackID": "9665"
},
{
"Artist": "Flashback",
"Title": "91. Forndata Summer 2022",
"CompositeRating": "5.0",
"Voters": "1",
"TrackID": "12205"
},
{
"Artist": "Amiga Flashback",
"Title": "21. Look at you, hacker!",
"CompositeRating": "5.0",
"Voters": "1",
"TrackID": "9672"
},
{
"Artist": "Amiga Flashback",
"Title": "15. Return of the Tekmann",
"CompositeRating": "5.0",
"Voters": "1",
"TrackID": "9680"
},
{
"Artist": "Edison Party 2021",
"Title": "The Edison 2021 Live Broadcast hour 5",
"CompositeRating": "5.0",
"Voters": "1",
"TrackID": "9681"
},
{
"Artist": "Flashback",
"Title": "44. The fly-over part of summer",
"CompositeRating": "5.0",
"Voters": "1",
"TrackID": "9686"
}
],
"BottomTracks": [
{
"Artist": "Flashback",
"Title": "147. A brand new tracked 2026",
"CompositeRating": "1.0",
"Voters": "1",
"TrackID": "15490"
},
{
"Artist": "Flashback",
"Title": "108. Chillaxing while waiting",
"CompositeRating": "1.0",
"Voters": "1",
"TrackID": "12961"
},
{
"Artist": "Flashback",
"Title": "135. Springtime",
"CompositeRating": "2.0",
"Voters": "2",
"TrackID": "15165"
},
{
"Artist": "Flashback",
"Title": "40. It feels good to be bad",
"CompositeRating": "2.0",
"Voters": "1",
"TrackID": "9606"
},
{
"Artist": "Flashback",
"Title": "60. Among saints and sinners",
"CompositeRating": "2.5",
"Voters": "4",
"TrackID": "9689"
},
{
"Artist": "Flashback",
"Title": "54. Failure is the interesting option",
"CompositeRating": "2.5",
"Voters": "2",
"TrackID": "9634"
},
{
"Artist": "Flashback",
"Title": "89. In loving memory of Vangelis",
"CompositeRating": "3.0",
"Voters": "2",
"TrackID": "12168"
},
{
"Artist": "Amiga Flashback",
"Title": "20. All you need is love",
"CompositeRating": "3.0",
"Voters": "1",
"TrackID": "9615"
},
{
"Artist": "Flashback",
"Title": "69. A new year - 2022, first hour",
"CompositeRating": "3.0",
"Voters": "1",
"TrackID": "9910"
},
{
"Artist": "Amiga Flashback",
"Title": "33. Tracks from the past",
"CompositeRating": "4.0",
"Voters": "3",
"TrackID": "9600"
},
{
"Artist": "Amiga Flashback",
"Title": "22. Another lazy sunday evening",
"CompositeRating": "4.0",
"Voters": "2",
"TrackID": "9637"
},
{
"Artist": "Amiga Flashback",
"Title": "4. Demos and groups",
"CompositeRating": "4.0",
"Voters": "2",
"TrackID": "9641"
},
{
"Artist": "Flashback",
"Title": "69. A new year - 2022, third hour",
"CompositeRating": "4.0",
"Voters": "2",
"TrackID": "9911"
},
{
"Artist": "Amiga Flashback",
"Title": "27. A pox on all your Amigas",
"CompositeRating": "4.0",
"Voters": "1",
"TrackID": "9669"
},
{
"Artist": "Amiga Flashback",
"Title": "18. From the desk of miscellaneousity",
"CompositeRating": "4.0",
"Voters": "1",
"TrackID": "9676"
},
{
"Artist": "Flashback",
"Title": "46. Do you grok the lingo?",
"CompositeRating": "4.0",
"Voters": "1",
"TrackID": "9687"
},
{
"Artist": "Flashback",
"Title": "130. June",
"CompositeRating": "4.0",
"Voters": "1",
"TrackID": "14830"
},
{
"Artist": "ericade.radio",
"Title": "This is the best of Ericade.radio, here is the latest from Feature Story News",
"CompositeRating": "4.0",
"Voters": "1",
"TrackID": "9804"
},
{
"Artist": "ericade.radio",
"Title": "You are listening to the best of Ericade.radio, here is the news",
"CompositeRating": "4.0",
"Voters": "1",
"TrackID": "9806"
},
{
"Artist": "Amiga Flashback",
"Title": "17. Standing on the brink in the eve of destruction",
"CompositeRating": "4.0",
"Voters": "1",
"TrackID": "9594"
}
],
"TopArtists": [
{
"Artist": "The%20ERICADE%20Radio%20Network",
"CompositeRating": "5.0",
"Voters": "2"
},
{
"Artist": "Edison%20Party%202021",
"CompositeRating": "4.8",
"Voters": "6"
},
{
"Artist": "Flashback",
"CompositeRating": "4.6",
"Voters": "63"
},
{
"Artist": "ericade.radio",
"CompositeRating": "4.5",
"Voters": "4"
},
{
"Artist": "Amiga%20Flashback",
"CompositeRating": "4.4",
"Voters": "26"
}
],
"BottomArtists": [
{
"Artist": "Amiga%20Flashback",
"CompositeRating": "4.4",
"Voters": "26"
},
{
"Artist": "ericade.radio",
"CompositeRating": "4.5",
"Voters": "4"
},
{
"Artist": "Flashback",
"CompositeRating": "4.6",
"Voters": "63"
},
{
"Artist": "Edison%20Party%202021",
"CompositeRating": "4.8",
"Voters": "6"
},
{
"Artist": "The%20ERICADE%20Radio%20Network",
"CompositeRating": "5.0",
"Voters": "2"
}
],
"StreamingCountries": [
{
"Country": "Germany",
"Count": "930"
},
{
"Country": "Canada",
"Count": "590"
}
],
"StreamingAgents": [
{
"Agent": "FreeAmp/2.x",
"Count": "559"
},
{
"Agent": "BASS/2.4",
"Count": "401"
},
{
"Agent": "Screamer Radio v0.4.4 beta (20100924)",
"Count": "327"
}
],
"LogoffPlay": [
{
"Track": "Flashback-113. Just listening to the radio.",
"NumberOfPlays": "14",
"StationID": "2"
},
{
"Track": "Amiga Flashback-21. Look at you, hacker!.",
"NumberOfPlays": "11",
"StationID": "2"
}
],
"Duplicates": [
{
"FullArtist": "4-mat",
"Title": "Eternity",
"TrackID": "13491"
},
{
"FullArtist": "4-mat",
"Title": "Eternity",
"TrackID": "15212"
},
{
"FullArtist": "Arpegiator of Chryseis",
"Title": "My wolf 2",
"TrackID": "10663"
}
]
}
]
}
Statistics by FilterType
Returns a single category of statistics instead of the whole bundle. The response schema is identical to the Statistics endpoint, with only the requested section populated.
Replace <filtertype> in the URL with one of the values below.
Filter types
| Value | Populates |
|---|---|
most-requested | Requests |
stars | TopTracks, BottomTracks, TopArtists, BottomArtists |
tracktypes | Trackerstats |
countries | StreamingCountries |
agents | StreamingAgents |
logoffplay | LogoffPlay |
duplicates | Duplicates |
listeners | Accepted by the router, but no section is currently keyed to it — the response comes back with the station header only. |
latest-tracks type is planned but is not currently accepted — earlier revisions of this document listed it as a valid value.Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
Token | Yes | JWT token that authenticates the call. | Get from the get-token endpoint. |
StationID | Yes | (Not implemented) Accepted, but the response always covers every station. | 1 = ericade.radio 2 = Best of ericade.radio |
Limit | No | Number of rows in each top/bottom list. Defaults to 10; must be 1–100. | 10 |
Days | No | How far back the rating and request windows reach, in days. Defaults to 30. | 7 |
Limit and Days. If you need to tune either, use this path with the filter type you want.Example request
{
"Token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"StationID": 1,
"Limit": 20,
"Days": 7
}
Requests
Returns the current request queue status and recent request history. Useful for displaying a live request line on a website.
Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
Token | Yes | JWT token that authenticates the call. | Get from the get-token endpoint. |
StationID | Yes | The station to get request data from. | 1 = ericade.radio 2 = Best of ericade.radio |
Limit | No | (Not implemented) Limit the number of requests returned. |
Example request
{
"Token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"StationID": 1,
"Limit": 10
}
Response
| Attribute | Description | Example |
|---|---|---|
RequestStatistics | Array containing one object with queue wait-time statistics. | Array[] |
RequestStatistics => TracksInQueue | Number of tracks currently waiting in the request queue. | 3 |
RequestStatistics => YourQueueNumber | Position a new request would occupy in the queue. | 4 |
RequestStatistics => ExpectedWaitingTimeInMinutes | Estimated wait in minutes until a new request would be played. | 48 |
RequestStatistics => ExpectedWaitingTime | Estimated wait expressed as a human-readable string, suitable for display on a website. | 48 minutes |
CurrentRequests | Array of the five most recent requests (both waiting and already played). | Array[] |
CurrentRequests => Song | Requested track expressed as “<artist> – <title>”. | Tommy Fjelldal - Edificated dreams |
CurrentRequests => Requested | Time the request was submitted, as a Unix epoch string. | 1774902144 |
CurrentRequests => TrackID | Unique track identifier string. | 15715 |
CurrentRequests => Source | Origin of the request. | Internet or Discord |
CurrentRequests => State | Whether the request is still waiting or has already been played. | Waiting or Played |
Example response
{
"RequestStatistics": [
{
"TracksInQueue": "3",
"YourQueueNumber": "4",
"ExpectedWaitingTimeInMinutes": "48",
"ExpectedWaitingTime": "48 minutes"
}
],
"CurrentRequests": [
{
"Song": "Tommy Fjelldal - Edificated dreams",
"Requested": "1774902144",
"TrackID": "15715",
"Source": "Internet",
"State": "Waiting"
},
{
"Song": "Arpegiator of Chryseis - My wolf 2",
"Requested": "1774902734",
"TrackID": "10663",
"Source": "Internet",
"State": "Waiting"
},
{
"Song": "Dr Future - Plastic pop (Plastic kills life mix)",
"Requested": "1774903007",
"TrackID": "14922",
"Source": "Internet",
"State": "Waiting"
},
{
"Song": "X-Ceed of Sco - Let's go for a ride",
"Requested": "1774902096",
"TrackID": "15711",
"Source": "Internet",
"State": "Played"
},
{
"Song": "Alexander Brandon - Frolick lane",
"Requested": "1774902091",
"TrackID": "15714",
"Source": "Internet",
"State": "Played"
}
]
}
Add Request
Submits a listener request to the station’s request queue.
Password instead of Token as the field name for the JWT value (legacy naming), and its response uses the capitalised Success / Message envelope rather than the lower-case one used elsewhere.Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
Password | Yes | JWT token that authenticates the call. | Get from the get-token endpoint. Note: field is named Password, not Token. |
StationID | Yes | The station to submit the request to. The station must have requests enabled. | 1 = ericade.radio 2 = Best of ericade.radio |
TrackID | Yes | Unique identifier of the track to request. Obtain from the Search or Now Playing endpoints. | 10663 |
Source | Yes | Origin of the request. Can control which jingle plays before the track. Max 20 characters. | Internet or Discord |
Requester | No | The self-selected display name of the requester. Max 120 characters. | Caller #9 |
Greeting | No | (Deprecated) A user-selectable greeting to the show host. Max 250 characters. | Hi! Love your music! |
Workflow
- Use Search to find the track and obtain its
TrackID. - Check that
TrackCanBeRequestedis 1; if not, showRequestVerdictto the user. - Post to this endpoint with the
TrackID.
Limits
The request is rejected, with an explanatory Message, when any of the following applies:
- The station does not allow requests.
- The queue has already reached the station’s maximum pending requests.
- The caller has submitted 5 or more requests in the last 5 hours.
- The track or its artist was played too recently — the reason is echoed from the eligibility check.
Example request
{
"Password": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"StationID": 1,
"Requester": "Listener",
"Source": "Internet",
"TrackID": 10663
}
Response
| Attribute | Description | Example |
|---|---|---|
Success | Indicates whether the request was accepted. Either Success or Failure. | Success |
Message | Human-facing message suitable for display to the end user, including the expected waiting time on success and the reason on failure. | Success! The tune you requested has been added to the playlist. Expected waiting time until play: 48 minutes. |
Example response
{
"Success": "Success",
"Message": "Success! The tune you requested has been added to the playlist. Expected waiting time until play: 48 minutes."
}
https://api.ericade.net/radio/addrequest/ still works and takes the same fields, but returns the lower-case message / subcode / submessage envelope instead. New integrations should use the v2 route above. Do not call it as /radio/addrequest/index.php — paths ending in .php under /radio/ are 301-redirected to an extension-less path that does not resolve.song-request event fires on the Station Data WebSocket the moment the request is accepted. The greeting and the requester’s IP are never broadcast.Star Rating
Records a listener’s 1–5 star rating for a track, then recalculates both the track’s and the artist’s composite ratings.
success is a real JSON boolean and the message key is lower-case message.Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
Token | Yes | JWT token that authenticates the call. The browser hash inside the token identifies the voter. | Get from the get-token endpoint. |
TrackID | Yes | Unique identifier of the track being rated. | 10663 |
TrackRating | Yes | The rating, 1–5. Single digit; anything outside the range is rejected. | 4 |
StationID | No | Accepted, but ignored — the station is resolved from the track itself. |
Limits
- Maximum 5 ratings per minute per voter.
- The same voter may not rate the same track again within 3 days.
- Check
TrackCanBeStarredon the track record before offering the control.
Example request
{
"Token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"TrackID": 10663,
"TrackRating": 4
}
Response
| Attribute | Description | Example |
|---|---|---|
success | Boolean. true when the rating was recorded. | true |
message | Human-facing message suitable for display to the end user. | Stars updated. |
Typical failure messages are You may only star 5 items per minute., You may not vote for this track again at this time and TrackRating must be between 1 - 5.
Example response
{
"success": true,
"message": "Stars updated."
}
song-rating event fires on the Station Data WebSocket once the rating is recorded. The voter’s IP and browser hash are never broadcast.Station Override
Switches a station between normal broadcast and a manual override. With the override on, every now-playing response for the station returns the supplied artist and title instead of the track actually playing — used to announce a live show or display a special message.
Password for the JWT and the capitalised Success / Message envelope.Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
Password | Yes | JWT token that authenticates the call. | Note the field name — not Token. |
StationID | Yes | The station to control. A settings row must already exist for it. | 1 = ericade.radio 2 = Best of ericade.radio |
Override | Yes | 1 = show the supplied artist/title instead of the playing track. 0 = return to normal broadcast. Any other value is rejected. | 0 or 1 |
Artist | No | Artist text to display while the override is active. Max 250 characters. | ericade.radio |
Title | No | Title text to display while the override is active. Max 250 characters. | Live from Revision 2026 |
isOverride: 1 and Next Up returns the synthetic “Back to normal broadcast” entry. The isLive and isRemote flags on the track record are read from the settings row and are not settable through this endpoint.Example request
{
"Password": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"StationID": 1,
"Override": 1,
"Artist": "ericade.radio",
"Title": "Live from Revision 2026"
}
Response
| Attribute | Description | Example |
|---|---|---|
Success | Either Success or Failure. | Success |
Message | Human-facing message. Override updated. on success. | Override updated. |
Example response
{
"Success": "Success",
"Message": "Override updated."
}
now-playing and override events fire on the Station Data WebSocket. Repeat calls that do not change the state fire nothing.Ingest
Set Next Up
Replaces the station’s upcoming queue with the supplied track. Called by the playout automation when it schedules the next item: it clears every existing queue row for the station, resolves the track from its GUID and inserts the replacement. Read the queue with Next Up instead.
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
Password | Yes | Pre-shared ingest secret. This is not a JWT. | |
StationID | Yes | The station whose queue is being replaced. | 1 = ericade.radio 2 = Best of ericade.radio |
Guid | Yes | PlayIT Live GUID of the track. Used to resolve the TrackID, artwork, rating and added-date from the library. Max 120 characters. | 6894ac27-abc9-4c4a-aad2-15879dda4dff |
Artist | No | Artist name. Max 255 characters. Replaced by the library value when the track is a listener request. | MA2E |
Title | No | Track title. Max 255 characters. | Thrilled 4 noise |
At least one of Artist, Title, Guid or StationID must be supplied. The response is the standard message / subcode / submessage envelope; on success submessage is Track added to next up.
next-up event fires on the Station Data WebSocket once the queue is updated.Other ingest endpoints
The remaining playout-chain endpoints have not been ported to v2 and still live under /radio/. See the v1 documentation for updatetrack, updatestreamevent, getnextrequest, updateplayedrequest, checkifexists, getnowplaying and getlistening.