# Storm Birthday (Wandura API style) > A video style: one HTTP call per finished video, a fixed price per run. Read this file before you write code. Prices, inputs and endpoints change: do not guess them from memory or copy them from another style. ## Inputs What to send: 1 photo: they (birthday celebrant holding the cake): A man or a woman: one clear photo with the face visible; a full-body photo also gives the trousers or skirt and the shoes. - `image_urls` (string[] of URLs, required): Public https URLs of the input images (JPEG, PNG or WEBP, up to 20 MB). No storage of your own? Get a URL from POST /v2/uploads. Exactly 1: one per subject. - `resolution` (string, optional): Output resolution. Default 480p. The price depends on it: see price_by_resolution on the style, or POST /v2/quote with this input. Every body also needs `lane` ("priority" or "relax") and `end_user_id` (the id of the person in your app the run is for; daily caps are per end user). ## Price - Priority: $4.00 · 400 credits per run. Done within 16 min, or the run is free. - Relax: $4.00 · 400 credits per run. Waits in line with no deadline, 1 active run per end user. - At 480p: Priority $4.00 · 400 credits, Relax $4.00 · 400 credits per run. - At 720p: Priority $8.00 · 800 credits, Relax $8.00 · 800 credits per run. - At 1080p: Priority $16.00 · 1600 credits, Relax $16.00 · 1600 credits per run. - Example (default resolution): 10 runs on Priority = $40.00 (4000 credits). 10 runs on Relax = $40.00 (4000 credits). - Failed runs, blocked content, unusable inputs and late Priority runs are free. A test key (`wdr_test_...`) returns a sample for $0. - To price one exact request first: `POST https://api.wandura.ai/v2/quote` with the same body. ## Run it Call from your server. Send `Authorization: Bearer $WANDURA_API_KEY` (read the key from the environment, never ship it to a browser) and an `Idempotency-Key` header: a new UUID per request, reused when you retry that request, so a retry never runs or charges twice. ```sh curl -X POST https://api.wandura.ai/v2/styles/storm-birthday \ -H "Authorization: Bearer $WANDURA_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $(uuidgen)" \ -d '{"lane":"priority","end_user_id":"user_123","inputs":{"image_urls":["https://example.com/photo.jpg"]}}' ``` ## Get the result The submit answers 202 with `request_id`, `status_url` and `cancel_url`. Use those URLs; do not build them. Then either: - Poll `status_url`: start at 2 s, multiply by 1.5, cap at 10 s, add 0-0.5 s of jitter (Relax: 10 s up to 60 s). - Or use signed webhooks: add an endpoint at https://open.wandura.ai/webhooks. Check `Wandura-Signature: t=,v1=` = HMAC-SHA256(secret, t + "." + raw body), reject a t more than 300 s old, and dedupe on `Wandura-Event-Id`. Final statuses: completed, failed, nsfw, canceled. On completed, `output[].url` is the file. Links expire 72 h after the run ends: copy what you keep. ## Links - [OpenAPI for this style](https://api.wandura.ai/v2/public/styles/storm-birthday/openapi.json): exact inputs and responses, no key - [Style page](https://open.wandura.ai/styles/storm-birthday): playground, examples - [Docs](https://docs.wandura.ai/developers/api-v2): quick start, runs, lanes, webhooks, limits - [Errors](https://docs.wandura.ai/developers/api-v2/errors): codes, which ones to retry - [Pricing](https://open.wandura.ai/pricing): every style's price per lane, free-run rules - [All styles](https://open.wandura.ai/llms.txt): the catalog for agents - [Whole API OpenAPI](https://api.wandura.ai/v2/openapi.json) This file: https://open.wandura.ai/styles/storm-birthday/llms.txt