加载中...
以编程方式生成 AI 视频。同样的模型,同样的质量,在您的代码库中。
# 1. Start a generation
curl -X POST https://www.bananapro.video/api/generate \
-H "Authorization: Bearer bpv_live_xxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"prompt": "A cat astronaut floating in space",
"model": "seedance"
}'
# 2. Poll for the result
curl "https://www.bananapro.video/api/generation-status?id=YOUR_ID" \
-H "Authorization: Bearer bpv_live_xxxxxxxxxxxx"所有 API 请求都需要 API 密钥。请在 Authorization 请求头中包含它。
Authorization: Bearer bpv_live_xxxxxxxxxxxx/api/generate启动新的视频生成。视频异步生成 — 使用轮询或 Webhook 回调获取结果。
promptmodelaspectRatiodurationresolutionimageUrlcallback_url{
"success": true,
"data": {
"id": "fa6fd0ef-f5a8-44af-b8f4-565f0521f9cd",
"status": "processing",
"model": "seedance",
"prompt": "A cat astronaut floating in space",
"created_at": "2026-03-27T21:42:05.788Z"
},
"remaining_credits": 1450
}/api/generation-status?id=YOUR_ID轮询此端点以检查生成状态。使用生成端点返回的 id。
{
"id": "fa6fd0ef-...",
"status": "processing",
"video_url": null,
"thumbnail_url": null,
"created_at": "2026-03-27T21:42:05.788Z"
}{
"id": "fa6fd0ef-...",
"status": "completed",
"video_url": "https://fal.media/files/.../video.mp4",
"thumbnail_url": null,
"created_at": "2026-03-27T21:42:05.788Z"
}每 5-10 秒轮询一次。生成通常需要 1-3 分钟,具体取决于模型。
您可以在创建生成时提供 callback_url,而不是轮询。视频就绪后,我们会将结果 POST 到您的 URL — 无需轮询。
curl -X POST https://www.bananapro.video/api/generate \
-H "Authorization: Bearer bpv_live_xxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"prompt": "A cat astronaut floating in space",
"model": "seedance",
"callback_url": "https://your-app.com/webhook/video-ready"
}'当视频就绪(或失败)时,我们会向您的 callback_url 发送 POST 请求:
// POST to your callback_url
{
"id": "fa6fd0ef-...",
"status": "completed",
"video_url": "https://fal.media/files/.../video.mp4",
"thumbnail_url": null,
"created_at": "2026-03-27T21:42:05.788Z",
"completed_at": "2026-03-27T21:43:12.673Z"
}sora-2Sora 2OpenAI's flagship model - cinematic quality
veo-3.1Veo 3.1 FastGoogle's model with native audio
kling-2.6Kling 2.6 ProHigh-fidelity with audio support
kling-1.6-elementsKling ElementsMulti-image fusion (2-4 images)
wan-2.5Wan 2.5Ultra-realistic, best value
ray-3Ray 2 FlashLuma's fast creative generation
seedanceSeedance 1.0 LiteByteDance - fast & efficient
minimaxHailuo 02 StandardMiniMax - ultra-realistic humans
import requests
import time
API_KEY = "bpv_live_xxxxxxxxxxxx"
BASE_URL = "https://www.bananapro.video"
HEADERS = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
# 1. Start generation
response = requests.post(f"{BASE_URL}/api/generate", headers=HEADERS, json={
"prompt": "A cat astronaut floating in space",
"model": "seedance",
"aspectRatio": "16:9"
})
generation = response.json()
gen_id = generation["data"]["id"]
print(f"Generation started: {gen_id}")
print(f"Remaining credits: {generation['remaining_credits']}")
# 2. Poll until completed
while True:
status = requests.get(
f"{BASE_URL}/api/generation-status?id={gen_id}",
headers=HEADERS
).json()
if status["status"] == "completed":
print(f"Video ready: {status['video_url']}")
break
elif status["status"] == "failed":
print(f"Generation failed: {status.get('error')}")
break
time.sleep(5)const API_KEY = "bpv_live_xxxxxxxxxxxx";
const BASE_URL = "https://www.bananapro.video";
// 1. Start generation
const response = await fetch(`${BASE_URL}/api/generate`, {
method: "POST",
headers: {
"Authorization": `Bearer ${API_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
prompt: "A cat astronaut floating in space",
model: "seedance",
aspectRatio: "16:9"
})
});
const { data, remaining_credits } = await response.json();
console.log(`Generation started: ${data.id}`);
console.log(`Remaining credits: ${remaining_credits}`);
// 2. Poll until completed
while (true) {
const status = await fetch(
`${BASE_URL}/api/generation-status?id=${data.id}`,
{ headers: { "Authorization": `Bearer ${API_KEY}` } }
).then(r => r.json());
if (status.status === "completed") {
console.log(`Video ready: ${status.video_url}`);
break;
} else if (status.status === "failed") {
console.error(`Failed: ${status.error}`);
break;
}
await new Promise(r => setTimeout(r, 5000));
}