Job status
Video generation is asynchronous. POST /api/v1/generate returns a generation_id right away; poll GET /api/v1/status/{id} until the job is completed or failed, then download the video from video_url.
curl -X GET "https://videogenapi.com/api/v1/status/GENERATION_ID" \
-H "Authorization: Bearer YOUR_API_KEY"
Status values
| status | Meaning | What to do |
|---|---|---|
| in_progress | Queued or rendering at the model provider | Poll again later |
| completed | The video is ready | Download video_url |
| failed | The provider rejected or could not finish the job | Read error, adjust the prompt, resubmit |
Completed response
{
"success": true,
"generation_id": "gen_6ac2c2fae2ef5_698522",
"status": "completed",
"type": "text-to-video",
"model": { "key": "kling-3", "name": "Kling 3" },
"video_url": "https://.../video.mp4",
"prompt": "A dancer spins in a sunlit studio",
"duration": 5,
"resolution": "1080p",
"processing_time": 212,
"completed_at": "2026-10-06 14:02:51",
"message": "Video generation completed successfully"
}
Failed response
A failed job still returns HTTP 200, with "success": false and an error string. Content-policy refusals land here; see the content guidelines and error codes.
{
"success": false,
"generation_id": "gen_6ac2c2fae2ef5_698522",
"status": "failed",
"model": { "key": "kling-3", "name": "Kling 3" },
"error": "Video generation failed",
"message": "Video generation failed"
}
How often to poll
Fast models such as Seedance 2.0 and Grok Imagine 1.5 finish in about 30 seconds; Kling 3 and Seedance 2.5 can take two to four minutes. Polling every 10 to 15 seconds with a 10-minute timeout covers every model. Status checks do not count against generation rate limits. Video completion webhooks are not available yet; see completion and polling.
import time, requests
def wait_for_video(generation_id, api_key, timeout=600, interval=12):
url = f"https://videogenapi.com/api/v1/status/{generation_id}"
headers = {"Authorization": f"Bearer {api_key}"}
deadline = time.time() + timeout
while time.time() < deadline:
data = requests.get(url, headers=headers, timeout=30).json()
if data["status"] == "completed":
return data["video_url"]
if data["status"] == "failed":
raise RuntimeError(data.get("error", "Generation failed"))
time.sleep(interval)
raise TimeoutError(f"{generation_id} still in progress after {timeout}s")
Full walkthroughs: Python, JavaScript and the generate endpoint.