Create transition video
August 29, 2025
Table of contents
This endpoint creates multi-frame transition videos with up to 7 frames and customizable transition durations between frames.
To upload frame images use POST files.
https://api.useapi.net/v2/pixverse/videos/create-transition
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",
    "quality": "540p",
    "seed": 123456789,
    "frame_1_path": "upload/scene1.jpg",
    "frame_2_path": "upload/scene2.jpg",
    "frame_3_path": "upload/scene3.jpg",
    "duration_1_to_2": "3",
    "duration_2_to_3": "2",
    "prompt_1_to_2": "Smooth fade between scenes",
    "prompt_2_to_3": "Quick transition",
    "lip_sync_tts_prompt": "Optional TTS narration",
    "lip_sync_tts_speaker_id": "speaker_001",
    "auto_sound": true,
    "sound_effect_prompt": "Ambient background music",
    "off_peak_mode": false,
    "maxJobs": 1,
    "replyUrl": "Place your call back URL here",
    "replyRef": "Place your reference id here"
}
-  emailis optional, if not specified API will randomly select account from available accounts.
-  modelis optional.
 Supported values:v4,v4.5, andv5(default). See Model Capabilities for feature differences.
-  qualityis optional. Video quality.
 Supported values:1080p,720p,540p(default),360p.
-  motion_modeis optional, leave empty for v5 model.
 Supported values:normal(default),fast.
-  seedis optional.
 Valid range 1…2147483647.
-  frame_1_pathis required, provide path of uploaded image via POST files.
-  frame_2_pathis required, provide path of uploaded image via POST files.
-  frame_3_pathis optional, provide path of uploaded image via POST files.
-  frame_4_pathis optional, provide path of uploaded image via POST files.
-  frame_5_pathis optional, provide path of uploaded image via POST files.
-  frame_6_pathis optional, provide path of uploaded image via POST files.
-  frame_7_pathis optional, provide path of uploaded image via POST files.
-  duration_1_to_2is optional. Transition duration from frame 1 to frame 2 in seconds.
 Supported values:1,2,3,4,5.
-  duration_2_to_3is optional. Transition duration from frame 2 to frame 3 in seconds.
 Supported values:1,2,3,4,5.
-  duration_3_to_4is optional. Transition duration from frame 3 to frame 4 in seconds.
 Supported values:1,2,3,4,5.
-  duration_4_to_5is optional. Transition duration from frame 4 to frame 5 in seconds.
 Supported values:1,2,3,4,5.
-  duration_5_to_6is optional. Transition duration from frame 5 to frame 6 in seconds.
 Supported values:1,2,3,4,5.
-  duration_6_to_7is optional. Transition duration from frame 6 to frame 7 in seconds.
 Supported values:1,2,3,4,5.
-  prompt_1_to_2is optional, describe transition from frame 1 to frame 2.
-  prompt_2_to_3is optional, describe transition from frame 2 to frame 3.
-  prompt_3_to_4is optional, describe transition from frame 3 to frame 4.
-  prompt_4_to_5is optional, describe transition from frame 4 to frame 5.
-  prompt_5_to_6is optional, describe transition from frame 5 to frame 6.
-  prompt_6_to_7is optional, describe transition from frame 6 to frame 7.
-  auto_soundis optional. Set totrueto generate videos with sound.
 Supported values: not specified (default),false,true.
-  sound_effect_promptis optional, describe the sound eg “epic adventure music”.
 Maximum length 140 characters.
-  lip_sync_tts_promptis optional, enter character lines.
 Maximum length 140 characters.
-  lip_sync_tts_speaker_idis optional, specify desired lipsync voice see GET videos/voices.
-  off_peak_modeis optional. Set totrueto generate videos during low-demand periods with up to 50% credit savings. Results are usually delivered within 24 hours. Off-Peak Mode generations are not tracked by the scheduler and are not counted towards the number of currently executed jobs. The replyUrl webhook will also be ignored. You must use GET videos to retrieve the generated results.
 Supported values:false(default),true.
-  replyUrlis optional, place here your callback URL. API will call the providedreplyUrlonce PixVerse video completed or failed. We recommend using sites like webhook.site to test callback URL functionality.
 Maximum length 1024 characters.
-  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. It should not exceed the number of concurrent generations supported by your account subscription plan.
 Valid range: 1…8
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-transition 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-transition requests. Size of query defined by 
-  596 Pending mod message Your PixVerse.ai account has a pending error. Most likely, you changed your account password or your PixVerse.ai account was placed on hold. Once the issue is resolved, update your account to clear the error by executing POST accounts/email before making any new API calls. { "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." }
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-transition" \ -d '{"frame_1_path": "…", "frame_2_path": "…"}'
-  const frame_1_path = "provide path of uploaded first image via POST /files"; const frame_2_path = "provide path of uploaded second image via POST /files"; const apiUrl = `https://api.useapi.net/v2/pixverse/videos/create-transition`; const token = "API token"; const data = { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' } }; data.body = JSON.stringify({ frame_1_path, frame_2_path }); const response = await fetch(apiUrl, data); const result = await response.json(); console.log("response", {response, result});
-  import requests frame_1_path = "provide path of uploaded first image via POST /files" frame_2_path = "provide path of uploaded second image via POST /files" apiUrl = f"https://api.useapi.net/v2/pixverse/videos/create-transition" token = "API token" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } body = { "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())