Flow
Endpoints
| Step | Endpoint | Method |
|---|---|---|
| Submit | /v1/videos | POST |
| Poll | /v1/videos/{id} | GET |
| Download | /v1/videos/{id}/download | GET |
Full Example
import requests, time
# Step 1: Submit job
response = requests.post(
"https://api.runcrate.ai/v1/videos",
headers={
"Authorization": "Bearer rc_live_YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"model": "google/veo-3.0",
"prompt": "A cinematic sunrise over misty mountains",
"duration": 6,
},
)
job = response.json()
print("Job ID:", job["id"])
# Step 2: Poll for completion
while True:
poll = requests.get(
f"https://api.runcrate.ai/v1/videos/{job['id']}",
headers={"Authorization": "Bearer rc_live_YOUR_API_KEY"},
)
data = poll.json()
if data["status"] == "completed":
break
time.sleep(5)
# Step 3: Download the video
video = requests.get(
f"https://api.runcrate.ai/v1/videos/{job['id']}/download",
headers={"Authorization": "Bearer rc_live_YOUR_API_KEY"},
)
with open("video.mp4", "wb") as f:
f.write(video.content)
// Step 1: Submit job
const res = await fetch("https://api.runcrate.ai/v1/videos", {
method: "POST",
headers: {
"Authorization": "Bearer rc_live_YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "google/veo-3.0",
prompt: "A cinematic sunrise over misty mountains",
duration: 6,
}),
});
const job = await res.json();
// Step 2: Poll for completion
const poll = async () => {
const r = await fetch(`https://api.runcrate.ai/v1/videos/${job.id}`, {
headers: { "Authorization": "Bearer rc_live_YOUR_API_KEY" },
});
const data = await r.json();
if (data.status === "completed") return;
await new Promise(resolve => setTimeout(resolve, 5000));
return poll();
};
await poll();
// Step 3: Download
const video = await fetch(`https://api.runcrate.ai/v1/videos/${job.id}/download`, {
headers: { "Authorization": "Bearer rc_live_YOUR_API_KEY" },
});
# Step 1: Submit job
curl https://api.runcrate.ai/v1/videos \
-H "Content-Type: application/json" \
-H "Authorization: Bearer rc_live_YOUR_API_KEY" \
-d '{"model": "google/veo-3.0", "prompt": "A cinematic sunrise", "duration": 6}'
# Step 2: Poll status
curl https://api.runcrate.ai/v1/videos/VIDEO_ID \
-H "Authorization: Bearer rc_live_YOUR_API_KEY"
# Step 3: Download
curl https://api.runcrate.ai/v1/videos/VIDEO_ID/download \
-H "Authorization: Bearer rc_live_YOUR_API_KEY" \
--output video.mp4
Parameters
| Parameter | Type | Description |
|---|---|---|
model | string | Model ID (required) |
prompt | string | Text description (required) |
duration | integer | Video length in seconds |
aspect_ratio | string | 16:9 or 9:16 |
Available Video Models
| Model | Durations | Pricing | Notes |
|---|---|---|---|
| Sora 2 | 4, 8, 12s | Per second | OpenAI’s video model |
| Sora 2 Pro | 4, 8, 12s | Per second | Higher quality variant |
| Veo 2.0 | 5–8s | Per second | Google’s video model |
| Veo 3.0 | 4, 6, 8s | Per second | Latest Google model |
| Veo 3.0 Audio | 4, 6, 8s | Per second | Video with generated audio |
| Kling v3 | 3–15s | Per second | Continuous duration range |
| Seedance | 2–12s | Per second | ByteDance’s model |
| Hailuo 02 | 6, 10s | Per second | MiniMax’s model |
Job Statuses
| Status | Meaning |
|---|---|
queued | Job is waiting to start |
processing | Video is being generated |
completed | Ready for download |
failed | Generation failed |