Best Image-to-Video AI Models in 2026: Cost, Resolution, and Control

Kenny Rogers · · Updated

Best Image-to-Video AI Models in 2026: Cost, Resolution, and Control

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/models returns 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.

FieldWhat it does
frame_imagesUses an image as the exact first frame, last frame, or both
input_referencesGives 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

ModelBest forResolutionDurationGenerated audioFrame control
google/veo-3.1The top Veo tier, up to 4K720p, 1080p, 4K4, 6, 8 sOptionalFirst and last
google/veo-3.1-fast4K at a lower rate than Veo 3.1720p, 1080p, 4K4, 6, 8 sOptionalFirst and last
google/veo-3.1-liteLow-cost drafts with first and last frames720p, 1080p4, 6, 8 sOptionalFirst and last
bytedance/seedance-2.5Up to 30 s with many reference assets480p, 720p4 to 30 sOptionalFirst and last
bytedance/seedance-2.0Seedance at 1080p or 4K480p, 720p, 1080p, 4K4 to 15 sOptionalFirst and last
bytedance/seedance-2.0-fastSeedance 2.0 at a lower rate480p, 720p4 to 15 sOptionalFirst and last
bytedance/seedance-2.0-miniThe lowest-priced Seedance 2.0 tier480p, 720p4 to 15 sOptionalFirst and last
bytedance/seedance-1-5-proThe lowest price per second480p, 720p, 1080p4 to 12 sOptionalFirst and last
kwaivgi/kling-v3.0-proKling’s higher visual quality tier720p3 to 15 sOptionalFirst and last
kwaivgi/kling-v3.0-stdFirst and last frames from 3 to 15 s720p3 to 15 sOptionalFirst and last
kwaivgi/kling-video-o1Fixed 5 or 10 s shots720p5 or 10 sOptionalFirst and last
minimax/hailuo-32K with first and last frames2K5 to 15 sOptionalFirst and last
minimax/hailuo-3-maxFirst and last frames under $0.10/s480p, 768p5 to 15 sNot listedFirst and last
black-forest-labs/flux-3-videoUp to 20 s at 4K720p, 1080p, 2K, 4K5 to 20 sOptionalFirst and last
alibaba/wan-2.7First and last frames at 1080p720p, 1080p2 to 10 sOptionalFirst and last
alibaba/wan-3.0Up to 30 s at 1080p from one frame480p, 720p, 1080p2 to 30 sOptionalFirst only
alibaba/wan-3.0-primeWan 3.0’s fast mode480p, 720p, 1080p2 to 30 sOptionalFirst only
alibaba/wan-2.6Reference video or audio input720p, 1080p5 or 10 sOptionalFirst only
alibaba/happyhorse-1.1One frame or reference images at 1080p720p, 1080p3 to 15 sNot listedFirst only
alibaba/happyhorse-1.0The earlier HappyHorse release720p, 1080p3 to 15 sNot listedFirst only
x-ai/grok-imagine-video-1.5One frame up to 1080p with sound480p, 720p, 1080p1 to 15 sYesFirst only
x-ai/grok-imagine-video-1.5-liteLow-cost clips from one frame480p, 720p, 1080p1 to 15 sNot listedFirst only
x-ai/grok-imagine-videoReference-to-video with up to 7 images480p, 720p1 to 15 sNot listedFirst only
heygen/heygen-video-1Low-cost clips with sound, up to 2K480p, 768p, 2K5 to 15 sYesFirst only
runway/gen-4.5720p clips up to 10 s720p2 to 10 sNot listedFirst only
minimax/hailuo-2.3Fixed 6 or 10 s shots at 1080p1080p6 or 10 sNot listedFirst only

Reference inputs and price

ModelReference inputsPrice
google/veo-3.1Not listed$0.20/s to $0.60/s
google/veo-3.1-fastNot listed$0.08/s to $0.30/s
google/veo-3.1-liteNot listed$0.03/s to $0.08/s
bytedance/seedance-2.5Up to 50 image, video, and audio assetsFrom $0.1028/s at 480p
bytedance/seedance-2.0Image, video, and audioFrom $0.06726/s at 480p
bytedance/seedance-2.0-fastImage, video, and audioFrom $0.04035/s at 480p
bytedance/seedance-2.0-miniImage, video, and audioFrom $0.03363/s at 480p
bytedance/seedance-1-5-proNot listedFrom $0.0115/s at 480p without audio, $0.0231/s with audio
kwaivgi/kling-v3.0-proNot listed$0.112/s without audio, $0.168/s with audio
kwaivgi/kling-v3.0-stdNot listed$0.084/s without audio, $0.126/s with audio
kwaivgi/kling-video-o1Not listed$0.112/s
minimax/hailuo-3Images$0.13/s plus $0.04 per reference image
minimax/hailuo-3-maxNot listed$0.05/s at 480p, $0.08/s at 768p
black-forest-labs/flux-3-videoVideo, 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.7Images$0.10/s
alibaba/wan-3.0Listed as reference-guided$0.05/s at 480p to $0.20/s at 1080p
alibaba/wan-3.0-primeNot listed$0.068/s at 480p to $0.28/s at 1080p
alibaba/wan-2.6Video and audio$0.10/s at 720p, $0.15/s at 1080p
alibaba/happyhorse-1.1Images$0.0988/s at 720p, $0.1278/s at 1080p
alibaba/happyhorse-1.0Images$0.0988/s at 720p, $0.1694/s at 1080p
x-ai/grok-imagine-video-1.5Not listed$0.08/s to $0.25/s plus $0.01 per input image
x-ai/grok-imagine-video-1.5-liteNot listed$0.02/s to $0.14/s plus $0.01 per input image
x-ai/grok-imagine-videoUp to 7 images$0.05/s to $0.07/s plus $0.002 per input image
heygen/heygen-video-1Images$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.5Not listed$0.12/s
minimax/hailuo-2.3Images$0.0817/s

Three notes on reading the tables.

  • Optional audio means the model exposes the generate_audio request 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 no generate_audio parameter 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 needsStart withWhy
An exact first and last frame, 8 s or less, with audioVeo 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 sSeedance 2.5 or Wan 3.0Seedance 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 sVeo 3.1 Fast$0.25/s at 4K without audio, the lowest 4K rate here
4K for up to 20 sFLUX 3 Video5 to 20 s at up to 4K with first and last frames, $0.41/s at 4K
First and last frames on a budgetSeedance 1.5 Pro or Hailuo 3 MaxFrom $0.0115/s and $0.05/s at 480p
One starting frame with sound, cheaplyHeyGen Video or Grok Imagine Video 1.5$0.02/s and $0.08/s at 480p, both with generated sound
Many reference assetsSeedance 2.5Up 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.

By subscribing you agree to receive the OpenRouter newsletter: model usage data, product updates, and research reports, about one email a week. Unsubscribe anytime via the link in every email. See our Privacy Policy.