ReelsDownloader API
ReelsDownloader runs on a single resolution gateway: one endpoint takes a public social-media URL and returns the downloadable media behind it. The website and the Android app are both just clients of that gateway. This page documents the contract.
Access is by request. The gateway is not an open endpoint — every call carries a client credential, and keys are issued per integration so usage can be attributed and rate-limited. Write to [email protected] with what you are building and roughly what volume you expect.
What it does
Give it a link. It works out which platform the link belongs to, calls whichever upstream resolver is currently healthiest for that platform, normalises wildly different response shapes into one schema, and hands back a list of downloadable files.
The value is in the normalisation and the fallbacks. Nineteen platforms return media in nineteen different structures, several change without notice, and any individual resolver fails regularly. The gateway races several in parallel, ranks them on live success rate and latency, and retries elsewhere when one returns nothing.
Endpoint
POST /resolve
Content-Type: application/json
{
"url": "https://www.instagram.com/reel/Dclok0_SJMj",
"no_challenge": true
}
url is the only required field. no_challenge asks the gateway to fail rather than return an
interactive human-verification challenge — set it when there is no human present to solve one.
Response
{
"medias": [
{ "url": "https://…", "quality": "720p", "kind": "video" },
{ "url": "https://…", "quality": "Thumbnail", "kind": "image" }
],
"meta": {
"title": "…",
"author": "…",
"authorUsername": "…",
"thumbnail": "https://…",
"duration": "…"
}
}
kind is one of video, image, or audio. quality is a human-readable label, not a
guaranteed format — providers describe their renditions inconsistently, and the gateway passes the
label through rather than inventing a standard that would be wrong half the time.
A post can legitimately return many entries: a carousel returns one per slide, and a single video often returns several renditions so the caller can choose.
Media URLs expire
This is the detail that catches most integrations. The URLs in medias[] are time-limited. Most
platforms sign their CDN links with an expiry measured in hours, and some in minutes. Do not
store a media URL and expect it to work later — store the original post URL and re-resolve when
you need the file. A link that worked this morning and 403s this afternoon has not been deleted;
its signature has aged out.
Abstaining
Some URL shapes have no server-side resolver. An Instagram profile link is the current example: the only provider that returns a profile's posts refuses datacenter traffic, so the gateway answers
{ "medias": [], "status": "abstain", "reason": "no_provider_for_shape", "shape": "profile" }
rather than returning something technically non-empty and substantively wrong. Treat an empty
medias array as "nothing available", never as an error.
Errors
| Code | Meaning |
|---|---|
invalid_url |
Not a well-formed URL |
unsupported |
Platform explicitly not served |
challenge_required |
An upstream provider wants a human check |
rate_limit |
Too many requests from this key |
registry_unavailable |
The gateway could not read its provider registry |
all_providers_failed |
Every eligible provider was tried and none returned media |
all_providers_failed is usually transient — an upstream resolver being down rather than the post
being unavailable. Retrying after a short delay frequently succeeds.
Supported platforms
Instagram, TikTok, Facebook, Twitter/X, Reddit, Pinterest, Snapchat, Threads, LinkedIn, Vimeo, Dailymotion, Bluesky, Tumblr, VK, Kwai, Likee, 9GAG, BitChute and SoundCloud.
YouTube is deliberately excluded and will not be added.
What it will not do
- Private accounts, protected posts, and content behind a login. The gateway resolves what is already publicly served; nothing here bypasses an access control.
- Bulk scraping of an entire account or hashtag. It is built for resolving individual links a person asked for.
- DRM-protected streams.
Rate limits and fair use
Limits are set per key against expected volume. If you need more, say so when you ask — a higher limit agreed in advance is simpler for both of us than a key that keeps tripping.
A note on MCP
We do not currently publish a Model Context Protocol server. The gateway's contract is small enough that wrapping it in MCP is straightforward, and it is on the list — but we would rather ship one that works than a page claiming one exists. If you want it, say so and it moves up.