Apple Music scraper API. Live data from any public Apple Music link.
Get public tracks, artists, playlists and more by link or search, with tracks in the same fields as on 20 other platforms. We handle the proxies, blocks and platform changes.
GET socialtap.dev/v1/applemusic/track
Live data from 33 platforms.
What Apple Music data can you get?
Apple Music tracks (songs and music videos) with ISRC, composer and audio formats, and albums with their tracklist, label and UPC. Artists with bio, origin and top songs, playlists and radio stations, and the most played charts by country. Search tracks, albums, artists and playlists by keyword, in any country's store.
Tracks
Search
-
Album
Apple Music Album Search API
Albums, singles and EPs by keyword
1 credit / pageGET /v1/applemusic/search_albums -
Profile
Apple Music Artist Search API
Artists by name, with bio and origin
1 credit / pageGET /v1/applemusic/search_artists -
Playlist
Apple Music Playlist Search API
Playlists and radio stations by keyword
1 credit / pageGET /v1/applemusic/search_playlists -
Post
Apple Music Track Search API
Songs, music videos and radio episodes by keyword
1 credit / pageGET /v1/applemusic/search_tracks
Top Playlists
Why not the official Apple Music API?
Apple's Apple Music API needs a developer token signed with a MusicKit key, and that key needs a paid Apple Developer Program membership.
No approval to wait for
One API key works on every endpoint. There's no app to get reviewed and no account to connect.
Anything public
Read what anyone can see without logging in, not only the accounts you manage or that authorized your app.
No daily quota
You pay per request. Plans have no rate limit, only a ceiling that stops a runaway loop.
Call the Apple Music API from your code.
Copy the request for your language, or hand it to your agent.
const params = new URLSearchParams({
url: "https://music.apple.com/us/album/lover/1468058165?i=1468058169",
});
const res = await fetch(`https://socialtap.dev/v1/applemusic/track?${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/track",
params={"url": "https://music.apple.com/us/album/lover/1468058165?i=1468058169"},
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/track")
uri.query = URI.encode_www_form('url' => 'https://music.apple.com/us/album/lover/1468058165?i=1468058169')
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?i=1468058169',
]);
$ch = curl_init('https://socialtap.dev/v1/applemusic/track?' . $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?i=1468058169")
req, err := http.NewRequest("GET", "https://socialtap.dev/v1/applemusic/track?"+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/track' \
--data-urlencode 'url=https://music.apple.com/us/album/lover/1468058165?i=1468058169' \
-H "x-api-key: $SOCIALTAP_API_KEY"GET https://socialtap.dev/v1/applemusic/trackDocs const params = new URLSearchParams({
handle: "159260351",
});
const res = await fetch(`https://socialtap.dev/v1/applemusic/artist?${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/artist",
params={"handle": "159260351"},
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/artist")
uri.query = URI.encode_www_form('handle' => '159260351')
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([
'handle' => '159260351',
]);
$ch = curl_init('https://socialtap.dev/v1/applemusic/artist?' . $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("handle", "159260351")
req, err := http.NewRequest("GET", "https://socialtap.dev/v1/applemusic/artist?"+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 'https://socialtap.dev/v1/applemusic/artist?handle=159260351' \
-H "x-api-key: $SOCIALTAP_API_KEY"GET https://socialtap.dev/v1/applemusic/artistDocs const params = new URLSearchParams({
query: "workout",
});
const res = await fetch(`https://socialtap.dev/v1/applemusic/search_playlists?${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_playlists",
params={"query": "workout"},
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_playlists")
uri.query = URI.encode_www_form('query' => 'workout')
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' => 'workout',
]);
$ch = curl_init('https://socialtap.dev/v1/applemusic/search_playlists?' . $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", "workout")
req, err := http.NewRequest("GET", "https://socialtap.dev/v1/applemusic/search_playlists?"+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 'https://socialtap.dev/v1/applemusic/search_playlists?query=workout' \
-H "x-api-key: $SOCIALTAP_API_KEY"GET https://socialtap.dev/v1/applemusic/search_playlistsDocs const 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"GET https://socialtap.dev/v1/applemusic/albumDocs const 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"GET https://socialtap.dev/v1/applemusic/search_tracksDocs const params = new URLSearchParams({
country: "US",
kind: "song",
});
const res = await fetch(`https://socialtap.dev/v1/applemusic/top_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/top_tracks",
params={"country": "US", "kind": "song"},
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/top_tracks")
uri.query = URI.encode_www_form('country' => 'US', 'kind' => 'song')
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([
'country' => 'US',
'kind' => 'song',
]);
$ch = curl_init('https://socialtap.dev/v1/applemusic/top_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("country", "US")
q.Set("kind", "song")
req, err := http.NewRequest("GET", "https://socialtap.dev/v1/applemusic/top_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 'https://socialtap.dev/v1/applemusic/top_tracks?country=US&kind=song' \
-H "x-api-key: $SOCIALTAP_API_KEY"GET https://socialtap.dev/v1/applemusic/top_tracksDocs Other platforms, same key.
Posts and profiles come back in the same fields wherever they're from.
- 31 endpoints
TikTok
Posts, profiles, comments and more
- 28 endpoints
Instagram
Posts, profiles, comments and more
- 14 endpoints
Facebook
Posts, profiles, comments and more
- 6 endpoints
YouTube
Posts, profiles, comments and more
- 13 endpoints
Reddit
Posts, profiles, comments and more
- 6 endpoints
Threads
Posts, profiles and comments
- 12 endpoints
Spotify
Tracks, artists, playlists and more
- 10 endpoints
Amazon
Products, posts, profiles and more
- 10 endpoints
Pinterest
Pins, profiles, boards and more
- 7 endpoints
Rumble
Posts, profiles, comments and more
- 7 endpoints
X
Posts, profiles and communities
- 5 endpoints
Bluesky
Posts, profiles and comments
- 5 endpoints
Twitch
Videos, profiles, transcripts and more
- 4 endpoints
LinkedIn
Posts and profiles
- 4 endpoints
Telegram
Posts and channels
- 4 endpoints
TikTok Shop
Products and reviews
- 3 endpoints
Kwai
Posts and profiles
- 3 endpoints
Snapchat
Spotlights, profiles and comments
- 3 endpoints
SoundCloud
Tracks and artists
- 3 endpoints
Truth Social
Posts and profiles
- 2 endpoints
Kick
Posts and transcripts
- 1 endpoint
Komi
Pages
- 1 endpoint
Lnk.Bio
Profiles
- 1 endpoint
Linkme
Profiles
- 1 endpoint
Linktree
Profiles
- 1 endpoint
Pillar
Pages
- 3 endpoints
TikTok Ad Library
Ads
- 5 endpoints
Facebook Ad Library
Ads, advertisers and transcripts
- 4 endpoints
Facebook Events
Events
- 3 endpoints
Facebook Marketplace
Listings and places
- 6 endpoints
Google Ads Transparency Center
Ads and advertisers
- 2 endpoints
LinkedIn Ad Library
Ads
Does the Apple Music Track API return play counts?
Does the Apple Music Artist API return follower counts?
Does the Apple Music Album API return each track's ISRC?
What do I send?
Is the data live?
What does null mean in a response?
Are the fields the same on every platform?
What happens when a platform changes its pages?
Do you read private or logged-in content?
Can my AI agent use it?
Try it on a Apple Music link you have.
Get a key and send your first request in a minute. The same key works on every platform.
- No credit card
- Failed requests are free
- Works on all 218 endpoints