AssetService:SearchAudioAsyncRead the docs →Browse
GEThttps://api.audioscape.ai/developer/v1/browseOn this pageEndpoint▼
Endpoint
Browse the AudioScape catalog by artist, album, genre, mood, trending, or game. Use this endpoint to list available entities, drill into a specific one to get its tracks, or fetch the popularity-ranked trending list.
Headers
| Name | Type | Description |
|---|---|---|
| x-api-key | required | Your API key |
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| type | string required | One of: artist, album, genre, mood, trending, game |
| name | string optional | Name of the entity to browse. When provided, returns tracks belonging to that entity. When omitted, lists all entities of the given type. For game, pass the numeric universe_id from the list response. |
| asset_id | string optional | game only: reverse lookup — returns the games this track has been heard in, as a game list. Ignored when name is present. |
| limit | number optional | Maximum results to return (default: 20, max: 100) |
| offset | number optional | Pagination offset (default: 0) |
| sort | string optional | Order tracks within a drill-down. One of popular (default — global popularity ranking, same signals as trending), alpha (track name A→Z), recent (newest first by upload date). Ignored for list mode and for trending (already popularity-ordered). For genre and mood, tracks with no engagement data are omitted under popular — use alpha or recent to include them. artist, album, and game include them, sorted last. |
Browse Types
artistLists artists with track and album counts. Drill into an artist to get all their tracks.
albumLists albums with artist and track count. Drill into an album to get its tracks.
genreLists genres with track counts. Each item exposes a URL-safe slug (e.g. hip-hop-rap) alongside the canonical name. Drill in by passing either the slug or the canonical as name.
moodLists available moods (Happy, Exciting, Ambient, etc.) with track counts. Browse tracks by mood to curate playlists.
trendingPopularity-ranked tracks across the catalog, refreshed daily. No name required — the response is always a tracks list. Engagement signals (plays, favorites, votes, queue adds, listen duration, plus high-value SDK custom events) are exponentially decayed over a 60-day window so recent activity dominates.
gameBrowse Roblox experiences by the catalog music heard in them, ordered by player count. List mode returns games with at least 5 catalog tracks; drill in with name=<universe_id> for a game's tracks (any mapped game resolves, regardless of the list floor), or reverse-look-up with asset_id=<id> to get the games a track has been heard in. The mapping refreshes weekly from Roblox's own music-discovery data; playing/visits reflect the last sync, not live CCU. For tiles, build icons client-side from universe_id (e.g. rbxthumb://type=GameIcon&id=<universe_id>&w=150&h=150 in Roblox clients).
List Response
When name is omitted, returns a list of entities. The shape of each item depends on the type:
{
"items": [
{
"name": "string",
"track_count": number,
"album_count": number // artist only
"artist": "string", // album only
"genre": "string" // album only
}
],
"meta": {
"total": number,
"limit": number,
"offset": number,
"type": "artist" | "album"
}
}{
"items": [
{
"name": "string",
"slug": "string", // genre only — URL-safe id, pass back as name=
"display_name": "string",
"track_count": number
}
],
"meta": {
"total": number,
"limit": number,
"offset": number,
"type": "genre" | "mood"
}
}{
"items": [
{
"universe_id": number, // drill-down key — pass back as name=
"name": "string", // e.g. "Brookhaven RP"
"creator_name": "string",
"root_place_id": number, // e.g. for rbxthumb://type=GameIcon icons
"playing": number, // CCU at last catalog sync, not live
"visits": number,
"track_count": number // catalog tracks heard in this game
}
],
"meta": {
"total": number,
"limit": number,
"offset": number,
"type": "game",
"asset_id": number // reverse lookup only
}
}The game list shape is also what the asset_id reverse lookup returns, with meta.asset_id echoing the queried track.
Tracks Response
When name is provided, returns tracks belonging to that entity. Same track format as the search endpoint.
{
"tracks": [
{
"asset_id": "string",
"name": "string",
"artist": "string",
"album": "string",
"duration": number,
"genre": "string", // canonical, e.g. "Hip Hop / Rap"
"genre_slug": "string", // URL-safe, e.g. "hip-hop-rap"
"bpm": number,
"score": number // popularity score when sort="popular"
}
],
"meta": {
"total": number,
"limit": number,
"offset": number,
"type": "artist" | "album" | "genre" | "mood" | "trending" | "game",
"name": "string", // omitted for trending
"sort": "popular" | "alpha" | "recent"
}
}Example Requests
Power a lobby jukebox or in-game music room: list the genres to populate a picker, then fetch tracks for whichever one the player taps. Assumes a client from the Quickstart.
-- Lobby jukebox: populate a genre picker, fetch tracks on click
local genres, err = AudioScape:browse({ type = "genre" })
if not genres then warn(err) return end
for _, genre in genres.items do
local button = Instance.new("TextButton")
button.Text = `{genre.display_name} ({genre.track_count})`
button.Size = UDim2.fromOffset(200, 32)
button.Parent = genreList -- your Frame holding the genre buttons
button.Activated:Connect(function()
-- name accepts the slug (URL-safe, e.g. "hip-hop-rap") or the
-- canonical (e.g. "Hip Hop / Rap"). Slug is preferred for URL
-- transport; both resolve to the same tracks.
local tracks, trackErr = AudioScape:browse({
type = "genre",
name = genre.slug,
limit = 25,
})
if not tracks then warn(trackErr) return end
print("Loaded", #tracks.tracks, "tracks for", genre.display_name)
end)
endError Responses
Missing or invalid type parameter.
{
"error": "type is required and must be one of: artist, album, genre, mood, trending, game"
}Invalid or missing API key.
{
"error": "Invalid API key"
}You've exceeded your rate limit. See your current tier on the API Keys page.
{
"message": "Too Many Requests"
}Something went wrong on our end. Try again or contact support if the issue persists.