24 KiB
Asteroid Radio - API Endpoints Reference
- Overview
- Status Endpoints
- Track Endpoints
- Player Control Endpoints
- Playlist Endpoints
- Admin Endpoints
- Stream Playlist File Endpoints (Admin Only)
- Liquidsoap Control Endpoints (Admin Only)
- Stream Queue Endpoints
- Recently Played Endpoints
- Playlist Scheduler Endpoints (Admin Only)
- Track Request Endpoints
- POST /api/asteroid/requests/submit
- GET /api/asteroid/requests/my
- GET /api/asteroid/requests/recent
- GET /api/asteroid/admin/requests/pending
- GET /api/asteroid/admin/requests/list
- GET /api/asteroid/admin/requests/approved
- POST /api/asteroid/admin/requests/approve
- POST /api/asteroid/admin/requests/reject
- POST /api/asteroid/admin/requests/play
- User Custom Playlist Endpoints
- GET /api/asteroid/library/browse
- GET /api/asteroid/user/playlists
- GET /api/asteroid/user/playlists/get
- POST /api/asteroid/user/playlists/create
- POST /api/asteroid/user/playlists/update
- POST /api/asteroid/user/playlists/submit
- POST /api/asteroid/user/playlists/delete
- GET /api/asteroid/admin/user-playlists
- POST /api/asteroid/admin/user-playlists/review
- GET /api/asteroid/admin/user-playlists/preview
- User Favorites Endpoints
- User Listening History Endpoints
- User Profile Endpoints
- User Account Endpoints
- Frontend Partial Endpoints
- Listener Statistics Endpoints
- Utility Endpoints
- Error Responses
- Testing API Endpoints
- Browser Detection
- Rate Limiting
- Future Enhancements
Overview
Asteroid Radio provides a comprehensive JSON API built with Radiance's define-api framework. All API endpoints return JSON responses and follow RESTful conventions.
Base URL
All API endpoints are prefixed with /api/asteroid/
Authentication
Protected endpoints require user authentication via session cookies. Unauthenticated requests to protected endpoints will return an error response.
Response Format
All API responses follow this structure:
{
"status": "success" | "error",
"message": "Human-readable message",
"data": { ... } // Optional, endpoint-specific data
}
Status Endpoints
GET /api/asteroid/status
Get server status and system information.
Authentication
Not required
Response
{
"status": "success",
"server": "asteroid-radio",
"version": "1.0",
"uptime": 3600
}
GET /api/asteroid/auth-status
Check current authentication status.
Authentication
Not required
Response
{
"loggedIn": true,
"username": "admin",
"role": "admin"
}
GET /api/asteroid/icecast-status
Get Icecast streaming server status and current track information.
Authentication
Not required
Response
{
"icestats": {
"source": {
"title": "Artist - Track Name",
"listeners": 5,
"genre": "Electronic",
"bitrate": 128
}
}
}
Track Endpoints
GET /api/asteroid/tracks
Get list of all tracks in the music library.
Authentication
Required
Response
{
"status": "success",
"tracks": [
{
"id": "track-id-123",
"title": "Track Name",
"artist": "Artist Name",
"album": "Album Name",
"duration": 245,
"format": "mp3"
}
]
}
GET /api/asteroid/admin/tracks
Get administrative track listing (admin only).
Authentication
Required (Admin role)
Response
Same as /api/asteroid/tracks but includes additional metadata for administration.
Player Control Endpoints
GET /api/asteroid/player/status
Get current player status.
Authentication
Required
Response
{
"status": "success",
"player": {
"state": "playing" | "paused" | "stopped",
"currentTrack": {
"id": "track-id-123",
"title": "Track Name",
"artist": "Artist Name"
},
"position": 45,
"duration": 245
}
}
POST /api/asteroid/player/play
Play a specific track.
Authentication
Required
Parameters
track-id(required) - ID of the track to play
Example Request
curl -X POST http://localhost:8080/api/asteroid/player/play \
-d "track-id=track-id-123"
Response
{
"status": "success",
"message": "Playing track",
"player": {
"state": "playing",
"currentTrack": { ... }
}
}
POST /api/asteroid/player/pause
Pause current playback.
Authentication
Required
Response
{
"status": "success",
"message": "Playback paused",
"player": {
"state": "paused"
}
}
POST /api/asteroid/player/stop
Stop current playback.
Authentication
Required
Response
{
"status": "success",
"message": "Playback stopped",
"player": {
"state": "stopped"
}
}
POST /api/asteroid/player/resume
Resume paused playback.
Authentication
Required
Response
{
"status": "success",
"message": "Playback resumed",
"player": {
"state": "playing"
}
}
Playlist Endpoints
GET /api/asteroid/playlists
Get all playlists for the current user.
Authentication
Required
Response
{
"status": "success",
"playlists": [
{
"id": "playlist-id-123",
"name": "My Playlist",
"description": "Favorite tracks",
"trackCount": 15,
"created": "2025-10-10T12:00:00Z"
}
]
}
POST /api/asteroid/playlists/create
Create a new playlist.
Authentication
Required
Parameters
name(required) - Playlist namedescription(optional) - Playlist description
Example Request
curl -X POST http://localhost:8080/api/asteroid/playlists/create \
-d "name=My Playlist&description=Favorite tracks"
Response
{
"status": "success",
"message": "Playlist created successfully",
"playlist": {
"id": "playlist-id-123",
"name": "My Playlist",
"description": "Favorite tracks"
}
}
GET /api/asteroid/playlists/get
Get details of a specific playlist.
Authentication
Required
Parameters
playlist-id(required) - ID of the playlist
Example Request
curl "http://localhost:8080/api/asteroid/playlists/get?playlist-id=playlist-id-123"
Response
{
"status": "success",
"playlist": {
"id": "playlist-id-123",
"name": "My Playlist",
"description": "Favorite tracks",
"tracks": [
{
"id": "track-id-123",
"title": "Track Name",
"artist": "Artist Name"
}
]
}
}
POST /api/asteroid/playlists/add-track
Add a track to a playlist.
Authentication
Required
Parameters
playlist-id(required) - ID of the playlisttrack-id(required) - ID of the track to add
Example Request
curl -X POST http://localhost:8080/api/asteroid/playlists/add-track \
-d "playlist-id=playlist-id-123&track-id=track-id-456"
Response
{
"status": "success",
"message": "Track added to playlist"
}
POST /api/asteroid/playlists/remove-track
Remove a track from a playlist.
Authentication
Required
Parameters
playlist-id(required) - ID of the playlisttrack-id(required) - ID of the track to remove
Response
{
"status": "success",
"message": "Track removed from playlist"
}
POST /api/asteroid/playlists/delete
Delete a playlist.
Authentication
Required
Parameters
playlist-id(required) - ID of the playlist
Response
{
"status": "success",
"message": "Playlist deleted"
}
Admin Endpoints
POST /api/asteroid/admin/scan-library
Scan the music library for new tracks.
Authentication
Required (Admin role)
Response
{
"status": "success",
"message": "Library scan completed",
"tracks-added": 42
}
GET /api/asteroid/users
Get all users.
Authentication
Required (Admin role)
Response
Returns a JSON object with a users array.
POST /api/asteroid/users/create
Create a new user.
Authentication
Required (Admin role)
Parameters
username(required)email(required)password(required)role(required)
Response
Returns a JSON object indicating success or failure.
Stream Playlist File Endpoints (Admin Only)
These endpoints manage playlist files in the playlists/ directory, and control the currently active playlists/stream-queue.m3u.
GET /api/asteroid/stream/playlists
List available playlist files in playlists/ (excluding stream-queue.m3u).
Authentication
Required (Admin role)
Response
Returns a JSON object with a playlists array of filenames.
POST /api/asteroid/stream/playlists/load
Load a playlist file into playlists/stream-queue.m3u and return its paths.
Authentication
Required (Admin role)
Parameters
name(required) - Playlist filename to load
POST /api/asteroid/stream/playlists/save
Save the in-memory stream queue to playlists/stream-queue.m3u.
Authentication
Required (Admin role)
POST /api/asteroid/stream/playlists/save-as
Save the current stream queue to a new playlist file.
Authentication
Required (Admin role)
Parameters
name(required) - New playlist filename (.m3usuffix is optional)
POST /api/asteroid/stream/playlists/clear
Clear playlists/stream-queue.m3u and empty the in-memory stream queue.
Authentication
Required (Admin role)
GET /api/asteroid/stream/playlists/current
Return the current playlists/stream-queue.m3u contents with best-effort track info.
Authentication
Required (Admin role)
Liquidsoap Control Endpoints (Admin Only)
GET /api/asteroid/liquidsoap/status
Get Liquidsoap status including uptime, current metadata, and remaining time.
Authentication
Required (Admin role)
POST /api/asteroid/liquidsoap/skip
Skip the current track in the stream queue.
Authentication
Required (Admin role)
POST /api/asteroid/liquidsoap/reload
Force Liquidsoap to reload the playlist.
Authentication
Required (Admin role)
POST /api/asteroid/liquidsoap/restart
Restart the Liquidsoap Docker container.
Authentication
Required (Admin role)
POST /api/asteroid/icecast/restart
Restart the Icecast Docker container.
Authentication
Required (Admin role)
Stream Queue Endpoints
GET /api/asteroid/stream/queue
Get the current stream queue.
Authentication
Required (Admin role)
Response
{
"status": "success",
"queue": [
{
"id": "track-id-123",
"title": "Track Name",
"artist": "Artist Name",
"path": "/path/to/file.mp3"
}
]
}
POST /api/asteroid/stream/queue/add
Add a track to the stream queue.
Authentication
Required (Admin role)
Parameters
track-id(required) - ID of the track to addposition(optional) - Position in queue ("end" or index, default "end")
POST /api/asteroid/stream/queue/remove
Remove a track from the stream queue.
Authentication
Required (Admin role)
Parameters
track-id(required) - ID of the track to remove
POST /api/asteroid/stream/queue/clear
Clear the entire stream queue.
Authentication
Required (Admin role)
POST /api/asteroid/stream/queue/add-playlist
Add all tracks from a playlist to the stream queue.
Authentication
Required (Admin role)
Parameters
playlist-id(required) - ID of the playlist to add
POST /api/asteroid/stream/queue/reorder
Reorder tracks in the stream queue.
Authentication
Required (Admin role)
Parameters
track-ids(required) - Ordered list of track IDs
POST /api/asteroid/stream/queue/load-m3u
Load the stream queue from playlists/stream-queue.m3u.
Authentication
Required (Admin role)
Recently Played Endpoints
GET /api/asteroid/recently-played
Get recently played tracks.
Authentication
Not required
Parameters
mount(optional) - Stream mount point (default: main stream)
Response
{
"status": "success",
"tracks": [
{
"title": "Artist - Track Name",
"played_at": "2026-01-26T12:00:00Z"
}
]
}
Playlist Scheduler Endpoints (Admin Only)
GET /api/asteroid/scheduler/status
Get the current scheduler status.
Authentication
Required (Admin role)
Response
{
"status": "success",
"enabled": true,
"current_playlist": "Asteroid-Low-Orbit.m3u",
"current_hour": 14,
"schedule": [
{"hour": 0, "playlist": "Late-Night.m3u"},
{"hour": 6, "playlist": "Morning.m3u"}
],
"available_playlists": ["Asteroid-Low-Orbit.m3u", "Late-Night.m3u"]
}
POST /api/asteroid/scheduler/enable
Enable the playlist scheduler.
Authentication
Required (Admin role)
POST /api/asteroid/scheduler/disable
Disable the playlist scheduler (stops automatic playlist changes).
Authentication
Required (Admin role)
POST /api/asteroid/scheduler/load-current
Load the playlist for the current hour.
Authentication
Required (Admin role)
GET /api/asteroid/scheduler/schedule
Get the full schedule.
Authentication
Required (Admin role)
POST /api/asteroid/scheduler/update
Update a schedule entry.
Authentication
Required (Admin role)
Parameters
hour(required) - Hour (0-23)playlist(required) - Playlist filename
POST /api/asteroid/scheduler/remove
Remove a schedule entry.
Authentication
Required (Admin role)
Parameters
hour(required) - Hour to remove from schedule
Track Request Endpoints
POST /api/asteroid/requests/submit
Submit a track request.
Authentication
Required
Parameters
title(required) - Track title to requestmessage(optional) - Message with the request
Response
{
"status": "success",
"message": "Request submitted"
}
GET /api/asteroid/requests/my
Get current user's requests.
Authentication
Required
Response
{
"status": "success",
"requests": [
{
"id": 1,
"title": "Artist - Track",
"status": "pending",
"created_at": "2026-01-26T12:00:00Z"
}
]
}
GET /api/asteroid/requests/recent
Get recently played requests (public).
Authentication
Not required
GET /api/asteroid/admin/requests/pending
Get pending requests for admin review.
Authentication
Required (Admin role)
GET /api/asteroid/admin/requests/list
Get requests by status.
Authentication
Required (Admin role)
Parameters
status(optional) - Filter by status: "pending", "approved", "rejected", "played" (default: "pending")
GET /api/asteroid/admin/requests/approved
Get approved requests ready to queue.
Authentication
Required (Admin role)
POST /api/asteroid/admin/requests/approve
Approve a track request.
Authentication
Required (Admin role)
Parameters
id(required) - Request ID
POST /api/asteroid/admin/requests/reject
Reject a track request.
Authentication
Required (Admin role)
Parameters
id(required) - Request ID
POST /api/asteroid/admin/requests/play
Mark a request as played and add to queue.
Authentication
Required (Admin role)
Parameters
id(required) - Request ID
User Custom Playlist Endpoints
GET /api/asteroid/library/browse
Browse the music library.
Authentication
Required
Parameters
search(optional) - Search termartist(optional) - Filter by artistalbum(optional) - Filter by albumpage(optional) - Page number for pagination
GET /api/asteroid/user/playlists
Get current user's custom playlists.
Authentication
Required
GET /api/asteroid/user/playlists/get
Get a specific user playlist.
Authentication
Required
Parameters
id(required) - Playlist ID
POST /api/asteroid/user/playlists/create
Create a new user playlist.
Authentication
Required
Parameters
name(required) - Playlist namedescription(optional) - Playlist description
POST /api/asteroid/user/playlists/update
Update a user playlist.
Authentication
Required
Parameters
id(required) - Playlist IDname(optional) - New namedescription(optional) - New descriptiontracks(optional) - Updated track list
POST /api/asteroid/user/playlists/submit
Submit a playlist for admin review.
Authentication
Required
Parameters
id(required) - Playlist ID
POST /api/asteroid/user/playlists/delete
Delete a user playlist.
Authentication
Required
Parameters
id(required) - Playlist ID
GET /api/asteroid/admin/user-playlists
Get all submitted user playlists for review.
Authentication
Required (Admin role)
POST /api/asteroid/admin/user-playlists/review
Review a submitted playlist.
Authentication
Required (Admin role)
Parameters
id(required) - Playlist IDaction(required) - "approve" or "reject"notes(optional) - Review notes
GET /api/asteroid/admin/user-playlists/preview
Preview a submitted playlist.
Authentication
Required (Admin role)
Parameters
id(required) - Playlist ID
User Favorites Endpoints
GET /api/asteroid/user/favorites
Get current user's favorite tracks.
Authentication
Required
Response
{
"status": "success",
"favorites": [
{
"track_id": 123,
"title": "Artist - Track",
"rating": 5,
"added_at": "2026-01-26T12:00:00Z"
}
]
}
POST /api/asteroid/user/favorites/add
Add a track to favorites.
Authentication
Required
Parameters
track-id(optional) - Track IDtitle(optional) - Track title (if track-id not provided)rating(optional) - Rating 1-5
POST /api/asteroid/user/favorites/remove
Remove a track from favorites.
Authentication
Required
Parameters
track-id(optional) - Track IDtitle(optional) - Track title (if track-id not provided)
POST /api/asteroid/user/favorites/rate
Rate a favorite track.
Authentication
Required
Parameters
track-id(required) - Track IDrating(required) - Rating 1-5
GET /api/asteroid/user/favorites/check
Check if a track is in favorites.
Authentication
Required
Parameters
track-id(required) - Track ID
Response
{
"is_favorite": true,
"rating": 5
}
User Listening History Endpoints
GET /api/asteroid/user/history
Get current user's listening history.
Authentication
Required
POST /api/asteroid/user/history/record
Record a track listen.
Authentication
Required
Parameters
track-id(optional) - Track IDtitle(optional) - Track titleduration(optional) - Listen duration in secondscompleted(optional) - Whether track was completed (0 or 1)
POST /api/asteroid/user/history/clear
Clear listening history.
Authentication
Required
GET /api/asteroid/user/activity
Get listening activity data for charts.
Authentication
Required
Parameters
days(optional) - Number of days to include (default: 30)
Response
{
"status": "success",
"activity": [
{"date": "2026-01-26", "minutes": 120, "tracks": 25}
]
}
User Profile Endpoints
GET /api/asteroid/user/profile
Get current user's profile data.
Authentication
Required
Response
{
"status": "success",
"user": {
"username": "user123",
"email": "user@example.com",
"role": "listener",
"avatar": "/avatars/user123.png",
"created_at": "2025-10-01T12:00:00Z"
}
}
GET /api/asteroid/user/listening-stats
Get user's listening statistics.
Authentication
Required
GET /api/asteroid/user/recent-tracks
Get user's recently listened tracks.
Authentication
Required
Parameters
limit(optional) - Number of tracks (default: 3)offset(optional) - Offset for pagination (default: 0)
GET /api/asteroid/user/top-artists
Get user's top artists.
Authentication
Required
Parameters
limit(optional) - Number of artists (default: 5)
POST /api/asteroid/user/avatar/upload
Upload a user avatar.
Authentication
Required
Request
Multipart form data with image file.
GET /api/asteroid/user/avatar
Get current user's avatar URL.
Authentication
Required
User Account Endpoints
POST /api/asteroid/user/change-password
Change current user's password.
Authentication
Required
Parameters
current-password(required) - Current passwordnew-password(required) - New password
POST /api/asteroid/admin/reset-password
Reset any user's password (admin only).
Authentication
Required (Admin role)
Parameters
username(required) - Usernamenew-password(required) - New password
POST /api/asteroid/user/activate
Activate or deactivate a user account.
Authentication
Required (Admin role)
Parameters
user-id(required) - User IDactive(required) - "true" or "false"
POST /api/asteroid/user/role
Change a user's role.
Authentication
Required (Admin role)
Parameters
user-id(required) - User IDrole(required) - New role ("admin", "dj", "listener")
GET /api/asteroid/user-stats
Get user statistics (counts by role, active users, etc.).
Authentication
Required (Admin role)
Frontend Partial Endpoints
These endpoints return HTML partials or JSON for frontend updates.
GET /api/asteroid/partial/now-playing
Get HTML partial with current now-playing information.
Authentication
Not required
Parameters
mount(optional) - Stream mount point
Response
HTML fragment for embedding in page.
GET /api/asteroid/partial/now-playing-inline
Get inline text with now-playing info (for admin dashboard and widgets).
Authentication
Not required
Parameters
mount(optional) - Stream mount point
Response
Plain text: "Artist - Track Title"
GET /api/asteroid/partial/now-playing-json
Get JSON with now-playing info including track ID for favorites.
Authentication
Not required
Parameters
mount(optional) - Stream mount point
Response
{
"title": "Artist - Track Name",
"track_id": 123,
"listeners": 5
}
GET /api/asteroid/channel-name
Get the current curated channel name.
Authentication
Not required
Response
{
"channel": "Asteroid Low Orbit"
}
Listener Statistics Endpoints
GET /api/asteroid/stats/current
Get the current listener statistics.
Authentication
Not required
GET /api/asteroid/stats/daily
Get the daily listener statistics.
Authentication
Required (Admin role)
Response
Returns a JSON object containing daily listener statistics.
GET /api/asteroid/stats/geo
Get the geographical listener statistics.
Authentication
Required (Admin role)
Response
Returns a JSON object containing geographical listener statistics.
GET /api/asteroid/stats/geo/cities
Get the listener statistics by city.
Authentication
Required (Admin role)
Response
Returns a JSON object containing the country and a cities array with per-city aggregates.
Utility Endpoints
GET /api/asteroid/spectrum-analyzer.js
Get the dynamically generated JavaScript for the spectrum analyzer.
Authentication
Not required
Response
JavaScript code for the spectrum analyzer visualization.
Error Responses
All endpoints may return error responses in this format:
{
"status": "error",
"message": "Description of the error"
}
Common HTTP Status Codes
200- Success400- Bad Request (missing or invalid parameters)401- Unauthorized (authentication required)403- Forbidden (insufficient permissions)404- Not Found (resource doesn't exist)500- Internal Server Error
Testing API Endpoints
Using curl
# Get server status
curl http://localhost:8080/api/asteroid/status
# Get auth status
curl http://localhost:8080/api/asteroid/auth-status
# Get tracks (requires authentication)
curl -b cookies.txt http://localhost:8080/api/asteroid/tracks
# Play a track
curl -X POST -b cookies.txt http://localhost:8080/api/asteroid/player/play \
-d "track-id=123"
Using the Test Suite
The project includes a comprehensive test suite:
./test-server.sh
See docs/TESTING.org for details.
Browser Detection
API endpoints support a browser parameter for dual usage (API + browser):
# API usage - returns JSON
curl -X POST http://localhost:8080/api/asteroid/playlists/create \
-d "name=Test"
# Browser usage - redirects to page
curl -X POST http://localhost:8080/api/asteroid/playlists/create \
-d "name=Test&browser=true"
When browser=true is passed, endpoints will redirect to appropriate pages instead of returning JSON.
Rate Limiting
API endpoints implement rate limiting to prevent abuse. Excessive requests may result in temporary blocking.
Future Enhancements
Planned API improvements:
- WebSocket support for real-time updates
- Pagination for large result sets
- Advanced search and filtering
- Batch operations
- API versioning
- OAuth2 authentication option