Video Generation API: Text-to-Video & Image-to-Video (Seedance, MiniMax)
Authenticate using Authorization: Bearer $MOYI_API_KEY. All endpoints include /v1.
| Method | Full path | Purpose |
|---|---|---|
| GET | /v1/models?type=video |
Models and supported parameters |
| POST | /v1/videos |
Create a job |
| GET | /v1/videos |
List your jobs |
| GET | /v1/videos/{video_id} |
Retrieve metadata |
| GET | /v1/videos/{video_id}/content |
Download completed video |
| DELETE | /v1/videos/{video_id} |
Delete a completed or failed job and its media |
OpenAPI specification. The job lifecycle follows OpenAI Videos. Use a Moyi API model ID and its supported parameters. Files API IDs, remix, editing, extensions, thumbnails and spritesheets are not supported.
Models
Models come from the current service. Values are case sensitive; GET /v1/models?type=video has the latest constraints. Check the API response for account availability.
Scroll the table horizontally for all parameters. — means the catalog does not list that option.
| Model / API ID | Type | Duration | Resolution | Aspect ratio | Catalog status |
|---|
Read current constraints from GET /v1/models?type=video. Models marked model_spec.offline are unavailable. Model pages with IDs, parameters and examples: all video models, Seedance 2.5 API, Seedance 2.0 API, MiniMax H3 API.
Create and retrieve
Send JSON or multipart/form-data. model and prompt are required; seconds is an integer string (default "4"). size is WIDTHxHEIGHT and must match a resolution and aspect ratio supported by the model. If omitted, the first resolution and aspect ratio in that model's catalog are used.
import os, time
from openai import OpenAI
client = OpenAI(api_key=os.environ["MOYI_API_KEY"], base_url="https://api.moyi-api.com/v1")
video = client.videos.create(
model="seedance-2-0-mini-text-to-video-basic",
prompt="A small dog running on grass", seconds="4", size="854x480",
extra_headers={"Idempotency-Key": "my-video-request-001"},
)
while video.status in ("queued", "in_progress"):
time.sleep(5)
video = client.videos.retrieve(video.id)
if video.status == "failed":
raise RuntimeError(video.error)
client.videos.download_content(video.id).write_to_file("video.mp4")
After uncertain submissions, retry only with the same Idempotency-Key and identical parameters. Metadata always returns JSON with id, object: "video", status, progress, created_at, completed_at, expires_at, seconds, size, and error. Timestamps use Unix seconds. Status is queued, in_progress, completed or failed.
Use input_reference: {"image_url":"https://..."} (or a data URL) for an input image; multipart also accepts a PNG, JPEG or WebP file in input_reference. Reference-image models receive it as a reference. Model-specific controls such as duration, resolution, aspect_ratio, audio, end frames and multiple reference assets remain extensions. Conflicting standard and native parameters are rejected.
Download, paginate and delete
Download using GET /v1/videos/{video_id}/content; only variant=video is supported. Incomplete jobs return 409; expired, deleted or inaccessible media returns 404. Media is retained for seven days, indicated by expires_at.
List with limit (1–100, default 20), order (asc or desc, default desc) and after (the previous page's last_id). Responses contain object: "list", data, first_id, last_id and has_more.
DELETE returns {"id":"video_id","object":"video.deleted","deleted":true}. It only deletes completed or failed jobs, never cancels generation. Deleted jobs cannot be retrieved or downloaded.
Workbench extensions
/v1/videos/catalog, /v1/videos/models, /v1/videos/quote, /v1/videos/{video_id}/request and /v1/videos/conversations support the website and are Moyi API extensions.