Skip to content

Songs and Search

leanwrldd edited this page Sep 10, 2026 · 2 revisions

← Back to Home

Songs & Search

GET /songs/ — List & Search

Paginated song list with rich filtering. All params are optional.

Param Type Description
page number Page number (default: 1)
page_size number Results per page (default: 20)
category string released, unreleased, unsurfaced, recording_session
era string Era abbreviation e.g. "GB&GR", "DRFL", "WOD", "OUT", "POST" — use name from /eras/
search string Search names, artists, track titles (normalizes special chars — "dont" matches "don't")
searchall string Search names, artists, producers, track titles
lyrics string Full-text search within lyrics content
all string "true" returns the entire catalogue in one response as a plain array — no pagination envelope, and page/page_size are ignored. It's ~2,500 songs, so use it for whole-dataset work (calendars, grouping, offline seeding), not for lists a user scrolls.
file_names_array string "true" to return file_names as array instead of string
versions string "true" to add version_title and a versions array to each song. Collection endpoint only — /songs/{id}/ ignores it.

Response shape:

{
  "count": 1234,
  "next": "https://juicewrldapi.com/juicewrld/songs/?page=2",
  "previous": null,
  "results": [ /* Song objects */ ]
}

With ?all=true — bare array, no envelope:

[ /* every Song object */ ]

Note there is no ordering/sort param, and category/era each accept only one value per request — sorting, and any multi-category or multi-era view, has to be assembled client-side.

GET /songs/{id}/ — Single Song

Returns a full song object by internal ID (song.id, not public_id).

GET /categories/

{
  "categories": [
    { "value": "released",          "label": "Released" },
    { "value": "unreleased",        "label": "Unreleased" },
    { "value": "unsurfaced",        "label": "Unsurfaced" },
    { "value": "recording_session", "label": "Recording Session" }
  ]
}

GET /eras/

Paginated — same envelope as /songs/. 34 eras total. Era names use short abbreviation strings.

{
  "count": 34,
  "next": "https://juicewrldapi.com/juicewrld/eras/?page=2",
  "previous": null,
  "results": [
    { "id": 101, "name": "jute",        "description": "JUICED UP THE EP era (~2014-February 2017)", "time_frame": "(January 2014-February 2017)", "play_count": 2980 },
    { "id": 103, "name": "afflictions", "description": "Affliction era (February 2017-May 2017)",    "time_frame": "(February 2017-May 2017)",   "play_count": 1398 },
    { "id": 105, "name": "jw 999",      "description": "Juice WRLD 999 era (May 2017-May 2018)",     "time_frame": "(May 2017-May 2018)",        "play_count": 1389 },
    { "id": 108, "name": "GB&GR",       "description": "Goodbye & Good Riddance era",                "time_frame": "(December 2017-May 2018)",   "play_count": 15485 },
    { "id": 109, "name": "WOD",         "description": "WRLD On Drugs era",                          "time_frame": "(August 2018-December 2018)", "play_count": 11228 },
    { "id": 110, "name": "DRFL",        "description": "Death Race For Love era",                    "time_frame": "(May 2018-March 2019)",      "play_count": 11040 },
    { "id": 111, "name": "OUT",         "description": "Outsiders era",                              "time_frame": "(March 2019-December 2019)", "play_count": 13729 },
    { "id": 112, "name": "POST",        "description": "Posthumous era",                             "time_frame": "(December 2019-Present)",    "play_count": 3660 }
    // ... 34 total
  ]
}

Pass name as the era filter param on /songs/ — e.g. era=GB%26GR.

GET /eras/{id}/ returns a single era object with the same fields.

Artists

A separate, lighter object from credited_artists on the song shape: a proper Artist record with an id and bio.

GET /artists/

Returns a plain array of Artist objects, no pagination envelope.

[
  { "id": 1, "name": "Juice WRLD", "bio": "..." }
]

GET /artists/{id}/

Single Artist object by id.

Albums

Album metadata, distinct from the album string on the song shape. Each album links back to its Artist.

GET /albums/

Returns a plain array of Album objects, no pagination envelope.

[
  {
    "id": 1,
    "title": "Goodbye & Good Riddance",
    "type": "album",
    "artist": { "id": 1, "name": "Juice WRLD", "bio": "..." },
    "release_date": "2018-05-23",
    "description": "...",
    "play_count": 0
  }
]

artist_id can also show up on write payloads; the read shape nests the full artist object instead.

GET /albums/{id}/

Single Album object by id.

GET /stats/

{
  "total_songs": 2452,
  "category_stats": {
    "released":          320,
    "unreleased":        1462,
    "unsurfaced":        269,
    "recording_session": 401
  },
  "era_stats": {
    "GB&GR":       574,
    "OUT":         312,
    "POST":        369,
    "WOD":         488,
    "DRFL":        326,
    "Mainstream":  63,
    "jute":        37
    // ... one key per era
  }
}

Era keys in era_stats match the name field from /eras/.

GET /radio/random/

Returns a random playable song with full metadata and stream path.

{
  "id": "Compilation/1. Released Discography/.../song.mp3",
  "title": "Song Title",
  "path": "Compilation/1. Released Discography/.../song.mp3",
  "size": 5195736,
  "modified": "2025-10-18T19:19:53.784271",
  "hash": "d199a85e510b32b9ef3c02a29044a41d",
  "song": { /* Full song object */ }
}

Clone this wiki locally