Render a txtreel video
chat_render_videoRender a txtreel conversation (script or messages) to an MP4 and wait for it to finish. This queues a render, waits for it, and returns once it is done (or after failing/timing out). A short render (a handful of messages) typically takes 20-60 seconds.
Returns a public link to the MP4; the file is deleted after 24 hours. If txtreel is busy or you hit the rate limit, the result is an error with the message.
Conversation script format (one event per line):
them: hey, you up? me: yeah why [pause 1.5] wait 1.5 s --- Today 9:41 PM date/time separator me: [photo URL] caption a photo (URL, local file path, or an uploaded photo's number) [them reacts ❤️] reaction on my last message [read] they read my messages === everything above is already on screen at the start === scroll 3 same, but open on the oldest message and skim down in 3 s
comment
"Name: text" also means "them" when Name matches contact.name (e.g. contact.name "Sam" lets you write "Sam: omg" instead of "them: omg"). A literal "\n" inside a message becomes a line break. Lines starting with # are comments.
Photos: "me: [photo https://example.com/image.jpg] optional caption" (https URLs only; local file paths are not available). "=== scroll 3" opens on the oldest message of a longer history and skims down to the live part in 3 s. With keyboard true (the default), the newest messages stay above the area where the Reels caption sits.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| speed | No | Pacing multiplier; 2 = twice as fast, 0.5 = half speed. Default: 1. | |
| theme | No | Color theme, "light" or "dark". Default: light. | |
| script | No | Conversation as a plain-text script. Use this OR messages, not both. Conversation script format (one event per line): them: hey, you up? me: yeah why [pause 1.5] wait 1.5 s --- Today 9:41 PM date/time separator me: [photo URL] caption a photo (URL, local file path, or an uploaded photo's number) [them reacts ❤️] reaction on my last message [read] they read my messages === everything above is already on screen at the start === scroll 3 same, but open on the oldest message and skim down in 3 s # comment "Name: text" also means "them" when Name matches contact.name (e.g. contact.name "Sam" lets you write "Sam: omg" instead of "them: omg"). A literal "\n" inside a message becomes a line break. Lines starting with # are comments. Photos: "me: [photo https://example.com/image.jpg] optional caption" (https URLs only; local file paths are not available). "=== scroll 3" opens on the oldest message of a longer history and skims down to the live part in 3 s. With keyboard true (the default), the newest messages stay above the area where the Reels caption sits. | |
| sounds | No | Real UI sounds: iOS key clicks while typing, the app's send and receive sounds. Default: true. | |
| contact | No | Contact header info. | |
| endHold | No | Seconds to hold on the final frame before the video ends. Default: 2. | |
| autoRead | No | Mark "me" messages as read as soon as the other person starts typing. Default: true. | |
| keyboard | No | Show the iOS keyboard, which keeps the latest messages above the Reels caption area. Default: true. | |
| messages | No | Conversation as an array of event objects instead of a script string (use this OR script, not both). Passed through to the txtreel API as-is; each item is one of: {from:"me"|"them", text, delay?, typing?, hold?, time?, instant?} (type "message" is the default and can be omitted), {type:"pause", seconds}, {type:"timestamp", text, instant?}, {type:"read", time?}, {type:"react", from:"me"|"them", emoji}. | |
| platform | No | Chat app to render: "imessage", "whatsapp", or "instagram". Default: imessage. | |
| startTime | No | Clock used for messages, read receipts, and WhatsApp bubble times, e.g. "9:41 PM". Default: 9:41 PM. | |
| statusBar | No | Phone status bar shown at the top of the frame. | |
| composerTyping | No | Type "me" messages into the input bar before sending them. Default: true. |