Introduction

The Arc API lets you download audio and video from YouTube, Spotify, SoundCloud, JioSaavn, Apple Music, Instagram, Facebook, Threads, Bluesky, TikTok, Twitter/X, Reddit, and Pinterest with plain GET requests.

Base URL

https://api.arcmusic.fun

Routing

Every platform is mounted at its own top-level path — /youtube/..., /spotify/..., /instagram/..., etc.

Processing

YouTube is cached and can queue a background job. Every other platform resolves and responds synchronously in a single request.

Interactive Docs

Auto-generated Swagger UI is live at /docs.

How to Get an API Key

  1. Create an account and sign in on this site.
  2. Go to Plans and pick a plan — a free tier is available for testing.
  3. Your API key is issued immediately after checkout and shown on your Usage page.

Keep your key private. Don't commit it to public repositories or share it in client-side code the public can read. If a key is compromised, regenerate it from the Usage page.

Authentication

Every endpoint requires an api_key query parameter. Keys are tied to a plan with a daily request limit and, for video downloads specifically, a separate daily video limit — both reset at midnight UTC.

cURL
curl "https://api.arcmusic.fun/spotify/download?link=...&api_key=YOUR_API_KEY"

Errors

Every error, from any endpoint, comes back as a plain FastAPI error body with a single detail string:

403 Forbidden
{
  "detail": "Invalid API key"
}
400Bad Request — malformed input (invalid URL, unrecognized ID/link)
403Forbidden — invalid/deactivated key, no active plan, or plan expired
404Not Found — no results, media unavailable, or an unknown job_id
429Too Many Requests — daily request or video limit reached
500Internal Server Error — an unexpected failure upstream; safe to retry

YouTube

GET/youtube/v2/playlist

Playlist

Scrapes a YouTube playlist page and returns every video in the first batch YouTube loads (up to ~100 videos for most playlists). Each track's url can be fed straight into Download below.

Query Parameters

linkrequiredYouTube playlist link or playlist ID
limitMax tracks to return, 1–200 (default 100)
api_keyrequiredYour assigned API key

Example Request

curl -X GET "https://api.arcmusic.fun/youtube/v2/playlist?link=https%3A%2F%2Fwww.youtube.com%2Fplaylist%3Flist%3DPLFgquLnL59alCl_2TQvOiD5Vgm1hCaGSI&limit=50&api_key=YOUR_API_KEY"

Success200 OK

JSON
{
  "status": "success",
  "total": 2,
  "tracks": [
    {
      "title": "Never Gonna Give You Up",
      "duration": "00:03:33",
      "channel": "Rick Astley",
      "thumbnail": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg",
      "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
    }
  ]
}

Invalid link400 Bad Request

JSON
{
  "detail": "Invalid YouTube playlist link"
}

Not found / empty404 Not Found

JSON
{
  "detail": "Playlist not found, private, or empty — check server logs for details"
}
GET/youtube/v2/download

Download — Step 1: Start

Requests a track or video by ID/URL. YouTube is the only platform with caching: a cache hit returns instantly with job_id: null. Otherwise the request is queued — poll Step 2 below with the returned job_id.

Query Parameters

queryrequiredYouTube video ID or full URL
isVideotrue downloads video, false (default) downloads audio-only
api_keyrequiredYour assigned API key

Example Request

curl -X GET "https://api.arcmusic.fun/youtube/v2/download?query=dQw4w9WgXcQ&isVideo=false&api_key=YOUR_API_KEY"

Cached (Telegram)200 OK

JSON
{
  "status": "success",
  "job_id": null,
  "result": {
    "success": true,
    "cached": true,
    "source": "telegram",
    "cdn": "https://t.me/arcmusiccdn/48213",
    "is_audio": true,
    "is_video": false
  }
}

Cached (local disk)200 OK

JSON
{
  "status": "success",
  "job_id": null,
  "result": {
    "success": true,
    "cached": true,
    "source": "local",
    "cdn": "https://api.arcmusic.fun/media/audios/dQw4w9WgXcQ.mp3",
    "is_audio": true,
    "is_video": false
  }
}

Not cached — queued200 OK

