This endpoint allows you to render MP4 and WebM videos based on a video template created in the Advanced Editor and your properties. It's the same endpoint used to render images, the difference is that video renders are asynchronous.
POST Endpoint
https://get.renderform.io/api/v2/render
Sample request
curl --request POST \
--url https://get.renderform.io/api/v2/render \
--header 'X-API-KEY: <API_KEY>' \
--header 'Content-Type: application/json' \
--data '{
"template": "<TEMPLATE_ID>",
"outputFormat": "mp4",
"duration": 8000,
"fps": 30,
"data": {
"my-text-component-id.text": "Hello {John}!",
"my-image-component-id.src": "https://my-blog.com/my-image.jpg",
"my-video-component-id.src": "https://my-blog.com/my-clip.mp4"
}
}'
Request body
template(required) - template identifier of a video templatedata(optional) - values for the template propertiesoutputFormat(optional) -mp4orwebm, overrides the format set in the templateduration(optional) - length of the video in milliseconds (1000to30000), overrides the video length set in the templatefps(optional) - frame rate of the video,24,25or30(default30)fileName(optional) - custom file name for the generated videowebhookUrl(optional) - send response to the given URL as a POST requestmetadata(optional) - any key-value object can be used as metadata containerversion(optional) - used as cache differentiator, if you want to force re-rendering of the template
duration and fps can also be passed inside data using the _render prefix, which is handy when your integration only lets you send template properties:
{
"template": "<TEMPLATE_ID>",
"data": {
"my-text-component-id.text": "Hello {John}!",
"_render.duration": 8000,
"_render.fps": 25
}
}
Successful response
Video renders are always asynchronous. A successful request returns 202 status code, requestId, href with the URL where the video
will be available once it's rendered, and status set to pending.
{
"requestId": "febbd34c-cadf-43e6-926c-5942016aea4e",
"href": "https://cdn.renderform.io/.../febbd34c-cadf-43e6-926c-5942016aea4e.mp4",
"status": "pending"
}
The file under href does not exist yet. Poll the result endpoint below or use a webhook to find out when it's ready.
Error response
Unsuccessful response returns 400 status code with an error message in msg property and status with the HTTP status code.
Requests that your credit balance cannot cover return 402.
{
"msg": "Video renders are available only with output=json",
"status": 400
}
output=imageis not supported for video renders. The endpoint always responds with JSON for video templates.
GET Polling for the result
https://get.renderform.io/api/v2/results/{requestId}
Request the result every few seconds (3 seconds is a good interval) until status changes from pending to done or failed.
Rendering usually takes from a few seconds to a couple of minutes depending on the video length and frame rate.
Sample request
curl --request GET \
--url https://get.renderform.io/api/v2/results/febbd34c-cadf-43e6-926c-5942016aea4e \
--header 'X-API-KEY: <API_KEY>'
Sample response
{
"identifier": "febbd34c-cadf-43e6-926c-5942016aea4e",
"status": "done",
"type": "video",
"href": "https://cdn.renderform.io/.../febbd34c-cadf-43e6-926c-5942016aea4e.mp4",
"thumbnailHref": "https://cdn.renderform.io/.../febbd34c-cadf-43e6-926c-5942016aea4e.jpg",
"durationMs": 8000,
"width": 1080,
"height": 1080,
"templateName": "Product teaser",
"errorMessage": null,
"createdAt": "2026-09-02T10:15:08Z"
}
status-pendingwhile the video is being rendered,donewhen the file is ready,failedwhen the render failedtype-videofor video renders (image,screenshotorpreviewfor other results)href- URL of the rendered video, available whenstatusisdonethumbnailHref- URL of a JPEG poster frame of the video,nulluntil the render is donedurationMs- length of the rendered video in milliseconds,nulluntil the render is doneerrorMessage- reason of the failure whenstatusisfailed, otherwisenull
Pending video renders are also included in list results, so you can show a placeholder for them in your app.
Webhook
If you provide webhookUrl in the request (or configure a global webhook), RenderForm sends a RENDER_COMPLETE
POST request to your URL with requestId, href and the original request as soon as the video is ready, so you don't have to poll.
Credits
Every started second of video costs 10 credits (ceil(duration / 1000) * 10). Credits are charged when the request is accepted
and refunded if the render fails.
duration accepts 1000–30000 ms on every plan. When your credit balance does not cover the render, the API responds with 402.