Skip to content
Documentation

API documentation

Download public videos and audio from a link, from your code with the REST API or from your AI assistant with the MCP server. One API key works for both.

Quickstart

  1. 1Create an account and an API key in your dashboard (it starts with vr_). Confirming your email adds 2 free credits.
  2. 2Send a link to POST /downloads. You get a download_id right away (HTTP 202).
  3. 3Poll GET /downloads/{id} every few seconds until status is ready, then fetch download_url.
1. Start a download
curl -X POST "https://www.videoresolver.com/api/v1/downloads" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://www.youtube.com/watch?v=jNQXAC9IVRw","format":"mp4"}'
202 Accepted
{
  "download_id": "162b76ab-833e-4720-b687-dac284d479aa",
  "title": "Me at the zoo",
  "channel": "jawed",
  "platform": "Youtube",
  "thumbnail": "https://i.ytimg.com/vi/jNQXAC9IVRw/hqdefault.jpg?sqp=…",
  "duration_seconds": 19,
  "format": "mp4",
  "quality": "best",
  "status": "processing",
  "progress": 0,
  "credits": 1,
  "size_bytes": null,
  "created_at": "2026-11-02T10:30:31.120Z",
  "expires_at": null
}
2. Check it until it's ready
curl "https://www.videoresolver.com/api/v1/downloads/162b76ab-833e-4720-b687-dac284d479aa" \
  -H "Authorization: Bearer YOUR_API_KEY"
200 OK
{
  "download_id": "162b76ab-833e-4720-b687-dac284d479aa",
  "title": "Me at the zoo",
  "channel": "jawed",
  "platform": "Youtube",
  "thumbnail": "https://i.ytimg.com/vi/jNQXAC9IVRw/hqdefault.jpg?sqp=…",
  "duration_seconds": 19,
  "format": "mp4",
  "quality": "best",
  "status": "ready",
  "progress": 100,
  "credits": 1,
  "size_bytes": 475989,
  "created_at": "2026-11-02T10:30:31.120Z",
  "expires_at": "2026-11-04T10:30:46.678Z",
  "download_url": "https://www.videoresolver.com/api/downloads/162b76ab-833e-4720-b687-dac284d479aa?token=…"
}

Authentication

Every request carries your personal API key as a Bearer token. Create one key per tool or script in your dashboard: the key is shown once, and revoking it stops it right away. Keep keys on your server, never in browser code.

Header
Authorization: Bearer YOUR_API_KEY

Base URL: https://www.videoresolver.com/api/v1. Requests and responses are JSON. A missing or invalid key returns 401 with the code unauthorized.

Endpoints

get/account

Your plan and the credits left, monthly allowance and packs included.

Response 200
FieldDescription
planstring · requiredPlan id One of: free, basic, pro, mega.
plan_namestring · requiredDisplay name of the plan
creditsinteger · requiredCredits left, packs included
renews_atdate-time | null · requiredNext renewal of a paid plan
manage_urluri · requiredWhere to change plan or buy a pack
Example
curl "https://www.videoresolver.com/api/v1/account" \
  -H "Authorization: Bearer YOUR_API_KEY"
200 OK
{
  "plan": "basic",
  "plan_name": "Basic",
  "credits": 987,
  "renews_at": "2026-12-01T09:12:44.000Z",
  "manage_url": "https://www.videoresolver.com/app"
}

Errors: 401, 429, 500. See Errors.

get/media

Title, duration and the credits a download would cost. Nothing is downloaded or charged.

Parameters
FieldDescription
urluri · query · requiredPublic link to the video or audio
Response 200
FieldDescription
titlestring · required
channelstring | null · optionalAuthor or channel
platformstring | null · optionalSite the media comes from
thumbnailuri | null · optional
duration_secondsinteger · required
credits_requiredinteger · requiredWhat a download costs: 1 per started minute
Example
curl -G "https://www.videoresolver.com/api/v1/media" \
  --data-urlencode "url=https://www.youtube.com/watch?v=jNQXAC9IVRw" \
  -H "Authorization: Bearer YOUR_API_KEY"
200 OK
{
  "title": "Me at the zoo",
  "channel": "jawed",
  "platform": "Youtube",
  "thumbnail": "https://i.ytimg.com/vi/jNQXAC9IVRw/hqdefault.jpg?sqp=…",
  "duration_seconds": 19,
  "credits_required": 1
}

Errors: 400, 401, 422, 429, 500, 502. See Errors.

post/downloads

Looks up the link and starts the download. Downloads cost 1 credit per started minute of media. Nothing is charged when the balance doesn't cover the media (402), and a failed download is refunded. Then poll GET /downloads/{id} until status is ready.

