=== useapi.net — universal note === Generated: 2026-09-11 20:33 UTC Authentication (applies to every useapi.net API). Header: Authorization: Bearer user:- Use the COMPLETE token, including the `user:` prefix and the alphanumeric suffix. Do not truncate. Do not URL-encode. A single token authorizes every API under the user's subscription. Service-specific patterns. Identifier names (jobid / taskId / musicId / etc.), job lifecycle, response shapes, webhook semantics, and synchronous-vs-async behavior vary PER API. Use ONLY the service-specific documentation below to determine the correct request body, response shape, polling endpoint, and status values for THIS API. Do not assume conventions from another useapi.net API carry over. For cross-service context (e.g. which APIs expose the same underlying model, billing tiers, model availability matrix), see https://useapi.net/llms.txt === END universal note === === URL: https://useapi.net/docs/start-here/setup-pixverse === Document URL: https://useapi.net/docs/start-here/setup-pixverse --- layout: default title: Setup PixVerse description: "How to set up PixVerse for the useapi.net API — connect your account and start generating via the API." parent: Start Here nav_order: 400 --- # Setup PixVerse December 6, 2024 ## Table of contents Approximately 2 minutes to complete setup steps. --- > This is the setup guide for [PixVerse API](/docs/api-pixverse-v2). An active [PixVerse.ai](https://pixverse.ai) account and a [useapi.net subscription](/docs/subscription) are required for the API to work. ## Create PixVerse.ai account Navigate to [PixVerse.ai](https://PixVerse.ai) and sign up with an email account. Our API does not support Gmail, Apple, or Discord accounts. We strongly recommend creating a separate PixVerse.ai account designated for API work. ![](/assets/images/pixverse_setup-v2-web.png) ## Configure PixVerse.ai API account Now that you have a working PixVerse.ai account, configure it for API access using [POST /accounts/`email`](/docs/api-pixverse-v2/post-pixverse-accounts-email). You will need your `email` and `password`. You should receive response `200` if successful. ## `OPTIONAL` Configure PixVerse API to use the current PixVerse.ai session The PixVerse.ai website enforces a single active session for a given account. When the API is running, it will terminate your web session. If you want to use the website and run the API simultaneously, you will need to perform the following steps in the **exact** order: * [POST /accounts/`email`](/docs/api-pixverse-v2/post-pixverse-accounts-email) using your `email` and `password`. * Navigate to [PixVerse.ai](https://PixVerse.ai), **logout** from your account, and **login** again. * Using the screenshot below, locate the session `token`.
Screenshot
* [POST /accounts/`email`](/docs/api-pixverse-v2/post-pixverse-accounts-email) using your `email`, `password` and the obtained `token`. * Keep the website open. Now, your API and your browser will share the session token, allowing you to use both. Keep in mind that the API will eventually try to refresh the token, so the approach described above is only effective for a limited time. We strongly recommend not using the API account for any manual generation to avoid any interference with the API. === URL: https://useapi.net/docs/api-pixverse-v2 === Document URL: https://useapi.net/docs/api-pixverse-v2 --- layout: default title: PixVerse API v2 description: "useapi.net PixVerse API v2 — REST API for PixVerse.ai: native PixVerse V6 and V5.x video plus third-party Seedance 2.5 / 2.0, Kling O3/V3, Veo 3.1, Sora 2, Grok Imagine, HappyHorse, MiniMax H3, Gemini Omni Flash, FLUX 3 and Wan 3.0, image generation, music generation, text-to-speech, video effects, extend, upscale and lip-sync." nav_order: 6000 has_children: true permalink: /docs/api-pixverse-v2 --- # PixVerse API v2 December 6, 2024 (September 10, 2026) This is an [experimental](/docs/legal) API for [PixVerse.ai](https://pixverse.ai). PixVerse.ai generates videos and images from text and image prompts, supports a large number of video effects, and can extend, upscale, and lipsync videos. We provide full API support for following PixVerse models: * PixVerse [videos](/docs/api-pixverse-v2/post-pixverse-videos-create-v4) supports native PixVerse models PixVerse V6 (default), V5.6, V5.5, V5, V5-fast, and [PixVerse C1](https://pixverse.ai) with Off-Peak mode (up to 50% off credits), plus third-party models: [Seedance 2.5, Seedance 2.0, Seedance 2.0 Fast, and Seedance 2.0 Mini](https://seed.bytedance.com/seedance) (ByteDance), [Kling O3 and Kling V3](https://www.klingai.com) (Kuaishou), [Grok Imagine and Grok Imagine 1.5](https://x.ai/grok) (xAI), [Veo 3.1 Lite / Standard / Fast](https://deepmind.google/technologies/veo) (Google), [Sora 2 / Sora 2 Pro](https://openai.com/sora) (OpenAI), and [HappyHorse 1.0](https://fal.ai/happyhorse-1.0) (Alibaba), [MiniMax H3](https://www.minimax.io) (Hailuo 3.0), [Gemini Omni Flash](https://deepmind.google/technologies/gemini/) (Google), [FLUX 3](https://bfl.ai) (Black Forest Labs), and [Wan 3.0](https://wan.video) (Alibaba). See [model capabilities](/docs/api-pixverse-v2/model-capabilities) for per-model constraints and mode compatibility. * PixVerse [Motion Control](/docs/api-pixverse-v2/post-pixverse-videos-motion-control) — drive a character image with motion extracted from a reference video. See the [blog example](/blog/260513). * PixVerse [images](/docs/api-pixverse-v2/post-pixverse-images-create) supports 14 models: [Qwen Image](https://github.com/QwenLM/Qwen2.5-VL), [Nano Banana 2](https://deepmind.google/technologies/gemini/flash/) (Gemini 3.1 Flash), [Nano Banana 2 Lite](https://deepmind.google/technologies/gemini/flash/) (Gemini 3.1 Flash-Lite), [Nano Banana Pro](https://deepmind.google/technologies/gemini/) (Gemini 3.0), [Nano Banana](https://deepmind.google/technologies/gemini/flash/) (Gemini 2.5 Flash), [Seedream 5.0 Pro](https://seed.bytedance.com/en/seedream), [Seedream 5.0 Lite](https://seed.bytedance.com/en/seedream), [Seedream 4.5](https://seed.bytedance.com/en/seedream), [Seedream 4.0](https://seed.bytedance.com/en/seedream), [Kling O3](https://www.klingai.com), [Kling 3.0](https://www.klingai.com), [GPT Image 2.0](https://openai.com/), and [GPT Image 2.5 Flare and Sunburst](https://openai.com/). Pro+ subscription plans include unlimited image generation in Relax Mode for select models with generation times ~3s to ~60s based on the model. Relax Mode costs no credits but is throttled to a slow queue past a daily per-model volume threshold — see the cost calculator below. * PixVerse [music](/docs/api-pixverse-v2/post-pixverse-music-create) — generate songs and instrumentals from a text prompt with three models: [MiniMax](https://www.minimax.io) music-2.6 (default), [ElevenLabs](https://elevenlabs.io) music-v1, and [Google Lyria 3 Pro](https://deepmind.google/technologies/lyria), with optional custom lyrics or model-written lyrics. * PixVerse [text-to-speech](/docs/api-pixverse-v2/post-pixverse-speech-create) — turn text into speech with five models from [MiniMax](https://www.minimax.io) (speech-2.8-hd default, speech-2.8-turbo) and [ElevenLabs](https://elevenlabs.io) (eleven-multilingual-v2, eleven-v3 with inline audio tags, eleven-turbo-v2.5), 300+ voices, per-voice settings, and 40+ languages. Please see the tables below for cost comparison of the web subscription used by this API versus official API subscription.
💲 Cost calculator [Subscription plans](https://app.pixverse.ai/subscribe): #### Pricing | Plan | Monthly | Credits/mo | $/credit | |:-----|:-----:|:-----:|:-----:| | Pro | $30 | 6,000 | $0.00500 | | Premium | $60 | 15,000 | $0.00400 | | Ultra | $199 | 25,000 | $0.00796 | Billed yearly instead, for the same monthly credits: | Plan | Yearly | Per month | $/credit | |:-----|:-----:|:-----:|:-----:| | Pro | $288 | $24 | $0.00400 | | Premium | $576 | $48 | $0.00320 | | Ultra | $1,788 | $149 | $0.00596 | The calculator carries both billing periods. A fourth plan, Team Ultra, is priced identically to Ultra and shares its credits, discounts, and free-image list — it only adds 12 concurrent generations instead of 8 and shared workspace seats, so select Ultra for it. Basic (free) and Standard ($10/mo, 1,200 credits) sit below Pro and cannot reach any third-party model at all, which returns 412. #### Video perks | Plan | Native off-peak | Preview mode | |:-----|:-----|:-----| | Pro | 30% off | 20% off | | Premium | 50% off | 20% off | | Ultra | free | 20% off | Off-peak and preview mode apply **only to native PixVerse** (`v5`, `v5.5`, `v5.6`, `v5-fast`, `v6`, `pixverse-c1`). Native PixVerse peak pricing is the same credits on every plan. #### Third-party model discounts There is no single third-party rate. PixVerse discounts third-party models one model at a time, and a model-specific promotion replaces the plan-wide Ultra discount rather than stacking with it. | Model | Pro / Premium | Ultra | |:-----|:-----:|:-----:| | `seedance-2.5` **at 1080p** | 30% off | 44% off | | `seedance-2.5` at 480p / 720p | — | 20% off | | `minimax-h3`, `flux-3.0`, `wan-3.0` | — | 20% off | | `seedance-2.0`, `seedance-2.0-fast`, `seedance-2.0-mini`, `kling-o3`, `kling-v3`, `grok-imagine`, `grok-imagine-1.5`, `veo-3.1-lite`, `veo-3.1-standard`, `veo-3.1-fast`, `sora-2`, `sora-2-pro`, `happyhorse-1.0`, `gemini-omni-flash` | — | 40% off | `seedance-2.5` is the one model whose discount depends on the resolution you pick. The 30% / 44% promotion applies **only** when `quality` is `1080p` — at 480p or 720p, Pro and Premium pay full rate and Ultra falls back to its standard 20%. PixVerse dates this promotion to **September 17, 2026**. The `minimax-h3` promotion that ran until **September 4, 2026** has now ended, so it pays full rate on Pro and Premium and Ultra's standard 20%. `flux-3.0` and `wan-3.0` launched without a promotion and sit on the same terms. The `seedance-2.5` promotion is the reason Pro and Premium can beat Ultra on that model once Ultra's higher $/credit is applied. These are promotional and PixVerse changes them without notice — the Seedance 2.0 family and `minimax-h3` both lost theirs during the same fortnight — so treat the calculator as current-as-of-sync rather than contractual. #### Cost per second, in dollars Discounts are quoted as percentages off a credit rate, which makes plans hard to compare. This is the same thing in money — the per-second cost of one generation after that plan's discount, at the plan's monthly $/credit. **Multiply by your duration.** | Model | Quality | Credits/sec | Pro | Premium | Ultra | |:-----|:-----:|:-----:|:-----:|:-----:|:-----:| | `seedance-2.5` | 480p | 35 | $0.175 | $0.140 | $0.223 | | `seedance-2.5` | 720p | 75 | $0.375 | $0.300 | $0.478 | | `seedance-2.5` | 1080p | 170 | $0.595 | $0.476 | $0.758 | | `seedance-2.0` | 480p | 20 | $0.100 | $0.080 | $0.096 | | `seedance-2.0` | 720p | 45 | $0.225 | $0.180 | $0.215 | | `seedance-2.0` | 1080p | 90 | $0.450 | $0.360 | $0.430 | | `seedance-2.0` | 2160p | 200 | $1.000 | $0.800 | $0.955 | | `seedance-2.0-fast` | 480p | 15 | $0.075 | $0.060 | $0.072 | | `seedance-2.0-fast` | 720p | 30 | $0.150 | $0.120 | $0.143 | | `seedance-2.0-mini` | 480p | 8 | $0.040 | $0.032 | $0.038 | | `seedance-2.0-mini` | 720p | 18 | $0.090 | $0.072 | $0.086 | | `minimax-h3` | 768p | 30 | $0.150 | $0.120 | $0.191 | | `minimax-h3` | 1440p *(2K)* | 45 | $0.225 | $0.180 | $0.287 | | `wan-3.0` | 480p | 15 | $0.075 | $0.060 | $0.096 | | `wan-3.0` | 720p | 30 | $0.150 | $0.120 | $0.191 | | `wan-3.0` | 1080p | 60 | $0.300 | $0.240 | $0.382 | | `flux-3.0` | 720p | 55 | $0.275 | $0.220 | $0.350 | | `flux-3.0` | 1080p | 93.5 | $0.468 | $0.374 | $0.595 | | `kling-v3` | 720p *(Std)* | 20 | $0.100 | $0.080 | $0.096 | | `kling-v3` | 1080p *(Pro)* | 25 | $0.125 | $0.100 | $0.119 | | `kling-v3` | 2160p *(4K)* | 120 | $0.600 | $0.480 | $0.573 | | `kling-o3` | 720p *(Std)* | 25 | $0.125 | $0.100 | $0.119 | | `kling-o3` | 1080p *(Pro)* | 35 | $0.175 | $0.140 | $0.167 | | `kling-o3` | 2160p *(4K)* | 120 | $0.600 | $0.480 | $0.573 | | `grok-imagine` | 480p | 10 | $0.050 | $0.040 | $0.048 | | `grok-imagine` | 720p | 15 | $0.075 | $0.060 | $0.072 | | `grok-imagine-1.5` | 480p | 20 | $0.100 | $0.080 | $0.096 | | `grok-imagine-1.5` | 720p | 40 | $0.200 | $0.160 | $0.191 | | `gemini-omni-flash` | 720p | 40 | $0.200 | $0.160 | $0.191 | | `veo-3.1-lite` | 720p | 15 | $0.075 | $0.060 | $0.072 | | `veo-3.1-lite` | 1080p | 30 | $0.150 | $0.120 | $0.143 | | `veo-3.1-fast` | 720p | 60 | $0.300 | $0.240 | $0.287 | | `veo-3.1-fast` | 1080p | 60 | $0.300 | $0.240 | $0.287 | | `veo-3.1-fast` | 2160p | 180 | $0.900 | $0.720 | $0.860 | | `veo-3.1-standard` | 720p | 160 | $0.800 | $0.640 | $0.764 | | `veo-3.1-standard` | 1080p | 160 | $0.800 | $0.640 | $0.764 | | `veo-3.1-standard` | 2160p | 480 | $2.400 | $1.920 | $2.292 | | `sora-2` | 720p | 20 | $0.100 | $0.080 | $0.096 | | `sora-2-pro` | 720p | 60 | $0.300 | $0.240 | $0.287 | | `sora-2-pro` | 1080p | 99 | $0.495 | $0.396 | $0.473 | | `happyhorse-1.0` | 720p | 30 | $0.150 | $0.120 | $0.143 | | `happyhorse-1.0` | 1080p | 60 | $0.300 | $0.240 | $0.287 | **Premium is the cheapest plan for third-party video on every row above.** It carries the same model discounts as Pro at a lower $/credit — $0.00400 against $0.00500 — so it wins on all 42 combinations. Ultra's deeper discounts do beat Pro on 32 of them, but never beat Premium, because its $/credit is 59% higher. Pro beats Ultra on the remaining ten — the three `seedance-2.5` rows, the three `wan-3.0` rows, and both rows each for `minimax-h3` and `flux-3.0`. For all but `seedance-2.5` that is simply because no Pro-side discount exists for Ultra's deeper cut to overcome. `seedance-2.5` is the interesting one: Ultra's 44% really is the deeper cut, and Pro still wins on price because $0.00500 × 0.7 beats $0.00796 × 0.56. Pick Ultra for the free native off-peak generation, the fourteen free image models and 8 concurrent generations, not for third-party video pricing. Notes on the figures above: - **Credits/sec** is the list rate before any plan discount. The dollar columns already have the discount applied. - Rates are **monthly** billing. Yearly billing is 20–25% cheaper per credit, so scale accordingly — Pro $0.00400, Premium $0.00320, Ultra $0.00596. - `kling-o3` and `kling-v3` add **40%** when `audio` is enabled, at 720p and 1080p only. The 4K tier carries no audio surcharge. - `veo-3.1-standard` and `veo-3.1-fast` generate audio on every call and cannot disable it, so their surcharge is already included above. - `veo-3.1-lite`, `veo-3.1-standard` and `veo-3.1-fast` accept `duration` of 4, 6 or 8 only, and at 1080p only 8. - `minimax-h3` fusion adds **10 credits per reference image above 5** — a 5-second 1440p fusion is 225 credits with up to 5 images and 265 with 9. It is the only video model with an image-count term. - `flux-3.0` and `wan-3.0` both expose an `audio` toggle, and neither charges for it — their rates carry no audio term, unlike `kling-o3` / `kling-v3`. - `wan-3.0` bills one flat rate per quality in every mode. Fusion costs the same per second as text-to-video, with no reference-count or reference-duration term, which is what makes it much cheaper than Seedance fusion. - A generation is rounded up to a whole credit once, at the end. Very short clips can therefore cost a fraction of a credit more than the per-second figure implies. **Seedance fusion with a reference video is priced differently.** Attaching one or more reference videos to [create-fusion](/docs/api-pixverse-v2/post-pixverse-videos-create-fusion) switches the rate to a lower per-second figure, but bills you for the output duration **plus** the total reference duration. For `seedance-2.5` that is 21 credits/sec at 480p, 45 at 720p and 102 at 1080p, versus 35, 75 and 170 without. A reference video therefore only saves credits while it runs shorter than about two-thirds of your output — on Pro a 4-second 480p clip costs 140 credits alone, and 273 with 9 seconds of reference video attached. The calculator above has a field for this. #### Free images (Relax Mode) | Plan | Free image models | |:-----|:-----| | Pro | `qwen-image`, `nano-banana-2-lite` | | Premium | `qwen-image`, `nano-banana`, `nano-banana-2`, `nano-banana-2-lite`, `seedream-4.0` | | Ultra | `qwen-image`, `nano-banana`, `nano-banana-2`, `nano-banana-2-lite`, `nano-banana-pro`, `seedream-4.0`, `seedream-4.5`, `seedream-5.0-lite`, `seedream-5.0-pro`, `kling-3.0`, `kling-o3`, `gpt-image-2.0`, `gpt-image-2.5-flare`, `gpt-image-2.5-sunburst` (all 14) | Relax Mode is unmetered, not unthrottled. These models cost zero credits on the listed plans and nothing rejects a request for being too frequent, but PixVerse applies a daily volume threshold. Past it the account is moved to a slow queue rather than refused — generations still succeed and still cost nothing, they just take far longer to come back. It is visible in the response, where `queue_data.slow_queue` turns `true`, `queue_data.reason` reads `daily_limit_exceeded`, and `queue_count` gives the number of tasks ahead. The threshold applies **per model**, not per account. An account throttled on one model keeps generating at full speed on every other one, and the busiest accounts clear 500–700 images a day across models combined. We have seen it engage on `nano-banana-2`, `nano-banana-pro` and `gpt-image-2.0`, most often on `nano-banana-2`. The point at which it engages is not fixed and varies between accounts, but as a rough guide expect a few hundred images per model per day — around 300 for `nano-banana-pro` and around 500 for `gpt-image-2.0`. We have not seen it on the remaining models, which does not mean they are unlimited, only that nobody has pushed them hard enough for it to show. The allowance resets at approximately 00:00 UTC, so a throttled account is clear again at the start of the next UTC day. PixVerse moves these thresholds without notice, so treat them as rough capacity guidance rather than a guarantee. Sustained volume needs more than one account, because each account carries its own allowance and [POST /videos/create](/docs/api-pixverse-v2/post-pixverse-videos-create-v4) and [POST /images/create](/docs/api-pixverse-v2/post-pixverse-images-create) spread work across every account you have configured. Adding accounts alone is not a guarantee though — we have seen a multi-account pool throttled on the same model at the same time, because every account was working through the same daily allowance on the same model. Once a pool is in that state more accounts only buy one more allowance each, and none of them are fast. Falling back to another model is usually the better move, because the allowances are independent per model. An account wedged on `nano-banana-2` still generates on `nano-banana-pro`, `seedream-4.5` or `gpt-image-2.0` at full speed. Decide in advance which models are acceptable for your use case, watch for `queue_data.slow_queue` turning `true` on the [image](/docs/api-pixverse-v2/get-pixverse-images-image_id) or [video](/docs/api-pixverse-v2/get-pixverse-videos-video_id) response, and move down that list rather than waiting out the queue. Ultra's higher $/credit rate means individual native-PixVerse generations cost more on Ultra than on Premium unless you're saturating Premium's monthly allowance. The calculator above factors all plan rules automatically. The official [API subscription](https://platform.pixverse.ai/billing) doesn't support Off-Peak and is limited to 1/3/5 effect options. The [web subscription](https://app.pixverse.ai/subscribe) used by this API exposes the full 900+ effect catalog. ### Interactive calculator
### Other | Feature | Web | Official API | |:--------|:----|:----| | Upscale ([POST videos/upscale](/docs/api-pixverse-v2/post-pixverse-videos-upscale)) | 6 cr / s ($0.024/s at Premium) | n/a | | Concurrent generations | 5 Pro, 8 Premium / Ultra, 12 Team Ultra | 5 | | Effects available | full 900+ catalog | 3 | Pro+ [subscription plans](https://app.pixverse.ai/subscribe) include unlimited image generation in Relax Mode for select models, subject to the Relax Mode throttle noted above. Ultra ($199/m) covers all 14 image models.
[Setup PixVerse](/docs/start-here/setup-pixverse) [Postman collection](https://www.postman.com/useapinet/useapi-net/collection) (August 20, 2026) [LLM-friendly API spec](https://useapi.net/assets/aibot/api-pixverse-v2.txt) Feed this to your LLM to build integrations Check out generated videos on YouTube. Articles: * [How to Generate AI Videos with the PixVerse API](/docs/articles/pixverse-demo) * [Seedance 2.0 API Pricing: The Cheapest Ways to Run It, Compared](/docs/articles/seedance-2-api-pricing) * [AI Music APIs Compared: Mureka vs MiniMax vs ElevenLabs vs Lyria 3 Pro](/docs/articles/ai-music-api-comparison) Blogs: * [Seedance 2.0 omni — Mini vs Fast vs Standard, real faces with video + audio refs](/blog/260626a) * [Text-to-Speech — MiniMax and ElevenLabs](/blog/260625) * [Music Generation — MiniMax, ElevenLabs, Lyria 3 Pro](/blog/260624) * [Grok Imagine 1.5 + Seedance 2.0 4K](/blog/260623) * [Motion Control](/blog/260513) * [HappyHorse 1.0](/blog/260504) * [PixVerse V6 — Multi-Shot, 15s 1080p, Audio](/blog/260405) * [17 AI Image Models: The Showdown](/blog/260309i) * [PixVerse Images — Qwen Image, Nano Banana / 2 / Pro, Seedream 4.0 / 4.5 / 5.0 Lite](/blog/260309) * [PixVerse v5.6](/blog/260127) * [PixVerse Modify](/blog/260126) * [PixVerse v5.5](/blog/251205) * [PixVerse v5](/blog/250829) Developer Community: * Discord Server * Telegram Channel === URL: https://useapi.net/docs/api-pixverse-v2/del-pixverse-accounts-email === Document URL: https://useapi.net/docs/api-pixverse-v2/del-pixverse-accounts-email --- layout: default title: DEL accounts/`email` description: "Delete a previously configured PixVerse account by email address via DEL accounts/email in the useapi.net PixVerse API v2." parent: PixVerse API v2 nav_order: 400 --- ## Delete PixVerse API account December 6, 2024 --- > **https://api.useapi.net/v2/accounts/`email`** The `email` value should correspond to an account configured previously via a [POST /accounts/`email`](/docs/api-pixverse-v2/post-pixverse-accounts-email) request. ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Responses **204** **204 No Content** **401** **401 Unauthorized** ```json { "error": "Unauthorized", "code": 401 } ``` **404** **404 Not Found** ##### Model ```typescript { // TypeScript, all fields are optional error: string, errorDetails: string, code: number } ``` ##### Examples **Curl** ``` bash curl -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer …" \ -X DELETE https://api.useapi.net/v2/pixverse/accounts/ ``` **JavaScript** ``` javascript const email = "Previously configured account email"; const apiUrl = `https://api.useapi.net/v2/pixverse/accounts/${email}`; const token = "API token"; const data = { method: 'DELETE', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' } }; const response = await fetch(apiUrl, data); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests email = "Previously configured account email" apiUrl = f"https://api.useapi.net/v2/pixverse/accounts/{email}" token = "API token" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } response = requests.delete(apiUrl, headers=headers) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/del-pixverse-images-image_id === Document URL: https://useapi.net/docs/api-pixverse-v2/del-pixverse-images-image_id --- layout: default title: DEL images/`image_id` description: "Delete a generated PixVerse image by image_id via DEL images/image_id in the useapi.net PixVerse API v2 — removes it from your account." parent: PixVerse API v2 nav_order: 530 --- ## Delete an image March 9, 2026 --- > **https://api.useapi.net/v2/pixverse/images/`image_id`** ##### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Path parameter - `image_id` is **required**. Specify the image_id you want to delete. ##### Responses **200** **200 OK** Image was successfully deleted. **400** **400 Bad Request** ```json { "error": "", "code": 400 } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized", "code": 401 } ``` ##### Examples **Curl** ``` bash curl -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer …" \ -X DELETE "https://api.useapi.net/v2/pixverse/images/image_id" ``` **JavaScript** ``` javascript const token = "API token"; const image_id = "image_id to delete"; const apiUrl = `https://api.useapi.net/v2/pixverse/images/${image_id}`; const response = await fetch(apiUrl, { method: 'DELETE', headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests token = "API token" image_id = "image_id to delete" apiUrl = f"https://api.useapi.net/v2/pixverse/images/{image_id}" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } response = requests.delete(apiUrl, headers=headers) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/del-pixverse-scheduler-video_id === Document URL: https://useapi.net/docs/api-pixverse-v2/del-pixverse-scheduler-video_id --- layout: default title: DEL scheduler/`id` description: "Cancel a video, image, or music generation and remove its API tracking via DEL scheduler/id in the useapi.net PixVerse API v2." parent: PixVerse API v2 nav_order: 1800 --- ## Cancel video, image, or music currently being executed by the API December 6, 2024 (June 24, 2026) --- Remove `video_id`, `image_id`, or `audio_id` generation tracking by the API. > **https://api.useapi.net/v2/pixverse/scheduler/`id`** ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Path parameter - `id` is **required**. Specify the `video_id`, `image_id`, or `audio_id` you want to cancel. ##### Responses **204** **204 No Content** **400** **400 Bad Request** ```json { "error": "", "code": 400 } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized", "code": 401 } ``` **404** **404 Not Found** ```json { "error": "Unable to locate running video_id " } ``` ##### Model ```typescript { // TypeScript, all fields are optional error: string code: number } ``` ##### Examples **Curl** ``` bash curl -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer …" \ -X DELETE "https://api.useapi.net/v2/pixverse/scheduler/video_id" ``` **JavaScript** ``` javascript const video_id = "video_id to cancel"; const apiUrl = `https://api.useapi.net/v2/pixverse/scheduler/${video_id}`; const token = "API token"; const data = { method: 'DELETE', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' } }; const response = await fetch(apiUrl, data); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests video_id = "video_id to cancel" apiUrl = f"https://api.useapi.net/v2/pixverse/scheduler/{video_id}" token = "API token" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } response = requests.delete(apiUrl, headers=headers) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/del-pixverse-videos-video_id === Document URL: https://useapi.net/docs/api-pixverse-v2/del-pixverse-videos-video_id --- layout: default title: DEL videos/`video_id` description: "Delete a generated PixVerse video by video_id via DEL videos/video_id in the useapi.net PixVerse API v2 — removes it from your account." parent: PixVerse API v2 nav_order: 800 --- ## Delete a video December 6, 2024 --- > **https://api.useapi.net/v2/pixverse/videos/`video_id`** ##### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Path parameter - `video_id` is **required**. Specify the video_id you want to delete. ##### Responses **200** **200 OK** Video was successfully deleted. **400** **400 Bad Request** ```json { "error": "", "code": 400 } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized", "code": 401 } ``` ##### Examples **Curl** ``` bash curl -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer …" \ -X DELETE "https://api.useapi.net/v2/pixverse/videos/video_id" ``` **JavaScript** ``` javascript const token = "API token"; const video_id = "video_id to delete"; const apiUrl = `https://api.useapi.net/v2/pixverse/videos/${video_id}`; const response = await fetch(apiUrl, { method: 'DELETE', headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests token = "API token" video_id = "video_id to delete" apiUrl = f"https://api.useapi.net/v2/pixverse/videos/{video_id}" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } response = requests.delete(apiUrl, headers=headers) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-accounts-email === Document URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-accounts-email --- layout: default title: GET accounts/`email` description: "Retrieve the stored PixVerse account configuration for a specific email via GET accounts/email in the useapi.net PixVerse API v2." parent: PixVerse API v2 nav_order: 200 --- ## Retrieve PixVerse API account configuration for `email` December 6, 2024 --- > **https://api.useapi.net/v2/pixverse/accounts/`email`** The `email` value should correspond to an account configured previously via a [POST /accounts/`email`](/docs/api-pixverse-v2/post-pixverse-accounts-email) request. ##### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Responses **200** **200 OK** ```json { "email": "", "password": "…secured…", "maxJobs": 3, "jwt": { "AccountId": 66778899, "ExpireTime": 123456789, "ExpireTimeUTC": "2025-01-01T12:13:14.000Z", "Username": "", "token": "abc…secured…cde" } } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized", "code": 401 } ``` **404** **404 Not Found** Configuration not found. To create configuration use [POST /accounts/`email`](/docs/api-pixverse-v2/post-pixverse-accounts-email). ##### Model ```typescript { // TypeScript, all fields are optional email: string password: string maxJobs: number jwt: { AccountId: number ExpireTime: number ExpireTimeUTC: string Username: string token: string } } ``` ##### Examples **Curl** ``` bash curl https://api.useapi.net/v2/pixverse/accounts/ \ -H "Accept: application/json" \ -H "Authorization: Bearer …" ``` **JavaScript** ``` javascript const token = "API token"; const email = "Previously configured account email"; const apiUrl = `https://api.useapi.net/v2/pixverse/accounts/${email}`; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests token = "API token" email = "Previously configured account email" apiUrl = f"https://api.useapi.net/v2/pixverse/accounts/{email}" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } response = requests.get(apiUrl, headers=headers) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-accounts === Document URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-accounts --- layout: default title: GET accounts description: "List all configured PixVerse accounts and their load-balancing settings via GET accounts in the useapi.net PixVerse API v2." parent: PixVerse API v2 nav_order: 100 --- ## Retrieve PixVerse API accounts configuration December 6, 2024 --- For your convenience, you can specify your PixVerse configuration values under your PixVerse account. If you specify multiple PixVerse accounts, the API will automatically perform load balancing by randomly selecting an account with available capacity before making calls to PixVerse. This endpoint retrieves the complete list of configured API accounts for PixVerse. > **https://api.useapi.net/v2/pixverse/accounts** ##### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Responses **200** **200 OK** ```json { "": { "email": "", "jwt": { "AccountId": 1122334455, "ExpireTime": 123456789, "ExpireTimeUTC": "2025-01-01T12:13:14.000Z" "Username": "", "token": "abc…secured…cde", }, "maxJobs": 8, "password": "…secured…" }, "": { "email": "", "jwt": { "AccountId": 66778899, "ExpireTime": 123456789, "ExpireTime": 123456789, "ExpireTimeUTC": "2025-01-01T12:13:14.000Z" "Username": "", "token": "abc…secured…cde", }, "maxJobs": 3, "password": "…secured…" } } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized", "code": 401 } ``` **404** **404 Not Found** Configuration not found. To create configuration use [POST /accounts/`email`](/docs/api-pixverse-v2/post-pixverse-accounts-email). ##### Model ```typescript { // TypeScript, all fields are optional [email: string]: { email: string jwt: { AccountId: number ExpireTime: number ExpireTimeUTC: string Username: string token: string } maxJobs: number password: string } } ``` ##### Examples **Curl** ``` bash curl https://api.useapi.net/v2/pixverse/accounts \ -H "Accept: application/json" \ -H "Authorization: Bearer …" ``` **JavaScript** ``` javascript const token = "API token"; const apiUrl = "https://api.useapi.net/v2/pixverse/accounts"; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests token = "API token" apiUrl = "https://api.useapi.net/v2/pixverse/accounts" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } response = requests.get(apiUrl, headers=headers) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-features === Document URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-features --- layout: default title: GET features description: "Retrieve your PixVerse.ai account information — subscription plan, credit quotas, feature flags, billing dates, available qualities, and accessible image models — via GET features in the useapi.net PixVerse API v2." parent: PixVerse API v2 nav_order: 450 --- ## Retrieve your PixVerse.ai account information (credits etc) December 6, 2024 (June 24, 2026) --- Retrieve your [PixVerse.ai](https://PixVerse.ai) account information, see [Setup PixVerse](/docs/start-here/setup-pixverse) for details. > **https://api.useapi.net/v2/pixverse/features/?…** ##### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Query Parameters - `email` is optional when only one [account](/docs/api-pixverse-v2/get-pixverse-accounts) configured. However, if you have multiple accounts configured, this parameter becomes **required**. ##### Responses **200** **200 OK** ```json { "user_id": 11223344, "member_id": 5566778899, "product_id": 9988776655, "plan_name": "Premium - Monthly", "next_plan_name": "Premium - Monthly", "next_plan_type": 2, "current_plan_type": 2, "type": 0, "credit_daily": 0, "credit_daily_gift": 60, "initial_credit_gift": 0, "credit_monthly": 12450, "credit_monthly_gift": 15000, "credit_package": 0, "expired_date": "2026-07-23T00:48:50Z", "price": "60", "billing_period": 1, "next_billing_period": 1, "billing_renewal_date": "2026-07-23T00:48:50Z", "payment": 1, "invoice_url": "https://stripe.pay.pixverse.ai/...", "stripe_bill_url": "https://stripe.pay.pixverse.ai/...", "gen_simultaneously": 5, "allow_fast_mode": 1, "allow_relaxed_mode": 1, "allow_use_new_feat": 1, "allow_private_generate": 1, "remove_watermark": 1, "allow_purchase_credit": 1, "sub_order_in_progress": 0, "allow_effect": 1, "last_plan_name": "", "last_plan_type": 0, "last_product_id": 0, "expired_member": 0, "credits_more": 30, "album_num": 1000, "batch_generation": 1, "off_peak": 1, "off_peak_discount": "0.7", "qualities": ["360p", "480p", "540p", "720p", "1080p", "2160p"], "cancel_updated_at": "0001-01-01T00:00:00Z", "renewal_retention": 0, "renewal_price": "60", "preview_mode": 1, "preview_mode_discount": "0.8", "remaining_days": 30, "credits_refresh_time": "2026-07-23T00:48:56Z", "daily_credits_refresh_time": "2026-06-25T00:00:00Z", "is_gift_card": false, "veo_sora_models": 1, "unlimited_image_models": ["qwen-image"], "accessible_image_models": ["qwen-image", "gemini-2.5-flash", "seedream-4.0", "seedream-4.5", "seedream-5.0-lite", "gemini-3.0", "gpt-image-1.5", "gpt-image-2.0", "gemini-3.1-flash", "kling-image-o3", "kling-image-v3"], "has_purchased_credits": true } ``` **400** **400 Bad Request** ```json { "error": "", "code": 400 } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized", "code": 401 } ``` ##### Model ```typescript { // TypeScript, all fields are optional // Identity user_id: number member_id: number product_id: number // Plan plan_name: string // e.g. 'Premium - Monthly' next_plan_name: string next_plan_type: number current_plan_type: number last_plan_name: string last_plan_type: number last_product_id: number type: number expired_member: number // 0 = active // Credits credit_daily: number // daily credits remaining credit_daily_gift: number // daily gift credits initial_credit_gift: number credit_monthly: number // monthly credits remaining credit_monthly_gift: number credit_package: number // purchased package credits credits_more: number has_purchased_credits: boolean is_gift_card: boolean credits_refresh_time: string // ISO - monthly credit refresh daily_credits_refresh_time: string // ISO - daily credit refresh // Billing / subscription price: string renewal_price: string billing_period: number next_billing_period: number billing_renewal_date: string // ISO expired_date: string // ISO - plan expiry remaining_days: number payment: number invoice_url: string stripe_bill_url: string renewal_retention: number cancel_updated_at: string // ISO - '0001-01-01T00:00:00Z' when not cancelled sub_order_in_progress: number // Limits / capability flags (0 | 1) gen_simultaneously: number // max concurrent generations allow_fast_mode: number allow_relaxed_mode: number allow_use_new_feat: number allow_private_generate: number remove_watermark: number allow_purchase_credit: number allow_effect: number batch_generation: number album_num: number veo_sora_models: number // 1 = Veo / Sora video models accessible preview_mode: number preview_mode_discount: string // e.g. '0.8' off_peak: number off_peak_discount: string // e.g. '0.7' // Capabilities qualities: string[] // available video qualities, e.g. ['360p','480p','540p','720p','1080p','2160p'] unlimited_image_models: string[] // image models with unlimited (Relax Mode) use accessible_image_models: string[] // all image models the plan may use } ``` ##### Examples **Curl** ``` bash curl "https://api.useapi.net/v2/pixverse/features/?email=email" \ -H "Accept: application/json" \ -H "Authorization: Bearer …" ``` **JavaScript** ``` javascript const token = "API token"; const email= "Previously configured account email"; const apiUrl = `https://api.useapi.net/v2/pixverse/features/?email=${email}`; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests token = "API token" email= "Previously configured account email" apiUrl = f"https://api.useapi.net/v2/pixverse/features/?email={email}" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } response = requests.get(apiUrl, headers=headers) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-images-image_id === Document URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-images-image_id --- layout: default title: GET images/`image_id` description: "Poll a PixVerse image by image_id via GET images/image_id in the useapi.net PixVerse API v2 — status values, image_status_final flag, and a live Try It console." parent: PixVerse API v2 nav_order: 520 --- ## Retrieve a generated image March 9, 2026 (August 9, 2026) --- Use this endpoint to retrieve a generated image. Attempting to retrieve an image that is still processing will return the current status. Poll until `image_status_final` is `true`. To create images, use [POST images/create](/docs/api-pixverse-v2/post-pixverse-images-create). > **https://api.useapi.net/v2/pixverse/images/`image_id`** ##### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Path parameter - `image_id` is **required**. Specify the image_id you want to retrieve (from `success_ids` array returned by [POST images/create](/docs/api-pixverse-v2/post-pixverse-images-create)). ##### Responses **200** **200 OK** ```json { "image_id": "user:-pixverse:-image:", "image_status": 1, "account_id": 12345678, "model": "seedream-4.0", "prompt": "", "quality": "1080p", "aspect_ratio": "auto", "seed": 12345, "image_url": "https://media.pixverse.ai/...webp", "output_width": 1920, "output_height": 1080, "customer_img_paths": [], "customer_img_urls": null, "queue_data": { "estimated_gen_time": 60, "processing_start_time": "2026-03-08T00:30:00Z", "queue_count": 0, "queue_time": 1 }, "created_at": "2026-03-08T00:30:00Z", "updated_at": "2026-03-08T00:31:00Z", "image_status_name": "COMPLETED", "image_status_final": true } ``` **400** **400 Bad Request** ```json { "error": "", "code": 400 } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized", "code": 401 } ``` **404** **404 Not Found** The image was deleted or not found. ```json { "error": "The original image has been deleted" } ``` ##### Image Status Values | image_status | image_status_name | image_status_final | Description | |:------------|:------------------|:-------------------|:------------| | 1 | COMPLETED | true | Image ready, check `image_url` | | 5 | QUEUED | false | Waiting in queue | | 7 | MODERATED | true | Content moderation triggered | | 9 | GENERATING | false | Image is being generated | | 10 | PROCESSING | false | Post-processing | ##### Model ```typescript { // TypeScript, all fields are optional image_id: string image_status: number account_id: number asset_id: number asset_source: number asset_type: number create_mode: string creation_type: number model: string prompt: string quality: string aspect_ratio: string seed: number image_path: string image_url: string output_width: number output_height: number customer_img_paths: string[] customer_img_urls: string[] | null platform: string queue_data?: { estimated_gen_time: number processing_start_time: string queue_count: number queue_time: number reason?: string slow_queue?: boolean platform?: string task_id?: number } created_at: string updated_at: string is_collected: boolean water_mark: boolean media_locked: number // added image_status_name: string image_status_final: boolean error: string } ``` `queue_data` is present while a generation is waiting and reports its position — `queue_count` is the number of tasks ahead, `queue_time` the wait so far, and `estimated_gen_time` the projected generation time in seconds. It comes straight from PixVerse and is passed through unchanged. When `slow_queue` is `true` the account has been moved to a reduced-priority queue and `reason` says why. The value `daily_limit_exceeded` means the account has passed its daily allowance for that particular [unlimited Relax Mode model](/docs/api-pixverse-v2/post-pixverse-images-create) — the request is **not** rejected and still costs no credits, it just takes considerably longer. The allowance is per model, so the same account keeps running at full speed on every other model. Switch model, or spread the load across more accounts, if you see this persistently. ##### Examples **Curl** ``` bash curl "https://api.useapi.net/v2/pixverse/images/image_id" \ -H "Accept: application/json" \ -H "Authorization: Bearer …" ``` **JavaScript** ``` javascript const token = "API token"; const image_id = "image_id to retrieve"; const apiUrl = `https://api.useapi.net/v2/pixverse/images/${image_id}`; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests token = "API token" image_id = "image_id to retrieve" apiUrl = f"https://api.useapi.net/v2/pixverse/images/{image_id}" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } response = requests.get(apiUrl, headers=headers) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-images === Document URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-images --- layout: default title: GET images description: "List all PixVerse images — queued, generating, and completed — via GET images in the useapi.net PixVerse API v2, with image_status_name and image_status_final." parent: PixVerse API v2 nav_order: 510 --- ## Retrieve the list of images December 6, 2024 (August 9, 2026) --- Retrieve the list of images, this will include those currently being generated or queued. Check the `image_status_name` field for the status and the field `image_status_final` to determine if the provided status is the final status. The API internally uses the field `image_status` to calculate values for `image_status_name` and `image_status_final`. See below for the known statuses map: | image_status | image_status_name | image_status_final | |--------|-------------------|--------------------| | 1 | COMPLETED | true | | 5 | QUEUED | false | | 7 | MODERATED | true | | 9 | GENERATING | false | | 10 | PROCESSING | false | > **https://api.useapi.net/v2/pixverse/images/?…** ##### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Query Parameters - `email` is optional when only one [account](/docs/api-pixverse-v2/get-pixverse-accounts) configured. However, if you have multiple accounts configured, this parameter becomes **required**. - `limit` is optional, specify the number of images to return. Default 50. Treat it as an upper bound rather than a guarantee — a response may contain fewer images than requested, and on very high-volume accounts we may reduce it. - **Page using the `next_offset` and `has_more` fields returned in the response — do not advance by your own `limit`.** A page can come back shorter than requested, so stepping by your own value will skip images. `total` always reports the true number of images available, whatever the page size. - `offset` is optional, specify the offset from where to start. ##### Responses **200** **200 OK** ```json { "data": [ { "image_id": "user:-pixverse:-image:11223344", "image_status": 1, "account_id": 33445566, "asset_id": 0, "asset_source": 1, "asset_type": 0, "create_mode": "t2i", "creation_type": 0, "model": "qwen-image", "prompt": "", "quality": "720p", "aspect_ratio": "1:1", "seed": 123456, "image_path": "image/...", "image_url": "https://media.pixverse.ai/image/...webp", "output_width": 720, "output_height": 720, "customer_img_paths": [], "customer_img_urls": null, "platform": "", "queue_data": null, "created_at": "2026-03-09T12:34:56Z", "updated_at": "2026-03-09T12:34:58Z", "is_collected": false, "water_mark": false, "media_locked": 0, "image_status_name": "COMPLETED", "image_status_final": true } ], "next_offset": 50, "total": 12 } ``` **400** **400 Bad Request** ```json { "error": "", "code": 400 } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized", "code": 401 } ``` ##### Model ```typescript { // TypeScript, all fields are optional data: { image_id: string image_status: number account_id: number asset_id: number asset_source: number asset_type: number create_mode: string creation_type: number model: string prompt: string quality: string aspect_ratio: string seed: number image_path: string image_url: string output_width: number output_height: number customer_img_paths: string[] customer_img_urls: string[] | null platform: string queue_data: { estimated_gen_time: number processing_start_time: string queue_count: number queue_time: number reason?: string slow_queue?: boolean platform?: string task_id?: number } | null created_at: string updated_at: string is_collected: boolean water_mark: boolean media_locked: number // added image_status_name: string image_status_final: boolean }[] next_offset: number total: number } ``` `queue_data` is present while a generation is waiting and reports its position — `queue_count` is the number of tasks ahead, `queue_time` the wait so far, and `estimated_gen_time` the projected generation time in seconds. It comes straight from PixVerse and is passed through unchanged. When `slow_queue` is `true` the account has been moved to a reduced-priority queue and `reason` says why. The value `daily_limit_exceeded` means the account has passed its daily allowance for that particular [unlimited Relax Mode model](/docs/api-pixverse-v2/post-pixverse-images-create) — the request is **not** rejected and still costs no credits, it just takes considerably longer. The allowance is per model, so the same account keeps running at full speed on every other model. Switch model, or spread the load across more accounts, if you see this persistently. ##### Examples **Curl** ``` bash curl "https://api.useapi.net/v2/pixverse/images/?email=email" \ -H "Accept: application/json" \ -H "Authorization: Bearer …" ``` **JavaScript** ``` javascript const token = "API token"; const email= "Previously configured account email"; const apiUrl = `https://api.useapi.net/v2/pixverse/images/?email=${email}`; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests token = "API token" email= "Previously configured account email" apiUrl = f"https://api.useapi.net/v2/pixverse/images/?email={email}" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } response = requests.get(apiUrl, headers=headers) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-music-music_id === Document URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-music-music_id --- layout: default title: GET music/`audio_id` description: "Poll a PixVerse music track by audio_id via GET music/audio_id in the useapi.net PixVerse API v2 — status values, audio_status_final flag, the mp3 url, and a live Try It console." parent: PixVerse API v2 nav_order: 1430 --- ## Retrieve a generated music track June 24, 2026 --- Use this endpoint to retrieve a generated music track. Attempting to retrieve a track that is still generating will return the current status. Poll until `audio_status_final` is `true`. To create music, use [POST music/create](/docs/api-pixverse-v2/post-pixverse-music-create). > **https://api.useapi.net/v2/pixverse/music/`audio_id`** ##### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Path parameter - `audio_id` is **required**. Specify the `audio_id` returned by [POST music/create](/docs/api-pixverse-v2/post-pixverse-music-create). ##### Responses **200** **200 OK** ```json { "audio_id": "user:-pixverse:-music:", "asset_id": 11223344, "audio_status": 1, "status": "finish", "create_mode": "music", "provider": "minimax", "model": "music-2.6", "prompt": "", "auto_lyrics": true, "url": "https://media.pixverse.ai/pixverse/audio/music/11223344.mp3", "name": "PixVerse_Music_11223344.mp3", "duration": 202, "credits": 40, "created_at": "2026-06-23T12:34:56Z", "updated_at": "2026-06-23T12:38:18Z", "audio_status_name": "COMPLETED", "audio_status_final": true } ``` **400** **400 Bad Request** ```json { "error": "", "code": 400 } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized", "code": 401 } ``` **404** **404 Not Found** The track was deleted or not found. ```json { "error": "Music user:-pixverse:-music: not found" } ``` ##### Audio Status Values | audio_status | audio_status_name | audio_status_final | Description | |:------------|:------------------|:-------------------|:------------| | 1 | COMPLETED | true | Track ready, check `url` | | 5 | QUEUED | false | Accepted, waiting to start | | 8 | FAILED | true | Generation failed, see `fail_reason` | | 10 | GENERATING | false | Track is being generated | When a track fails (`audio_status` 8) the response also carries `fail_code` (`music_generation_failed`) and a human-readable `fail_reason` describing the underlying error. These are usually transient backend errors, so re-submitting the same request often succeeds. ##### Model ```typescript { // TypeScript, all fields are optional audio_id: string asset_id: number audio_status: number status: string create_mode: string provider: string model: string prompt: string auto_lyrics: boolean path: string url: string name: string duration: number file_size: number format: string sample_rate: number bitrate: number channel: number credits: number created_at: string updated_at: string // present only when audio_status is 8 (FAILED) fail_code: string fail_reason: string // added audio_status_name: string audio_status_final: boolean error: string } ``` ##### Examples **Curl** ``` bash curl "https://api.useapi.net/v2/pixverse/music/audio_id" \ -H "Accept: application/json" \ -H "Authorization: Bearer …" ``` **JavaScript** ``` javascript const token = "API token"; const audio_id = "audio_id to retrieve"; const apiUrl = `https://api.useapi.net/v2/pixverse/music/${audio_id}`; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests token = "API token" audio_id = "audio_id to retrieve" apiUrl = f"https://api.useapi.net/v2/pixverse/music/{audio_id}" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } response = requests.get(apiUrl, headers=headers) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-music === Document URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-music --- layout: default title: GET music description: "List all PixVerse music tracks — queued, generating, and completed — via GET music in the useapi.net PixVerse API v2, with audio_status_name and audio_status_final." parent: PixVerse API v2 nav_order: 1420 --- ## Retrieve the list of music tracks June 25, 2026 --- Retrieve the list of music tracks, this will include those currently being generated or queued. Check the `audio_status_name` field for the status and the field `audio_status_final` to determine if the provided status is the final status. The API internally uses the field `audio_status` to calculate values for `audio_status_name` and `audio_status_final`. See below for the known statuses map: | audio_status | audio_status_name | audio_status_final | |--------|-------------------|--------------------| | 1 | COMPLETED | true | | 5 | QUEUED | false | | 8 | FAILED | true | | 10 | GENERATING | false | > **https://api.useapi.net/v2/pixverse/music/?…** ##### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Query Parameters - `email` is optional when only one [account](/docs/api-pixverse-v2/get-pixverse-accounts) configured. However, if you have multiple accounts configured, this parameter becomes **required**. - `limit` is optional, specify the number of tracks to return. Default 50. - `offset` is optional, specify the offset from where to start. ##### Responses **200** **200 OK** ```json { "data": [ { "audio_id": "user:-pixverse:-music:11223344", "asset_id": 11223344, "audio_status": 1, "status": "finish", "create_mode": "music", "provider": "minimax", "model": "music-2.6", "prompt": "", "auto_lyrics": true, "url": "https://media.pixverse.ai/pixverse/audio/music/11223344.mp3", "name": "PixVerse_Music_11223344.mp3", "duration": 202, "credits": 40, "created_at": "2026-06-23T12:34:56Z", "updated_at": "2026-06-23T12:38:18Z", "audio_status_name": "COMPLETED", "audio_status_final": true } ], "next_offset": 50, "has_more": false } ``` **400** **400 Bad Request** ```json { "error": "", "code": 400 } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized", "code": 401 } ``` This endpoint returns music tracks only (`create_mode: music`). Text-to-speech audio is listed separately by [GET speech](/docs/api-pixverse-v2/get-pixverse-speech). ##### Model ```typescript { // TypeScript, all fields are optional data: { audio_id: string asset_id: number audio_status: number status: string create_mode: string provider: string model: string prompt: string auto_lyrics: boolean url: string name: string duration: number credits: number created_at: string updated_at: string // added audio_status_name: string audio_status_final: boolean }[] next_offset: number has_more: boolean } ``` ##### Examples **Curl** ``` bash curl "https://api.useapi.net/v2/pixverse/music/?email=email" \ -H "Accept: application/json" \ -H "Authorization: Bearer …" ``` **JavaScript** ``` javascript const token = "API token"; const email= "Previously configured account email"; const apiUrl = `https://api.useapi.net/v2/pixverse/music/?email=${email}`; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests token = "API token" email= "Previously configured account email" apiUrl = f"https://api.useapi.net/v2/pixverse/music/?email={email}" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } response = requests.get(apiUrl, headers=headers) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-scheduler-available === Document URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-scheduler-available --- layout: default title: GET scheduler/available description: "Check active videos, images, and music in flight plus remaining account capacity via GET scheduler/available in the useapi.net PixVerse API v2." parent: PixVerse API v2 nav_order: 1600 --- ## Retrieve the list of videos, images, and music currently running via the API along with the available account capacity December 6, 2024 (June 24, 2026) --- This endpoint retrieves the list of videos, images, and music tracks currently running via the API along with the available account capacity. Each executing item includes `id` and `type` (`video`, `image`, or `music`). If you want to get all videos or images currently being executed including those manually initiated from PixVerse.ai website use [GET /videos](/docs/api-pixverse-v2/get-pixverse-videos) or [GET /images](/docs/api-pixverse-v2/get-pixverse-images). > **https://api.useapi.net/v2/pixverse/scheduler/available** ##### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Responses **200** **200 OK** ```json { "executing": [ { "id": "user:user_id-pixverse:email-video:id1", "type": "video", "started": "2024-09-25T01:55:16.128Z", "elapsed": "03:57", "replyUrl": "", "replyRef": "" }, { "id": "user:user_id-pixverse:email-image:id2", "type": "image", "started": "2024-09-25T01:58:18.555Z", "elapsed": "00:35", "replyUrl": "", "replyRef": "" } ], "available": [ { "email": "", "maxJobs": 5, "executing": 0, "available": 5 }, { "email": "", "maxJobs": 8, "executing": 3, "available": 2 }, { "email": "", "maxJobs": 3, "executing": 2, "available": 1 } ] } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized", "code": 401 } ``` ##### Model ```typescript { // TypeScript, all fields are optional executing: { id: string type: 'video' | 'image' started: string elapsed: string replyUrl: string replyRef: string }[] available: { email: string maxJobs: number executing: number available: number }[] error: string code: number } ``` ##### Examples **Curl** ``` bash curl "https://api.useapi.net/v2/pixverse/scheduler/available" \ -H "Accept: application/json" \ -H "Authorization: Bearer …" ``` **JavaScript** ``` javascript const token = "API token"; const apiUrl = `https://api.useapi.net/v2/pixverse/scheduler/available`; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests token = "API token" apiUrl = f"https://api.useapi.net/v2/pixverse/scheduler/available" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } response = requests.get(apiUrl, headers=headers) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-scheduler === Document URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-scheduler --- layout: default title: GET scheduler description: "List videos, images, and music tracks the API is currently executing via GET scheduler in the useapi.net PixVerse API v2 — each entry reports its id and type." parent: PixVerse API v2 nav_order: 1500 --- ## Retrieve the list of videos, images, and music currently being executed by the API December 6, 2024 (June 24, 2026) --- This endpoint retrieves the list of videos, images, and music tracks currently being executed by the API. Each item includes `id` and `type` (`video`, `image`, or `music`). If you want to get all videos, images, or music tracks currently being executed including those manually initiated from PixVerse.ai website use [GET /videos](/docs/api-pixverse-v2/get-pixverse-videos), [GET /images](/docs/api-pixverse-v2/get-pixverse-images), or [GET /music](/docs/api-pixverse-v2/get-pixverse-music). > **https://api.useapi.net/v2/pixverse/scheduler/** ##### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Responses **200** **200 OK** ```json [ { "id": "user:user_id-pixverse:email-video:id1", "type": "video", "started": "2024-09-25T01:55:16.128Z", "elapsed": "03:57", "replyUrl": "", "replyRef": "" }, { "id": "user:user_id-pixverse:email-image:id2", "type": "image", "started": "2024-09-25T01:58:18.555Z", "elapsed": "00:35", "replyUrl": "", "replyRef": "" } ] ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized", "code": 401 } ``` ##### Model ```typescript { // TypeScript, all fields are optional id: string type: 'video' | 'image' | 'music' started: string elapsed: string replyUrl: string replyRef: string }[] ``` ##### Examples **Curl** ``` bash curl "https://api.useapi.net/v2/pixverse/scheduler/" \ -H "Accept: application/json" \ -H "Authorization: Bearer …" ``` **JavaScript** ``` javascript const token = "API token"; const apiUrl = `https://api.useapi.net/v2/pixverse/scheduler/`; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests token = "API token" apiUrl = f"https://api.useapi.net/v2/pixverse/scheduler/" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } response = requests.get(apiUrl, headers=headers) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-speech-models === Document URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-speech-models --- layout: default title: GET speech/models description: "List the text-to-speech models via GET speech/models in the useapi.net PixVerse API v2 — per-model max characters, supported language codes, credit formula, and the MiniMax emotion enum." parent: PixVerse API v2 nav_order: 1490 --- ## List text-to-speech models June 25, 2026 --- List the speech models available for [POST speech/create](/docs/api-pixverse-v2/post-pixverse-speech-create), with each model's provider, character limit, credit formula, and the live list of `supported_language_codes`. This is the source of truth for which `language_code` values a model accepts — `text` length and `language_code` on a generation are validated against it. For MiniMax models the response also carries the `emotions` enum (the values accepted by the `emotion` voice setting). > **https://api.useapi.net/v2/pixverse/speech/models** ##### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Query Parameters - `email` is optional when only one [account](/docs/api-pixverse-v2/get-pixverse-accounts) configured. However, if you have multiple accounts configured, this parameter becomes **required**. ##### Responses **200** **200 OK** ```json { "default_model": "speech-2.8-hd", "provider_groups": [ { "provider": "minimax", "models": [ { "model": "speech-2.8-hd", "display_name": "Speech 2.8 HD", "provider": "minimax", "max_characters": 10000, "supported_language_codes": ["auto", "en", "es", "ja", "zh", "..."], "credit_formula": { "unit_characters": 50, "unit_credits": 1, "round_up": true }, "emotions": ["auto", "happy", "sad", "angry", "fearful", "disgusted", "surprised", "neutral", "calm"] } ] }, { "provider": "elevenlabs", "models": [ { "model": "eleven-v3", "display_name": "Eleven v3", "provider": "elevenlabs", "max_characters": 5000, "supported_language_codes": ["auto", "en", "es", "..."], "credit_formula": { "unit_characters": 50, "unit_credits": 1, "round_up": true } } ] } ] } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized", "code": 401 } ``` Only MiniMax (`speech-2.8-hd`, `speech-2.8-turbo`) models carry the `emotions` field — ElevenLabs models do not accept an `emotion` setting. `eleven-v3` auto-detects the language and rejects `language_code` on a generation. ##### Model ```typescript { // TypeScript, all fields are optional default_model: string provider_groups: { provider: string models: { model: string display_name: string provider: string max_characters: number supported_language_codes: string[] credit_formula: { unit_characters: number unit_credits: number round_up: boolean } // present on MiniMax models only emotions: string[] }[] }[] } ``` ##### Examples **Curl** ``` bash curl "https://api.useapi.net/v2/pixverse/speech/models" \ -H "Accept: application/json" \ -H "Authorization: Bearer …" ``` **JavaScript** ``` javascript const token = "API token"; const apiUrl = `https://api.useapi.net/v2/pixverse/speech/models`; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests token = "API token" apiUrl = f"https://api.useapi.net/v2/pixverse/speech/models" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } response = requests.get(apiUrl, headers=headers) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-speech-speech_id === Document URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-speech-speech_id --- layout: default title: GET speech/`audio_id` description: "Poll a PixVerse text-to-speech job by audio_id via GET speech/audio_id in the useapi.net PixVerse API v2 — status values, audio_status_final flag, the mp3 url, and a live Try It console with playback." parent: PixVerse API v2 nav_order: 1460 --- ## Retrieve generated speech June 25, 2026 --- Use this endpoint to retrieve a generated speech clip. Attempting to retrieve a job that is still generating will return the current status. Poll until `audio_status_final` is `true`. To generate speech, use [POST speech/create](/docs/api-pixverse-v2/post-pixverse-speech-create). > **https://api.useapi.net/v2/pixverse/speech/`audio_id`** ##### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Path parameter - `audio_id` is **required**. Specify the `audio_id` returned by [POST speech/create](/docs/api-pixverse-v2/post-pixverse-speech-create). The account email is encoded in the id, so no separate `email` is needed. ##### Responses **200** **200 OK** ```json { "audio_id": "user:-pixverse:-speech:", "asset_id": 11223344, "audio_status": 1, "status": "finish", "create_mode": "voice", "provider": "minimax", "model": "speech-2.8-hd", "voice_id": "minimax_english_radiant_girl", "voice_name": "Radiant Girl", "language_code": "en", "prompt": "May the Force be with you.", "url": "https://media.pixverse.ai/pixverse/audio/speech/11223344.mp3", "name": "PixVerse_Speech_11223344.mp3", "duration": 3, "credits": 1, "created_at": "2026-06-23T12:34:56Z", "updated_at": "2026-06-23T12:35:06Z", "audio_status_name": "COMPLETED", "audio_status_final": true } ``` **400** **400 Bad Request** ```json { "error": "", "code": 400 } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized", "code": 401 } ``` **404** **404 Not Found** The speech clip was deleted or not found. ```json { "error": "Speech user:-pixverse:-speech: not found" } ``` ##### Audio Status Values | audio_status | audio_status_name | audio_status_final | Description | |:------------|:------------------|:-------------------|:------------| | 1 | COMPLETED | true | Speech ready, check `url` | | 5 | QUEUED | false | Accepted, waiting to start | | 8 | FAILED | true | Generation failed, see `fail_reason` | | 10 | GENERATING | false | Speech is being generated | When a job fails (`audio_status` 8) the response also carries `fail_code` and a human-readable `fail_reason` describing the underlying error. These are usually transient backend errors, so re-submitting the same request often succeeds. ##### Model ```typescript { // TypeScript, all fields are optional audio_id: string asset_id: number audio_status: number status: string create_mode: string provider: string model: string voice_id: string voice_name: string language_code: string prompt: string path: string url: string name: string duration: number file_size: number format: string sample_rate: number bitrate: number channel: number credits: number created_at: string updated_at: string // present only when audio_status is 8 (FAILED) fail_code: string fail_reason: string // added audio_status_name: string audio_status_final: boolean error: string } ``` ##### Examples **Curl** ``` bash curl "https://api.useapi.net/v2/pixverse/speech/audio_id" \ -H "Accept: application/json" \ -H "Authorization: Bearer …" ``` **JavaScript** ``` javascript const token = "API token"; const audio_id = "audio_id to retrieve"; const apiUrl = `https://api.useapi.net/v2/pixverse/speech/${audio_id}`; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests token = "API token" audio_id = "audio_id to retrieve" apiUrl = f"https://api.useapi.net/v2/pixverse/speech/{audio_id}" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } response = requests.get(apiUrl, headers=headers) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-speech-voices === Document URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-speech-voices --- layout: default title: GET speech/voices description: "List the available text-to-speech voices via GET speech/voices in the useapi.net PixVerse API v2 — filter by model and language, with voice_id, provider_voice_id, gender, accent, and preview url." parent: PixVerse API v2 nav_order: 1480 --- ## List text-to-speech voices June 25, 2026 --- List the voices available for [POST speech/create](/docs/api-pixverse-v2/post-pixverse-speech-create), filtered by model and language. Each [POST speech/create](/docs/api-pixverse-v2/post-pixverse-speech-create) request needs a `voice_id` from here — the paired `provider_voice_id` is derived from it automatically. The MiniMax catalog carries 300+ voices, ElevenLabs ~20. The provider is derived from the model, so you only pass `model` (and optionally `language`). > **https://api.useapi.net/v2/pixverse/speech/voices?…** ##### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Query Parameters - `email` is optional when only one [account](/docs/api-pixverse-v2/get-pixverse-accounts) configured. However, if you have multiple accounts configured, this parameter becomes **required**. - `model` is optional, default `speech-2.8-hd`. One of the [models](/docs/api-pixverse-v2/get-pixverse-speech-models) — the provider is derived from it. An unknown model is rejected with **400**. - `language` is optional, default `auto`. An ISO language code (`en`, `es`, `ja`, …) to filter the catalog to voices recommended for that language. ##### Responses **200** **200 OK** ```json { "voices": [ { "voice_id": "minimax_english_radiant_girl", "provider_voice_id": "English_radiant_girl", "display_name": "Radiant Girl", "provider": "minimax", "gender": "female", "age": "young", "accent": "", "style_tags": ["bright", "warm"], "recommended_languages": ["en"], "preview_url": "https://media.pixverse.ai/pixverse/audio/voice/preview/English_radiant_girl.mp3", "compatible_models": ["speech-2.8-hd", "speech-2.8-turbo"] } ], "pagination": { "total": 332, "has_more": false } } ``` **400** **400 Bad Request** Returned for an unknown `model`. ```json { "error": "Invalid model ''. Valid values: speech-2.8-hd,speech-2.8-turbo,eleven-multilingual-v2,eleven-v3,eleven-turbo-v2.5", "code": 400 } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized", "code": 401 } ``` ##### Model ```typescript { // TypeScript, all fields are optional voices: { voice_id: string provider_voice_id: string display_name: string provider: string gender: string age: string accent: string style_tags: string[] recommended_languages: string[] preview_url: string compatible_models: string[] }[] pagination: { total: number has_more: boolean } } ``` ##### Examples **Curl** ``` bash curl "https://api.useapi.net/v2/pixverse/speech/voices?model=speech-2.8-hd&language=en" \ -H "Accept: application/json" \ -H "Authorization: Bearer …" ``` **JavaScript** ``` javascript const token = "API token"; const apiUrl = `https://api.useapi.net/v2/pixverse/speech/voices?model=speech-2.8-hd&language=en`; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests token = "API token" apiUrl = f"https://api.useapi.net/v2/pixverse/speech/voices?model=speech-2.8-hd&language=en" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } response = requests.get(apiUrl, headers=headers) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-speech === Document URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-speech --- layout: default title: GET speech description: "List all PixVerse text-to-speech jobs — queued, generating, and completed — via GET speech in the useapi.net PixVerse API v2, with audio_status_name and audio_status_final." parent: PixVerse API v2 nav_order: 1450 --- ## Retrieve the list of speech June 25, 2026 --- Retrieve the list of text-to-speech jobs, this will include those currently being generated or queued. Check the `audio_status_name` field for the status and the field `audio_status_final` to determine if the provided status is the final status. The API internally uses the field `audio_status` to calculate values for `audio_status_name` and `audio_status_final`. See below for the known statuses map: | audio_status | audio_status_name | audio_status_final | |--------|-------------------|--------------------| | 1 | COMPLETED | true | | 5 | QUEUED | false | | 8 | FAILED | true | | 10 | GENERATING | false | > **https://api.useapi.net/v2/pixverse/speech/?…** ##### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Query Parameters - `email` is optional when only one [account](/docs/api-pixverse-v2/get-pixverse-accounts) configured. However, if you have multiple accounts configured, this parameter becomes **required**. - `limit` is optional, specify the number of clips to return. Default 50. - `offset` is optional, specify the offset from where to start. ##### Responses **200** **200 OK** This endpoint returns speech only (`create_mode: voice`). Music tracks are listed separately by [GET music](/docs/api-pixverse-v2/get-pixverse-music). ```json { "data": [ { "audio_id": "user:-pixverse:-speech:11223344", "asset_id": 11223344, "audio_status": 1, "status": "finish", "create_mode": "voice", "provider": "minimax", "model": "speech-2.8-hd", "voice_id": "minimax_english_radiant_girl", "voice_name": "Radiant Girl", "language_code": "en", "prompt": "Use API dot net.", "url": "https://media.pixverse.ai/pixverse/audio/speech/11223344.mp3", "name": "PixVerse_Speech_11223344.mp3", "duration": 2, "credits": 1, "created_at": "2026-06-23T12:34:56Z", "updated_at": "2026-06-23T12:35:06Z", "audio_status_name": "COMPLETED", "audio_status_final": true } ], "next_offset": 50, "has_more": false } ``` **400** **400 Bad Request** ```json { "error": "", "code": 400 } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized", "code": 401 } ``` ##### Model ```typescript { // TypeScript, all fields are optional data: { audio_id: string asset_id: number audio_status: number status: string create_mode: string provider: string model: string voice_id: string voice_name: string language_code: string prompt: string url: string name: string duration: number credits: number created_at: string updated_at: string // added audio_status_name: string audio_status_final: boolean }[] next_offset: number has_more: boolean } ``` ##### Examples **Curl** ``` bash curl "https://api.useapi.net/v2/pixverse/speech/?email=email" \ -H "Accept: application/json" \ -H "Authorization: Bearer …" ``` **JavaScript** ``` javascript const token = "API token"; const email= "Previously configured account email"; const apiUrl = `https://api.useapi.net/v2/pixverse/speech/?email=${email}`; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests token = "API token" email= "Previously configured account email" apiUrl = f"https://api.useapi.net/v2/pixverse/speech/?email={email}" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } response = requests.get(apiUrl, headers=headers) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-videos-effects === Document URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-videos-effects --- layout: default title: GET videos/effects description: "List all PixVerse effect templates via GET videos/effects in the useapi.net PixVerse API v2 — each entry includes effect_type, template_type, template_model, qualities, and credit cost." parent: PixVerse API v2 nav_order: 1400 --- ## Retrieve the list of effects December 6, 2024 (May 12, 2026) --- The returned `effect_type` field encodes the number of input images the template accepts (as a string): - `"1"` = exactly one image (e.g., face swap, dance effects) - `"2"` = exactly two images (e.g., hug, kiss effects) - `"3"`, `"4"`, `"5"` = multi-input effects (e.g., Family Reunion accepts up to 5 portraits) — pass via `frame_1_path..frame_5_path` on [POST /videos/create](/docs/api-pixverse-v2/post-pixverse-videos-create-v4). For these templates, the minimum is 2 input images and the maximum is `effect_type`. The `template_type` field distinguishes output kind: - `1` = video output - `2` = image output (1-second still — the response carries `image_id` instead of `video_id`) The `template_model` field identifies the underlying engine (`v5`, `v5.5`, `v5.6`, `v6`, `image_v5`, `image_v6`, `image_v7`, `gemini-2.5-flash`, `gemini-3.0`, `qwen-image`, `""`). When you invoke a template, you do **not** need to (and should not) pass a `model` parameter — the template's engine is authoritative. The `qualities` field is the closed list of quality options the template accepts. Some templates only allow `["1080p"]` or `["360p", "540p", "720p"]` — calling with any other value is rejected. The total credit cost for a template is `video_base_cost + fixed_cost`. > **https://api.useapi.net/v2/pixverse/videos/effects?…** ##### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Query Parameters - `email` is optional when only one [account](/docs/api-pixverse-v2/get-pixverse-accounts) configured. However, if you have multiple accounts configured, this parameter becomes **required**. ##### Responses **200** **200 OK** ```json { "items": [ { "template_id": 384628677917440, "display_name": "Family Reunion", "workflow_tag": "meta_nanopro_muti_it2v_260115", "display_prompt": "This moment is what home means.", "effect_type": "5", "template_type": 1, "template_model": "v5", "template_paid": 1, "supported_features": [2], "duration": 5, "qualities": ["360p", "540p", "720p", "1080p"], "score": 8.42, "hot_count": 0, "created_at": "2026-04-15T07:12:08Z", "updated_at": "2026-05-12T00:01:54Z", "author_info": { "account_id": 1001075, "username": "", "nickname": "maxcasu", "avatar": "https://media.pixverse.ai/upload%2F…jpg" }, "category_ids": [157, 191], "video_base_cost": 20, "fixed_cost": 20, "example_text": "Upload 5 portrait photos", "thumbnail_path": "https://media.pixverse.ai/…jpg", "thumbnail_video_path": "https://media.pixverse.ai/…mp4", "thumbnail_gif_path": "https://media.pixverse.ai/…webp", "app_thumbnail_url": "https://media.pixverse.ai/…jpg", "app_thumbnail_video_url": "https://media.pixverse.ai/…mp4", "app_thumbnail_gif_url": "https://media.pixverse.ai/…webp", "audio_path": "https://media.pixverse.ai/…mp3", "marker": "" }, { "template_id": 377433499832192, "display_name": "Tattoo Removal", "workflow_tag": "i2i_image_v5_…", "display_prompt": "Remove tattoos cleanly from any photo.", "effect_type": "1", "template_type": 2, "template_model": "image_v5", "template_paid": 0, "supported_features": [2], "duration": 1, "qualities": ["1080p"], "score": 6.5, "hot_count": 0, "created_at": "2026-02-20T10:00:00Z", "updated_at": "2026-05-12T00:01:54Z", "author_info": { "account_id": 1001075, "username": "", "nickname": "pixverse", "avatar": "" }, "category_ids": [169], "video_base_cost": 20, "fixed_cost": 10, "example_text": "Upload a portrait with a visible tattoo", "thumbnail_path": "https://media.pixverse.ai/…jpg", "thumbnail_video_path": "", "thumbnail_gif_path": "", "app_thumbnail_url": "https://media.pixverse.ai/…jpg", "app_thumbnail_video_url": "", "app_thumbnail_gif_url": "", "audio_path": "", "marker": "" } ], "total": 917, "next_offset": 0 } ``` **400** **400 Bad Request** ```json { "error": "", "code": 400 } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized", "code": 401 } ``` ##### Model ```typescript { // TypeScript items: { template_id: number display_name: string workflow_tag: string display_prompt: string effect_type: string // "1" or "2" = exact count required; "3"/"4"/"5" = multi-input (min 2, max effect_type) template_type: number // 1 = video output, 2 = image output (1-second still, returns image_id) template_model: string // engine: v5, v5.5, v5.6, v6, image_v5, image_v6, image_v7, gemini-2.5-flash, gemini-3.0, qwen-image, "" template_paid: number // 0 = free, 1 = paid tier required supported_features: number[] | null // feature flags (pass-through) duration: number // output duration in seconds (1 for image templates; 5–21 for video templates) qualities: string[] // allowed quality values — passing any other rejects with 400 score: number // popularity score hot_count: number // running engagement counter created_at: string // ISO timestamp the template was published updated_at: string // ISO timestamp of last metadata update author_info: { // template author account_id: number username: string nickname: string avatar: string // full URL or "" } category_ids: number[] // sub-category IDs this template belongs to video_base_cost: number // base credit cost fixed_cost: number // template-specific extra cost (template_paid templates typically charge fixed_cost) example_text: string // usage hint, e.g. "Upload 5 portrait photos" thumbnail_path: string // thumbnail URL (alias for app_thumbnail_url) thumbnail_video_path: string thumbnail_gif_path: string app_thumbnail_url: string // canonical thumbnail URL app_thumbnail_video_url: string app_thumbnail_gif_url: string audio_path: string // template's built-in audio track (full URL); empty when none marker: string // "new", "hot", "default", or "" }[] total: number next_offset: number } ``` ##### Examples **Curl** ``` bash curl "https://api.useapi.net/v2/pixverse/videos/effects?email=email" \ -H "Accept: application/json" \ -H "Authorization: Bearer …" ``` **JavaScript** ``` javascript const token = "API token"; const email= "Previously configured account email"; const apiUrl = `https://api.useapi.net/v2/pixverse/videos/effects?email=${email}`; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests token = "API token" email= "Previously configured account email" apiUrl = f"https://api.useapi.net/v2/pixverse/videos/effects?email={email}" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } response = requests.get(apiUrl, headers=headers) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-videos-video_id === Document URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-videos-video_id --- layout: default title: GET videos/`video_id` description: "Retrieve a completed PixVerse video or image by video_id via GET videos/video_id in the useapi.net PixVerse API v2 — returns 404 while still processing." parent: PixVerse API v2 nav_order: 700 --- ## Retrieve a generated video or image information December 6, 2024 (August 9, 2026) --- Use this endpoint to retrieve a generated video or image information. Attempting to retrieve a video that is still processing will result in a `404` response. Use [GET /videos](/docs/api-pixverse-v2/get-pixverse-videos) to retrieve all available videos. For dedicated image generation and retrieval, see [POST images/create](/docs/api-pixverse-v2/post-pixverse-images-create) and [GET images/image_id](/docs/api-pixverse-v2/get-pixverse-images-image_id). > **https://api.useapi.net/v2/pixverse/videos/`video_id`** ##### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Path parameter - `video_id` is **required**. Specify the video_id or image_id you want to retrieve. ##### Responses **200** **200 OK** ```json { "video_id": "user:-pixverse:-video:112233445566", "video_status": 1, "account_id": 33445566, "created_at": "2024-11-11T12:34:56Z", "first_frame": "https://media.pixverse.ai/....jpg", "output_width": 2560, "output_height": 1472, "original_video_id": "user:-pixverse:-video:66778899", "upscaled": 1, "prompt": "", "model": "v3", "negative_prompt": "", "quality": "360p", "motion_mode": "normal", "asset_id": 0, "auto_character_prompt": 0, "seed": 0, "likes": 0, "model_name": "", "queue_data": { "queue_time": 1, "queue_count": 0 }, "video_duration": 5, "last_frame": "", "extended": 0, "lip_sync": null, "url": "https://media.pixverse.ai/...mp4", "img_id": 115994841, "img_url": "https://media.pixverse.ai/...webp", "duration": 5, "motion_brush": "", "asset_name": "", "asset_img_url": "", "remove_watermark": 1, "nick_name": "", "avatar": "https://media.pixverse.ai/...jpeg", "aspect_ratio": "", "camera_movement": "default", "relation_type": 0, "style": "", "template_id": 307489548427968, "template_name": "Crazy Cat Woman", "template_thumbnail_url": "https://media.pixverse.ai/asset%2Ftemplate%2Fcatwoman.png", "template_thumbnail_video_url": "https://media.pixverse.ai/asset%2Ftemplate%2Fcatwoman.mp4", "template_i18n_json": "{\"zh-CN\":{\"display_name\":\"疯狂猫女变身\",\"display_prompt\":\"变身妖娆猫女,撩翻全场!\"}}", "workflow_tag": "", "customer_paths": null, "platform": "", "off_peak": 0, "video_status_name": "COMPLETED", "video_status_final": true } ``` **400** **400 Bad Request** ```json { "error": "", "code": 400 } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized", "code": 401 } ``` **404** **404 Not Found** The video was deleted, not found, or is still processing. ```json { "error": "The original video has been deleted" } ``` ##### Model ```typescript { // TypeScript, all fields are optional video_id: string video_status: number account_id: number created_at: string first_frame: string output_width: number output_height: number original_video_id: number upscaled: number prompt: string model: string negative_prompt: string quality: string motion_mode: string asset_id: number auto_character_prompt: number seed: number likes: number model_name: string queue_data?: { queue_time: number queue_count: number estimated_gen_time?: number processing_start_time?: string reason?: string slow_queue?: boolean platform?: string task_id?: number } video_duration: number last_frame: string extended: number lip_sync?: any original_sound_switch: number sound_effect_switch: number lip_sync_switch: number is_sound: number url: string video_path: string img_id: number img_url: string img_path: string customer_img_path?: string customer_img_url?: string duration: number motion_brush: string asset_name: string asset_img_url: string remove_watermark: number nick_name: string avatar: string aspect_ratio: string camera_movement: string relation_type: number style: string template_id: number template_name: string template_thumbnail_url: string template_thumbnail_video_url: string template_thumbnail_gif_url: string template_i18n_json: string workflow_tag: string customer_paths?: { customer_img_url?: string customer_img_path?: string lip_sync_audio_url?: string lip_sync_audio_path?: string lip_sync_tts_content?: string sound_effect_content?: string lip_sync_tts_audio_path?: string lip_sync_tts_speaker_id?: string customer_video_url?: string customer_video_path?: string customer_video_duration?: number customer_first_frame?: string customer_last_frame?: string customer_first_frame_url?: string customer_last_frame_url?: string customer_img_urls?: string[] customer_img_paths?: string[] customer_lip_sync_audio_path?: string } platform: string create_mode: string qualities?: string[] | null lora_weight: number restyle_id: number restyle_prompt: string off_peak: number // added video_status_name: string video_status_final: boolean error: string } ``` `queue_data` is present while a generation is waiting and reports its position — `queue_count` is the number of tasks ahead, `queue_time` the wait so far, and `estimated_gen_time` the projected generation time in seconds. It comes straight from PixVerse and is passed through unchanged. When `slow_queue` is `true` the account has been moved to a reduced-priority queue and `reason` says why. The value `daily_limit_exceeded` means the account has passed its daily allowance for that particular [unlimited Relax Mode model](/docs/api-pixverse-v2/post-pixverse-images-create) — the request is **not** rejected and still costs no credits, it just takes considerably longer. The allowance is per model, so the same account keeps running at full speed on every other model. Switch model, or spread the load across more accounts, if you see this persistently. ##### Examples **Curl** ``` bash curl "https://api.useapi.net/v2/pixverse/videos/video_id" \ -H "Accept: application/json" \ -H "Authorization: Bearer …" ``` **JavaScript** ``` javascript const token = "API token"; const video_id = "video_id to retrieve"; const apiUrl = `https://api.useapi.net/v2/pixverse/videos/${video_id}`; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests token = "API token" video_id = "video_id to retrieve" apiUrl = f"https://api.useapi.net/v2/pixverse/videos/{video_id}" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } response = requests.get(apiUrl, headers=headers) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-videos-voices === Document URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-videos-voices --- layout: default title: GET videos/voices description: "List available voice IDs for lipsync via GET videos/voices in the useapi.net PixVerse API v2 — use the returned IDs with POST videos/lipsync." parent: PixVerse API v2 nav_order: 1300 --- ## Retrieve the list of voices for lipsync December 6, 2024 --- > **https://api.useapi.net/v2/pixverse/videos/voices/?…** ##### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Query Parameters - `email` is optional when only one [account](/docs/api-pixverse-v2/get-pixverse-accounts) configured. However, if you have multiple accounts configured, this parameter becomes **required**. ##### Responses **200** **200 OK** ```json { "tts_list": [ { "speaker_id": "1", "url": "https://media.pixverse.ai/pixverse/mp3/lipsync/tts/1.mp3", "display_name": "Emily" }, { "speaker_id": "2", "url": "https://media.pixverse.ai/pixverse/mp3/lipsync/tts/2.mp3", "display_name": "James" }, { "speaker_id": "3", "url": "https://media.pixverse.ai/pixverse/mp3/lipsync/tts/3.mp3\n", "display_name": "Isabella" }, { "speaker_id": "4", "url": "https://media.pixverse.ai/pixverse/mp3/lipsync/tts/4.mp3", "display_name": "Liam" }, { "speaker_id": "5", "url": "https://media.pixverse.ai/pixverse/mp3/lipsync/tts/5.mp3", "display_name": "Chloe" }, { "speaker_id": "6", "url": "https://media.pixverse.ai/pixverse/mp3/lipsync/tts/6.mp3", "display_name": "Adrian" } ] } ``` **400** **400 Bad Request** ```json { "error": "", "code": 400 } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized", "code": 401 } ``` ##### Model ```typescript { // TypeScript, all fields are optional tts_list: { speaker_id: string url: string display_name: string }[] } ``` ##### Examples **Curl** ``` bash curl "https://api.useapi.net/v2/pixverse/videos/voices/?email=email" \ -H "Accept: application/json" \ -H "Authorization: Bearer …" ``` **JavaScript** ``` javascript const token = "API token"; const email= "Previously configured account email"; const apiUrl = `https://api.useapi.net/v2/pixverse/videos/voices/?email=${email}`; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests token = "API token" email= "Previously configured account email" apiUrl = f"https://api.useapi.net/v2/pixverse/videos/voices/?email={email}" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } response = requests.get(apiUrl, headers=headers) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-videos === Document URL: https://useapi.net/docs/api-pixverse-v2/get-pixverse-videos --- layout: default title: GET videos description: "List all PixVerse videos — queued, generating, and completed — via GET videos in the useapi.net PixVerse API v2, with video_status_name and video_status_final." parent: PixVerse API v2 nav_order: 600 --- ## Retrieve the list of videos December 6, 2024 (August 9, 2026) --- Retrieve the list of videos, this will include those currently being generated or queued. Check the `video_status_name` field for the status and the field `video_status_final` to determine if the provided status is the final status. The API internally uses the field `video_status` to calculate values for `video_status_name` and `video_status_final`. See below for the known statuses map: | video_status | video_status_name | video_status_final | |--------|-------------------|--------------------| | 1 | COMPLETED | true | | 5 | QUEUED | true | | 7 | MODERATED | true | | 9 | GENERATING | false | | 10 | GENERATING | false | If field `off_peak` set to `1` that means this video will be generated during off-peak hours. > **https://api.useapi.net/v2/pixverse/videos/?…** ##### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Query Parameters - `email` is optional when only one [account](/docs/api-pixverse-v2/get-pixverse-accounts) configured. However, if you have multiple accounts configured, this parameter becomes **required**. - `limit` is optional, specify the number of videos to return. Default 40. - `offset` is optional, specify the offset from where to start. ##### Responses **200** **200 OK** ```json { "data": [ { "video_id": "user:-pixverse:-video:11223344", "video_status": 10, "account_id": 33445566, "created_at": "2024-11-11T12:34:56Z", "first_frame": "", "output_width": 0, "output_height": 0, "original_video_id": 0, "upscaled": 0, "prompt": "", "model": "v3", "negative_prompt": "", "quality": "540p", "motion_mode": "normal", "asset_id": 0, "auto_character_prompt": 0, "seed": 123456, "likes": 0, "model_name": "", "queue_data": { "queue_time": 1, "queue_count": 0 }, "video_duration": 5, "last_frame": "", "extended": 0, "lip_sync": {}, "url": "https://media.pixverse.ai/...mp4", "img_id": 55667788, "img_url": "https://media.pixverse.ai/...webp", "duration": 5, "motion_brush": "", "asset_name": "", "asset_img_url": "", "remove_watermark": 0, "nick_name": "", "avatar": "https://media.pixverse.ai/...jpeg", "aspect_ratio": "3:4", "camera_movement": "default", "relation_type": 0, "style": "", "template_id": 0, "template_name": "", "template_thumbnail_url": "", "template_thumbnail_video_url": "", "template_i18n_json": "", "workflow_tag": "", "customer_paths": null, "platform": "", "video_status_name": "GENERATING", "off_peak": 0, "video_status_final": false }, { "video_id": "user:-pixverse:-video:112233445566", "video_status": 1, "account_id": 33445566, "created_at": "2024-11-11T12:34:56Z", "first_frame": "https://media.pixverse.ai/....jpg", "output_width": 2560, "output_height": 1472, "original_video_id": "user:-pixverse:-video:66778899", "upscaled": 1, "prompt": "", "model": "v3", "negative_prompt": "", "quality": "360p", "motion_mode": "normal", "asset_id": 0, "auto_character_prompt": 0, "seed": 0, "likes": 0, "model_name": "", "queue_data": { "queue_time": 1, "queue_count": 0 }, "video_duration": 5, "last_frame": "", "extended": 0, "lip_sync": null, "url": "https://media.pixverse.ai/...mp4", "img_id": 115994841, "img_url": "https://media.pixverse.ai/...webp", "duration": 5, "motion_brush": "", "asset_name": "", "asset_img_url": "", "remove_watermark": 1, "nick_name": "", "avatar": "https://media.pixverse.ai/...jpeg", "aspect_ratio": "", "camera_movement": "default", "relation_type": 0, "style": "", "template_id": 307489548427968, "template_name": "Crazy Cat Woman", "template_thumbnail_url": "https://media.pixverse.ai/asset%2Ftemplate%2Fcatwoman.png", "template_thumbnail_video_url": "https://media.pixverse.ai/asset%2Ftemplate%2Fcatwoman.mp4", "template_i18n_json": "{\"zh-CN\":{\"display_name\":\"疯狂猫女变身\",\"display_prompt\":\"变身妖娆猫女,撩翻全场!\"}}", "workflow_tag": "", "customer_paths": null, "platform": "", "off_peak": 1, "video_status_name": "COMPLETED", "video_status_final": true } ], "next_offset": 40, "total": 55 } ``` **400** **400 Bad Request** ```json { "error": "", "code": 400 } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized", "code": 401 } ``` ##### Model ```typescript { // TypeScript, all fields are optional { video_id: string video_status: number account_id: number created_at: string first_frame: string output_width: number output_height: number original_video_id: number upscaled: number prompt: string model: string negative_prompt: string quality: string motion_mode: string asset_id: number auto_character_prompt: number seed: number likes: number model_name: string queue_data?: { queue_time: number queue_count: number estimated_gen_time?: number processing_start_time?: string reason?: string slow_queue?: boolean platform?: string task_id?: number } video_duration: number last_frame: string extended: number lip_sync?: any original_sound_switch: number sound_effect_switch: number lip_sync_switch: number is_sound: number url: string video_path: string img_id: number img_url: string img_path: string customer_img_path?: string customer_img_url?: string duration: number motion_brush: string asset_name: string asset_img_url: string remove_watermark: number nick_name: string avatar: string aspect_ratio: string camera_movement: string relation_type: number style: string template_id: number template_name: string template_thumbnail_url: string template_thumbnail_video_url: string template_thumbnail_gif_url: string template_i18n_json: string workflow_tag: string customer_paths?: { customer_img_url?: string customer_img_path?: string lip_sync_audio_url?: string lip_sync_audio_path?: string lip_sync_tts_content?: string sound_effect_content?: string lip_sync_tts_audio_path?: string lip_sync_tts_speaker_id?: string customer_video_url?: string customer_video_path?: string customer_video_duration?: number customer_first_frame?: string customer_last_frame?: string customer_first_frame_url?: string customer_last_frame_url?: string customer_img_urls?: string[] customer_img_paths?: string[] customer_lip_sync_audio_path?: string } platform: string create_mode: string qualities?: string[] | null lora_weight: number restyle_id: number restyle_prompt: string off_peak: number // added video_status_name: string video_status_final: boolean }[] next_offset: number total: number } ``` `queue_data` is present while a generation is waiting and reports its position — `queue_count` is the number of tasks ahead, `queue_time` the wait so far, and `estimated_gen_time` the projected generation time in seconds. It comes straight from PixVerse and is passed through unchanged. When `slow_queue` is `true` the account has been moved to a reduced-priority queue and `reason` says why. The value `daily_limit_exceeded` means the account has passed its daily allowance for that particular [unlimited Relax Mode model](/docs/api-pixverse-v2/post-pixverse-images-create) — the request is **not** rejected and still costs no credits, it just takes considerably longer. The allowance is per model, so the same account keeps running at full speed on every other model. Switch model, or spread the load across more accounts, if you see this persistently. ##### Examples **Curl** ``` bash curl "https://api.useapi.net/v2/pixverse/videos/?email=email" \ -H "Accept: application/json" \ -H "Authorization: Bearer …" ``` **JavaScript** ``` javascript const token = "API token"; const email= "Previously configured account email"; const apiUrl = `https://api.useapi.net/v2/pixverse/videos/?email=${email}`; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests token = "API token" email= "Previously configured account email" apiUrl = f"https://api.useapi.net/v2/pixverse/videos/?email={email}" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } response = requests.get(apiUrl, headers=headers) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/model-capabilities === Document URL: https://useapi.net/docs/api-pixverse-v2/model-capabilities --- layout: default title: Model Capabilities description: "Compare per-model constraints and endpoint compatibility for all PixVerse video, image, and music models in the useapi.net PixVerse API v2 — quality, duration, lyrics, and modes." parent: PixVerse API v2 nav_order: 50 --- December 5, 2025 (September 10, 2026) --- # Video Models ## Endpoint Compatibility | Model | [create](/docs/api-pixverse-v2/post-pixverse-videos-create-v4) | [create-frames](/docs/api-pixverse-v2/post-pixverse-videos-create-frames-v4) | [create-fusion](/docs/api-pixverse-v2/post-pixverse-videos-create-fusion) | [motion-control](/docs/api-pixverse-v2/post-pixverse-videos-motion-control) | |-------|:-:|:-:|:-:|:-:| | `v6` *(default)* | ✓ | ✓ | — | — | | `v5.6` | ✓ | ✓ | ✓ | ✓ | | `pixverse-c1` | ✓ | ✓ | ✓ | — | | `seedance-2.5` | ✓ | ✓ | ✓ (+10 ref videos, +10 ref audios) | — | | `seedance-2.0` | ✓ | ✓ | ✓ (+3 ref videos, +3 ref audios) | — | | `seedance-2.0-fast` | ✓ | ✓ | ✓ (+3 ref videos, +3 ref audios) | — | | `seedance-2.0-mini` | ✓ | ✓ | ✓ (+3 ref videos, +3 ref audios) | — | | `kling-o3` | ✓ | ✓ | ✓ | — | | `kling-v3` | ✓ | ✓ | — | — | | `grok-imagine` | ✓ | — | — | — | | `grok-imagine-1.5` | ✓ *(i2v only)* | — | — | — | | `veo-3.1-lite` | ✓ | ✓ | — | — | | `veo-3.1-standard` | ✓ | ✓ | — | — | | `veo-3.1-fast` | ✓ | ✓ | — | — | | `sora-2` | ✓ | — | — | — | | `sora-2-pro` | ✓ | — | — | — | | `happyhorse-1.0` | ✓ | — | — | — | | `minimax-h3` | ✓ | ✓ | ✓ | — | | `gemini-omni-flash` | ✓ | — | ✓ (+3 ref videos) | — | | `flux-3.0` | ✓ | — | — | — | | `wan-3.0` | ✓ | ✓ | ✓ (+5 ref videos, +5 ref audios) | — | Fusion notation: `v5` uses `@pic1`/`@pic2`/`@pic3`, all other fusion-capable models use `@image1`…`@imageN` (mapped positionally to `frame_1_path`…`frame_N_path`). The Seedance fusion family additionally supports `@video1`…`@videoN` for reference videos (`video_1_path`…`video_N_path`) and `@audio1`…`@audioN` for reference audios (`audio_1_path`…`audio_N_path`) — PixVerse's omni mode. `seedance-2.5` takes up to 10 of each and 30 images, the 2.0 family 3 of each and 9 images. `wan-3.0` takes 5 of each alongside 10 images. `gemini-omni-flash` takes reference videos too — up to 3, alongside 5 images — but no reference audios. `grok-imagine-1.5` is image-to-video only — it requires `first_frame_path` and rejects text-to-video (no-image) requests. The original `grok-imagine` supports both text-to-video and image-to-video. ### Extend, upscale, modify, lipsync Upscale, modify, and lipsync are native-PixVerse only. Extend supports `v6` and the third-party `grok-imagine` model. | Endpoint | `v6` | `v5` | `v5.5` | `v5.6` | |----------|:-:|:-:|:-:|:-:| | [extend](/docs/api-pixverse-v2/post-pixverse-videos-extend-v4) | ✓ | — | — | — | | [upscale](/docs/api-pixverse-v2/post-pixverse-videos-upscale) | ✓ | ✓ | ✓ | ✓ | | [modify](/docs/api-pixverse-v2/post-pixverse-videos-modify) | — | — | ✓ | — | | [lipsync](/docs/api-pixverse-v2/post-pixverse-videos-lipsync) | — | ✓ | — | — | [extend](/docs/api-pixverse-v2/post-pixverse-videos-extend-v4) also accepts `grok-imagine` (480p/720p, 2-10s, native audio). ### v5 family (legacy) v5 carries legacy-only modes — multi-frame [create-transition](/docs/api-pixverse-v2/post-pixverse-videos-create-transition), [lipsync](/docs/api-pixverse-v2/post-pixverse-videos-lipsync), and fusion with the original `@pic1/@pic2/@pic3` notation. | Endpoint | `v5` | `v5.5` | `v5.6` | `v5-fast` | |----------|:-:|:-:|:-:|:-:| | [create](/docs/api-pixverse-v2/post-pixverse-videos-create-v4) | ✓ | ✓ | ✓ | ✓ | | [create-frames](/docs/api-pixverse-v2/post-pixverse-videos-create-frames-v4) | ✓ | ✓ | ✓ | — | | [create-transition](/docs/api-pixverse-v2/post-pixverse-videos-create-transition) (2-frame) | ✓ | ✓ | ✓ | — | | [create-transition](/docs/api-pixverse-v2/post-pixverse-videos-create-transition) (3+ frame) | ✓ | — | — | — | | [create-fusion](/docs/api-pixverse-v2/post-pixverse-videos-create-fusion) | ✓ | — | ✓ | — | | [extend](/docs/api-pixverse-v2/post-pixverse-videos-extend-v4) | — | — | — | — | | [modify](/docs/api-pixverse-v2/post-pixverse-videos-modify) | — | ✓ | — | — | | [lipsync](/docs/api-pixverse-v2/post-pixverse-videos-lipsync) | ✓ | — | — | — | | [upscale](/docs/api-pixverse-v2/post-pixverse-videos-upscale) | ✓ | ✓ | ✓ | ✓ | `v5` accepts both `@image1`…`@imageN` (unified) and the legacy `@pic1`/`@pic2`/`@pic3` synonyms for backward compatibility. ## Quality, Duration, Aspect Ratio | Model | Qualities | Durations | Aspect Ratios | Max ref (fusion) | |-------|-----------|-----------|---------------|:-:| | `v6` | 360p, 540p, 720p *(default)*, 1080p | 1-15s | 16:9, 9:16, 1:1, 4:3, 3:4 | — | | `v5.6` | 360p, 540p *(default)*, 720p, 1080p | 1-10s (1080p max 8) | 16:9, 9:16, 1:1, 4:3, 3:4 | 7 imgs | | `v5.5` | 360p, 540p *(default)*, 720p, 1080p | 1-10s (1080p max 8) | 16:9, 9:16, 1:1, 4:3, 3:4 | — | | `v5` | 360p, 540p *(default)*, 720p, 1080p | 1-10s (1080p max 8) | 16:9, 9:16, 1:1, 4:3, 3:4 | 3 imgs | | `v5-fast` | 360p, 540p *(default)*, 720p, 1080p | 1-10s (1080p max 8) | 16:9, 9:16, 1:1, 4:3, 3:4 | — | | `pixverse-c1` | 360p, 540p, 720p, 1080p | 1-15s | 16:9, 4:3, 1:1, 3:4, 9:16, 3:2, 2:3 | 7 imgs | | `seedance-2.5` | 480p, 720p, 1080p | 4-30s | 16:9, 4:3, 1:1, 3:4, 9:16, 21:9 | 30 imgs + 10 videos + 10 audios *(50 total)* | | `seedance-2.0` | 480p, 720p, 1080p, 2160p | 4-15s | 16:9, 4:3, 1:1, 3:4, 9:16, 21:9 | 9 imgs + 3 videos + 3 audios | | `seedance-2.0-fast` | 480p, 720p | 4-15s | 16:9, 4:3, 1:1, 3:4, 9:16, 21:9 | 9 imgs + 3 videos + 3 audios | | `seedance-2.0-mini` | 480p, 720p | 4-15s | 16:9, 4:3, 1:1, 3:4, 9:16, 21:9 | 9 imgs + 3 videos + 3 audios | | `kling-o3` | 720p *(Std)*, 1080p *(Pro)*, 2160p *(4K)* | 3-15s | 16:9, 1:1, 9:16 | 7 imgs | | `kling-v3` | 720p *(Std)*, 1080p *(Pro)*, 2160p *(4K)* | 3-15s | 16:9, 1:1, 9:16 | — | | `grok-imagine` | 480p, 720p | 1-15s | 16:9, 4:3, 1:1, 3:4, 9:16, 3:2, 2:3 | — | | `grok-imagine-1.5` | 480p, 720p | 1-15s | i2v only *(from image)* | — | | `veo-3.1-lite` | 720p, 1080p | 4, 6, 8 | 16:9, 9:16 | — | | `veo-3.1-standard` | 720p, 1080p, 2160p | 4, 6, 8 | 16:9, 9:16 | — | | `veo-3.1-fast` | 720p, 1080p, 2160p | 4, 6, 8 | 16:9, 9:16 | — | | `sora-2` | 720p | 4, 8, 12 | 16:9, 9:16 | — | | `sora-2-pro` | 720p, 1080p | 4, 8, 12 | 16:9, 9:16 | — | | `happyhorse-1.0` | 720p, 1080p | 3-15s | 16:9, 9:16, 1:1, 4:3, 3:4 | — | | `minimax-h3` | 768p, 1440p *(2K)* | 5-15s | 16:9, 4:3, 1:1, 3:4, 9:16, 21:9 | 9 imgs | | `gemini-omni-flash` | 720p | 3-10s | 16:9, 9:16 | 5 imgs + 3 videos | | `flux-3.0` | 720p, 1080p | 5-20s | auto, 21:9, 2:1, 16:9, 4:3, 1:1, 3:4, 9:16 | — | | `wan-3.0` | 480p, 720p, 1080p | 2-30s | auto, 16:9, 4:3, 1:1, 3:4, 9:16 | 10 imgs + 5 videos + 5 audios | - `aspect_ratio` is required for `t2v` and `fusion`, not accepted for `i2v` or `transition` (derived from image). - `flux-3.0` and `wan-3.0` are the only video models that accept `auto`, which lets the model choose the framing. Every other model needs an explicit ratio. - In **fusion** only, `v5.6` and `v5` additionally accept `3:2` and `2:3` on top of the five ratios listed above. - For `kling-o3` / `kling-v3`, `quality` picks an upstream **tier**, not an output resolution — `720p` routes to Std, `1080p` to Pro, and `2160p` to the 4K model. PixVerse advertises 720p for both Std and Pro, so `1080p` buys you the Pro model rather than a 1080-line render. Only `2160p` changes the resolution. - For `veo-3.1-standard` / `veo-3.1-fast`: `quality: 1080p` requires `duration: 8`. - **Reference videos and audios** are accepted only in fusion, and only by the Seedance family (videos + audios), `wan-3.0` (videos + audios) and `gemini-omni-flash` (videos). Images go in `frame_1_path` … `frame_N_path`, videos in `video_1_path` … `video_N_path` (`@video1`…`@videoN`), and audios in `audio_1_path` … `audio_N_path` (`@audio1`…`@audioN`). At least one image or reference video is required. Every reference must be ≤50 MB for video (24-60 fps, ≤6000×6000 px) and ≤15 MB for audio. * `seedance-2.5` — 30 images, 10 reference videos, 10 reference audios, **50 references in total**. Each clip 1.8-30.2s, summed ≤30.2s per kind. * `seedance-2.0` family — 9 images, 3 reference videos, 3 reference audios. Each clip 2-15s, summed ≤15s per kind. * `gemini-omni-flash` — 5 images and 3 reference videos, no reference audios. Each clip 2-15s, summed ≤15s. The 5-image cap is enforced by PixVerse. The reference-video count and durations are limits we enforce, not ones PixVerse has published — it may accept more. * `wan-3.0` — 10 images, 5 reference videos, 5 reference audios. Each clip 2-15s, summed ≤15s per kind. PixVerse states a 1s floor for audio, we enforce 2s because the same rule covers reference video. * `minimax-h3` — 9 images, no reference videos or audios. Durations are summed separately for video and for audio. ## Audio | Model | `audio` | |-------|:-:| | `v6` | toggle | | `v5.6` | toggle | | `v5.5` | toggle | | `v5` | — *(use `lip_sync_tts_prompt` + `sound_effect_prompt`)* | | `v5-fast` | — | | `pixverse-c1` | toggle | | `seedance-2.5` | rejected *(native audio, always on)* | | `seedance-2.0` | toggle | | `seedance-2.0-fast` | toggle | | `seedance-2.0-mini` | toggle | | `kling-o3` | toggle | | `kling-v3` | toggle | | `grok-imagine` | rejected | | `grok-imagine-1.5` | rejected | | `veo-3.1-lite` | rejected | | `veo-3.1-standard` | always on | | `veo-3.1-fast` | always on | | `sora-2` | rejected | | `sora-2-pro` | rejected | | `happyhorse-1.0` | always on | | `minimax-h3` | rejected *(native audio, always on)* | | `gemini-omni-flash` | rejected *(native audio, always on)* | | `flux-3.0` | toggle | | `wan-3.0` | toggle | - `toggle` — accept `audio: true` / `false`. - `always on` — audio generated automatically; `audio: false` is rejected. - `rejected` — `audio` parameter is not accepted (content has no audio track or audio is handled internally). ## Native PixVerse — extra flags `multi_shot`, `preview_mode`, `off_peak_mode`, and `seed` are supported only on native PixVerse models. Third-party models reject them. | Model | `multi_shot` | `preview_mode` | `off_peak_mode` | `seed` | |-------|:-:|:-:|:-:|:-:| | `v6` | ✓ | ✓ | ✓ | ✓ | | `v5.6` | — | ✓ | ✓ | ✓ | | `v5.5` | — | ✓ | ✓ | ✓ | | `v5` | — | ✓ | ✓ | ✓ | | `v5-fast` | — | ✓ | ✓ | ✓ | | `pixverse-c1` | — | ✓ | ✓ | ✓ | --- # Image Models All image models share the same endpoints: [create](/docs/api-pixverse-v2/post-pixverse-images-create), [list](/docs/api-pixverse-v2/get-pixverse-images), [get](/docs/api-pixverse-v2/get-pixverse-images-image_id), [delete](/docs/api-pixverse-v2/del-pixverse-images-image_id). | Model | Qualities | Max Refs | Est. Time | |-------|-----------|:--------:|:---------:| | `qwen-image` *(default)* | 720p, 1080p | 3 | ~3s | | `nano-banana` | 1080p | 3 | ~10s | | `nano-banana-2` | 512p, 1080p, 1440p, 2160p | 9 | ~30s | | `nano-banana-2-lite` | 1080p | 14 | ~7s | | `nano-banana-pro` | 1080p, 1440p, 2160p | 9 | ~60s | | `seedream-4.0` | 1080p, 1440p, 2160p | 6 | ~10s | | `seedream-4.5` | 1440p, 2160p | 6 | ~15s | | `seedream-5.0-pro` | 1080p, 1440p | 10 | ~30s | | `seedream-5.0-lite` | 1440p, 1800p, 2160p | 6 | ~30s | | `kling-3.0` | 1080p, 1440p | 1 | ~15s | | `kling-o3` | 1080p, 1440p, 2160p | 1 | ~20s | | `gpt-image-2.0` | 1080p, 1440p, 2160p | 9 | ~30s | | `gpt-image-2.5-flare` | 1080p, 1440p, 2160p | 16 | ~30s | | `gpt-image-2.5-sunburst` | 1080p, 1440p, 2160p | 16 | ~30s | - **`create_count`**: 1-4 (default 1). - **`detail_level`** (`gpt-image-2.0` and the `gpt-image-2.5` pair only): `low`, `medium`, `high` for `gpt-image-2.0`, plus `xhigh` and `max` for `gpt-image-2.5-flare` and `gpt-image-2.5-sunburst`. Rejected for all other models, and passing `xhigh` or `max` to `gpt-image-2.0` is a 400. It drives the credit cost — see the [cost calculator](/docs/api-pixverse-v2#interactive-calculator). - The two `gpt-image-2.5` variants share one capability shape and one price list. PixVerse positions Flare for fast everyday generation and Sunburst for precise edits and detailed work. - `gpt-image-2.5-flare` and `gpt-image-2.5-sunburst` are the only image models that charge per reference image — 5 credits each, on top of the quality and detail base. At the 16-reference ceiling that adds 80 credits, so a 2160p `max` edit with 16 references costs 225 rather than 145. Every other image model is flat. - The `gpt-image-2.5` pair needs a Standard or higher [plan](https://app.pixverse.ai/subscribe). They are not available on Basic. ### Aspect ratios Each model accepts its own list. If `aspect_ratio` is omitted, the **default** (first column) is used. Passing a value not in the model's row is rejected with **400**. | Models | Default | Accepted `aspect_ratio` values | |--------|:-------:|-------------------------------| | `nano-banana`, `nano-banana-2`, `nano-banana-2-lite`, `nano-banana-pro`, `seedream-4.0`, `seedream-4.5`, `seedream-5.0-pro`, `seedream-5.0-lite` | `auto` | `auto`, `1:1`, `16:9`, `9:16`, `4:3`, `3:4`, `5:4`, `4:5`, `3:2`, `2:3`, `21:9` | | `qwen-image` | `1:1` | `1:1`, `16:9`, `9:16`, `4:3`, `3:4`, `5:4`, `4:5`, `3:2`, `2:3`, `21:9` | | `kling-o3`, `kling-3.0` | `1:1` | `1:1`, `16:9`, `9:16`, `4:3`, `3:4`, `3:2`, `2:3`, `21:9` | | `gpt-image-2.0`, `gpt-image-2.5-flare`, `gpt-image-2.5-sunburst` | `1:1` | `1:1`, `1:2`, `4:3`, `3:4`, `3:2`, `2:3`, `16:9`, `9:16`, `2:1`, `21:9` | ## Unlimited Image Generation (Relax Mode) Pro+ [subscription plans](https://app.pixverse.ai/subscribe) include unlimited image generation in Relax Mode for select models: | Plan | Price | Unlimited Models | |------|:-----:|:-----------------| | Pro | $30/m | `qwen-image`, `nano-banana-2-lite` | | Premium | $60/m | `qwen-image`, `nano-banana`, `nano-banana-2`, `nano-banana-2-lite`, `seedream-4.0` | | Ultra | $199/m | `qwen-image`, `nano-banana`, `nano-banana-2`, `nano-banana-2-lite`, `nano-banana-pro`, `seedream-4.0`, `seedream-4.5`, `seedream-5.0-lite`, `seedream-5.0-pro`, `kling-3.0`, `kling-o3`, `gpt-image-2.0`, `gpt-image-2.5-flare`, `gpt-image-2.5-sunburst` (all 14) | Relax Mode is unmetered, not unthrottled. These models cost zero credits on the listed plans and nothing rejects a request for being too frequent, but PixVerse applies a daily volume threshold. Past it the account is moved to a slow queue rather than refused — generations still succeed and still cost nothing, they just take far longer to come back. It is visible in the response, where `queue_data.slow_queue` turns `true`, `queue_data.reason` reads `daily_limit_exceeded`, and `queue_count` gives the number of tasks ahead. The threshold applies **per model**, not per account. An account throttled on one model keeps generating at full speed on every other one, and the busiest accounts clear 500–700 images a day across models combined. We have seen it engage on `nano-banana-2`, `nano-banana-pro` and `gpt-image-2.0`, most often on `nano-banana-2`. The point at which it engages is not fixed and varies between accounts, but as a rough guide expect a few hundred images per model per day — around 300 for `nano-banana-pro` and around 500 for `gpt-image-2.0`. We have not seen it on the remaining models, which does not mean they are unlimited, only that nobody has pushed them hard enough for it to show. The allowance resets at approximately 00:00 UTC, so a throttled account is clear again at the start of the next UTC day. PixVerse moves these thresholds without notice, so treat them as rough capacity guidance rather than a guarantee. Sustained volume needs more than one account, because each account carries its own allowance and [POST /videos/create](/docs/api-pixverse-v2/post-pixverse-videos-create-v4) and [POST /images/create](/docs/api-pixverse-v2/post-pixverse-images-create) spread work across every account you have configured. Adding accounts alone is not a guarantee though — we have seen a multi-account pool throttled on the same model at the same time, because every account was working through the same daily allowance on the same model. Once a pool is in that state more accounts only buy one more allowance each, and none of them are fast. Falling back to another model is usually the better move, because the allowances are independent per model. An account wedged on `nano-banana-2` still generates on `nano-banana-pro`, `seedream-4.5` or `gpt-image-2.0` at full speed. Decide in advance which models are acceptable for your use case, watch for `queue_data.slow_queue` turning `true` on the [image](/docs/api-pixverse-v2/get-pixverse-images-image_id) or [video](/docs/api-pixverse-v2/get-pixverse-videos-video_id) response, and move down that list rather than waiting out the queue. --- # Music Models All music models share the same endpoints: [generate](/docs/api-pixverse-v2/post-pixverse-music-create), [list](/docs/api-pixverse-v2/get-pixverse-music), [get](/docs/api-pixverse-v2/get-pixverse-music-music_id). Generation is asynchronous — poll `audio_status_final` or pass a `replyUrl`. All models generate at an automatic duration (typically 2-5 minutes). | Model | Provider | Prompt max | Custom lyrics | Reference images | Credits | |-------|----------|:----------:|:-------------:|:----------------:|:-------:| | `music-2.6` *(default)* | MiniMax | 2,000 | ≤ 3,500 chars | — | 40 | | `music-v1` | ElevenLabs | 4,000 | ≤ 3,500 chars | — | 150 | | `lyria-3-pro-preview` | Google | 5,000 | — | up to 10 | 20 | ## Output modes The output is derived from `instrumental` and `lyrics` — there is no `auto_lyrics` parameter. | Request | Result | |---------|--------| | `instrumental: true` | instrumental, no vocals | | `lyrics` provided | vocals sung from your lyrics (`music-2.6` / `music-v1` only) | | neither | vocals with lyrics written by the model | - `lyrics` is rejected on `lyria-3-pro-preview` and cannot be combined with `instrumental`. - `image_path_1` … `image_path_10` are accepted by `lyria-3-pro-preview` only, provided sequentially. ## Status values | audio_status | audio_status_name | audio_status_final | |:-:|:-:|:-:| | 1 | COMPLETED | true | | 5 | QUEUED | false | | 8 | FAILED | true | | 10 | GENERATING | false | A failed track (`audio_status` 8) carries `fail_code` and a human-readable `fail_reason`. These are usually transient backend errors — re-submitting the same request often succeeds. Lyria 3 Pro is also available through [Flow Music](/docs/api-flowmusic-v1) at a lower price with many more features — cover and restyle, lyrics-adjust remix, extend and replace, and audio effects. # Text-to-Speech Models All speech models share the same endpoints: [generate](/docs/api-pixverse-v2/post-pixverse-speech-create), [list](/docs/api-pixverse-v2/get-pixverse-speech), [get](/docs/api-pixverse-v2/get-pixverse-speech-speech_id), plus [voices](/docs/api-pixverse-v2/get-pixverse-speech-voices) and [models](/docs/api-pixverse-v2/get-pixverse-speech-models) for discovery. Generation is asynchronous — poll `audio_status_final` or pass a `replyUrl`. Credits are billed per character — `credits = ceil(chars / N)`. | Model | Provider | Voice settings | Max chars | N (chars/credit) | |-------|----------|----------------|:---------:|:---------------:| | `eleven-multilingual-v2` | ElevenLabs | stability, similarity_boost, speed, style | 10,000 | 50 | | `eleven-v3` | ElevenLabs | stability, similarity_boost, speed + audio tags | 5,000 | 50 | | `eleven-turbo-v2.5` | ElevenLabs | stability, similarity_boost, speed | 40,000 | 100 | | `speech-2.8-hd` *(default)* | MiniMax | speed, volume, pitch, emotion | 10,000 | 50 | | `speech-2.8-turbo` | MiniMax | speed, volume, pitch, emotion | 10,000 | 100 | Every request needs a `voice_id` from [GET speech/voices](/docs/api-pixverse-v2/get-pixverse-speech-voices) (filtered by model and language). The provider and the paired `provider_voice_id` are derived automatically. ## Voice settings The two providers take different settings, enforced per family (a setting from the wrong family is rejected with **400**): - MiniMax — `speed` (0.5-2), `volume` (0-10), `pitch` (-12-12), `emotion` (`auto`, `happy`, `sad`, `angry`, `fearful`, `disgusted`, `surprised`, `neutral`, `calm`). - ElevenLabs — `stability` (0-1), `similarity_boost` (0-1), `speed` (0.7-1.2). `style` (0-1) and `use_speaker_boost` are accepted by `eleven-multilingual-v2` only. ## Expressive control | Model | Control | |-------|---------| | `eleven-v3` | inline **audio tags** in the text — `[whispers]`, `[excited]`, `[shouts]`, `[sighs]`, `[laughs]`, `[curious]`, … Works best with longer, sentence-level text. | | `speech-2.8-hd` / `speech-2.8-turbo` | the `emotion` voice setting (a natural, subtle coloring). | | `eleven-multilingual-v2` | the `style` voice setting. | `eleven-v3` is the most expressive model. The other ElevenLabs models read audio tags literally — use them only with `eleven-v3`. ## Languages `language_code` is validated per model against the live [models](/docs/api-pixverse-v2/get-pixverse-speech-models) catalog (MiniMax and the ElevenLabs v2/turbo models support 30-40 languages). `eleven-v3` auto-detects the language and rejects `language_code` with **400**. ## Status values | audio_status | audio_status_name | audio_status_final | |:-:|:-:|:-:| | 1 | COMPLETED | true | | 5 | QUEUED | false | | 8 | FAILED | true | | 10 | GENERATING | false | A failed job (`audio_status` 8) carries `fail_code` and a human-readable `fail_reason`. These are usually transient backend errors — re-submitting the same request often succeeds. === URL: https://useapi.net/docs/api-pixverse-v2/post-pixverse-accounts-email === Document URL: https://useapi.net/docs/api-pixverse-v2/post-pixverse-accounts-email --- layout: default title: POST accounts/`email` description: "Configure or update a PixVerse account for multi-account load balancing via POST accounts/email in the useapi.net PixVerse API v2." parent: PixVerse API v2 nav_order: 300 --- ## Create or update PixVerse API account configuration December 6, 2024 (March 11, 2025) --- See [Setup PixVerse](/docs/start-here/setup-pixverse) for details. For your convenience, you can specify your PixVerse configuration values under your account. If you specify multiple PixVerse accounts, the API will automatically perform load balancing by randomly selecting an account with available capacity before making calls to PixVerse. > **https://api.useapi.net/v2/pixverse/accounts/`email`** ##### Request Headers ``` yaml 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](/docs/start-here/setup-useapi) for details. ##### Request Body ```json { "email": "Required PixVerse account email", "password": "Required PixVerse account password", "maxJobs": 1-8, "token": "Optional PixVerse token", } ``` - `email` and `password` are **required**. Please see [Setup PixVerse](/docs/start-here/setup-pixverse) for details. - `maxJobs` is **required**. Valid range: 1…8 It should not exceed the number of concurrent generations supported by your account [subscription](https://app.pixverse.ai/subscribe) plan. - `token` is optional and should only be used for development or debugging purposes. See [details](/docs/start-here/setup-pixverse#optional-configure-pixverse-api-to-use-the-current-pixverseai-session). **Important:** When creating an account, leave the token field empty. Only add it after the account has been created, and only if you truly need it. ##### Responses **201** **201 Created** ```json { "email": "", "password": "…secured…", "maxJobs": 3, "jwt": { "AccountId": 66778899, "ExpireTime": 123456789, "ExpireTimeUTC": "2025-01-01T12:13:14.000Z", "Username": "", "token": "abc…secured…cde" } } ``` **400** **400 Bad Request** ```json { "error": "", "code": 400 } ``` **401** **401 Unauthorized** ```json { "error": "", "code": 401 } ``` ##### Model ```typescript { // TypeScript, all fields are optional email: string password: string maxJobs: number jwt: { AccountId: number ExpireTime: number ExpireTimeUTC: string Username: string token: string } } ``` ##### Examples **Curl** ``` bash curl -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer …" \ -X POST https://api.useapi.net/v2/pixverse/accounts/ \ -d '{"email": "…", "password": "…", "maxJobs": …}' ``` **JavaScript** ``` javascript const email = "PixVerse account email"; const password = "PixVerse account password"; const apiUrl = `https://api.useapi.net/v2/pixverse/accounts/${email}`; const api_token = "API token"; const maxJobs = 3; const data = { method: 'POST', headers: { 'Authorization': `Bearer ${api_token}`, 'Content-Type': 'application/json' } }; data.body = JSON.stringify({ email, password, maxJobs }); const response = await fetch(apiUrl, data); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests email = "PixVerse account email" password = "PixVerse account password" apiUrl = f"https://api.useapi.net/v2/pixverse/accounts/{email}" api_token = "API token" maxJobs = 3 headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {api_token}" } body = { "email": f"{email}", "password": f"{password}", "maxJobs": maxJobs } response = requests.post(apiUrl, headers=headers, json=body) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/post-pixverse-files === Document URL: https://useapi.net/docs/api-pixverse-v2/post-pixverse-files --- layout: default title: POST files description: "Upload an image, video, or audio file up to 5 GB via POST files in the useapi.net PixVerse API v2 — the returned id or path is used in generation requests." parent: PixVerse API v2 nav_order: 500 --- ## Upload image, video or audio file December 6, 2024 (April 5, 2026) --- Upload an image, video, or audio file up to 5GB in size. Files uploaded to one PixVerse.ai account can be accessed from any other PixVerse.ai account just by referencing the `id` (image) or `path` (video/audio) so keep that in mind. [POST raw content using Make.com and similar nocode tools.](/docs/questions-and-answers#how-post-raw-content-to-runwaymlassets-and-minimaxfiles-using-makecom-and-similar-nocode-tools) > **https://api.useapi.net/v2/pixverse/files/?…** ##### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: select from the table below ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. - `Content-Type` is **required**, select from the table below: | Content-Type | File Extension | | ------------------- | -------------- | | image/png | png | | image/jpeg | jpeg | | image/gif | gif | | image/webp | webp | | video/mp4 | mp4 | | video/quicktime | mov | | video/3gpp | 3gp | | video/x-matroska | mkv | | video/x-flv | flv | | video/mpeg | mpeg | | video/MP2T | ts | | video/x-msvideo | avi | | video/x-motion-jpeg | mjpeg | | video/webm | webm | | video/ogg | ogv | | audio/wav | wav | | audio/wave | wav | | audio/mpeg | mp3 | **NOTE** We took a guess on supported video and audio types and only tested the most popular ones. **Image resolution limit:** PixVerse does not support images larger than ~2K resolution. If your image exceeds 2048px on either dimension, downscale it to 2K or 1080p before uploading. Oversized images may fail silently or produce unexpected results. ##### Query Parameters - `email` is optional when only one [account](/docs/api-pixverse-v2/get-pixverse-accounts) configured. However, if you have multiple accounts configured, this parameter becomes **required**. ##### Responses **200** **200 OK** The image upload response contains a `id` that you can use to reference the uploaded image file: ```json { "result": [ { "id": 123456, "url": "", "path": "", "size": 112233, "name": "", "category": 0, "err_msg": "" } ] } ``` The video/audio upload response contains a `path` that you can use to reference the uploaded video/audio file: ```json { "path": "", "url": "" } ``` **400** **400 Bad Request** ```json { "error": "", "code": 400 } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized", "code": 401 } ``` ##### Model ```typescript { // TypeScript, all fields are optional url: string path: string result: { id: number url: string path: string size: number name: string category: number err_msg: string }[] } ``` ##### Examples **Curl** ``` bash curl "https://api.useapi.net/v2/pixverse/files/?email=email" \ -H "Authorization: Bearer …" \ -H "Content-Type: image/jpeg" \ --data-binary /path/to/your/image.jpeg ``` **JavaScript** ``` javascript const token = "API token"; const email = "Previously configured account email"; const apiUrl = `https://api.useapi.net/v2/pixverse/files/?email=${email}`; let blob; /* // Example 1: Fetch image from URL const imageUrl = "https://upload.wikimedia.org/wikipedia/commons/7/7d/Mona_Lisa_color_restoration.jpg"; const responseImage = await fetch(imageUrl); blob = await responseImage.blob(); */ /* // Example 2: Load image from local file (Blob) const fsp = require('fs').promises; const imageFileName = "./cat.png"; blob = new Blob([await fsp.readFile(imageFileName)]); */ /* // Example 3: Load from input file html element // const imageFile = document.getElementById(`image-file`); if (imageFile.files[0]) blob = imageFile.files[0]); */ const response = await fetch(apiUrl, { method: "POST" headers: { "Authorization": `Bearer ${token}`, }, body: blob }); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests token = "API token" email = "Previously configured account email" apiUrl = f"https://api.useapi.net/v2/pixverse/files/?email={email}" headers = { 'Authorization': f'Bearer {token}', 'Content-Type': 'image/jpeg' } # # Example 1: Fetch image from URL # image_url = "https://upload.wikimedia.org/wikipedia/commons/7/7d/Mona_Lisa_color_restoration.jpg" # response_image = requests.get(image_url) # file_content = response_image.content # # Example 2: Load image from local file # image_file_path = "./image.jpg" # with open(image_file_path, 'rb') as image_file: # file_content = image_file.read() response = requests.post(api_url, headers=headers, data=file_content) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/post-pixverse-images-create === Document URL: https://useapi.net/docs/api-pixverse-v2/post-pixverse-images-create --- layout: default title: POST images/create description: "Generate an image via POST images/create in the useapi.net PixVerse API v2 — text-to-image and image-to-image across 14 models including qwen-image, Seedream and GPT Image 2.5." parent: PixVerse API v2 nav_order: 540 --- ## Create an image using a text prompt ## Table of contents March 9, 2026 (September 10, 2026) --- Use [pixverse.ai](https://app.pixverse.ai) account to generate images. Supports text-to-image (t2i) and image-to-image (i2i) with reference images uploaded via [POST files](/docs/api-pixverse-v2/post-pixverse-files). ##### Model Comparison Matrix | Model | Qualities | Ref Images | Est. Time | |:------|:----------|:-----------|:---------| | `qwen-image` *(default)* | 720p, 1080p | 1-3 via `image_path_1`…`3` | ~3s | | `nano-banana` *\** | 1080p | 1-3 via `image_path_1`…`3` | ~10s | | `nano-banana-2` *\** | 512p, 1080p, 1440p, 2160p | 1-9 via `image_path_1`…`9` | ~30s | | `nano-banana-2-lite` *\** | 1080p | 1-14 via `image_path_1`…`14` | ~7s | | `nano-banana-pro` *\** | 1080p, 1440p, 2160p | 1-9 via `image_path_1`…`9` | ~60s | | `seedream-4.0` | 1080p, 1440p, 2160p | 1-6 via `image_path_1`…`6` | ~10s | | `seedream-4.5` | 1440p, 2160p | 1-6 via `image_path_1`…`6` | ~15s | | `seedream-5.0-pro` | 1080p, 1440p | 1-10 via `image_path_1`…`10` | ~30s | | `seedream-5.0-lite` | 1440p, 1800p, 2160p | 1-6 via `image_path_1`…`6` | ~30s | | `kling-3.0` | 1080p, 1440p | 1 via `image_path_1` | ~15s | | `kling-o3` | 1080p, 1440p, 2160p | 1 via `image_path_1` | ~20s | | `gpt-image-2.0` | 1080p, 1440p, 2160p | 1-9 via `image_path_1`…`9` | ~30s | | `gpt-image-2.5-flare` | 1080p, 1440p, 2160p | 1-16 via `image_path_1`…`16` | ~30s | | `gpt-image-2.5-sunburst` | 1080p, 1440p, 2160p | 1-16 via `image_path_1`…`16` | ~30s | \* Nano Banana / Nano Banana 2 / Nano Banana 2 Lite / Nano Banana Pro have less restrictive content moderation and can use photos of minors or recognizable people as reference images. Use responsibly and in compliance with applicable laws. ##### Aspect Ratios Each model accepts its own list. If `aspect_ratio` is omitted, the **default** (first column) is used. Passing a value not in the model's row is rejected with **400**. | Models | Default | Accepted `aspect_ratio` values | |--------|:-------:|-------------------------------| | `nano-banana`, `nano-banana-2`, `nano-banana-2-lite`, `nano-banana-pro`, `seedream-4.0`, `seedream-4.5`, `seedream-5.0-pro`, `seedream-5.0-lite` | `auto` | `auto`, `1:1`, `16:9`, `9:16`, `4:3`, `3:4`, `5:4`, `4:5`, `3:2`, `2:3`, `21:9` | | `qwen-image` | `1:1` | `1:1`, `16:9`, `9:16`, `4:3`, `3:4`, `5:4`, `4:5`, `3:2`, `2:3`, `21:9` | | `kling-o3`, `kling-3.0` | `1:1` | `1:1`, `16:9`, `9:16`, `4:3`, `3:4`, `3:2`, `2:3`, `21:9` | | `gpt-image-2.0`, `gpt-image-2.5-flare`, `gpt-image-2.5-sunburst` | `1:1` | `1:1`, `1:2`, `4:3`, `3:4`, `3:2`, `2:3`, `16:9`, `9:16`, `2:1`, `21:9` | `gpt-image-2.0` also takes the `detail_level` parameter (`low`, `medium`, or `high`). The `gpt-image-2.5` pair takes it too and adds two higher tiers, `xhigh` and `max`. It affects credit cost — see the credits estimator below.
💲 Credits estimator Credits are charged per image. Actual costs may change, see [pixverse.ai](https://app.pixverse.ai/subscribe) for current pricing. | Model | Quality | Credits per image | Quantity | |:------|:--------|:-----------------:|:---------| | qwen-image | 720p | 5 | 1-4 | | qwen-image | 1080p | 10 | 1-4 | | nano-banana-2-lite | 1080p | 6 | 1-4 | | seedream-4.0 | all | 10 | 1-4 | | seedream-4.5 | all | 10 | 1-4 | | nano-banana | 1080p | 15 | 1-4 | | seedream-5.0-pro | 1080p | 15 | 1-4 | | seedream-5.0-pro | 1440p | 30 | 1-4 | | seedream-5.0-lite | 1440p | 12 | 1-4 | | seedream-5.0-lite | 1800p | 15 | 1-4 | | seedream-5.0-lite | 2160p | 18 | 1-4 | | nano-banana-2 | 512p | 16 | 1-4 | | nano-banana-2 | 1080p | 25 | 1-4 | | nano-banana-2 | 1440p | 40 | 1-4 | | nano-banana-2 | 2160p | 60 | 1-4 | | nano-banana-pro | 1080p, 1440p | 50 | 1-4 | | nano-banana-pro | 2160p | 90 | 1-4 | | kling-3.0 | 1080p, 1440p | 10 | 1-4 | | kling-o3 | 1080p, 1440p | 10 | 1-4 | | kling-o3 | 2160p | 20 | 1-4 | | gpt-image-2.0 | 1080p (low / medium / high) | 15 / 30 / 60 | 1-4 | | gpt-image-2.0 | 1440p (low / medium / high) | 30 / 60 / 120 | 1-4 | | gpt-image-2.0 | 2160p (low / medium / high) | 45 / 90 / 180 | 1-4 | | gpt-image-2.5-flare, gpt-image-2.5-sunburst | 1080p (low / medium / high / xhigh / max) | 5 / 5 / 15 / 20 / 50 | 1-4 | | gpt-image-2.5-flare, gpt-image-2.5-sunburst | 1440p (low / medium / high / xhigh / max) | 6 / 6 / 20 / 35 / 80 | 1-4 | | gpt-image-2.5-flare, gpt-image-2.5-sunburst | 2160p (low / medium / high / xhigh / max) | 7 / 10 / 35 / 65 / 145 | 1-4 |
##### Unlimited Image Generation (Relax Mode) Pro+ [subscription plans](https://app.pixverse.ai/subscribe) include unlimited image generation in Relax Mode for select models: | Plan | Price | Unlimited Models | |------|:-----:|:-----------------| | Pro | $30/m | `qwen-image`, `nano-banana-2-lite` | | Premium | $60/m | `qwen-image`, `nano-banana`, `nano-banana-2`, `nano-banana-2-lite`, `seedream-4.0` | | Ultra | $199/m | `qwen-image`, `nano-banana`, `nano-banana-2`, `nano-banana-2-lite`, `nano-banana-pro`, `seedream-4.0`, `seedream-4.5`, `seedream-5.0-lite`, `seedream-5.0-pro`, `kling-3.0`, `kling-o3`, `gpt-image-2.0`, `gpt-image-2.5-flare`, `gpt-image-2.5-sunburst` (all 14) | Relax Mode is unmetered, not unthrottled. These models cost zero credits on the listed plans and nothing rejects a request for being too frequent, but PixVerse applies a daily volume threshold. Past it the account is moved to a slow queue rather than refused — generations still succeed and still cost nothing, they just take far longer to come back. It is visible in the response, where `queue_data.slow_queue` turns `true`, `queue_data.reason` reads `daily_limit_exceeded`, and `queue_count` gives the number of tasks ahead. The threshold applies **per model**, not per account. An account throttled on one model keeps generating at full speed on every other one, and the busiest accounts clear 500–700 images a day across models combined. We have seen it engage on `nano-banana-2`, `nano-banana-pro` and `gpt-image-2.0`, most often on `nano-banana-2`. The point at which it engages is not fixed and varies between accounts, but as a rough guide expect a few hundred images per model per day — around 300 for `nano-banana-pro` and around 500 for `gpt-image-2.0`. We have not seen it on the remaining models, which does not mean they are unlimited, only that nobody has pushed them hard enough for it to show. The allowance resets at approximately 00:00 UTC, so a throttled account is clear again at the start of the next UTC day. PixVerse moves these thresholds without notice, so treat them as rough capacity guidance rather than a guarantee. Sustained volume needs more than one account, because each account carries its own allowance and [POST /videos/create](/docs/api-pixverse-v2/post-pixverse-videos-create-v4) and [POST /images/create](/docs/api-pixverse-v2/post-pixverse-images-create) spread work across every account you have configured. Adding accounts alone is not a guarantee though — we have seen a multi-account pool throttled on the same model at the same time, because every account was working through the same daily allowance on the same model. Once a pool is in that state more accounts only buy one more allowance each, and none of them are fast. Falling back to another model is usually the better move, because the allowances are independent per model. An account wedged on `nano-banana-2` still generates on `nano-banana-pro`, `seedream-4.5` or `gpt-image-2.0` at full speed. Decide in advance which models are acceptable for your use case, watch for `queue_data.slow_queue` turning `true` on the [image](/docs/api-pixverse-v2/get-pixverse-images-image_id) or [video](/docs/api-pixverse-v2/get-pixverse-videos-video_id) response, and move down that list rather than waiting out the queue. To retrieve generated image(s), use: * [GET images/`imageId`](/docs/api-pixverse-v2/get-pixverse-images-image_id) To delete a generated image, use: * [DEL images/`imageId`](/docs/api-pixverse-v2/del-pixverse-images-image_id) > **https://api.useapi.net/v2/pixverse/images/create** ##### Request Headers ``` yaml 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](/docs/start-here/setup-useapi) for details. ##### Request Body ```json { "email": "Optional PixVerse API account email", "prompt": "Required text prompt", "model": "seedream-4.0", "quality": "1080p", "aspect_ratio": "auto", "detail_level": "medium", "create_count": 1, "seed": 654321, "image_path_1": "upload/eb20c63d-2a1a-5be6-a562-d3578a2831e3.png", "replyUrl": "Place your call back URL here", "replyRef": "Place your reference id here", "maxJobs": 3 } ``` ##### Parameters - `email` is optional, if not specified API will randomly select account from available [accounts](/docs/api-pixverse-v2/get-pixverse-accounts). - `prompt` is **required**, describe your image. Maximum length 5,000 characters. - `model` is optional. Default: `qwen-image`. See [Model Comparison Matrix](#model-comparison-matrix) for the full list and per-model notes. - `quality` is optional, model-specific. Defaults to the model's first listed value. See [Model Comparison Matrix](#model-comparison-matrix) for per-model qualities. - `aspect_ratio` is optional. Each model accepts its own list — see [Aspect Ratios](#aspect-ratios) above. If omitted, the model's default is used. Passing a value not in the model's row is rejected with **400**. - `detail_level` is accepted by `gpt-image-2.0` (`low`, `medium`, `high`) and by `gpt-image-2.5-flare` / `gpt-image-2.5-sunburst` (`low`, `medium`, `high`, `xhigh`, `max`), and rejected for all other models. It defaults to `low` when omitted. Passing `xhigh` or `max` to `gpt-image-2.0` is rejected with **400**. It drives the credit cost. For `gpt-image-2.0` the steps are relative (low = 0.5×, medium = 1×, high = 2× per quality). The `gpt-image-2.5` pair has its own absolute price per quality and level — see the credits estimator. - `create_count` is optional. Number of images to generate per request. Supported range: 1…4, default 1. - `seed` is optional. Valid range 0…2147483647. - `image_path_1` through `image_path_16` are optional. Reference image file paths uploaded via [POST files](/docs/api-pixverse-v2/post-pixverse-files) for image-to-image (i2i) generation. Reference images must be provided sequentially — `image_path_2` requires `image_path_1`, etc. Maximum number of references depends on the model (see [Model Comparison Matrix](#model-comparison-matrix)). Only `gpt-image-2.5-flare` and `gpt-image-2.5-sunburst` reach 16. On those two models each reference adds **5 credits** on top of the base price. Every other model includes its references at no extra cost. - `replyUrl` is optional, place here your callback URL. This is the preferred and most optimal way to receive results quickly — the API polls every 10 seconds and will call the provided `replyUrl` once the PixVerse image is completed or failed. We recommend using sites like [webhook.site](https://webhook.site) to test callback URL functionality. Maximum length 1024 characters. Callback body has the same JSON shape as [GET /images/`image_id`](/docs/api-pixverse-v2/get-pixverse-images-image_id) response. - `replyRef` is optional, place here your reference id which will be stored and returned along with this PixVerse image response / result. Maximum length 1024 characters. - `maxJobs` is optional, if not specified value from selected [accounts/email](/docs/api-pixverse-v2/get-pixverse-accounts-email) will be used. It should not exceed the number of concurrent generations supported by your account [subscription](https://app.pixverse.ai/subscribe) plan. Valid range: 1…8 ##### Responses **200** **200 OK** Use returned `image_id` or values from `success_ids` array to retrieve image status and results using [GET images/`imageId`](/docs/api-pixverse-v2/get-pixverse-images-image_id). Check `image_status_name` for `COMPLETED` and `image_url` for the generated image link. If you specify the optional parameter [`replyUrl`](#request-body), the API will call the provided `replyUrl` with image progress updates until the image is complete or fails. ```json { "image_id": "user:-pixverse:-image:", "success_ids": [ "user:-pixverse:-image:", "user:-pixverse:-image:" ], "success_count": 2, "fail_count": 0, "total_count": 2, "code": 200 } ``` **400** **400 Bad Request** ```json { "error": "" } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized" } ``` **412** **412 Insufficient credits** Insufficient credits. All Credits have been used up. Please upgrade your membership or purchase credits. ```json { "error": "All Credits have been used up. Please upgrade your membership or purchase credits." } ``` **422** **422 Unprocessable Content** Moderated message. ```json { "error": "Your prompt has triggered our AI moderator, please re-enter your prompt" } ``` **429** **429 Too Many Requests** Wait in a loop for **at least** 10..30 seconds and retry again. There are two possible cases for API response 429: 1. API query is full and can not accept new [images/create](#request-headers) requests. Size of query defined by [`maxJobs` optional parameter](#request-body). ```json { "error": "Account is busy executing tasks." "All configured accounts are running at maximum capacity." } ``` 2. The API received an HTTP response status 429 from PixVerse. Please refer to your [subscription](https://app.pixverse.ai/subscribe) plan for the maximum allowed tasks in the queue. ```json { "error": "Reached the limit for concurrent generations." } ``` **596** **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](/docs/api-pixverse-v2/post-pixverse-accounts-email) before making any new API calls. ```json { "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 { // TypeScript, all fields are optional image_id: string success_ids: string[] success_count: number fail_count: number total_count: number error: string code: number } ``` ##### Examples **Curl** ``` bash curl -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer …" \ -X POST "https://api.useapi.net/v2/pixverse/images/create" \ -d '{"prompt": "…"}' ``` **JavaScript** ``` javascript const prompt = "text prompt"; const apiUrl = `https://api.useapi.net/v2/pixverse/images/create`; 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}); ``` **Python** ``` python import requests prompt = "text prompt" apiUrl = f"https://api.useapi.net/v2/pixverse/images/create" 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()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/post-pixverse-music-create === Document URL: https://useapi.net/docs/api-pixverse-v2/post-pixverse-music-create --- layout: default title: POST music/create description: "Generate a song or instrumental from a text prompt via POST music/create in the useapi.net PixVerse API v2 — MiniMax music-2.6, ElevenLabs music-v1, and Google Lyria, with optional custom lyrics." parent: PixVerse API v2 nav_order: 1440 --- ## Generate music from a text prompt ## Table of contents June 25, 2026 --- Use a [pixverse.ai](https://app.pixverse.ai) account to generate music. A prompt describes the track, and you can produce three kinds of output — an instrumental, a vocal track with model-written lyrics, or a vocal track with your own lyrics. Generation is asynchronous. The call returns an `audio_id` immediately, then poll [GET music/`audio_id`](/docs/api-pixverse-v2/get-pixverse-music-music_id) until `audio_status_final` is `true`, or pass a [`replyUrl`](#request-body) to receive the result by callback. ##### Model Comparison Matrix | Model | Prompt max | Custom lyrics | Reference images | PixVerse
Credits / Cost | Provider cost* | |:------|:-----------|:--------------|:-----------------|:------------------------:|:--------------| | [MiniMax](https://www.minimax.io)
`music-2.6` *(default)* | 2,000 | yes, up to 3,500 chars | — | 40 cr / $0.16 | [~$0.15 / track](https://platform.minimax.io/docs/guides/pricing-paygo) (≤5 min) | | [ElevenLabs](https://elevenlabs.io)
`music-v1` | 4,000 | yes, up to 3,500 chars | — | 150 cr / $0.60 | [$0.15 / min](https://elevenlabs.io/pricing/api) → ~$0.75 (5 min) | | [Google Lyria](https://deepmind.google/technologies/lyria)
`lyria-3-pro-preview` | 5,000 | — | 1-10 via `image_path_1`…`10` | 20 cr / $0.08 | [$0.08 / song](https://cloud.google.com/gemini-enterprise-agent-platform/generative-ai/pricing#lyria) (up to 3 min) | PixVerse cost is for a $60/m Premium plan ($0.004 per credit, as of June 2026) — use the [cost calculator](/docs/api-pixverse-v2) for other plans. *Provider cost is going direct to the model's own provider; prices change, check their pages. All models generate at an automatic duration (the model chooses the length, typically 2-5 minutes). `lyria-3-pro-preview` does not accept custom lyrics, but it can still produce vocals with model-written lyrics — see [`instrumental`](#parameters) and [`lyrics`](#parameters) below. Lyria 3 Pro is also available through [Flow Music](/docs/api-flowmusic-v1), which runs the same model at a lower price with many more features — cover and restyle, lyrics-adjust remix, extend and replace, and audio effects. ##### Output modes The output is determined by `instrumental` and `lyrics` — there is no separate `auto_lyrics` flag, it is derived: | Request | Result | |:--------|:-------| | `instrumental: true` | instrumental, no vocals | | `lyrics` provided | vocals sung from your lyrics (`music-2.6` / `music-v1` only) | | neither | vocals with lyrics written by the model | To retrieve generated music, use: * [GET music/`audio_id`](/docs/api-pixverse-v2/get-pixverse-music-music_id) * [GET music](/docs/api-pixverse-v2/get-pixverse-music) to list all tracks To cancel a track that is still generating, use [DEL scheduler/`id`](/docs/api-pixverse-v2/del-pixverse-scheduler-video_id). > **https://api.useapi.net/v2/pixverse/music/create** ##### Request Headers ``` yaml 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](/docs/start-here/setup-useapi) for details. ##### Request Body ```json { "email": "Optional PixVerse API account email", "prompt": "Required text prompt", "model": "music-2.6", "instrumental": false, "lyrics": "Optional custom lyrics", "image_path_1": "upload/eb20c63d-2a1a-5be6-a562-d3578a2831e3.png", "replyUrl": "Place your call back URL here", "replyRef": "Place your reference id here", "maxJobs": 3 } ``` ##### Parameters - `email` is optional, if not specified API will randomly select account from available [accounts](/docs/api-pixverse-v2/get-pixverse-accounts). - `prompt` is **required**, describe the track you want. Maximum length is model-specific — `music-2.6` 2,000, `music-v1` 4,000, `lyria-3-pro-preview` 5,000 characters. - `model` is optional. Default: `music-2.6`. See [Model Comparison Matrix](#model-comparison-matrix) for the full list. - `instrumental` is optional, default `false`. When `true` the track has no vocals. Cannot be combined with `lyrics`. - `lyrics` is optional and supported by `music-2.6` and `music-v1` only — providing it on `lyria-3-pro-preview` is rejected with **400**. The vocals are sung from the text you supply. Cannot be combined with `instrumental`. Maximum length 3,500 characters. - `image_path_1` through `image_path_10` are optional and supported by `lyria-3-pro-preview` only. Reference image file paths uploaded via [POST files](/docs/api-pixverse-v2/post-pixverse-files) that condition the music. Reference images must be provided sequentially — `image_path_2` requires `image_path_1`, etc. - `replyUrl` is optional, place here your callback URL. This is the preferred and most optimal way to receive results quickly — the API polls every 10 seconds and will call the provided `replyUrl` once the track is completed or failed. We recommend using sites like [webhook.site](https://webhook.site) to test callback URL functionality. Maximum length 1024 characters. Callback body has the same JSON shape as [GET music/`audio_id`](/docs/api-pixverse-v2/get-pixverse-music-music_id) response. - `replyRef` is optional, place here your reference id which will be stored and returned along with this music response / result. Maximum length 1024 characters. - `maxJobs` is optional, if not specified value from selected [accounts/email](/docs/api-pixverse-v2/get-pixverse-accounts-email) will be used. It should not exceed the number of concurrent generations supported by your account [subscription](https://app.pixverse.ai/subscribe) plan. Valid range: 1…8 ##### Responses **200** **200 OK** Use the returned `audio_id` to retrieve status and results using [GET music/`audio_id`](/docs/api-pixverse-v2/get-pixverse-music-music_id). Check `audio_status_name` for `COMPLETED` and `url` for the generated `.mp3` link. If you specify the optional parameter [`replyUrl`](#request-body), the API will call the provided `replyUrl` with progress updates until the track is complete or fails. ```json { "audio_id": "user:-pixverse:-music:", "asset_id": 409848161653065, "asset_type": 2, "asset_source": 1, "create_mode": "music", "status": "making", "audio_status": 5, "credits": 40, "audio_status_name": "QUEUED", "audio_status_final": false } ``` **400** **400 Bad Request** Returned when a parameter is invalid, for example a prompt longer than the model allows, `lyrics` on `lyria-3-pro-preview`, or `lyrics` combined with `instrumental`. ```json { "error": "", "code": 400 } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized" } ``` **412** **412 Insufficient credits** Insufficient credits. All Credits have been used up. Please upgrade your membership or purchase credits. ```json { "error": "All Credits have been used up. Please upgrade your membership or purchase credits." } ``` **429** **429 Too Many Requests** Wait in a loop for **at least** 10..30 seconds and retry again. The API query is full and can not accept new [music/create](#request-headers) requests. Size of the query is defined by the [`maxJobs` optional parameter](#request-body). ```json { "error": "Account is busy executing tasks." "All configured accounts are running at maximum capacity." } ``` **596** **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](/docs/api-pixverse-v2/post-pixverse-accounts-email) before making any new API calls. ```json { "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 { // TypeScript, all fields are optional audio_id: string asset_id: number asset_type: number asset_source: number create_mode: string status: string audio_status: number credits: number error: string code: number // added audio_status_name: string audio_status_final: boolean } ``` ##### Examples **Curl** ``` bash curl -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer …" \ -X POST "https://api.useapi.net/v2/pixverse/music/create" \ -d '{"prompt": "An upbeat synthwave track with a clear female vocal"}' ``` **JavaScript** ``` javascript const prompt = "An upbeat synthwave track with a clear female vocal"; const apiUrl = `https://api.useapi.net/v2/pixverse/music/create`; 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}); ``` **Python** ``` python import requests prompt = "An upbeat synthwave track with a clear female vocal" apiUrl = f"https://api.useapi.net/v2/pixverse/music/create" 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()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/post-pixverse-speech-create === Document URL: https://useapi.net/docs/api-pixverse-v2/post-pixverse-speech-create --- layout: default title: POST speech/create description: "Generate text-to-speech via POST speech/create in the useapi.net PixVerse API v2 — MiniMax speech-2.8 and ElevenLabs (multilingual-v2, v3 audio tags, turbo-v2.5), with per-voice settings, emotions, and 40+ languages." parent: PixVerse API v2 nav_order: 1470 --- ## Generate speech from text ## Table of contents June 25, 2026 --- Use a [pixverse.ai](https://app.pixverse.ai) account to turn text into speech. You pick a `model`, a `voice` (from [GET speech/voices](/docs/api-pixverse-v2/get-pixverse-speech-voices)), and optional per-voice settings, and the API returns spoken audio as an `.mp3`. Generation is asynchronous. The call returns an `audio_id` immediately, then poll [GET speech/`audio_id`](/docs/api-pixverse-v2/get-pixverse-speech-speech_id) until `audio_status_final` is `true`, or pass a [`replyUrl`](#request-body) to receive the result by callback. ##### Model Comparison Matrix | Model | Voice settings | Max chars | PixVerse
Credits / Cost
per 1K chars * | Provider cost
per 1K chars ** | |:------|:---------------|:----------|:--------------------------:|:----------------| | [ElevenLabs](https://elevenlabs.io)
`eleven-multilingual-v2` | stability, similarity_boost, speed, **style** | 10,000 | 20 cr / $0.08 | [$0.10](https://elevenlabs.io/pricing/api) | | [ElevenLabs](https://elevenlabs.io)
`eleven-v3` | stability, similarity_boost, speed
+ inline **audio tags** | 5,000 | 20 cr / $0.08 | [$0.10](https://elevenlabs.io/pricing/api) | | [ElevenLabs](https://elevenlabs.io)
`eleven-turbo-v2.5` | stability, similarity_boost, speed | 40,000 | 10 cr / $0.04 | [$0.05](https://elevenlabs.io/pricing/api) | | [MiniMax](https://www.minimax.io)
`speech-2.8-hd` *(default)* | speed, volume, pitch, **emotion** | 10,000 | 20 cr / $0.08 | [$0.10](https://platform.minimax.io/docs/guides/pricing-paygo) | | [MiniMax](https://www.minimax.io)
`speech-2.8-turbo` | speed, volume, pitch, **emotion** | 10,000 | 10 cr / $0.04 | [$0.06](https://platform.minimax.io/docs/guides/pricing-paygo) | Billing is per-character, so 500 characters costs half. *PixVerse pricing is for the $60/mo Premium plan ($0.004 per credit) — see the [cost calculator](/docs/api-pixverse-v2) for other plans. **Provider cost is the price of going direct to the model's own provider (their public rates, which change). The two providers take **different** voice settings — MiniMax voices respond to `emotion`, ElevenLabs voices to `stability` / `similarity_boost` / `style`. Sending a setting to the wrong family is rejected with **400**. See [Voice settings](#voice-settings) below. ##### Voices Every request needs a `voice_id` from [GET speech/voices](/docs/api-pixverse-v2/get-pixverse-speech-voices), filtered by model and language — the paired `provider_voice_id` is filled in for you automatically. The MiniMax catalog carries 300+ voices (male, female, and neutral), ElevenLabs ~20, each with `gender`, `accent`, and `style_tags` to help you choose. ##### Voice settings All settings are optional — omit them for the voice's natural delivery. Ranges are enforced per model family. MiniMax (`speech-2.8-hd`, `speech-2.8-turbo`): | Setting | Range | Default | Notes | |:--------|:------|:--------|:------| | `speed` | 0.5 – 2 | 1 | playback speed | | `volume` | 0 – 10 | 1 | loudness | | `pitch` | -12 – 12 | 0 | integer semitones | | `emotion` | enum | `auto` | `auto`, `happy`, `sad`, `angry`, `fearful`, `disgusted`, `surprised`, `neutral`, `calm` | ElevenLabs (`eleven-multilingual-v2`, `eleven-v3`, `eleven-turbo-v2.5`): | Setting | Range | Default | Notes | |:--------|:------|:--------|:------| | `stability` | 0 – 1 | 0.5 | lower = more expressive, higher = more consistent | | `similarity_boost` | 0 – 1 | 0.75 | adherence to the original voice | | `speed` | 0.7 – 1.2 | 1 | playback speed | | `style` | 0 – 1 | 0 | `eleven-multilingual-v2` only — style exaggeration | | `use_speaker_boost` | boolean | — | `eleven-multilingual-v2` only | `style` and `use_speaker_boost` are accepted only by `eleven-multilingual-v2` — sending them to another model is rejected with **400**. ##### Audio tags (eleven-v3) `eleven-v3` is ElevenLabs' most expressive model — instead of an `emotion` setting, you direct the performance with **inline audio tags** placed right in the `text`, such as `[whispers]`, `[excited]`, `[shouts]`, `[sighs]`, `[laughs]`, `[sad]`, `[curious]`, and `[gasps]`. Tags work best with longer, sentence-level text that gives the model room to perform. ``` "[whispers] The Force surrounds us. It binds the galaxy together. [curious] Do you feel it? [excited] Your destiny is calling... [shouts] may the Force be with you!" ``` ##### Languages `language_code` is optional and validated per model against the live catalog from [GET speech/models](/docs/api-pixverse-v2/get-pixverse-speech-models) — MiniMax and the ElevenLabs `v2` / `turbo` models support 30-40 languages (`auto` plus ISO codes like `en`, `es`, `ja`, `zh`). `eleven-v3` auto-detects the language and rejects `language_code` with **400**. To retrieve generated speech, use: * [GET speech/`audio_id`](/docs/api-pixverse-v2/get-pixverse-speech-speech_id) * [GET speech](/docs/api-pixverse-v2/get-pixverse-speech) to list all speech To cancel a job that is still generating, use [DEL scheduler/`id`](/docs/api-pixverse-v2/del-pixverse-scheduler-video_id). > **https://api.useapi.net/v2/pixverse/speech/create** ##### Request Headers ``` yaml 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](/docs/start-here/setup-useapi) for details. ##### Request Body ```json { "email": "Optional PixVerse API account email", "model": "speech-2.8-hd", "text": "Required text to speak", "voice_id": "minimax_english_radiant_girl", "language_code": "en", "emotion": "happy", "replyUrl": "Place your call back URL here", "replyRef": "Place your reference id here", "maxJobs": 3 } ``` ##### Parameters - `email` is optional, if not specified API will randomly select account from available [accounts](/docs/api-pixverse-v2/get-pixverse-accounts). - `model` is optional. Default: `speech-2.8-hd`. See [Model Comparison Matrix](#model-comparison-matrix). - `text` is **required**, the words to speak. Maximum length is model-specific — see the matrix (`eleven-v3` 5,000, `eleven-turbo-v2.5` 40,000, others 10,000). For `eleven-v3` you may embed [audio tags](#audio-tags-eleven-v3). - `voice_id` is **required**. A voice from [GET speech/voices](/docs/api-pixverse-v2/get-pixverse-speech-voices). Its paired `provider_voice_id` is derived automatically — you do not pass it. - `language_code` is optional, see [Languages](#languages). Validated per model — rejected for `eleven-v3`. - `speed`, `volume`, `pitch`, `emotion` (MiniMax) and `stability`, `similarity_boost`, `speed`, `style`, `use_speaker_boost` (ElevenLabs) are optional [voice settings](#voice-settings). Settings from the wrong provider family are rejected with **400**. - `replyUrl` is optional, place here your callback URL. This is the preferred and most optimal way to receive results quickly — the API polls every 10 seconds and will call the provided `replyUrl` once the audio is completed or failed. We recommend using sites like [webhook.site](https://webhook.site) to test callback URL functionality. Maximum length 1024 characters. Callback body has the same JSON shape as [GET speech/`audio_id`](/docs/api-pixverse-v2/get-pixverse-speech-speech_id) response. - `replyRef` is optional, place here your reference id which will be stored and returned along with this speech response / result. Maximum length 1024 characters. - `maxJobs` is optional, if not specified value from selected [accounts/email](/docs/api-pixverse-v2/get-pixverse-accounts-email) will be used. It should not exceed the number of concurrent generations supported by your account [subscription](https://app.pixverse.ai/subscribe) plan. Valid range: 1…8 ##### Responses **200** **200 OK** Use the returned `audio_id` to retrieve status and results using [GET speech/`audio_id`](/docs/api-pixverse-v2/get-pixverse-speech-speech_id). Check `audio_status_name` for `COMPLETED` and `url` for the generated `.mp3` link. If you specify the optional parameter [`replyUrl`](#request-body), the API will call the provided `replyUrl` with progress updates until the audio is complete or fails. ```json { "audio_id": "user:-pixverse:-speech:", "asset_id": 409875792979281, "asset_type": 2, "asset_source": 1, "create_mode": "voice", "status": "making", "audio_status": 5, "credits": 1, "audio_status_name": "QUEUED", "audio_status_final": false } ``` **400** **400 Bad Request** Returned when a parameter is invalid, for example `text` longer than the model allows, an `emotion` on an ElevenLabs voice, `stability` on a MiniMax voice, or `language_code` on `eleven-v3`. ```json { "error": "", "code": 400 } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized" } ``` **412** **412 Insufficient credits** Insufficient credits. All Credits have been used up. Please upgrade your membership or purchase credits. ```json { "error": "All Credits have been used up. Please upgrade your membership or purchase credits." } ``` **429** **429 Too Many Requests** Wait in a loop for **at least** 10..30 seconds and retry again. The API query is full and can not accept new [speech/create](#request-headers) requests. Size of the query is defined by the [`maxJobs` optional parameter](#request-body). ```json { "error": "Account is busy executing tasks." "All configured accounts are running at maximum capacity." } ``` **596** **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](/docs/api-pixverse-v2/post-pixverse-accounts-email) before making any new API calls. ```json { "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 { // TypeScript, all fields are optional audio_id: string asset_id: number asset_type: number asset_source: number create_mode: string status: string audio_status: number credits: number error: string code: number // added audio_status_name: string audio_status_final: boolean } ``` ##### Examples **Curl** ``` bash curl -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer …" \ -X POST "https://api.useapi.net/v2/pixverse/speech/create" \ -d '{"model": "speech-2.8-hd", "text": "May the Force be with you.", "voice_id": "minimax_english_radiant_girl", "emotion": "happy"}' ``` **JavaScript** ``` javascript const apiUrl = `https://api.useapi.net/v2/pixverse/speech/create`; const token = "API token"; const data = { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' } }; data.body = JSON.stringify({ model: "speech-2.8-hd", text: "May the Force be with you.", voice_id: "minimax_english_radiant_girl", emotion: "happy" }); const response = await fetch(apiUrl, data); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests apiUrl = f"https://api.useapi.net/v2/pixverse/speech/create" token = "API token" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } body = { "model": "speech-2.8-hd", "text": "May the Force be with you.", "voice_id": "minimax_english_radiant_girl", "emotion": "happy" } response = requests.post(apiUrl, headers=headers, json=body) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/post-pixverse-videos-create-frames-v4 === Document URL: https://useapi.net/docs/api-pixverse-v2/post-pixverse-videos-create-frames-v4 --- layout: default title: POST videos/create-frames description: "Generate a first-to-last-frame transition video via POST videos/create-frames in the useapi.net PixVerse API v2, with native and third-party model support." parent: PixVerse API v2 nav_order: 860 --- ## Create video using first and last frames March 31, 2025 (September 10, 2026) --- This endpoint creates a **2-frame transition** (first frame → last frame) and supports: - Native PixVerse: `v5.6` (default), `v5.5`, `v5`, `v6`, `pixverse-c1` - Third-party: `seedance-2.5`, `seedance-2.0`, `seedance-2.0-fast`, `seedance-2.0-mini`, `kling-o3`, `kling-v3`, `veo-3.1-lite`, `veo-3.1-standard`, `veo-3.1-fast`, `minimax-h3`, `wan-3.0` See [Model Capabilities](/docs/api-pixverse-v2/model-capabilities) for per-model quality and duration constraints. To upload prompt image use [POST /files](/docs/api-pixverse-v2/post-pixverse-files). > **https://api.useapi.net/v2/pixverse/videos/create-frames** ##### Request Headers ``` yaml 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](/docs/start-here/setup-useapi) for details. ##### Request Body ```json { "email": "Optional PixVerse API account email", "prompt": "Optional text prompt", "first_frame_path": "upload/7d16f-eed2-a8f4-cef8-aa44-72807n313.jpeg", "last_frame_path": "upload/e7484a28-6efd-174d-7c02-316ef1a5d.jpeg", "duration": 8, "quality": "1080p", "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](/docs/api-pixverse-v2/get-pixverse-accounts). - `model` is optional. Default: `v5.6`. Supported values — native PixVerse: `v5.6`, `v5.5`, `v5`, `v6`, `pixverse-c1`. Third-party: `seedance-2.5`, `seedance-2.0`, `seedance-2.0-fast`, `seedance-2.0-mini`, `kling-o3`, `kling-v3`, `veo-3.1-lite`, `veo-3.1-standard`, `veo-3.1-fast`, `minimax-h3`, `wan-3.0`. See [Model Capabilities](/docs/api-pixverse-v2/model-capabilities) for per-model constraints. - `prompt` is optional, describe your video. Maximum length 5,000 characters. - `first_frame_path` is **required**, provide path of uploaded image via [POST /files](/docs/api-pixverse-v2/post-pixverse-files). - `last_frame_path` is **required**, provide path of uploaded image via [POST /files](/docs/api-pixverse-v2/post-pixverse-files). - `duration` is optional for `v5`, `v5.5` and `v5.6`, where it defaults to `5`. `v6`, `pixverse-c1` and every third-party model **require** it. Accepted values depend on the model — see [Model Capabilities](/docs/api-pixverse-v2/model-capabilities). - `quality` is optional for `v5`, `v5.5` and `v5.6`. `v6`, `pixverse-c1` and every third-party model **require** it. Accepted values depend on the model — see [Model Capabilities](/docs/api-pixverse-v2/model-capabilities). **Kling note:** for `kling-o3` / `kling-v3`, `quality` selects an upstream tier rather than an output resolution — `720p` routes to Standard, `1080p` to Pro, and `2160p` to the 4K tier. PixVerse renders both Standard and Pro at 720p, so only `2160p` changes the resolution. - `audio` is optional. Behavior depends on the model: * **Not supported** — `seedance-2.5` and `minimax-h3` (native audio, always on). * **Toggle** (`true`/`false`) — `v5.5`, `v5.6`, `v6`, `pixverse-c1`, `seedance-2.0`, `seedance-2.0-fast`, `seedance-2.0-mini`, `kling-o3`, `kling-v3`, `wan-3.0`. * **Always on** (cannot disable) — `veo-3.1-standard`, `veo-3.1-fast`. * **Not supported** — `veo-3.1-lite` rejects it. `v5` accepts the field and ignores it. Supported values: not specified (default), `false`, `true`. - `aspect_ratio` is **not accepted** — transition derives aspect ratio from the first frame. - `preview_mode` is optional. Set to `true` for fast preview generation (lower quality, faster results). Preview videos can later be upscaled via [POST videos/upscale](/docs/api-pixverse-v2/post-pixverse-videos-upscale). Supported values: `false` (default), `true`. - `auto_sound` is optional (v5 only). Set to `true` to generate videos with sound. Supported values: not specified (default), `false`, `true`. - `sound_effect_prompt` is optional (v5 only), describe the sound eg "the sound of waves hitting the shore". - `lip_sync_tts_prompt` is optional (v5 only), enter character lines. Maximum length 140 characters. - `lip_sync_tts_speaker_id` is optional (v5 only), specify desired lipsync voice see [GET videos/voices](/docs/api-pixverse-v2/get-pixverse-videos-voices). - `seed` is optional. Only supported for the native PixVerse models accepted by this endpoint (`v5`, `v5.5`, `v5.6`, `v6`, `pixverse-c1`) — third-party models reject this flag. Valid range 1…2147483647. - `off_peak_mode` is optional. Set to `true` to generate videos during low-demand periods at a reduced credit cost. Only supported for the native PixVerse models accepted by this endpoint (`v5`, `v5.5`, `v5.6`, `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 the `replyUrl` webhook is not called — use [GET videos](/docs/api-pixverse-v2/get-pixverse-videos) to retrieve results. Supported values: `false` (default), `true`. - `replyUrl` is optional. This is the preferred and most optimal way to receive results quickly — the API polls every 10 seconds and will call the provided `replyUrl` once the PixVerse video is completed or failed. Maximum length 1024 characters. We recommend using sites like [webhook.site](https://webhook.site) to test callback URL functionality. Callback body has the same JSON shape as [GET /videos/`video_id`](/docs/api-pixverse-v2/get-pixverse-videos-video_id) response. - `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](/docs/api-pixverse-v2/get-pixverse-accounts-email) will be used. Valid range: 1…8 It should not exceed the number of concurrent generations supported by your account [subscription](https://app.pixverse.ai/subscribe) plan. ##### Responses **200** **200 OK** Use the returned `video_id` to retrieve video status and results using [GET /videos](/docs/api-pixverse-v2/get-pixverse-videos). Locate the video in the response array and check if the field `video_status_final` is `true` or `video_status_name` is `COMPLETED`. The field `url` will contain the generated video link. If you specify the optional parameter [`replyUrl`](#request-body), the API will call the provided `replyUrl` with video progress updates until the video is complete or fails. ```json { "video_id": "user:-pixverse:-video:" } ``` **400** **400 Bad Request** ```json { "error": "" } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized" } ``` **412** **412 Insufficient credits** Insufficient credits. All Credits have been used up. Please upgrade your membership or purchase credits. ```json { "error": "All Credits have been used up. Please upgrade your membership or purchase credits." } ``` **422** **422 Unprocessable Content** Moderated message. ```json { "error": "Your prompt has triggered our AI moderator, please re-enter your prompt" } ``` **429** **429 Too Many Requests** Wait in a loop for **at least** 10..30 seconds and retry again. There are two possible cases for API response 429: 1. API query is full and can not accept new [videos/create-frames](#request-headers) requests. Size of query defined by [`maxJobs` optional parameter](#request-body). ```json { "error": "Account is busy executing tasks." "All configured accounts are running at maximum capacity." } ``` 2. The API received an HTTP response status 429 from PixVerse. Please refer to your [subscription](https://app.pixverse.ai/subscribe) plan for the maximum allowed tasks in the queue. ```json { "error": "Reached the limit for concurrent generations." } ``` **596** **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](/docs/api-pixverse-v2/post-pixverse-accounts-email) before making any new API calls. ```json { "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 { // TypeScript, all fields are optional video_id: string error: string } ``` ##### Examples **Curl** ``` bash curl -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer …" \ -X POST "https://api.useapi.net/v2/pixverse/videos/create-frames" \ -d '{"prompt": "…", "first_frame_path": "…", "last_frame_path": "…"}' ``` **JavaScript** ``` javascript const prompt = "text prompt"; const first_frame_path = "provide path of uploaded first image via POST /files"; const last_frame_path = "provide path of uploaded last image via POST /files"; const apiUrl = `https://api.useapi.net/v2/pixverse/videos/create-frames`; const token = "API token"; const data = { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' } }; data.body = JSON.stringify({ prompt, first_frame_path, last_frame_path }); const response = await fetch(apiUrl, data); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests prompt = "text prompt" first_frame_path = "provide path of uploaded first image via POST /files" last_frame_path = "provide path of uploaded last image via POST /files" apiUrl = f"https://api.useapi.net/v2/pixverse/videos/create-frames" token = "API token" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } body = { "prompt": f"{prompt}", "first_frame_path": f"{first_frame_path}", "last_frame_path": f"{last_frame_path}" } response = requests.post(apiUrl, headers=headers, json=body) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/post-pixverse-videos-create-fusion === Document URL: https://useapi.net/docs/api-pixverse-v2/post-pixverse-videos-create-fusion --- layout: default title: POST videos/create-fusion description: "Generate a video from reference images, videos and audio via POST videos/create-fusion in the useapi.net PixVerse API v2 — omni Reference mode with @image1 / @video1 / @audio1 prompt tags." parent: PixVerse API v2 nav_order: 890 --- ## Create video using image fusion May 16, 2025 (September 10, 2026) --- 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](/docs/api-pixverse-v2/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-o3` (up to 7), `minimax-h3` (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](/docs/api-pixverse-v2/post-pixverse-files). > **https://api.useapi.net/v2/pixverse/videos/create-fusion** ##### Request Headers ``` yaml 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](/docs/start-here/setup-useapi) for details. ##### Request Body ```json { "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 } ``` - `email` is optional, if not specified API will randomly select account from available [accounts](/docs/api-pixverse-v2/get-pixverse-accounts). - `model` is optional. **Default: `v5`** — omitting `model` gives you v5's 3-image cap and its legacy `@pic1`/`@pic2`/`@pic3` handling, not a newer model. Pass `model` explicitly 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-o3`, `minimax-h3`, `gemini-omni-flash`, `wan-3.0`. - `prompt` is **required**, describe your video. Maximum length 5,000 characters. Use `@image1`, `@image2`, … `@imageN` in the prompt to reference `frame_1_path`…`frame_N_path` by index. `v5` also accepts the legacy `@pic1`/`@pic2`/`@pic3` synonyms for backward compatibility. - `frame_1_path` is **required**, provide the path of uploaded image via [POST /files](/docs/api-pixverse-v2/post-pixverse-files). - `frame_2_path` through `frame_30_path` are 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 **30** * `seedance-2.0`, `seedance-2.0-fast`, `seedance-2.0-mini` — up to **9** * `kling-o3` — up to **7** * `minimax-h3` — up to **9**. Costs 10 extra credits per image above 5. * `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 **5** * `v5` — up to **3** (`frame_1_path`, `frame_2_path`, `frame_3_path`) Frames must be provided sequentially — `frame_3_path` requires `frame_2_path`, etc. - `video_1_path`…`video_10_path` are optional and supported by the Seedance models, `wan-3.0` and `gemini-omni-flash` — up to 10 for `seedance-2.5`, up to 5 for `wan-3.0`, and up to 3 for the `seedance-2.0` family and `gemini-omni-flash`. Provide the path of an uploaded video via [POST /files](/docs/api-pixverse-v2/post-pixverse-files). Reference them in the prompt as `@video1`…`@videoN`. Must be sequential — `video_2_path` requires `video_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 sec** * `seedance-2.0` family — up to **3** videos, each **2–15 sec**, summed **≤ 15 sec** * `wan-3.0` — up to **5** videos, each **2–15 sec**, summed **≤ 15 sec** * `gemini-omni-flash` — up to **3** videos, each **2–15 sec**, summed **≤ 15 sec** - `audio_1_path`…`audio_10_path` are optional and supported by the Seedance models and `wan-3.0` — up to 10 for `seedance-2.5`, up to 5 for `wan-3.0`, and up to 3 for the `seedance-2.0` family. Provide the path of an uploaded audio file via [POST /files](/docs/api-pixverse-v2/post-pixverse-files). Reference them in the prompt as `@audio1`…`@audioN`. Must be sequential — `audio_2_path` requires `audio_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 sec** * `seedance-2.0` family — up to **3** audios, each **2–15 sec**, summed **≤ 15 sec** * `wan-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.5` additionally 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. - `duration` and `quality` are optional **only when `model` is omitted**, in which case the request falls back to `v5` with `duration: 5` and `quality: 540p`. **Naming any model — native or third-party — makes both required**, and omitting either returns `400 duration is required for model `. Accepted values depend on the model — see [Model Capabilities](/docs/api-pixverse-v2/model-capabilities). - `aspect_ratio` is optional, default `16:9`. See [Model Capabilities](/docs/api-pixverse-v2/model-capabilities) for per-model supported values. - `audio` is optional (where supported by the model — see [Model Capabilities](/docs/api-pixverse-v2/model-capabilities)). Set to `true` to enable integrated audio. Supported values: `false` (default), `true`. - `seed` is 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_mode` is optional. Set to `true` to 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 the `replyUrl` webhook is not called — use [GET videos](/docs/api-pixverse-v2/get-pixverse-videos) to retrieve results. Supported values: `false` (default), `true`. - `replyUrl` is optional. This is the preferred and most optimal way to receive results quickly — the API polls every 10 seconds and will call the provided `replyUrl` once the PixVerse video is completed or failed. Maximum length 1024 characters. We recommend using sites like [webhook.site](https://webhook.site) to test callback URL functionality. Callback body has the same JSON shape as [GET /videos/`video_id`](/docs/api-pixverse-v2/get-pixverse-videos-video_id) response. - `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](/docs/api-pixverse-v2/get-pixverse-accounts-email) will be used. Valid range: 1…8 It should not exceed the number of concurrent generations supported by your account [subscription](https://app.pixverse.ai/subscribe) plan. ##### Responses **200** **200 OK** Use the returned `video_id` to retrieve video status and results using [GET /videos](/docs/api-pixverse-v2/get-pixverse-videos). Locate the video in the response array and check if the field `video_status_final` is `true` or `video_status_name` is `COMPLETED`. The field `url` will contain the generated video link. If you specify the optional parameter [`replyUrl`](#request-body), the API will call the provided `replyUrl` with video progress updates until the video is complete or fails. ```json { "video_id": "user:-pixverse:-video:" } ``` **400** **400 Bad Request** ```json { "error": "" } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized" } ``` **412** **412 Insufficient credits** Insufficient credits. All Credits have been used up. Please upgrade your membership or purchase credits. ```json { "error": "All Credits have been used up. Please upgrade your membership or purchase credits." } ``` **422** **422 Unprocessable Content** Moderated message. ```json { "error": "Your prompt has triggered our AI moderator, please re-enter your prompt" } ``` **429** **429 Too Many Requests** Wait in a loop for **at least** 10..30 seconds and retry again. There are two possible cases for API response 429: 1. API query is full and can not accept new [videos/create-fusion](#request-headers) requests. Size of query defined by [`maxJobs` optional parameter](#request-body). ```json { "error": "Account is busy executing tasks." "All configured accounts are running at maximum capacity." } ``` 2. The API received an HTTP response status 429 from PixVerse. Please refer to your [subscription](https://app.pixverse.ai/subscribe) plan for the maximum allowed tasks in the queue. ```json { "error": "Reached the limit for concurrent generations." } ``` **596** **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](/docs/api-pixverse-v2/post-pixverse-accounts-email) before making any new API calls. ```json { "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 { // TypeScript, all fields are optional video_id: string error: string } ``` ##### Examples **Curl** ``` bash 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": "…"}' ``` **JavaScript** ``` javascript 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}); ``` **Python** ``` python 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()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/post-pixverse-videos-create-transition === Document URL: https://useapi.net/docs/api-pixverse-v2/post-pixverse-videos-create-transition --- layout: default title: POST videos/create-transition description: "Create a multi-frame transition video with up to 7 frames and custom inter-frame durations via POST videos/create-transition in the useapi.net PixVerse API v2." parent: PixVerse API v2 nav_order: 890 --- ## Create transition video August 29, 2025 (January 27, 2026) --- 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](/docs/api-pixverse-v2/post-pixverse-files). > **https://api.useapi.net/v2/pixverse/videos/create-transition** ##### Request Headers ``` yaml 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](/docs/start-here/setup-useapi) for details. ##### Request Body ```json { "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" } ``` - `email` is optional, if not specified API will randomly select account from available [accounts](/docs/api-pixverse-v2/get-pixverse-accounts). - `model` is optional. Model availability depends on frame count: - **2-frame mode** (frame_1 + frame_2 only): Supports `v5.6` (default), `v5.5`, and `v5`. - v5.5/v5.6: Use `audio` parameter for sound. - v5: Use `lip_sync_tts_prompt` and `sound_effect_prompt` for audio. - **3+ frame mode** (3-7 frames): Only `v5` supported (default). Use `lip_sync_tts_prompt` and `sound_effect_prompt` for audio. Using incompatible parameters for the model returns error 400. See [Model Capabilities](/docs/api-pixverse-v2/model-capabilities) for feature differences. - `quality` is optional. Video quality. Supported values: `1080p`, `720p`, `540p` (default), `360p`. - `seed` is optional. Only supported for native PixVerse models (`v5`, `v5.5`, `v5.6`, `v5-fast`, `v6`, `pixverse-c1`) — third-party models reject this flag. Valid range 1…2147483647. - `frame_1_path` is **required**, provide path of uploaded image via [POST files](/docs/api-pixverse-v2/post-pixverse-files). - `frame_2_path` is **required**, provide path of uploaded image via [POST files](/docs/api-pixverse-v2/post-pixverse-files). - `frame_3_path` is optional, provide path of uploaded image via [POST files](/docs/api-pixverse-v2/post-pixverse-files). - `frame_4_path` is optional, provide path of uploaded image via [POST files](/docs/api-pixverse-v2/post-pixverse-files). - `frame_5_path` is optional, provide path of uploaded image via [POST files](/docs/api-pixverse-v2/post-pixverse-files). - `frame_6_path` is optional, provide path of uploaded image via [POST files](/docs/api-pixverse-v2/post-pixverse-files). - `frame_7_path` is optional, provide path of uploaded image via [POST files](/docs/api-pixverse-v2/post-pixverse-files). - `duration_1_to_2` is optional. Transition duration from frame 1 to frame 2 in seconds. Supported values: `1`, `2`, `3`, `4`, `5`, `6`, `7`, `8`. - `duration_2_to_3` is optional. Transition duration from frame 2 to frame 3 in seconds. Supported values: `1`, `2`, `3`, `4`, `5`, `6`, `7`, `8`. - `duration_3_to_4` is optional. Transition duration from frame 3 to frame 4 in seconds. Supported values: `1`, `2`, `3`, `4`, `5`, `6`, `7`, `8`. - `duration_4_to_5` is optional. Transition duration from frame 4 to frame 5 in seconds. Supported values: `1`, `2`, `3`, `4`, `5`, `6`, `7`, `8`. - `duration_5_to_6` is optional. Transition duration from frame 5 to frame 6 in seconds. Supported values: `1`, `2`, `3`, `4`, `5`, `6`, `7`, `8`. - `duration_6_to_7` is optional. Transition duration from frame 6 to frame 7 in seconds. Supported values: `1`, `2`, `3`, `4`, `5`, `6`, `7`, `8`. - `prompt_1_to_2` is optional, describe transition from frame 1 to frame 2. - `prompt_2_to_3` is optional, describe transition from frame 2 to frame 3. - `prompt_3_to_4` is optional, describe transition from frame 3 to frame 4. - `prompt_4_to_5` is optional, describe transition from frame 4 to frame 5. - `prompt_5_to_6` is optional, describe transition from frame 5 to frame 6. - `prompt_6_to_7` is optional, describe transition from frame 6 to frame 7. - `audio` is optional (**2-frame mode only**, v5.5/v5.6 only). Set to `true` to enable integrated native audio generation. v5.5/v5.6 generates voice, lip sync, and background music together with the video. Not supported with v5 model. See [Model Capabilities](/docs/api-pixverse-v2/model-capabilities). Supported values: not specified (default), `false`, `true`. - `preview_mode` is optional. Set to `true` for fast preview generation (lower quality, faster results). Preview videos can later be upscaled via [POST videos/upscale](/docs/api-pixverse-v2/post-pixverse-videos-upscale). Supported values: `false` (default), `true`. - `auto_sound` is optional (**v5 model only**). Set to `true` to generate videos with sound. Supported values: not specified (default), `false`, `true`. - `sound_effect_prompt` is optional (**v5 model only**), describe the sound eg "epic adventure music". Maximum length 140 characters. - `lip_sync_tts_prompt` is optional (**v5 model only**), enter character lines. Maximum length 140 characters. - `lip_sync_tts_speaker_id` is optional (**v5 model only**), specify desired lipsync voice see [GET videos/voices](/docs/api-pixverse-v2/get-pixverse-videos-voices). - `off_peak_mode` is optional. Set to `true` to 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 the `replyUrl` webhook is not called — use [GET videos](/docs/api-pixverse-v2/get-pixverse-videos) to retrieve results. Supported values: `false` (default), `true`. - `replyUrl` is optional, place here your callback URL. This is the preferred and most optimal way to receive results quickly — the API polls every 10 seconds and will call the provided `replyUrl` once the PixVerse video is completed or failed. We recommend using sites like [webhook.site](https://webhook.site) to test callback URL functionality. Maximum length 1024 characters. Callback body has the same JSON shape as [GET /videos/`video_id`](/docs/api-pixverse-v2/get-pixverse-videos-video_id) response. - `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](/docs/api-pixverse-v2/get-pixverse-accounts-email) will be used. It should not exceed the number of concurrent generations supported by your account [subscription](https://app.pixverse.ai/subscribe) plan. Valid range: 1…8 ##### Responses **200** **200 OK** Use the returned `video_id` to retrieve video status and results using [GET videos](/docs/api-pixverse-v2/get-pixverse-videos). Locate the video in the response array and check if the field `video_status_final` is `true` or `video_status_name` is `COMPLETED`. The field `url` will contain the generated video link. If you specify the optional parameter [`replyUrl`](#request-body), the API will call the provided `replyUrl` with video progress updates until the video is complete or fails. ```json { "video_id": "user:-pixverse:-video:" } ``` **400** **400 Bad Request** ```json { "error": "" } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized" } ``` **412** **412 Insufficient credits** Insufficient credits. All Credits have been used up. Please upgrade your membership or purchase credits. ```json { "error": "All Credits have been used up. Please upgrade your membership or purchase credits." } ``` **422** **422 Unprocessable Content** Moderated message. ```json { "error": "Your prompt has triggered our AI moderator, please re-enter your prompt" } ``` **429** **429 Too Many Requests** Wait in a loop for **at least** 10..30 seconds and retry again. There are two possible cases for API response 429: 1. API query is full and can not accept new [videos/create-transition](#request-headers) requests. Size of query defined by [`maxJobs` optional parameter](#request-body). ```json { "error": "Account is busy executing tasks." "All configured accounts are running at maximum capacity." } ``` 2. The API received an HTTP response status 429 from PixVerse. Please refer to your [subscription](https://app.pixverse.ai/subscribe) plan for the maximum allowed tasks in the queue. ```json { "error": "Reached the limit for concurrent generations." } ``` **596** **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](/docs/api-pixverse-v2/post-pixverse-accounts-email) before making any new API calls. ```json { "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 { // TypeScript, all fields are optional video_id: string error: string } ``` ##### Examples **Curl** ``` bash 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": "…"}' ``` **JavaScript** ``` javascript 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}); ``` **Python** ``` python 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()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/post-pixverse-videos-create-v4 === Document URL: https://useapi.net/docs/api-pixverse-v2/post-pixverse-videos-create-v4 --- layout: default title: POST videos/create description: "Generate text-to-video and image-to-video content via POST videos/create in the useapi.net PixVerse API v2 — PixVerse V6, Seedance, Sora 2, Veo 3.1, and more." parent: PixVerse API v2 nav_order: 850 --- ## Create video March 24, 2025 (September 10, 2026) --- This endpoint supports both **text-to-video (t2v)** and **image-to-video (i2v)** modes. **Supported models** (see [Model Capabilities](/docs/api-pixverse-v2/model-capabilities) for per-model constraints): - Native PixVerse: `v6` (default), `v5.6`, `v5.5`, `v5`, `v5-fast`, `pixverse-c1` - Third-party: `seedance-2.5`, `seedance-2.0`, `seedance-2.0-fast`, `seedance-2.0-mini`, `kling-o3`, `kling-v3`, `grok-imagine`, `grok-imagine-1.5`, `veo-3.1-lite`, `veo-3.1-standard`, `veo-3.1-fast`, `sora-2`, `sora-2-pro`, `happyhorse-1.0`, `minimax-h3`, `gemini-omni-flash`, `flux-3.0`, `wan-3.0` For dedicated image generation, see [POST images/create](/docs/api-pixverse-v2/post-pixverse-images-create). To upload prompt image use [POST files](/docs/api-pixverse-v2/post-pixverse-files). > **https://api.useapi.net/v2/pixverse/videos/create** ##### Request Headers ``` yaml 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](/docs/start-here/setup-useapi) for details. ##### Request Body **Text-to-video** ```json { "model": "v6", "prompt": "A red panda eating bamboo in a misty forest", "duration": 5, "quality": "720p", "aspect_ratio": "16:9" } ``` **Image-to-video** ```json { "model": "v6", "prompt": "The subject turns and smiles at camera", "first_frame_path": "upload/eb20c63d-…png", "duration": 5, "quality": "720p" } ``` **Template (1–2 inputs)** ```json { "template_id": 326733946317888, "first_frame_path": "upload/a-…jpeg", "last_frame_path": "upload/b-…jpeg" } ``` **Template (3–5 inputs)** ```json { "template_id": 384628677917440, "prompt": "A warm family reunion in a sunlit backyard.", "frame_1_path": "upload/a-…jpeg", "frame_2_path": "upload/b-…jpeg", "frame_3_path": "upload/c-…jpeg", "frame_4_path": "upload/d-…jpeg", "frame_5_path": "upload/e-…jpeg" } ``` ###### Parameters - `email` is optional, if not specified API will randomly select account from available [accounts](/docs/api-pixverse-v2/get-pixverse-accounts). - `model` is optional. Default: `v6`. Supported values — native PixVerse: `v6`, `v5.6`, `v5.5`, `v5`, `v5-fast`, `pixverse-c1`. Third-party: `seedance-2.5`, `seedance-2.0`, `seedance-2.0-fast`, `seedance-2.0-mini`, `kling-o3`, `kling-v3`, `grok-imagine`, `grok-imagine-1.5`, `veo-3.1-lite`, `veo-3.1-standard`, `veo-3.1-fast`, `sora-2`, `sora-2-pro`, `happyhorse-1.0`, `minimax-h3`, `gemini-omni-flash`, `flux-3.0`, `wan-3.0`. See [Model Capabilities](/docs/api-pixverse-v2/model-capabilities) for per-model quality, duration, and aspect-ratio constraints. `grok-imagine-1.5` is image-to-video only — it requires `first_frame_path` and rejects no-image (text-to-video) requests. **Ignored when `template_id` is set** — see [notes](#input-image-paths-and-templates). - `prompt` is optional, describe your video. Maximum length 5,000 characters. - `first_frame_path`, `last_frame_path`, `frame_1_path`, `frame_2_path`, `frame_3_path`, `frame_4_path`, `frame_5_path` are optional input image paths. Upload images via [POST /files](/docs/api-pixverse-v2/post-pixverse-files) first and use the returned `path` value. Two interchangeable forms exist for providing image paths and the count rules depend on `effect_type` — see [notes](#input-image-paths-and-templates) for full rules. - `template_id` is optional, effect template id from [GET videos/effects](/docs/api-pixverse-v2/get-pixverse-videos-effects). When set, the template controls model/duration/quality — see [notes](#input-image-paths-and-templates). - `duration` is optional for the native models `v6`, `v5.6`, `v5.5`, `v5` and `v5-fast`, where it defaults to `5`. `pixverse-c1` and every third-party model **require** it. Accepted values depend on the model — see [Model Capabilities](/docs/api-pixverse-v2/model-capabilities). **Ignored when `template_id` is set.** - `quality` is optional for the native models `v6`, `v5.6`, `v5.5`, `v5` and `v5-fast`. `pixverse-c1` and every third-party model **require** it. Accepted values depend on the model — see [Model Capabilities](/docs/api-pixverse-v2/model-capabilities). For `kling-o3` and `kling-v3`, `quality` selects an upstream tier rather than an output resolution — `720p` routes to Standard, `1080p` to Pro, and `2160p` to the 4K tier. PixVerse renders both Standard and Pro at 720p, so only `2160p` changes the resolution. **When `template_id` is set**, must be one of the template's `qualities` (see [GET videos/effects](/docs/api-pixverse-v2/get-pixverse-videos-effects)); defaults to the first entry if omitted. - `aspect_ratio` is optional. For t2v (no image) it defaults to `16:9`. **Not accepted for i2v** (derived from input image). See [Model Capabilities](/docs/api-pixverse-v2/model-capabilities) for per-model supported values. - `auto_sound` is optional. Set to `true` to generate videos with sound or `false` to explicitly remove the default effect sound. Supported values: not specified (default), `false`, `true`. - `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](/docs/api-pixverse-v2/get-pixverse-videos-voices). - `audio` is optional. Supported values: `false`, `true`. Both which values are accepted and what happens when you omit the field depend on the model: | Behavior | Models | What it means | |---|---|---| | Toggle | `v5.5`, `v5.6`, `v6`, `pixverse-c1`, `seedance-2.0`, `seedance-2.0-fast`, `seedance-2.0-mini`, `kling-o3`, `kling-v3`, `flux-3.0`, `wan-3.0` | `true` or `false` accepted, and enables integrated audio generation | | Always on | `veo-3.1-standard`, `veo-3.1-fast`, `happyhorse-1.0` | Audio generated automatically; setting `false` is rejected | | Not supported | `seedance-2.5`, `grok-imagine`, `grok-imagine-1.5`, `veo-3.1-lite`, `sora-2`, `sora-2-pro`, `minimax-h3`, `gemini-omni-flash` | Passing any value is rejected | `seedance-2.5`, `minimax-h3` and `gemini-omni-flash` always generate native audio and accept no `audio` parameter. Omitting `audio` does **not** mean off for every model. On the combo models in the Toggle row above — `seedance-2.0`, `seedance-2.0-fast`, `seedance-2.0-mini`, `kling-o3`, `kling-v3`, `pixverse-c1`, `flux-3.0` and `wan-3.0` — an omitted field is sent upstream as `audio: 1`, so pass `false` explicitly if you want it off. That matters on `kling-o3` / `kling-v3`, where audio adds 40% to the cost at 720p and 1080p. `flux-3.0` and `wan-3.0` charge nothing extra for it. Only the legacy `v5.5` / `v5.6` / `v6` path treats an omitted field as off. - `multi_shot` is optional. **v6 only.** Set to `true` to enable multi-shot storytelling — the AI generates videos with multiple camera angles and scene cuts rather than a single continuous shot. Supported values: `false` (default), `true`. - `preview_mode` is optional. Only supported for native PixVerse models (`v5`, `v5.5`, `v5.6`, `v5-fast`, `v6`, `pixverse-c1`) — third-party models reject this flag. Set to `true` to generate a fast preview at lower quality at **20% off** credits. Use [POST videos/upscale](/docs/api-pixverse-v2/post-pixverse-videos-upscale) to upscale the preview to full quality. Supported values: `false` (default), `true`. - `seed` is optional. Only supported for native PixVerse models (`v5`, `v5.5`, `v5.6`, `v5-fast`, `v6`, `pixverse-c1`) — third-party models reject this flag. Valid range 1…2147483647. - `off_peak_mode` is optional. Set to `true` to 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 the `replyUrl` webhook is not called — use [GET videos](/docs/api-pixverse-v2/get-pixverse-videos) to retrieve results. Supported values: `false` (default), `true`. - `replyUrl` is optional, place here your callback URL. This is the preferred and most optimal way to receive results quickly — the API polls every 10 seconds and will call the provided `replyUrl` once the PixVerse video is completed or failed. We recommend using sites like [webhook.site](https://webhook.site) to test callback URL functionality. Maximum length 1024 characters. Callback body has the same JSON shape as [GET /videos/`video_id`](/docs/api-pixverse-v2/get-pixverse-videos-video_id) response. - `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](/docs/api-pixverse-v2/get-pixverse-accounts-email) will be used. It should not exceed the number of concurrent generations supported by your account [subscription](https://app.pixverse.ai/subscribe) plan. Valid range: 1…8 ###### Input image paths and templates | `effect_type` | Input count | Form to use | |---|---|---| | _(no `template_id`)_ | 0 or 1 | `first_frame_path` (or `frame_1_path`) — omit for text-to-video | | `"1"` | exactly 1 | `first_frame_path` (or `frame_1_path`) | | `"2"` | exactly 2 | `first_frame_path` + `last_frame_path` (or `frame_1_path` + `frame_2_path`) | | `"3"` | 2 to 3 | `frame_1_path` … up to `frame_3_path` | | `"4"` | 2 to 4 | `frame_1_path` … up to `frame_4_path` | | `"5"` | 2 to 5 | `frame_1_path` … up to `frame_5_path` | Never mix `first_frame_path`/`last_frame_path` with `frame_N_path`. In the numbered form, fill slots in order — no `frame_3_path` without `frame_2_path`. When `template_id` is set, the template controls `model`, `duration`, and `quality` — skip those parameters. Anything you pass for `model` or `duration` is ignored, and `quality` (if set) must be one the template allows. Image templates (`template_type: 2`) produce a 1-second still — the response carries `image_id` instead of `video_id`. ##### Responses **200** **200 OK** Use the returned `video_id` or `image_id` to retrieve video status and results using [GET videos](/docs/api-pixverse-v2/get-pixverse-videos). Locate the video in the response array and check if the field `video_status_final` is `true` or `video_status_name` is `COMPLETED`. The field `url` will contain the generated video link. If you specify the optional parameter [`replyUrl`](#request-body), the API will call the provided `replyUrl` with video progress updates until the video is complete or fails. ```json { "video_id": "user:-pixverse:-video:" } ``` **400** **400 Bad Request** ```json { "error": "" } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized" } ``` **412** **412 Insufficient credits** Insufficient credits. All Credits have been used up. Please upgrade your membership or purchase credits. ```json { "error": "All Credits have been used up. Please upgrade your membership or purchase credits." } ``` **422** **422 Unprocessable Content** Moderated message. ```json { "error": "Your prompt has triggered our AI moderator, please re-enter your prompt" } ``` **429** **429 Too Many Requests** Wait in a loop for **at least** 10..30 seconds and retry again. There are two possible cases for API response 429: 1. API query is full and can not accept new [videos/create](#request-headers) requests. Size of query defined by [`maxJobs` optional parameter](#request-body). ```json { "error": "Account is busy executing tasks." "All configured accounts are running at maximum capacity." } ``` 2. The API received an HTTP response status 429 from PixVerse. Please refer to your [subscription](https://app.pixverse.ai/subscribe) plan for the maximum allowed tasks in the queue. ```json { "error": "Reached the limit for concurrent generations." } ``` **596** **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](/docs/api-pixverse-v2/post-pixverse-accounts-email) before making any new API calls. ```json { "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 { // TypeScript, all fields are optional video_id: string image_id: string // When image template_id is used (template_type: 2) error: string } ``` ##### Examples **Curl** ``` bash curl -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer …" \ -X POST "https://api.useapi.net/v2/pixverse/videos/create" \ -d '{"prompt": "…"}' ``` **JavaScript** ``` javascript const prompt = "text prompt"; const apiUrl = `https://api.useapi.net/v2/pixverse/videos/create`; 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}); ``` **Python** ``` python import requests prompt = "text prompt" apiUrl = f"https://api.useapi.net/v2/pixverse/videos/create" 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()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/post-pixverse-videos-extend-v4 === Document URL: https://useapi.net/docs/api-pixverse-v2/post-pixverse-videos-extend-v4 --- layout: default title: POST videos/extend description: "Extend an existing PixVerse video with additional length via POST videos/extend in the useapi.net PixVerse API v2 — supports v6 (default) and grok-imagine." parent: PixVerse API v2 nav_order: 870 --- ## Extend video March 31, 2025 (June 23, 2026) --- This endpoint supports `v6` and `grok-imagine`. Default: `v6`. * Extend a video generated by PixVerse, retrieve the `video_id` of the desired video using [GET /videos](/docs/api-pixverse-v2/get-pixverse-videos). * Upload the video using [POST /files](/docs/api-pixverse-v2/post-pixverse-files) and use `path` to specify the video you want to extend. > **https://api.useapi.net/v2/pixverse/videos/extend** ##### Request Headers ``` yaml 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](/docs/start-here/setup-useapi) for details. ##### Request Body ```json { "email": "Optional PixVerse API account email", "prompt": "Optional text prompt", "video_id": "Optional video_id", "duration": 5, "quality": "720p", "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](/docs/api-pixverse-v2/get-pixverse-accounts). - `model` is optional. Supported values: `v6` (default) and `grok-imagine`. - `prompt` is optional, describe your video. Maximum length 5,000 characters. - `video_id` is optional, retrieve the `video_id` of the desired video using [GET /videos](/docs/api-pixverse-v2/get-pixverse-videos). - `video_path` is optional, upload the video using [POST /files](/docs/api-pixverse-v2/post-pixverse-files) and use `path` to specify the video you want to extend. - `duration` is optional. Extend duration in seconds. Supported values: `1` through `15` for v6, `2` through `10` for grok-imagine. Default: `5`. - `quality` is optional. Video quality. Supported values for v6: `1080p`, `720p` (default), `540p`, `360p`. For grok-imagine: `720p`, `480p`. - `audio` is optional. **v6 only.** Set to `true` to enable integrated audio generation on the extended segment. Supported values: `false` (default), `true`. grok-imagine merges native audio automatically and does not accept this parameter. - `seed` is optional. Valid range 1…2147483647. - `off_peak_mode` is optional. Set to `true` to 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 the `replyUrl` webhook is not called — use [GET videos](/docs/api-pixverse-v2/get-pixverse-videos) to retrieve results. Supported values: `false` (default), `true`. - `replyUrl` is optional. This is the preferred and most optimal way to receive results quickly — the API polls every 10 seconds and will call the provided `replyUrl` once the PixVerse video is completed or failed. Maximum length 1024 characters. We recommend using sites like [webhook.site](https://webhook.site) to test callback URL functionality. Callback body has the same JSON shape as [GET /videos/`video_id`](/docs/api-pixverse-v2/get-pixverse-videos-video_id) response. - `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](/docs/api-pixverse-v2/get-pixverse-accounts-email) will be used. Valid range: 1…8 It should not exceed the number of concurrent generations supported by your account [subscription](https://app.pixverse.ai/subscribe) plan. ##### Responses **200** **200 OK** Use the returned `video_id` to retrieve video status and results using [GET /videos](/docs/api-pixverse-v2/get-pixverse-videos). Locate the video in the response array and check if the field `video_status_final` is `true` or `video_status_name` is `COMPLETED`. The field `url` will contain the generated video link. If you specify the optional parameter [`replyUrl`](#request-body), the API will call the provided `replyUrl` with video progress updates until the video is complete or fails. ```json { "video_id": "user:-pixverse:-video:" } ``` **400** **400 Bad Request** ```json { "error": "" } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized" } ``` **412** **412 Insufficient credits** Insufficient credits. All Credits have been used up. Please upgrade your membership or purchase credits. ```json { "error": "All Credits have been used up. Please upgrade your membership or purchase credits." } ``` **422** **422 Unprocessable Content** Moderated message. ```json { "error": "Your prompt has triggered our AI moderator, please re-enter your prompt" } ``` **429** **429 Too Many Requests** Wait in a loop for **at least** 10..30 seconds and retry again. There are two possible cases for API response 429: 1. API query is full and can not accept new [videos/extend](#request-headers) requests. Size of query defined by [`maxJobs` optional parameter](#request-body). ```json { "error": "Account is busy executing tasks." "All configured accounts are running at maximum capacity." } ``` 2. The API received an HTTP response status 429 from PixVerse. Please refer to your [subscription](https://app.pixverse.ai/subscribe) plan for the maximum allowed tasks in the queue. ```json { "error": "Reached the limit for concurrent generations." } ``` **596** **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](/docs/api-pixverse-v2/post-pixverse-accounts-email) before making any new API calls. ```json { "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 { // TypeScript, all fields are optional video_id: string error: string } ``` ##### Examples **Curl** ``` bash curl -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer …" \ -X POST "https://api.useapi.net/v2/pixverse/videos/extend" \ -d '{"prompt": "…", "video_id": "…"}' ``` **JavaScript** ``` javascript const prompt = "text prompt"; const video_id = "video_id"; const apiUrl = `https://api.useapi.net/v2/pixverse/videos/extend`; const token = "API token"; const data = { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' } }; data.body = JSON.stringify({ prompt, video_id }); const response = await fetch(apiUrl, data); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests prompt = "text prompt" video_id = "video_id" apiUrl = f"https://api.useapi.net/v2/pixverse/videos/extend" token = "API token" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } body = { "prompt": f"{prompt}", "video_id": f"{video_id}" } response = requests.post(apiUrl, headers=headers, json=body) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/post-pixverse-videos-lipsync === Document URL: https://useapi.net/docs/api-pixverse-v2/post-pixverse-videos-lipsync --- layout: default title: POST videos/lipsync description: "Lip-sync a PixVerse video to an audio track via POST videos/lipsync in the useapi.net PixVerse API v2 — model v5, supply video and audio files via POST files." parent: PixVerse API v2 nav_order: 1100 --- ## Lip sync video December 6, 2024 (January 27, 2026) --- * This endpoint uses PixVerse model `v5` only. See [Model Capabilities](/docs/api-pixverse-v2/model-capabilities) for details. * Lip sync a video generated by PixVerse, retrieve the `video_id` of the desired video using [GET /videos](/docs/api-pixverse-v2/get-pixverse-videos). * Upload the video using [POST /files](/docs/api-pixverse-v2/post-pixverse-files) and use `path` to specify the video you want to lip sync. * Upload the audio track using [POST /files](/docs/api-pixverse-v2/post-pixverse-files) and use `path` to specify the audio you want to use for lip sync. > **https://api.useapi.net/v2/pixverse/videos/lipsync** ##### Request Headers ``` yaml 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](/docs/start-here/setup-useapi) for details. ##### Request Body ```json { "video_id": "Optional video_id", "audio_path": "Optional audio track path", "prompt": "Optional text prompt", "speaker_id": 12345, "replyUrl": "Place your call back URL here", "replyRef": "Place your reference id here", "maxJobs": 3 } ``` - `email` is optional, if not specified API will use account specified by `video_id` (if provided), otherwise randomly select account from available [accounts](/docs/api-pixverse-v2/get-pixverse-accounts). - `video_id` is optional, retrieve the `video_id` of the desired video using [GET /videos](/docs/api-pixverse-v2/get-pixverse-videos). - `video_path` is optional, upload the video using [POST /files](/docs/api-pixverse-v2/post-pixverse-files) and use `path` to specify the video you want to lip sync. - `audio_path` is optional, upload the audio track using [POST /files](/docs/api-pixverse-v2/post-pixverse-files) and use `path` to specify the audio you want to use for lip sync. Maximum length of the audio track should not exceed 60 seconds. Generation will fail if you attempt to provide a sound clip longer than that. - `prompt` is optional, provide text you want to use for lip sync. Maximum length 200 characters. - `speaker_id` is optional, to retrieve `speaker_id` see [GET /videos/voices](/docs/api-pixverse-v2/get-pixverse-videos-voices). - `original_sound_switch` is optional, set to `true` if you want to keep the original soundtrack of the video and extend it with the provided sound clip or generated audio. - `off_peak_mode` is optional. Set to `true` to 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 the `replyUrl` webhook is not called — use [GET videos](/docs/api-pixverse-v2/get-pixverse-videos) to retrieve results. Supported values: `false` (default), `true`. - `replyUrl` is optional. This is the preferred and most optimal way to receive results quickly — the API polls every 10 seconds and will call the provided `replyUrl` once the PixVerse video is completed or failed. Maximum length 1024 characters. We recommend using sites like [webhook.site](https://webhook.site) to test callback URL functionality. Callback body has the same JSON shape as [GET /videos/`video_id`](/docs/api-pixverse-v2/get-pixverse-videos-video_id) response. - `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](/docs/api-pixverse-v2/get-pixverse-accounts-email) will be used. Valid range: 1…8 It should not exceed the number of concurrent generations supported by your account [subscription](https://app.pixverse.ai/subscribe) plan. ##### Responses **200** **200 OK** Use the returned `video_id` to retrieve video status and results using [GET /videos](/docs/api-pixverse-v2/get-pixverse-videos). Locate the video in the response array and check if the field `video_status_final` is `true` or `video_status_name` is `COMPLETED`. The field `url` will contain the generated video link. If you specify the optional parameter [`replyUrl`](#request-body), the API will call the provided `replyUrl` with video progress updates until the video is complete or fails. ```json { "video_id": "user:-pixverse:-video:" } ``` **400** **400 Bad Request** ```json { "error": "" } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized" } ``` **412** **412 Insufficient credits** Insufficient credits. All Credits have been used up. Please upgrade your membership or purchase credits. ```json { "error": "All Credits have been used up. Please upgrade your membership or purchase credits." } ``` **422** **422 Unprocessable Content** Moderated message. ```json { "error": "Your prompt has triggered our AI moderator, please re-enter your prompt" } ``` **429** **429 Too Many Requests** Wait in a loop for **at least** 10..30 seconds and retry again. There are two possible cases for API response 429: 1. API query is full and can not accept new [videos/lipsync](#request-headers) requests. Size of query defined by [`maxJobs` optional parameter](#request-body). ```json { "error": "Account is busy executing tasks." "All configured accounts are running at maximum capacity." } ``` 2. The API received an HTTP response status 429 from PixVerse. Please refer to your [subscription](https://app.pixverse.ai/subscribe) plan for the maximum allowed tasks in the queue. ```json { "error": "Reached the limit for concurrent generations." } ``` **596** **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](/docs/api-pixverse-v2/post-pixverse-accounts-email) before making any new API calls. ```json { "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 { // TypeScript, all fields are optional video_id: string error: string } ``` ##### Examples **Curl** ``` bash curl -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer …" \ -X POST "https://api.useapi.net/v2/pixverse/videos/lipsync" \ -d '{"audio_path": "…", "video_id": "…"}' ``` **JavaScript** ``` javascript const audio_path = "audio_path"; const video_id = "video_id"; const apiUrl = `https://api.useapi.net/v2/pixverse/videos/lipsync`; const token = "API token"; const data = { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' } }; data.body = JSON.stringify({ audio_path, video_id }); const response = await fetch(apiUrl, data); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests audio_path = "audio_path" video_id = "video_id" apiUrl = f"https://api.useapi.net/v2/pixverse/videos/lipsync" token = "API token" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } body = { "audio_path": f"{audio_path}", "video_id": f"{video_id}" } response = requests.post(apiUrl, headers=headers, json=body) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/post-pixverse-videos-modify === Document URL: https://useapi.net/docs/api-pixverse-v2/post-pixverse-videos-modify --- layout: default title: POST videos/modify description: "Modify an existing PixVerse video using a text prompt via POST videos/modify in the useapi.net PixVerse API v2 — model v5.5, with request parameters and responses." parent: PixVerse API v2 nav_order: 875 --- ## Modify video January 26, 2026 --- This endpoint uses PixVerse model `v5.5`. Modify video content based on your prompt. * Modify a video generated by PixVerse, retrieve the `video_id` of the desired video using [GET /videos](/docs/api-pixverse-v2/get-pixverse-videos). * Upload the video using [POST /files](/docs/api-pixverse-v2/post-pixverse-files) and use `path` to specify the video you want to modify. > **https://api.useapi.net/v2/pixverse/videos/modify** ##### Request Headers ``` yaml 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](/docs/start-here/setup-useapi) for details. ##### Request Body ```json { "email": "Optional PixVerse API account email", "prompt": "Required modification prompt", "video_id": "Optional video_id", "quality": "540p", "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](/docs/api-pixverse-v2/get-pixverse-accounts). - `model` is optional. Supported values: `v5.5` (default). - `prompt` is **required**, describe the modification you want to apply. Maximum length 5,000 characters. - `video_id` is optional, retrieve the `video_id` of the desired video using [GET /videos](/docs/api-pixverse-v2/get-pixverse-videos). - `video_path` is optional, upload the video using [POST /files](/docs/api-pixverse-v2/post-pixverse-files) and use `path` to specify the video you want to modify. - `quality` is optional. Video quality. Supported values: `720p`, `540p` (default), `360p`. - `seed` is optional. Valid range 1…2147483647. - `off_peak_mode` is optional. Set to `true` to 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 the `replyUrl` webhook is not called — use [GET videos](/docs/api-pixverse-v2/get-pixverse-videos) to retrieve results. Supported values: `false` (default), `true`. - `replyUrl` is optional. This is the preferred and most optimal way to receive results quickly — the API polls every 10 seconds and will call the provided `replyUrl` once the PixVerse video is completed or failed. Maximum length 1024 characters. We recommend using sites like [webhook.site](https://webhook.site) to test callback URL functionality. Callback body has the same JSON shape as [GET /videos/`video_id`](/docs/api-pixverse-v2/get-pixverse-videos-video_id) response. - `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](/docs/api-pixverse-v2/get-pixverse-accounts-email) will be used. Valid range: 1…8 It should not exceed the number of concurrent generations supported by your account [subscription](https://app.pixverse.ai/subscribe) plan. ##### Responses **200** **200 OK** Use the returned `video_id` to retrieve video status and results using [GET /videos](/docs/api-pixverse-v2/get-pixverse-videos). Locate the video in the response array and check if the field `video_status_final` is `true` or `video_status_name` is `COMPLETED`. The field `url` will contain the generated video link. If you specify the optional parameter [`replyUrl`](#request-body), the API will call the provided `replyUrl` with video progress updates until the video is complete or fails. ```json { "video_id": "user:-pixverse:-video:" } ``` **400** **400 Bad Request** ```json { "error": "" } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized" } ``` **412** **412 Insufficient credits** Insufficient credits. All Credits have been used up. Please upgrade your membership or purchase credits. ```json { "error": "All Credits have been used up. Please upgrade your membership or purchase credits." } ``` **422** **422 Unprocessable Content** Moderated message or no masks detected. ```json { "error": "Your prompt has triggered our AI moderator, please re-enter your prompt" } ``` ```json { "error": "No masks detected in video frame" } ``` **429** **429 Too Many Requests** Wait in a loop for **at least** 10..30 seconds and retry again. There are two possible cases for API response 429: 1. API query is full and can not accept new [videos/modify](#request-headers) requests. Size of query defined by [`maxJobs` optional parameter](#request-body). ```json { "error": "Account is busy executing tasks." "All configured accounts are running at maximum capacity." } ``` 2. The API received an HTTP response status 429 from PixVerse. Please refer to your [subscription](https://app.pixverse.ai/subscribe) plan for the maximum allowed tasks in the queue. ```json { "error": "Reached the limit for concurrent generations." } ``` **596** **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](/docs/api-pixverse-v2/post-pixverse-accounts-email) before making any new API calls. ```json { "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 { // TypeScript, all fields are optional video_id: string error: string } ``` ##### Examples **Curl** ``` bash curl -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer …" \ -X POST "https://api.useapi.net/v2/pixverse/videos/modify" \ -d '{"prompt": "change the outfit to red dress", "video_id": "…"}' ``` **JavaScript** ``` javascript const prompt = "change the outfit to red dress"; const video_id = "video_id"; const apiUrl = `https://api.useapi.net/v2/pixverse/videos/modify`; const token = "API token"; const data = { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' } }; data.body = JSON.stringify({ prompt, video_id }); const response = await fetch(apiUrl, data); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests prompt = "change the outfit to red dress" video_id = "video_id" apiUrl = f"https://api.useapi.net/v2/pixverse/videos/modify" token = "API token" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } body = { "prompt": f"{prompt}", "video_id": f"{video_id}" } response = requests.post(apiUrl, headers=headers, json=body) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/post-pixverse-videos-motion-control === Document URL: https://useapi.net/docs/api-pixverse-v2/post-pixverse-videos-motion-control --- layout: default title: POST videos/motion-control description: "Animate a character image by transferring motion from a reference video via POST videos/motion-control in the useapi.net PixVerse API v2 — no prompt required." parent: PixVerse API v2 nav_order: 895 --- ## Motion Control May 13, 2026 --- Drive a character image with motion extracted from a reference video. Upload a portrait (the character) and a short motion clip — PixVerse animates the character following the motion of the clip. Useful for transferring dance moves, gestures, or full-body action onto a still image. * Upload the character image and the motion video using [POST /files](/docs/api-pixverse-v2/post-pixverse-files). * PixVerse validates the character image before submission — if it cannot detect a clear person or animal subject, the request is rejected with **422**. * This endpoint does **not** accept a prompt — motion comes entirely from the reference video. > **https://api.useapi.net/v2/pixverse/videos/motion-control** ##### Request Headers ``` yaml 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](/docs/start-here/setup-useapi) for details. ##### Request Body ```json { "email": "Optional PixVerse API account email", "frame_1_path": "upload/a1b2c3d4-1111-2222-3333-character000001.webp", "video_1_path": "upload/e5f6a7b8-4444-5555-6666-motionvideo0001.mp4", "quality": "720p", "off_peak_mode": false, "replyUrl": "Place your call back URL here", "replyRef": "Place your reference here" } ``` - `email` is optional, if not specified API will randomly select account from available [accounts](/docs/api-pixverse-v2/get-pixverse-accounts). - `frame_1_path` is **required** — character image path uploaded via [POST /files](/docs/api-pixverse-v2/post-pixverse-files). Must contain a clear subject (person or animal); ambiguous or empty images will be rejected with **422**. - `video_1_path` is **required** — motion reference video path uploaded via [POST /files](/docs/api-pixverse-v2/post-pixverse-files). **Motion video limits** (enforced by PixVerse upstream): * Duration: **1–30 sec** * File size: **≤ 50 MB** * Dimensions: **≤ 1920 × 1920 px** - `model` is optional. Currently only one engine is supported. Supported values: `v5.6` (default). - `quality` is optional. Video quality. Supported values: `360p`, `540p`, `720p` (default). - `off_peak_mode` is optional. Set to `true` to generate during low-demand periods at a reduced credit cost. 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 the `replyUrl` webhook is not called — use [GET videos](/docs/api-pixverse-v2/get-pixverse-videos) to retrieve results. Supported values: `false` (default), `true`. - `replyUrl` is optional. This is the preferred and most optimal way to receive results quickly — the API polls every 10 seconds and will call the provided `replyUrl` once the PixVerse video is completed or failed. Maximum length 1024 characters. We recommend using sites like [webhook.site](https://webhook.site) to test callback URL functionality. Callback body has the same JSON shape as [GET /videos/`video_id`](/docs/api-pixverse-v2/get-pixverse-videos-video_id) response. - `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](/docs/api-pixverse-v2/get-pixverse-accounts-email) will be used. Valid range: 1…8 It should not exceed the number of concurrent generations supported by your account [subscription](https://app.pixverse.ai/subscribe) plan. ##### Responses **200** **200 OK** Use the returned `video_id` to retrieve video status and results using [GET /videos](/docs/api-pixverse-v2/get-pixverse-videos). Locate the video in the response array and check if the field `video_status_final` is `true` or `video_status_name` is `COMPLETED`. The field `url` will contain the generated video link. If you specify the optional parameter [`replyUrl`](#request-body), the API will call the provided `replyUrl` with video progress updates until the video is complete or fails. ```json { "video_id": "user:-pixverse:-video:" } ``` **400** **400 Bad Request** ```json { "error": "" } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized" } ``` **412** **412 Insufficient credits** ```json { "error": "All Credits have been used up. Please upgrade your membership or purchase credits." } ``` **422** **422 Unprocessable Content** Character image was rejected — PixVerse could not detect a clear person or animal subject. ```json { "error": "Character image was rejected — upload a clear photo with a person or animal as the subject" } ``` **429** **429 Too Many Requests** Wait in a loop for **at least** 10..30 seconds and retry again. ```json { "error": "Account is busy executing tasks." "All configured accounts are running at maximum capacity." } ``` ```json { "error": "Reached the limit for concurrent generations." } ``` **596** **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](/docs/api-pixverse-v2/post-pixverse-accounts-email) before making any new API calls. ```json { "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 { // TypeScript, all fields are optional video_id: string error: string } ``` ##### Examples **Curl** ``` bash curl -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer …" \ -X POST "https://api.useapi.net/v2/pixverse/videos/motion-control" \ -d '{"frame_1_path": "upload/…webp", "video_1_path": "upload/…mp4", "quality": "720p"}' ``` **JavaScript** ``` javascript const frame_1_path = "provide path of uploaded character image via POST /files"; const video_1_path = "provide path of uploaded motion video via POST /files"; const apiUrl = `https://api.useapi.net/v2/pixverse/videos/motion-control`; const token = "API token"; const data = { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' } }; data.body = JSON.stringify({ frame_1_path, video_1_path, quality: '720p' }); const response = await fetch(apiUrl, data); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests frame_1_path = "provide path of uploaded character image via POST /files" video_1_path = "provide path of uploaded motion video via POST /files" apiUrl = f"https://api.useapi.net/v2/pixverse/videos/motion-control" token = "API token" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } body = { "frame_1_path": f"{frame_1_path}", "video_1_path": f"{video_1_path}", "quality": "720p" } response = requests.post(apiUrl, headers=headers, json=body) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-pixverse-v2/post-pixverse-videos-upscale === Document URL: https://useapi.net/docs/api-pixverse-v2/post-pixverse-videos-upscale --- layout: default title: POST videos/upscale description: "Upscale a PixVerse video to 4K resolution via POST videos/upscale in the useapi.net PixVerse API v2 — parameters, response examples, and a live Try It console." parent: PixVerse API v2 nav_order: 1200 --- ## Upscale to 4K December 6, 2024 --- > **https://api.useapi.net/v2/pixverse/videos/upscale** ##### Request Headers ``` yaml 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](/docs/start-here/setup-useapi) for details. ##### Request Body ```json { "video_id": "Required video_id", "replyUrl": "Place your call back URL here", "replyRef": "Place your reference id here", "maxJobs": 3 } ``` - `video_id` is **required**, retrieve the `video_id` of the desired video using [GET /videos](/docs/api-pixverse-v2/get-pixverse-videos). - `replyUrl` is optional. This is the preferred and most optimal way to receive results quickly — the API polls every 10 seconds and will call the provided `replyUrl` once the PixVerse video is completed or failed. Maximum length 1024 characters. We recommend using sites like [webhook.site](https://webhook.site) to test callback URL functionality. Callback body has the same JSON shape as [GET /videos/`video_id`](/docs/api-pixverse-v2/get-pixverse-videos-video_id) response. - `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](/docs/api-pixverse-v2/get-pixverse-accounts-email) will be used. Valid range: 1…8 It should not exceed the number of concurrent generations supported by your account [subscription](https://app.pixverse.ai/subscribe) plan. ##### Responses **200** **200 OK** Use the returned `video_id` to retrieve video status and results using [GET /videos](/docs/api-pixverse-v2/get-pixverse-videos). Locate the video in the response array and check if the field `video_status_final` is `true` or `video_status_name` is `COMPLETED`. The field `url` will contain the generated video link. If you specify the optional parameter [`replyUrl`](#request-body), the API will call the provided `replyUrl` with video progress updates until the video is complete or fails. ```json { "video_id": "user:-pixverse:-video:" } ``` **400** **400 Bad Request** ```json { "error": "" } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized" } ``` **412** **412 Insufficient credits** Insufficient credits. All Credits have been used up. Please upgrade your membership or purchase credits. ```json { "error": "All Credits have been used up. Please upgrade your membership or purchase credits." } ``` **429** **429 Too Many Requests** Wait in a loop for **at least** 10..30 seconds and retry again. There are two possible cases for API response 429: 1. API query is full and can not accept new [videos/upscale](#request-headers) requests. Size of query defined by [`maxJobs` optional parameter](#request-body). ```json { "error": "Account is busy executing tasks." "All configured accounts are running at maximum capacity." } ``` 2. The API received an HTTP response status 429 from PixVerse. Please refer to your [subscription](https://app.pixverse.ai/subscribe) plan for the maximum allowed tasks in the queue. ```json { "error": "Reached the limit for concurrent generations." } ``` **596** **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](/docs/api-pixverse-v2/post-pixverse-accounts-email) before making any new API calls. ```json { "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 { // TypeScript, all fields are optional video_id: string error: string } ``` ##### Examples **Curl** ``` bash curl -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer …" \ -X POST "https://api.useapi.net/v2/pixverse/videos/upscale" \ -d '{"video_id": "…"}' ``` **JavaScript** ``` javascript const video_id = "video_id"; const apiUrl = `https://api.useapi.net/v2/pixverse/videos/upscale`; const token = "API token"; const data = { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' } }; data.body = JSON.stringify({ video_id }); const response = await fetch(apiUrl, data); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests video_id = "video_id" apiUrl = f"https://api.useapi.net/v2/pixverse/videos/upscale" token = "API token" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } body = { "video_id": f"{video_id}" } response = requests.post(apiUrl, headers=headers, json=body) print(response, response.json()) ``` === Cross-reference: General Q&A === For cross-cutting tips (rate limiting, prompt moderation, common patterns) see https://useapi.net/assets/aibot/qa.txt WARNING: Q&A items are general-purpose and may reference deprecated APIs, sunsetted services, or scenarios not applicable to the API documented above. Cross-check against this service's endpoint documentation before applying any Q&A guidance.