Stockzen API
Bring Stockzen into your own workflow: resolve an Envato Elements, Storyblocks, Vecteezy, MotionArray, Flaticon or Magnific (formerly Freepik) item URL into the original file (and its license certificate where the provider issues one) with one HTTPS call, using the same plan and daily allowance as your account.
https://stockzen.io/api/v1
JSON in, JSON out · UTF‑8 · all times are ISO‑8601 UTC
Your API key
API keys are issued per member account and inherit its plan and limits. Log in to create yours — it takes one click.
Quickstart
- Create a key above and export it:
export STOCKZEN_API_KEY=sz_live_… - POST the item URL (Envato, Storyblocks, Vecteezy, MotionArray, Flaticon or Magnific) to
/downloads. You get back a signed file link, a license link where the provider issues one, and your remaining allowance. - GET the links to stream the file and the PDF. They stay valid for one hour.
curl -X POST https://stockzen.io/api/v1/downloads \
-H "Authorization: Bearer $STOCKZEN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://app.envato.com/photos/ecb1d5b6-f41c-4091-83b0-5940582a8985"}'
# then download the file (and license) with the links from the response
curl -L -o photo.jpg "https://stockzen.io/api/v1/files/<token>"
curl -L -o license.pdf "https://stockzen.io/api/v1/licenses/<token>"import os, requests
API = "https://stockzen.io/api/v1"
headers = {"Authorization": f"Bearer {os.environ['STOCKZEN_API_KEY']}"}
r = requests.post(f"{API}/downloads", headers=headers, json={
"url": "https://app.envato.com/photos/ecb1d5b6-f41c-4091-83b0-5940582a8985"
})
r.raise_for_status()
dl = r.json()
with requests.get(dl["download"]["url"], stream=True) as f:
f.raise_for_status()
with open(dl["item"]["filename"], "wb") as out:
for chunk in f.iter_content(1 << 20):
out.write(chunk)
if dl["license"]:
open("license.pdf", "wb").write(requests.get(dl["license"]["url"]).content)
print(dl["usage"]) # {"used": 4, "limit": 15, "remaining": 11, ...}import { createWriteStream } from "node:fs";
import { pipeline } from "node:stream/promises";
const API = "https://stockzen.io/api/v1";
const headers = { Authorization: `Bearer ${process.env.STOCKZEN_API_KEY}` };
const res = await fetch(`${API}/downloads`, {
method: "POST",
headers: { ...headers, "Content-Type": "application/json" },
body: JSON.stringify({ url: "https://app.envato.com/photos/ecb1d5b6-f41c-4091-83b0-5940582a8985" }),
});
if (!res.ok) throw new Error((await res.json()).error.message);
const dl = await res.json();
const file = await fetch(dl.download.url);
await pipeline(file.body, createWriteStream(dl.item.filename));
if (dl.license) {
const pdf = await fetch(dl.license.url);
await pipeline(pdf.body, createWriteStream("license.pdf"));
}
console.log(dl.usage);$key = getenv('STOCKZEN_API_KEY');
$ch = curl_init('https://stockzen.io/api/v1/downloads');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Authorization: Bearer $key", 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode(['url' => 'https://app.envato.com/photos/ecb1d5b6-f41c-4091-83b0-5940582a8985']),
]);
$dl = json_decode(curl_exec($ch), true);
if (isset($dl['error'])) throw new RuntimeException($dl['error']['message']);
file_put_contents($dl['item']['filename'], fopen($dl['download']['url'], 'r'));
if ($dl['license']) file_put_contents('license.pdf', fopen($dl['license']['url'], 'r'));Authentication
Every request to an account endpoint carries your key in one of two headers. Keys look like sz_live_ followed by 40 hex characters.
Authorization: Bearer sz_live_3f9a1c2b7d4e… # preferred
X-API-Key: sz_live_3f9a1c2b7d4e… # alternative
- One key per account. Regenerating invalidates the old key instantly; revoking removes it.
- The key inherits your plan: trial keys get the trial allowance, paid keys the daily limits of the plan. Web and API downloads count against the same allowance.
- Never ship the key in browser code or public repos. Signed file and license links do not need the key, so hand those to browsers instead.
- All traffic must be HTTPS. Plain HTTP requests are redirected and will lose the request body.
Endpoints
/me
API key
Account and plan
Who the key belongs to, the active plan and your current rate-limit window.
curl https://stockzen.io/api/v1/me \
-H "Authorization: Bearer $STOCKZEN_API_KEY"
{
"id": 1042,
"login": "ava.design",
"email": "ava@studio.example",
"name": "Ava Martin",
"plan": { "type": "monthly", "active": true, "product_ids": [3], "upgrade": "https://stockzen.io/shop" },
"api_key": { "prefix": "sz_live_3f9a1c…", "label": "Default", "created_at": "2026-09-14T16:20:11Z" },
"auth": "key",
"rate_limit": { "per_minute": 60, "remaining": 59, "resets_at": "2026-09-14T16:31:00Z" }
}
/usage
API key
Allowance per downloader
How many downloads you have left today for each service in the catalogue. Trial accounts see a lifetime allowance instead of a daily one. Downloaders that are not live yet (Flaticon, Magnific) are listed with limit: 0 and locked: "under_development"; on a trial, services outside the trial show locked: "not_included_in_trial".
curl https://stockzen.io/api/v1/usage \
-H "Authorization: Bearer $STOCKZEN_API_KEY"
{
"plan": "monthly",
"period": "daily",
"resets_at": "2026-09-15T04:00:00Z",
"timezone": "America/New_York",
"services": [
{ "service": "envato", "name": "Envato Elements", "limit": 15, "used": 3, "remaining": 12, "period": "daily", "resets_at": "2026-09-15T04:00:00Z", "locked": null },
{ "service": "storyblocks", "name": "Storyblocks", "limit": 15, "used": 0, "remaining": 15, "period": "daily", "resets_at": "2026-09-15T04:00:00Z", "locked": null },
{ "service": "vecteezy", "name": "Vecteezy", "limit": 15, "used": 1, "remaining": 14, "period": "daily", "resets_at": "2026-09-15T04:00:00Z", "locked": null },
{ "service": "motionarray", "name": "MotionArray", "limit": 15, "used": 0, "remaining": 15, "period": "daily", "resets_at": "2026-09-15T04:00:00Z", "locked": null },
{ "service": "flaticon", "name": "Flaticon", "limit": 25, "used": 3, "remaining": 22, "period": "daily", "resets_at": "2026-09-15T04:00:00Z", "locked": null },
{ "service": "freepik", "name": "Magnific (formerly Freepik)", "limit": 15, "used": 0, "remaining": 15, "period": "daily", "resets_at": "2026-09-15T04:00:00Z", "locked": null }
]
}
/resolve
API key
Identify an item without downloading
Pass ?url=… to check a link before you spend a download: you get the item id, type and title — and the choices the item offers: Storyblocks qualities (item.variants), MotionArray footage formats, Flaticon formats + PNG sizes and Magnific formats / photo sizes / video qualities (item.formats, each with a code you pass back as format). next is the exact POST /downloads call to make. Nothing is charged.
| Parameter | Type | In | Description |
|---|---|---|---|
url | string | query · required | The item page URL from any live provider. |
format | string | query · optional | Preselect a format so next.body carries it: MotionArray uhd / hd / original, or a Flaticon / Magnific format code. |
size | string | query · optional | Flaticon PNG / GIF / MP4 only: pixel size (16 … 512). |
curl "https://stockzen.io/api/v1/resolve?url=https://www.storyblocks.com/video/stock/aerial-view-of-the-city-at-sunset-435871219" \
-H "Authorization: Bearer $STOCKZEN_API_KEY"
{
"service": "storyblocks",
"item": {
"id": "435871219",
"type": "video",
"title": "Aerial View Of The City At Sunset",
"variants": [
{ "code": "4KMP4", "label": "4K (MP4)" },
{ "code": "HDMP4", "label": "HD (MP4)" },
{ "code": "HDMOV", "label": "HD (MOV)" }
],
"default_quality": "4KMP4",
"source_url": "https://www.storyblocks.com/video/stock/aerial-view-of-the-city-at-sunset-435871219",
"canonical_url": "https://www.storyblocks.com/video/stock/aerial-view-of-the-city-at-sunset-435871219"
},
"downloadable": true,
"charged": false,
"next": { "method": "POST", "url": "https://stockzen.io/api/v1/downloads", "body": { "url": "https://www.storyblocks.com/video/stock/aerial-view-of-the-city-at-sunset-435871219", "quality": "4KMP4" } }
}
// a Flaticon icon
{
"service": "flaticon",
"item": {
"id": "616408", "type": "icon", "title": "Dog", "pack": { "id": "616407", "name": "Animals and nature" }, "author": "Freepik", "premium": false,
"preview_url": "https://cdn-icons-png.flaticon.com/512/616/616408.png", "filename": "dog-616408.svg",
"formats": [
{ "code": "png", "label": "PNG", "extension": "png", "sized": true },
{ "code": "svg", "label": "SVG", "extension": "svg", "sized": false },
{ "code": "eps", "label": "EPS", "extension": "eps", "sized": false },
{ "code": "psd", "label": "PSD", "extension": "psd", "sized": false }
],
"default_format": "svg", "sizes": ["16", "24", "32", "64", "128", "256", "512"], "default_size": "512",
"source_url": "https://www.flaticon.com/free-icon/dog_616408", "canonical_url": "https://www.flaticon.com/free-icon/dog_616408"
},
"downloadable": true, "charged": false,
"next": { "method": "POST", "url": "https://stockzen.io/api/v1/downloads", "body": { "url": "https://www.flaticon.com/free-icon/dog_616408", "format": "svg" } }
}
// a Magnific photo
{
"service": "freepik",
"item": {
"id": "34129129", "type": "photo", "title": "Side view smiley couple indoors", "preview_url": "https://img.magnific.com/free-photo/…_23-2149903726.jpg", "filename": "side-view-smiley-couple-indoors-34129129.jpg",
"formats": [
{ "code": "small", "label": "Small", "extension": "jpg", "note": "1000 × 667px", "width": 1000, "height": 667 },
{ "code": "medium", "label": "Medium", "extension": "jpg", "note": "1500 × 1000px", "width": 1500, "height": 1000 },
{ "code": "large", "label": "Large", "extension": "jpg", "note": "2000 × 1333px", "width": 2000, "height": 1333 },
{ "code": "original", "label": "Original", "extension": "jpg", "note": "5304 × 3536px", "width": 5304, "height": 3536 }
],
"default_format": "original",
"source_url": "https://www.magnific.com/free-photo/side-view-smiley-couple-indoors_34129129.htm", "canonical_url": "https://www.magnific.com/free-photo/side-view-smiley-couple-indoors_34129129.htm"
},
"downloadable": true, "charged": false,
"next": { "method": "POST", "url": "https://stockzen.io/api/v1/downloads", "body": { "url": "https://www.magnific.com/free-photo/side-view-smiley-couple-indoors_34129129.htm", "format": "original" } }
}
/downloads
API key
Resolve an item into download links
Send the item page URL from Envato Elements, Storyblocks, Vecteezy, MotionArray, Flaticon or Magnific. Stockzen fetches a fresh signed file link (and a license certificate where the provider issues one, on paid plans) and spends one download from your allowance for that service. Links are valid for one hour and can be fetched repeatedly in that window at no extra cost. For Envato, download.direct_url is Envato's own CDN link — fastest, but it expires after ~10 minutes, so fall back to download.url. Flaticon and Magnific are resolved at fetch time (like their web downloaders), so item.size is null until you call download.url. POST /download is an alias.
| Parameter | Type | In | Description |
|---|---|---|---|
url | string | required | The item page URL, e.g. https://app.envato.com/photos/…, https://www.storyblocks.com/video/stock/…-435871219, https://www.vecteezy.com/vector-art/10507624-…, https://motionarray.com/after-effects-templates/…-1792514/, https://www.flaticon.com/free-icon/dog_616408 or https://www.magnific.com/free-vector/…_34129129.htm. |
license | boolean | optional · default true | Also return a license-certificate link (Envato, MotionArray, Flaticon, Magnific). Ignored on trial plans. Storyblocks and Vecteezy never issue a separate certificate — see license_note. |
licensee | string | optional · max 80 chars | Envato and Magnific: name printed on the license certificate. Defaults to your account name. |
quality | string | optional · Storyblocks | A variant code from GET /resolve (4KMP4, HDMP4, WAV, MP3, PNG, …). Default: best available. |
format | string | optional · MotionArray, Flaticon, Magnific | MotionArray footage: uhd (4K, default), hd or original. Flaticon icons: svg (default when offered), png, eps, psd — animated icons also aep, lottie, gif, mp4; packs and icon fonts are always ZIP. Magnific: a code from GET /resolve — zip (default), ai, eps, svg, psd, png for vectors/PSD; small, medium, large, original (default) for photos; 1080p-mp4, 4k-mov, … for video. Unknown codes answer 422 invalid_format with the available list. |
size | string | optional · Flaticon | PNG / GIF / MP4 icons only: pixel size from GET /resolve (16, 24, 32, 64, 128, 256, 512). Default 512. |
curl -X POST https://stockzen.io/api/v1/downloads \
-H "Authorization: Bearer $STOCKZEN_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "url": "https://app.envato.com/photos/ecb1d5b6-f41c-4091-83b0-5940582a8985", "license": true }'
{
"id": "dl_3f9a1c2b7d4e",
"service": "envato",
"item": {
"id": "ecb1d5b6-f41c-4091-83b0-5940582a8985",
"type": "photos",
"title": null,
"filename": "ecb1d5b6-f41c-4091-83b0-5940582a8985.jpg",
"size": 8421133,
"content_type": "image/jpeg",
"source_url": "https://app.envato.com/photos/ecb1d5b6-f41c-4091-83b0-5940582a8985"
},
"download": {
"url": "https://stockzen.io/api/v1/files/eyJrIjoiZmlsZSIs…", "method": "GET", "expires_at": "2026-09-14T17:20:11Z",
"direct_url": "https://dam-assets.envatousercontent.com/EVA/TRX/…?Expires=…", "direct_expires_at": "2026-09-14T16:30:11Z"
},
"license": { "url": "https://stockzen.io/api/v1/licenses/eyJrIjoibGljZW5zZSIs…", "format": "application/pdf", "licensee": "Ava Martin", "expires_at": "2026-09-14T17:20:11Z" },
"license_note": null,
"usage": { "service": "envato", "used": 4, "limit": 15, "remaining": 11, "period": "daily", "resets_at": "2026-09-15T04:00:00Z" }
}
/files/{token}
No key needed
Stream the file
Fetch the file behind a download.url. No API key needed — the signed token is the credential. Responds with Content-Disposition: attachment and the real filename. Follow redirects and stream to disk; files can be several hundred MB. HEAD is accepted too. Expired or tampered tokens answer 410 link_expired.
| Parameter | Type | In | Description |
|---|---|---|---|
token | string | path | The token from download.url (just call the URL as given). |
curl https://stockzen.io/api/v1/files/<token> \
-L -o output
HTTP/1.1 200 OK
Content-Type: image/jpeg
Content-Length: 8421133
Content-Disposition: attachment; filename="ecb1d5b6-f41c-4091-83b0-5940582a8985.jpg"
<binary>
/licenses/{token}
No key needed
Stream the license certificate
Fetch the PDF behind a license.url (Envato Elements, MotionArray, Flaticon and Magnific). For Envato, Stockzen reuses an existing certificate for the item when one exists on our account, so calling it twice does not create duplicates. Storyblocks covers downloads under its account license and Vecteezy ships the license inside the file, so those return "license": null with a license_note.
| Parameter | Type | In | Description |
|---|---|---|---|
token | string | path | The token from license.url. |
curl https://stockzen.io/api/v1/licenses/<token> \
-L -o output
HTTP/1.1 200 OK
Content-Type: application/pdf
Content-Disposition: attachment; filename="envato-license-ecb1d5b6.pdf"
<binary>
/services
No key needed
Supported downloaders
The catalogue: which providers are accepted, which are live on the API, which the Telegram bot delivers (telegram_bot), what their item URLs look like, which extra POST /downloads options they take and where their RapidAPI listing lives.
curl https://stockzen.io/api/v1/services
{
"services": [
{ "key": "envato", "name": "Envato Elements", "api": "available", "telegram_bot": true, "license_certificates": true, "license_note": null,
"accepted_hosts": ["app.envato.com", "elements.envato.com"],
"example_url": "https://app.envato.com/photos/ecb1d5b6-f41c-4091-83b0-5940582a8985",
"options": {}, "web_downloader": "https://stockzen.io/envato_downloader",
"rapidapi": "https://rapidapi.com/weirdoshubham/api/envato-elements-downloader5" },
{ "key": "storyblocks", "name": "Storyblocks", "api": "available", "telegram_bot": true, "license_certificates": false,
"license_note": "Storyblocks downloads are covered by the account's unlimited license; no per-item certificate is issued.",
"accepted_hosts": ["www.storyblocks.com"], "options": { "quality": "Variant code from /resolve (e.g. 4KMP4, HDMP4, WAV, PNG). Default: best available." }, "…": "…" },
{ "key": "vecteezy", "name": "Vecteezy", "api": "available", "telegram_bot": true, "license_certificates": false, "…": "…" },
{ "key": "motionarray", "name": "MotionArray", "api": "available", "telegram_bot": true, "license_certificates": true, "options": { "format": "Footage only: uhd (4K, default), hd or original." }, "…": "…" },
{ "key": "flaticon", "name": "Flaticon", "api": "available", "telegram_bot": true, "license_certificates": true, "license_note": null,
"accepted_hosts": ["www.flaticon.com"], "example_url": "https://www.flaticon.com/free-icon/dog_616408",
"options": { "format": "Icons only: a format code from /resolve (svg, png, eps, psd; aep, lottie, gif, mp4 for animated icons). …", "size": "png / gif / mp4 only: pixel size from /resolve (16 … 512). Default 512." },
"web_downloader": "https://stockzen.io/flaticon_downloader", "rapidapi": null },
{ "key": "freepik", "name": "Magnific (formerly Freepik)", "api": "available", "telegram_bot": true, "license_certificates": true, "license_note": null,
"accepted_hosts": ["www.freepik.com", "freepik.com", "www.magnific.com", "magnific.com"], "example_url": "https://www.magnific.com/free-photo/side-view-smiley-couple-indoors_34129129.htm",
"options": { "format": "A format code from /resolve: zip, ai, eps, svg, psd, png for vectors/PSD; small, medium, large, original for photos; 1080p-mp4, 4k-mov … for video. …" },
"web_downloader": "https://stockzen.io/freepik_downloader", "rapidapi": null }
]
}
/status
No key needed
Live status and uptime
The same data as stockzen.io/status: overall state, per-service state, 7-day uptime and average response time. Cached for 60 seconds.
curl https://stockzen.io/api/v1/status
{
"overall": "operational",
"checked_at": "2026-09-14T16:20:00Z",
"services": [
{ "key": "site", "name": "Website & member area", "state": "operational", "uptime_7d": 100, "avg_response_ms": 210, "last_check": "2026-09-14T16:20:00Z" },
{ "key": "envato", "name": "Envato Elements", "state": "operational", "uptime_7d": 99.8, "avg_response_ms": 1610, "last_check": "2026-09-14T16:20:00Z" },
{ "key": "storyblocks", "name": "Storyblocks", "state": "operational", "uptime_7d": 99.9, "avg_response_ms": 980, "last_check": "2026-09-14T16:20:00Z" },
{ "key": "vecteezy", "name": "Vecteezy", "state": "operational", "uptime_7d": 99.9, "avg_response_ms": 1120, "last_check": "2026-09-14T16:20:00Z" },
{ "key": "motionarray", "name": "MotionArray", "state": "operational", "uptime_7d": 99.7, "avg_response_ms": 1340, "last_check": "2026-09-14T16:20:00Z" },
{ "key": "flaticon", "name": "Flaticon", "state": "operational", "uptime_7d": 100, "avg_response_ms": 810, "last_check": "2026-09-14T16:20:00Z" },
{ "key": "freepik", "name": "Magnific (formerly Freepik)", "state": "operational", "uptime_7d": 99.9, "avg_response_ms": 790, "last_check": "2026-09-14T16:20:00Z" }
],
"page": "https://stockzen.io/status"
}
/health
No key needed
Is a downloader up?
A one-line health check for monitors and RapidAPI: 200 with ok: true while the provider session is valid and answering, 503 otherwise. Pick the downloader with ?service=envato|storyblocks|vecteezy|motionarray (default envato; on RapidAPI, the listing's own). Cached for 60 seconds.
| Parameter | Type | In | Description |
|---|---|---|---|
service | string | query · optional | Which downloader to check. Default envato. |
curl https://stockzen.io/api/v1/health
{
"ok": true,
"service": "envato",
"state": "operational",
"session": "valid",
"response_ms": 1610,
"uptime_7d": 99.8,
"checked_at": "2026-09-14T16:20:00Z",
"status_page": "https://stockzen.io/status"
}
Download flow & limits
POST /downloads validates the URL, asks the provider for a fresh signed file and checks your allowance. Nothing is charged if this fails.
On success one download is deducted for that service and a 201 is returned with usage so you can show remaining quota.
Links live for 60 minutes. If the provider's own link expires sooner, we refresh it transparently — fetching the same link twice never costs a second download.
- Daily limits reset at midnight America/New_York (
resets_atis given in UTC). Trial plans have a one-time lifetime allowance instead. - License certificates are included on paid plans: Envato issues a PDF in your account name (or the
licenseeyou pass), MotionArray its own per-item PDF. Storyblocks covers downloads under its account license and Vecteezy bundles the license inside the file — both return"license": nullwith an explanatorylicense_note, as do trial plans. - Qualities & formats: Storyblocks items come in several variants (4K / HD / SD, WAV / MP3, PNG / JPG…) and MotionArray footage in 4K / HD / original.
GET /resolvelists them; passquality/formattoPOST /downloadsor let us pick the best one. - Provider links are short-lived (Storyblocks ~30 s, MotionArray and Vecteezy minutes). Always go through
download.url— it fetches a fresh upstream link every time and stays valid for an hour. - Idempotency: there is no idempotency key yet — if your client times out after a
201was produced, the download was charged. Set generous timeouts (60 s) onPOST /downloads; providers can be slow.
Errors
Errors use conventional HTTP status codes and always carry a machine-readable error.code plus a human message you can surface to users. Extra fields (e.g. service, resets_at, retry_after) appear when relevant.
{
"error": {
"code": "limit_reached",
"message": "Daily limit of 15 Envato Elements downloads reached. Resets at 2026-09-15T04:00:00Z.",
"status": 429,
"service": "envato",
"limit": 15,
"used": 15,
"resets_at": "2026-09-15T04:00:00Z"
},
"docs": "https://stockzen.io/api#errors"
}
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_json | The request body could not be parsed as JSON. |
| 401 | unauthorized · invalid_api_key | No key was sent, or the key is unknown/revoked. Create one on this page. |
| 403 | no_active_plan | The account has no active subscription. Pick a plan at stockzen.io/shop. |
| 403 | account_not_found | The member account behind the key was deleted. Create a new key from a live account. |
| 403 | not_included_in_trial · no_allowance | Your plan does not include this downloader. |
| 403 | wrong_listing | RapidAPI only: the link belongs to a different provider than the listing you subscribed to. error.rapidapi points to the right listing. |
| 404 | not_found | Unknown endpoint. |
| 405 | method_not_allowed | Wrong HTTP method for the endpoint. |
| 410 | link_expired | A file/license link is older than one hour or was tampered with. Call POST /downloads again. |
| 422 | validation_error · unsupported_url · invalid_url | The url is missing, not from a supported provider, or not an item page. |
| 422 | invalid_quality · invalid_format · unknown_service | The requested Storyblocks quality / MotionArray format is not offered for that item (error.available lists what is), or ?service= is unknown. |
| 429 | limit_reached | Daily (or trial) allowance for that service is used up. Retry-After and error.resets_at tell you when it resets. |
| 429 | rate_limited | More requests in a minute than your allowance (60 per key; per plan on RapidAPI). Back off for Retry-After seconds. |
| 501 | service_not_available | The provider is supported on the website but not on the API yet; error.web_downloader points to the web tool. |
| 502 | upstream_error | The provider did not answer correctly. Safe to retry after a short pause; no download is charged unless a 201 was returned. |
| 500 | internal_error | Our fault. Please retry, and tell support if it persists. |
Rate limits
Account endpoints allow 60 requests per minute per key, in fixed one-minute windows. Every response includes the window state; when you exceed it you get 429 rate_limited with Retry-After. File and license streams are not rate limited but are bound to their one-hour token.
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 57
X-RateLimit-Reset: 1789402860 # unix time the window resets
Retry-After: 23 # only on 429
Service availability
Live status →All 6 downloaders are live on the API and in the Telegram bot; the 4 with a RapidAPI listing can also be subscribed to there without a Stockzen account.
| Downloader | Accepted links | License PDF | Options | API |
|---|---|---|---|---|
| Envato Elements envato |
app.envato.com elements.envato.com |
Yes | — | Available |
| Storyblocks storyblocks |
www.storyblocks.com |
— Storyblocks downloads are covered by the account's unlimited license; no per-item certificate is issued. |
qualityVariant code from /resolve (e.g. 4KMP4, HDMP4, WAV, PNG). Default: best available. |
Available |
| Vecteezy vecteezy |
www.vecteezy.com |
— Vecteezy bundles the license inside the downloaded file, so there is no separate certificate. |
— | Available |
| MotionArray motionarray |
motionarray.com |
Yes | formatFootage only: uhd (4K, default), hd or original. See /resolve for what the item offers. |
Available |
| Flaticon flaticon |
www.flaticon.com |
Yes | formatIcons only: a format code from /resolve (svg, png, eps, psd; aep, lottie, gif, mp4 for animated icons). Default: svg when offered, else png. Packs and icon fonts are always a ZIP. sizepng / gif / mp4 only: pixel size from /resolve (16 … 512). Default 512. |
Available |
| Magnific (formerly Freepik) freepik |
www.freepik.com freepik.com www.magnific.com magnific.com |
Yes | formatA format code from /resolve: zip, ai, eps, svg, psd, png for vectors/PSD; small, medium, large, original for photos; 1080p-mp4, 4k-mov … for video. Default: zip for vectors/PSD, original for photos and video. |
Available |
501 service_not_available with error.web_downloader, so clients can fall back gracefully.RapidAPI
All listings →Prefer to pay per request instead of a Stockzen plan? Each downloader is also published on RapidAPI Hub as its own API — same endpoints, same responses. RapidAPI handles the key (X-RapidAPI-Key), billing and quotas; a subscription covers one provider, and links from another provider answer 403 wrong_listing with a pointer to the right listing. Files and licenses are still fetched straight from stockzen.io, so they never count as RapidAPI requests or bandwidth.
| Listing | Accepts | Delivers | Spec for Studio |
|---|---|---|---|
| Envato Elements Downloader | app.envato.com elements.envato.com |
Original files · License certificate (PDF) · Direct CDN link · Signed 1-hour download link | openapi.json?target=rapidapi&service=envato |
| Storyblocks Downloader | www.storyblocks.com |
Original files · All qualities (4K / HD / SD, WAV / MP3, PNG / JPG) · Video, audio, images & templates · Signed 1-hour download link | openapi.json?target=rapidapi&service=storyblocks |
| Vecteezy Downloader | www.vecteezy.com |
Original files · License bundled in the download · Vectors, PNG, photos & video · Signed 1-hour download link | openapi.json?target=rapidapi&service=vecteezy |
| MotionArray Downloader | motionarray.com |
Original files · License certificate (PDF) · 4K / HD footage formats · Signed 1-hour download link | openapi.json?target=rapidapi&service=motionarray |
Every listing has the same four plans:
| Plan | Price | Requests | Over quota | Rate limit |
|---|---|---|---|---|
| Basic | Free | 5 / day | Hard limit | 1 / min |
| Pro | $5.99 / mo | 200 / month | + $0.02 per request | 5 / min |
| Ultra Recommended | $14.99 / mo | 800 / month | + $0.015 per request | 10 / min |
| Mega | $29.99 / mo | 2,000 / month | + $0.01 per request | 15 / min |
- One
POST /download= one request;GET /resolve,/me,/usageand/healthare requests too but never spend a download. - Quota & limits are enforced by RapidAPI on your subscription cycle, separately per listing;
GET /memirrors them (plan.rapidapi,usage) counted per UTC day / calendar month, and the free plan also stops at 5 downloads a day on our side. - License certificates (Envato) are issued to your RapidAPI username unless you pass
licensee. - Import the spec: the per-listing variants above are what goes into RapidAPI Studio; openapi.json is the full multi-provider one for Postman, Insomnia, n8n, Make or Zapier.
- Webhook tools (n8n, Make, Zapier): one HTTP node for
POST /downloads, then a second HTTP/Download node ondownload.url. Useitem.filenamefor the file name.
Changelog
GET /resolve lists every format the item offers (item.formats[].code), POST /downloads takes format (and size for PNG / GIF / MP4 icons), license PDFs for both. Also in the Telegram bot; telegram_bot added to GET /services.quality (Storyblocks) and format (MotionArray) options on downloads, item.variants / item.formats on GET /resolve, ?service= on GET /health, license_note and options in GET /services, and the 403 wrong_listing error for RapidAPI.GET /resolve (identify an item for free), GET /health, POST /download alias, licensee on downloads, and download.direct_url (Envato's CDN link) in every download response./me, /usage, /services, /status, POST /downloads with signed file and license links, Envato Elements live. Storyblocks, Vecteezy and MotionArray follow; Flaticon and Magnific (formerly Freepik) once their downloaders leave development.Questions or a use-case we should support? Open a ticket or email support@stockzen.io. Use of the API is covered by our Terms; files remain subject to each provider's license.