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