Quick Start
Use one Pika API key to call video, image, audio, music, and 3D models through concrete REST media endpoints. Start with a single request, then open a model page for exact parameters, response shapes, uploads, and pricing.
Create an API key
Sign in
Open the dashboard with your Pika API account.
Create a key
Go to API Keys and create a key for the project or environment you are integrating.
Explore models
Browse video, image, audio, music, and 3D models to find exact endpoints, parameters, and pricing.
Make a request
Store your key in an environment variable, then create a generation. Successful media requests return a job id and status.
curl -X POST https://api.dev.pika.art/v1/media/bytedance/seedance-2.5/text-to-video \-H "X-API-Key: YOUR_API_KEY" \-H "Content-Type: application/json" \-d '{"prompt": "A fashion editorial in motion. ONE continuous unbroken take, no cuts. The camera moves constantly but always smoothly, on a crane and dolly — long fluid arcs, motivated reframes, no handheld shake, no whip pans, no speed ramps. Scene: a bare lilac room — lilac walls, lilac wool carpet, white baseboard, a long sheer lilac curtain at the left of frame. In the centre stands an ironing board with pale lilac legs and a lilac cotton cover. Draped over it is one large square silk scarf printed in dusty rose pink and olive green, a fine botanical pattern with a broad olive border: the left half lies perfectly flat and pressed with its edge hanging crisply over the rounded nose, the right half gathered into a soft billowing heap spilling over the far end. A wide polished chrome cuff bracelet stands upright on the pressed section, mirror-finish, warping the pink and lilac around it. A fine silver chain lies beside it and trails off the left edge, pooling on the carpet. Action: the curtain swells inward as a draught enters the room. The gathered folds on the right stir, then begin to rise — the silk lifting off the board and unfurling itself, opening out into a full square that floats and turns in the air above the ironing board, the printed botanicals rippling as it revolves. The loosened chain slides off the edge and drops to the carpet in a bright coil. The chrome cuff rocks, topples onto its side and rolls slowly along the bare lilac board cover toward the nose, reflections spinning across it. The silk keeps rising, drifting toward the window and the curtain, then falls all at once, settling flat across the empty board exactly as it was pressed at the start. Camera: begin low and close on the chrome cuff, the pressed silk and the hanging chain, then rise and arc left around the nose of the board as the curtain moves. As the silk lifts, crane upward with it, turning to follow the scarf as it revolves in the air, holding it centred while the lilac room rotates behind. Descend with the falling chain in one continuous move, level out into a low tracking shot beside the rolling cuff, then crane back up and pull out into a wide, symmetrical frontal of the board just as the silk settles onto it. Look: soft diffuse daylight through the curtain, no hard shadows, a tight palette of lilac, dusty pink and olive. Shot on 35mm film, 80mm lens, medium depth of field, fine natural grain, low contrast, liquid sheen on the silk. Photographic and physically real, like an Hermès still-life campaign — no digital gloss. The room is empty; there is no iron and no person. Audio: quiet room tone, a curtain drawing against the wall, silk snapping open and rustling as it turns in the air, a chain dropping onto carpet, chrome rolling on padded cloth, the soft whump of fabric landing, nothing else.","duration": 10,"resolution": "720p","generate_audio": true,"watermark": false,"ratio": "16:9"}'
Poll async jobs
queued → completed
Media generations are asynchronous. Continue polling until status is completed or failed. A completed job carries its download URL in output.
curl https://api.dev.pika.art/v1/media/jobs/{request_id} \-H "X-API-Key: YOUR_API_KEY"
- Use HTTPS and JSON for REST calls.
- Send X-API-Key: YOUR_API_KEY.
- Use the concrete /v1/media/{vendor}/{model}/{function} endpoint from the model page.
- Upload local files to a hosted URL before passing them as inputs.
A finished job also reports what it used and what it cost. usage holds the units the provider metered, and billing holds the charge in micro-USD, the same unit as your balance.
{"id": "media_8f3a2c91-5b7d-4e0a-9c26-31d4f2a8e6b0","status": "completed","output": {"media_type": "video","video": {"url": "https://api.dev.pika.art/v1/files/video_8f3a2c91.mp4","content_type": "video/mp4"}},"usage": {"video_output_tokens": 50638},"billing": {"state": "settled","charge_micro_usd": 372189}}
- billing.state is settled: charge_micro_usd is final, 0 included. Record spend from it, keyed by job id.
- billing.state is pending: the charge is still settling. Poll again after 1s, then 2s, then 5s.
- billing.state is unavailable: our billing read failed and says nothing about the charge. Retry no sooner than 30s.
- billing is null on the submit response and on webhooks. Only a settled poll is a charge.
- usage carries only the units the job reports and can be null. It may not reproduce the charge; the settled charge is authoritative.
Upload reference media
images, audio, video
Media inputs accept any public URL. To use a local file, request a presigned upload URL, PUT the file to it, then pass the returned url into fields such as image or image_urls.
# 1. Request a presigned upload URL. Send the file's content# type and its exact size in bytes.curl -X POST https://api.dev.pika.art/v1/media/uploads \-H "X-API-Key: YOUR_API_KEY" \-H "Content-Type: application/json" \-d '{"content_type": "image/png", "size_bytes": 12345}'# The response returns two URLs:# upload_url: a temporary URL to upload the file to. Expires in 5 minutes.# url: the permanent Pika URL. Pass it to the model as the input.# {# "upload_url": "https://upload.r2.pika.art/...?X-Amz-Signature=...",# "url": "https://cdn.pika.art/v2/media/uploads/org_abc/9f8e7d.png"# }# 2. Upload the file to upload_url, then pass url to the model.curl -X PUT "<upload_url>" \-H "Content-Type: image/png" \--data-binary @input.png
Check your balance
before you submit
The same key reads your org balance, so you can check a request is covered before you send it. balance_micro_usd is US dollars times 1,000,000. An org that bills by invoice reads postpaid.cycle.remaining_micro_usd instead.
curl https://api.dev.pika.art/billing/balance \-H "X-API-Key: YOUR_API_KEY"# 25000000 micro-USD is $25.00.# {# "unit": "micro_usd",# "currency": "usd",# "org_id": "9c1e4b7a-2d55-4e18-b0a3-7c6f2ab91d34",# "balance_micro_usd": 25000000,# "postpaid": null# }# An invoice-billed org reports its limit window instead:# "postpaid": {# "effective_at": "2026-07-01T00:00:00Z",# "active": true,# "cycle": {# "window_start": "2026-08-01T00:00:00Z",# "window_end": "2026-09-01T00:00:00Z",# "limit_micro_usd": 500000000,# "used_micro_usd": 120000000,# "remaining_micro_usd": 380000000# }# }
Core surfaces
choose a model
Each model page shows the exact endpoint, request parameters, response shape, sample code, and pricing for that model.
| Surface | Endpoint | Delivery |
|---|---|---|
| Submit | POST /v1/media/{vendor}/{model}/{function} | Async job |
| Poll | GET /v1/media/jobs/{request_id} | Job envelope |
| Content | GET /v1/media/jobs/{request_id}/content | Output URL, same as the job |
| Delete | DELETE /v1/media/jobs/{request_id} | Erases the job's media and prompt |
| Upload | POST /v1/media/uploads | Presigned URL |
| Delete upload | DELETE /v1/media/uploads?url=... | Erases one upload |
| Catalog | GET /catalog/apis | Public model list |
| Balance | GET /billing/balance | Org balance |