Peeling...
Generate AI videos programmatically. Same models, same quality, your codebase.
# 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"All API requests require an API key. Include it in the Authorization header.
Authorization: Bearer bpv_live_xxxxxxxxxxxx/api/generateStarts a new video generation. The video is generated asynchronously — use polling or a webhook callback to get the result.
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_IDPoll this endpoint to check the status of a generation. Use the id returned by the generate endpoint.
{
"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"
}Poll every 5-10 seconds. Generation typically takes 1-3 minutes depending on the model.
Instead of polling, you can provide a callback_url when creating a generation. We'll POST the result to your URL when the video is ready — no polling needed.
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"
}'When the video is ready (or fails), we send a POST request to your callback_url:
// 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));
}