---
title: "Create a video generation job"
method: POST
path: "/videos"
tags: ["Videos"]
---

# Create a video generation job

`POST /videos`

Creates a video generation job using the OpenAI-compatible Videos API.
Mirrors the OpenAI `POST /v1/videos` request body. Video generation is
asynchronous at every provider: this operation returns a `VideoJob`
immediately, the client polls `GET /videos/{video_id}` until `status`
is `completed`, then downloads the bytes from
`GET /videos/{video_id}/content`.

The request is sent as `multipart/form-data` so reference media can be
uploaded as binary. The non-standard `audio` field drives a
talking-avatar render: when present, the model lip-syncs
`input_reference` to the clip and the video lasts as long as the audio.

Not every provider implements the Videos API. Requests routed to a
provider that does not support it return `400 Bad Request` with an
explanatory error message.

## Query parameters

- `provider` 'ollama' | 'ollama_cloud' | 'groq' | 'llamacpp' | 'openai' | 'cloudflare' | 'cohere' | 'anthropic' | 'deepseek' | 'elevenlabs' | 'google' | 'mistral' | 'minimax' | 'moonshot' | 'nvidia' | 'zai'

## Response `200`

The created video generation job.

- VideoJob — A video generation job. Returned by `POST /videos` and `GET /videos/{video_id}`.
  - `id` string, required — Identifier of the video generation job. Opaque to clients - it may encode the provider - and must be sent back verbatim to `GET /videos/{video_id}`.
  - `object` 'video', required — The object type, which is always `video`.
  - `model` string, required — The model used to generate the video.
  - `status` 'queued' | 'in_progress' | 'completed' | 'failed', required — Current status of the job.
  - `progress` integer — Completion percentage of the render.
  - `created_at` integer, required — Unix timestamp (in seconds) of when the job was created.
  - `completed_at` integer, nullable — Unix timestamp (in seconds) of when the job finished, null while it is still running.
  - `seconds` string — Duration of the generated video in seconds, as a string.
  - `size` string — Resolution of the generated video as `widthxheight`.
  - `error` object, nullable — The error that caused the job to fail, null otherwise.
    - `code` string — Machine-readable error code.
    - `message` string — Human-readable error message.

## Other responses

- `400` — The selected provider does not implement the Videos API. The gateway returns this when a request is routed to a provider without video generation support.
- `401` — Unauthorized
- `500` — Internal server error

## Changes

- **2026-09-22** `4f908eb45832` — 1 info
  - added the new optional request property `reference_images`
- **2026-09-22** `a137b0cca33b` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/inference-gateway/apis/inference-gateway-api/changes/videos/post.md)

---

[API](https://skmtc.dev/inference-gateway/apis/inference-gateway-api.md) · [All operations](https://skmtc.dev/inference-gateway/apis/inference-gateway-api/llms.txt) · [OpenAPI document](https://skmtc.dev/inference-gateway/apis/inference-gateway-api/revisions/4f908eb45832?raw)
