Custom Music API
By default, the Music app searches the built-in library (roadshop_music_library), which is filled through player submissions and the in-app admin panel. With the Custom Music API you can replace that library entirely and serve songs from your own HTTP server.
How It Works
Server-Side Only
The request runs on the FiveM server via
PerformHttpRequest. Your API key never leaves the server — the NUI frontend never sees your endpoint or credentials.No Frontend Changes
The Music app works exactly as before: search, playlists and playback are untouched. Only the data source changes.
Unlimited Catalog
Every search hits your server live, so your catalog can be as large as you want — your server does the filtering.
YouTube & Direct Files
Each song is either a YouTube video id or a direct link to an audio file (mp3/ogg) on your own CDN.
Configuration
EditMusicAPI.lua in the resource root (it is escrow_ignore, so you can edit it freely):
MusicAPI.lua
config.lua changes and no frontend rebuild needed. Restart the resource after editing.
Request Format
For every search in the Music app, RoadCarRadio sends:- The
Authorizationheader is only sent whenMusicAPI.APIKeyis a non-empty string. - An empty
searchparameter is sent when the player opens the search view. Return your newest or featured songs in that case.
Response Format
Respond with HTTP 200 and a JSON array of songs. At most the first 50 are used:{ "songs": [ ... ] }
Song Fields
A song is skipped when it has no
id, or neither title nor songname. On any error — non-200 status, invalid JSON, or a response with no array — the app shows an empty result list and a warning is printed to the FiveM server console.Example: Building Your Own Endpoint
A minimal music API using Node.js and Express:In production, serve the library from a database, add rate limiting, and cache popular queries. Direct audio files must be publicly reachable from every player’s game client — they are streamed by xSound/mx-surround on the client, not proxied through your FiveM server.
Troubleshooting
Search always shows an empty list
Search always shows an empty list
- Check the FiveM server console for
[RoadCarRadio] MusicAPI ...warnings — they name the exact failure - Verify your endpoint is reachable from the FiveM server (try
curlon that machine, not from your desktop) - Confirm the response is a JSON array, or
{ "songs": [...] }, withidandtitleon every song - Make sure the API key in
MusicAPI.luamatches what your endpoint expects
Songs appear but won't play
Songs appear but won't play
- For
url_type: "youtube",idmust be the plain video id (e.g.dQw4w9WgXcQ), not a full URL - For
url_type: "direct",idmust be a fullhttps://URL to an audio file that players’ game clients can reach - Test a direct URL in your browser — it should stream the audio without a login
- Confirm
Config.AudioLibrarymatches the audio resource you actually run (xsoundormxsurround)
The built-in library still shows up
The built-in library still shows up
- Ensure
MusicAPI.Enabled = trueinMusicAPI.luain the resource root - Restart the resource completely after changing the file
- Check that
MusicAPI.luais listed infxmanifest.luaunderserver_scripts
Only some of my songs show up
Only some of my songs show up
- At most 50 songs per response are used. Filter server-side and return the best matches rather than your whole catalog
- Songs without an
id, or without bothtitleandsongname, are skipped silently
Related
Installation
Requirements, setup and configuration
Commands
Including the music approval command