DownloadAll logoDownloadAll

Developer API

The same engines that power this site, exposed as a REST API. Built for Telegram bots, download managers, and bulk automation.

What it can download

SourceWorksNotes
TikTokVerifiedno watermark; audio-only available. Verified end-to-end: 2.9 MB MP4 fetched with a valid ftyp header.
PinterestVerifiedimage pins, video pins, and story pins. Returns status: "picker" with an assets[] array. Verified: 67 KB and 198 KB originals pulled from i.pinimg.com/originals/.
DouyinUnavailablethe web API needs an a_bogus request signature that neither engine implements, so cookies alone are not enough. Requests return 502 engine_error.
BilibiliVerifiedworks with a signed-in session, including b23.tv short links. DASH video + audio are merged on the fly. Verified end-to-end: 3 MB streamed with a valid ftyp header.
YouTubePartialpublic videos work; age-restricted or sign-in-required ones return 401 link.login.

Authentication

Send your key in either header. Each successful call decrements your quota by 1.

Authorization: Bearer dl_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

# or
X-API-Key: dl_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Check your remaining quota at any time (this call is free):

curl https://downloadall.app/api/v1/keys?key=dl_xxx

POST /api/v1/analyze

Resolve a shared link into a downloadable URL. Costs 1 call.

Request body

{
  "url": "https://www.tiktok.com/@user/video/123",
  "downloadMode": "auto",     // "auto" | "audio" | "mute"
  "videoQuality": "1080",      // optional
  "audioFormat": "mp3",        // optional
  "audioBitrate": "128"        // optional
}

Single media response

{
  "ok": true,
  "status": "tunnel",
  "url": "https://...signed-tunnel-url...",
  "filename": "video.mp4",
  "title": "Original title"
}

Multi-asset response (Pinterest story pins)

When a pin holds several images or videos, the API returns a picker instead of a single file — pick one and pass it back to /api/v1/download.

{
  "ok": true,
  "status": "picker",
  "title": "Pin title",
  "assets": [
    { "type": "image", "url": "https://...", "thumb": "https://...", "format": "jpg" }
  ]
}

Errors

All errors use HTTP status codes and a consistent body:

{
  "error": {
    "code": "link.unsupported",
    "message": "This platform is not supported by the API yet."
  }
}
StatuscodeMeaning
400missing_urlno url in body
401invalid_api_keykey missing or revoked
401link.loginsource needs a login
422link.unsupportedplatform not supported
429quota_exceededplan limit reached
429link.rate_limitthe source is rate limiting us; retry shortly
503engine.unavailableengine temporarily down; retry

GET /api/v1/download

Streams the media file through our server. Costs 1 call.

Important: call this from the same server that called analyze.

Tunnel URLs are signed and validate the requesting IP. Fetching them from a different machine returns 403. That means your bot and its API client must live on the same host (or your API client must proxy through it).

curl -L -H "X-API-Key: dl_xxx" \
  "https://downloadall.app/api/v1/download?u=<tunnel-url>&filename=video.mp4" \
  -o video.mp4

Supports Range requests, so resumable downloads work.

Pricing

PlanPriceCalls / periodRate limit
Free$0205 req/min
Starter$9.91,00030 req/min
Pro$4910,000120 req/min

The billing period runs monthly and resets on the 21st, aligned with our infrastructure cycle. Every response carries X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset.

Reselling the API as your own service is not permitted without a written agreement — see the Terms.

End-to-end example

# 1. resolve the link
curl -X POST https://downloadall.app/api/v1/analyze \
  -H "X-API-Key: dl_xxx" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://www.tiktok.com/@user/video/123"}'

# -> {"ok":true,"status":"tunnel","url":"https://...","filename":"v.mp4"}

# 2. download it (same machine)
curl -L -H "X-API-Key: dl_xxx" \
  "https://downloadall.app/api/v1/download?u=<paste-url>&filename=v.mp4" \
  -o v.mp4