Get API

Veo 3.1

The most advanced AI video model in the world, with photoreal motion and synchronized native audio.

google/veo-3.1/text-to-video

Capabilities

Best for

  • Cinematic text-to-video shots
  • Short social and ad clips
  • Consistent multi-shot sequences
  • Look-dev and style exploration

Not for

  • Frame-exact rotoscoping
  • Feature-length renders
  • Pixel-perfect compositing
  • Precise on-screen text

Authentication

api key header

The Pika API uses API keys to authenticate requests. Send your key in the X-API-Key header. Your API key is a secret. Don't expose it in browsers or other client-side code. Instead, call the API from your server. The signed-in playground uses a portal session and never sends your API key.

header
X-API-Key: YOUR_API_KEY

Endpoint

asynchronous · poll for the result

POSThttps://api.dev.pika.art/v1/media/google/veo-3.1/text-to-videogenerate endpoint
GEThttps://api.dev.pika.art/v1/media/jobs/{request_id}poll until completed
GEThttps://api.dev.pika.art/v1/media/jobs/{request_id}/contentget the result URL

Reference Uploads

media inputs

Media inputs accept any public URL. To use a local file, POST its content_type and size_bytes to /v1/media/uploads, PUT the file to the returned upload_url, then pass the url.

upload
# 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

Generate

POST /v1/media/google/veo-3.1/text-to-video

Request

curl -X POST https://api.dev.pika.art/v1/media/google/veo-3.1/text-to-video \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "1:1, Ornate Art-Nouveau gilded painting in a Klimt-inspired style: a serene woman in profile in a robe of dense gold-leaf patterning, mosaic spirals, lapis-blue and emerald geometric ornament, holding a golden bowl. Flat decorative composition, shimmering gold-leaf texture over painterly skin, opulent jewel-tone palette. No text or logos. The gold leaf shimmers as light sweeps across the ornament, the figure's eyes slowly open, faint particle glints. Native audio: soft reverent drone, delicate chimes.",
"duration": 6,
"aspect_ratio": "16:9",
"generate_audio": true,
"resolution": "720p"
}'

Response

{
"id": "media_8f3a2c91-5b7d-4e0a-9c26-31d4f2a8e6b0",
"status": "queued"
}

Request body

promptstringrequired
Text prompt describing the video to generate.
negative_promptstring
Text describing what to avoid in the video.
durationenum
Video length in seconds.
aspect_ratioenum
Output aspect ratio.
person_generationenum
Policy for generating people in the output.
generate_audiobooleandefault: true
Whether to generate audio for the video.
resolutionenum
Output resolution.
reference_image_urlsstring[]
Up to 3 reference image URLs to guide generation. Requires duration=8.

Accepted values

duration
aspect_ratio
person_generation
resolution

Input modes

Reference image urlsreference_image_urls

Use a public URL directly, or POST { content_type, size_bytes } to /v1/media/uploads, PUT the image to the returned upload_url, then pass the url.

Returns

Returns a job object with status , not the final output. Store the id from the response and poll the job until it completes.

Poll status

GET /v1/media/jobs/{request_id}

Request

curl https://api.dev.pika.art/v1/media/jobs/{request_id} \
-H "X-API-Key: YOUR_API_KEY"

Response

{
"id": "media_8f3a2c91-5b7d-4e0a-9c26-31d4f2a8e6b0",
"status": "running"
}

Poll the job by id until it reaches a terminal state: completed or failed.

The job object

idstring
Unique identifier for the job.
statusenum
The status of the job.One of:
object
The generation output. Present once the job completes.
errorstring
If the job failed, the reason for the failure.

Get result

GET /v1/media/jobs/{request_id}/content

Request

curl https://api.dev.pika.art/v1/media/jobs/{request_id}/content \
-H "X-API-Key: YOUR_API_KEY"

Response

{
"url": "https://api.dev.pika.art/v1/files/video_8f3a2c91.mp4"
}

Once the job completes, fetch a download URL for the generated media.

Returns

urlstring
Download URL for the generated file.

Errors

shared across calls

Errors use conventional HTTP status codes with a JSON body of the shape {"message": "..."}. The one exception is validation: a request body that fails validation returns 422 with a plain-text body.

