> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ai-stats.phaseo.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Video generation

> Create and manage async video jobs with the Python SDK.

**Methods**:

* `client.generate_video()`
* `client.list_videos()`
* `client.get_video()`
* `client.get_video_content()`
* `client.get_video_download_url()`
* `client.cancel_video()`
* `client.delete_video()`
* `client.list_video_models()`
* `client.get_async_job_websocket_url("video", video_id, ...)`
* `client.videos.websocket_url(video_id, ...)`
* `client.videos.create/list/get/content/download_url/cancel/delete/list_models()`

```python theme={null}
job = client.generate_video({
    "model": "openai/sora-2",
    "prompt": "A calm ocean at dusk",
    "output": {"access": "both"},
})

jobs = client.list_videos({"status": "queued,completed", "limit": 2})

status = client.get_video(job["id"])
websocket_url = client.videos.websocket_url(job["id"], interval_ms=1500)

if status.get("status") == "completed" and status.get("download_url"):
    print(status["download_url"])
```

The create call returns an async video job record. Poll `get_video()` for completion, then use `get_video_content()` or `get_video_download_url()` to retrieve output.

`list_videos()` returns the standard list envelope with `object: "list"` and a `data` array of async video jobs.

Use `client.videos.websocket_url(...)` when you want to subscribe to the documented `/v1/async/video/{id}/ws` lifecycle stream instead of polling only.
Use `client.get_async_job_websocket_url("video", job["id"], ...)` when you already have a generic async job kind/id pair and do not want to go through the resource helper.

`cancel_video()` is exposed, but the public video cancel route currently returns a structured `501 not_implemented_yet` error while provider-level cancellation is standardized.
