Spotix API
REST API gratis buat scrape Spotify — search tracks, ambil detail, dan dapat MP3 download link langsung untuk track, playlist, maupun album. Tidak perlu API key, tidak perlu login.
/api/download, /api/playlist?dl=1, dan /api/album pakai 2 sumber CDN — jika sumber pertama gagal, otomatis fallback ke sumber kedua. Field dl_source menunjukkan sumber yang berhasil.https://spotix-zeta.vercel.appproductionhttp://localhost:3000devAlur Penggunaan (untuk Bot)
Ikutin alur ini buat nge-download dari Spotify URL atau keyword pencarian.
Alur 1 — Download Satu Track
/api/search. Sudah punya Spotify URL → skip ke step 2./api/download?url=.... Response berisi download_url yang siap diunduh.download_url langsung. Untuk filename bersih, wrap via /api/stream?url=...&filename=....// Step 1: cari track
const s = await fetch('/api/search?q=blinding+lights&limit=1').then(r=>r.json())
const track = s.data[0]
// Step 2: get download URL
const dl = await fetch('/api/download?url=' + encodeURIComponent(track.url)).then(r=>r.json())
console.log(dl.download_url) // MP3 CDN URL langsung
console.log(dl.dl_source) // 'gamepvz' atau 'downloaderize'Alur 2 — Download Semua Track Playlist
/api/playlist?id=PLAYLIST_ID&dl=1. Parameter dl=1 akan resolve download_url tiap track sekaligus.data.tracks[] sudah punya download_url. Track yang gagal resolve akan punya download_url: null.download_url langsung atau via /api/stream. Cek meta.resolved buat tau berapa yang berhasil.const res = await fetch('/api/playlist?id=4IfUIdWEonPys9mYs7zXna&dl=1').then(r=>r.json())
console.log(`${res.meta.resolved}/${res.meta.total_tracks} track berhasil`)
for (const track of res.data.tracks) {
if (!track.download_url) continue // skip yg gagal
console.log(track.name, '→', track.download_url, '(' + track.dl_source + ')')
}Alur 3 — Download Semua Track Album
/api/album?id=ALBUM_ID. Semua track langsung di-resolve download URL-nya.download_url dan dl_source ada di tiap track.const res = await fetch('/api/album?id=4yP0hdKOZPNshxUOjY0cZj').then(r=>r.json())
console.log(res.data.name, '—', res.meta.resolved, 'track siap download')
for (const track of res.data.tracks) {
if (!track.download_url) continue
console.log(track.track_number + '.', track.name, '→', track.download_url)
}Rate Limits
Per IP, sliding window 60 detik. Returns 429 kalau over. /api/album lebih ketat karena resolve banyak track sekaligus.
/api/search/api/track/api/download/api/playlist/api/album/api/stream/api/search
Multi-purpose. Input keyword → return banyak track dengan mp3_url langsung. Input Spotify URL → auto-detect type dan return data lengkap (track/playlist/album/artist).
Parameters
| Param | Type | Required | Description |
|---|---|---|---|
q | string | required | Keyword pencarian atau Spotify URL (track/playlist/album/artist) |
type | string | optional | Filter: all · tracks · playlists · albums · artists. Default: all |
limit | number | optional | Jumlah hasil (1–50). Default: 10 |
Contoh Request
curl "https://spotix-zeta.vercel.app/api/search?q=blinding+lights&limit=5"curl "https://spotix-zeta.vercel.app/api/search?q=https://open.spotify.com/track/0VjIjW4GlUZAMYd2vXMi3b"curl "https://spotix-zeta.vercel.app/api/search?q=https://open.spotify.com/playlist/4IfUIdWEonPys9mYs7zXna"Response
{
"status": true,
"creator": "kasanvx",
"via": "search",
"type": "tracks",
"data": [
{
"id": "0VjIjW4GlUZAMYd2vXMi3b",
"uri": "spotify:track:0VjIjW4GlUZAMYd2vXMi3b",
"url": "https://open.spotify.com/track/0VjIjW4GlUZAMYd2vXMi3b",
"name": "Blinding Lights",
"duration_ms": 200040,
"explicit": false,
"artists": [{ "id": "1Xyo4u8uXC1ZmMpatF05PJ", "name": "The Weeknd" }],
"album": {
"name": "After Hours",
"images": [{ "url": "https://i.scdn.co/image/...", "width": 300, "height": 300 }]
},
"mp3_url": "https://cdn.example.com/download/0VjIjW4GlUZAMYd2vXMi3b?..."
}
],
"response_ms": 1240
}/api/track
Ambil detail track lengkap by Spotify track ID atau URL/URI. Tidak include download URL — gunakan /api/download untuk itu.
Parameters
| Param | Type | Required | Description |
|---|---|---|---|
id | string | required | Spotify track ID, URL (open.spotify.com/track/...), atau URI (spotify:track:...) |
Contoh Request
curl "https://spotix-zeta.vercel.app/api/track?id=0VjIjW4GlUZAMYd2vXMi3b"curl "https://spotix-zeta.vercel.app/api/track?id=https://open.spotify.com/track/0VjIjW4GlUZAMYd2vXMi3b"{
"status": true,
"creator": "kasanvx",
"data": {
"id": "0VjIjW4GlUZAMYd2vXMi3b",
"name": "Blinding Lights",
"duration_ms": 200040,
"playcount": 4100000000,
"explicit": false,
"track_number": 5,
"album": {
"id": "4yP0hdKOZPNshxUOjY0cZj",
"name": "After Hours",
"type": "ALBUM",
"release_year": 2020,
"images": [{ "url": "https://i.scdn.co/...", "width": 640, "height": 640 }],
"color": "#701010"
},
"artists": [{ "id": "1Xyo4u8uXC1ZmMpatF05PJ", "name": "The Weeknd" }]
},
"response_ms": 712
}/api/download
Dapat MP3 download URL langsung dari satu Spotify track URL. Pakai 2 sumber CDN dengan auto fallback — jika sumber pertama gagal, otomatis coba sumber kedua.
dl_source di response menunjukkan sumber mana yang berhasil (gamepvz atau downloaderize). Jika kedua sumber gagal, response 502 dengan field errors[] berisi detail error tiap sumber.Parameters
| Param | Type | Required | Description |
|---|---|---|---|
url | string | required | Spotify track URL (open.spotify.com/track/...) atau URI (spotify:track:...) |
Contoh Request
curl "https://spotix-zeta.vercel.app/api/download?url=https://open.spotify.com/track/0VjIjW4GlUZAMYd2vXMi3b"const res = await fetch('/api/download?url=' + encodeURIComponent('https://open.spotify.com/track/0VjIjW4GlUZAMYd2vXMi3b'))
const { download_url, title, artist, thumbnail, dl_source } = await res.json()
console.log('Source:', dl_source) // 'gamepvz' atau 'downloaderize'{
"status": true,
"creator": "kasanvx",
"download_url": "https://cdn.example.com/download/0VjIjW4GlUZAMYd2vXMi3b?...",
"title": "Blinding Lights",
"artist": "The Weeknd",
"thumbnail": "https://image-cdn-ak.spotifycdn.com/image/ab67616d0000b273...",
"dl_source": "gamepvz",
"response_ms": 620
}{
"status": false,
"creator": "kasanvx",
"message": "All download sources failed",
"errors": [
{ "source": "gamepvz", "error": "gamepvz upstream 503" },
{ "source": "downloaderize", "error": "downloaderize: config not found" }
]
}/api/playlist
Ambil info playlist beserta semua tracks. Tambahkan dl=1 buat sekalian resolve download_url tiap track (lebih lambat, tapi tidak perlu hit /api/download satu-satu).
Parameters
| Param | Type | Required | Description |
|---|---|---|---|
id | string | required | Spotify playlist ID atau URL (open.spotify.com/playlist/...) |
dl | string | optional | Set 1 atau true untuk resolve download_url tiap track. Default: off (lebih cepat) |
Contoh Request
curl "https://spotix-zeta.vercel.app/api/playlist?id=4IfUIdWEonPys9mYs7zXna"curl "https://spotix-zeta.vercel.app/api/playlist?id=4IfUIdWEonPys9mYs7zXna&dl=1"{
"status": true,
"creator": "kasanvx",
"data": {
"id": "4IfUIdWEonPys9mYs7zXna",
"name": "JVKE all songs",
"followers": 25861,
"owner": { "display_name": "Anna Tansey" },
"tracks": [
{
"id": "6PetYmvjKZBjiUYlnlAcn1",
"name": "this is what space feels like",
"url": "https://open.spotify.com/track/6PetYmvjKZBjiUYlnlAcn1",
"duration_ms": 183017,
"artists": [{ "name": "JVKE" }],
"download_url": "https://cdn.example.com/download/6PetYmvjKZBjiUYlnlAcn1?...",
"dl_source": "gamepvz"
}
]
},
"meta": {
"total_tracks": 12,
"resolved": 11,
"failed": 1
},
"response_ms": 8420
}{ "status": false, "creator": "kasanvx", "message": "Playlist not found or private" }/api/album
Ambil info album beserta semua tracks — langsung dengan download_url tiap track. Pakai dual-source fallback. Rate limit lebih ketat (5/min) karena endpoint ini berat.
Parameters
| Param | Type | Required | Description |
|---|---|---|---|
id | string | required | Spotify album ID atau URL (open.spotify.com/album/...) atau URI (spotify:album:...) |
Contoh Request
curl "https://spotix-zeta.vercel.app/api/album?id=4yP0hdKOZPNshxUOjY0cZj"curl "https://spotix-zeta.vercel.app/api/album?id=https://open.spotify.com/album/4yP0hdKOZPNshxUOjY0cZj"{
"status": true,
"creator": "kasanvx",
"data": {
"id": "4yP0hdKOZPNshxUOjY0cZj",
"name": "After Hours",
"type": "ALBUM",
"release_date": "2020-03-20",
"label": "Republic Records",
"artists": [{ "name": "The Weeknd" }],
"images": [{ "url": "https://i.scdn.co/image/...", "width": 640, "height": 640 }],
"tracks": [
{
"id": "0VjIjW4GlUZAMYd2vXMi3b",
"name": "Blinding Lights",
"track_number": 5,
"duration_ms": 200040,
"explicit": false,
"url": "https://open.spotify.com/track/0VjIjW4GlUZAMYd2vXMi3b",
"artists": [{ "name": "The Weeknd" }],
"download_url": "https://cdn.example.com/download/0VjIjW4GlUZAMYd2vXMi3b?...",
"dl_source": "gamepvz"
}
]
},
"meta": {
"total_tracks": 14,
"resolved": 14,
"failed": 0
},
"response_ms": 12400
}{ "status": false, "creator": "kasanvx", "message": "Album not found" }/api/stream
Proxy audio MP3 — forward ke CDN dan return audio stream dengan header Content-Disposition attachment. Berguna buat bot yang butuh kirim file dengan nama bersih.
Parameters
| Param | Type | Required | Description |
|---|---|---|---|
url | string | required | MP3 URL dari field download_url (encode dengan encodeURIComponent) |
filename | string | optional | Nama file download tanpa ekstensi .mp3 |
Contoh Penggunaan
// 1. Get download URL
const dl = await fetch('/api/download?url=' + encodeURIComponent('https://open.spotify.com/track/0VjIjW4GlUZAMYd2vXMi3b')).then(r=>r.json())
// 2a. Play langsung
const audio = new Audio(dl.download_url)
audio.play()
// 2b. Download via stream proxy (nama file bersih)
const a = document.createElement('a')
a.href = `/api/stream?url=${encodeURIComponent(dl.download_url)}&filename=${encodeURIComponent(dl.title)}`
a.download = dl.title + '.mp3'
a.click()import requests, urllib.parse
album = requests.get('https://spotix-zeta.vercel.app/api/album?id=4yP0hdKOZPNshxUOjY0cZj').json()
for track in album['data']['tracks']:
if not track.get('download_url'):
continue
stream_url = f"https://spotix-zeta.vercel.app/api/stream?url={urllib.parse.quote(track['download_url'])}&filename={urllib.parse.quote(track['name'])}"
audio = requests.get(stream_url)
with open(f"{track['name']}.mp3", 'wb') as f:
f.write(audio.content)
print(f"Downloaded: {track['name']}")Error Codes
Semua error return { "status": false, "creator": "kasanvx", "message": "..." }
| Code | Arti |
|---|---|
400 | Parameter kurang atau tidak valid |
403 | IP/UA diblokir (attack tools, Tor exit nodes) |
404 | Track/playlist/album tidak ditemukan |
405 | Method tidak diizinkan (gunakan GET) |
429 | Rate limit exceeded — tunggu ~60 detik |
502 | Semua sumber download gagal — cek field errors[] untuk detail |
504 | Request timeout (>15s) |
500 | Internal server error |