
Video Downloader API for Your Own Website
A downloader website needs three parts: a page with a paste box, a small backend that keeps your API key secret, and a downloader API that turns the link into files. This page gives you the backend and the API; or we build and launch the whole branded site for a fixed price.

Key facts
- Endpoint
- POST /v1/resolve (one endpoint for every service)
- Free trial
- 20 result credits after email verification, no card
- Price
- from $19 for 7,500 results ($1.33–$2.53 per 1,000)
- Billing
- prepaid credits, no subscription, no expiry; failed or empty requests cost 0
- Credits per result
- 1 (Instagram, TikTok, X, Pinterest) or 2 (Stories, Highlights, Telegram)
- Limits
- up to 20 items per request; 120 requests per minute per account; 2 in progress at once on the trial, 8 on paid accounts
How the pieces fit
- The visitor pastes a link on your page, which POSTs
{"link": "..."}to your backend. - Your backend picks the service ID from the link and calls
POST https://developers.getinsaver.com/v1/resolvewith your key. - It returns the
itemsto the page, which shows the video or photos with download buttons.
A complete backend in one file
Node.js 18+, no packages. It maps Instagram, Stories, Highlights, TikTok, X, Pinterest and Telegram links to service IDs and never sends the key to the browser.
// server.mjs, Node.js 18+, no packages: the backend of your own downloader page.
// The browser posts a link to /api/download; only this server ever sees GIS_KEY.
import { createServer } from "node:http";
const API_URL = "https://developers.getinsaver.com/v1/resolve";
const HOSTS = { "instagram.com": "instagram", "tiktok.com": "tiktok", "x.com": "x", "twitter.com": "x", "pinterest.com": "pinterest", "pin.it": "pinterest", "t.me": "telegram" };
function serviceFor(link) {
const url = new URL(link);
const host = url.hostname.replace(/^(www|m|vm|vt)\./, "");
if (host === "instagram.com" && url.pathname.startsWith("/stories/highlights/")) return "instagram-highlight";
if (host === "instagram.com" && url.pathname.startsWith("/stories/")) return "instagram-story";
return HOSTS[host];
}
createServer(async (req, res) => {
const reply = (status, body) => { res.writeHead(status, { "Content-Type": "application/json" }); res.end(JSON.stringify(body)); };
if (req.method !== "POST" || req.url !== "/api/download") return reply(404, { error: "Not found" });
let raw = "";
for await (const chunk of req) { raw += chunk; if (raw.length > 4096) return reply(413, { error: "Too large" }); }
let service, link;
try { link = JSON.parse(raw).link; service = serviceFor(link); } catch { service = null; }
if (!service) return reply(400, { error: "Paste a public Instagram, TikTok, X, Pinterest or Telegram link." });
try {
const response = await fetch(API_URL, {
method: "POST",
headers: { Authorization: `Bearer ${process.env.GIS_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({ service, url: link, max_results: 10 }),
signal: AbortSignal.timeout(130_000)
});
const data = await response.json();
if (!response.ok) return reply(response.status, { error: data.message, code: data.code });
reply(200, { items: data.items, author: data.metadata?.author ?? null });
} catch {
reply(502, { error: "The downloader did not answer. Try again in a moment." });
}
}).listen(Number(process.env.PORT || 3000));
Run it with GIS_KEY=gis_live_... node server.mjs behind your web server, and point your page's form at /api/download. Put your own rate limit per visitor in front of it, so one visitor cannot spend your credits.
What each download costs you
1 credit per returned Instagram, TikTok, X or Pinterest item and 2 per Story, Highlight or Telegram item. Links that fail cost nothing. Prepaid packs start at $19; see pricing for the price per 1,000 results.
Or we build the site for you
| Package | What you get | Delivery | Price |
|---|---|---|---|
| API Connect | Connect one GetInSaver API service to an existing website. | 2–3 business days | $149 |
| Launch Site | A branded, single-service downloader website ready to launch. | 3–5 business days | $199 |
| Multi-tool Site | A polished multi-service starter product with dedicated SEO pages. | 5–7 business days | $299 |
| Full Platform | A complete branded platform with every supported GetInSaver service. | 7–10 business days | $599 |
Errors your page should show
| HTTP | Code | What to do |
|---|---|---|
| 402 | INSUFFICIENT_CREDITS | Top up, or lower max_results: a request reserves max_results × credits per result first. |
| 422 | UPSTREAM_REJECTED | The post is private, deleted, expired or login-only. Show the message to your user; nothing was charged. |
| 429 | RATE_LIMITED / CONCURRENCY_LIMIT | Wait for Retry-After seconds and retry. 120 requests per minute per account; 2 at once on the trial, 8 after buying credits. |
| 502 / 504 | UPSTREAM_* | Temporary platform failure. Safe to retry; nothing was charged. |
Every error body is JSON with a stable code and a readable message. The full list is in the API reference.
FAQ
Can visitors call the API directly from the browser?
No. The key would be public and anyone could spend your credits. Always go through a backend like the one above.
Which platforms can my site support?
Instagram posts, Reels, Stories and Highlights, TikTok, X/Twitter, Pinterest and public Telegram channel posts, all through the same request.
What do the website packages include?
Each package on the website setup page lists what it includes, its delivery time and its bug-fix window. Ask us before ordering if you need something that is not listed, such as hosting.
Do failed requests cost credits?
No. Credits are reserved while a request runs and refunded in full when it fails or finds no media. You only pay for items that come back.
Related guides
- PHP Instagram Downloader API
- Node.js Social Media Downloader API
- Python Instagram and TikTok Downloader API
Updated 2026-10-30. The code on this page is executed by our test suite against the API server before every release.