Conventions
Unless stated otherwise, every v1 endpoint follows the same pattern:
- Method:
POSTwith a JSON body. The only exception is getnowplaying, which reads query-string parameters. - Content type: the response is served as
application/json; charset:UTF-8. - CORS:
Access-Control-Allow-Origin: *is set on all endpoints. - Trailing slash: endpoints are directories, so call them as
/radio/<name>/. Requests ending in.phpare 301-redirected to the extension-less form.
Response envelope
Endpoints that return data echo their JSON payload directly (for example {"Tracks": [...]}). Endpoints that only perform an action, and every endpoint that fails, return the three-field envelope below.
| Attribute | Description | Example |
|---|---|---|
message | Either Success or Failure. | Failure |
subcode | Machine-facing description of what the API did internally. | FALSE |
submessage | Human-facing message suitable for display to the end user. | You need to specify a StationID. |
{
"message": "Failure",
"subcode": "FALSE",
"submessage": "You need to specify a StationID."
}
Status codes
| Code | Meaning |
|---|---|
200 | Success. The body is the endpoint’s payload or the Success envelope. |
204 | Nothing has changed since the Sequence value you sent. Returned by gettrack, songs and listnews. Keep displaying the previously received data. |
400 | Validation failure, missing/incorrect credentials, or a caller outside the allowed IP range. Note that gettrack, songs and checkifexists return their failure envelope with HTTP 200 — always check the message field, not just the status code. |
429 | Rate limited. A Retry-After header gives the number of seconds to wait. |
500 | Fatal server-side error. gettrack and getlistening trap these and still return a valid JSON failure envelope. |
Rate limiting
Every v1 endpoint runs the shared API throttle before doing any work. Callers that exceed the configured request count within the configured window are banned for a period and receive:
{
"message": "Failure",
"subcode": "Too Many Requests",
"submessage": "You have been throttled due to too many requests. Please try again in 600 seconds."
}
Station IDs
| StationID | Station |
|---|---|
1 | ericade.radio — 24/7 tracked music |
2 | Best of ericade.radio |
Authentication
v1 uses two different credential types, depending on whether the endpoint is listener-facing or part of the station ingest chain.
1. JWT token (public endpoints)
Obtain a token by making a GET request to the token endpoint:
The response is a raw JWT string. v1 is inconsistent about which body field carries it — the table below lists the field name each endpoint expects.
2. Shared secret (ingest endpoints)
The station playout software and the stream server authenticate with a pre-shared secret sent in the Password field. These endpoints are additionally restricted to the internal IP ranges configured on the server and are not available to third-party callers.
Credential field per endpoint
| Endpoint | Credential | Field name(s) | IP restricted |
|---|---|---|---|
| /radio/gettrack/ | JWT | jwt or Password | No |
| /radio/songs/<trackid>/ | JWT | Token or Password | No |
| /radio/listtracks/ | JWT | jwt | No |
| /radio/listnews/ | JWT | jwt | No |
| /radio/addnews/ | JWT | jwt | No |
| /radio/getplayout/ | JWT | Password or jwt | No |
| /radio/getstationstats/ | JWT | Password or jwt | No |
| /radio/getrequeststats/ | JWT | Password | No |
| /radio/addrequest/ | JWT | Password | No |
| /radio/updatestar/ | JWT | Password | No |
| /radio/getlistening/ | JWT | Password | Yes |
| /radio/getnowplaying/ | Shared secret | Password (query string) | Yes |
| /radio/getnextrequest/ | Shared secret | Password | Yes |
| /radio/updateplayedrequest/ | Shared secret | Password | Yes |
| /radio/checkifexists/ | Shared secret | Password | Yes |
| /radio/updatetrack/ | Shared secret | Password | Yes |
| /radio/updatestreamevent/ | Shared secret | Password | Yes |
Get Track
The workhorse of v1. Depending on which fields you send it returns the currently playing track, one specific track, or a set of search results. This single endpoint is what v2 split into nowplaying, songs and search.
Modes
The mode is selected by the combination of fields you send, evaluated in this order:
| Mode | Triggered by | Returns |
|---|---|---|
| Now playing | NowPlaying=1 | The track currently on air on the station, with buffer compensation applied. |
| Tag search | Search starting with Tags: or tag: | All tracks whose tag list matches the remainder of the string. |
| Last played | No Search, no TrackID, SimpleSearch=0 | The most recently played track on the station. |
| Track by ID | TrackID set | Exactly one track. |
| Search | Search set (or SimpleSearch=1) | Tracks whose title or artist matches, ordered by artist. |
Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
jwt | Yes | JWT token that authenticates the call. | Get from the get-token endpoint. Password is accepted as an alias. |
StationID | Yes | The station to read from. Defaults to 1 if omitted or invalid. | 1 = ericade.radio 2 = Best of ericade.radio |
NowPlaying | No | 0 = Off (default), 1 = On. Returns the currently playing track and applies buffer compensation automatically. | |
TrackID | No | Return one specific track. Numeric, up to 5 digits. | 15717 |
Search | No | Free-text search term, matched against title and artist. Prefix with Tags: to search the tag list instead. | my wolf Tags: Revision 2026 |
SimpleSearch | No | 0 = full record (default), 1 = lightweight search that skips the podcast, description and rating columns. Saves bandwidth for autocomplete-style lookups. | |
MaxResults | No | Maximum number of search results. 1–2 digits; defaults to 100 when omitted. | 20 |
EligibilityFilter | No | 0 = return all matches (default), 1 = drop tracks that cannot be requested right now. | |
Sequence | No | Bandwidth-saving mechanism. Send 0 (or omit) to always receive a full response, or send the TimeStamp value from the previous response. If the current track’s start time matches the value you sent, the API returns HTTP 204; if it differs, a full response is returned. | 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. |
ReturnNextUp | No | 0 = do not return NextUp (default), 1 = return the NextUp array (up to 3 entries). | |
ReturnArtistDescription | No | 0 = omit artist description and rating fields (default), 1 = include them. | Setting this to 0 also forces ReturnArtistLongDescription, ReturnProductionNotes and ReturnPlayList to 0. |
ReturnArtistLongDescription | No | 0 = off (default), 1 = include the full artist biography. | Requires ReturnArtistDescription=1. |
ReturnProductionNotes | No | [Podcast] 0 = off (default), 1 = include ProductionNotes. | Requires ReturnArtistDescription=1. |
ReturnPlayList | No | [Podcast] 0 = off (default), 1 = include PlayList. Also needed for NowPlayingOnPlaylist to be populated. | Requires ReturnArtistDescription=1. |
LastPlaysToReturn | No | Number of Playlog entries to return. Defaults to 3, hard-capped at 15. | 3 |
ReturnShowNotes | No | (No effect) Accepted and validated, but show notes are not part of the response schema. |
Example request
{
"jwt": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"StationID": 1,
"NowPlaying": 1,
"Sequence": 0,
"ReturnArtistDescription": 1,
"ReturnNextUp": 1
}
Sequence value matches the current track’s start time. The caller should display the previously received data unchanged.Response
Returns a {"Tracks": [...]} object. The array holds one entry in now-playing and track-by-ID mode, and up to MaxResults (max 50) entries in search mode.
| 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 |
StationID | Station number. | 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 |
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 as a raw comma-separated string. Use TagList. | “” |
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 MM:SS (HH:MM:SS for tracks over an hour). | 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. Only populated when ReturnProductionNotes=1. | |
PlayList | [Podcast] Chapter list for the podcast episode. Only populated when ReturnPlayList=1. | 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. | |
NowPlayingOnPlaylist | [Podcast] [Best of ericade.radio (StationID=2)] Returns the current chapter. Requires ReturnPlayList=1 in the call to work. | Love connection by Lavizh |
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. | |
isListenerRequested | 0 = regular rotation, 1 = listener-requested track. | 0 or 1 |
isOverride | If 0 (default), the returned data shows the currently playing track. This is the normal behaviour. If 1, it shows a preset text from the database, used for special messages or to tell the listener which live show they are hearing. | 0 or 1 |
isLive | Only meaningful when isOverride is 1. Indicates that you are listening to a live show. | 0 or 1 |
isRemote | Only meaningful when isOverride is 1. Indicates a live show broadcast from a remote location. | 0 or 1 |
isNew | 0 = not new, 1 = new track. | 0 or 1 |
NewDays | Number of days a track is considered new on this station. | 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 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 an array of {"type", "url"} objects, with types mp3, flac and original. Convenience wrapper for players that iterate over available formats. The original entry’s URL is currently always empty. | Array[] |
isBroadcastProhibited | Whether broadcasting this track is prohibited. | 0 or 1 |
isDownloadProhibited | Whether downloading this track is prohibited. If 1, the music URLs are empty. | 0 or 1 |
Playlog | Array of recent play timestamps for this track on this station. Length controlled by LastPlaysToReturn. | Array[] |
Playlog => timestamphr | Human-readable datetime the track was played. | 2026-03-30 16:00:06 |
NextUp | Array of the next tracks’ info (up to 3). The key is omitted entirely unless 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/images/demoscene.png |
NextUp => StationID | Station the next track belongs to. | 1 |
NextUp => TrackerType | Track type/format. | Amiga 4-channel module |
NextUp => TrackID | Unique track identifier. | 11971 |
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.",
"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": [],
"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.",
"ArtistShortDescription": "A true legend on the Amiga and other 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,
"Playlog": [
{ "timestamphr": "2026-05-16 13:57:48" },
{ "timestamphr": "2026-05-07 22:38:33" },
{ "timestamphr": "2026-04-28 16:05:51" }
],
"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"
}
]
}
]
}
Track by ID
Returns full metadata for one specific track, addressed through the URL rather than through a body field. The response schema is identical to Get Track.
Replace <trackid> with the numeric TrackID. The path segment is passed straight through to the TrackID field, so any value you put in the body is ignored.
Request
Accepts the same fields as Get Track, with two differences:
- The JWT is sent as
Token(orPassword) — notjwt. ReturnShowNotes,ReturnNextUp,NowPlayingandDisableBufferCompensationare not forwarded and have no effect.
Example request
{
"Token": "eyJ0eXAiOiJKV1Qi...",
"StationID": 1,
"ReturnArtistDescription": 1
}
/radio/songs/ with an empty path does not return a track — it falls through to the List Tracks behaviour instead, using the same body fields as that endpoint.List Tracks
Dumps the station’s track library with pagination and a total count. Intended for report and browse views rather than for players — the record is much lighter than the one Get Track returns.
Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
jwt | 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 |
Count | No | Number of tracks to return. Defaults to 10; values outside 0–9000 are rejected. | 50 |
Skip | No | Number of tracks to skip from the start (for pagination). Defaults to 0; 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 |
CGuid | No | (No effect) Accepted but unused. |
Example request
{
"jwt": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"StationID": 1,
"Skip": 0,
"Count": 25,
"Search": "virgill"
}
Response
Returns a Query array with the paging counters, followed by the Tracks array.
| Attribute | Description | Example |
|---|---|---|
Query => ResultCount | Number of tracks in this response. | 25 |
Query => TotalCount | Total number of tracks matching the query, ignoring Skip/Count. | 312 |
Tracks => ID | Unique track identifier (same value as TrackID elsewhere in the API). | 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. | 2022-11-01 16:19:08 |
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/custom.mod |
Tracks => Path | Internal playout path of the file. | |
Tracks => Guid | Internal GUID from PlayIT Live. Not intended for public use. | 6894ac27-abc9-4c4a-aad2-15879dda4dff |
Tracks => Tags | Comma-separated tag list. | Revision, Revision 2026 |
{ "Software":["No track information was found."]} with HTTP 200 — there is no Tracks key at all. Handle that shape explicitly.Example response
{
"Query": [
{
"ResultCount": "2",
"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": ""
}
]
}
News & Podcasts
Lists news posts and podcast episodes, with pagination, tag search and optional transcripts. This is the endpoint that backs the podcast display pages and the RSS feed builder.
Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
jwt | 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 |
Podcasts | No | 0 = do not filter on podcasts (default), 1 = only podcast entries, 2 = podcast entries including the track length columns. | |
News | No | 0 = off (default), 1 = include news entries. Combine with Podcasts to get both. | |
ID | No | Return only the entry linked to this TrackID. Also switches on the length columns. | 13770 |
Count | 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/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
{
"jwt": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"StationID": 2,
"Podcasts": 2,
"Count": 10,
"Skip": 0,
"IncludeTags": 1,
"ReturnTranscripts": 0
}
Response
Returns a Query array with the paging counters, followed by the Tracks array.
| Attribute | Description | Example |
|---|---|---|
Query => ResultCount | Number of entries in this response. | 10 |
Query => TotalCount | Total number of entries matching the query. | 97 |
TrackID | Unique 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. Empty for non-podcast entries. | 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. | 2 |
Tags | Comma-separated tag list. Empty unless IncludeTags=1 or a tag search was performed. | Revision, Revision 2026 |
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 for this entry, 0 otherwise. 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 non-podcast entries. | 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
}
]
}
Add News
Creates a news post or podcast episode and uploads its artwork. The submitted PNG is stored and then automatically rescaled into the twelve sizes the website and podcast feed use.
Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
jwt | Yes | JWT token that authenticates the call. | Get from the get-token endpoint. |
Title | Yes | Episode or post title. Max 255 characters. | Flashback episode 97 |
Artist | No | Show or author name. Max 255 characters. | ericade.radio |
IsPodcast | Yes* | Set to 1 for a podcast episode. | Exactly one of IsPodcast / IsNews must be 1. Setting both is rejected. |
IsNews | Yes* | Set to 1 for a news post. | See above. |
BroadcastDate | Yes | Broadcast/publication date. Max 15 characters. Required for both post types. | 2022-07-16 |
EpisodeNumber | Yes (podcast) | Episode number. Used to derive the audio file URL and its size on disk. | 97 |
News | No | Body text of the news post. Max 4096 characters. | |
Equipment | No | Equipment used to record the episode. Max 4096 characters. | |
PlayList | No | Chapter list for the episode. Max 4096 characters. | |
ProductionNotes | No | Production notes. Max 4096 characters. | |
Filename | Yes | Base name for the artwork, max 220 characters. Only one dot is permitted — more than one is rejected. | flashback-97.png |
FileData | Yes | Base64-encoded PNG image, max 16 MB decoded. | iVBORw0KGgoAAAANSUhEUg… |
Example request
{
"jwt": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"IsPodcast": 1,
"IsNews": 0,
"Artist": "ericade.radio",
"Title": "Flashback episode 97",
"EpisodeNumber": 97,
"BroadcastDate": "2022-07-16",
"Filename": "flashback-97.png",
"FileData": "iVBORw0KGgoAAAANSUhEUg..."
}
Response
The standard envelope. On success subcode is Done. and submessage is All done.
Playout History
Returns the most recently played tracks on a station, or — in last-added mode — the most recently imported tracks with their request eligibility. This is the v1 equivalent of Song History.
Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
Password | Yes | JWT token that authenticates the call. | Get from the get-token endpoint. jwt is accepted as an alias. |
StationID | Yes | The station to get history for. | 1 = ericade.radio 2 = Best of ericade.radio |
NumberOfTracks | No | Number of entries to return. Defaults to 10; more than 100 is rejected. | 20 |
LastAddedMode | No | 0 = recently played, newest first (default). 1 = recently added to the library, newest first, with the extra rating and eligibility fields. |
Example request
{
"Password": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"StationID": 1,
"NumberOfTracks": 10,
"LastAddedMode": 1
}
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, prefer last-added mode or use v2 Song History for play history.Response
Returns a {"Tracks": [...]} object.
| Attribute | Description | Example |
|---|---|---|
TimeStampHR | When the track played (or was added), human-readable. | 2026-03-30 20:44:32 |
TimeStamp | The same moment 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 Get Track. | 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.3 |
Votes | [LastAddedMode=1] Number of votes the track has received. | 2 |
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. | 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/custom.mod |
StationID | The station this track belongs to. | 1 |
Guid | Internal GUID from PlayIT Live. Not intended for public use. | 6894ac27-abc9-4c4a-aad2-15879dda4dff |
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"
}
]
}
Station Statistics
Returns the full statistics bundle for every station in one response: library breakdown, most-requested tracks, best and worst rated tracks and artists, listener geography, user agents, logoff tracks and duplicates.
Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
Password | Yes | JWT token that authenticates the call. | Get from the get-token endpoint. jwt is accepted as an alias. |
StationID | No | (Not implemented) Accepted, but the response always covers every station. |
Limit, Days or filter-type parameters. Every section is always returned, top/bottom lists are fixed at 10 entries and the rating and request windows are fixed at 30 days. Use v2 Statistics if you need to tune those.Example request
{
"Password": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."
}
Response
Returns a {"Stations": [...]} array. Each element represents one station.
| 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, ordered by play count. Each object contains TrackerType, Tracks, Percent and StationID. | Array[] |
Requests | Array of the 10 most-requested tracks in the last 30 days. Each object is a full track record plus a Count field. | Array[] |
TopTracks | Array of the 10 highest-rated tracks. Each object is a full track record. | Array[] |
BottomTracks | Array of the 10 lowest-rated tracks (unrated tracks excluded). Same structure as TopTracks. | Array[] |
TopArtists | Array of the 10 highest-rated artists. Each object contains Artist, CompositeRating and Voters. | Array[] |
BottomArtists | Array of the 10 lowest-rated artists. Same fields as TopArtists. | Array[] |
StreamingCountries | Array of listener countries ordered by session count. Each object contains Country and Count. | Array[] |
StreamingAgents | Array of user-agent strings seen in streaming sessions. Each object contains Agent and Count. | Array[] |
LogoffPlay | Array of up to 20 tracks most commonly playing when listeners disconnect. Each object contains Track (formatted “Artist-Title.”), 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 are full track records — see the Get Track response for the field list. They are abbreviated in the example below for readability.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 }
],
"Requests": [
{ "Artist": "Ekorren", "Title": "Little Danyjel", "TrackID": "14050", "Count": 20 },
{ "Artist": "Maf", "Title": "Mafland remix", "TrackID": "14907", "Count": 16 }
],
"TopTracks": [
{ "Artist": "Xyce", "Title": "Rymdkraft - Dolph's aerobics (remix)", "CompositeRating": "5.0" }
],
"BottomTracks": [
{ "Artist": "Unknown", "Title": "Untitled", "CompositeRating": "1.0" }
],
"TopArtists": [
{ "Artist": "Chris Huelsbeck", "CompositeRating": "4.6", "Voters": "12" }
],
"BottomArtists": [
{ "Artist": "Unknown", "CompositeRating": "1.5", "Voters": "2" }
],
"StreamingCountries": [
{ "Country": "Sweden", "Count": "1204" },
{ "Country": "Germany", "Count": "883" }
],
"StreamingAgents": [
{ "Agent": "VLC/3.0.20 LibVLC/3.0.20", "Count": "412" }
],
"LogoffPlay": [
{ "Track": "Virgill-Bratgrumbeere.", "NumberOfPlays": "17", "StationID": "1" }
],
"Duplicates": [
{ "FullArtist": "Maf", "Title": "Mafland remix", "TrackID": "14907" }
]
}
]
}
Request Statistics
Returns the current request queue status and the most recent request history. Useful for displaying a live request line on a website.
Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
Password | Yes | JWT token that authenticates the call. | Get from the get-token endpoint. |
StationID | Yes | The station to get request data from. The station must have requests enabled, otherwise the call fails with “This station does not allow requests.” | 1 = ericade.radio 2 = Best of ericade.radio |
Example request
{
"Password": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"StationID": 1
}
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 as a human-readable string, suitable for display. When the queue is above the station’s maximum this becomes an explanatory sentence instead of a duration. | 48 minutes |
CurrentRequests | Array of up to five recent requests: everything still queued, topped up with the most recently played ones. | 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": "Alexander Brandon - Frolick lane",
"Requested": "1774902091",
"TrackID": "15714",
"Source": "Internet",
"State": "Played"
}
]
}
Add Request
Submits a listener request to the station’s request queue. This endpoint was never ported to v2 — the v2 documentation points back to this same URL.
Password instead of Token as the field name for the JWT value (legacy naming).Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
Password | Yes | JWT token that authenticates the call. | Get from the get-token endpoint. Note: the field is named Password, not Token. |
StationID | Yes | The station to submit the request to. | 1 = ericade.radio 2 = Best of ericade.radio |
TrackID | Yes | Unique identifier of the track to request. Obtain from Get Track or List Tracks. | 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! |
Limits
The request is rejected, with an explanatory submessage, 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 |
|---|---|---|
message | Indicates whether the request was accepted. Either Success or Failure. | Success |
subcode | Machine-facing debug message describing what the API did internally. | Added Dr Future - Plastic pop (Plastic kills life mix) to the request log |
submessage | Human-facing message suitable for display to the end user. | Success! The tune you requested has been added to the playlist. Expected waiting time until play: 48 minutes. |
Example response
{
"message": "Success",
"subcode": "Added Dr Future - Plastic pop (Plastic kills life mix) to the request log",
"submessage": "Success! The tune you requested has been added to the playlist. Expected waiting time until play: 48 minutes."
}
Star Rating
Records a listener’s 1–5 star rating for a track, then recalculates the track’s and the artist’s composite ratings.
Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
Password | 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. | 4 |
StationID | No | Accepted, but 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.
- Each call sleeps for 1–3 seconds before doing its work, as anti-spam throttling. Do not treat this as a timeout.
Example request
{
"Password": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"TrackID": 10663,
"TrackRating": 4
}
Response
The standard envelope. On success submessage is Stars updated.; typical failures are You may only star 5 items per minute. and You may not vote for this track again at this time.
Example response
{
"message": "Success",
"subcode": "TRUE",
"submessage": "Stars updated."
}
Live Listeners
Returns who is listening right now, what recently finished sessions looked like, what is playing on each station, and the last ten changelog events. This is the data behind the internal monitoring dashboard.
Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
Password | Yes | JWT token that authenticates the call. | Get from the get-token endpoint. |
NumberOfEvents | Yes | Number of finished listening sessions to return. More than 100 is rejected. | 25 |
StationID | No | Limit the response to one station. When omitted, every station is included. | 1 = ericade.radio 2 = Best of ericade.radio |
RadioStats and StreamEvents. Sessions shorter than the configured minimum streaming time are also excluded.Example request
{
"Password": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"StationID": 1,
"NumberOfEvents": 25
}
Response
Returns four arrays in one object.
| Attribute | Description | Example |
|---|---|---|
RadioStats | Array of listeners connected right now, read live from the stream server. | Array[] |
RadioStats => Playtime | Seconds this listener has been connected. | 1842 |
RadioStats => Playtimehr | The same value as a human-readable string. | 30 minutes |
RadioStats => UserAgent | The listener’s player/user agent. | VLC/3.0.20 LibVLC/3.0.20 |
RadioStats => IP | The listener’s IP address. | 203.0.113.9 |
RadioStats => Referer | Modern when the connection came through the front-end proxy, Legacy when it hit the stream server directly. | Modern |
RadioStats => StationID, StationName | Which station the listener is tuned to. | 1 / 24/7 tracked music |
RadioStats => Country, Regionname, Isp, City, Zip | Cached geo-lookup for the listener’s IP. | Sweden |
StreamEvents | Array of the last NumberOfEvents completed listening sessions (logoff events). | Array[] |
StreamEvents => IP, Country, Regionname, Isp, City, Zip | Where the listener connected from. | Sweden |
StreamEvents => Timestamphr | When the session ended, human-readable. | 2026-05-31 21:16:42 |
StreamEvents => Agent | The listener’s player/user agent. | VLC/3.0.20 LibVLC/3.0.20 |
StreamEvents => Playtime / Playtimehr | Session length in seconds, and as a human-readable string. | 1842 / 30 minutes |
StreamEvents => StationID, StationName | Which station was being streamed. | 1 / 24/7 tracked music |
StreamEvents => PlayingAtLogoff | The track that was on air when the listener disconnected. | Virgill-Bratgrumbeere. Started at: Sat, 31 May 2026 21:12:03 +0000. |
NowPlaying | Array with one entry per station describing what is on air. | Array[] |
NowPlaying => Fullartist, Title | Artist and title of the current track. | Virgill / Bratgrumbeere |
NowPlaying => Image | Image URL for the current track. | https://radio.ericade.net/images/mod.png |
NowPlaying => LastPlayed | Track start time as a Unix epoch. | 1780262202 |
NowPlaying => SongType | Type/format of the current track. | Amiga 4-channel module |
NowPlaying => TrackID, StationID, StationName | Identifiers for the track and its station. | 10147 / 1 |
Events | Array of the ten most recent changelog entries. | Array[] |
Events => TimeStamphr | When the event was logged. | 2026-05-31 21:10:00 |
Events => Action | Event category. | Request, Star, Creationdate update |
Events => LogText | Human-readable description of the event. | Listener (203.0.113.9) requested Maf - Mafland remix. |
Events => StationID, StationName | The station the event belongs to. | 1 / 24/7 tracked music |
“The generated response was outside of allowed size bounds.” Keep NumberOfEvents modest.Example response
{
"RadioStats": [
{
"Playtime": "1842",
"Playtimehr": "30 minutes",
"UserAgent": "VLC/3.0.20 LibVLC/3.0.20",
"IP": "203.0.113.9",
"Referer": "Modern",
"StationID": "1",
"StationName": "24/7 tracked music",
"Country": "Sweden",
"Regionname": "Stockholm",
"Isp": "Example Telecom",
"City": "Stockholm",
"Zip": "11122"
}
],
"StreamEvents": [
{
"IP": "203.0.113.44",
"Country": "Germany",
"Regionname": "Bavaria",
"Isp": "Example GmbH",
"City": "Munich",
"Zip": "80331",
"Timestamphr": "2026-05-31 21:16:42",
"Agent": "Winamp/5.9",
"Playtime": "3720",
"Playtimehr": "01 hour 02 minutes",
"StationName": "24/7 tracked music",
"StationID": "1",
"PlayingAtLogoff": "Virgill-Bratgrumbeere. Started at: Sat, 31 May 2026 21:12:03 +0000."
}
],
"NowPlaying": [
{
"Fullartist": "Virgill",
"Title": "Bratgrumbeere",
"Image": "https://radio.ericade.net/images/mod.png",
"LastPlayed": "1780262202",
"SongType": "Amiga 4-channel module",
"TrackID": "10147",
"StationName": "24/7 tracked music",
"StationID": "1"
}
],
"Events": [
{
"TimeStamphr": "2026-05-31 21:10:00",
"Action": "Request",
"LogText": "Listener (203.0.113.9) requested Maf - Mafland remix.",
"StationName": "24/7 tracked music",
"StationID": "1"
}
]
}
Now Playing Text
Returns the current now-playing line as a single plain-text string, formatted for the stream server’s metadata field. This is not a JSON endpoint.
NowPlaying=1, or v2 Now Playing.Request
Parameters are read from the query string, not from a JSON body.
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
Password | Yes | Pre-shared ingest secret. | |
StationID | Yes | The station to read from. | 1 = ericade.radio 2 = Best of ericade.radio |
Response
A bare string, truncated to 128 characters (the stream server’s metadata limit) with a trailing ellipsis if it would be longer. The Content-Type header still says application/json, so do not try to parse the body.
| Form | When | Example |
|---|---|---|
<artist> - <title> [<tracker type>] | Normal playout. | Virgill - Bratgrumbeere [Amiga 4-channel module] |
NEW TRACK <artist> - <title> [<tracker type>] | The track was added within the last seven days. | NEW TRACK Maf - Mafland remix [Modern remix] |
<artist> - <title>, now playing: "<chapter>". | StationID 2, when the episode has a chapter list. | ericade.radio - Flashback 97, now playing: "Love connection by Lavizh". |
<artist> <title> | A manual override is active in the station settings (live show, special message). | ericade.radio Live from Revision 2026 |
<artist> - <title> [Listener request] | The track is a listener request — the request prefix is stripped from the artist field. | Maf - Mafland remix [Listener request] |
Missing or incorrect password. | The secret did not match. Note that this is returned as the body with HTTP 200. |
Next Request
Returns the oldest entry in the request queue, in the shape the playout software needs in order to schedule and play it. Called by the playout automation, not by listeners.
Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
Password | Yes | Pre-shared ingest secret. |
StationID to tell which station it belongs to.Response
Returns a {"Requests": [...]} object with zero or one entry.
| Attribute | Description | Example |
|---|---|---|
TrackID | Unique identifier of the requested track. | 10663 |
StationID | The station the request belongs to. | 1 |
title | Track title. | My wolf 2 |
fullartist | Complete artist field. | Arpegiator of Chryseis |
Guid | Internal GUID from PlayIT Live. | 6894ac27-abc9-4c4a-aad2-15879dda4dff |
nameofrequester | Display name the listener chose. | Caller #9 |
Path | Playout path of the audio file. | \mods\my_wolf_2.xm |
Source | Origin of the request. | Internet or Discord |
CueIn / CueOut | Cue points in seconds. | 0 / 292.75 |
Duration | Full file duration in seconds. | 295.1 |
greeting | (Deprecated) Greeting supplied by the requester. |
Example response
{
"Requests": [
{
"TrackID": "10663",
"StationID": "1",
"title": "My wolf 2",
"fullartist": "Arpegiator of Chryseis",
"Guid": "6894ac27-abc9-4c4a-aad2-15879dda4dff",
"nameofrequester": "Caller #9",
"Path": "\\mods\\my_wolf_2.xm",
"Source": "Internet",
"CueIn": "0",
"CueOut": "292.75",
"Duration": "295.1",
"greeting": ""
}
]
}
Mark Request Played
Moves a request from the queue to the played pile once the playout software has aired it, and resets the artist’s eligibility timer so the same artist cannot immediately be requested again.
Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
Password | Yes | Pre-shared ingest secret. | |
TrackID | Yes | Identifier of the track that was played. | 10663 |
StationID | Yes | The station the request belonged to. | 1 |
Slot | Yes | Playout slot the track was aired in. | 3 |
Example request
{
"Password": "<shared secret>",
"TrackID": 10663,
"StationID": 1,
"Slot": 3
}
Response
The standard envelope. On success submessage is Successfully moved the entry to the PlayedRequests pile. Failures include Track could not be found. and Track could not be found in queue.
Check If Exists
Checks whether a file has already been imported onto a station, by matching the original file name against the album metadata. Used by the import tooling to avoid duplicates.
Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
Password | Yes | Pre-shared ingest secret. | |
StationID | Yes | The station to search. | 1 |
OriginalFileName | Yes | The original file name to look for. Max 455 characters. | !Cube - My Pixels Are Weapons.ogg |
Response
The standard envelope, always with HTTP 200 — branch on message.
| message | submessage | Meaning |
|---|---|---|
Success | File does exist on the station. | Exactly one match. |
Failure | Does not exist on the station | No match. |
Failure | More than one track matched the search string please narrow your search. | Ambiguous — the name matched several tracks. |
Update Track
The ingest endpoint. The playout software posts a track’s full metadata here every time it plays or is imported; the API creates or updates the track, splits the artist field into individual artists, maintains the play log and the now-playing row, and writes the changelog.
Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
Password | Yes | Pre-shared ingest secret. | |
StationID | Yes | The station the track belongs to. | 1 |
Artist | Yes | Full artist field as it appears in the file, including collaborators. Max 255 characters. | KRDN of Defiance and Shodan of Eternal |
Title | Yes | Track title. Max 255 characters. | Eternal freedom 2.0 |
Album | No | Album tag. The tracker type, batch number and original file name are parsed out of this field. Max 255 characters. | OriginalName:custom.rmx Imported:2022-11-01 (TERN-oct2022-05). |
Genre | No | Genre tag. Max 255 characters. | |
Year | No | Year tag. Max 255 characters. | 1992 |
Comments | No | Comment field from the file. Max 8192 characters. | |
Tags | No | Comma-separated tag list. Max 255 characters. | Revision, Revision 2026 |
Guid | Yes | PlayIT Live GUID identifying the item. Max 255 characters. | 6894ac27-abc9-4c4a-aad2-15879dda4dff |
Path | No | Playout path of the audio file. Max 255 characters. | \mods\custom.rmx |
Type | No | Item type reported by the playout software. | Song |
Duration | No | Full file duration in seconds. Decimal; comma is accepted and converted. | 295.1 |
CueIn / CueOut | No | Cue points in seconds. The difference between them is the play length. | 0 / 292.75 |
Intro / Segue / OutCue | No | Intro, segue and out-cue markers in seconds. | 0 |
NoFade / Sweeper / Disabled | No | Playout flags. Max 10 characters each. | 0 or 1 |
ValidFrom / Expires | No | Scheduling window for the item. | |
Added | No | When the item was added in the playout system. | 2022-11-01 16:19:08 |
TrackID | No | The playout system’s own track identifier. Stored separately from the API’s TrackID. Max 100 characters. | |
TrackGroups | No | Track group membership from the playout system. Max 4096 characters. | |
StartedUtc / StartedLocal | No | When playback started, in UTC and in station-local time. Max 40 characters each. | 2026-05-31T21:12:03Z |
Response
The standard envelope. On success submessage is All done. Failures include StationID field missing., Artist field missing., Title field missing. and Station configuration is not valid or the station does not exist.
Stream Events
Records a listener logon or logoff reported by the stream server, together with the geo-lookup for the listener’s IP and the track that was playing at the time. This is what feeds the listener statistics.
Request
| Attribute | Mandatory? | Description | Notes |
|---|---|---|---|
Password | Yes | Pre-shared ingest secret. | |
Event | Yes | Free-text description of the event. Max 255 characters. An empty value is rejected with “Event-text needed.” | Listener disconnected |
Eventtype | Yes | Logon or Logoff. On logon the IP is added to the geo cache if it is not already known. | Logoff |
StreamID | Yes | The stream the event belongs to. Matches the StationID. Up to 3 digits. | 1 |
IP | Yes | The listener’s IP address. Max 255 characters. | 203.0.113.9 |
Playtime | No | Session length in seconds. Up to 7 digits. | 1842 |
Agent | No | The listener’s player/user agent. Max 255 characters. | VLC/3.0.20 LibVLC/3.0.20 |
Country | No | Country name. Max 40 characters. | Sweden |
Regionname, City, Zip, Isp | No | Remaining geo fields. Max 255 characters each. | Stockholm |
Identifier | No | Opaque session identifier from the stream server. Max 255 characters. |
Success.Example request
{
"Password": "<shared secret>",
"Eventtype": "Logoff",
"Event": "Listener disconnected",
"StreamID": 1,
"IP": "203.0.113.9",
"Playtime": 1842,
"Agent": "VLC/3.0.20 LibVLC/3.0.20",
"Country": "Sweden",
"Regionname": "Stockholm",
"City": "Stockholm",
"Zip": "11122",
"Isp": "Example Telecom"
}
Response
The standard envelope. On success submessage is All done.
Disabled Endpoints
These URLs still exist under /radio/ but do not perform any work. They are listed here so that callers do not mistake their responses for transient errors.
| Endpoint | Status | Behaviour |
|---|---|---|
/radio/updatetrackdates/ | Disabled | Returns the plain string This function is disabled. and stops. It used to remap a track’s creation date by GUID or path; it will stay disabled until station 2 data can be remapped safely. |
/radio/populatepodcasts/ | Disabled | Returns the plain string Not in use right now and stops. |
/radio/repairdbtracking/ | Not implemented | The backing method no longer exists, so the call fails server-side and returns no usable body. Do not call it. |