Create video using image fusion
May 16, 2025 (November 2, 2026)
Table of contents
Upload multiple reference frames and describe the content you want to create. Also known as Reference mode or video-reference.
Supported models (see Model Capabilities for max images per model):
- Native PixVerse:
v5(up to 3),v5.6(up to 7),pixverse-c1(up to 7) - Third-party:
seedance-2.5(up to 30 images + 10 ref videos + 10 ref audios, 50 references in total),seedance-2.0,seedance-2.0-fast,seedance-2.0-mini(each up to 9 images + 3 ref videos + 3 ref audios),kling-4.0(up to 10 images + 5 ref videos),kling-o3(up to 7),minimax-h3,minimax-h3-max(each up to 9 images),gemini-omni-flash(up to 5 images + 3 ref videos),wan-3.0(up to 10 images + 5 ref videos + 5 ref audios)
All models use @image1…@imageN in the prompt, mapped positionally to frame_1_path…frame_N_path. v5 also accepts the legacy @pic1/@pic2/@pic3 synonyms.
The Seedance models additionally accept reference videos via video_1_path…video_N_path (referenced as @video1…@videoN) and reference audios via audio_1_path…audio_N_path (referenced as @audio1…@audioN). This is PixVerse’s omni mode — use reference videos to drive motion, camera moves, or rhythm, and reference audios to drive speech or sound onto your character image. seedance-2.5 takes up to 10 of each, the seedance-2.0 family up to 3 of each. gemini-omni-flash also accepts up to 3 reference videos, but no reference audios — it is built for editing an existing clip, for example replacing the person in @video1 with @image1.
To upload prompt images and videos use POST /files.
https://api.useapi.net/v2/pixverse/videos/create-fusion
Request Headers
Authorization: Bearer {API token}
Content-Type: application/json
# Alternatively you can use multipart/form-data
# Content-Type: multipart/form-data
API tokenis required, see Setup useapi.net for details.
Request Body
{
"email": "Optional PixVerse API account email",
"model": "pixverse-c1",
"prompt": "A dog @image1 and a cat @image2 traveling together in the car @image3",
"frame_1_path": "upload/eb20c63d-2a1a-5be6-a562-d3578a2831e3.png",
"frame_2_path": "upload/7b45d27f-301c-4d18-a2a1-f8bc3672e6a9.png",
"frame_3_path": "upload/f8bc3672e6a9-301c-4d18-a2a1-7b45d27f.png",
"duration": 8,
"quality": "720p",
"aspect_ratio": "16:9",
"audio": true,
"seed": 654321,
"replyUrl": "Place your call back URL here",
"replyRef": "Place your reference here",
"off_peak_mode": true
}
-
emailis optional, if not specified API will randomly select account from available accounts. -
modelis optional. Default:v5— omittingmodelgives you v5’s 3-image cap and its legacy@pic1/@pic2/@pic3handling, not a newer model. Passmodelexplicitly for anything else. Supported values:v5,v5.6,pixverse-c1,seedance-2.5,seedance-2.0,seedance-2.0-fast,seedance-2.0-mini,kling-4.0,kling-o3,minimax-h3,minimax-h3-max,gemini-omni-flash,wan-3.0. -
promptis required, describe your video.
Maximum length 5,000 characters, 20,000 forwan-3.0, 15,000 forseedance-2.5, 7,000 forminimax-h3andminimax-h3-max, 3,800 forgemini-omni-flash, and 2,500 forkling-4.0andkling-o3. Use@image1,@image2, …@imageNin the prompt to referenceframe_1_path…frame_N_pathby index.v5also accepts the legacy@pic1/@pic2/@pic3synonyms for backward compatibility. -
frame_1_pathis required, provide the path of uploaded image via POST /files. frame_2_paththroughframe_30_pathare optional. Max accepted depends on the model:v5.6,pixverse-c1— up to 7 (frame_1_path…frame_7_path)seedance-2.5— up to 30seedance-2.0,seedance-2.0-fast,seedance-2.0-mini— up to 9kling-4.0— up to 10 images and 5 reference videoskling-o3— up to 7minimax-h3— up to 9. Costs 10 extra credits per image above 5.minimax-h3-max— up to 9. Costs 20 extra credits per image above 2.wan-3.0— up to 10 images, 5 reference videos and 5 reference audios. References cost nothing extra, and fusion is billed at the same per-second rate as text-to-video.gemini-omni-flash— up to 5v5— up to 3 (frame_1_path,frame_2_path,frame_3_path)
Frames must be provided sequentially —
frame_3_pathrequiresframe_2_path, etc.-
video_1_path…video_10_pathare optional and supported by the Seedance models,wan-3.0,kling-4.0andgemini-omni-flash— up to 10 forseedance-2.5, up to 5 forwan-3.0andkling-4.0, and up to 3 for theseedance-2.0family andgemini-omni-flash. Provide the path of an uploaded video via POST /files. Reference them in the prompt as@video1…@videoN. Must be sequential —video_2_pathrequiresvideo_1_path.Reference video limits — every video is ≤ 50 MB, 24–60 fps, max dimensions 6000 × 6000 px. Count and duration differ by model:
seedance-2.5— up to 10 videos, each 1.8–30.2 sec, summed ≤ 30.2 secseedance-2.0family — up to 3 videos, each 2–15 sec, summed ≤ 15 secwan-3.0— up to 5 videos, each 2–15 sec, summed ≤ 15 secgemini-omni-flash— up to 3 videos, each 2–15 sec, summed ≤ 15 seckling-4.0— up to 5 videos, each 3–30 sec, summed ≤ 30 sec. With a reference video PixVerse bills the longer of (reference length + output length) and twice the output length.
-
audio_1_path…audio_10_pathare optional and supported by the Seedance models andwan-3.0— up to 10 forseedance-2.5, up to 5 forwan-3.0, and up to 3 for theseedance-2.0family. Provide the path of an uploaded audio file via POST /files. Reference them in the prompt as@audio1…@audioN. Must be sequential —audio_2_pathrequiresaudio_1_path. Use reference audios to drive speech or sound (for example, lip-synced dialogue) onto your character.Reference audio limits — every audio file is ≤ 15 MB. Count and duration differ by model:
seedance-2.5— up to 10 audios, each 1.8–30.2 sec, summed ≤ 30.2 secseedance-2.0family — up to 3 audios, each 2–15 sec, summed ≤ 15 secwan-3.0— up to 5 audios, each 2–15 sec, summed ≤ 15 sec. PixVerse states a 1-second floor for audio, we enforce 2 because the same rule covers reference video.
seedance-2.5additionally caps the combined number of references — images plus videos plus audios — at 50.The API validates these durations per model — the per-model figures listed above, not one global rule — before submitting. Video size, fps, and dimensions are enforced by PixVerse upstream.
-
durationandqualityare optional only whenmodelis omitted, in which case the request falls back tov5withduration: 5andquality: 540p. Naming any model — native or third-party — makes both required, and omitting either returns400 duration is required for model <name>. Accepted values depend on the model — see Model Capabilities. -
aspect_ratiois optional, default16:9. See Model Capabilities for per-model supported values. -
audiois optional (where supported by the model — see Model Capabilities). Set totrueto enable integrated audio. Supported values:false(default),true. -
seedis optional, and only for the native PixVerse models (v5,v5.6,pixverse-c1) — every third-party model rejects it.
Valid range 1…2147483647. -
off_peak_modeis optional. Set totrueto generate videos during low-demand periods at a reduced credit cost. Only supported for native PixVerse models (v5,v5.5,v5.6,v5-fast,v6,pixverse-c1) — third-party models reject this flag. Discount varies by subscription plan: Pro 30% off, Premium 50% off, Ultra unlimited free. Results are usually delivered within 24 hours. Off-Peak generations are not tracked by the scheduler, don’t count toward concurrent-job limits, and thereplyUrlwebhook is not called — use GET videos to retrieve results.
Supported values:false(default),true. -
replyUrlis optional. This is the preferred and most optimal way to receive results quickly — the API polls every 10 seconds and will call the providedreplyUrlonce the PixVerse video is completed or failed. Maximum length 1024 characters. We recommend using sites like webhook.site to test callback URL functionality. Callback body has the same JSON shape as GET /videos/video_idresponse. -
replyRefis optional, place here your reference id which will be stored and returned along with this PixVerse video response / result.
Maximum length 1024 characters. maxJobsis optional, if not specified value from selected accounts/email will be used.
Valid range: 1…8
It should not exceed the number of concurrent generations supported by your account subscription plan.
Responses
-
Use the returned
video_idto retrieve video status and results using GET /videos. Locate the video in the response array and check if the fieldvideo_status_finalistrueorvideo_status_nameisCOMPLETED. The fieldurlwill contain the generated video link.If you specify the optional parameter
replyUrl, the API will call the providedreplyUrlwith video progress updates until the video is complete or fails.{ "video_id": "user:<userid>-pixverse:<email>-video:<number>" } -
{ "error": "<Error message>" } -
{ "error": "Unauthorized" } -
Insufficient credits. All Credits have been used up. Please upgrade your membership or purchase credits.
{ "error": "All Credits have been used up. Please upgrade your membership or purchase credits." } -
Moderated message.
{ "error": "Your prompt has triggered our AI moderator, please re-enter your prompt" } -
Wait in a loop for at least 10..30 seconds and retry again.
There are two possible cases for API response 429:
- API query is full and can not accept new videos/create-fusion requests. Size of query defined by
maxJobsoptional parameter.{ "error": "Account <email> is busy executing <maxJobs> tasks." "All configured accounts are running at maximum capacity." } - The API received an HTTP response status 429 from PixVerse. Please refer to your subscription plan for the maximum allowed tasks in the queue.
{ "error": "Reached the limit for concurrent generations." }
- API query is full and can not accept new videos/create-fusion requests. Size of query defined by
-
596 Pending mod message
The account has a pending error, and the API does not use it until you add it again with POST accounts/email. You receive an email when this happens. There are three causes.
PixVerse could not sign the account in, most often because its password was changed. Add the account again with the current password.
{ "error": "Your PixVerse account has pending error. Please address this issue at https://useapi.net/docs/api-pixverse-v2/post-pixverse-accounts-email before making any new API calls.", "code": 596 }Or PixVerse suspended the account. PixVerse suspends accounts that break its content rules and does not say which generation caused it. The first response carries PixVerse’s own details in
account_moderation, and later calls return the sameerror. Add the account again afterreinstatement_at. To ask PixVerse to lift the suspension earlier, write to thesupport_emailit gives.{ "error": "PixVerse suspended account [email protected] for 30 days, from 2026-10-16 09:26 UTC until 2026-11-15 09:26 UTC. PixVerse suspends accounts that break its content rules and does not say which generation caused it. Add the account again at https://useapi.net/docs/api-pixverse-v2/post-pixverse-accounts-email after 2026-11-15 09:26 UTC. To ask PixVerse to lift it earlier, write to [email protected].", "code": 596, "account_moderation": { "ban_level": "suspend_30d", "action": "temporary_suspend", "duration_days": 30, "suspended_at": "2026-10-16 09:26:25 (UTC)", "reinstatement_at": "2026-11-15 09:26:25 (UTC)", "support_email": "[email protected]" } }Or PixVerse banned the account for violating its community guidelines. A ban is permanent unless PixVerse accepts an appeal, and the
errorquotes PixVerse’s own message, which says how to appeal. Remove the account with DELETE accounts/email, or add it again only if PixVerse lifts the ban.{ "error": "PixVerse banned account [email protected] for violating its community guidelines (400024). A ban is permanent unless PixVerse accepts an appeal. PixVerse says: \"Your account has been banned for violating community guidelines. If you wish to appeal, please contact us via ...\" Remove it with DELETE /v2/pixverse/accounts/[email protected], or add it again (https://useapi.net/docs/api-pixverse-v2/post-pixverse-accounts-email) only if PixVerse lifts the ban.", "code": 596 }If every account you have is in this state, a request without
emailreturns 596 as well.
Model
{ // TypeScript, all fields are optional
video_id: string
error: string
}
Examples
-
curl -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer …" \ -X POST "https://api.useapi.net/v2/pixverse/videos/create-fusion" \ -d '{"prompt": "A dog @image1 and a cat @image2 traveling together", "frame_1_path": "…", "frame_2_path": "…"}' -
const prompt = "A dog @image1 and a cat @image2 traveling together"; const frame_1_path = "provide path of uploaded first image via POST /files"; const frame_2_path = "provide path of uploaded last image via POST /files"; const apiUrl = `https://api.useapi.net/v2/pixverse/videos/create-fusion`; const token = "API token"; const data = { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' } }; data.body = JSON.stringify({ prompt, frame_1_path, frame_2_path }); const response = await fetch(apiUrl, data); const result = await response.json(); console.log("response", {response, result}); -
import requests prompt = "A dog @image1 and a cat @image2 traveling together" frame_1_path = "provide path of uploaded first image via POST /files" frame_2_path = "provide path of uploaded last image via POST /files" apiUrl = f"https://api.useapi.net/v2/pixverse/videos/create-fusion" token = "API token" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } body = { "prompt": f"{prompt}", "frame_1_path": f"{frame_1_path}", "frame_2_path": f"{frame_2_path}" } response = requests.post(apiUrl, headers=headers, json=body) print(response, response.json())