Create video
Table of contents
March 24, 2025
This endpoint uses the most recent PixVerse model v4
.
To upload prompt image use POST files.
https://api.useapi.net/v2/pixverse/videos/create-v4
Request Headers
Authorization: Bearer {API token}
Content-Type: application/json
# Alternatively you can use multipart/form-data
# Content-Type: multipart/form-data
API token
is required, see Setup useapi.net for details.
Request Body
{
"email": "Optional PixVerse API account email",
"model": "v4",
"prompt": "Required text prompt",
"negative_prompt": "Optional negative prompt",
"first_frame_path": "upload/eb20c63d-2a1a-5be6-a562-d3578a2831e3.png",
"template_id": 12345,
"duration": 8,
"quality": "1080p",
"motion_mode": "normal",
"aspect_ratio": "9:16",
"style": "clay",
"sound_effect_prompt": "Optional sound effect prompt",
"lip_sync_tts_prompt": "Optional lipsync prompt",
"seed": 654321,
"replyUrl": "Place your call back URL here",
"replyRef": "Place your reference id here",
"maxJobs": 3
}
-
email
is optional, if not specified API will randomly select account from available accounts. -
model
is optional.
Supported values:v4
(default). -
prompt
is required, describe your video.
Maximum length 2048 characters. -
negative_prompt
is optional.
Maximum length 2048 characters. -
first_frame_path
is optional, provide the path of uploaded image via POST files. -
last_frame_path
is optional, provide the path of the uploaded image via POST files. Some effects require two images (e.g., “Forever Us”). Check the template fieldeffect_type
for the number of required images, and if it is set to2
you will need to provide alast_frame_path
image. -
template_id
is optional, provide template_id of desired effect, see GET videos/effects. -
duration
is optional. Video duration in seconds.
Supported values:8
,5
(default). -
quality
is optional. Video quality.
Supported values:1080p
,720p
,540p
(default),360p
. -
motion_mode
is optional.
Supported values:normal
(default),fast
. -
aspect_ratio
is optional.
Supported values:16:9
(default),9:16
,1:1
,4:3
,3:4
-
style
is optional.
Supported values:anime
,3d_animation
,comic
,cyberpunk
,clay
. -
camera_movement
is optional. Can not be used together withtemplate_id
parameter.
Supported values:horizontal_left
,horizontal_right
,vertical_up
,vertical_down
,zoom_in
,zoom_out
. -
seed
is optional.
Valid range 1…2147483647. -
sound_effect_prompt
is optional, describe the sound eg “the sound of waves hitting the shore”. -
lip_sync_tts_prompt
is optional, enter character lines.
Maximum length 140 characters. -
lip_sync_tts_speaker_id
is optional, specify desired lipsync voice see GET videos/voices. -
replyUrl
is optional, place here your callback URL. API will call the providedreplyUrl
once PixVerse video completed or failed. We recommend using sites like webhook.site to test callback URL functionality.
Maximum length 1024 characters. -
replyRef
is optional, place here your reference id which will be stored and returned along with this PixVerse video response / result.
Maximum length 1024 characters. -
maxJobs
is 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_id
to retrieve video status and results using GET videos. Locate the video in the response array and check if the fieldvideo_status_final
istrue
orvideo_status_name
isCOMPLETED
. The fieldurl
will contain the generated video link.If you specify the optional parameter
replyUrl
, the API will call the providedreplyUrl
with 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-v4 requests. Size of query defined by
maxJobs
optional 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-v4 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-v4" \ -d '{"prompt": "…"}'
-
const prompt = "text prompt"; const apiUrl = `https://api.useapi.net/v2/pixverse/videos/create-v4`; const token = "API token"; const data = { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' } }; data.body = JSON.stringify({ prompt }); const response = await fetch(apiUrl, data); const result = await response.json(); console.log("response", {response, result});
-
import requests prompt = "text prompt" apiUrl = f"https://api.useapi.net/v2/pixverse/videos/create-v4" token = "API token" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } body = { "prompt": f"{prompt}" } response = requests.post(apiUrl, headers=headers, json=body) print(response, response.json())