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.funRouting
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
- Create an account and sign in on this site.
- Go to Plans and pick a plan — a free tier is available for testing.
- 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 "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:
{
"detail": "Invalid API key"
}| 400 | Bad Request — malformed input (invalid URL, unrecognized ID/link) |
| 403 | Forbidden — invalid/deactivated key, no active plan, or plan expired |
| 404 | Not Found — no results, media unavailable, or an unknown job_id |
| 429 | Too Many Requests — daily request or video limit reached |
| 500 | Internal Server Error — an unexpected failure upstream; safe to retry |
YouTube
/youtube/v2/searchSearch
Resolves a free-text query, a full YouTube URL, or a bare 11-character video ID to one or more results. A URL/ID returns a single exact match instead of a result list.
Query Parameters
queryrequired | Free-text search query, a YouTube URL, or an 11-char video ID |
limit | Max results to return, 1–20 (default 10). Ignored when query is a URL/ID. |
api_keyrequired | Your assigned API key |
Example Request
curl -X GET "https://api.arcmusic.fun/youtube/v2/search?query=lofi%20hip%20hop%20radio&limit=5&api_key=YOUR_API_KEY"Success — 200 OK
{
"status": "success",
"query": "lofi hip hop radio",
"results": [
{
"video_id": "5qap5aO4i9A",
"title": "lofi hip hop radio 📚 beats to relax/study to",
"duration": "LIVE",
"views": "1.2M watching",
"channel": "Lofi Girl",
"thumbnail": "https://i.ytimg.com/vi/5qap5aO4i9A/hqdefault.jpg",
"url": "https://www.youtube.com/watch?v=5qap5aO4i9A"
}
]
}No results — 404 Not Found
{
"detail": "No results found"
}duration is YouTube's raw display string (e.g. "3:45", "1:02:03", or "LIVE") — it isn't zero-padded like the playlist/download endpoints.
/youtube/v2/playlistPlaylist
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
linkrequired | YouTube playlist link or playlist ID |
limit | Max tracks to return, 1–200 (default 100) |
api_keyrequired | Your 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"Success — 200 OK
{
"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 link — 400 Bad Request
{
"detail": "Invalid YouTube playlist link"
}Not found / empty — 404 Not Found
{
"detail": "Playlist not found, private, or empty — check server logs for details"
}/youtube/v2/downloadDownload — 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
queryrequired | YouTube video ID or full URL |
isVideo | true downloads video, false (default) downloads audio-only |
api_keyrequired | Your 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
{
"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
{
"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 — queued — 200 OK
{
"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.
/youtube/jobStatusDownload — 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_idrequired | The job_id returned by /youtube/v2/download |
Example Request
curl -X GET "https://api.arcmusic.fun/youtube/jobStatus?job_id=f331659faf05717c"Done — 200 OK
{
"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
}
}Error — 200 OK
{
"status": "success",
"job": {
"status": "error",
"result": null,
"error": "all_methods_failed"
}
}Unknown / expired job — 404 Not Found
{
"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
/spotify/playlistPlaylist
Fetches every track in a Spotify playlist — name, Spotify track URL, and duration.
Query Parameters
linkrequired | Spotify playlist link |
api_keyrequired | Your 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"Success — 200 OK
{
"status": "success",
"total": 1,
"tracks": [
{
"name": "Blinding Lights - The Weeknd",
"url": "https://open.spotify.com/track/0VjIjW4GlUZAMYd2vXMi3b",
"duration": "00:03:20"
}
]
}Invalid link — 400 Bad Request
{
"detail": "Invalid Spotify playlist link"
}Not found / empty — 404 Not Found
{
"detail": "Playlist not found, private, or empty — check server logs for the Spotify API error"
}/spotify/downloadDownload
Resolves and returns a Spotify track directly — synchronous, no job queue, no cache.
Query Parameters
linkrequired | Spotify track link |
api_keyrequired | Your 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"Success — 200 OK
{
"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 resolve — 404 Not Found
{
"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
/soundcloud/searchSearch
Looks up a track's metadata — accepts a SoundCloud URL or a free-text query.
Query Parameters
queryrequired | A SoundCloud track URL, or a free-text search query |
api_keyrequired | Your assigned API key |
Example Request
curl -X GET "https://api.arcmusic.fun/soundcloud/search?query=odesza%20a%20moment%20apart&api_key=YOUR_API_KEY"Success — 200 OK
{
"status": "success",
"result": {
"title": "A Moment Apart",
"url": "https://soundcloud.com/odesza/a-moment-apart",
"uploader": "ODESZA",
"duration": 274,
"plays": 12345678,
"likes": 234567,
"comments": 1234,
"thumbnail": "https://i1.sndcdn.com/artworks-....jpg",
"description": "...",
"upload_date": "2017-09-08T00:00:00Z",
"id": 336236321
}
}No results — 404 Not Found
{
"detail": "No results found"
}duration is in whole seconds (an integer), unlike the HH:MM:SS strings used elsewhere in this API.
plays, likes, comments, description, upload_date, and id are passed straight through from SoundCloud and may be null/missing on some tracks.
/soundcloud/downloadDownload
Resolves and returns a SoundCloud track's audio directly — synchronous, no cache.
Query Parameters
queryrequired | A SoundCloud track URL, or a free-text search query |
api_keyrequired | Your 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"Success — 200 OK
{
"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 resolve — 404 Not Found
{
"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
/jiosaavn/searchSearch
Resolves an actual JioSaavn song, album, or playlist URL to metadata for every track it contains. This is not a free-text search — the url param must be a real JioSaavn link.
Query Parameters
urlrequired | A JioSaavn song, album, or playlist URL |
api_keyrequired | Your assigned API key |
Example Request
curl -X GET "https://api.arcmusic.fun/jiosaavn/search?url=https%3A%2F%2Fwww.jiosaavn.com%2Fsong%2Fkesariya%2FRVAJcRVXTG4&api_key=YOUR_API_KEY"Success — 200 OK
{
"success": true,
"type": "song",
"url": "https://www.jiosaavn.com/song/kesariya/RVAJcRVXTG4",
"total": 1,
"tracks": [
{
"title": "Kesariya",
"duration": "4:28",
"thumbnail": "https://c.saavncdn.com/.../500x500.jpg",
"song_url": "https://www.jiosaavn.com/song/kesariya/RVAJcRVXTG4"
}
]
}Invalid URL — 400 Bad Request
{
"detail": "Invalid JioSaavn URL"
}No results — 404 Not Found
{
"detail": "No tracks found for this JioSaavn URL"
}type is one of song, album, or playlist depending on the URL you passed in.
duration is a raw M:SS-style string (not zero-padded HH:MM:SS like the playlist endpoints on other platforms).
There's no cdn field here — this endpoint is metadata-only. Feed a track's song_url into /jiosaavn/download to get a playable link.
/jiosaavn/downloadDownload
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
urlrequired | A JioSaavn song URL (album/playlist URLs are rejected) |
api_keyrequired | Your 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"Success — 200 OK
{
"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 URL — 400 Bad Request
{
"detail": "Invalid JioSaavn URL"
}Album/playlist URL given — 400 Bad Request
{
"detail": "Only single-track URLs are supported for download"
}Unable to resolve — 404 Not Found
{
"detail": "Unable to download from JioSaavn"
}cdn is resolved live and isn't cached — fetch/save it promptly.
Apple Music
/applemusic/searchSearch
Resolves a song, album, or playlist Apple Music URL to rich metadata. A song URL returns its own metadata; an album or playlist URL returns metadata for every track it contains. No CDN link here — this is metadata-only, use Download below for a playable link.
Query Parameters
urlrequired | Apple Music song, album, or playlist URL |
api_keyrequired | Your assigned API key |
Example Request
curl -X GET "https://api.arcmusic.fun/applemusic/search?url=https%3A%2F%2Fmusic.apple.com%2Fus%2Fsong%2Fflowers%2F1670319317&api_key=YOUR_API_KEY"Success — 200 OK
{
"success": true,
"type": "song",
"url": "https://music.apple.com/us/song/flowers/1670319317",
"total": 1,
"tracks": [
{
"title": "Flowers",
"artist": "Miley Cyrus",
"album": "Endless Summer Vacation",
"duration": "3:20",
"thumbnail": "https://is1-ssl.mzstatic.com/.../600x600bb.jpg",
"track_url": "https://music.apple.com/us/song/flowers/1670319317"
}
]
}Invalid URL — 400 Bad Request
{
"detail": "Invalid Apple Music URL"
}No results — 404 Not Found
{
"detail": "No tracks found for this Apple Music URL"
}type is one of song, album, or playlist depending on the URL you passed in.
duration is a raw M:SS-style string (not zero-padded HH:MM:SS).
There is no /applemusic/playlist endpoint — album and playlist links both go through this same /applemusic/search endpoint.
/applemusic/downloadDownload
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
urlrequired | Apple Music song, album, or playlist URL |
api_keyrequired | Your 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"Success — 200 OK
{
"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 URL — 400 Bad Request
{
"detail": "Invalid Apple Music URL"
}Unable to resolve — 404 Not Found
{
"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./instagram/downloadInstagram 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
urlrequiredapi_keyrequiredExample Request
Success — 200 OK
Unable to fetch — 404 Not Found
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.
/facebook/downloadFacebook 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
urlrequiredapi_keyrequiredExample Request
Success — 200 OK
Unable to fetch — 404 Not Found
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.
/threads/downloadThreads 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
urlrequiredapi_keyrequiredExample Request
Success — 200 OK
Unable to fetch — 404 Not Found
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.
/bluesky/downloadBluesky 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
urlrequiredapi_keyrequiredExample Request
Success — 200 OK
Unable to fetch — 404 Not Found
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.
/tiktok/downloadTikTok 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
urlrequiredapi_keyrequiredExample Request
Success — 200 OK
Unable to fetch — 404 Not Found
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.
/twitter/downloadTwitter / 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
urlrequiredapi_keyrequiredExample Request
Success — 200 OK
Unable to fetch — 404 Not Found
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.
/reddit/downloadReddit 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
urlrequiredapi_keyrequiredExample Request
Success — 200 OK
Unable to fetch — 404 Not Found
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.
/pinterest/downloadPinterest 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
urlrequiredapi_keyrequiredExample Request
Success — 200 OK
Unable to fetch — 404 Not Found
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.