SoundCloud scraper API. Live data from any public SoundCloud link.
Get public tracks and artists by link or handle, with tracks in the same fields as on 20 other platforms. We handle the proxies, blocks and platform changes.
GET socialtap.dev/v1/soundcloud/track
Live data from 33 platforms.
What SoundCloud data can you get?
SoundCloud tracks with exact play, like, repost, comment and download counts, genre, tags, license, and the ISRC, label and UPC that labels fill in. Artists with their bio, exact follower counts and the links they list, and every public track an artist has posted, newest first.
Tracks
Call the SoundCloud API from your code.
Copy the request for your language, or hand it to your agent.
const params = new URLSearchParams({
url: "https://soundcloud.com/forss/flickermood",
});
const res = await fetch(`https://socialtap.dev/v1/soundcloud/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/soundcloud/track",
params={"url": "https://soundcloud.com/forss/flickermood"},
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/soundcloud/track")
uri.query = URI.encode_www_form('url' => 'https://soundcloud.com/forss/flickermood')
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://soundcloud.com/forss/flickermood',
]);
$ch = curl_init('https://socialtap.dev/v1/soundcloud/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://soundcloud.com/forss/flickermood")
req, err := http.NewRequest("GET", "https://socialtap.dev/v1/soundcloud/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/soundcloud/track' \
--data-urlencode 'url=https://soundcloud.com/forss/flickermood' \
-H "x-api-key: $SOCIALTAP_API_KEY"GET https://socialtap.dev/v1/soundcloud/trackDocs const params = new URLSearchParams({
handle: "forss",
});
const res = await fetch(`https://socialtap.dev/v1/soundcloud/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/soundcloud/artist",
params={"handle": "forss"},
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/soundcloud/artist")
uri.query = URI.encode_www_form('handle' => 'forss')
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' => 'forss',
]);
$ch = curl_init('https://socialtap.dev/v1/soundcloud/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", "forss")
req, err := http.NewRequest("GET", "https://socialtap.dev/v1/soundcloud/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/soundcloud/artist?handle=forss' \
-H "x-api-key: $SOCIALTAP_API_KEY"GET https://socialtap.dev/v1/soundcloud/artistDocs const params = new URLSearchParams({
handle: "forss",
});
const res = await fetch(`https://socialtap.dev/v1/soundcloud/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/soundcloud/tracks",
params={"handle": "forss"},
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/soundcloud/tracks")
uri.query = URI.encode_www_form('handle' => 'forss')
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' => 'forss',
]);
$ch = curl_init('https://socialtap.dev/v1/soundcloud/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("handle", "forss")
req, err := http.NewRequest("GET", "https://socialtap.dev/v1/soundcloud/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/soundcloud/tracks?handle=forss' \
-H "x-api-key: $SOCIALTAP_API_KEY"GET https://socialtap.dev/v1/soundcloud/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
Apple Music
Tracks, artists, playlists 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
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 SoundCloud Track API return the ISRC?
Does the SoundCloud Artist API return an artist's email?
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 SoundCloud 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