Render HTML
into vertical video
Send a self-contained HTML template, get back a pixel-perfect mp4 reel. One API call — deterministic frame-by-frame Chromium renders muxed with ffmpeg. Built for Reels, Shorts, TikTok, and programmatic video.
$ curl https://api.html2reel.com/v1/reels \
-H "X-API-Key: h2r_..." \
-d '{"html": "<...>", "duration_seconds": 15, "width": 1080, "height": 1920, "fps": 30}'
{
"job_id": "abc-123",
"status": "queued"
}What you get
Deterministic frame-by-frame render
Web Animations and timelines seeked per frame in headless Chromium — same input, byte-identical output. No realtime capture, no dropped frames.
mp4 out, h264 + AAC
ffmpeg muxes the frames with optional audio into a clean mp4. Plays out-of-the-box on Reels, Shorts, TikTok, iOS, Android.
Any aspect ratio
1080×1920 vertical, 1920×1080 horizontal, 1080×1080 square — declared per request alongside fps and duration.
Background audio with auto fade-out
Drop an audio_url alongside the html and the muxer pads, fades, and trims it cleanly to the reel's length. No abrupt cuts.
Sync poll or webhook
Poll the job and honour Retry-After, or pass a callback URL — works for one-off renders and high-volume batches alike.
R2-backed output
Rendered mp4s land on Cloudflare R2 and serve from a fast URL — no blobs sitting in your job rows.
See it in action
Same API, three flavors. Pick your stack.
# Submit a reel render
curl -X POST https://api.html2reel.com/v1/reels \
-H "X-API-Key: h2r_..." \
-H "Content-Type: application/json" \
-d '{
"html": "<!doctype html><html>...</html>",
"duration_seconds": 15,
"width": 1080,
"height": 1920,
"fps": 30,
"audio_url": "https://cdn.example.com/track.mp3"
}'
# Response
{"job_id":"abc-123","status":"queued"}
# Poll until done — "url" is the rendered mp4
curl https://api.html2reel.com/v1/reels/abc-123 \
-H "X-API-Key: h2r_..."html2reel is part of the 2LLM Suite — focused APIs that take messy inputs and produce clean, usable outputs. Also try scrape2llm and files2llm and html2media for the rest.