Bản lưu ngày / Snapshot of 2026-10-18 · Xem bản mới nhất / See the latest version
WanduraDocsBeta
BetaThese docs are in beta and change often. Something wrong, unclear or missing? Tell us.
Image and video API (v2)

Quickstart

Markdown
On this page

TL;DR — Sign up, copy your test key, and POST /v2/jobs with a model and a style. Get the result by a signed webhook or by polling GET /v2/jobs/{job_id}.

Run your first style as a job. Calls go from your server to https://api.wandura.ai with an API key.

1. Sign up

Sign up with your email. You get a personal account, a Test product with a test key, and a My app product for live runs.

2. Get a key

Your test key (wdr_test_…) is shown once when you sign up. Test keys return a sample result for $0, so you can build the whole integration before adding money. Live keys (wdr_live_…) run for real and draw from the product wallet. Keep keys on your server:

export WANDURA_API_KEY=wdr_test_...

3. Pick a style

curl "https://api.wandura.ai/v2/styles?model=wandura-video-v1" -H "Authorization: Bearer $WANDURA_API_KEY"

Each style lists its id, its model (wandura-image-v1 or wandura-video-v1), the fields it takes (inputs, each required or optional), its price and a preview_url. The styles catalog shows the same list with previews.

4. Send your first job

curl -X POST https://api.wandura.ai/v2/jobs \
  -H "Authorization: Bearer $WANDURA_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"model": "wandura-video-v1", "style": "twenty-four", "image_urls": ["https://your-bucket.example.com/u/42/photo.jpg"], "end_user_id": "user_123"}'
# HTTP 202
# {"job_id":"run_QVqsXwr7VGSP","status":"queued","model":"wandura-video-v1","created_at":"2026-10-16T09:15:40.825Z"}

The same call from JavaScript (Node 18+) or Python, with no Wandura package to install:

const res = await fetch('https://api.wandura.ai/v2/jobs', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.WANDURA_API_KEY}`,
    'Content-Type': 'application/json',
    'Idempotency-Key': crypto.randomUUID(),
  },
  body: JSON.stringify({
    model: 'wandura-video-v1',
    style: 'twenty-four',
    image_urls: ['https://your-bucket.example.com/u/42/photo.jpg'],
    end_user_id: 'user_123',
  }),
});
const job = await res.json();
console.log(job.job_id, job.status);
import os, uuid, requests

res = requests.post(
    "https://api.wandura.ai/v2/jobs",
    headers={
        "Authorization": f"Bearer {os.environ['WANDURA_API_KEY']}",
        "Idempotency-Key": str(uuid.uuid4()),
    },
    json={
        "model": "wandura-video-v1",
        "style": "twenty-four",
        "image_urls": ["https://your-bucket.example.com/u/42/photo.jpg"],
        "end_user_id": "user_123",
    },
)
job = res.json()
print(job["job_id"], job["status"])
  • Idempotency-Key is optional but recommended: the same key and body never make a second job. Without it, the same body within 10 minutes is the same job.
  • end_user_id is optional: send the person in your app and a per-person daily cap protects your wallet.
  • A wrong body is refused at once with 422 INVALID_INPUT and every problem listed (see Validation).
  • Test keys return a sample file for $0; live keys run for real and are charged only when the job succeeded.

5. Get the result

Add "webhook_url": "https://your-backend.example.com/hooks/wandura" to the submit and Wandura POSTs the signed final job there (see Webhooks). Or poll:

curl https://api.wandura.ai/v2/jobs/run_QVqsXwr7VGSP -H "Authorization: Bearer $WANDURA_API_KEY"

Start at 2 s, multiply by 1.5, cap at 10 s, add 0–0.5 s of random jitter. Statuses: queued → processing → succeeded, failed, cancelled or timeout (final). A succeeded job has output[0].url; a failed or timeout job has error with code and retryable.

Rolling out: "lane": "relax" (cheaper or the same price, no deadline) and "inputs": {…} for a style's own inputs such as keep_audio (see Relax lane and a style's own inputs).

Runs (same engine)

Integrations built on runs keep working: POST /v2/styles/{style} with {"lane", "end_user_id", "inputs"} and an Idempotency-Key returns a run with status_url and cancel_url. Runs carry the same status words as jobs in state. See Concepts.

Next

  • Jobs API: every field, status, error, webhook and limit.
  • Concepts: lanes, free runs, webhooks, limits, idempotency, end-user ID.
  • Styles reference: every style with its inputs and price.
  • SDKs: official JavaScript and Python clients, in private preview (not on npm or PyPI).
  • Building with an AI agent? Give it https://api.wandura.ai/v2/openapi.json.

Updated 16 Oct 2026 · Change history (3)

↑↓ selectEnter openEsc close

Send feedback

Your message goes straight to the Wandura team. It includes the address of this page.

0 / 4000