Body
FieldDescription
urluri · requiredPublic link to the video or audio
formatstring · optionalmp4 for video, mp3, m4a or wav for audio only. Anything other than mp4 at best quality needs a paid plan or credits from a pack. Default: mp4.
qualitystring · optionalDepends on the format: mp4: best, 1080p, 720p, 480p, 360p; mp3: best, 320kbps, 128kbps; m4a: best, 320kbps, 128kbps; wav: best. Default: best.
Response 202
FieldDescription
download_iduuid · required
titlestring · optional
channelstring | null · optional
platformstring | null · optional
thumbnailuri | null · optional
duration_secondsinteger · optional
formatstring · requiredOne of: mp4, mp3, m4a, wav.
qualitystring · requiredOne of: best, 1080p, 720p, 480p, 360p, 320kbps, 128kbps.
statusstring · requiredSee the statuses below One of: analyzed, processing, storing, ready, failed, expired.
progressinteger · required
creditsinteger · requiredCredits this download costs
size_bytesinteger | null · optionalFile size, once ready
created_atdate-time · optional
expires_atdate-time | null · optionalWhen the file is deleted, 48 hours after it's ready
download_urluri · optionalOnly when status is ready: signed link valid for 1 hour
Example
curl -X POST "https://www.videoresolver.com/api/v1/downloads" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://www.youtube.com/watch?v=jNQXAC9IVRw","format":"mp4"}'
202 Accepted
{
  "download_id": "162b76ab-833e-4720-b687-dac284d479aa",
  "title": "Me at the zoo",
  "channel": "jawed",
  "platform": "Youtube",
  "thumbnail": "https://i.ytimg.com/vi/jNQXAC9IVRw/hqdefault.jpg?sqp=…",
  "duration_seconds": 19,
  "format": "mp4",
  "quality": "best",
  "status": "processing",
  "progress": 0,
  "credits": 1,
  "size_bytes": null,
  "created_at": "2026-11-02T10:30:31.120Z",
  "expires_at": null
}

Errors: 400, 401, 402, 403, 422, 429, 500, 502. See Errors.

get/downloads/{id}

Status and progress. Once status is ready, download_url is a signed link valid for 1 hour: call again for a fresh one while the file is kept (48 hours). Progress is refreshed about every 15 seconds, so polling every 5 to 10 seconds is plenty.

Parameters
FieldDescription
iduuid · path · requireddownload_id returned when the download started
Response 200
FieldDescription
download_iduuid · required
titlestring · optional
channelstring | null · optional
platformstring | null · optional
thumbnailuri | null · optional
duration_secondsinteger · optional
formatstring · requiredOne of: mp4, mp3, m4a, wav.
qualitystring · requiredOne of: best, 1080p, 720p, 480p, 360p, 320kbps, 128kbps.
statusstring · requiredSee the statuses below One of: analyzed, processing, storing, ready, failed, expired.
progressinteger · required
creditsinteger · requiredCredits this download costs
size_bytesinteger | null · optionalFile size, once ready
created_atdate-time · optional
expires_atdate-time | null · optionalWhen the file is deleted, 48 hours after it's ready
download_urluri · optionalOnly when status is ready: signed link valid for 1 hour
Example
curl "https://www.videoresolver.com/api/v1/downloads/162b76ab-833e-4720-b687-dac284d479aa" \
  -H "Authorization: Bearer YOUR_API_KEY"
200 OK
{
  "download_id": "162b76ab-833e-4720-b687-dac284d479aa",
  "title": "Me at the zoo",
  "channel": "jawed",
  "platform": "Youtube",
  "thumbnail": "https://i.ytimg.com/vi/jNQXAC9IVRw/hqdefault.jpg?sqp=…",
  "duration_seconds": 19,
  "format": "mp4",
  "quality": "best",
  "status": "ready",
  "progress": 100,
  "credits": 1,
  "size_bytes": 475989,
  "created_at": "2026-11-02T10:30:31.120Z",
  "expires_at": "2026-11-04T10:30:46.678Z",
  "download_url": "https://www.videoresolver.com/api/downloads/162b76ab-833e-4720-b687-dac284d479aa?token=…"
}

Errors: 401, 404, 429, 500. See Errors.

get/downloads

Your most recent downloads, newest first.

Parameters
FieldDescription
limitinteger · query · optionalHow many downloads to return Default: 20.
Response 200
FieldDescription
downloadsDownload[] · required
Example
curl -G "https://www.videoresolver.com/api/v1/downloads" \
  --data-urlencode "limit=5" \
  -H "Authorization: Bearer YOUR_API_KEY"
200 OK
{
  "downloads": [
    {
      "download_id": "162b76ab-833e-4720-b687-dac284d479aa",
      "title": "Me at the zoo",
      "channel": "jawed",
      "platform": "Youtube",
      "thumbnail": "https://i.ytimg.com/vi/jNQXAC9IVRw/hqdefault.jpg?sqp=…",
      "duration_seconds": 19,
      "format": "mp4",
      "quality": "best",
      "status": "ready",
      "progress": 100,
      "credits": 1,
      "size_bytes": 475989,
      "created_at": "2026-11-02T10:30:31.120Z",
      "expires_at": "2026-11-04T10:30:46.678Z",
      "download_url": "https://www.videoresolver.com/api/downloads/162b76ab-833e-4720-b687-dac284d479aa?token=…"
    }
  ]
}

