Alibaba · Video · API

Wan API — ruble pricing and a 5-minute setup

Wan API (Alibaba) with ruble billing: text-to-video and image-to-video through one Zerocoder key. Per-clip pricing, code samples, limits, refunds.

What Wan models do

Wan is Alibaba's video generation family, available through Zerocoder as wan/2-7-text-to-video and wan/2-7-image-to-video. The family turns a text prompt or a single reference frame into a short video clip, which makes it a fit for product demos, social clips and quick previsualization.

Where it's strong

Text-to-video builds a scene from a written description end to end, while image-to-video keeps the look of a reference frame and animates it, so you can bring an existing photo or render to life instead of generating a scene from scratch.

What Zerocoder adds

One API key and one ruble wallet cover both Wan models and every other model on the platform. You top up the wallet with a Russian card or a company invoice directly in the cabinet, no VPN or foreign card needed. Docs, the key cabinet and the price list live on zerocoder.com, and the HTTP interface is compatible with common SDK and HTTP client setups, so you can call it the same way you'd call any REST API.

How a request works

You send a request to /v1/videos with the model id, a prompt, the clip length in seconds and, for image-to-video, an https URL of the reference frame. The response comes back with a task id and status queued, and the charge is taken at that moment. You then poll /v1/videos with that id until the status turns into completed, where you get the video URL, or failed, where the money is refunded automatically.

Available models and prices

Built from the live GET /v1/models price list: prices include our margin, in rubles and in dollars at the internal rate. Anything missing is temporarily not served by the gateway.

ModelUnit₽$Cost examplesEndpoint
wan/2-7-text-to-videorecommended-68%per clip14.4 ₽$0.160
1 generation: 14.4 ₽ · $0.160
10 generations: 144 ₽ · $1.60
/v1/videos
wan/2-7-image-to-videorecommended-68%per clip14.4 ₽$0.160
1 generation: 14.4 ₽ · $0.160
10 generations: 144 ₽ · $1.60
/v1/videos
Save up to-68%

Compared with the official API

Official vendor list prices against Zerocoder prices for the same unit — a second of video, an image or a million tokens. The “-NN%” badge is the price difference for the same unit (for text, a 3 : 1 input : output blend without the per-call minimum; assumptions are below the table). Only models where we are at least 5% cheaper than the official API are listed here; the full family price list is in the table above.

ModelOfficial API (USD)Zerocoder (₽ and $)Saving
wan/2-7-text-to-videoAlibaba · Wan 2.7 text-to-video$0.50 per 5 s of video ($0.10/s)720P · ≈ 45 ₽14.4 ₽ · $0.160per clip-68%
wan/2-7-image-to-videoAlibaba · Wan 2.7 image-to-video$0.50 per 5 s of video ($0.10/s)720P · ≈ 45 ₽14.4 ₽ · $0.160per clip-68%
Official prices come from the vendors’ own pages: Alibaba — checked 4 October 2026. Zerocoder prices are the live GET /v1/models price list, margin included; dollars at our internal rate (1 $ = 90 ₽). Our price includes ruble billing and no-VPN access. Comparison assumptions:
  • per-clip prices: the official figure is the per-second price × 5 s (the API default for seconds); if the clip is longer, the official price is higher and the saving is larger than shown
  • video — the official tier of the resolution shown in the row (720P): by default our API call renders at that resolution or higher, and where the vendor has no matching tier the cheaper one is used, so the saving is understated, not overstated

Cost calculator

Pick a model and a volume — the calculator uses the same formulas as API billing.

per clip14.4 ₽ $0.160
per month · 10144 ₽ $1.60

Prices from GET /v1/models, internal exchange rate. Failed generations are not charged.

First request

One zc-sk-… key, the x-api-key header (or Authorization: Bearer), base URL https://zerocoder.com/api/v1. Samples are generated from the real route contracts.

1

Create a key

Account → API: top up the balance in rubles and create a zc-sk-… key

2

Send a request

Copy the sample below — the model id is already taken from the price list.

3

Check the charge

GET /v1/balance shows the balance; the call price comes back in the response.

model: wan/2-7-text-to-video
# 1) start the render — price_rub is charged up front, refunded if the render fails
curl https://zerocoder.com/api/v1/videos \
  -H "x-api-key: zc-sk-…" -H "content-type: application/json" \
  -d '{"model": "wan/2-7-text-to-video", "prompt": "A drone shot over a foggy pine forest at sunrise, slow dolly in", "seconds": 5, "aspect": "16:9"}'
# → {"id":"vid_…","object":"video","model":"wan/2-7-text-to-video","status":"queued","seconds":5,"price_rub":…,"balance_rub":…,"poll":"/api/v1/videos?id=vid_…"}

