Best Image-to-Video AI Models in 2026: Cost, Resolution, and Control
Kenny Rogers · · Updated

If you already have the image a video should start from, choosing an image-to-video model comes down to what has to happen after that first frame: how long the clip runs, whether it must end on a second exact image, whether it needs sound, and what it costs per second. We compared the 26 models in our video catalog that accept a starting frame. For a short clip with an exact last frame and audio, start with Veo 3.1 Lite from $0.05 per second at 720p with audio. For clips up to 30 seconds, compare Seedance 2.5 and Wan 3.0.
These picks are a starting point. The specs below say what each model accepts, not how good its motion looks, so the only real way to know which model is best for your workflow is to test the finalists on your own images. Our video benchmarks show each model’s output on the same 12 prompts, and the video rankings show which models developers use most.
You call all of them through the same video generation API. The submit, poll, and download lifecycle is the same for every model. The durations, resolutions, frame roles, audio options, and prices each model accepts are not. This post compares those settings, then shows how to submit an image-to-video job with the TypeScript SDK.
Summary
- Veo 3.1, Fast, and Lite generate 4, 6, or 8 second clips with first-frame and last-frame control and generated audio. Veo 3.1 and Fast go up to 4K, Lite stops at 1080p and starts at $0.05 per second at 720p with audio, $0.03 without.
- Seedance 2.5, Wan 3.0, and Wan 3.0 Prime run up to 30 seconds. Seedance 2.5 adds a last frame and up to 50 reference assets. Wan 3.0 fixes the first frame only but reaches 1080p.
- FLUX 3 Video generates 5 to 20 second clips up to 4K with first and last frames. Veo 3.1, Veo 3.1 Fast, and Seedance 2.0 are the other 4K options.
- Seedance 1.5 Pro has the lowest price per second, about $0.012 at 480p without audio. Grok Imagine Video 1.5 Lite and HeyGen Video start at $0.02.
- 15 of the 26 models accept a last frame as well as a first. The other 11 fix the opening image only.
- Every model here uses
POST /api/v1/videos.GET /api/v1/videos/modelsreturns each model’s supported settings and pricing SKUs.
How an image can be used in a video request
An image can define a frame in the finished video or act as reference material. We handle those two cases with two different request fields.
Text-to-video, image-to-video, and reference-to-video
With text-to-video, the model builds the scene from your prompt alone. You don’t control the opening frame beyond what the prompt describes.
With image-to-video, the image becomes the first frame, the last frame, or both. If a product video has to open on an exact product shot, this is the mode to use.
With reference-to-video, the model receives source material without fixing it to a frame position. You might provide several images of one character so the model keeps their appearance while composing a new shot.
If the image must appear at a specific point in the clip, use image-to-video. If it only needs to guide the result, use reference-to-video.
The frame_images and input_references fields
We expose the two modes as separate fields on POST /api/v1/videos.
| Field | What it does |
|---|---|
frame_images | Uses an image as the exact first frame, last frame, or both |
input_references | Gives the model image, video, or audio material to follow without fixing it to a frame |
Each frame_images entry carries a frame_type of first_frame or last_frame. Not every model supports both roles. The supported_frame_images array in the video models catalog tells you which roles a model accepts.
If you send both fields in one request, frame_images takes precedence and we treat the job as image-to-video.
Image-to-video models compared
These tables cover every model in our video catalog that accepts a starting frame: 26 of the 30 on October 15, 2026. The other four edit or upscale existing video, or animate a talking-head avatar from a photo, and don’t use frame_images.
How we compared them
We compared them on six criteria: resolution, duration, frame control, generated audio, reference inputs, and price per second. Resolutions, durations, frame roles, audio settings, and prices come from GET /api/v1/videos/models, and reference inputs come from each model’s description and pricing SKUs. We checked both on October 15, 2026. Video pricing varies by resolution, audio, and input type, so treat these figures as a comparison and check the model page before estimating production cost.
Output settings
| Model | Best for | Resolution | Duration | Generated audio | Frame control |
|---|---|---|---|---|---|
| google/veo-3.1 | The top Veo tier, up to 4K | 720p, 1080p, 4K | 4, 6, 8 s | Optional | First and last |
| google/veo-3.1-fast | 4K at a lower rate than Veo 3.1 | 720p, 1080p, 4K | 4, 6, 8 s | Optional | First and last |
| google/veo-3.1-lite | Low-cost drafts with first and last frames | 720p, 1080p | 4, 6, 8 s | Optional | First and last |
| bytedance/seedance-2.5 | Up to 30 s with many reference assets | 480p, 720p | 4 to 30 s | Optional | First and last |
| bytedance/seedance-2.0 | Seedance at 1080p or 4K | 480p, 720p, 1080p, 4K | 4 to 15 s | Optional | First and last |
| bytedance/seedance-2.0-fast | Seedance 2.0 at a lower rate | 480p, 720p | 4 to 15 s | Optional | First and last |
| bytedance/seedance-2.0-mini | The lowest-priced Seedance 2.0 tier | 480p, 720p | 4 to 15 s | Optional | First and last |
| bytedance/seedance-1-5-pro | The lowest price per second | 480p, 720p, 1080p | 4 to 12 s | Optional | First and last |
| kwaivgi/kling-v3.0-pro | Kling’s higher visual quality tier | 720p | 3 to 15 s | Optional | First and last |
| kwaivgi/kling-v3.0-std | First and last frames from 3 to 15 s | 720p | 3 to 15 s | Optional | First and last |
| kwaivgi/kling-video-o1 | Fixed 5 or 10 s shots | 720p | 5 or 10 s | Optional | First and last |
| minimax/hailuo-3 | 2K with first and last frames | 2K | 5 to 15 s | Optional | First and last |
| minimax/hailuo-3-max | First and last frames under $0.10/s | 480p, 768p | 5 to 15 s | Not listed | First and last |
| black-forest-labs/flux-3-video | Up to 20 s at 4K | 720p, 1080p, 2K, 4K | 5 to 20 s | Optional | First and last |
| alibaba/wan-2.7 | First and last frames at 1080p | 720p, 1080p | 2 to 10 s | Optional | First and last |
| alibaba/wan-3.0 | Up to 30 s at 1080p from one frame | 480p, 720p, 1080p | 2 to 30 s | Optional | First only |
| alibaba/wan-3.0-prime | Wan 3.0’s fast mode | 480p, 720p, 1080p | 2 to 30 s | Optional | First only |
| alibaba/wan-2.6 | Reference video or audio input | 720p, 1080p | 5 or 10 s | Optional | First only |
| alibaba/happyhorse-1.1 | One frame or reference images at 1080p | 720p, 1080p | 3 to 15 s | Not listed | First only |
| alibaba/happyhorse-1.0 | The earlier HappyHorse release | 720p, 1080p | 3 to 15 s | Not listed | First only |
| x-ai/grok-imagine-video-1.5 | One frame up to 1080p with sound | 480p, 720p, 1080p | 1 to 15 s | Yes | First only |
| x-ai/grok-imagine-video-1.5-lite | Low-cost clips from one frame | 480p, 720p, 1080p | 1 to 15 s | Not listed | First only |
| x-ai/grok-imagine-video | Reference-to-video with up to 7 images | 480p, 720p | 1 to 15 s | Not listed | First only |
| heygen/heygen-video-1 | Low-cost clips with sound, up to 2K | 480p, 768p, 2K | 5 to 15 s | Yes | First only |
| runway/gen-4.5 | 720p clips up to 10 s | 720p | 2 to 10 s | Not listed | First only |
| minimax/hailuo-2.3 | Fixed 6 or 10 s shots at 1080p | 1080p | 6 or 10 s | Not listed | First only |
Reference inputs and price
| Model | Reference inputs | Price |
|---|---|---|
| google/veo-3.1 | Not listed | $0.20/s to $0.60/s |
| google/veo-3.1-fast | Not listed | $0.08/s to $0.30/s |
| google/veo-3.1-lite | Not listed | $0.03/s to $0.08/s |
| bytedance/seedance-2.5 | Up to 50 image, video, and audio assets | From $0.1028/s at 480p |
| bytedance/seedance-2.0 | Image, video, and audio | From $0.06726/s at 480p |
| bytedance/seedance-2.0-fast | Image, video, and audio | From $0.04035/s at 480p |
| bytedance/seedance-2.0-mini | Image, video, and audio | From $0.03363/s at 480p |
| bytedance/seedance-1-5-pro | Not listed | From $0.0115/s at 480p without audio, $0.0231/s with audio |
| kwaivgi/kling-v3.0-pro | Not listed | $0.112/s without audio, $0.168/s with audio |
| kwaivgi/kling-v3.0-std | Not listed | $0.084/s without audio, $0.126/s with audio |
| kwaivgi/kling-video-o1 | Not listed | $0.112/s |
| minimax/hailuo-3 | Images | $0.13/s plus $0.04 per reference image |
| minimax/hailuo-3-max | Not listed | $0.05/s at 480p, $0.08/s at 768p |
| black-forest-labs/flux-3-video | Video, for continuation | $0.17/s at 720p to $0.41/s at 4K, $0.31/s to $0.53/s for continuation |
| alibaba/wan-2.7 | Images | $0.10/s |
| alibaba/wan-3.0 | Listed as reference-guided | $0.05/s at 480p to $0.20/s at 1080p |
| alibaba/wan-3.0-prime | Not listed | $0.068/s at 480p to $0.28/s at 1080p |
| alibaba/wan-2.6 | Video and audio | $0.10/s at 720p, $0.15/s at 1080p |
| alibaba/happyhorse-1.1 | Images | $0.0988/s at 720p, $0.1278/s at 1080p |
| alibaba/happyhorse-1.0 | Images | $0.0988/s at 720p, $0.1694/s at 1080p |
| x-ai/grok-imagine-video-1.5 | Not listed | $0.08/s to $0.25/s plus $0.01 per input image |
| x-ai/grok-imagine-video-1.5-lite | Not listed | $0.02/s to $0.14/s plus $0.01 per input image |
| x-ai/grok-imagine-video | Up to 7 images | $0.05/s to $0.07/s plus $0.002 per input image |
| heygen/heygen-video-1 | Images | $0.02/s at 480p to $0.10/s at 2K, $0.07/s to $0.18/s with references plus $0.04 per image |
| runway/gen-4.5 | Not listed | $0.12/s |
| minimax/hailuo-2.3 | Images | $0.0817/s |
Three notes on reading the tables.
- Optional audio means the model exposes the
generate_audiorequest parameter. Grok Imagine Video 1.5 and HeyGen Video don’t expose it, but their descriptions say they generate sound, so the table marks them as Yes. Not listed means the model has nogenerate_audioparameter and its description doesn’t mention audio. - Reference inputs reflects what the model description or its pricing SKUs on its OpenRouter page state. Not listed means neither mentions reference images, video, or audio. It doesn’t mean we tested and found that references are rejected. The reference-to-video cookbook explains how to confirm support before you build on it.
- Seedance prices are per video token, not per second. The Seedance 2.0 model pages state that the token count is height times width times duration times 24, divided by 1,024. The per-second figures for Seedance 2.5 and 2.0 are the starting rates the model pages display for 480p output. Seedance 2.5 lists $10.70 per million video tokens, Seedance 2.0 lists $7.00 at 480p and 720p with separate 1080p and 4K rates, Fast lists $4.20, and Mini lists $3.50. Seedance 1.5 Pro lists $2.40 per million video tokens with audio and $1.20 without, and its per-second figures are our calculation with the same formula at 854 by 480. Requests with video input use a lower per-token rate.
Because most models bill per second, duration is also a cost decision. At Seedance 2.5’s starting rate of $0.1028 per second, a 4 second clip starts at about $0.41 and a 30 second clip starts at about $3.08. A 30 second Wan 3.0 clip at 480p costs $1.50. The charge is higher at 720p or with a different input configuration.
How to choose
Duration and frame control narrow the list first. Once you know how long the clip must be and whether you need a fixed first frame, last frame, or both, compare the remaining models on audio, resolution, and cost.
| If your work needs | Start with | Why |
|---|---|---|
| An exact first and last frame, 8 s or less, with audio | Veo 3.1 Lite | $0.05/s at 720p with audio, $0.03/s without. Veo 3.1 and Fast go to 4K |
| A clip up to 30 s | Seedance 2.5 or Wan 3.0 | Seedance 2.5 adds a last frame and 50 references. Wan 3.0 costs $0.05/s at 480p or $0.20/s at 1080p |
| 4K for up to 8 s | Veo 3.1 Fast | $0.25/s at 4K without audio, the lowest 4K rate here |
| 4K for up to 20 s | FLUX 3 Video | 5 to 20 s at up to 4K with first and last frames, $0.41/s at 4K |
| First and last frames on a budget | Seedance 1.5 Pro or Hailuo 3 Max | From $0.0115/s and $0.05/s at 480p |
| One starting frame with sound, cheaply | HeyGen Video or Grok Imagine Video 1.5 | $0.02/s and $0.08/s at 480p, both with generated sound |
| Many reference assets | Seedance 2.5 | Up to 50 image, video, and audio assets |
Clips of 8 seconds or less with generated audio
Veo 3.1, Veo 3.1 Fast, and Veo 3.1 Lite generate 4, 6, or 8 second clips in 16:9 or 9:16 with first-frame and last-frame control and a generate_audio option. Veo 3.1 and Fast accept 720p, 1080p, and 4K. Lite accepts 720p and 1080p.
Lite starts at $0.03 per second for 720p without audio and Veo 3.1 starts at $0.20 per second without audio, so Lite or Fast cost less while the prompt and motion are still changing. The image-to-video cookbook uses google/veo-3.1-lite for this reason.
The Veo 3.1 Fast and Lite model descriptions list SynthID watermarking, Google’s imperceptible marker for AI-generated content. If your workflow has provenance or watermark requirements, check the model description for the Veo variant you plan to use.
Clips up to 30 seconds and many reference assets
Seedance 2.5 generates 4 to 30 second clips at 480p or 720p, accepts first and last frames, and takes up to 50 image, video, and audio reference assets.
Wan 3.0 and Wan 3.0 Prime also run from 2 to 30 seconds and go up to 1080p, but they fix the first frame only. Wan 3.0 costs $0.05 per second at 480p and $0.20 at 1080p. Prime is the fast-mode variant and costs more at every resolution. FLUX 3 Video stops at 20 seconds but goes up to 4K and accepts first and last frames.
The Seedance 2.0 line covers 4 to 15 seconds at lower starting rates than 2.5. Seedance 2.0 accepts 480p, 720p, 1080p, and 4K. Fast and Mini accept 480p and 720p. All three list image, video, and audio references in their descriptions.
Every Seedance model runs through hosted APIs only. We found no published weights or model license for any of them, so none can run locally or air-gapped. Hailuo 3’s description lists open weights.
First and last frame control from 3 to 15 seconds
Kling v3.0 Standard and Pro generate 3 to 15 second clips at 720p in 16:9, 9:16, or 1:1 with first-frame and last-frame control. Audio is optional. Standard costs $0.084 per second without audio and $0.126 with audio. Pro costs $0.112 and $0.168. Kuaishou describes Pro as the higher visual quality tier. Kling Video O1 generates 5 or 10 second clips at the same frame roles for $0.112 per second.
Seedance 1.5 Pro covers 4 to 12 seconds up to 1080p with both frame roles, and it has the lowest price per second in this comparison. Hailuo 3 Max covers 5 to 15 seconds at 480p or 768p for $0.05 to $0.08 per second. Wan 2.7 covers 2 to 10 seconds at 720p or 1080p for $0.10 per second. Hailuo 3 is the 2K option at $0.13 per second.
One starting frame and clips up to 15 seconds
Grok Imagine Video 1.5 generates 1 to 15 second clips at 480p, 720p, or 1080p in seven aspect ratios, and its description says it generates sound effects, ambience, and dialogue. Grok Imagine Video 1.5 Lite is the distilled, lower-cost version, from $0.02 per second at 480p. The earlier Grok Imagine Video stops at 720p, and its description lists reference-to-video with up to seven reference images.
HeyGen Video generates 5 to 15 second clips at 480p, 768p, or 2K with synthesized audio, from $0.02 per second at 480p. HappyHorse 1.1 and 1.0 take a single starting image or a set of reference images at 720p or 1080p. Runway Gen-4.5 generates 2 to 10 second clips at 720p in 16:9 or 9:16 for $0.12 per second. Hailuo 2.3 generates fixed 6 or 10 second clips at 1080p.
If the clip must end on a second exact image, use a model from the previous two sections instead.
Submit an image-to-video job
Once you have chosen a model, check that the source image is reachable through a stable, directly downloadable HTTPS URL and that the model supports the frame role you need.
A URL can work in your browser and still fail when the provider fetches it, for example when it depends on a session cookie, redirects through an HTML page, or sits behind a bot check. Check the URL directly before you spend credits on a generation.
curl -I "$FIRST_FRAME_URL"
You want a 200 status and an image content type such as image/jpeg, image/png, or image/webp.
The example below uses google/veo-3.1-lite to generate a 4 second 720p clip with the supplied image as the first frame and audio turned off. The REST API uses snake_case field names and the TypeScript SDK maps them to camelCase. frame_images becomes frameImages, frame_type becomes frameType, image_url becomes imageUrl, and generate_audio becomes generateAudio. Values such as first_frame and image_url stay the same.
The example also passes { retries: { strategy: "none" } } as the second argument to generate. By default the SDK retries requests that return a 5XX status with exponential backoff for up to one hour. A video submission starts billable work, so if the server accepts the job and then returns a transient error before you receive the job ID, an automatic retry submits a second paid job and the client only sees the second one. With retries off for the submission, a failed submission surfaces as an error and you decide whether to resubmit. The per-call option leaves the default retries in place for the read-only getGeneration polling calls, which are safe to repeat.
import { OpenRouter } from "@openrouter/sdk";
const apiKey = process.env.OPENROUTER_API_KEY;
const firstFrameUrl = process.env.FIRST_FRAME_URL;
if (!apiKey) {
throw new Error("Set OPENROUTER_API_KEY first.");
}
if (!firstFrameUrl) {
throw new Error("Set FIRST_FRAME_URL to a directly downloadable image URL.");
}
const openRouter = new OpenRouter({ apiKey });
const job = await openRouter.videoGeneration.generate(
{
videoGenerationRequest: {
model: "google/veo-3.1-lite",
prompt:
"The camera slowly pushes in as the subject turns toward warm window light, cinematic, realistic motion",
duration: 4,
resolution: "720p",
aspectRatio: "16:9",
generateAudio: false,
frameImages: [
{
type: "image_url",
imageUrl: { url: firstFrameUrl },
frameType: "first_frame",
},
],
},
},
{ retries: { strategy: "none" } },
);
console.log(job.id, job.status);
A successful submission returns a job, not the finished MP4. Store the job ID and poll GET /api/v1/videos/{jobId} until the status is completed, then download the video from the job’s unsigned_urls array, which the SDK exposes as unsignedUrls, with your API key in the Authorization header. Stop polling on failed, cancelled, or expired. Our video generation guide recommends a 30 second interval between polls.
let current = job;
while (!["completed", "failed", "cancelled", "expired"].includes(current.status)) {
await new Promise((resolve) => setTimeout(resolve, 30_000));
current = await openRouter.videoGeneration.getGeneration({ jobId: job.id });
}
if (current.status !== "completed") {
throw new Error(current.error ?? `Video generation ${current.status}.`);
}
If the model supports a supplied last frame, add a second frameImages entry with frameType: "last_frame".
frameImages: [
{
type: "image_url",
imageUrl: { url: firstFrameUrl },
frameType: "first_frame",
},
{
type: "image_url",
imageUrl: { url: lastFrameUrl },
frameType: "last_frame",
},
],
If your application lets users switch models, query GET /api/v1/videos/models before you build the request. The response includes each model’s supported_durations, supported_resolutions, supported_aspect_ratios, supported_frame_images, generate_audio flag, and pricing_skus. A request with an unsupported duration, resolution, or aspect ratio returns a 400 that lists the supported values.
FAQ
What is the best image-to-video AI model?
It depends on the clip. For an exact first and last frame with audio in 8 seconds or less, start with Veo 3.1 Lite at $0.05 per second at 720p with audio. For clips up to 30 seconds, compare Seedance 2.5 and Wan 3.0. For 4K up to 20 seconds, FLUX 3 Video. Then test the finalists on your own images, because specs don’t show motion quality.
Which image-to-video model is cheapest?
Seedance 1.5 Pro, from about $0.012 per second at 480p without audio, by its per-token price. Grok Imagine Video 1.5 Lite and HeyGen Video both start at $0.02 per second at 480p, and Veo 3.1 Lite at $0.03 per second at 720p without audio. Prices from our catalog on October 15, 2026.
Which image-to-video models are available on OpenRouter?
On October 15, 2026, 26 of the 30 models in our video catalog accepted a starting frame, from Google (Veo 3.1), ByteDance (Seedance), Kuaishou (Kling), SpaceXAI (Grok Imagine Video), Alibaba (Wan, HappyHorse), MiniMax (Hailuo), Black Forest Labs (FLUX 3 Video), Runway, and HeyGen. The video models collection and GET /api/v1/videos/models list the current set.
What is the difference between image-to-video and reference-to-video?
Image-to-video uses frame_images. The image becomes the exact first frame, last frame, or both. Reference-to-video uses input_references. The model uses the images, video, or audio as guidance without placing them at a fixed frame. If a request includes both fields, frame_images takes precedence and we treat the request as image-to-video.
How much does image-to-video generation cost?
Most video models are priced per second of output, and the rate can change with resolution, whether audio is generated, and whether the request includes video input. The Seedance models are priced per video token instead. Each model page lists the current rates, and GET /api/v1/videos/models returns the pricing SKUs for each model.
How long does an image-to-video job take?
Video generation is asynchronous. POST /api/v1/videos returns a job immediately, and you poll GET /api/v1/videos/{jobId} until the status is completed. Our documentation recommends a 30-second interval between polls. Turnaround varies by model, duration, and resolution.
What happens if a video generation job fails?
A job can end as failed, cancelled, or expired. Stop polling when the status reaches one of those values and read the error field. A transient error on the poll request itself is not a failed job, so retry the status request for the same job ID instead of submitting a new paid generation.