Skip to main content
A Render combines one Character source, one Motion source, and optional background settings into a video. All Render endpoints require Authorization: Bearer YOUR_API_KEY. Two generations of the create flow share POST /v1/renders: a direct multipart/form-data request, and a JSON request against a draft prepared by Prepare Render. Field-by-field detail lives on the split reference pages: Prepare, Create, Watch, Download. Reading render state has moved to the unified Video resource, which also covers MiniMax H3 text-to-video generations: List Videos and Get Video replace the retired GET /v1/renders and GET /v1/renders/{render_id}.
There is no published cancellation operation for a Render. cancelled is a status a Render can reach on its own, but a client cannot request it.
GET /v1/renders and GET /v1/renders/{render_id} no longer accept GET — both now answer 405 Method Not Allowed rather than 404, since other methods (POST /v1/renders, and /events//download on the id path) remain registered on the same paths. A router only returns 404 when a path has no method registered at all. If you previously checked for a 404 to detect that these routes were gone, accept 405 too, or just switch to List Videos / Get Video directly.

Create a Render directly

POST /v1/renders with multipart/form-data. For both Character and Motion, choose either a reusable ID or a direct input.
Pricing (1 credit = 0.01):0.01): **0.01 per character in the render, per second** of the finished video. Only one character is supported per render today, so this is $0.01/second in practice, with no per-render minimum. The reservation made at creation time is an estimate; it’s finalized against the actual completed duration once the render finishes. See Pricing and retention.

Character input

Motion input

Render settings

bg_color is rejected unless background_mode=solid. transparent returns an additional alpha_url when ready. If neither input family is supplied at all, the server falls back to a preconfigured default character/motion rather than rejecting the request; supplying a family partially is still an error. That default is configured per project/environment, not fixed globally, so don’t rely on it beyond a quick smoke test — always supply an explicit character and motion source in production traffic.
links.self mirrors the retired GET /v1/renders/{render_id} path and no longer resolves. Use Get Video with the same id instead; links.events and links.download are unaffected.

Python example: create and poll

Create a Render from a prepared draft

POST /v1/renders/prepare returns a draft_id and any direct-upload plans required. Upload the declared media, then POST /v1/renders again with Content-Type: application/json, the draft_id, and a required Idempotency-Key header. This form answers 202, not 200. See Prepare Render for the full flow.

Get and list Renders

GET /v1/renders/{render_id} and GET /v1/renders are retired (405 Method Not Allowed). Fetching and listing render state now goes through the unified Video resource, which also covers MiniMax H3 text-to-video generations:
  • Get VideoGET /v1/videos/{video_id}, poll every 3–5 seconds until terminal, or use Watch Render instead.
  • List VideosGET /v1/videos, cursor-paginated, supports status, cursor, and limit.

Download a Render

GET /v1/renders/{render_id}/download
The endpoint redirects to the finished video. You can also download video_url from a ready Render response directly.

Response and status rules

Render response fields

This is the shape returned by Render Video (from Character and/or Motion). Get Video and List Videos return the same fields except links, which they omit entirely.