Firefly Video Model
Adobe positions Firefly Video as the first commercially-safe AI video generation API. It generates 1080p video clips from text prompts or images. Output is designed to be commercially safe — trained on licensed and public-domain content, the same trust posture as Firefly's image models.
This is a newer endpoint than image generation; rate limits are lower, generation takes longer, and prompt patterns differ. This skill encodes patterns from early production deployments.
When to Use This Skill
Use this skill when:
- A campaign needs short motion clips that have to be commercially safe
- Static hero images need motion variations for social / pre-roll
- A storyboard concept needs an animatic
- The user mentions "video", "motion graphics", "animation", "Firefly Video"
Do NOT use this skill when:
- The user wants long-form video editing — Firefly Video generates clips (typically 5-10s), not full edits
- IP safety isn't a requirement and another video generation model is acceptable to the customer
- The user wants live-action footage of real people — Firefly Video generates synthetic content
What Firefly Video Can and Can't Do
Can
- Generate 1080p clips from text prompts (up to ~10s typical)
- Generate 1080p clips from an image as motion seed (image-to-video)
- Maintain temporal coherence over short durations
- Match camera moves (pan, zoom, dolly) via prompt
- Output in standard aspect ratios (16:9, 9:16, 1:1)
Can't (today)
- Generate clips longer than ~10s in a single call
- Generate complex multi-shot sequences
- Lip-sync to provided audio
- Generate clips with recognizable real people
- Match a specific brand custom-trained style (no video custom models as of this writing)
If the use case needs long-form, multi-shot, or character lip-sync, plan to use Firefly Video for B-roll / inserts only, with the rest of the edit assembled in Premiere or After Effects.
Step 1 — Submit the Video Generation Job
curl --silent -X POST 'https://firefly-api.adobe.io/v3/videos/generate' \
-H "Authorization: Bearer $FIREFLY_SERVICES_ACCESS_TOKEN" \
-H "X-Api-Key: $FIREFLY_SERVICES_CLIENT_ID" \
-H 'x-model-version: video1_standard' \
-H 'Content-Type: application/json' \
-d '{
"prompt": "a slow cinematic dolly shot through a sunlit forest, dappled light, gentle camera motion",
"sizes": [{"width": 1920, "height": 1080}]
}'
The x-model-version: video1_standard header selects the video model. sizes is an array of {width, height} objects.
Returns the async job pattern (jobId, statusUrl, cancelUrl). Poll the status URL with Authorization: Bearer <token> and x-api-key: <client_id> — note that video jobs take 1-3 minutes typically (occasionally longer under load), not the ~10 seconds image jobs take. Use a longer polling interval (5-15s) and a generous max timeout (10-15 minutes).
Step 2 — Request Shape
{
"prompt": "string — describe motion + scene + style + camera",
"negativePrompt": "string — characteristics to steer away from",
"sizes": [{"width": 1920, "height": 1080}],
"seeds": [12345],
"bitRateFactor": 18,
"image": {
"conditions": [
{"source": {"uploadId": "abc-123"}, "placement": {"position": 0}}
]
},
"videoSettings": {
"cameraMotion": "camera zoom in",
"shotAngle": "low angle shot",
"shotSize": "close-up shot",
"promptStyle": "cinematic"
}
}
Send the x-model-version: video1_standard header with the request to select the video model.
| Field | Notes |
|---|---|
prompt |
The most-important field; see prompt patterns below |
negativePrompt |
Optional — characteristics the model should steer away from (e.g. "NO people, NO trees") |
sizes |
Array of {width, height}. Safe validated set: 1920×1080 (16:9), 1080×1920 (9:16), 960×960 (1:1), 1280×720 (16:9), 720×1280 (9:16). The API accepts sizes beyond this list at submission (a 1080×1080 job was submitted and completed successfully in a live check, 2026-08-10) — treat the list as the tested set, not a hard API limit |
seeds |
Array; currently 1 seed supported. Seeds bias toward a consistent composition across runs but do not guarantee byte-identical output — archive delivered files when reproducibility matters for audit |
bitRateFactor |
Optional int 0-63, default 18. Encoding constant rate factor: 0 = lossless/largest file, 63 = smallest file/lowest quality. Suggested range 17-23 — your lever for the file-size planning below |
image |
Optional — {"conditions": [...]}, an array of keyframes. Each condition requires both source (uploadId, url, or creativeCloudFileId) and placement ({"position": 0} = first frame, {"position": 1} = last frame) |
videoSettings |
Optional — typed camera motion, shot angle, shot size, and prompt-style controls (enums below) |
videoSettings enum values
| Setting | Accepted values |
|---|---|
cameraMotion |
camera pan left, camera pan right, camera zoom in, camera zoom out, camera tilt up, camera tilt down, camera locked down, camera handheld |
shotAngle |
aerial shot, eye_level shot, high angle shot, low angle shot, top-down shot |
shotSize |
close-up shot, extreme close-up, medium shot, long shot, extreme long shot |
promptStyle |
anime, 3d, fantasy, cinematic, claymation, line art, stop motion, 2d, vector art, black and white |
Structured videoSettings.cameraMotion is the deterministic way to control the camera — prefer it over prompt-text camera language when the move maps to one of the enum values.
Step 3 — Prompt Patterns for Video
Video prompts differ from image prompts. The model needs to know motion, not just scene composition.
Structure: subject + setting + motion + camera + style
[Subject] in [setting], [what the subject is doing], [camera motion], [visual style]
Examples
| Use | Prompt |
|---|---|
| Product shot with motion | "A sleek black smartphone rotating slowly on a marble pedestal, soft studio lighting, camera circling clockwise, photorealistic" |
| B-roll for tech ad | "A close-up of fingers typing on a backlit keyboard, shallow depth of field, subtle warm tone, gentle dolly in" |
| Brand lifestyle | "Two friends laughing on a city rooftop at golden hour, hand-held camera with subtle sway, wide cinematic frame, photorealistic" |
| Animated illustration | "A flat-design illustration of a paper airplane flying across a pastel sky, smooth horizontal motion, slight rotation, 2D animation style" |
| Storyboard animatic | "A simple storyboard sketch of a person walking up to a door and reaching for the handle, line-art style, minimal motion" |
Camera move vocabulary the model understands
For pans, zooms, tilts, locked-down, and handheld moves, the typed videoSettings.cameraMotion enum (Step 2) is the deterministic option. Use prompt-text camera language for moves outside the enum:
dolly in/dolly out— camera moves toward / awaypan left/pan right— camera rotates horizontallytilt up/tilt down— camera rotates verticallytracking shot— camera follows subjectstatic shot— camera stays stillaerial shot/drone shot— top-down or overheadwhip pan/crash zoom— fast, aggressive moves
Anti-patterns
Avoid:
- "Suddenly the subject does X" — Firefly Video struggles with discrete narrative events; a single sustained motion works better
- Multiple simultaneous motions ("the dog runs while the camera spins while the background changes") — pick one dominant motion
- Long sequences ("first this happens, then this happens") — generate two clips instead
Step 4 — Image-to-Video
Provide a source image and Firefly will generate motion from that frame:
{
"prompt": "gentle camera pull-back revealing more of the scene, subtle wind moving the trees",
"image": {
"conditions": [
{"source": {"uploadId": "$SOURCE_IMAGE_ID"}, "placement": {"position": 0}}
]
},
"sizes": [{"width": 1920, "height": 1080}]
}
(Send with the x-model-version: video1_standard header.)
Each keyframe condition requires both source and placement. "position": 0 anchors the image as the first frame; "position": 1 anchors it as the last frame. Supplying two conditions — one at position 0 and one at position 1 — generates a clip that starts on one approved still and ends on another.
Image-to-video is the production pattern for motion variants of approved hero stills — you've already approved the static image; the video is just adding motion to it.
The source image must match the target aspect ratio. Generate or expand the image first if needed.
Step 5 — Output and Download
Successful job response:
{
"status": "succeeded",
"result": {
"size": {"width": 1920, "height": 1080},
"outputs": [
{
"seed": 646214641,
"video": {
"url": "https://pre-signed-cdn-url..."
}
}
]
}
}
Each output carries exactly seed and video.url; the result also carries the size. Duration and container metadata are not part of the response — probe the downloaded file (e.g. ffprobe) if your pipeline needs them.
Download the MP4 immediately and re-host. URLs expire (typically 1 hour).
Video files are larger than images — a 1080p 5-second clip is typically 5-15MB. Plan storage and CDN bandwidth accordingly.
Production Patterns
Pattern: Motion variants of approved heroes
1. Image team approves a hero still
2. Image-to-video, 3 different motion prompts (subtle, medium, dramatic)
3. Creative team picks one
4. Picked variant goes to edit pipeline as B-roll
This pattern avoids the "is the moving version actually approvable" risk — the still is locked first, then motion is layered.
Pattern: Animatic generation for storyboards
For each storyboard frame:
1. Generate or upload a sketch or hero still for the frame
2. Image-to-video with simple motion ("subtle zoom" / "slow pan")
3. Concat clips in After Effects or ffmpeg
Output is an animatic — not a final cut, but a directional reference for the live-action shoot or final animation.
Pattern: Social pre-roll variants
1. Approved hero image (1:1 or 16:9)
2. Generate 5 variants with different motion:
- Subtle zoom in
- Slow pan left to right
- Tilt up revealing more of the scene
- Static with subtle parallax
- Dolly forward
3. A/B test on social
Five short clips from one hero image. The cost is fixed (5 generation calls), the output is varied enough for meaningful A/B testing.
Rate Limits and Cost
Video generation is more expensive than image generation in compute time and quota:
| Metric | Approximate |
|---|---|
| Time per clip | 1-3 minutes typically, occasionally longer under load |
| RPM limit | Lower than image endpoints — documented defaults are org-specific (verify for your org) |
| Cost per credit | Higher than image (consult Adobe pricing) |
| Concurrent jobs | Low per-credential default (verify for your org) |
Plan video workloads with longer polling intervals (5-15s), wider rate-limit headroom, and async webhooks if available. Treat each video job as a multi-minute commitment, not a request-response.
IP Safety — The Differentiator
Firefly Video is designed to be commercially safe. Adobe states it is trained on:
- Licensed Adobe Stock content
- Public-domain content
- Openly-licensed content
For commercial campaigns, the commercial-safety posture is the deciding factor: the model's training-data provenance is what lets enterprise legal teams approve generated video for production use. IP indemnification for enterprise customers is defined in the customer's Adobe agreement — confirm scope with the account team and legal.
Validate
A Firefly Video pipeline is production-ready when:
- Customer has the Firefly Video entitlement (verify SKU before building)
- Generation jobs are tracked with appropriate timeouts (10-15 min max)
- Output MP4s are downloaded and re-hosted within the URL expiry window
- Prompts follow the structured pattern (subject + setting + motion + camera + style)
- Use case is appropriate for clip-length output (not long-form)
- Legal sign-off acknowledges IP indemnification posture
Troubleshooting & Edge Cases
- Output has incoherent or "morphing" subjects: Prompt is too complex. Simplify to one subject + one motion.
- Output is shorter than expected: clips can come back shorter than requested when temporal coherence degrades. Reduce motion complexity.
- Job stuck for 10+ minutes: Cancel and resubmit. Typical jobs finish in 1-3 minutes; long stalls are rare but happen during peak load.
sizesrejected:sizesmust be an array of{width, height}objects — the most common rejection is passing a single object instead of an array. Stick to the tested set (1920×1080, 1080×1920, 960×960, 1280×720, 720×1280) for predictable results; the API has accepted and completed other dimensions in live checks (e.g. 1080×1080), so an unusual size is not automatically the cause of a rejection.- Request runs against the wrong model: Ensure the
x-model-version: video1_standardheader is present on the submission. - Content safety filter triggers on a clean prompt: In practice, video prompts appear to trigger safety filters more readily than equivalent image prompts. Strip any reference to people, brands, or sensitive themes and try again.
- Image-to-video output ignores the source: Source image may not match the target aspect ratio. Pre-process to the exact target size.
Chaining with Other Skills
firefly-services-storage-refs— Source image upload for image-to-videofirefly-generate-image-v3-async— Generate the source image firstfirefly-services-rate-limits— Video quota is lower; plan capacityfirefly-services-troubleshoot— Errors are usually safety-filter or rate-limit