StatusWhenBody
401 UnauthorizedThe API key is missing or invalid.{"message":"Invalid API key"}
403 ForbiddenThe key is not active, or the org balance cannot cover the request.{"message":"Insufficient org balance"}
404 Not FoundNo job with that id exists in your org.{"message":"media job not found"}
409 ConflictThe result was requested before the job completed, or an Idempotency-Key header was reused with a different body.{"message":"media job is not ready"}
422 Unprocessable EntityThe request body failed validation: an invalid enum value, a missing required field, a wrong type, or malformed JSON. Returned as plain text, not JSON. A schema-valid parameter combination that cannot be priced returns the same status with a JSON message.Unprocessable entity
429 Too Many RequestsOrg limit reached: requests per minute or day, or concurrent jobs. Check the Retry-After header.{"message":"rate limit exceeded: rpm"}
503 Service UnavailableThe model rail or a backend dependency is temporarily unavailable. Retry with backoff.{"message":"media dispatch unavailable"}

Pricing

only successful runs are charged

TierPrice
720p · no audio$0.20 / second
1080p · no audio$0.20 / second
720p · with audio$0.40 / second
1080p · with audio$0.40 / second
4k · no audio$0.40 / second
4k · with audio$0.60 / second

Per-model pricing

Transparent, usage-based rates for every Google model.

Gemini Omni Flash

Video

Text to Video

Video output$17.50 / 1M tok
Input$1.50 / 1M tok
Output$9 / 1M tok

Image to Video

Video output$17.50 / 1M tok
Input$1.50 / 1M tok
Output$9 / 1M tok

Reference to Video

Video output$17.50 / 1M tok
Input$1.50 / 1M tok
Output$9 / 1M tok

Video to Video

Video output$17.50 / 1M tok
Input$1.50 / 1M tok
Output$9 / 1M tok

Veo 3.1

Video

Text to VideoCurrent

720pno audio$0.20 / sec
1080pno audio$0.20 / sec
720pwith audio$0.40 / sec
1080pwith audio$0.40 / sec
4kno audio$0.40 / sec
4kwith audio$0.60 / sec

Video Extension

no audio$0.20 / sec
with audio$0.40 / sec

Veo 3.1 Fast

Video

Text to Video

720pno audio$0.08 / sec
720pwith audio$0.10 / sec
1080pno audio$0.10 / sec
1080pwith audio$0.12 / sec
4kno audio$0.25 / sec
4kwith audio$0.30 / sec

Video Extension

no audio$0.08 / sec
with audio$0.10 / sec

Veo 3.1 Lite

Video

Image to Video

720pno audio$0.03 / sec
720pwith audio$0.05 / sec
1080pno audio$0.05 / sec
1080pwith audio$0.08 / sec

Nano Banana Pro

Image

Image to Image

Image output$120 / 1M tok
Input$2 / 1M tok
Output$12 / 1M tok

Text to Image

Image output$120 / 1M tok
Input$2 / 1M tok
Output$12 / 1M tok

Nano Banana 2

Image

Image to Image

Image output$60 / 1M tok
Input$0.50 / 1M tok
Output$3 / 1M tok

Text to Image

Image output$60 / 1M tok
Input$0.50 / 1M tok
Output$3 / 1M tok

Nano Banana 2 Lite

Image

Image to Image

Image output$30 / 1M tok
Input$0.25 / 1M tok
Output$1.50 / 1M tok

Text to Image

Image output$30 / 1M tok
Input$0.25 / 1M tok
Output$1.50 / 1M tok

Lyria 3 Pro

Audio • Text to Audio

$0.064 / request

Lyria 3

Audio • Text to Audio

$0.032 / request

Lyria 2

Audio • Music

$0.048 / request

Gemini 3.6 Flash

LLM

Input$1.20 / 1M tok
Output$6 / 1M tok
Cached input$0.12 / 1M tok

Gemini 3.5 Flash-Lite

LLM

Input$0.24 / 1M tok
Output$2 / 1M tok
Cached input$0.024 / 1M tok

Gemini 3.1 Pro

LLM

Input$1.60 / 1M tok
Output$9.60 / 1M tok
Cached input$0.16 / 1M tok