JSON
{
  "status": "queued",
  "job_id": "f331659faf05717c",
  "message": "Download started in background. Use /youtube/jobStatus?job_id=... to check status."
}

cdn is either a direct file URL under your own storage, or a https://t.me/<channel>/<message_id> link when served from the Telegram cache channel. Treat it as an opaque URL either way.

A local-disk cache hit's result may also carry an internal file_path field pointing at server storage — it's not meant for API consumers and shouldn't be relied on.

GET/youtube/jobStatus

Download — Step 2: Poll Job Status

Poll this with the job_id from a queued /youtube/v2/download response. Jobs are kept in memory for 30 minutes after creation and swept afterward.

Query Parameters

job_idrequiredThe job_id returned by /youtube/v2/download

Example Request

curl -X GET "https://api.arcmusic.fun/youtube/jobStatus?job_id=f331659faf05717c"

Done200 OK

JSON
{
  "status": "success",
  "job": {
    "status": "done",
    "result": {
      "success": true,
      "cached": false,
      "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
      "quality": 128,
      "cdn": "https://api.arcmusic.fun/media/audios/dQw4w9WgXcQ.mp3",
      "is_audio": true,
      "is_video": false,
      "source": "yt_audio"
    },
    "error": null
  }
}

Error200 OK

JSON
{
  "status": "success",
  "job": {
    "status": "error",
    "result": null,
    "error": "all_methods_failed"
  }
}

Unknown / expired job404 Not Found

JSON
{
  "detail": "Invalid job_id or job expired"
}

job.status is one of queued, done, or error — poll every couple of seconds until it's no longer queued.

