Apple Music Album API. Send an album link or ID.
Tracklist with ISRCs, label and UPC. We handle the proxies, blocks and platform changes.
Apple Music Album API at a glance
Returns an Apple Music album, single or EP from its link or ID in any country's store, with every track's ISRC, the label, UPC and genres. It also has the credited artists, full-size cover, release date, copyright, Apple's editorial notes, audio formats, each track's length and preview, more releases by the artist and the album's other versions. Legacy iTunes links work too.
GET /v1/applemusic/album
- 1 credit per request, $0.75–$1.97 per 1,000 requests
- 20 typed fields null when unknown
urlis all it needs, e.g.https://music.apple.com/us/album/lover/1468058165- 100 credits free when you sign up, no card, so you can build before you spend
Send one request. Get 20 fields back.
Copy the request in your language, or hand it to your agent. Sign up for an API key and your first 100 credits are free.
$ npm install socialtapurl = https://music.apple.com/us/album/lover/1468058165const params = new URLSearchParams({
url: "https://music.apple.com/us/album/lover/1468058165",
});
const res = await fetch(`https://socialtap.dev/v1/applemusic/album?${params}`, {
headers: { "x-api-key": process.env.SOCIALTAP_API_KEY ?? "" },
});
const body = await res.json();
if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
const { data, meta } = body;
console.log(data, meta.credits_charged);import os
import requests
res = requests.get(
"https://socialtap.dev/v1/applemusic/album",
params={"url": "https://music.apple.com/us/album/lover/1468058165"},
headers={"x-api-key": os.environ["SOCIALTAP_API_KEY"]},
)
body = res.json()
if not res.ok:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
data, meta = body["data"], body["meta"]
print(data, meta["credits_charged"])require "json"
require "net/http"
uri = URI("https://socialtap.dev/v1/applemusic/album")
uri.query = URI.encode_www_form('url' => 'https://music.apple.com/us/album/lover/1468058165')
req = Net::HTTP::Get.new(uri)
req["x-api-key"] = ENV.fetch("SOCIALTAP_API_KEY")
res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") { |http| http.request(req) }
body = JSON.parse(res.body)
raise "#{body["error"]["code"]}: #{body["error"]["message"]}" unless res.is_a?(Net::HTTPSuccess)
pp body["data"]
puts body["meta"]["credits_charged"]<?php
$query = http_build_query([
'url' => 'https://music.apple.com/us/album/lover/1468058165',
]);
$ch = curl_init('https://socialtap.dev/v1/applemusic/album?' . $query);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['x-api-key: ' . getenv('SOCIALTAP_API_KEY')],
]);
$body = json_decode(curl_exec($ch), true);
if (curl_getinfo($ch, CURLINFO_RESPONSE_CODE) >= 400) {
throw new RuntimeException($body['error']['code'] . ': ' . $body['error']['message']);
}
print_r($body['data']);
echo $body['meta']['credits_charged'], PHP_EOL;package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"net/url"
"os"
)
func main() {
q := url.Values{}
q.Set("url", "https://music.apple.com/us/album/lover/1468058165")
req, err := http.NewRequest("GET", "https://socialtap.dev/v1/applemusic/album?"+q.Encode(), nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("x-api-key", os.Getenv("SOCIALTAP_API_KEY"))
res, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer res.Body.Close()
var body struct {
Data json.RawMessage `json:"data"`
Meta map[string]any `json:"meta"`
Error *struct {
Code string `json:"code"`
Message string `json:"message"`
} `json:"error"`
}
if err := json.NewDecoder(res.Body).Decode(&body); err != nil {
log.Fatal(err)
}
if body.Error != nil {
log.Fatalf("%s: %s", body.Error.Code, body.Error.Message)
}
fmt.Println(string(body.Data), body.Meta["credits_charged"])
}curl -G 'https://socialtap.dev/v1/applemusic/album' \
--data-urlencode 'url=https://music.apple.com/us/album/lover/1468058165' \
-H "x-api-key: $SOCIALTAP_API_KEY"{
"data": {
"approximate_fields": [
"released_at"
],
"artist_name": "Taylor Swift",
"artists": [
{
"avatar_url": "https://is1-ssl.mzstatic.com/image/thumb/AMCArtistImages221/v4/6d/67/88/6d67888b-9e7f-53af-7853-0f91d6fd2332/ami_U003aidentity_U003a994af5c375f4c3aa96cd6ced4a700799-2026-09-25T04-00-05.358Z_cropped.png/1640x1640bb.jpg",
"display_name": "Taylor Swift",
"id": "159260351",
"is_verified": null,
"url": "https://music.apple.com/us/artist/taylor-swift/159260351",
"username": null
}
],
"copyrights": [
{
"text": "℗ 2019 Taylor Swift",
"type": "p"
}
],
"cover_url": "https://is1-ssl.mzstatic.com/image/thumb/Music125/v4/49/3d/ab/493dab54-f920-9043-6181-80993b8116c9/19UMGIM53909.rgb.jpg/3900x3900bb.jpg",
"description": "There’s a reason Taylor Swift sounds so confident and cool on Lover, her seventh album and the most free-spirited yet. She’s in love—pure, steady, starry-eyed, shout-it-from-the-rooftops love. Arriving 13 years after her eponymous debut album—and following a string of songs that …",
"duration_ms": 3711368,
"genres": [
"Pop"
],
"id": "1468058165",
"is_explicit": false,
"label": "Taylor Swift",
"metrics": {
"track_count": 18
},
"platform": "applemusic",
"platform_specific": {
"applemusic": {
"audio_traits": [
"atmos",
"lossless",
"lossy-stereo"
],
"content_rating": null,
"editorial_summary": "A love letter to love itself.",
"is_complete": true,
"is_mastered_for_itunes": true,
"is_prerelease": false,
"more_by_artist": [
{
"artist_name": "Taylor Swift",
"cover_url": "https://is1-ssl.mzstatic.com/image/thumb/Music221/v4/eb/e6/06/ebe606da-e00f-82d3-47f3-b79904eed541/17UM1IM24651.rgb.jpg/6000x6000bb.jpg",
"duration_ms": null,
"id": "1440933849",
"is_explicit": false,
"kind": "album",
"released_at": "2017-11-10T00:00:00Z",
"title": "reputation",
"track_count": 15,
"url": "https://music.apple.com/us/album/reputation/1440933849"
},
{
"artist_name": "Taylor Swift",
"cover_url": "https://is1-ssl.mzstatic.com/image/thumb/Music221/v4/a4/86/59/a486593a-53c9-1c2a-5122-8f25339f7359/24UMGIM44778.rgb.jpg/3000x3000bb.jpg",
"duration_ms": null,
"id": "1742057774",
"is_explicit": true,
"kind": "album",
"released_at": "2024-04-19T00:00:00Z",
"title": "THE TORTURED POETS DEPARTMENT: THE ANTHOLOGY",
"track_count": 31,
"url": "https://music.apple.com/us/album/the-tortured-poets-department-the-anthology/1742057774"
},
{
"artist_name": "Taylor Swift",
"cover_url": "https://is1-ssl.mzstatic.com/image/thumb/Music115/v4/b5/80/dc/b580dca0-349d-036b-e09b-bd849f6affd8/20UMGIM64216.rgb.jpg/3000x3000bb.jpg",
"duration_ms": null,
"id": "1528112358",
"is_explicit": true,
"kind": "album",
"released_at": "2020-07-24T00:00:00Z",
"title": "folklore (deluxe version)",
"track_count": 17,
"url": "https://music.apple.com/us/album/folklore-deluxe-version/1528112358"
}
],
"other_versions": [],
"rank": null,
"storefront": "us"
}
},
"released_at": "2019-08-23T00:00:00Z",
"title": "Lover",
"tracks": [
{
"artist_name": "Taylor Swift",
"artists": [
{
"avatar_url": "https://is1-ssl.mzstatic.com/image/thumb/AMCArtistImages221/v4/6d/67/88/6d67888b-9e7f-53af-7853-0f91d6fd2332/ami_U003aidentity_U003a994af5c375f4c3aa96cd6ced4a700799-2026-09-25T04-00-05.358Z_cropped.png/1640x1640bb.jpg",
"display_name": "Taylor Swift",
"id": "159260351",
"is_verified": null,
"url": "https://music.apple.com/us/artist/taylor-swift/159260351",
"username": null
}
],
"disc_number": 1,
"duration_ms": 170651,
"id": "1468058169",
"is_explicit": false,
"isrc": "USUG11901471",
"metrics": {
"view_count": null
},
"play_url": "https://audio-ssl.itunes.apple.com/itunes-assets/AudioPreview221/v4/9c/e2/97/9ce2976a-b1c8-aa80-3e94-f4562cbad53e/mzaf_13898706762824220632.plus.aac.ep.m4a",
"title": "I Forgot That You Existed",
"track_number": 1,
"url": "https://music.apple.com/us/album/i-forgot-that-you-existed/1468058165?i=1468058169"
},
{
"artist_name": "Taylor Swift",
"artists": [
{
"avatar_url": "https://is1-ssl.mzstatic.com/image/thumb/AMCArtistImages221/v4/6d/67/88/6d67888b-9e7f-53af-7853-0f91d6fd2332/ami_U003aidentity_U003a994af5c375f4c3aa96cd6ced4a700799-2026-09-25T04-00-05.358Z_cropped.png/1640x1640bb.jpg",
"display_name": "Taylor Swift",
"id": "159260351",
"is_verified": null,
"url": "https://music.apple.com/us/artist/taylor-swift/159260351",
"username": null
}
],
"disc_number": 1,
"duration_ms": 178426,
"id": "1468058171",
"is_explicit": false,
"isrc": "USUG11901472",
"metrics": {
"view_count": null
},
"play_url": "https://audio-ssl.itunes.apple.com/itunes-assets/AudioPreview221/v4/44/af/81/44af8168-9609-1b85-5048-ada08dceacf3/mzaf_5595361395314573470.plus.aac.ep.m4a",
"title": "Cruel Summer",
"track_number": 2,
"url": "https://music.apple.com/us/album/cruel-summer/1468058165?i=1468058171"
},
{
"artist_name": "Taylor Swift",
"artists": [
{
"avatar_url": "https://is1-ssl.mzstatic.com/image/thumb/AMCArtistImages221/v4/6d/67/88/6d67888b-9e7f-53af-7853-0f91d6fd2332/ami_U003aidentity_U003a994af5c375f4c3aa96cd6ced4a700799-2026-09-25T04-00-05.358Z_cropped.png/1640x1640bb.jpg",
"display_name": "Taylor Swift",
"id": "159260351",
"is_verified": null,
"url": "https://music.apple.com/us/artist/taylor-swift/159260351",
"username": null
}
],
"disc_number": 1,
"duration_ms": 221300,
"id": "1468058173",
"is_explicit": false,
"isrc": "USUG11901473",
"metrics": {
"view_count": null
},
"play_url": "https://audio-ssl.itunes.apple.com/itunes-assets/AudioPreview211/v4/e0/db/47/e0db47b0-7f70-0631-0414-cd4777d2fb3e/mzaf_6008069204816798831.plus.aac.ep.m4a",
"title": "Lover",
"track_number": 3,
"url": "https://music.apple.com/us/album/lover/1468058165?i=1468058173"
}
],
"type": "album",
"unknown_fields": [],
"upc": "00602508005275",
"url": "https://music.apple.com/us/album/lover/1468058165"
},
"meta": {
"request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
"platform": "applemusic",
"source": "api",
"is_cached": false,
"credits_charged": 1,
"latency_ms": 334,
"fetched_at": "2026-10-25T12:00:00Z",
"input": {
"kind": "album",
"id": "1468058165",
"url": "https://music.apple.com/us/album/lover/1468058165"
},
"credits_remaining": 9999,
"client_request_id": null,
"warnings": []
}
}import { SocialTap } from "socialtap";
const client = new SocialTap(); // apiKey defaults to process.env.SOCIALTAP_API_KEY
const res = await client.applemusic.album.get({ url: "https://music.apple.com/us/album/lover/1468058165" });
console.log(res.data);
console.log(res.credits.charged, res.meta.request_id);import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
public class Main {
public static void main(String[] args) throws Exception {
String query = "url=" + encode("https://music.apple.com/us/album/lover/1468058165");
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://socialtap.dev/v1/applemusic/album?" + query))
.header("x-api-key", System.getenv("SOCIALTAP_API_KEY"))
.GET()
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
// An error is {"error": {"code", "message", ...}}; success is {data, meta}, meta.credits_charged its price.
if (response.statusCode() >= 400) throw new RuntimeException(response.body());
System.out.println(response.body());
}
static String encode(String value) {
return URLEncoder.encode(value, StandardCharsets.UTF_8);
}
}using System.Text.Json;
using var http = new HttpClient();
http.DefaultRequestHeaders.Add("x-api-key", Environment.GetEnvironmentVariable("SOCIALTAP_API_KEY"));
var query = string.Join("&",
"url=" + Uri.EscapeDataString("https://music.apple.com/us/album/lover/1468058165"));
var res = await http.GetAsync("https://socialtap.dev/v1/applemusic/album?" + query);
using var body = JsonDocument.Parse(await res.Content.ReadAsStringAsync());
if (!res.IsSuccessStatusCode)
{
var error = body.RootElement.GetProperty("error");
throw new Exception($"{error.GetProperty("code")}: {error.GetProperty("message")}");
}
Console.WriteLine(body.RootElement.GetProperty("data"));
Console.WriteLine(body.RootElement.GetProperty("meta").GetProperty("credits_charged"));// Cargo.toml: reqwest = { version = "0.12", features = ["blocking", "json"] }, serde_json = "1"
use std::env;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let res = reqwest::blocking::Client::new()
.get("https://socialtap.dev/v1/applemusic/album")
.query(&[("url", "https://music.apple.com/us/album/lover/1468058165")])
.header("x-api-key", env::var("SOCIALTAP_API_KEY")?)
.send()?;
let ok = res.status().is_success();
let body: serde_json::Value = res.json()?;
if !ok {
return Err(format!("{}: {}", body["error"]["code"], body["error"]["message"]).into());
}
println!("{} {}", body["data"], body["meta"]["credits_charged"]);
Ok(())
}200 OK · GET https://socialtap.dev/v1/applemusic/albumLong arrays and strings are shortened here. Real responses are complete.Docs One schema on 2 platforms.
The response reference lists every field, its type and when it is null. See the full schema.
Null means unknown
A field Apple Music doesn't show is null, never zero or an empty string, so a real zero always means zero.
What it accepts
The album: its link (music.apple.com/us/album/lover/1468058165), with or without the slug and the store, on music.apple.com, geo.music.apple.com or itunes.apple.com; or its ID alone (1468058165).
Write one parser
Apple Music and Spotify answer in these fields, so the code that reads one reads them all.
platformstring- Platform ID (applemusic, spotify, soundcloud, …).
idstring- Platform-native album ID (string), the one in its page's URL.
urlstring- Canonical album page URL.
typestring- What kind of release it is, as the platform says: album, single, ep or compilation; null when the platform does not say. New values may be added; treat unknown values as album.
titlestring- The release's title as the platform shows it (with an edition or a suffix like "- Single" where it writes one).
descriptionstring- About the release, as plain text (the service's editorial notes, or what its uploader wrote); null when it has none or the platform shows none.
artist_namestring- Who the platform credits for the release, as one display string (it can name more people than have an account linked: artists holds the linked ones); null when the source does not name them.
artistsobject[]- The platform accounts of the artists credited on the release, main artist first, in the platform's order; [] when none is linked, as on a Various Artists compilation (listed in unknown_fields when the source cannot see them).
Live data from 33 platforms.
What teams build with the Apple Music Album API.
Turn an album link into UPC and tracklist
Match releases across services by UPC
Compare a tracklist across country stores
Find an album's clean and explicit versions
Good to know before you build.
- Stores differ: an album can be missing from one or list other tracks or have another language's title, and some releases have a different ID per store. The answer comes from the store in country, else the link's store, else us, and platform_specific.applemusic.storefront says which.
- metrics.track_count is the whole release as Apple states it. tracks holds fewer only when it is listed in approximate_fields: a box set too long to read whole, or one whose later pages failed (with a partial_data warning).
- duration_ms is the sum of the tracks, so it is null when tracks is partial or Apple states no length for one of them, as on a release not out yet.
- The ID of an edition Apple has replaced still answers, with the id and url of the current album its page shows.
- A compilation credited to Various Artists has that name in artist_name, in the store's language, and artists [], and each of its tracks names its own artists.
- released_at is the release date with no time, at midnight UTC, listed in approximate_fields. play_url is Apple's short preview, never the whole track, and tracks[].metrics.view_count is null because Apple Music shows no play counts.
- When Apple's catalog API fails, the answer comes from its public lookup API: label, upc, description, editorial_summary, is_complete, is_prerelease, is_mastered_for_itunes and tracks[].isrc are null, audio_traits, more_by_artist and other_versions are [], tracks can skip music videos and stops at the lookup's limit, and tracks[].artists is unknown (all listed in unknown_fields or approximate_fields).
- From the lookup API, type is null unless the title says single or EP, genres holds the main genre only, and a request with lang fails rather than answer in another language.
1 credit per request. Failed requests are free.
Buy credits once and spend them on any endpoint, on any platform.
| Source | Price per successful request | Per 1,000 requests |
|---|---|---|
Platform API api | 1 credit | $0.75–$1.97 |
- Cache hits are free.
- Credits from packs and top-ups never expire.
- A monthly plan's credits are spent first, and what is left of them ends at each renewal.
- Prices exclude tax: sales tax is added at checkout where it applies.
- Outside the US, plans and packs are sold to businesses: checkout asks for your VAT, GST or other business tax ID.
Questions about the Apple Music Album API.
More in the API reference.
Does it return each track's ISRC?
How much does the Apple Music Album API cost?
Try it on a link you already have.
Paste it in the playground, or copy the request into your code.
- No credit card
- Failed requests are free
- Works on all 218 endpoints