REST API · v2 · by kasanvx

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.

No API Key Required
Semua endpoint public. Rate limit per IP. curl, axios, fetch semua bisa.
Dual-Source dengan Auto Fallback
/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.
Base URLhttps://spotix-zeta.vercel.appproduction
Localhttp://localhost:3000dev

Alur Penggunaan (untuk Bot)

Ikutin alur ini buat nge-download dari Spotify URL atau keyword pencarian.

Alur 1 — Download Satu Track

1
Cari atau gunakan URL langsung
Input keyword → /api/search. Sudah punya Spotify URL → skip ke step 2.
2
Ambil download URL
Kirim Spotify track URL ke /api/download?url=.... Response berisi download_url yang siap diunduh.
3
Download / Play
Gunakan download_url langsung. Untuk filename bersih, wrap via /api/stream?url=...&filename=....
contoh — search lalu download
// 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

1
Ambil info + download URL playlist
GET /api/playlist?id=PLAYLIST_ID&dl=1. Parameter dl=1 akan resolve download_url tiap track sekaligus.
2
Loop tiap track
Setiap item di data.tracks[] sudah punya download_url. Track yang gagal resolve akan punya download_url: null.
3
Download satu per satu
Gunakan download_url langsung atau via /api/stream. Cek meta.resolved buat tau berapa yang berhasil.
contoh — download semua track playlist
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

1
Ambil info + download URL album
GET /api/album?id=ALBUM_ID. Semua track langsung di-resolve download URL-nya.
2
Loop tiap track
Struktur sama seperti playlist. Field download_url dan dl_source ada di tiap track.
contoh — download semua track album
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.

30req/min/api/search
30req/min/api/track
20req/min/api/download
10req/min/api/playlist
5req/min/api/album
10req/min/api/stream
GET

/api/track

Ambil detail track lengkap by Spotify track ID atau URL/URI. Tidak include download URL — gunakan /api/download untuk itu.

Parameters

ParamTypeRequiredDescription
idstringrequiredSpotify track ID, URL (open.spotify.com/track/...), atau URI (spotify:track:...)

Contoh Request

by ID
curl "https://spotix-zeta.vercel.app/api/track?id=0VjIjW4GlUZAMYd2vXMi3b"
by URL
curl "https://spotix-zeta.vercel.app/api/track?id=https://open.spotify.com/track/0VjIjW4GlUZAMYd2vXMi3b"
200 OK
{
  "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
}
GET

/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.

Field 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

ParamTypeRequiredDescription
urlstringrequiredSpotify track URL (open.spotify.com/track/...) atau URI (spotify:track:...)

Contoh Request

get mp3 url
curl "https://spotix-zeta.vercel.app/api/download?url=https://open.spotify.com/track/0VjIjW4GlUZAMYd2vXMi3b"
javascript
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'
200 OK
{
  "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
}
502 — semua sumber gagal
{
  "status": false,
  "creator": "kasanvx",
  "message": "All download sources failed",
  "errors": [
    { "source": "gamepvz", "error": "gamepvz upstream 503" },
    { "source": "downloaderize", "error": "downloaderize: config not found" }
  ]
}
GET

/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

ParamTypeRequiredDescription
idstringrequiredSpotify playlist ID atau URL (open.spotify.com/playlist/...)
dlstringoptionalSet 1 atau true untuk resolve download_url tiap track. Default: off (lebih cepat)

Contoh Request

info playlist saja
curl "https://spotix-zeta.vercel.app/api/playlist?id=4IfUIdWEonPys9mYs7zXna"
playlist + semua download URL
curl "https://spotix-zeta.vercel.app/api/playlist?id=4IfUIdWEonPys9mYs7zXna&dl=1"
200 OK — dengan 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
}
404 — private/not found
{ "status": false, "creator": "kasanvx", "message": "Playlist not found or private" }
GET

/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

ParamTypeRequiredDescription
idstringrequiredSpotify album ID atau URL (open.spotify.com/album/...) atau URI (spotify:album:...)

Contoh Request

by album ID
curl "https://spotix-zeta.vercel.app/api/album?id=4yP0hdKOZPNshxUOjY0cZj"
by album URL
curl "https://spotix-zeta.vercel.app/api/album?id=https://open.spotify.com/album/4yP0hdKOZPNshxUOjY0cZj"
200 OK
{
  "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
}
404 — not found
{ "status": false, "creator": "kasanvx", "message": "Album not found" }
GET

/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

ParamTypeRequiredDescription
urlstringrequiredMP3 URL dari field download_url (encode dengan encodeURIComponent)
filenamestringoptionalNama file download tanpa ekstensi .mp3

Contoh Penggunaan

javascript — full flow track tunggal
// 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()
python bot — download file dari album
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": "..." }

CodeArti
400Parameter kurang atau tidak valid
403IP/UA diblokir (attack tools, Tor exit nodes)
404Track/playlist/album tidak ditemukan
405Method tidak diizinkan (gunakan GET)
429Rate limit exceeded — tunggu ~60 detik
502Semua sumber download gagal — cek field errors[] untuk detail
504Request timeout (>15s)
500Internal server error