Adobe Firefly Services does ship a public video generation endpoint, documented on Adobe’s developer domain. The Firefly API reference carries an H2 named Generate video, defined in one line as Generate a five second video using a text prompt., served at post /v3/videos/generate. The Firefly Video hub covers the model side; this page covers the interface side.
Is there an official Firefly video API?
Yes. The reference page is versioned Firefly API (3.0.0) and lists Generate video beside the image entries. The video entry names one endpoint, requires one header, and accepts six body fields.
The catch is discoverability. Searching the phrase surfaces a different Adobe API collection first, which never generates a clip from a prompt. Developers who stop there wrongly conclude that no such endpoint exists.
Firefly API versus Audio/Video Firefly Services
Two products, two hosts, and mixing them is the most common first mistake.

| Layer | Firefly API | Audio/Video Firefly Services |
|---|---|---|
| Host | firefly-api.adobe.io | audio-video-api.adobe.io |
| Version prefix | /v3 | /v1 |
| Kind of job | generation | processing |
| Named services | Generate video, images | Dynamic Graphics Render, Reframe, TLS, Text to Speech, Text to Avatar |
| Credentials | x-api-key and a token | x-api-key and Authorization: Bearer |
Why the processing APIs are not generation
None of the five service descriptions produces a clip. Dynamic Graphics Render builds variations from After Effects motion graphics templates, Reframe re-crops footage you already have, TLS transcribes and dubs, Text to Speech synthesises narration, and Text to Avatar animates a presenter. Each consumes existing media: for prompt in, video out, you want the Firefly API.
Calling the Generate Video endpoint
The request is a POST with a JSON body. The x-model-version header is required and its only documented value is video1_standard.
curl -X POST 'https://firefly-api.adobe.io/v3/videos/generate' \
-H "Authorization: Bearer $ADOBE_ACCESS_TOKEN" \
-H "x-api-key: $ADOBE_CLIENT_ID" \
-H 'x-model-version: video1_standard' \
-H 'Content-Type: application/json' \
-d '{
"bitRateFactor": 18,
"image": { "conditions": [] },
"prompt": "A lone figure stands in the middle of a vast desert, looking up at the sky, with a sense of awe and wonder.",
"seeds": [1842533538],
"sizes": [{ "height": 720, "width": 720 }],
"videoSettings": {
"cameraMotion": "camera pan left",
"promptStyle": "anime",
"shotAngle": "aerial shot",
"shotSize": "close-up shot"
}
}'
The six request fields that matter
bitRateFactor is an integer from 0 to 63, defaults to 18, and the reference suggests staying between 17 and 23; 0 means lossless. image supplies a keyframe that guides generation as a first or last frame. prompt is the text description, and the longer it is, the better. seeds is an array, and only one seed is supported today. sizes carries the output dimensions. videoSettings groups camera motion, prompt style, shot angle and shot size.
Three traps sit in that list: a surplus value in seeds raises no error and has no effect, image acts only as a keyframe and never as a reference video, and the body carries no duration field.
Polling the async status URL
Video generation is asynchronous. The submit call answers 202 Accepted with three strings, and you poll until the job resolves.
# 1. Submit the job and capture its status URL.
STATUS_URL=$(curl -s -X POST 'https://firefly-api.adobe.io/v3/videos/generate' \
-H "Authorization: Bearer $ADOBE_ACCESS_TOKEN" \
-H "x-api-key: $ADOBE_CLIENT_ID" \
-H 'x-model-version: video1_standard' \
-H 'Content-Type: application/json' \
-d '{"prompt":"A slow aerial pass over a desert at sunrise","sizes":[{"height":1080,"width":1920}]}' \
| jq -r .statusUrl)
# 2. Poll that URL until the job stops reporting progress.
while true; do
RESULT=$(curl -s "$STATUS_URL" \
-H "Authorization: Bearer $ADOBE_ACCESS_TOKEN" \
-H "x-api-key: $ADOBE_CLIENT_ID")
[ "$(echo "$RESULT" | jq -r .status)" = "in progress" ] || break
sleep 10
done
echo "$RESULT" | jq .
The accepted response contains cancelUrl, jobId and statusUrl. The reference example status address is https://firefly-api.adobe.io/v3/status/job-abc123, which confirms both the host and the /v3 prefix. Log the jobId and keep cancelUrl for a queued job you no longer want.
The processing APIs, when you actually need them
Transcription and dubbing are useful, just not generative. The TLS guide documents two endpoints behind a three-step workflow: transcription, translation, then dubbing, with optional AI lip sync on the dubbed video.
# Requires a valid access token and a client ID.
# 1. Transcribe the source media.
curl --location 'https://audio-video-api.adobe.io/v1/transcribe' \
--header 'Authorization: Bearer <your_access_token>' \
--header 'Content-Type: application/json' \
--header 'x-api-key: <your_client_id>' \
--data '{ "video": { "source": { "url" : "<your_presigned_url>" }, "mediaType": "video/mp4" } }'
# 2. Dub the same media.
curl --location 'https://audio-video-api.adobe.io/v1/dub' \
--header 'Authorization: Bearer <your_access_token>' \
--header 'Content-Type: application/json' \
--header 'x-api-key: <your_client_id>' \
--data '{ "video": { "source": { "url" : "<your_presigned_url>" } } }'
Media arrives as a pre-signed URL pointing at storage you control. One documented limit is worth designing around: Transcribe cannot re-translate a transcript, so translation happens only in the same pass as transcription.
Rates, resolutions and what Adobe does not publish
Rate limits apply per organization: 4 requests per minute and 9,000 requests per day. Exceeding either returns HTTP 429, and the documented remedy is retry logic driven by the retry-after header or an exponential backoff strategy. Higher limits are a conversation with your account manager.
Allowed output sizes come in three aspect ratios, three tiers each.
| Aspect ratio | Dimensions |
|---|---|
| 16:9 | 1920w x 1080h |
| 16:9 | 1280w x 720h |
| 16:9 | 960w x 540h |
| 9:16 | 1080w x 1920h |
| 9:16 | 720w x 1280h |
| 9:16 | 540w x 960h |
| 1:1 | 1080w x 1080h |
| 1:1 | 720w x 720h |
| 1:1 | 540w x 540h |
Those tiers line up with the 1080p, 720p and 540p choices of the web interface, so a workflow can switch without respecifying a size.
Several things have no published answer. The price of an API video call appears nowhere on the reference page or the usage notes — not published by the vendor. Neither are job latency, timeout ceilings, concurrency limits, the procedure for a higher allowance, or whether any duration parameter exists. Regional availability varies with location, user type and regulatory requirements.
General availability of the Firefly Video model was announced on 24 April 2025; third-party catalogues that date it differently are not Adobe’s.
Frequently asked questions
Does Adobe publish a text-to-video API? Yes. post /v3/videos/generate in the Firefly API, documented as generating a five second video from a text prompt.
Why did I land on an audio and video API instead? Because that second collection is the better-indexed match for the phrase. It covers transcription, dubbing, reframing, speech synthesis and avatars, and none of its five services generates video.
Which header is mandatory? x-model-version, with video1_standard as the only documented value. Authentication pairs x-api-key with a bearer access token.
Is the call synchronous? No. You get 202 plus cancelUrl, jobId and statusUrl, then poll the status URL until the job finishes. Job duration itself is not published.
Can I change the duration or the seed count? No: the endpoint is defined as five seconds with no duration field, and only one seed is supported.
Are there published prices? No. Per-call cost is not published by the vendor, and third-party reseller rates are not official figures.
Start with the endpoint, keep video1_standard in configuration, and write polling with backoff. The step-by-step walkthrough covers the same model from the interface side, and the Firefly Image hub covers Adobe’s sibling generation API.