PixVerse API 文生视频接入 — complete guide
端点概览
文生视频的 API 端点是:
POST https://app-api.pixverse.ai/openapi/v2/video/text/generate
这是 PixVerse API Platform 最常用的端点——输入文字提示词,返回一个 video_id,然后轮询状态直到完成。
请求头
App-Key: pixverse_your_api_key_here
AI-Trace-ID: uuid-string-for-tracking
Content-Type: application/json
请求体参数
{
"prompt": "一只橘色小猫坐在温暖的窗台上,阳光洒下来",
"model": "v6",
"duration": 8,
"aspect_ratio": "16:9",
"resolution": "1080p",
"voice": false,
"template_id": null
}
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
prompt | string | ✅ | 提示词文本 |
model | string | ❌ | 模型版本:v6 / v5 / v5.6(默认最新) |
duration | int | ❌ | 时长(秒):5 / 8 / 10 / 15 |
aspect_ratio | string | ❌ | "16:9" / "9:16" / "1:1" |
resolution | string | ❌ | "720p" / "1080p" |
voice | bool | ❌ | 是否开启原生音频(默认 false) |
template_id | string | ❌ | 使用的模板 ID |
响应示例
成功提交(HTTP 200)
{
"success": true,
"video_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": 5,
"estimated_time": 60
}
参数错误(HTTP 400)
{
"success": false,
"error_code": 1001,
"error_message": "prompt cannot be empty"
}
Python 完整示例
import requests
import uuid
import time
import os
class PixVerseAPI:
def __init__(self, api_key):
self.api_key = api_key
self.base_url = "https://app-api.pixverse.ai"
self.headers = {"App-Key": api_key}
def _trace_id(self):
return str(uuid.uuid4())
def text_to_video(self, prompt, model="v6", duration=8,
aspect_ratio="16:9", resolution="1080p",
voice=False, timeout=300):
"""完整的文生视频流程:提交 → 轮询 → 下载"""
# Step 1: 提交
submit = requests.post(
f"{self.base_url}/openapi/v2/video/text/generate",
headers={**self.headers, "AI-Trace-ID": self._trace_id()},
json={
"prompt": prompt,
"model": model,
"duration": duration,
"aspect_ratio": aspect_ratio,
"resolution": resolution,
"voice": voice
}
)
submit.raise_for_status()
video_id = submit.json()["video_id"]
# Step 2: 轮询状态
start = time.time()
while time.time() - start < timeout:
status = requests.get(
f"{self.base_url}/openapi/v2/video/status/{video_id}",
headers={**self.headers, "AI-Trace-ID": self._trace_id()}
).json()
state = status["status"]
if state == 1: # SUCCESS
break
elif state in (2, 3): # FAILED / TIMEOUT
raise Exception(f"生成失败:{status}")
time.sleep(10)
else:
raise Exception("生成超时")
# Step 3: 获取下载地址
download = requests.get(
f"{self.base_url}/openapi/v2/video/download/{video_id}",
headers={**self.headers, "AI-Trace-ID": self._trace_id()}
).json()
return download["url"]
def download_video(self, url, save_path):
"""下载视频到本地"""
os.makedirs(os.path.dirname(save_path) or ".", exist_ok=True)
with requests.get(url, stream=True) as r:
r.raise_for_status()
with open(save_path, "wb") as f:
for chunk in r.iter_content(chunk_size=8192):
f.write(chunk)
# 使用示例
api = PixVerseAPI("pixverse_your_api_key")
video_url = api.text_to_video(
prompt="一只橘色小猫坐在窗台上,阳光洒下来,轻微推进",
model="v6",
duration=8,
aspect_ratio="16:9",
resolution="1080p"
)
api.download_video(video_url, "./output/cat.mp4")
cURL 快速测试
# 1. 提交任务
curl -X POST "https://app-api.pixverse.ai/openapi/v2/video/text/generate" \
-H "App-Key: pixverse_your_api_key" \
-H "AI-Trace-ID: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"prompt": "一只橘色小猫坐在窗台上,阳光洒下来",
"model": "v6",
"duration": 8,
"aspect_ratio": "16:9",
"resolution": "1080p"
}'
# 2. 轮询状态(把 video_id 替换成上一步返回的值)
curl "https://app-api.pixverse.ai/openapi/v2/video/status/YOUR_VIDEO_ID" \
-H "App-Key: pixverse_your_api_key" \
-H "AI-Trace-ID: $(uuidgen)"
# 3. 获取下载地址
curl "https://app-api.pixverse.ai/openapi/v2/video/download/YOUR_VIDEO_ID" \
-H "App-Key: pixverse_your_api_key" \
-H "AI-Trace-ID: $(uuidgen)"
状态码参考
| status | 含义 | 处理 |
|---|---|---|
| 1 | 成功 | 调下载端点 |
| 2 | 失败 | 检查 error_message,可能是提示词问题 |
| 3 | 超时 | 考虑重试或联系支持 |
| 4 | 处理中 | 继续轮询 |
| 5 | 排队中 | 继续轮询 |
批量生产最佳实践
并发控制
同时提交多个任务时,控制并发数在 API 限制内:
import asyncio
import aiohttp
async def batch_generate(prompts, concurrency=5):
sem = asyncio.Semaphore(concurrency)
async def one(prompt):
async with sem:
return await generate_one(prompt)
tasks = [one(p) for p in prompts]
return await asyncio.gather(*tasks)
重试策略
def safe_generate(prompt, max_retries=3):
for attempt in range(max_retries):
try:
return api.text_to_video(prompt)
except Exception as e:
if "RATE_LIMITED" in str(e):
time.sleep(60 * (attempt + 1)) # 递增等待
elif attempt == max_retries - 1:
raise
return None
断点续跑
把生成结果存到数据库或 JSON 文件,批量任务中断后可以跳过已完成的:
completed = load_json("results.json")
prompts = load_json("prompts.json")
for prompt in prompts:
if prompt["id"] in completed:
continue
try:
url = api.text_to_video(prompt["text"])
completed[prompt["id"]] = url
save_json("results.json", completed)
except Exception as e:
print(f"失败:{prompt['id']} - {e}")
与 Web 界面的配合
API 返回的 video_id 可以在 Web 界面中查看——打开 PixVerse 控制台,你会看到通过 API 提交的任务,和手动生成的并排显示。
错误排查清单
- [ ] App-Key 是否正确(有没有多复制空格?)
- [ ] AI-Trace-ID 有没有每次都生成新的?
- [ ] prompt 是否为空?有没有超长?
- [ ] model 参数是不是支持的版本?
- [ ] Credits 是否足够?
- [ ] 速率限制是否被触发?