Guide

Spotify play count API: lifetime streams for any track, by id or ISRC

Spotify's Web API never says how many times a track has been played. The closest it comes is popularity, a 0–100 score its own reference describes as based mostly on total plays, and marks deprecated. These endpoints return the count itself: one track by Spotify id or ISRC, or up to 50 tracks in one call.

By Eduardo Airaudo, maintainer of the API · Updated 22 October 2026

What the official track object leaves out

GET /v1/tracks/{id} on the Spotify Web API returns the album, the artists, duration_ms, explicit, external_ids, the name, popularity and a handful more. None of them counts plays. Popularity comes nearest: Spotify's reference gives it as a value from 0 to 100, calculated mostly from how many plays a track has had and how recent they are, and marks it deprecated. Spotify's February 2026 changes removed it for development-mode apps created from 11 February 2026.

A score cannot do what a count does. It is relative, so it does not add up across an album or a catalogue, and it favours recent plays — the same reference says songs played a lot now score higher than songs played a lot in the past — so it cannot say how many times a track has ever been played.

In the spec's words, this API's Partner group is “Spotify's internal (pathfinder) data, including play counts”. /partner/track/count returns the lifetime count of one track, /partner/tracks/count of up to 50 tracks at once, and /partner/track carries it inside the full track record.

What comes back

Field by field, as the spec's response schemas define them. The single-track call names the count streams; the batch names it playcount.

One track

GET /partner/track/count

streams
The lifetime play count, as an integer (int64). Nullable in the spec, and 0 for a track under 1,000 plays.
spotify_track_id
The track's Spotify id.
isrc
The track's ISRC. Nullable in the spec.
result
success or error, with a short message beside it.

A batch

GET /partner/tracks/count

tracks[]
One entry per requested id, in request order.
tracks[].playcount
Lifetime plays (int64, nullable); 0 for a track under 1,000.
tracks[].status
ok, not_found or error, with an error text when it is error.
tracks[].name
The track's name; null when it was not found.
tracks[].artists[]
Each artist's id and name.
tracks[].releaseDate
The release date of the track's album: YYYY-MM-DD, or a coarser precision.
missing[]
The requested ids whose status is not ok.

A 0 means under 1,000, not never played. The spec says Spotify reports 0 for tracks with fewer than 1,000 plays, so store a 0 as "below 1,000" rather than as a count.

Recorded sample · captured 2026-10-22

GET /partner/track/count

6 lines — the whole recorded body.

Recorded sample · captured 2026-10-22

GET /partner/tracks/count

18 lines — the whole recorded body.

One track, or 50 per call

  • GET /partner/track/countTrack play count

    Lifetime play count of one track, by Spotify id (spotify_track_id, or its alias id) or by isrc. Spotify reports 0 for tracks with fewer than 1,000 plays. Play counts are cached for 1 hour; for many tracks use /partner/tracks/count.

    Paramsspotify_track_id, id, isrc, cache

  • GET /partner/tracks/countTrack play counts (batch)

    Lifetime play counts for up to 50 tracks in one call. Entries come back in request order with status ok, not_found or error; ids without a play count are also listed in missing. Each id is cached for 1 hour.

    Paramsids, cache

  • GET /partner/trackPartner track data

    Track with its play count (data.trackUnion.playcount), album, artists and content ratings. Add slim=1 to keep only {id, uri, profile.name, visuals.avatarImage} of each artist (the full payload embeds the first artist's discography and is ~100 KB).

    Paramsid, slim, cache

/partner/tracks/count takes up to 50 comma-separated ids and answers in the order you sent them, so 50 tracks cost one request rather than 50.

Fetch play counts

One track, by Spotify id

The id is the 22-character string after /track/ in any Spotify URL. To look a track up by its ISRC, send isrc= in place of id=.

Up to 50 tracks in one call

Read each entry's status before its count. Entries come back in the order of the ids; one with no play count is marked not_found or error in its place, and listed again in missing.

Play counts without code

If the counts are for a spreadsheet rather than for your own code, two Apify actors from the same maintainer return them as a dataset. A run needs an Apify account and no API key: you paste links and download JSON or CSV.

Both bill per result, at the prices listed on : $0.001 a row on Apify's free plan, down to $0.0006 from Gold up. When a run beats a key, and when it does not, is on the scraper guide.

Questions

Does the Spotify Web API return play counts?

No. The track object in the Web API reference has no play count field. Its nearest field, popularity, is a 0–100 score Spotify calculates mostly from total plays and how recent they are; the reference marks it deprecated, and Spotify's February 2026 changes removed it for development-mode apps created from 11 February 2026.

Why does a track show 0 plays?

Because it has fewer than 1,000. The spec says Spotify reports 0 for tracks with fewer than 1,000 plays, so a 0 means below 1,000, not never played.

Can I get play counts for many tracks at once?

Yes. GET /partner/tracks/count takes up to 50 comma-separated track ids and answers in request order, each entry with a status of ok, not_found or error; ids without a play count are listed in missing as well. 50 tracks cost one request rather than 50.

Can I look a track up by ISRC?

Yes. GET /partner/track/count takes isrc in place of a Spotify id, so a catalogue keyed by ISRC needs no id lookup first.

How current is the number?

Play counts are cached for an hour, so a count is typically at most that old. An X-Cache value starting with STALE or FALLBACK means an older copy was served because the live fetch was slow or failed; X-Cache-Stale-Age gives its age in seconds. Add cache=false to fetch a fresh one. The Run buttons on this site go through the demo's own cache as well, so a figure there can be older.

Can I get play counts without writing code?

Yes, on Apify: a run needs an Apify account and no API key. The Spotify Play Count Scraper (eduair94/spotify-play-count-scraper) takes track, album, artist or playlist links and returns one row per track with its play count; the Spotify Scraper (eduair94/spotify-scraper) has 5 play-count categories among its 61. Both bill per result.

Which plan do I need?

Any. Both play-count endpoints are on every plan, RapidAPI and the direct portal alike, and the plans differ by monthly volume. Every RapidAPI plan allows 5 requests per second and every direct key includes 10. RapidAPI's free plan allows 1,000 requests a month.

Sources

What changed in the API and on these pages, and when: What's new.

Get a key and pull your first play count

Both play-count endpoints are on every plan, RapidAPI and the direct portal alike; on Apify, the two actors above return the same counts as dataset rows, billed per result. RapidAPI's free tier is 1,000 requests a month: at up to 50 tracks a call, up to 50,000 play counts.