Render video

4 min readSeptember 02, 2026

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 template
  • data (optional) - values for the template properties
  • outputFormat (optional) - mp4 or webm, overrides the format set in the template
  • duration (optional) - length of the video in milliseconds (1000 to 30000), overrides the video length set in the template
  • fps (optional) - frame rate of the video, 24, 25 or 30 (default 30)
  • fileName (optional) - custom file name for the generated video
  • webhookUrl (optional) - send response to the given URL as a POST request
  • metadata (optional) - any key-value object can be used as metadata container
  • version (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=image is 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 - pending while the video is being rendered, done when the file is ready, failed when the render failed
  • type - video for video renders (image, screenshot or preview for other results)
  • href - URL of the rendered video, available when status is done
  • thumbnailHref - URL of a JPEG poster frame of the video, null until the render is done
  • durationMs - length of the rendered video in milliseconds, null until the render is done
  • errorMessage - reason of the failure when status is failed, otherwise null

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 100030000 ms on every plan. When your credit balance does not cover the render, the API responds with 402.