Render/create a personalized batch

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:

MessageCause
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 longBackground 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
TimeStatusUser Agent
Retrieving recent requests…
LoadingLoading…

📘

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.

{
  "accepted": true, 
  "requestId": "FKdFTb5MciFRG1QD",
  "videoId": "63ea63c1c00dfe1a72cc7426"
}

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"
  }
}
Path Params
string
required

ID of a video, that you want to use as a source (should include tags). You can find ID in your video URL when you open it in our app.

Body Params
templateData
array of objects
required

An array of key-value objects, where each key represents tag in your template or API id of media that needs to be replaced. Value should have a real value that your final video should have. For each object you will have one video generated.

templateData*
tags
array of strings

You can add any custom tags to videos that will be generated by this request, so you can easier find them in the dashboard or in webhooks.

tags
boolean
Defaults to true

By default for each video rendered or errored account admin will receive notification, but you can disable it by setting this param to false

boolean
Defaults to false

If true, Elai will fit text into it's text box. The whole text block with tag will be replaced. More info here: https://elai.readme.io/reference/templates#replace-whole-text-block-on-canvas

boolean
Defaults to false

If true Elai will make all created videos public (they will be available for sharing using https://app.elai.io/v/:videoId link).

boolean
Defaults to true

By default we start rendering videos right after its creation, but you can turn it off for test purpose or other reason: videos will be just created but not rendered right away.

string

Your own custom identifier to mark current batch request for further processing (or it will be generated automatically)

Responses

videoId is present only when templateData held a single row. This is not a completion signal — see the note above.

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.

Language
Credentials
Header
LoadingLoading…
Response
Click Try It! to start a request and see the response here! Or choose an example:
application/json