# 2) poll until status is "completed" (url) or "failed" (refunded: true)
curl "https://zerocoder.com/api/v1/videos?id=vid_…" -H "x-api-key: zc-sk-…"
# image-to-video: add "image": "https://…/frame.jpg" to the body
import time, requests

API = "https://zerocoder.com/api/v1"
H = {"x-api-key": "zc-sk-…"}

job = requests.post(f"{API}/videos", headers=H, json={
    "model": "wan/2-7-text-to-video",
    "prompt": "A drone shot over a foggy pine forest at sunrise, slow dolly in",
    "seconds": 5,            # 4–10
    "aspect": "16:9",        # or 9:16 / 1:1; "image": "https://…" for image-to-video
}).json()
print("charged", job["price_rub"], "RUB, balance", job["balance_rub"])

while True:
    st = requests.get(f"{API}/videos", headers=H, params={"id": job["id"]}).json()
    if st["status"] == "completed":
        print(st["url"]); break
    if st["status"] == "failed":
        print("failed, refunded:", st.get("refunded")); break
    time.sleep(4)
const API = "https://zerocoder.com/api/v1";
const H = { "x-api-key": "zc-sk-…", "content-type": "application/json" };

const job = await fetch(`${API}/videos`, {
  method: "POST", headers: H,
  body: JSON.stringify({ model: "wan/2-7-text-to-video", prompt: "A drone shot over a foggy pine forest at sunrise, slow dolly in", seconds: 5, aspect: "16:9" }),
}).then((r) => r.json());
console.log("charged", job.price_rub, "RUB");

for (;;) {
  const st = await fetch(`${API}/videos?id=${job.id}`, { headers: H }).then((r) => r.json());
  if (st.status === "completed") { console.log(st.url); break; }
  if (st.status === "failed") { console.log("failed, refunded:", st.refunded); break; }
  await new Promise((r) => setTimeout(r, 4000));
}

How to connect the Wan API: first request in 5 minutes

From a key to production — six steps based on the real /api/v1 contracts. Each step links to the relevant docs section.

  1. 1

    Get a key in your account

    Sign up, open the API section of your account, top up the balance in rubles and create a zc-sk-… key. One key unlocks Wan and every other model in the catalogue.

    Read more →
  2. 2

    Send the first request

    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 Wan render starts.

    Read more →
  3. 3

    Poll the job status

    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 →
  4. 4

    Handle limits and errors

    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 →
  5. 5

    Watch the budget

    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 →
  6. 6

    Ship to production

    Keep the key in server secrets, never in the frontend. For high Wan volumes contact us — the limit is raised individually and companies can pay by invoice. Check the observed stability on the status page.

    Read more →

No code

Any tool that can make an HTTP request can call our API: one POST with the x-api-key header.
HTTP Requestn8n

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 requestMake

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 ZapierZapier

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.

Apps ScriptGoogle Sheets

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.

any bot frameworkTelegram bot

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.

OpenAI-compatible base URLPython / Node SDK

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.

For business

We'll help bring AI into your business

More than a key: we help wire Wan and other models into your workflows — from audit to production, with invoice payment.

  • Process auditWe find where AI pays off in your workflows: support, sales, content, documents — and name specific scenarios and models.
  • Integration into CRM, website, Telegram, n8nWired through our API or ready no-code scenarios; one key and a shared balance for every model.
  • Ruble payment by invoiceCompanies get an invoice for bank transfer, accounting documents and a top-up of the API balance.
  • Support and limitsHelp with prompts and architecture, request limits raised individually for your load.

Inputs, limits and refunds

  • Text → video and image → video (image: public https URL)
  • Duration seconds: 4–10 (default 5)
  • aspect 16:9 / 9:16 / 1:1 or an explicit size
  • Charged up front by price_rub, refunded if the render fails (refunded: true)
  • A job stuck in the queue over 30 minutes is refunded automatically
  • 30 requests per minute per key (all endpoints combined)

Error responses and refunds

# 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

Observed stability of the API and video generation

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.

Developer APIoperational

—now (2 h window)
65%last 30 days
65%last 90 days

Video generationoperational

—now (2 h window)
68%last 30 days
68%last 90 days

Refunds and charges

  • Charged up front by price_rub; a failed render is refunded automatically with refunded: true in the response
  • A job stuck in the queue over 30 minutes is refunded automatically
  • Status and file URL — in GET /v1/videos?id=

Tracking since Aug 6, 2026.

Use cases

1

An e-commerce team animates static product photos into short turntable-style clips for listings

2

A social media bot turns daily text prompts into short clips for feed and story posting

3

A marketing agency builds a text-to-video pipeline that drafts ad concepts from campaign briefs

4

An indie hacker adds a 'bring your image to life' feature to a photo-editing app

5

A storyboard tool for video teams previews scenes from script lines before full production

6

