Documentation
Build personalized videos at scale with the Renderly API and visual editor — templates, overlays, webhooks, and a credit-based render pipeline.
Renderly turns a single template into thousands of personalized videos. You build the composition once — in the visual editor or directly via the API — then render variations by swapping in new text, images, video, or audio.
What you can do
- Render via API — send overlays + media URLs, get back an MP4. Three modes: direct, template-based, or project-based.
- Render via dashboard — drag together a video in the visual editor, then export.
- Personalize at scale — mark any overlay as a template variable and replace its content per render.
- Receive webhooks — subscribe to
render.completed/render.failedinstead of polling.
Pick a starting point
New here? Run through Getting Started — sign up, grab an API key, render your first video in ~5 minutes.
By role
- You're an engineer integrating the API → Getting Started → API keys → Rendering → Webhooks
- You're building reusable templates → Templates → Overlays reference
- You're using the dashboard / visual editor → Editor walkthrough → Templates
By task
| I want to… | Go to |
|---|---|
| Authenticate API requests | API keys |
| Upload media files | Uploading media |
| Create a video programmatically | Rendering |
| Generate personalized videos in bulk | Templates |
| Use text / image / video / audio / captions / effects | Overlays reference |
| Get notified when a render finishes | Webhooks |
| See every endpoint and field | API reference |
Core concepts in 30 seconds
- Composition —
width × height × fps × durationInFramesdefines the canvas. The whole video. - Overlay — one element on the timeline: text, image, video, sound, shape, sticker, caption, or effect. Each overlay has a position (
top/left/width/height), timing (from/durationInFrames), andstyles. - Render job — an async job that produces an MP4. You poll it or subscribe to a webhook.
- Credits — 1 credit = 1 minute of finished video. Any resolution. Never expires.
- Template variable — any overlay with
isDynamic: true. Its value is swapped per render via thereplacementsobject.
Quick example
A 3-second video with one line of text:
curl -X POST https://renderly.video/api/v1/renders \
-H "Authorization: Bearer rnd_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"inputProps": {
"backgroundColor": "#0a0e27",
"overlays": [{
"id": 0, "type": "text", "content": "Hello, Renderly",
"from": 0, "durationInFrames": 90,
"row": 0, "top": 800, "left": 60, "width": 960, "height": 200,
"styles": {
"fontSize": "4rem", "fontWeight": "900",
"color": "#FFFFFF", "textAlign": "center",
"animation": { "enter": "fade", "exit": "fade", "enterDuration": 0.4 }
}
}],
"durationInFrames": 90, "fps": 30,
"width": 1080, "height": 1920
}
}'You get back a jobId. Poll GET /renders/{jobId} until status: "COMPLETED", then grab the outputUrl.