On a completed job, result.quality is the resolved bitrate/height as an integer (0 when the source doesn't report one) and result.source identifies which internal fetcher served it (e.g. yt_audio, yt_video) — both are informational, not something to branch your logic on.

Spotify

GET/spotify/playlist

Playlist

Fetches every track in a Spotify playlist — name, Spotify track URL, and duration.

Query Parameters

linkrequiredSpotify playlist link
api_keyrequiredYour assigned API key

Example Request

curl -X GET "https://api.arcmusic.fun/spotify/playlist?link=https%3A%2F%2Fopen.spotify.com%2Fplaylist%2F37i9dQZF1DXcBWIGoYBM5M&api_key=YOUR_API_KEY"

Success200 OK

JSON
{
  "status": "success",
  "total": 1,
  "tracks": [
    {
      "name": "Blinding Lights - The Weeknd",
      "url": "https://open.spotify.com/track/0VjIjW4GlUZAMYd2vXMi3b",
      "duration": "00:03:20"
    }
  ]
}

Invalid link400 Bad Request

JSON
{
  "detail": "Invalid Spotify playlist link"
}

Not found / empty404 Not Found

JSON
{
  "detail": "Playlist not found, private, or empty — check server logs for the Spotify API error"
}
GET/spotify/download

Download

Resolves and returns a Spotify track directly — synchronous, no job queue, no cache.

Query Parameters

linkrequiredSpotify track link
api_keyrequiredYour assigned API key

Example Request

curl -X GET "https://api.arcmusic.fun/spotify/download?link=https%3A%2F%2Fopen.spotify.com%2Ftrack%2F0VjIjW4GlUZAMYd2vXMi3b&api_key=YOUR_API_KEY"

Success200 OK

JSON
{
  "success": true,
  "spotify_link": "https://open.spotify.com/track/0VjIjW4GlUZAMYd2vXMi3b",
  "song_name": "Blinding Lights - The Weeknd",
  "thumbnail_url": "https://i.scdn.co/image/ab67616d0000b273...",
  "duration": "00:03:20",
  "cdn": "<direct-mp3-url-resolved-live-for-this-request>",
  "is_audio": true
}

Unable to resolve404 Not Found

JSON
{
  "detail": "Unable to download from Spotify"
}

cdn is resolved live and isn't cached — fetch/save it promptly rather than storing the raw URL for later.

SoundCloud

GET/soundcloud/download

Download

Resolves and returns a SoundCloud track's audio directly — synchronous, no cache.

Query Parameters

queryrequiredA SoundCloud track URL, or a free-text search query
api_keyrequiredYour assigned API key

Example Request

curl -X GET "https://api.arcmusic.fun/soundcloud/download?query=https%3A%2F%2Fsoundcloud.com%2Fodesza%2Fa-moment-apart&api_key=YOUR_API_KEY"

Success200 OK

JSON
{
  "status": "success",
  "result": {
    "success": true,
    "cached": false,
    "url": "https://soundcloud.com/odesza/a-moment-apart",
    "cdn": "<direct-audio-url-resolved-live-for-this-request>",
    "name": "A Moment Apart - ODESZA",
    "thumbnail_url": "https://i1.sndcdn.com/artworks-....jpg",
    "is_audio": true,
    "is_video": false
  }
}

Unable to resolve404 Not Found

JSON
{
  "detail": "Unable to download from SoundCloud"
}

cdn is resolved live and isn't cached — fetch/save it promptly.

Unlike most other platforms, both SoundCloud endpoints wrap their payload in { status, result: {...} } rather than returning the fields at the top level.

JioSaavn

GET/jiosaavn/download

Download

Resolves a single-track JioSaavn song URL to a direct, decrypted 320kbps CDN link — synchronous, no cache. Album/playlist URLs are rejected; resolve those with Search above first and download each song_url individually.

Query Parameters

urlrequiredA JioSaavn song URL (album/playlist URLs are rejected)
api_keyrequiredYour assigned API key

Example Request

curl -X GET "https://api.arcmusic.fun/jiosaavn/download?url=https%3A%2F%2Fwww.jiosaavn.com%2Fsong%2Fkesariya%2FRVAJcRVXTG4&api_key=YOUR_API_KEY"

Success200 OK

JSON
{
  "success": true,
  "url": "https://www.jiosaavn.com/song/kesariya/RVAJcRVXTG4",
  "title": "Kesariya",
  "duration": "4:28",
  "thumbnail": "https://c.saavncdn.com/.../500x500.jpg",
  "song_url": "https://www.jiosaavn.com/song/kesariya/RVAJcRVXTG4",
  "cdn": "<direct-320kbps-audio-url-resolved-live-for-this-request>"
}

Invalid URL400 Bad Request

JSON
{
  "detail": "Invalid JioSaavn URL"
}

Album/playlist URL given400 Bad Request

JSON
{
  "detail": "Only single-track URLs are supported for download"
}

Unable to resolve404 Not Found

JSON
{
  "detail": "Unable to download from JioSaavn"
}

cdn is resolved live and isn't cached — fetch/save it promptly.

Apple Music

GET/applemusic/download

Download

Resolves any Apple Music URL — song, album, or playlist — to a direct MP3 CDN link, alongside metadata for the first track found. Synchronous, no job queue, no cache.

Query Parameters

urlrequiredApple Music song, album, or playlist URL
api_keyrequiredYour assigned API key

Example Request

curl -X GET "https://api.arcmusic.fun/applemusic/download?url=https%3A%2F%2Fmusic.apple.com%2Fus%2Fsong%2Fflowers%2F1670319317&api_key=YOUR_API_KEY"

Success200 OK

JSON
{
  "success": true,
  "url": "https://music.apple.com/us/song/flowers/1670319317",
  "title": "Flowers",
  "duration": "3:20",
  "thumbnail": "https://is1-ssl.mzstatic.com/.../600x600bb.jpg",
  "track_url": "https://music.apple.com/us/song/flowers/1670319317",
  "cdn": "<direct-mp3-url-resolved-live-for-this-request>"
}

Invalid URL400 Bad Request

JSON
{
  "detail": "Invalid Apple Music URL"
}

Unable to resolve404 Not Found

JSON
{
  "detail": "Unable to resolve a direct download URL"
}

cdn is resolved live and isn't cached — fetch/save it promptly.

For album/playlist URLs, the metadata fields (title, duration, thumbnail, track_url) describe the first track only — the cdn link corresponds to that same first track.

Social Downloads

Every platform below shares the same request shape: GET /{platform}/download?url=...&api_key=... — a single synchronous call returning { success, platform, url, cdn }. Pinterest and Reddit include one extra field on top of that shared shape (see their sections below) — everything else differs only in the accepted URL pattern.

GET/instagram/download

Instagram Download

Resolves a Instagram post URL and returns a direct CDN link to its media — synchronous, single request, no job queue, no cache.

Query Parameters

urlrequiredA Instagram post/video URL
api_keyrequiredYour assigned API key

Example Request

curl -X GET "https://api.arcmusic.fun/instagram/download?url=https%3A%2F%2Fwww.instagram.com%2Freel%2FC1a2B3c4D5e%2F&api_key=YOUR_API_KEY"

Success200 OK

JSON
{
  "success": true,
  "platform": "instagram",
  "url": "https://www.instagram.com/reel/C1a2B3c4D5e/",
  "cdn": "<direct-media-url-resolved-live-for-this-request>"
}

Unable to fetch404 Not Found

JSON
{
  "detail": "Unable to fetch media from Instagram"
}

Works for Reels, video posts, and image posts/carousels (first image only for carousels).

There's no is_video/is_audio field on this endpoint — check the cdn URL's content-type or extension.

cdn is resolved live and isn't cached — fetch/save it promptly.

GET/facebook/download

Facebook Download

Resolves a Facebook post URL and returns a direct CDN link to its media — synchronous, single request, no job queue, no cache.

Query Parameters

urlrequiredA Facebook post/video URL
api_keyrequiredYour assigned API key

Example Request

curl -X GET "https://api.arcmusic.fun/facebook/download?url=https%3A%2F%2Fwww.facebook.com%2Fwatch%2F%3Fv%3D1234567890123456&api_key=YOUR_API_KEY"

Success200 OK

JSON
{
  "success": true,
  "platform": "facebook",
  "url": "https://www.facebook.com/watch/?v=1234567890123456",
  "cdn": "<direct-media-url-resolved-live-for-this-request>"
}

Unable to fetch404 Not Found

JSON
{
  "detail": "Unable to fetch media from Facebook"
}

Accepts facebook.com, web.facebook.com, m.facebook.com, and fb.watch links.

Only public videos and Reels are accessible.

cdn is resolved live and isn't cached — fetch/save it promptly.

GET/threads/download

Threads Download

Resolves a Threads post URL and returns a direct CDN link to its media — synchronous, single request, no job queue, no cache.

Query Parameters

urlrequiredA Threads post/video URL
api_keyrequiredYour assigned API key

Example Request

curl -X GET "https://api.arcmusic.fun/threads/download?url=https%3A%2F%2Fwww.threads.net%2F%40username%2Fpost%2FC1a2B3c4D5e&api_key=YOUR_API_KEY"

Success200 OK

JSON
{
  "success": true,
  "platform": "threads",
  "url": "https://www.threads.net/@username/post/C1a2B3c4D5e",
  "cdn": "<direct-media-url-resolved-live-for-this-request>"
}

Unable to fetch404 Not Found

JSON
{
  "detail": "Unable to fetch media from Threads"
}

The post must have an attached video or image — text-only posts return a 404.

cdn is resolved live and isn't cached — fetch/save it promptly.

GET/bluesky/download

Bluesky Download

Resolves a Bluesky post URL and returns a direct CDN link to its media — synchronous, single request, no job queue, no cache.

Query Parameters

urlrequiredA Bluesky post/video URL
api_keyrequiredYour assigned API key

Example Request

curl -X GET "https://api.arcmusic.fun/bluesky/download?url=https%3A%2F%2Fbsky.app%2Fprofile%2Fuser.bsky.social%2Fpost%2F3k5xyzabc123&api_key=YOUR_API_KEY"

Success200 OK

JSON
{
  "success": true,
  "platform": "bluesky",
  "url": "https://bsky.app/profile/user.bsky.social/post/3k5xyzabc123",
  "cdn": "<direct-media-url-resolved-live-for-this-request>"
}

Unable to fetch404 Not Found

JSON
{
  "detail": "Unable to fetch media from Bluesky"
}

The post must have an attached video or image — text-only posts return a 404.

Video posts sometimes resolve to an HLS .m3u8 playlist instead of a single .mp4.

cdn is resolved live and isn't cached — fetch/save it promptly.

GET/tiktok/download

TikTok Download

Resolves a TikTok post URL and returns a direct CDN link to its media — synchronous, single request, no job queue, no cache.

Query Parameters

urlrequiredA TikTok post/video URL
api_keyrequiredYour assigned API key

Example Request

curl -X GET "https://api.arcmusic.fun/tiktok/download?url=https%3A%2F%2Fwww.tiktok.com%2F%40username%2Fvideo%2F7123456789012345678&api_key=YOUR_API_KEY"

Success200 OK

JSON
{
  "success": true,
  "platform": "tiktok",
  "url": "https://www.tiktok.com/@username/video/7123456789012345678",
  "cdn": "<direct-media-url-resolved-live-for-this-request>"
}

Unable to fetch404 Not Found

JSON
{
  "detail": "Unable to fetch media from TikTok"
}

Works with full tiktok.com links as well as shortened vm.tiktok.com / vt.tiktok.com links.

cdn is resolved live and isn't cached — fetch/save it promptly.

GET/twitter/download

Twitter / X Download

Resolves a Twitter / X post URL and returns a direct CDN link to its media — synchronous, single request, no job queue, no cache.

Query Parameters

urlrequiredA Twitter / X post/video URL
api_keyrequiredYour assigned API key

Example Request

curl -X GET "https://api.arcmusic.fun/twitter/download?url=https%3A%2F%2Fx.com%2Fusername%2Fstatus%2F1234567890123456789&api_key=YOUR_API_KEY"

Success200 OK

JSON
{
  "success": true,
  "platform": "twitter",
  "url": "https://x.com/username/status/1234567890123456789",
  "cdn": "<direct-media-url-resolved-live-for-this-request>"
}

Unable to fetch404 Not Found

JSON
{
  "detail": "Unable to fetch media from Twitter / X"
}

Both x.com and twitter.com links work.

The tweet must have an attached video — image-only or text-only tweets aren't supported.

cdn is resolved live and isn't cached — fetch/save it promptly.

GET/reddit/download

Reddit Download

Resolves a Reddit post URL and returns a direct CDN link to its media — synchronous, single request, no job queue, no cache.

Query Parameters

urlrequiredA Reddit post/video URL
api_keyrequiredYour assigned API key

Example Request

curl -X GET "https://api.arcmusic.fun/reddit/download?url=https%3A%2F%2Fwww.reddit.com%2Fr%2Fvideos%2Fcomments%2F1a2b3c4%2Fexample_post%2F&api_key=YOUR_API_KEY"

Success200 OK

JSON
{
  "success": true,
  "platform": "reddit",
  "url": "https://www.reddit.com/r/videos/comments/1a2b3c4/example_post/",
  "cdn": "<direct-media-url-resolved-live-for-this-request>",
  "caption": "Example post title"
}

Unable to fetch404 Not Found

JSON
{
  "detail": "Unable to fetch media from Reddit"
}

The post must have an attached video or image — link/text posts return a 404.

Reddit-hosted (v.redd.it) videos are served without audio by Reddit itself — this endpoint merges the audio track back in automatically.

This endpoint returns an extra caption field (the post's title) alongside the shared success/platform/url/cdn fields — it's null if no caption could be extracted.

cdn is resolved live and isn't cached — fetch/save it promptly.

GET/pinterest/download

Pinterest Download

Resolves a Pinterest post URL and returns a direct CDN link to its media — synchronous, single request, no job queue, no cache.

Query Parameters

urlrequiredA Pinterest post/video URL
api_keyrequiredYour assigned API key

Example Request

curl -X GET "https://api.arcmusic.fun/pinterest/download?url=https%3A%2F%2Fwww.pinterest.com%2Fpin%2F1234567890123456789%2F&api_key=YOUR_API_KEY"

Success200 OK

JSON
{
  "success": true,
  "platform": "pinterest",
  "url": "https://www.pinterest.com/pin/1234567890123456789/",
  "cdn": "<direct-media-url-resolved-live-for-this-request>",
  "type": "image"
}

Unable to fetch404 Not Found

JSON
{
  "detail": "Unable to fetch media from Pinterest"
}

Works for both image Pins and video Pins.

Also accepts pin.it short links.

This endpoint returns an extra type field ("image" or "video") alongside the shared success/platform/url/cdn fields — check it instead of guessing from the cdn URL.

cdn is resolved live and isn't cached — fetch/save it promptly.