Product card in motion
Slow 360° turntable of a matte black wireless headphone set on a white studio backdrop, soft reflections, product commercial lighting, no text
seconds: 5aspect: 1:1For marketplaces — square and no captions in frame.
Seedance API with ruble billing: text-to-video and image-to-video through one Zerocoder key. Per-second pricing, cURL / Python / Node samples, limits, refunds.
Seedance is ByteDance's video generation family: you send a text prompt (or a text prompt plus a reference frame) and get back a short video clip. The family covers text-to-video and image-to-video, with several tiers from a lightweight eco model up to a pro-grade one, so you can match quality to the task instead of paying for headroom you don't need.
The models handle camera motion, lighting, and scene progression across a clip, which makes them a fit for product demos, social clips, and short narrative shots rather than just static image animation.
You start a job with a prompt, a model id, a duration in seconds, and an aspect ratio or size; for image-to-video you add a reference frame URL. The API charges you immediately and hands back a task id with status queued. You then poll that id — the status moves to processing and then to completed with a video URL, or to failed, in which case the charge is returned to your wallet automatically.
The live GET /v1/models price list in rubles and dollars. Endpoint: /v1/videos
| Model | Price | Unit |
|---|---|---|
Seedance 2.0 Fastrecommended seedance-2.0-fast · ByteDancealso: seedance-std | from 10.6 ₽$0.118 | per second of video480p — 10.6 ₽ · 720p — 22.1 ₽ |
Seedance 2.0 seedance-2.0 · ByteDance | from 13.3 ₽$0.147 | per second of video480p — 13.3 ₽ · 720p — 28.6 ₽ · 1080p — 31.5 ₽ · 4k — 96 ₽ |
Seedance 2.0 Pro seedance-2.0-pro · ByteDance | from 13.3 ₽$0.147 | per second of video480p — 13.3 ₽ · 720p — 28.6 ₽ · 1080p — 31.5 ₽ |
Seedance 2.5 seedance-2.5 · ByteDance | from 22.4 ₽$0.249 | per second of video480p — 22.4 ₽ · 720p — 48.2 ₽ · 1080p — 76.8 ₽ |
Seedance 2.0 Mini seedance-2.0-mini · ByteDance | from 8.54 ₽$0.095 | per second of video480p — 8.54 ₽ · 720p — 19.1 ₽ |
Seedance 2.0 Eco seedance-2.0-eco · ByteDance | from 13.6 ₽$0.152 | per second of video720p — 13.6 ₽ · 1080p — 33.9 ₽ · 4k — 69.1 ₽ |
Seedance 2.5 Eco seedance-2.5-eco · ByteDance | from 24.3 ₽$0.270 | per second of video720p — 24.3 ₽ · 1080p — 41.9 ₽ |
Pick a model and a volume — the calculator uses the same formulas as API billing.
Prices from GET /v1/models, internal exchange rate. Failed generations are not charged.
POST /v1/videos starts the render and returns the job id and price_rub right away; GET /v1/videos?id=… returns the status and the clip URL. If the render fails, the money goes back to the balance automatically.
Base URLhttps://zerocoder.com /api/v1Key — in the x-api-key or Authorization: Bearer header
Model in the samples — seedance-std; any text‑to‑video or image‑to‑video model from the table works
import time, requests API = "https://zerocoder.com/api/v1"H = {"x-api-key": "zc-sk-…"} r = requests.post(f"{API}/videos", headers=H, json={ "model": "seedance-std", "prompt": "Drone shot over a foggy forest at dawn", "seconds": 5, # 4–10 "aspect": "16:9", # image-to-video: "image": "https://…"})r.raise_for_status()job = r.json() # status "queued", price_rub charged st = {}while st.get("status") not in ("completed", "failed"): time.sleep(4) r = requests.get(f"{API}/videos", headers=H, params={"id": job["id"]}) st = r.json() if r.ok else {} # 502 → poll againprint(st) # "url", or "refunded": true on failureconst API = "https://zerocoder.com/api/v1";const H = { "x-api-key": "zc-sk-…", "content-type": "application/json",}; const res = await fetch(`${API}/videos`, { method: "POST", headers: H, body: JSON.stringify({ model: "seedance-std", seconds: 5, aspect: "16:9", prompt: "Drone shot over a foggy forest at dawn", }), // image-to-video: add image: "https://…"});const job = await res.json(); // "queued", price_rubif (!res.ok) throw new Error(job.error.message); const poll = `${API}/videos?id=${job.id}`;let st = {};while (st.status !== "completed" && st.status !== "failed") { await new Promise((go) => setTimeout(go, 4000)); const r = await fetch(poll, { headers: H }); st = r.ok ? await r.json() : {}; // 502 → poll again}console.log(st); // url, or refunded: true# 1) start the render: price_rub is charged up front,# refunded if the render failscurl https://zerocoder.com/api/v1/videos \ -H "x-api-key: zc-sk-…" \ -H "content-type: application/json" \ -d '{"model": "seedance-std", "seconds": 5, "aspect": "16:9", "prompt": "Drone shot over a foggy forest at dawn"}'# → {"id":"…","object":"video","status":"queued",# "seconds":5,"price_rub":…,"balance_rub":…,# "poll":"/api/v1/videos?id=…"}# image-to-video: add "image": "https://…/frame.jpg"# 2) poll every few seconds: "completed" or "failed"curl "https://zerocoder.com/api/v1/videos?id=…" \ -H "x-api-key: zc-sk-…"# rendering → "status": "queued" | "running" | …# done → "status": "completed", "url": "https://…"# failed → "status": "failed", "refunded": true# HTTP 502 "Status check failed" → just poll again;# a render that never finishes is refunded
From a key to production — six steps based on the real /api/v1 contracts. Each step links to the relevant docs section.
Sign up, open the API section of your account, top up the balance in rubles and create a zc-sk-… key. One key unlocks Seedance and every other model in the catalogue.
Read more →POST /v1/videos with model, prompt, seconds and aspect: the response carries the job id, status queued and price_rub — the amount is charged before the Seedance render starts.
Read more →GET /v1/videos?id=… every few seconds until status is completed (url field) or failed (refunded: true — the money is already back on the balance). The file URL is temporary — download right away.
Read more →30 requests per minute per key: on 429 wait and retry with a growing pause; 402 — top up the balance; 400 — check model against GET /v1/models. Failed generations are not charged, so retrying is safe.
Read more →GET /v1/balance returns the balance and 30-day spend; every call's price comes back in the response — write it to your logs and set an alert threshold in your own monitoring.
Read more →Keep the key in server secrets, never in the frontend. For high Seedance volumes contact us — the limit is raised individually and companies can pay by invoice. Check the observed stability on the status page.
Read more →HTTP Request node: POST to the /api/v1 endpoint, x-api-key header and a JSON body built from workflow fields. For video add a Wait node and a second HTTP Request on GET ?id= in a loop until completed.
HTTP “Make a request” module: POST, Body type JSON, x-api-key header. The response is parsed automatically — the image url or the answer text flows into the next modules.
Webhooks by Zapier → Custom Request action: POST, Data — JSON with model and prompt, Headers — x-api-key. Response fields are available to the following Zap steps.
In Apps Script use UrlFetchApp.fetch with method post, contentType application/json and a payload from the cells: prompts in one column, results written to the next one.
A bot on aiogram, grammY or Telegraf calls the same HTTP API: user message → model request → reply in the chat. For video — poll the status and send the file from the finished URL.
For text models the official OpenAI and Anthropic SDKs work with a swapped base URL and our key — your application code stays the same. Images and video are a plain HTTP call from any language.

More than a key: we help wire Seedance and other models into your workflows — from audit to production, with invoice payment.
# 401 {"type":"error","error":{"type":"authentication_error","message":"Invalid or revoked API key."}}
# 402 {"type":"error","error":{"type":"billing_error","message":"Not enough API balance: …"}}
# 429 {"type":"error","error":{"type":"rate_limit_error","message":"…"}} ← 30 requests/min per key
# 400 {"type":"error","error":{"type":"invalid_request_error","message":"Unknown model \"…\". See GET /v1/models."}}
# 502 {"type":"error","error":{"type":"api_error","message":"… Charge refunded."}} ← start failed → money back
# GET ?id → {"id":"vid_…","status":"failed","refunded":true} ← render failed → money back
Numbers come from the public /status summary: the share of successful requests over a period for the whole API and for the category as a whole (the summary has no per-model breakdown), no SLA promises. Failed generations are not charged, so retrying is safe.
Tracking since Aug 6, 2026.
An e-commerce team turns product photos into short looping showcase clips for listing pages
A social media bot generates daily short video posts from a content calendar of prompts
A marketing agency batch-produces ad variants in different aspect ratios for A/B testing
An indie hacker builds a text-to-video SaaS tool with a simple prompt box for end users
An internal ops team auto-generates training or onboarding video snippets from scripts
A game studio prototypes cutscene or trailer shots before committing to full production
Works by Zerocoder users made with this model: preview, resolution, duration and date. Nothing was generated specifically for this page.
| Model | Resolution | Duration | Date | Likes | Prompt |
|---|---|---|---|---|---|
| Seedance | 480p | 10 s | 6 September 2026 | 77 | Ultra-photorealistic amateur smartphone video. The footage is filmed handheld by a passenger inside a second small aircraft flying parallel |
| Seedance | 720p | 4 s | 26 June 2026 | 21 | сделай короче отрывок снятый на айфон 7 как рыцарь в дали на горе вставляет свой меч в землю и там идет очень силный дождь и это ночь и в мо |
| Seedance | 480p | 6 s | 29 August 2026 | 20 | Universal Robotic Camera Prompt UNIVERSAL ROBOTIC CAMERA PROMPT Use the uploaded image as the exact first frame and exact visual reference. |
| Seedance | 720p | 5 s | 27 July 2026 | 0 | Оживи фото, чтобы мужская рука в золотых часах крутых нажимает кнопку с динамикой но плавно, типа брутально |
| Seedance | 720p | 5 s | 27 July 2026 | 0 | Оживи фотку, сохрани ракурс, и усиль динамику |

Copy the prompt and the parameters into the request body — the fields are named exactly as in the /api/v1 contract. Replace the angle-bracket placeholders with your material.
Slow 360° turntable of a matte black wireless headphone set on a white studio backdrop, soft reflections, product commercial lighting, no text
seconds: 5aspect: 1:1For marketplaces — square and no captions in frame.
Handheld close-up of iced coffee being poured over ice in a tall glass, condensation, morning window light, quick push-in, upbeat energy
seconds: 5aspect: 9:16Gentle camera orbit around the product, subtle fabric movement, keep the product shape, logo and colors exactly as in the reference
seconds: 5aspect: 16:9image: https://…/product.jpgThe image link must be a public https URL.
Aerial drone shot over a foggy pine forest at sunrise, slow dolly forward, volumetric light, cinematic color grading
seconds: 10aspect: 16:9Abstract flowing liquid metal in deep green and gold, seamless loop, dark background, slow elegant motion
seconds: 5aspect: 16:9
Industries where this kind of generation becomes part of the workflow rather than an experiment.
Seedance is billed per second of finished video, and the per-second price depends on the resolution: every version's tiers are in the table above and in price_rub_by_resolution of GET /v1/models. A clip costs that price times its duration; without size or resolution it is billed as 1920x1080 — 1080p, else the nearest higher tier or the highest. The amount is charged at start and shown in price_rub.
Plain requests is enough: POST to /v1/videos with the x-api-key header and a body of model, prompt, seconds and aspect, then poll GET /v1/videos with the id from the response until the status is completed. A ready-to-run Seedance sample is in the “First request” block above — no SDK required.
The seconds parameter accepts 4 to 10 seconds (default 5), aspect is 16:9, 9:16 or 1:1, or pass an explicit size. The start frame for image-to-video is a public https URL. The shared key limit is 30 requests per minute across all endpoints; above that Seedance returns 429.
Every available Seedance version is listed in the table and in GET /v1/models; the short alias seedance-std always points to the current standard version. Versions differ in the per-second price: use a cheaper row for drafts and bulk variations, and before going live run one prompt on two or three versions and compare the clips.
No. The cost of a Seedance clip is reserved at start, but if the provider returns an error or the job sits in the queue for more than 30 minutes, the amount goes back to your API balance automatically and the job status shows refunded: true. You only pay for clips you actually receive.
Yes. Besides a Russian bank card, the API balance can be topped up by invoice for legal entities: request an invoice in the API account, and after the bank transfer the amount is credited to the balance while the same key keeps working with Seedance and every other model. Accounting documents are available on request.
There are no free API credits: the API wallet starts with a minimum first top-up and every Seedance clip is charged at the list price. You can judge the model's quality for free by hand — in the Zerocoder studio and in the Seedance tool from the catalogue — then move the winning prompt into an API request.
Yes: Seedance generates a soundtrack together with the picture at no extra charge, and image-to-video is enabled by the image field with a URL of the start frame — the model animates it while keeping the composition. The link to the finished mp4 arrives with the completed status; save the file right away.