For AI agents: visit https://elai.readme.io/llms.txt for an index of all pages formatted in Markdown and endpoints in OpenAPI. Append .md to any documentation page URL to get its markdown version.
Request to render or create a batch of videos (one or more) from a template.
At most 200 rows per request (templateData); beyond that the call is rejected with a 400. Every generated video also carries the tag api, whether or not you send tags — which is the simplest way to find API-created videos later.
❗️
This endpoint accepts work, it does not complete it
A 200 means the render was queued. Validation runs after the response is sent, so no render
failure can reach you as an HTTP status. Failures arrive as a video_error webhook, or as status: "error" on GET /videos/{videoId} if you poll.
Messages you may receive that way:
Message
Cause
Slide N is too long. Please limit speech to Xs.
Speech exceeds the global per-slide limit
Slide N is too long for this avatar. Please limit speech to Xs.
Speech exceeds this avatar's own limit, which is lower
Slide N uses a premium avatar that is no longer available...
The slide's premium avatar is not available to your plan
You do not have enough minutes to render this video...
No minutes left, and the workspace is not allowed to overrun
Your video has N slides but your plan allows only 3 slides to render.
Free plans render at most 3 slides
Video with music should be minimum 2 seconds long
Background music on a video shorter than 2s
If you cannot afford to miss a video_error — deliveries are single-attempt, with no retry —
reconcile with GET /videos instead of relying on the callback alone.
Recent Requests
Log in to see full request history
Time
Status
User Agent
Retrieving recent requests…
Loading…
📘
How to create personalized videos
Check how to use this API call to create personalized videos here.
If templateData contains only single item, then the identifier of the newly created video will be returned immediately in response, and webhook "video_ready" will be triggered too.
Otherwise, we will trigger a related webhook for each rendered video with related requestId and batchRowId, so you can map each videoId when it's ready to the data row in your request.
For example:
{
"event": "video_ready",
"requestId": "FKdFTb5MciFRG1QD",
"batchRowId": "0 - index of video in related batch request",
"video": {
"_id": "63ea63c1c00dfe1a72cc7426",
"other": "fields"
}
}
Responses
400
The request or the template is not usable. Every message below is a real rejection from this route.
403
The video belongs to another workspace.
404
The video does not exist, or the id is not a valid ObjectId.
429
The workspace has hit its video creation limit — a rolling 8-hour window, not a rate limit. The ceiling depends on the plan: 50 on Free, 1000 on Creator and Team, 6000 on Enterprise (services/security.js:80-88). The message names the limit and the window, which is how you tell a quota 429 from a rate-limit 429.
Updated 19 days ago
Did this page help you?
Yes
No
Language
ShellNodeRubyPHPPython
Credentials
Header
Header
Loading…
Response
Click Try It! to start a request and see the response here! Or choose an example:
application/json
200 - Multiple videos200 - Single video400 - templateData missing400 - templateData row empty400 - no placeholder tags400 - unsupported tag symbols400 - batch too large403 - Result404 - Result429 - Result