API ACCESS: 246M RECORDINGS, BPM & KEY, CHARTS, SAMPLES, CREDITS, PUBLISHING, PRESS, MIXTAPES, BLOGS, RADIO AND ARCHIVES. 78 READ-ONLY GET ROUTES IN 11 SECTIONS.
YOUR KEY IS EMAILED TO YOU, NEVER SHOWN HERE. LOST IT? ENTER THE SAME EMAIL AND IT IS SENT AGAIN.
SPINE: /api/v2/spine
THE RECORDING SPINE: 246M RECORDINGS WITH IDENTITY, CROSSWALKS, CATALOG, ALBUMS, LABELS AND ARTISTS. CURSOR-PAGED LISTS RETURN A cursor; PASS IT BACK TO GET THE NEXT PAGE.
GET /api/v2/spine/search
SONG SEARCH BY TITLE, MOST POPULAR FIRST. THE USUAL WAY TO GET A rid. label IS A LABEL WHOSE CATALOG CARRIES THE RECORDING, PICKED BY CATALOG SIZE, SO IT IS OFTEN AN UMBRELLA OR COMPILATION LABEL RATHER THAN THE ORIGINAL RELEASE LABEL. FOR THE RELEASE LABEL USE spine/track → album.label.
q REQUIRED · limit MAX 500 (DEFAULT 300) · cursor · label_id / root_id SCOPE TO A LABEL · sort title | artist | year · dir asc | desc
https://everysong.site/api/v2/spine/search?q=hotline%20bling&limit=10&api_key=YOUR_KEY
{
"results": [
{
"rid": 3602,
"isrc": "USCM51500238",
"streaming_id": "0wwPcA6wtMf6HUMpIRdeP7",
"title": "Hotline Bling",
"artist": "Drake",
"year": "2015",
"released": "2015-07-31",
"pop": 79,
"label_id": 8377,
"label": "Island Records"
},
"…"
],
"artists": [
{
"an": "hotlinebling",
"a": "Hotline Bling",
"n": 1
}
],
"cursor": "46|72484663",
"done": false,
"total": 1394,
"total_capped": false
}
GET /api/v2/spine/song
ONE RECORDING: ISRC, STREAMING ID, RELEASE DATE, LINKED WORKS, ISWC AND AUDIO FEATURES (SAME OBJECT AS songs/audio_features; features: null WHEN ABSENT).
rid, OR artist + title, OR streaming_id
https://everysong.site/api/v2/spine/song?rid=3602&api_key=YOUR_KEY
{
"rid": 3602,
"isrc": "USCM51500238",
"title": "Hotline Bling",
"artist": "Drake",
"year": "2015",
"released": "2015-07-31",
"pop": 79,
"name": "N-003602",
"in_spine": true,
"streaming_id": "0wwPcA6wtMf6HUMpIRdeP7",
"credits_recording_id": 18326083,
"acoustic_group": null,
"n_versions": 10,
"first_release": "2015-07-31",
"features": {
"duration_ms": 267067,
"time_signature": 4,
"tempo": 134.966,
"key": 2,
"mode": 1,
"danceability": 0.891,
"energy": 0.628,
"loudness": -7.863,
"speechiness": 0.0551,
"acousticness": 0.00258,
"instrumentalness": 0.00019,
"liveness": 0.0504,
"valence": 0.552,
"key_name": "D Major"
},
"works": [
{
"wid": 12885061,
"name": "Hotline Bling",
"iswc": "T-917.339.939-8"
}
]
}
GET /api/v2/spine/ids
BATCH CROSSWALK PER RID: WORK, ISWC, SONG PAGE ID (song_page_id), BPM, KEY, CHART PEAK, CERTIFICATIONS, SAMPLE AND COVER COUNTS, ONE PRESSING.
rids REQUIRED, COMMA-SEPARATED (MAX 600)
https://everysong.site/api/v2/spine/ids?rids=3602,3594&api_key=YOUR_KEY
{
"ids": {
"3602": {
"work": "Hotline Bling",
"iswc": "T-917.339.939-8",
"credits_work_id": 12885061,
"song_page_id": 2263723,
"smp": 2,
"smpby": 169,
"press": 33,
"cov": 197,
"peak": 1,
"certs": "Diamond US",
"bpm": 135,
"key": "D maj",
"lyr": 1,
"album": "DMC - Cool Grooves 06 - Oct 2015",
"country": "UK",
"catno": "DMCCOOL6",
"dglabel": "DMC"
}
}
}
GET /api/v2/spine/brief
THE FULL SONG DOSSIER: CHARTS, SAMPLES, PRESS, PRESSINGS, LABELS, CREDITS, PUBLISHING, WRITERS, RELATED SONGS. LARGE (~140 KB) AND SLOW (7–20 S).
rid REQUIRED
https://everysong.site/api/v2/spine/brief?rid=3602&api_key=YOUR_KEY
{
"name": {
"rid": 3602,
"isrc": "USCM51500238",
"title": "Hotline Bling",
"artist": "Drake",
"released": "2015-07-31",
"streaming_id": "0wwPcA6wtMf6HUMpIRdeP7",
"works": [
{
"wid": 12885061,
"name": "Hotline Bling",
"iswc": "T-917.339.939-8"
}
]
},
"context": {
"charts": [
{
"chart": "au-weekly",
"peak": 1,
"weeks": 83,
"first_week": "2015-08-13",
"last_week": "2023-05-18"
},
"…"
],
"certs": [
{
"country": "DE",
"award": "Gold",
"multiple": 1,
"cert_date": "2017"
},
"…"
]
},
"presence": {
"song_page_ids": [
2263723
],
"releases": 33,
"mixtapes": 11,
"blog_posts": 4
},
"credits": [
{
"name": "Aubrey Graham",
"role": "Written-By",
"person_id": 1557579
},
"…"
],
"publishing_work": {
"work_id": "HV7V4M",
"iswc": "T9173399398",
"writers": [
"…"
],
"publishers": [
"…"
]
},
"…": "genealogy, pressings, labels, identifiers, writers, related_songs, meta, artists"
}
GET /api/v2/spine/editions
EVERY PRESSING OF THE SONG, UNCAPPED, WITH LABELS, CATALOG NUMBERS AND CREDITS. SLOW (~12 S).
rid REQUIRED
https://everysong.site/api/v2/spine/editions?rid=3602&api_key=YOUR_KEY
GET /api/v2/spine/track
RELEASE METADATA: ALBUM, LABEL, UPC, COPYRIGHT LINES, FIRST RELEASE, ISRC REGISTRANT.
streaming_id REQUIRED (FROM spine/song OR spine/search)
https://everysong.site/api/v2/spine/track?streaming_id=0wwPcA6wtMf6HUMpIRdeP7&api_key=YOUR_KEY
{
"id": "0wwPcA6wtMf6HUMpIRdeP7",
"name": "Hotline Bling",
"isrc": "USCM51500238",
"duration_ms": 267066,
"explicit": false,
"popularity": 79,
"preview_url": null,
"artists": [
{
"id": "3TVXtAsR1Inumwj472S9r4",
"name": "Drake",
"followers": 97342434,
"popularity": 98,
"genres": [
"rap",
"hip hop"
]
}
],
"album": {
"id": "40GMAhriYJRO1rsY4YdrZb",
"name": "Views",
"label": "Cash Money Records/Young Money Ent./Universal Rec.",
"upc": "00602547943514",
"copyright_p": "℗ 2016 Young Money Entertainment/Cash Money Records",
"release_date": "2016-05-06"
},
"registrant": {
"prefix": "USCM5",
"country": "US",
"top_label": "Cash Money",
"n_tracks": 11280,
"years": [
null,
2025
]
}
}
GET /api/v2/spine/isrc
EVERY RELEASE CARRYING ONE ISRC.
isrc REQUIRED
https://everysong.site/api/v2/spine/isrc?isrc=USCM51500238&api_key=YOUR_KEY
GET /api/v2/spine/registrant
WHO REGISTERED AN ISRC PREFIX: COUNTRY, TRACK COUNT, TOP LABELS.
prefix REQUIRED (THE FIRST 5 CHARACTERS OF AN ISRC, E.G. USCM5)
https://everysong.site/api/v2/spine/registrant?prefix=USCM5&api_key=YOUR_KEY
GET /api/v2/spine/library
THE WHOLE SPINE AS A SORTED SONG LIST.
sort (DEFAULT pop) · dir · limit MAX 500 (DEFAULT 300) · cursor · a_norm ONE ARTIST · charted=1 CHARTED ONLY
https://everysong.site/api/v2/spine/library?limit=20&api_key=YOUR_KEY
GET /api/v2/spine/stats
CORPUS TOTALS.
NO PARAMETERS
https://everysong.site/api/v2/spine/stats?api_key=YOUR_KEY
GET /api/v2/spine/albums
EVERY ALBUM (2.57M), MOST-PRESSED FIRST.
limit MAX 500 (DEFAULT 200) · cursor
https://everysong.site/api/v2/spine/albums?limit=20&api_key=YOUR_KEY
GET /api/v2/spine/album_search
ALBUM SEARCH BY TITLE, RANKED BY PRESSING COUNT. RETURNS master_id.
q REQUIRED · limit MAX 120 (DEFAULT 60) · cursor
https://everysong.site/api/v2/spine/album_search?q=views&limit=5&api_key=YOUR_KEY
GET /api/v2/spine/album
ONE ALBUM: METADATA, LABELS, GENRES, CREDITS, TRACKLIST WITH RIDS.
master_id REQUIRED
https://everysong.site/api/v2/spine/album?master_id=997631&api_key=YOUR_KEY
GET /api/v2/spine/artists
ARTIST NAME PREFIX SEARCH WITH SONG COUNTS. RETURNS an (THE ARTIST'S a_norm).
q · limit MAX 500 (DEFAULT 400) · cursor
https://everysong.site/api/v2/spine/artists?q=drake&limit=10&api_key=YOUR_KEY
GET /api/v2/spine/artist
FULL ARTIST VIEW: IDS, ENCYCLOPEDIA SUMMARY (WITH ITS CC BY-SA 4.0 ATTRIBUTION), SOCIALS, PRESS, RADIO, TOP SONGS, ALL SONGS, COLLABORATORS, WRITER CREDITS. UNCAPPED: A MAJOR ARTIST IS 1 MB+ AND CAN TAKE 30 S.
name OR a_norm
https://everysong.site/api/v2/spine/artist?name=Drake&api_key=YOUR_KEY
GET /api/v2/spine/artist_songs
AN ARTIST'S DISCOGRAPHY GROUPED BY ALBUM, WITH RIDS.
name OR a_norm · limit MAX 200 (DEFAULT 60) · cursor
https://everysong.site/api/v2/spine/artist_songs?name=Drake&limit=20&api_key=YOUR_KEY
GET /api/v2/spine/labels
LABEL HIERARCHY: ROOTS BIGGEST FIRST, OR A LABEL NAME SEARCH, OR A ROOT'S CHILDREN. RETURNS label_id AND root_id.
q · children_of · limit MAX 500 (DEFAULT 100) · cursor
https://everysong.site/api/v2/spine/labels?q=cash%20money&api_key=YOUR_KEY
GET /api/v2/spine/label_songs
ONE LABEL'S (OR LABEL GROUP'S) CATALOG.
label_id OR root_id · limit MAX 500 (DEFAULT 300) · cursor · a_norm · sort · dir
https://everysong.site/api/v2/spine/label_songs?label_id=19799&limit=20&api_key=YOUR_KEY
GET /api/v2/spine/label_artists
ONE LABEL'S ARTISTS, BIGGEST FIRST.
label_id OR root_id · limit MAX 500 (DEFAULT 400) · cursor
https://everysong.site/api/v2/spine/label_artists?label_id=19799&limit=20&api_key=YOUR_KEY
GET /api/v2/spine/label_albums
ONE LABEL'S ALBUMS, MOST-PRESSED FIRST.
label_id OR root_id · limit MAX 500 (DEFAULT 200) · cursor
https://everysong.site/api/v2/spine/label_albums?label_id=19799&limit=20&api_key=YOUR_KEY
GRAPH: /api/v2/graph
THE ARTIST GRAPH: 418K ARTISTS (470K NODES IN ALL, COUNTING LABELS, PLACES AND GENRES) AND ABOUT 4.5M CONNECTIONS, COUNTED AS DISTINCT CONNECTED PAIRS (COLLABORATIONS, COVERS, SAMPLES, CREDITS, MEMBERS, LABELS, PRESS). graph/stats COUNTS THE 9.2M DIRECTED EDGE ROWS BEHIND THEM; ONE PAIR CAN HAVE SEVERAL ROWS. ARTIST IDS ARE Q33240 (DRAKE) OR c:<UUID> FOR ARTISTS WITHOUT A Q ID; GET THEM FROM graph/search. press/in_publication IDS (pub:, blog:, wr:) ARE A SEPARATE KIND.
GET /api/v2/graph/search
ARTIST NAME SEARCH, ACCENT-INSENSITIVE. RETURNS UP TO 50 {id, name}.
q REQUIRED
https://everysong.site/api/v2/graph/search?q=drake&api_key=YOUR_KEY
[
{
"id": "Q33240",
"name": "Drake"
},
{
"id": "Q61679311",
"name": "Drakeo the Ruler"
},
{
"id": "Q110020181",
"name": "Drake Milligan"
},
{
"id": "c:dbbaf158-9542-439b-a039-46fece45bc7f",
"name": "Drake McCain"
},
"…"
]
GET /api/v2/graph/category_search
SEARCH ARTISTS, LABELS, WRITERS, PUBLICATIONS OR BLOGS (UP TO 1000 RESULTS).
q REQUIRED · cat artist | label | article | blogpost | writer | publication | blog | containers | all (DEFAULT)
https://everysong.site/api/v2/graph/category_search?cat=label&q=Cash%20Money&api_key=YOUR_KEY
GET /api/v2/graph/neighbors
EVERY CONNECTION OF ONE ARTIST, UNCAPPED, ONE ROW PER (NEIGHBOR, RELATIONSHIP). A MAJOR ARTIST IS ~250 KB AND ~10 S.
id REQUIRED · EXTRA LAYERS (=1): cooc SAME MIXTAPE · related RELATED ARTISTS · xw SHARED WRITER · docs PRESS + BLOG POSTS
https://everysong.site/api/v2/graph/neighbors?id=Q33240&api_key=YOUR_KEY
GET /api/v2/graph/pathfind
SHORTEST PATH BETWEEN TWO ARTISTS, WITH THE RELATIONSHIP AND THE SONG THAT LINKS EACH HOP.
from + to REQUIRED · max HOPS (MAX/DEFAULT 20) · rels COMMA-SEPARATED RELATIONSHIPS TO ALLOW
https://everysong.site/api/v2/graph/pathfind?from=Q33240&to=Q130798&api_key=YOUR_KEY
{
"hops": 1,
"path": [
{
"id": "Q33240",
"name": "Drake",
"streaming_id": "3TVXtAsR1Inumwj472S9r4"
},
{
"id": "Q130798",
"name": "Kendrick Lamar",
"streaming_id": "2YZyLoL8N0Wb9xBt1NhZWg",
"rel": "collaborated_with",
"source": "credits",
"via": "Marvins Room / Buried Alive Interlude"
}
]
}
GET /api/v2/graph/via
THE SONG THAT CONNECTS EACH PAIR OF ARTISTS.
pairs REQUIRED: ID:ID,ID:ID (MAX 400). Q IDS ONLY; PAIRS WITH OTHER IDS ARE SKIPPED
https://everysong.site/api/v2/graph/via?pairs=Q33240:Q130798&api_key=YOUR_KEY
GET /api/v2/graph/collaborators
EVERY ARTIST CO-CREDITED WITH ONE ARTIST, WITH SHARED-SONG COUNTS.
artist REQUIRED (ARTIST KEY, E.G. drake, lilwayne)
https://everysong.site/api/v2/graph/collaborators?artist=drake&api_key=YOUR_KEY
GET /api/v2/graph/shared_songs
SONGS TWO ARTISTS ARE BOTH CREDITED ON, MOST POPULAR FIRST.
artist + other REQUIRED (BOTH ARTIST KEYS)
https://everysong.site/api/v2/graph/shared_songs?artist=drake&other=rihanna&api_key=YOUR_KEY
GET /api/v2/graph/artist
ARTIST GENRES, FOLLOWERS AND PHOTO.
name REQUIRED
https://everysong.site/api/v2/graph/artist?name=Drake&api_key=YOUR_KEY
GET /api/v2/graph/bio
ENCYCLOPEDIA LEAD PARAGRAPH PLUS SOURCE URL, WITH license, license_url AND attribution (SEE LICENSES ABOVE). summary: null WHEN THERE IS NONE. ONLY Q IDS HAVE A SUMMARY; A c: ID ALWAYS RETURNS summary: null.
id REQUIRED (ARTIST ID)
https://everysong.site/api/v2/graph/bio?id=Q33240&api_key=YOUR_KEY
GET /api/v2/graph/stats
GRAPH TOTALS: NODES, EDGES, EDGES BY RELATIONSHIP.
NO PARAMETERS
https://everysong.site/api/v2/graph/stats?api_key=YOUR_KEY
SONGS: /api/v2/songs
HOW A SONG SOUNDS AND HOW IT CHARTED. BPM AND KEY ARE AUTOMATED ESTIMATES FROM AUDIO ANALYSIS: TEMPO CAN COME BACK AT HALF OR DOUBLE THE FELT TEMPO, AND KEY CAN BE THE RELATIVE OR A NEIGHBORING KEY.
GET /api/v2/songs/features
BPM, KEY, MODE, TIME SIGNATURE AND MATCH CONFIDENCE. features: null WHEN THERE IS NO CLEAN MATCH.
streaming_id REQUIRED
https://everysong.site/api/v2/songs/features?streaming_id=0wwPcA6wtMf6HUMpIRdeP7&api_key=YOUR_KEY
{
"id": "0wwPcA6wtMf6HUMpIRdeP7",
"features": {
"tempo": 134.966,
"key": 2,
"mode": 1,
"time_signature": 4,
"key_name": "D Major",
"conf": 0.8
}
}
KEY SPELLINGS (
songs/by_key AND
songs/pitch_match): A NOTE
A–
G, AN OPTIONAL
#,
b,
♯ OR
♭, THEN A MODE:
Major,
maj OR
M;
Minor,
min OR
m. CASE AND SPACES DO NOT MATTER EXCEPT FOR THE ONE-LETTER MODES (
M IS MAJOR,
m IS MINOR).
C# Minor,
c#m,
Dbmaj AND
f min ALL WORK. SHARPS ARE STORED AS FLATS, SO
F# Minor COMES BACK AS
Gb Minor. AN UNRECOGNIZED KEY RETURNS
400 WITH THE BAD VALUES AND THE 24 STORED SPELLINGS:
{
"error": "Unrecognized key: Zork. Use a note and a mode, such as C# Minor, Db Major, F#m or Ebmaj.",
"invalidKeys": ["Zork"],
"validKeys": ["C Major", "C Minor", "Db Major", "Db Minor", "…", "B Minor"]
}
GET /api/v2/songs/audio_features
THE FULL AUDIO-FEATURE SET FOR ONE RECORDING: DANCEABILITY, ENERGY, VALENCE, ACOUSTICNESS, INSTRUMENTALNESS, SPEECHINESS, LIVENESS (0–1), LOUDNESS (DB), TEMPO (BPM), KEY (0–11, C = 0), MODE (1 MAJOR, 0 MINOR), TIME SIGNATURE AND DURATION. A SEPARATE FIELD SET FROM songs/features, READ BY THE RECORDING'S OWN STREAMING ID; songs/features MATCHES BY ARTIST AND TITLE, SO ITS BPM AND KEY CAN DIFFER WHEN IT MATCHED ANOTHER VERSION. BY rid IT READS THE RECORDING'S MAIN STREAMING ID. ABOUT 81% OF RIDS HAVE FEATURES; features: null WHEN ABSENT.
rid OR streaming_id REQUIRED
https://everysong.site/api/v2/songs/audio_features?streaming_id=0wwPcA6wtMf6HUMpIRdeP7&api_key=YOUR_KEY
{
"rid": 3602,
"streaming_id": "0wwPcA6wtMf6HUMpIRdeP7",
"features": {
"duration_ms": 267067,
"time_signature": 4,
"tempo": 134.966,
"key": 2,
"mode": 1,
"danceability": 0.891,
"energy": 0.628,
"loudness": -7.863,
"speechiness": 0.0551,
"acousticness": 0.00258,
"instrumentalness": 0.00019,
"liveness": 0.0504,
"valence": 0.552,
"key_name": "D Major"
}
}
GET /api/v2/songs/by_key
FIND SONGS BY KEY AND BPM RANGE (AND TEXT), IN AN EXACT ORDER, AS DEEP AS YOU WANT. EVERY RESPONSE HOLDS THE NEXT ROWS OF THE ORDER YOU ASKED FOR AND, WHILE hasMore IS TRUE, A cursor. TO LOAD MORE, SEND THE SAME PARAMETERS PLUS cursor EXACTLY AS RECEIVED; THE ROWS CONTINUE WITH NO GAPS AND NO REPEATS. NOTHING IS CAPPED OR SAMPLED. EACH CALL DOES A BOUNDED AMOUNT OF WORK (ABOUT 1 S), SO A PAGE CAN HOLD FEWER ROWS THAN limit, OR NONE, WHILE hasMore IS TRUE: KEEP FOLLOWING THE CURSOR AND NEVER STOP ON A SHORT OR EMPTY PAGE. hasMore: false (WITH cursor: null) MEANS EVERY MATCH HAS BEEN RETURNED; THE LAST CALL CAN RETURN []. total APPEARS ONLY WHEN IT IS EXACT AND CHEAP: ON THE LAST PAGE, FOR A TEXT SEARCH WITH NO OTHER FILTER ONCE ITS MATCHES ARE LOADED, AND FOR SMALL RESULTS READ WHOLE; OTHERWISE IT IS LEFT OUT. THE BPM WINDOW IS WIDENED 0.5 ON EACH SIDE (bpmMin=134 STARTS AT 133.5); THE RESPONSE ECHOES IT AS bpmWindow.
ORDER. EVERY SORT ENDS WITH id, SO NO TWO ROWS TIE AND A CURSOR NEVER SKIPS OR REPEATS. artist / title: THE TEXT IGNORING CASE, THEN bpm, THEN id. bpm: bpm, id. key: KEY NAME, bpm, id. popularity, speechiness, instrumentalness: THE VALUE, THEN id. ALL OF THESE FOLLOW dir. time_signature: THE TIME SIGNATURE IN dir ORDER, THEN popularity DESCENDING, THEN id DESCENDING. CHANGED ON 2026-10-17: TIES IN popularity DESCENDING NOW BREAK BY id DESCENDING EVERYWHERE, AND TIES IN time_signature BREAK BY POPULARITY.
CURSOR RULES. THE CURSOR IS AN OPAQUE, SIGNED, URL-SAFE TOKEN (ABOUT 100 CHARACTERS). IT DOES NOT EXPIRE. IT BELONGS TO ONE QUERY: SENDING IT WITH DIFFERENT FILTERS, SORT OR DIRECTION RETURNS 400 cursor does not match this query; AN ALTERED CURSOR RETURNS 400 invalid cursor. limit MAY CHANGE FROM ONE CALL TO THE NEXT. page (0-BASED, WITHOUT A CURSOR) STILL WORKS: IT SKIPS page x limit ROWS AND ECHOES page. A DEEP PAGE WITH A RARE FILTER CAN COME BACK SHORT OR EMPTY WITH A CURSOR THAT CONTINUES THE SKIP; FOLLOW IT. FOR SCROLLING, USE THE CURSOR.
key KEY NAME, COMMA-SEPARATED (E.G. C Major OR Ab Minor,C Major; SEE KEY SPELLINGS BELOW) · bpmMin · bpmMax · q ARTIST OR TITLE TEXT · artist / title FIELD-SPECIFIC TEXT · popMin / popMax POPULARITY 0–100 · speechMin / speechMax SPEECHINESS 0–1 · instMin / instMax INSTRUMENTALNESS 0–1 · timeSig 0 | 1 | 3 | 4 | 5 | other (other = NOT 3, 4 OR 5) · alpha FIRST LETTER: A–Z, 0-9 OR SYM (ANY OTHER FIRST CHARACTER; EMPTY VALUES ARE EXCLUDED) · alphaField artist (DEFAULT) | title · sort artist (DEFAULT) | title | bpm | key | popularity | speechiness | instrumentalness | time_signature · dir asc | desc · cursor FROM THE PREVIOUS RESPONSE · limit 1–200 (DEFAULT 100) · page 0-BASED, OLD STYLE
https://everysong.site/api/v2/songs/by_key?key=D%20Major&bpmMin=134&bpmMax=136&q=drake&sort=popularity&dir=desc&limit=5&api_key=YOUR_KEY
{
"tracks": [
{
"id": 114408681,
"artist": "Drake",
"title": "Hotline Bling",
"bpm": 134.966,
"key": "D Major",
"popularity": 79,
"speechiness": 0.0551,
"instrumentalness": 0.00019,
"time_signature": 4
},
{
"id": 209748383,
"artist": "Drake",
"title": "Hotline Bling",
"bpm": 134.961,
"key": "D Major",
"popularity": 54,
"speechiness": 0.0548,
"instrumentalness": 0.000411,
"time_signature": 4
},
"…"
],
"limit": 5,
"hasMore": true,
"cursor": "eyJ2IjoxLCJoIjoiYWY1OGY3NWIwN2MwIiwicCI6InciLCJ0IjpbMzgsMTExNTY4ODk2XSwibyI6NX0.0k0oraNz8MavSi8K",
"bpmWindow": {
"min": 133.5,
"max": 136.5,
"tolerance": 0.5
}
}
THE NEXT 5 ROWS: THE SAME CALL PLUS THE CURSOR.
https://everysong.site/api/v2/songs/by_key?key=D%20Major&bpmMin=134&bpmMax=136&q=drake&sort=popularity&dir=desc&limit=5&cursor=eyJ2IjoxLCJoIjoiYWY1OGY3NWIwN2MwIiwicCI6InciLCJ0IjpbMzgsMTExNTY4ODk2XSwibyI6NX0.0k0oraNz8MavSi8K&api_key=YOUR_KEY
LOAD MORE / INFINITE SCROLL. KEEP THE LAST
cursor; WHEN THE USER NEARS THE END, CALL AGAIN WITH IT; APPEND
tracks; STOP ONLY WHEN
hasMore IS FALSE. IF A PAGE IS SHORT, CALL AGAIN AT ONCE WITH ITS CURSOR UNTIL YOU HAVE ENOUGH ROWS TO SHOW.
let cursor = null, rows = [];
do {
const u = new URL('https://everysong.site/api/v2/songs/by_key');
u.search = new URLSearchParams({ key: 'D Major', sort: 'popularity', dir: 'desc', limit: '200', ...(cursor ? { cursor } : {}) });
const r = await (await fetch(u, { headers: { 'x-api-key': KEY } })).json();
rows.push(...r.tracks);
cursor = r.cursor;
} while (cursor); // cursor is null only when hasMore is false
SEARCH STRATEGY (songs/by_key). TIMES WERE MEASURED ON THE SERVER ON 2026-10-17, limit=100 UNLESS NOTED, NOT COUNTING YOUR NETWORK, WHILE ANOTHER JOB WAS LOADING THE SAME DISK. EACH PAIR IS THE FIRST CALL, THEN THE SAME CALL AGAIN (DATA IN MEMORY).
1. HOW DEPTH WORKS. EACH SORT FOLLOWS ITS OWN INDEX IN EXACTLY THAT ORDER, ONE WALK PER KEY, MERGED INTO ONE LIST. THE CURSOR RECORDS WHERE THE WALK STOPPED, SO THE NEXT CALL STARTS THERE INSTEAD OF COUNTING FROM THE TOP: PAGE 50 COSTS ABOUT WHAT PAGE 1 COSTS. AFTER 10,000 ROWS (50 PAGES OF 200), THE NEXT PAGE TOOK 0.11 S (alpha=B&sort=artist), 0.26 S (key=D Major&sort=artist) AND 0.04 S (FOUR KEYS, sort=artist).
2. FASTEST PATTERNS (FULL PAGES). A KEY PLUS A BPM RANGE: 0.43 / 0.01 S SORTED BY popularity, 0.24 / 0.004 S BY bpm (key=D Major&bpmMin=134&bpmMax=136). A KEY ALONE: 0.22 / 0.01 S BY popularity, 0.14 / 0.005 S BY artist. NO KEY: popMin=60&sort=popularity 0.34 / 0.006 S. alpha WITH ANY SORT: alpha=B&sort=artist 0.42 / 0.01 S, alpha=B&sort=popularity 0.13 / 0.02 S, alpha=Q&sort=bpm 0.76 / 0.12 S, alpha=A&sort=title 0.52 / 0.15 S. A RARE RANGE IS READ WHOLE AND COMES WITH total: bpmMin=240&bpmMax=250&sort=popularity 0.32 / 0.005 S, total: 16365. speechMin=0.9&sort=speechiness&dir=desc 0.43 / 0.008 S; timeSig=5&key=C Major&sort=popularity 0.39 / 0.01 S; key=A Minor&sort=time_signature 0.22 / 0.004 S.
3. TEXT. A TEXT SEARCH (q, artist, title) RETURNS FULL PAGES IN EVERY SORT, WITH OR WITHOUT OTHER FILTERS, EXCEPT IN THE CASES LISTED AT THE END OF THIS SECTION. THE SONGS THAT MATCH ARE LOADED ONCE: EVERY WORD IN AT LEAST 50,000 SONGS AND EVERY TWO-WORD PHRASE OF PLAIN LETTERS AND DIGITS IN AT LEAST 50,000 SONGS (1,086) ARE SAVED AHEAD, A PHRASE OF COMMON WORDS IS READ FROM A PHRASE INDEX (PAIRS OF WORDS), AND NAMES AND RARER WORDS LOAD WITHIN THE FIRST CALL. UP TO 5M MATCHES ARE THEN SORTED ONCE IN THE ORDER YOU ASKED FOR, AND EACH NEXT PAGE IS READ FROM THAT LIST, WITH AN EXACT total. OVER 5M MATCHES (q=the, 29.9M; q=you, 6.7M), KEY, BPM, POPULARITY, SPEECHINESS, INSTRUMENTALNESS, timeSig AND alpha ARE TESTED ON EVERY MATCH FIRST, AND WHAT PASSES IS SORTED THE SAME WAY; WITHOUT FILTERS, OR WHEN MORE THAN 5M PASS, EACH SORT'S INDEX IS WALKED. FIRST CALL, THEN THE NEXT CALLS (MOSTLY THE TIME TO READ THE PAGE'S 100 ROWS): q=drake&sort=artist 0.27 / 0.07 S; q=love&sort=bpm (4,537,219) 0.63 / 0.12 S; q=xylophone&sort=title 0.13 / 0.10 S; artist=the rolling stones&sort=popularity&dir=desc 0.10 / 0.04 S; title=love song&sort=bpm 0.20 / 0.15 S. PHRASES OF COMMON WORDS, ASKED FOR THE FIRST TIME: q=to the&sort=popularity&dir=desc (691,437) 0.20 / 0.09 S; q=of the&sort=popularity&dir=desc (2,444,556) 0.35 / 0.09 S; q=in the&sort=title 0.79 / 0.12 S; q=on my&sort=artist 0.31 / 0.10 S; q=of love&sort=artist 0.75 / 0.11 S; q=i love you&sort=title 0.40 / 0.11 S; q=one more time&sort=artist 0.43 / 0.12 S. OVER 5M MATCHES WITH FILTERS: q=the&key=Db Major&bpmMin=90&bpmMax=90&sort=title&dir=desc (35,788 PASS) 0.67 / 0.11 S, 40 FULL PAGES IN A ROW; q=the&key=C Major&bpmMin=120&bpmMax=122&sort=artist 0.95 / 0.12 S; q=you&key=E Minor&bpmMin=100&bpmMax=101&popMin=20&sort=artist (147 PASS) ALL 147 IN TWO CALLS, 0.25 S; q=you&bpmMin=170&bpmMax=171&sort=popularity&dir=desc 0.50 / 0.13 S; q=a&timeSig=5&sort=bpm 0.93 / 0.13 S; q=in&alpha=K&sort=artist 1.10 / 0.10 S. artist AND title TOGETHER ARE LOADED AS TWO SETS (EACH SAVED AHEAD OR READ FROM THE PHRASE INDEX) AND INTERSECTED, AND A PHRASE IS MATCHED BY ITS WORDS AS THE INDEX STORES THEM (CASE, ACCENTS AND PUNCTUATION REMOVED, SO café del mar AND Cafe Del-Mar ARE THE SAME SEARCH). FIRST CALL, THEN THE NEXT CALLS, MEASURED 2026-10-18: artist=the beatles&title=love&sort=popularity (363) 0.41 / 0.01 S; artist=the rolling stones&title=love&sort=popularity&dir=desc 0.29 / 0.03 S; artist=the doors&title=the&sort=title 0.28 / 0.01 S; artist=the&title=you&sort=artist (512,734) 0.80 / 0.10 S; artist=los&title=amor&sort=popularity&dir=desc 0.17 / 0.09 S; q=café del mar&sort=popularity 0.29 / 0.01 S; q=mi corazón&sort=popularity 0.40 / 0.10 S; q=ça va&sort=bpm 0.14 / 0.14 S; q=я тебя&sort=popularity&dir=desc 0.33 / 0.12 S. WHEN A FIRST CALL CAN STILL RETURN FEWER ROWS ([] WITH A CURSOR; FOLLOW IT, THE NEXT CALL IS FULL): OVER 5M MATCHES WITH SPEECHINESS, INSTRUMENTALNESS, timeSig OR alpha WHILE THAT FILTER'S DATA IS NOT YET IN MEMORY (q=the&timeSig=3&sort=bpm: ONE EMPTY CALL OF 1.07 S, THEN 0.21 S); A PHRASE IN A SCRIPT WHOSE WORDS DO NOT REDUCE TO PLAIN LETTERS (CYRILLIC, GREEK, CJK AND OTHERS) WHOSE WORDS ARE EACH IN MILLIONS OF SONGS, WHICH LOADS FROM THE WORD INDEX AND CAN TAKE MORE THAN ONE CALL. NONE OF THE 94,954 TEST CALLS (TEXT, KEY AND PITCH-MATCH CHAINS) ON 2026-10-18 RETURNED 503 OR 504.
NO FILTER. A CALL WITH NO FILTER AT ALL (NO key, TEXT, BPM, POPULARITY, SPEECHINESS, INSTRUMENTALNESS, timeSig OR alpha) RETURNS NO ROWS BY DESIGN: {"tracks": [], "limit": 100, "hasMore": false, "cursor": null, "total": 0}. ADD AT LEAST ONE FILTER.
4. COMMA KEY LISTS. EACH KEY IS WALKED SEPARATELY AND MERGED EXACTLY INTO ONE SORTED LIST (NO key = ALL 24). FOUR KEYS (D Major,A Major,G Major,E Minor) VS ONE (D Major): 0.15 / 0.007 S VS 0.22 / 0.01 S SORTED BY POPULARITY; 0.42 / 0.006 S VS 0.29 / 0.006 S WITH bpmMin=120&bpmMax=130&sort=bpm; THE PAGE AFTER 10,000 ROWS BY artist: 0.04 S VS 0.26 S.
5. KEYS AND ERRORS. C#m, Db Minor, F#m, Dbmaj, f min AND Cbm ALL WORK (SEE KEY SPELLINGS ABOVE); key=f%23m&bpmMin=120&bpmMax=120.2 TOOK 0.004 S. 400 (UNDER 0.01 S): AN UNRECOGNIZED KEY (H Major), A NON-NUMERIC NUMBER (bpmMin=abc; ALSO bpmMax, popMin, popMax, speechMin, speechMax, instMin, instMax, timeSig), invalid cursor, OR cursor does not match this query. 503 WITH Retry-After: THE SEARCH QUEUE IS FULL (32 WAITING, OR A WAIT OVER 5 S); RETRY AFTER THE STATED SECONDS. 504: A CALL DID NOT FINISH 3 S AFTER IT STARTED. EACH CALL IS BOUNDED TO ABOUT 1 S OF WORK, SO THIS MEANS THE DISK STALLED OR ONE READ OF THE TEXT INDEX RAN LONG; RETRY THE SAME CALL (THE CURSOR STILL WORKS).
GET /api/v2/songs/pitch_match
SONGS THAT CAN BE PITCH-SHIFTED TO A TARGET KEY AND BPM, GROUPED BY SEMITONE SHIFT. THE TARGET TEMPO WINDOW IS WIDENED 0.5 BPM ON EACH SIDE (bpmMin=133&bpmMax=137 SEARCHES 132.5 TO 137.5 AFTER THE SHIFT) AND THEN CONVERTED TO EACH SOURCE KEY'S TEMPO. EACH GROUP RETURNS shift, sourceKey, sourceBpmMin / sourceBpmMax (THE WINDOW SEARCHED AT THE ORIGINAL TEMPO), targetKey, targetBpmMin / targetBpmMax (THE WIDENED TARGET WINDOW), tracks AND hasMore. ROWS ARE IN AN EXACT ORDER: CLOSEST TO THE CENTER OF THE WINDOW FIRST, THEN SONGS ABOVE THE CENTER BEFORE SONGS BELOW IT AT THE SAME DISTANCE, THEN BY id. THE RESPONSE HAS ONE cursor FOR ALL GROUPS; SEND THE SAME PARAMETERS PLUS THE CURSOR TO GET EACH GROUP'S NEXT ROWS, AND STOP WHEN THE TOP-LEVEL hasMore IS FALSE. A GROUP CAN COME BACK SHORT OR EMPTY WHILE ITS hasMore IS TRUE (EACH CALL DOES ABOUT 1 S OF WORK). WITHIN EACH PAGE OF A GROUP, COPIES OF THE SAME SONG (SAME ARTIST AND TITLE, IGNORING CASE, ACCENTS AND PUNCTUATION) ARE COLLAPSED TO THE CLOSEST ONE; A COPY CAN APPEAR AGAIN ON A LATER PAGE. dedupe=0 KEEPS EVERY COPY. MEASURED 2026-10-17 ON THE SERVER: THE EXAMPLE BELOW 0.05 S, ITS NEXT PAGE 0.03 S.
key REQUIRED, ONE KEY · bpmMin REQUIRED (OR bpmMax) · bpmMax · range SEMITONES 1–10 (DEFAULT 3) · limit PER SHIFT, 1–50 (DEFAULT 10) · q TEXT FILTER · popMin · speechMax · instMin · timeSig · dedupe 1 (DEFAULT) | 0 · cursor
https://everysong.site/api/v2/songs/pitch_match?key=D%20Major&bpmMin=133&bpmMax=137&range=2&limit=5&api_key=YOUR_KEY
GET /api/v2/songs/charts
CHART RUNS, CERTIFICATIONS AND BPM/KEY FOR ONE SONG. MATCHING USES EXACT ARTIST + TITLE STRINGS.
artist + title REQUIRED
https://everysong.site/api/v2/songs/charts?artist=Drake&title=Hotline%20Bling&api_key=YOUR_KEY
GET /api/v2/songs/charted
THE CHARTED LIBRARY (~188K SONGS), ONE ROW PER RECORDING, SORTED.
sort pop (DEFAULT) | year | artist | title · desc=1 · off OFFSET · limit MAX 500 (DEFAULT 300) · artist EXACT ARTIST
https://everysong.site/api/v2/songs/charted?sort=year&limit=20&api_key=YOUR_KEY
GET /api/v2/songs/charted_artists
EVERY CHARTED ARTIST WITH SONG COUNT. NOT PAGED: ~1 MB, ~10 S.
NO PARAMETERS
https://everysong.site/api/v2/songs/charted_artists?api_key=YOUR_KEY
GET /api/v2/songs/meta
ALBUM, LABEL, UPC, COPYRIGHTS, ARTISTS, GENRES.
streaming_id, OR artist + title
https://everysong.site/api/v2/songs/meta?streaming_id=0wwPcA6wtMf6HUMpIRdeP7&api_key=YOUR_KEY
GET /api/v2/songs/spectrogram
SPECTROGRAM IMAGE (PNG, 800×400) OF A 30-SECOND PREVIEW OF ONE RECORDING. FIRST CALL FOR A SONG CAN TAKE A FEW SECONDS; CACHED AFTER.
rid REQUIRED
https://everysong.site/api/v2/songs/spectrogram?rid=3602&api_key=YOUR_KEY
GET /api/v2/songs/card
ONE BATCHED CARD: BPM/KEY, MIXTAPES, SAMPLES, WRITERS. PARTS SLOWER THAN 9 S COME BACK null.
artist + title REQUIRED
https://everysong.site/api/v2/songs/card?artist=Drake&title=Hotline%20Bling&api_key=YOUR_KEY
PRESS: /api/v2/press
MUSIC JOURNALISM: ARTICLES, WRITERS, PUBLICATIONS AND ARCHIVED MAGAZINES. PAGED LISTS RETURN 60 ROWS AND A nextPage.
GET /api/v2/press/song
ARTICLES AND BLOG POSTS ABOUT ONE SONG.
artist + title REQUIRED
https://everysong.site/api/v2/press/song?artist=Drake&title=Hotline%20Bling&api_key=YOUR_KEY
GET /api/v2/press/artist
ARTICLES AND BLOG POSTS NAMING AN ARTIST (MAX 24).
name REQUIRED
https://everysong.site/api/v2/press/artist?name=Drake&api_key=YOUR_KEY
GET /api/v2/press/article
ONE ARTICLE: TITLE, PUBLICATION, WORD COUNT, IMAGE LINK AND URL. ARTICLE TEXT IS NOT SERVED; FOLLOW url TO READ IT.
url REQUIRED (EXACT ARTICLE URL, FROM press/song, press/search OR press/article_urls)
https://everysong.site/api/v2/press/article?url=https%3A%2F%2Fwww.thefader.com%2F2023%2F10%2F06%2Fhow-drakes-remix-run-made-him-inescapable&api_key=YOUR_KEY
GET /api/v2/press/article_urls
PRESS REFS FROM spine/brief TO ARTICLE URLS.
refs REQUIRED, COMMA-SEPARATED (FROM spine/brief → presence.press[].ref, MAX 1000)
https://everysong.site/api/v2/press/article_urls?refs=9347,9528&api_key=YOUR_KEY
GET /api/v2/press/search
ARTICLE SEARCH, NEWEST FIRST.
q REQUIRED · offset (60 PER PAGE)
https://everysong.site/api/v2/press/search?q=hotline%20bling&api_key=YOUR_KEY
{
"results": [
{
"title": "Dave Grohl and Greg Kurstin Cover Drake’s “Hotline Bling”: Watch",
"pub": "Consequence",
"url": "https://consequence.net/2020/12/dave-grohl-and-greg-kurstin-drake-hotline-bling-watch/",
"published": "2020-12-12",
"writer": "Alex Young"
},
"…"
]
}
GET /api/v2/press/latest
NEWEST ARTICLES.
offset (60 PER PAGE)
https://everysong.site/api/v2/press/latest?api_key=YOUR_KEY
GET /api/v2/press/in_publication
SEARCH INSIDE ONE PUBLICATION, BLOG OR WRITER.
id REQUIRED (pub:NAME, blog:NAME OR wr:ID, FROM graph/category_search) · q REQUIRED
https://everysong.site/api/v2/press/in_publication?id=pub:The%20Fader&q=hotline%20bling&api_key=YOUR_KEY
GET /api/v2/press/writers
MUSIC WRITERS WITH ARTICLE AND PUBLICATION COUNTS.
q NAME
https://everysong.site/api/v2/press/writers?q=sasha&api_key=YOUR_KEY
GET /api/v2/press/writer
ONE WRITER'S ARTICLES, NEWEST FIRST.
id REQUIRED (FROM press/writers) · page · pub ONE PUBLICATION · q TITLE SEARCH
https://everysong.site/api/v2/press/writer?id=44&api_key=YOUR_KEY
GET /api/v2/press/publications
PUBLICATIONS WITH ARTICLE AND WRITER COUNTS.
NO PARAMETERS
https://everysong.site/api/v2/press/publications?api_key=YOUR_KEY
GET /api/v2/press/publication
ONE PUBLICATION'S ARTICLES, NEWEST FIRST.
name REQUIRED (FROM press/publications) · page · writer · q TITLE SEARCH
https://everysong.site/api/v2/press/publication?name=The%20Fader&api_key=YOUR_KEY
GET /api/v2/press/archive
ARCHIVED MAGAZINE AND NEWSPAPER ARTICLES BY TITLE OR AUTHOR, NEWEST FIRST, WITH ARCHIVE LINKS. EVERY MATCH UNLESS limit IS SET.
q REQUIRED · type magazine (DEFAULT) | newspaper · limit
https://everysong.site/api/v2/press/archive?q=drake&api_key=YOUR_KEY
BLOGS: /api/v2/blogs
MUSIC BLOGS AND WHAT THEY POSTED. PAGED FEEDS RETURN 40 ROWS AND A nextPage.
GET /api/v2/blogs/list
EVERY INDEXED BLOG.
q NAME FILTER
https://everysong.site/api/v2/blogs/list?api_key=YOUR_KEY
GET /api/v2/blogs/posts
ONE BLOG'S POSTS.
id REQUIRED (FROM blogs/list) · page · q FILTER
https://everysong.site/api/v2/blogs/posts?id=nahright&api_key=YOUR_KEY
GET /api/v2/blogs/trending
TRACKS BLOGS ARE POSTING NOW, OR A TRACK SEARCH.
q SEARCH (OMIT FOR TRENDING) · mode now (DEFAULT) | lastweek · count MAX 40
https://everysong.site/api/v2/blogs/trending?q=drake&api_key=YOUR_KEY
GET /api/v2/blogs/curators
BLOGS THAT CURATE TRACKS, WITH POST AND FOLLOWER COUNTS.
q NAME FILTER
https://everysong.site/api/v2/blogs/curators?api_key=YOUR_KEY
GET /api/v2/blogs/curator
ONE CURATOR'S POSTS.
id REQUIRED (FROM blogs/curators) · page
https://everysong.site/api/v2/blogs/curator?id=1&api_key=YOUR_KEY
GET /api/v2/blogs/genres
GENRE TAGS.
q FILTER
https://everysong.site/api/v2/blogs/genres?api_key=YOUR_KEY
GET /api/v2/blogs/genre
ONE GENRE'S FEED.
tag REQUIRED (FROM blogs/genres) · page
https://everysong.site/api/v2/blogs/genre?tag=electronic&api_key=YOUR_KEY