Errors: 401, 429, 500. See Errors.

Download object

Download
FieldDescription
download_iduuid · required
titlestring · optional
channelstring | null · optional
platformstring | null · optional
thumbnailuri | null · optional
duration_secondsinteger · optional
formatstring · requiredOne of: mp4, mp3, m4a, wav.
qualitystring · requiredOne of: best, 1080p, 720p, 480p, 360p, 320kbps, 128kbps.
statusstring · requiredSee the statuses below One of: analyzed, processing, storing, ready, failed, expired.
progressinteger · required
creditsinteger · requiredCredits this download costs
size_bytesinteger | null · optionalFile size, once ready
created_atdate-time · optional
expires_atdate-time | null · optionalWhen the file is deleted, 48 hours after it's ready
download_urluri · optionalOnly when status is ready: signed link valid for 1 hour
Statuses
StatusMeaning
analyzedLooked up but not started (e.g. after a 402). Not charged.
processingCharged and downloading; progress goes from 0 to 98.
storingDownloaded, being saved to private storage.
readydownload_url is set: a signed link valid for 1 hour.
failedCouldn't be downloaded; the credits were refunded.
expiredThe file was deleted after 48 hours.

Errors

Errors use the HTTP status and a JSON body with a stable code to branch on, and a message to show or log.

402 Payment Required
{
  "error": {
    "code": "insufficient_credits",
    "message": "Not enough credits. Choose a plan or a credit pack in your account. 1 more credit needed."
  }
}
Error codes
HTTPCodeWhen
400invalid_urlThe url is missing or isn't an http(s) link.
400invalid_optionThe format or quality isn't supported. Qualities depend on the format (mp4: best, 1080p, 720p, 480p, 360p; mp3: best, 320kbps, 128kbps; m4a: best, 320kbps, 128kbps; wav: best).
401unauthorizedThe API key is missing, revoked or invalid.
402insufficient_creditsThe balance doesn't cover the media. The message says how many credits are missing; nothing is charged.
403paid_optionAnything other than mp4 at best quality needs a paid plan or credits from a pack.
404not_foundNo download with this id on your account.
422unreadable_videoThe media is private, deleted, age-restricted or from an unsupported site.
422unsupported_liveLive streams and media without a duration can't be downloaded.
429rate_limitedMore than 60 lookups in an hour, or too many at once. Retry later.
502unreadable_videoThe media couldn't be read right now. Retry in a moment.
500genericUnexpected error on our side. Retry in a moment.

Billing & limits

  • Downloads cost 1 credit per started minute of media. Credits are charged only if your balance covers the media (otherwise 402, nothing charged) and refunded automatically when a download fails.
  • Looking a link up with GET /media is free. Lookups (GET /media and POST /downloads) are limited to 60 per hour per account (429 beyond).
  • Files are kept 48 hours. download_url is valid 1 hour: get the download again for a fresh link.
  • Choosing the format and quality needs a paid plan or credits from a pack; otherwise ask for mp4 at best quality (or leave both out).
Formats and qualities
FormatKindQualities
mp4videobest, 1080p, 720p, 480p, 360p
mp3audiobest, 320kbps, 128kbps
m4aaudiobest, 320kbps, 128kbps
wavaudiobest

MCP server

The MCP server lets Claude, ChatGPT, Cursor or any MCP client download media for you, with the same API key. It uses Streamable HTTP with stateless JSON responses at https://www.videoresolver.com/api/mcp. Authenticate with the Authorization header, or ?key= for clients that only accept a URL. Your dashboard has one-click setups for each client.

Claude Code
claude mcp add --transport http videoresolver https://www.videoresolver.com/api/mcp --header "Authorization: Bearer YOUR_API_KEY"
mcpServers config
{
  "mcpServers": {
    "videoresolver": {
      "url": "https://www.videoresolver.com/api/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}
Tools
ToolArgumentsWhat it does
get_accountnoneCurrent plan and remaining credits. Downloads cost 1 credit per started minute of media.
get_media_infourlLook up a media link (YouTube, X, LinkedIn, Instagram, TikTok, Facebook…) without downloading: title, channel, duration and the credits a download would cost. Free.
download_mediaurl, format?, quality?Start downloading a media link. Downloads cost 1 credit per started minute of media. Charged only if the balance covers it, refunded if it fails. Then poll get_download with the returned download_id until status is ready.
get_downloaddownload_idStatus and progress of a download. When status is ready, download_url is a link valid for 1 hour: give it to the user, or call again for a fresh one. Wait about 10 seconds between calls.
list_downloadslimit?Most recent downloads of the account, newest first.

Start downloading

Create an account, confirm your email and get 2 free credits to try the API.