Apple Music Track Search API. Tracks matching your search.
Songs, music videos and radio episodes by keyword. We handle the proxies, blocks and platform changes.
Apple Music Track Search API at a glance
Searches Apple Music songs, music videos or radio episodes by keyword in any country's store and returns them a page at a time, each with its ISRC. Each also has the credited artists with their IDs, album, length, release date, composer, genres, explicit rating, audio formats, whether Apple has its lyrics, artwork and a preview clip. A radio episode has its show as author and when it aired.
GET /v1/applemusic/search_tracks
- 1 credit per page, $0.75–$1.97 per 1,000 pages
- 22 typed fields null when unknown
- 50 tracks per page, Apple Music's own relevance order for the query
queryis all it needs, e.g.taylor swift
Send one request. Get up to 50 tracks 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 socialtapquery = taylor swiftconst params = new URLSearchParams({
query: "taylor swift",
});
const res = await fetch(`https://socialtap.dev/v1/applemusic/search_tracks?${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, page, meta } = body;
console.log(data, meta.credits_charged);import os
import requests
res = requests.get(
"https://socialtap.dev/v1/applemusic/search_tracks",
params={"query": "taylor swift"},
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, page, meta = body["data"], body["page"], body["meta"]
print(data, meta["credits_charged"])require "json"
require "net/http"
uri = URI("https://socialtap.dev/v1/applemusic/search_tracks")
uri.query = URI.encode_www_form('query' => 'taylor swift')
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([
'query' => 'taylor swift',
]);
$ch = curl_init('https://socialtap.dev/v1/applemusic/search_tracks?' . $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("query", "taylor swift")
req, err := http.NewRequest("GET", "https://socialtap.dev/v1/applemusic/search_tracks?"+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"`
Page json.RawMessage `json:"page"`
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/search_tracks' \
--data-urlencode 'query=taylor swift' \
-H "x-api-key: $SOCIALTAP_API_KEY"{
"data": [
{
"approximate_fields": [
"published_at"
],
"author": {
"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
},
"coauthors": [],
"duration_ms": 225868,
"hashtags": [],
"id": "6814997425",
"is_nsfw": null,
"is_pinned": null,
"is_sponsored": null,
"language": null,
"media": [
{
"alt_text": null,
"duration_ms": null,
"expires_at": null,
"height": null,
"thumbnail_url": "https://is1-ssl.mzstatic.com/image/thumb/Music221/v4/a0/dd/fd/a0ddfd72-ee9e-f046-6466-a5dbefc696fa/26UM1IM21436.rgb.jpg/3000x3000bb.jpg",
"type": "audio",
"url": "https://audio-ssl.itunes.apple.com/itunes-assets/AudioPreview221/v4/ec/c8/21/ecc821bd-1252-51fe-08f0-f3d548dcc91b/mzaf_6909590374062866776.plus.aac.ep.m4a",
"width": null
}
],
"mentions": [],
"metrics": {
"comment_count": null,
"like_count": null,
"quote_count": null,
"repost_count": null,
"save_count": null,
"share_count": null,
"view_count": null
},
"platform": "applemusic",
"platform_specific": {
"applemusic": {
"air_ended_at": null,
"album_artist_name": "Taylor Swift",
"album_id": "6814997249",
"album_title": "The Life of a Showgirl: The Encore",
"album_url": "https://music.apple.com/us/album/the-life-of-a-showgirl-the-encore/6814997249",
"artist_name": "Taylor Swift",
"attribution": null,
"audio_locale": "en-US",
"audio_traits": [
"atmos",
"lossless",
"lossy-stereo"
],
"composer_name": "Taylor Swift, Max Martin & Shellback",
"content_rating": null,
"curator_id": null,
"disc_number": 2,
"genres": [
"Pop"
],
"is_4k": null,
"is_apple_digital_master": true,
"is_explicit": false,
"is_hdr": null,
"is_live": null,
"is_lyrics_available": true,
"is_mastered_for_itunes": true,
"is_time_synced_lyrics_available": true,
"isrc": "USUG12602391",
"long_note": null,
"movement_count": null,
"movement_name": null,
"movement_number": null,
"rank": null,
"storefront": "us",
"track_number": 1,
"video_traits": [],
"work_name": null
}
},
"platform_type": "song",
"published_at": "2026-09-24T00:00:00Z",
"text": null,
"thumbnail_url": "https://is1-ssl.mzstatic.com/image/thumb/Music221/v4/a0/dd/fd/a0ddfd72-ee9e-f046-6466-a5dbefc696fa/26UM1IM21436.rgb.jpg/3000x3000bb.jpg",
"title": "Patient Zero",
"type": "audio",
"unknown_fields": [],
"url": "https://music.apple.com/us/album/patient-zero/6814997249?i=6814997425"
},
{
"approximate_fields": [
"published_at"
],
"author": {
"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
},
"coauthors": [],
"duration_ms": 226074,
"hashtags": [],
"id": "1833328840",
"is_nsfw": null,
"is_pinned": null,
"is_sponsored": null,
"language": null,
"media": [
{
"alt_text": null,
"duration_ms": null,
"expires_at": null,
"height": null,
"thumbnail_url": "https://is1-ssl.mzstatic.com/image/thumb/Music211/v4/2d/46/e0/2d46e0bc-8ab9-85dd-4b56-ee6951351034/25UM1IM19577.rgb.jpg/3000x3000bb.jpg",
"type": "audio",
"url": "https://audio-ssl.itunes.apple.com/itunes-assets/AudioPreview221/v4/4b/07/28/4b07285f-b50c-7aff-cb40-2d732256b703/mzaf_14590041634085649439.plus.aac.ep.m4a",
"width": null
}
],
"mentions": [],
"metrics": {
"comment_count": null,
"like_count": null,
"quote_count": null,
"repost_count": null,
"save_count": null,
"share_count": null,
"view_count": null
},
"platform": "applemusic",
"platform_specific": {
"applemusic": {
"air_ended_at": null,
"album_artist_name": "Taylor Swift",
"album_id": "1833328839",
"album_title": "The Life of a Showgirl",
"album_url": "https://music.apple.com/us/album/the-life-of-a-showgirl/1833328839",
"artist_name": "Taylor Swift",
"attribution": null,
"audio_locale": "en-US",
"audio_traits": [
"atmos",
"lossless",
"lossy-stereo"
],
"composer_name": "Taylor Swift, Max Martin & Shellback",
"content_rating": null,
"curator_id": null,
"disc_number": 1,
"genres": [
"Pop"
],
"is_4k": null,
"is_apple_digital_master": true,
"is_explicit": false,
"is_hdr": null,
"is_live": null,
"is_lyrics_available": true,
"is_mastered_for_itunes": true,
"is_time_synced_lyrics_available": true,
"isrc": "USUG12506436",
"long_note": null,
"movement_count": null,
"movement_name": null,
"movement_number": null,
"rank": null,
"storefront": "us",
"track_number": 1,
"video_traits": [],
"work_name": null
}
},
"platform_type": "song",
"published_at": "2025-10-03T00:00:00Z",
"text": null,
"thumbnail_url": "https://is1-ssl.mzstatic.com/image/thumb/Music211/v4/2d/46/e0/2d46e0bc-8ab9-85dd-4b56-ee6951351034/25UM1IM19577.rgb.jpg/3000x3000bb.jpg",
"title": "The Fate of Ophelia",
"type": "audio",
"unknown_fields": [],
"url": "https://music.apple.com/us/album/the-fate-of-ophelia/1833328839?i=1833328840"
},
{
"approximate_fields": [
"published_at"
],
"author": {
"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
},
"coauthors": [],
"duration_ms": 178186,
"hashtags": [],
"id": "6775527443",
"is_nsfw": null,
"is_pinned": null,
"is_sponsored": null,
"language": null,
"media": [
{
"alt_text": null,
"duration_ms": null,
"expires_at": null,
"height": null,
"thumbnail_url": "https://is1-ssl.mzstatic.com/image/thumb/Music221/v4/34/35/6c/34356cb4-bd0b-3bac-b118-1a6d7264dc64/26UMGIM69942.rgb.jpg/3000x3000bb.jpg",
"type": "audio",
"url": "https://audio-ssl.itunes.apple.com/itunes-assets/AudioPreview221/v4/73/76/42/737642e6-c478-bed7-f11f-efee96072450/mzaf_12192094637498612451.plus.aac.ep.m4a",
"width": null
}
],
"mentions": [],
"metrics": {
"comment_count": null,
"like_count": null,
"quote_count": null,
"repost_count": null,
"save_count": null,
"share_count": null,
"view_count": null
},
"platform": "applemusic",
"platform_specific": {
"applemusic": {
"air_ended_at": null,
"album_artist_name": "Taylor Swift",
"album_id": "6775527442",
"album_title": "I Knew It, I Knew You (From \"Toy Story 5\") - Single",
"album_url": "https://music.apple.com/us/album/i-knew-it-i-knew-you-from-toy-story-5-single/6775527442",
"artist_name": "Taylor Swift",
"attribution": null,
"audio_locale": "en-US",
"audio_traits": [
"atmos",
"lossless",
"lossy-stereo"
],
"composer_name": "Taylor Swift & Jack Antonoff",
"content_rating": null,
"curator_id": null,
"disc_number": 1,
"genres": [
"Country"
],
"is_4k": null,
"is_apple_digital_master": true,
"is_explicit": false,
"is_hdr": null,
"is_live": null,
"is_lyrics_available": true,
"is_mastered_for_itunes": true,
"is_time_synced_lyrics_available": true,
"isrc": "USWD12641055",
"long_note": null,
"movement_count": null,
"movement_name": null,
"movement_number": null,
"rank": null,
"storefront": "us",
"track_number": 1,
"video_traits": [],
"work_name": null
}
},
"platform_type": "song",
"published_at": "2026-06-05T00:00:00Z",
"text": null,
"thumbnail_url": "https://is1-ssl.mzstatic.com/image/thumb/Music221/v4/34/35/6c/34356cb4-bd0b-3bac-b118-1a6d7264dc64/26UMGIM69942.rgb.jpg/3000x3000bb.jpg",
"title": "I Knew It, I Knew You (From \"Toy Story 5\")",
"type": "audio",
"unknown_fields": [],
"url": "https://music.apple.com/us/album/i-knew-it-i-knew-you-from-toy-story-5/6775527442?i=6775527443"
}
],
"page": {
"has_more": true,
"next_cursor": "c1.EXAMPLE_CURSOR",
"next_cursor_expires_at": "2026-10-26T12:00:00Z",
"end_reason": null
},
"meta": {
"request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
"platform": "applemusic",
"source": "api",
"is_cached": false,
"credits_charged": 1,
"latency_ms": 494,
"fetched_at": "2026-10-25T12:00:00Z",
"input": null,
"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.searchTracks.list({ query: "taylor swift" });
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 = "query=" + encode("taylor swift");
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://socialtap.dev/v1/applemusic/search_tracks?" + 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("&",
"query=" + Uri.EscapeDataString("taylor swift"));
var res = await http.GetAsync("https://socialtap.dev/v1/applemusic/search_tracks?" + 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/search_tracks")
.query(&[("query", "taylor swift")])
.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/search_tracksLong arrays and strings are shortened here. Real responses are complete.Docs One schema on 21 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
What to search for: a song's or video's title, an artist's name, an album's, or any of them together, in any language.
Write one parser
Apple Music, TikTok, Instagram and 18 more platforms answer in these fields, so the code that reads one reads them all.
platformstring- Platform ID (tiktok, youtube, …).
idstring- Platform-native post ID (string; Instagram shortcode, Reddit with its t3_ prefix).
urlstring- Canonical post URL.
typestring- Normalized content shape. New values may be added; treat unknown values as other.
platform_typestring- The platform's own product label, lowercase (reel, short, story, live, tweet, …).
titlestring- Headline (YouTube title, Reddit title); null on caption-only platforms.
textstring- Caption, description or body as plain text.
languagestring- BCP-47 language of text, when the platform states it.
Live data from 33 platforms.
What teams build with the Apple Music Track Search API.
Turn a title and artist into an ISRC
Match a recording catalog against Apple Music
Find an artist's videos and radio appearances
Good to know before you build.
- Results are one kind: kind asks for songs, music videos or radio episodes. Albums, artists, playlists and stations have search endpoints of their own that take the same query.
- Results are in Apple Music's order for the query. Apple serves about 200 results per search, however many match, and the walk then ends with page.end_reason platform_limit.
- Results differ by store: an item can be missing from one or have another language's title. platform_specific.applemusic.storefront says which store answered.
- When Apple's catalog API fails, the first page of songs or music videos comes from its public search API and ends the walk with platform_limit: isrc, composer_name, the audio formats and the lyrics flags are null or [], and only the first artist is named (those lists in unknown_fields). That API has no radio episodes and answers only in the store's language, so a request for either fails rather than answer something else.
- A language the store doesn't offer isn't refused: Apple answers in the store's own language, as a US search with lang=ja-JP does.
- A radio episode's author is its show, with its name, page and picture and a null ID, because a show isn't an artist. platform_specific.applemusic.curator_id holds Apple's ID for it.
- Apple holds some shows by that ID alone, in every store: their episodes have every author field null, and platform_specific.applemusic.long_note, where Apple writes one, is often the show's name in some form but can be something else, such as a date.
- An empty query or an Apple Music link returns invalid_input. A link to a platform we don't cover is searched as words.
1 credit per page. Failed requests are free.
Buy credits once and spend them on any endpoint, on any platform.
| Source | Price per successful page | Per 1,000 pages |
|---|---|---|
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 Track Search API.
More in the API reference.
Can I look up a song's ISRC by its title?
How much does the Apple Music Track Search API cost?
How do I get the next page?
Try it with your own search.
Type it in the playground, or copy the request into your code.
- No credit card
- Failed requests are free
- Works on all 218 endpoints