---
title: "Generate Video"
method: POST
path: "/v1/videos/generate"
tags: ["videos"]
---

# Generate Video

`POST /v1/videos/generate`

## Request

- Base URL: `https://api.corent.tech` (the document declares no server; this is the origin it was published from)
- URL: `https://api.corent.tech/v1/videos/generate`
- Auth: HTTP bearer

## Headers

- `Idempotency-Key` string, nullable

## Request body

- VideoGenerateRequest
  - `prompt` string, required
  - `style` string, nullable
  - `tier` string, nullable: Quality tier (preferred): air | lite | premium | pro | max_pro. See GET /v1/tiers for the live menu and prices.
  - `model` string, nullable: Direct model access: pin an exact model by name, e.g. "corent-seedance-2.0". GET /v1/models publishes every name in that `corent-` spelling, and it is what `meta.model` and the receipt answer with; older spellings of the same model (the bare name, historical route names) are still accepted here, so existing integrations keep working. Bypasses smart routing -- no substitution, flat cost-plus pricing, duration/resolution snap to the model's own menu. Mutually exclusive with tier.
  - `preference` string: LEGACY alias, still honored for backward compatibility: fast | cheap | quality | balanced. Ignored when tier is set — use tier instead.
  - `aspect_ratio` string, nullable: Frame shape, e.g. 16:9 | 9:16 | 1:1. Omit to let the model use its own default frame -- and on an image-to-video request (image_url set) omit it to animate the source image as-is, which is the only frame most image-to-video models can produce. Asking an image-to-video model for a shape it cannot reframe is rejected with a 400 and nothing is billed. "adaptive" (the source picture's or clip's own frame) is accepted on models that list it, and is the only value a first+last-frame, edit or extend request may name.
  - `duration_s` integer, nullable: Clip length in seconds, 1 to 60. Snapped to the chosen model's own menu; omit to let the model use its default.
  - `resolution` '720p' | '1080p' | '4k', nullable
  - `image_url` string, nullable
  - `webhook_url` string, nullable
  - `webhook_secret` string, nullable
  - `audio` boolean, nullable: Ask for native sound. Some models render audio and some are silent; Corent has always known which, and paid for the sound, without letting anyone ask for it. audio=true routes only to models that render sound, so a silent model can never quietly serve the request. audio=false prefers a silent model. Omit to let routing choose. `meta.has_audio` on the finished job says what was actually delivered.
  - `end_image_url` string, nullable: The frame the clip should END on. With image_url this is the go-from-A-to-B effect; on its own it is a target to move toward. Not every model supports it: `meta.unsupported_options` names anything the chosen model could not honour.
  - `camera` string, nullable: Camera move: static | pan_left | pan_right | zoom_in | zoom_out | orbit_left | orbit_right | tilt_up | tilt_down.
  - `negative_prompt` string, nullable: What must NOT appear in the clip.
  - `seed` integer, nullable: Reproducibility, same contract as the image endpoint.
  - `fps` integer, nullable: Frames per second, where the model offers a choice.
  - `enhance_prompt` boolean: Corent rewrites your prompt before dispatch. Set false to send it exactly as typed. Always off when reference assets are attached (the prompt is then a script that names them).
  - `reference_image_urls` string[], nullable: Pictures the clip should draw on (a character, a product, a setting). Up to 30 on corent-seedance-2.5 (refer to them in the prompt as "@Image 1", "@Image 2" in this order); up to 6 on corent-gemini-omni-1.1-flash (the model picks a 3 to 10 second length, so omit duration_s); up to 3 on corent-veo-3.1 and corent-veo-3.1-fast (always 8 seconds, adults only). Cannot be combined with image_url / end_image_url (those are the first/last FRAME; these are references). Photos of real people are refused by Seedance: generate the character inside Corent first, then reference that output (for a realistic face, a pinned corent-seedream-5.0-lite image's source_url, within 24 hours). GET /v1/models: supports_reference_images, max_reference_images, reference_duration_s. A REAL person on Seedance: verify them once in the Seedance asset library and pass the stored id here as asset://<asset id> (only corent-seedance-2.5 / 2.0 take these).
  - `reference_video_urls` string[], nullable: Clips to draw on, edit or continue: up to 10 on corent-seedance-2.5 (2-30s each, 30s in total, "@Video 1" in the prompt, mp4/mov, 24-60 fps); up to 3 on corent-gemini-omni-1.1-flash as references only (at most 3 seconds and 4 MB each). Required for task=edit and task=extend, which only corent-seedance-2.5 serves.
  - `reference_audio_urls` string[], nullable: Sound the clip should follow (a voice line, a beat): wav/mp3, 2-30s each, up to 10 on corent-seedance-2.5, 3 on the 2.0 family (which also needs at least one image or video alongside). "@Audio 1" in the prompt.
  - `task` 'auto' | 'reference' | 'edit' | 'extend', nullable: What to do with the references. auto (default): the model decides. reference: make a new clip that uses them. edit: change something in @Video 1 (keeps its length and frame; the prompt must say add / remove / replace / change; duration_s must be omitted). extend: continue @Video 1 (keeps its frame; the prompt must say extend / continue). Only meaningful with reference assets.
  - `return_last_frame` boolean: Also hand back the clip's final frame as a PNG (`videos[0].last_frame_url`, stored by Corent so it does not expire), to start the next shot exactly where this one ended. Models that cannot list it under `meta.unsupported_options`.
  - `output_format` 'mp4' | 'mov', nullable: Container for the delivered clip: mp4 (default) or mov.
  - `customer_id` string, nullable: Optional tag for YOUR end user, so you can attribute spend: 1 to 128 characters from A-Z a-z 0-9 . _ : @ -. Stored on the job, returned on receipts, and filterable with GET /v1/account/usage?customer_id=...

## Response `200`

Successful Response

- VideoGenerateResponse
  - `id` string, required
  - `status` string, required
  - `meta` AppRoutersVideosGenerationMeta, required
    - `model` string, required

## Other responses

- `202`: Accepted for asynchronous processing; result delivered by webhook.
- `400`: Invalid request (bad parameters or input).
- `401`: Missing or invalid API key.
- `402`: Insufficient prepaid balance.
- `403`: API key lacks the required capability scope.
- `404`: Unknown `model` name. GET /v1/models lists the menu, published in the `corent-` spelling; older spellings of the same model are still accepted, so this means the name matches no model at all.
- `422`: Prompt not allowed, or request failed validation.
- `429`: Rate limit, concurrency, or daily spend cap reached.
- `502`: Every eligible provider failed; try again.
- `503`: No provider currently available for this request.

---

[API](https://skmtc.dev/corent/apis/corent-api.md) · [All operations](https://skmtc.dev/corent/apis/corent-api/llms.txt) · [OpenAPI document](https://skmtc.dev/corent/apis/corent-api/revisions/57168ff53efe?raw)
