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

statusMeaningWhat to do
in_progressQueued or rendering at the model providerPoll again later
completedThe video is readyDownload video_url
failedThe provider rejected or could not finish the jobRead 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.

Reviewed by Enzo Lanne · Founder, VideoGenAPI ·