[40 credits] [paid plans: + 40 per AI still unless ai_mode none; dry_run quotes] Turns a public web page into a narrated video: AI voiceover, motion graphics, optional subtitles. Asynchronous (minutes, sometimes past fifteen): returns a receipt with the video_id at once; get_video for the full status. A page behind a login is filmed only with a capture session from the VS Code or browser extension (Scale plan and up).
View input schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Public http(s) page to film; you must have the right to."
},
"goal": {
"default": "explainer",
"type": "string",
"enum": [
"explainer",
"ad",
"demo",
"tutorial",
"article"
],
"description": "What the video is for; shapes the script."
},
"aspect_ratio": {
"default": "16:9",
"type": "string",
"enum": [
"16:9",
"9:16",
"1:1",
"4:5"
],
"description": "9:16 (Reels/Shorts) films the page's MOBILE layout in a phone viewport; 16:9, 1:1 and 4:5 film the 1280-wide desktop layout."
},
"language": {
"type": "string",
"enum": [
"en",
"fr",
"es",
"de",
"it",
"pt",
"nl",
"ar",
"hi",
"ko",
"pl",
"tr",
"sv"
],
"description": "Language of the script and voiceover. Omitted: the page's own language, else its country domain's (.fr, .de…), else the account's."
},
"target_seconds": {
"default": 45,
"type": "integer",
"minimum": 15,
"maximum": 180,
"description": "Length asked for: the words are written to fit it."
},
"subtitles": {
"default": true,
"type": "boolean",
"description": "Burn captions in and emit a .vtt sidecar."
},
"tone": {
"default": "energetic",
"type": "string",
"maxLength": 80,
"description": "Narration delivery, e.g. calm, or a short direction."
},
"voice": {
"default": "auto",
"type": "string",
"enum": [
"auto",
"Kore",
"Zephyr",
"Puck",
"Charon",
"Aoede",
"Fenrir",
"Leda",
"Orus",
"Callirrhoe",
"Achird",
"Sulafat",
"Sadachbia"
],
"description": "Narrator (all multilingual). auto picks a voice that fits the goal and tone and differs from the site's previous films."
},
"music": {
"default": "auto",
"type": "string",
"anyOf": [
{
"enum": [
"auto",
"none",
"uplift",
"corporate",
"chill",
"cinematic",
"ambient",
"pulse",
"playful",
"warm"
]
},
{
"pattern": "^asset:[A-Za-z0-9_-]{1,64}$"
}
],
"description": "Music bed, \"none\", or \"asset:<id>\" (upload_asset). auto fits the goal and differs from the site's previous films."
},
"brand_name": {
"type": "string",
"maxLength": 60,
"description": "Name on the intro and outro cards; default the site's."
},
"focus": {
"type": "string",
"maxLength": 2000,
"description": "Context the page cannot show (an offer, the audience, a code, what to avoid). Anything here may be voiced as FACT in the customer's voice; a line in quotation marks is placed verbatim, usually as the hook."
},
"idempotency_key": {
"type": "string",
"minLength": 8,
"maxLength": 128,
"description": "Same key within 24 h returns the original video, uncharged. Without one, an identical call within 120 s returns the first video (idempotent_replay)."
},
"theme": {
"type": "object",
"additionalProperties": false,
"properties": {
"mode": {
"type": "string",
"enum": [
"dark",
"light",
"brand"
],
"description": "dark (default), light, or brand (your colours fill the frame, white type)."
},
"colors": {
"type": "array",
"maxItems": 2,
"items": {
"type": "string",
"pattern": "^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"
},
"description": "Up to 2 hex accents, most important first, with real chroma and distinct hues; one the film cannot paint with is refused with the measurement. detect_brand reads a site's."
},
"font": {
"type": "string",
"enum": [
"sans",
"serif",
"mono"
],
"description": "Type category. Implied by font_family when you set one."
},
"font_family": {
"type": "string",
"description": "A face from list_themes; any other is refused."
},
"corners": {
"type": "string",
"enum": [
"sharp",
"soft",
"round"
],
"description": "Corner language for cards, chips and bars."
},
"positive": {
"type": "string",
"description": "Hex colour washed over a scene marked mood WIN. Defaults to your first accent."
},
"negative": {
"type": "string",
"description": "Hex colour washed over a scene marked mood PROBLEM. Defaults to red."
}
},
"description": "Palette, type and mode; list_themes has the presets and rules, detect_brand reads a site's. Omitted: a filmed video adopts the page's CSS."
},
"intro": {
"type": "boolean",
"description": "Opening title card (1.5 s). Omitted: true, except goal \"ad\" (opens on its hook)."
},
"outro": {
"default": true,
"type": "boolean",
"description": "Closing call-to-action card."
},
"routing": {
"type": "object",
"description": "{planner?: flash|pro, footage?: prefer-recorded|record-fresh}. flash is the benched default (pro is a choice, not an upgrade); prefer-recorded reuses the site's banked flow recordings."
},
"look": {
"default": "auto",
"type": "string",
"enum": [
"clean",
"bold",
"editorial",
"playful",
"tech",
"auto"
],
"description": "The film's look: captions, cutting, sound cues, music family and motion together; auto varies with goal, shape and the site's films (list_video_options)."
},
"caption_style": {
"type": "string",
"enum": [
"karaoke",
"bold",
"boxed",
"minimal",
"outline"
],
"description": "Overrides the look's captions."
},
"caption_animation": {
"type": "string",
"enum": [
"none",
"pop",
"bounce",
"wave",
"glow",
"slide"
],
"description": "What a spoken word does; overrides the look's."
},
"caption_emphasis": {
"type": "string",
"enum": [
"manual",
"auto",
"none"
],
"description": "Brand-coloured words: **asterisked** (manual), plus figures (auto), or none."
},
"grade": {
"type": "string",
"enum": [
"none",
"warm",
"cool",
"vivid",
"mono",
"vintage",
"contrast"
],
"description": "Footage colour grade; overrides the look's."
},
"sfx_level": {
"type": "string",
"enum": [
"off",
"subtle",
"full"
],
"description": "Sound-design loudness; overrides the look's."
},
"callout": {
"type": "string",
"enum": [
"none",
"ring",
"arrow",
"underline",
"dim"
],
"description": "What points at a screencast's subject."
},
"cursor_style": {
"type": "string",
"enum": [
"arrow",
"hand",
"dot",
"none"
],
"description": "The pointer a recording draws."
},
"press_effect": {
"type": "string",
"enum": [
"punch",
"freeze",
"slowmo",
"none"
],
"description": "What the picture does on a click."
},
"end_screen": {
"type": "string",
"enum": [
"cta",
"qr",
"social",
"logo",
"none"
],
"description": "The closing card."
},
"edit_style": {
"type": "string",
"enum": [
"tiktok_punchy",
"documentary",
"corporate",
"cinematic"
],
"description": "Cutting rhythm (list_motions); a scene's own transition still wins."
},
"ai_mode": {
"type": "string",
"enum": [
"none",
"assist",
"rich"
],
"description": "AI visuals for beats the page cannot show (paid plans): none; assist = a few stills; rich = stills and clips within ai_budget. Omitted: assist where the plan generates, else none. Charged per visual, refunded on failure."
},
"ai_budget": {
"type": "object",
"properties": {
"max_clips": {
"type": "integer",
"minimum": 0
},
"max_images": {
"type": "integer",
"minimum": 0
},
"on_exceed": {
"type": "string",
"enum": [
"refuse",
"queue",
"fallback"
],
"description": "Over the ceiling. refuse (default): create_animation creates nothing; create_video, planned after the call, keeps to the ceiling. fallback: renders, generating only up to the ceiling. queue: generates all."
}
},
"description": "Ceiling on AI visuals, given to the planner."
},
"model": {
"type": "string",
"maxLength": 60,
"description": "Clip model (list_models) for ai_mode rich, or auto (routed per scene, see optimize); omit for the house clip."
},
"optimize": {
"type": "string",
"enum": [
"quality",
"balanced",
"speed",
"cost"
],
"description": "With model auto: quality, balanced (default), speed or cost."
},
"quality_gate": {
"type": "object",
"additionalProperties": false,
"properties": {
"min_score": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"on_fail": {
"type": "string",
"enum": [
"auto_fix",
"hold",
"deliver"
]
}
},
"description": "auto_fix (default): dead air and colliding overlays fixed before rendering (auto_fixes). hold: also, a film scored under min_score ends \"held\" until release_video. deliver: as authored."
},
"generate_motion": {
"type": "boolean",
"description": "Custom motion graphics for beats no built-in visual fits (AI plans or a film pass, else built-in)."
},
"outputs": {
"type": "array",
"minItems": 1,
"maxItems": 4,
"uniqueItems": true,
"items": {
"type": "string",
"enum": [
"16:9",
"9:16",
"1:1",
"4:5"
]
},
"description": "One storyboard in 1-4 shapes: the first is this video (replaces aspect_ratio), each other a sibling (get_video formats), a render each, started when the first ends."
},
"draft": {
"type": "boolean",
"description": "Free preview: 1/3 resolution, DRAFT mark, no AI visuals. 5/hour. rerender_video without draft then makes the paid film, no re-plan."
},
"callback_url": {
"type": "string",
"format": "uri",
"description": "https URL POSTed a JSON event when the render ends (done/held/error/cancelled), 3 tries. Verify: X-PageToVid-Signature = \"sha256=\" + hex HMAC-SHA256(secret, X-PageToVid-Timestamp + \".\" + raw body); refuse timestamps over 5 min old. Secret: webhook_secret, shown once, or rotate_webhook_secret."
},
"dry_run": {
"type": "boolean",
"description": "Quote only; nothing made or charged."
},
"max_credits": {
"type": "integer",
"minimum": 0,
"maximum": 1000000,
"description": "Refuse (budget_exceeded + quote) above this."
},
"pronunciations": {
"type": "array",
"maxItems": 50,
"items": {
"type": "object",
"required": [
"text",
"say"
],
"additionalProperties": false,
"properties": {
"text": {
"type": "string",
"maxLength": 60
},
"say": {
"type": "string",
"maxLength": 120
}
}
},
"description": "Voice-only lexicon, e.g. [{\"text\":\"Nginx\",\"say\":\"engine x\"}]; captions keep the text."
}
},
"required": [
"url"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}