An internal design team generates quick motion mockups from brand stills for review decks

Prompting tips

  • State the shot type and camera move (static, slow pan, dolly in) and its speed to control motion
  • Describe lighting and time of day (soft morning light, harsh noon sun, neon night) for consistent mood
  • Sketch what changes from the start to the end of the clip so the action has a clear arc across the seconds you set
  • For image-to-video, describe the reference frame's subject, style and framing so the motion matches it
  • Match seconds (4–10) and aspect to the platform (short vertical for stories, wider for landing pages)
  • Avoid relying on readable on-screen text, dense crowds or close-ups of hands and fingers

Ready-made prompts for Wan

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.

Landscape glide for a website background

Slow aerial glide over terraced rice fields at sunrise, low mist between the hills, soft golden light, calm cinematic mood
seconds: 10aspect: 16:9

A long shot without people is a good candidate for 10 seconds.

Vertical clip for Reels and Shorts

Close-up of fresh raspberries falling into a glass of sparkling water in slow motion, bubbles rising, bright kitchen light, vertical framing
seconds: 5aspect: 9:16

Animate an interior photo (image-to-video)

The camera slowly pushes in, curtains move gently in the breeze, sunlight flickers across the room, keep the furniture and layout unchanged
seconds: 5aspect: 16:9image: https://…/room.jpg

Pick the image-to-video version in the table; the frame link must be a public https URL.

Product on a pedestal

A white sneaker rotates slowly on a concrete pedestal, dramatic side light, subtle dust in the air, premium commercial look
seconds: 5aspect: 1:1

Atmospheric intro

Rain drops running down a window at night with blurred city lights behind, slow focus pull, moody blue and amber tones
seconds: 8aspect: 16:9

Who the Wan API is for

Industries where this kind of generation becomes part of the workflow rather than an experiment.

E-commerce & marketplacesProduct clips at a fixed per-clip price — the series budget is known up front.
Real estateBring listing photos to life: camera push-in, window light, moving curtains.
Travel & hospitalityAtmospheric clips of locations and dishes for websites and social media.
Media & socialVertical clips for Reels, Shorts and TikTok on a content plan.
Agencies & productionRough storyboards and background plates before a shoot.
SaaS & appsWan video generation inside your service — one key and a shared balance.

FAQ

How much does a Wan API clip cost in rubles?

Wan is sold per clip: the price of one video for each version is in the table above and in GET /v1/models, in rubles and including our margin. The same amount comes back in the price_rub field of the POST /v1/videos response before rendering starts, so a series is budgeted up front: the clip price times the number of clips.

How do I start a Wan API generation from Python?

With requests: POST /v1/videos with the x-api-key header and a JSON body of model, prompt, seconds and aspect — the response returns a job id and status queued. Then poll GET /v1/videos with that id every few seconds until completed and download the mp4 right away. Full Wan samples for Python, Node.js and the shell are in the “First request” block.

How is Wan text-to-video different from image-to-video?

They are two separate Wan models with different ids in the table. Text-to-video builds the whole scene from the description; image-to-video takes a start frame from the image field (a public https URL) and animates it while keeping the composition — then describe only the motion in the prompt. Send the picture to the image-to-video version: the text model does not use a start frame.

What are the Wan API limits on duration and format?

Duration is set in seconds from 4 to 10 (default 5), the format with aspect 16:9, 9:16, 1:1, 4:3 or 3:4, or an explicit size. The start frame for image-to-video must be a public https URL. The shared key limit is 30 requests per minute across all endpoints; above it Wan returns 429 — retry after a pause.

What happens to the payment if Wan does not make the clip?

The Wan clip price is refunded to the API balance automatically: on status failed right away, with refunded: true in the response, and a job that never delivers a result is closed with a refund by the system within a few hours. Only clips that end with status completed and a file link are paid for.

Can I pay for the Wan API from a company account?

Yes: in the API account a company requests an invoice, pays it by bank transfer, and the amount is credited to the API balance — Wan and the rest of the catalogue work with the same key. A Russian bank card works for an instant top-up; no Alibaba Cloud account or foreign card is needed, and accounting documents are issued on request.

Can I try out the Wan API without topping up?

There are no free clips in the API: the wallet starts with a minimum first top-up, and every Wan clip is charged at the table price. Tune the prompt on one or two clips before launching a series — the request format is the same for text-to-video and image-to-video, only model and the image field change.

Does the length of a Wan clip affect the price?

No: Wan is billed per clip, so a 10-second video costs the same as a 4-second one — duration is set with the seconds field. Keep in mind that a longer clip makes it harder for the model to hold a character and a storyline: start scenes with people at 5 seconds and use longer clips for landscapes, backgrounds and smooth camera glides.

AI API for your product

Up to -68% vs the official API · ruble billing, no VPN