{"version":"2026-10-08","updated_at":"2026-10-08","base_url":"https://api.reelsbuilder.ai/api/v1","human_docs":"https://reelsbuilder.ai/docs/api/video-matrix","layers":[{"id":"visuals","description":"What you see: stock library, your YouTube video, an AI model, or a presenter."},{"id":"url_inputs","description":"Content you point us at (YouTube/channel URLs, images, your clips, logo/site)."},{"id":"niche","description":"Which footage library (clip_type); also picks the music folder."},{"id":"purpose","description":"Editorial angle (content_purpose) of the script or the clip selection."},{"id":"script","description":"What is said: a brief we write from, or your script read word for word."},{"id":"voice","description":"Who says it: voice, gender, speed, language."},{"id":"captions","description":"On-screen words: on/off, style, language."},{"id":"music","description":"Background track and level; AI video native audio."},{"id":"brand","description":"Logo, colours, name and website (per request or the account brand)."},{"id":"format","description":"Shape, length and quality."},{"id":"delivery","description":"Where results go: private delivery, webhooks, trace ids."}],"modes":[{"id":"stock","endpoint":"/api/v1/generate-and-post","method":"POST","maturity":7,"recommended":true,"description":"Narrated short-form video cut from a licensed stock library (or your own clips), with captions, music and your brand. The B2B workhorse.","idempotency":"required","required_one_of":[["prompt","topic","script"]],"receipt":{"http_status":202,"job_id":"data.job_id","video_id":"data.video_id","poll_url":"data.poll_url"},"layers":{"visuals":{"supported":true,"note":"Licensed stock footage chosen per script segment from the niche library. Metadata exclusions cannot identify mistagged imagery.","fields":[{"name":"footage_keywords","type":"array<string>","default":null,"required":false,"effect":"Visual search hints for automatic stock selection; at most 32 terms of 100 characters. Narration is unchanged."},{"name":"exclude_keywords","type":"array<string>","default":null,"required":false,"effect":"Reject automatic stock clips matching literal whole-word metadata phrases (simple plurals supported); at most 32 terms of 100 characters. Unlabelled fallback is refused; explicit caller assets are preserved."}]},"url_inputs":{"supported":true,"note":"brand.logo_url and brand.website_url are listed under brand.","fields":[{"name":"asset_urls","type":"array<string>","format":"uri","default":null,"required":false,"effect":"Your own video clips used as the background instead of stock. Not yet SSRF-validated: send only public https media URLs."}]},"niche":{"supported":true,"fields":[{"name":"clip_type","type":"string","enum":["premium","luxury","motivational","luxury_woman","default/money","tech","tech/abstract","tech/ai","tech/startup","tech/cyber","tech/futurism","tech/hardware","tech/minimal","business","business/office","business/hustle","business/success","business/entrepreneur","finance","finance/trading","finance/crypto","finance/wealth","finance/banking","travel","travel/beaches","travel/cities","travel/adventure","travel/nomad","health","health/fitness","health/yoga","health/nutrition","health/mental","ecommerce","ecommerce/products","ecommerce/shipping","ecommerce/online","mindset","mindset/growth","mindset/discipline","mindset/stoic","mindset/resilience","spiritual","spiritual/meditation","spiritual/energy","spiritual/dark_aesthetic","food","food/cooking","food/plating","food/drinks","urban","urban/nightlife","urban/street","urban/architecture","urban/aerial","realestate","realestate/luxury","realestate/interior","realestate/pools","automotive","default/cars","automotive/driving","default/jets","nature","nature/mountains","nature/forest","nature/water","nature/sunset","abstract","abstract/particles","abstract/gradients","abstract/geometric","abstract/liquid","satisfying","gym","default/houses","Space","tools","art","relaxing","soothing","useful_hacks","wood_works","overlays/particles","overlays/light_leaks","overlays/glitches","overlays/film_grain","overlays/bokeh","overlays/smoke","overlays/vj_loops","colors/gold","colors/neon","colors/black","places/new_york","places/dubai","places/tokyo","events/christmas","events/halloween","events/new_years"],"default":"business","required":false,"aliases":["clipType"],"effect":"Footage library (and music folder). Default: inferred from brand.industry/keywords and the brief, else business. Unknown values are rejected."}]},"purpose":{"supported":true,"fields":[{"name":"content_purpose","type":"string","enum":["education","sales","awareness","product_demo","case_study","news","entertainment"],"default":null,"required":false,"effect":"Editorial angle of the generated script."}]},"script":{"supported":true,"fields":[{"name":"prompt","type":"string","default":null,"required":false,"effect":"Brief we write the script from (merged with topic when both are sent)."},{"name":"topic","type":"string","default":null,"required":false,"effect":"Short subject line; combined with prompt."},{"name":"script","type":"string","default":null,"required":false,"effect":"Your narration, read word for word and never cut. Disables cta and include_hook (put them in the script)."},{"name":"cta","type":"object|string","max_length":120,"default":null,"required":false,"effect":"Closing call to action appended to a GENERATED script ({ text } or a bare string)."},{"name":"include_hook","type":"boolean","default":null,"required":false,"aliases":["include_hook_line","includeHookLine"],"effect":"true: open with a researched hook line (English); false: forbid any hook; omitted: natural opening."},{"name":"content_style","type":"string","enum":["professional","educational","inspirational","energetic","calm","entertaining"],"default":"professional","required":false,"aliases":["video_style"],"effect":"Script tone and pacing."}]},"voice":{"supported":true,"fields":[{"name":"voice_id","type":"string","default":null,"required":false,"aliases":["voice"],"effect":"ElevenLabs voice id. Default: picked from voice_gender, else the brand tone."},{"name":"voice_gender","type":"string","enum":["female","male"],"default":null,"required":false,"aliases":["voiceGender"],"effect":"Default-voice pick when voice_id is omitted."},{"name":"voice_speed","type":"number","min":0.7,"max":1.3,"default":1,"required":false,"effect":"Narration speed; generated scripts are sized for it."},{"name":"language","type":"string","enum":["af","am","ar","as","az","be","bg","bn","bs","ca","ceb","cs","cy","da","de","el","en","es","et","fa","fi","fil","fr","ga","gl","gu","ha","he","hi","hr","hu","hy","id","is","it","ja","jv","ka","kk","km","kn","ko","ky","lb","ln","lo","lt","lv","mk","ml","mn","mr","ms","mt","my","ne","nl","no","pa","pl","ps","pt","ro","ru","sd","si","sk","sl","so","sq","sr","sv","sw","ta","te","th","tr","uk","ur","uz","vi","zh"],"default":null,"required":false,"aliases":["voice_language"],"effect":"ISO 639-1 narration + script language. Default: detected from the brief. Unsupported voice languages return 400."}]},"captions":{"supported":true,"fields":[{"name":"include_captions","type":"boolean","default":true,"required":false,"aliases":["captions"],"effect":"Burned-in captions."},{"name":"caption_style.preset","type":"string","enum":["highlight","classic","none"],"default":"highlight","required":false,"aliases":["caption_style (string)","hormozi→highlight","standard|minimal|news→classic"],"effect":"highlight: 1-3 word chunks, spoken word coloured. classic: bold phrases. none: no captions. A bare string caption_style is read as the preset."},{"name":"caption_style.text_color","type":"string","pattern":"^#[0-9a-fA-F]{6}$","default":"#FFFFFF","required":false,"effect":"Caption text colour."},{"name":"caption_style.highlight_color","type":"string","pattern":"^#[0-9a-fA-F]{6}$","default":null,"required":false,"aliases":["caption_highlight_color"],"effect":"Spoken-word colour (highlight preset). Default brand accent/primary, else #FFD60A."},{"name":"caption_style.position","type":"string","enum":["lower_third","center","top"],"default":"lower_third","required":false,"aliases":["caption_position (bottom|middle)"],"effect":"Vertical caption anchor."},{"name":"caption_style.font_size","type":"string","enum":["small","medium","large"],"default":"large","required":false,"effect":"Caption size."},{"name":"caption_language","type":"string","default":null,"required":false,"aliases":["captionLanguage"],"effect":"ISO 639-1 caption language when it differs from the narration (captions are translated)."}]},"music":{"supported":true,"fields":[{"name":"music.enabled","type":"boolean","default":true,"required":false,"aliases":["include_music","includeMusic"],"effect":"Licensed background music from the niche's folder."},{"name":"music.volume","type":"number","min":0,"max":1,"default":0.35,"required":false,"aliases":["music_volume"],"effect":"Music level under the voice."}]},"brand":{"supported":true,"note":"Default: the API account's brand profile. brand_id (+ optional customer_id) selects a saved brand kit (POST /api/v1/b2b/brands), or website_url reuses / builds the kit for that domain before billing; inline brand fields override the kit.","fields":[{"name":"brand_id","type":"string","min_length":1,"max_length":128,"pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$","default":null,"required":false,"effect":"Saved brand kit id from POST /api/v1/b2b/brands; owner checked before billing."},{"name":"customer_id","type":"string","min_length":1,"max_length":128,"pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$","default":null,"required":false,"effect":"Optional customer scope for the saved kit; never widens access."},{"name":"brand.name","type":"string","min_length":1,"max_length":80,"default":null,"required":false,"effect":"Per-video brand that REPLACES the account brand (nothing is merged). Brand name woven into a generated script."},{"name":"brand.website_url","type":"string","max_length":2048,"pattern":"^https:\\/\\/","format":"uri","default":null,"required":false,"effect":"https URL; said in the closing line of a generated script when no cta is sent."},{"name":"brand.logo_url","type":"string","max_length":2048,"pattern":"^https:\\/\\/","format":"uri","default":null,"required":false,"effect":"Public https PNG/JPG burned in as the logo watermark. IP literals and internal hosts are rejected (SSRF guard)."},{"name":"brand.primary_color","type":"string","pattern":"^#[0-9a-fA-F]{6}$","default":null,"required":false,"effect":"Brand colour; spoken-word caption colour when accent_color is absent."},{"name":"brand.accent_color","type":"string","pattern":"^#[0-9a-fA-F]{6}$","default":null,"required":false,"effect":"Spoken-word (highlight) caption colour unless caption_style.highlight_color is sent."},{"name":"brand.tone","type":"string","enum":["professional","casual","energetic","bold","calm","analytical"],"default":null,"required":false,"effect":"Script tone."},{"name":"brand.industry","type":"string","min_length":1,"max_length":80,"default":null,"required":false,"effect":"Script context; also infers clip_type (footage niche) when clip_type is omitted."},{"name":"brand.keywords","type":"array<string>","max_items":10,"max_length":40,"default":null,"required":false,"effect":"Terms the script should use; also used to infer clip_type."},{"name":"include_branding","type":"boolean","default":true,"required":false,"aliases":["includeRBBranding"],"effect":"ReelsBuilder watermark; false removes it on a paid plan."}]},"format":{"supported":true,"fields":[{"name":"aspect_ratio","type":"string","enum":["9:16"],"default":"9:16","required":false,"effect":"Stock renders 1080x1920 portrait only; any other value returns 400."},{"name":"duration_target_sec","type":"number","min":15,"max":120,"default":30,"required":false,"aliases":["duration"],"effect":"Target length; the script is sized to it."},{"name":"progress_bar","type":"object|boolean","default":{"enabled":false,"position":"bottom"},"required":false,"aliases":["progress_bar_enabled (boolean)","progress_bar: true|false"],"effect":"Optional in-video progress bar (off by default): { enabled, position: \"top\" | \"bottom\" (default bottom), color: \"#RRGGBB\" (default the brand accent, accentOnDark) }. A thin (8 px) bar that fills left to right over the video, flush with the very edge. Bottom is a known retention pattern; Instagram's UI may overlap the bottom edge. progress_bar_enabled: true is an alias for { enabled: true }."}]},"delivery":{"supported":true,"fields":[{"name":"delivery.visibility","type":"string","enum":["private"],"default":null,"required":false,"aliases":["visibility","private_cdn: true","options.visibility"],"effect":"\"private\": media goes to a private bucket; poll_url returns a short-lived signed link instead of a public URL."},{"name":"listing","type":"string","enum":["private","public"],"default":"private","required":false,"effect":"\"public\" lists the finished video on its public page, Discover, the sitemap and feeds. Default \"private\": nothing is listed or indexed; the media URL is unchanged."},{"name":"webhook_url","type":"string","format":"uri","default":null,"required":false,"effect":"Public https URL called once when the job ends (signed with X-ReelsBuilder-Signature)."},{"name":"agent_run_id","type":"string","default":null,"required":false,"effect":"Your trace id, echoed in the receipt meta and webhook body."},{"name":"platforms","type":"array<string>","enum":["youtube","youtube_shorts","instagram","tiktok","facebook","facebook_reels","x","x_twitter"],"default":null,"required":false,"effect":"Recorded as metadata only; nothing is posted."},{"name":"schedule_at","type":"string","format":"date-time","default":null,"required":false,"effect":"Recorded as metadata only."}]}}},{"id":"clips","endpoint":"/api/v1/clipper/youtube","method":"POST","maturity":8,"recommended":true,"description":"Short clips cut from one YouTube video, or the next new upload of a channel (autoclipper). The speaker's own words, voice and audio.","idempotency":"required","required_one_of":[["youtube_url","channel_url"]],"receipt":{"http_status":200,"job_id":"data.job_id (also top-level jobId)","video_id":"data.video_id","poll_url":"data.poll_url"},"receipt_schema":{"type":"object","properties":{"job_id":{"type":"string","minLength":1},"video_id":{"type":"string","minLength":1},"status":{"type":"string","const":"queued"},"poll_url":{"type":"string","pattern":"^\\/api\\/v1\\/jobs\\/[^/]+$"},"requested_clip_count":{"type":"integer","minimum":1,"maximum":10},"source_video":{"type":"object","properties":{"youtube_video_id":{"type":"string","minLength":1},"title":{"type":"string"},"url":{"type":"string","format":"uri"}},"required":["youtube_video_id","title","url"],"additionalProperties":false,"description":"Channel mode: the upload that was selected."},"price_usd_cents":{"type":"integer","minimum":0,"description":"API credits charged for this request, in USD cents."},"delivery":{"type":"object","additionalProperties":{},"description":"Private delivery receipt, when private delivery was requested."}},"required":["job_id","video_id","status","poll_url","requested_clip_count"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"input_schema":{"type":"object","properties":{"youtube_url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https:\\/\\/(?:youtu\\.be\\/[a-zA-Z0-9_-]{11}\\/?(?:\\?[^\\s#]*)?|(?:(?:www|m|music)\\.)?youtube\\.com\\/(?:watch\\?v=[a-zA-Z0-9_-]{11}(?:&[^\\s#]*)?|(?:shorts|live|embed)\\/[a-zA-Z0-9_-]{11}\\/?(?:\\?[^\\s#]*)?))(?:#[^\\s]*)?$","description":"One YouTube video to clip. Send exactly one of youtube_url or channel_url."},"channel_url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https:\\/\\/(?:(?:www|m)\\.)?youtube\\.com\\/(?:@[A-Za-z0-9._-]{3,100}|channel\\/UC[A-Za-z0-9_-]{22}|c\\/[A-Za-z0-9._-]{1,100}|user\\/[A-Za-z0-9._-]{1,100})(?:\\/(?:videos|featured|streams))?\\/?(?:\\?[^\\s#]*)?$","description":"Autoclipper: clip the channel's next upload this account has not clipped yet (newest first). Call on your own cadence, e.g. daily per channel."},"selection":{"type":"string","enum":["newest_first","oldest_first"],"description":"Channel mode only. Default newest_first."},"dry_run":{"type":"boolean","description":"Free: validate, price and (channel mode) resolve the video that would be clipped, without queueing or charging."},"clip_count":{"type":"integer","minimum":1,"maximum":10,"description":"Maximum requested clips; provider can return fewer."},"aspect_ratio":{"type":"string","enum":["9:16","16:9","1:1"]},"captions":{"type":"boolean"},"focus":{"type":"string","minLength":1,"maxLength":250},"content_purpose":{"type":"string","enum":["education","sales","awareness","product_demo","case_study","news","entertainment"]},"listing":{"type":"string","enum":["private","public"],"default":"private","description":"Private by default: excluded from public pages and discovery. Set public to opt in. Separate from private media delivery."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"layers":{"visuals":{"supported":true,"note":"Your YouTube video, reframed (face tracking).","fields":[]},"url_inputs":{"supported":true,"fields":[{"name":"youtube_url","type":"string","max_length":2048,"pattern":"^https:\\/\\/(?:youtu\\.be\\/[a-zA-Z0-9_-]{11}\\/?(?:\\?[^\\s#]*)?|(?:(?:www|m|music)\\.)?youtube\\.com\\/(?:watch\\?v=[a-zA-Z0-9_-]{11}(?:&[^\\s#]*)?|(?:shorts|live|embed)\\/[a-zA-Z0-9_-]{11}\\/?(?:\\?[^\\s#]*)?))(?:#[^\\s]*)?$","format":"uri","default":null,"required":false,"effect":"One YouTube video (watch, youtu.be, shorts, live, embed). Send exactly one of youtube_url / channel_url."},{"name":"channel_url","type":"string","max_length":2048,"pattern":"^https:\\/\\/(?:(?:www|m)\\.)?youtube\\.com\\/(?:@[A-Za-z0-9._-]{3,100}|channel\\/UC[A-Za-z0-9_-]{22}|c\\/[A-Za-z0-9._-]{1,100}|user\\/[A-Za-z0-9._-]{1,100})(?:\\/(?:videos|featured|streams))?\\/?(?:\\?[^\\s#]*)?$","format":"uri","default":null,"required":false,"effect":"Autoclipper: clips the channel's next upload this account has not clipped yet."},{"name":"selection","type":"string","enum":["newest_first","oldest_first"],"default":"newest_first","required":false,"effect":"Channel mode order."}]},"niche":{"supported":false,"note":"The source video is the footage."},"purpose":{"supported":true,"fields":[{"name":"content_purpose","type":"string","enum":["education","sales","awareness","product_demo","case_study","news","entertainment"],"default":null,"required":false,"effect":"Steers which existing moments are picked (never rewrites what is said)."},{"name":"focus","type":"string","min_length":1,"max_length":250,"default":null,"required":false,"effect":"Natural-language moment filter, e.g. \"where they discuss pricing\"."}]},"script":{"supported":false,"note":"The speaker's own words."},"voice":{"supported":false,"note":"The speaker's own voice. Transcript language is auto-detected; no language field yet."},"captions":{"supported":true,"note":"On/off only; no caption_style or caption_language yet.","fields":[{"name":"captions","type":"boolean","default":true,"required":false,"effect":"Burned-in captions (clean B2B style, no emoji)."}]},"music":{"supported":false,"note":"Original audio."},"brand":{"supported":false,"note":"No logo overlay or brand colours on clips yet."},"format":{"supported":true,"fields":[{"name":"aspect_ratio","type":"string","enum":["9:16","16:9","1:1"],"default":"9:16","required":false,"effect":"9:16 vertical, 16:9 wide, 1:1 fit."},{"name":"clip_count","type":"integer","min":1,"max":10,"default":5,"required":false,"effect":"Maximum clips (provider may return fewer). Billed per clip: undelivered clips are refunded automatically."}]},"delivery":{"supported":true,"fields":[{"name":"dry_run","type":"boolean","default":false,"required":false,"effect":"Resolve and report the source video without queueing or charging."},{"name":"delivery.visibility","type":"string","enum":["private"],"default":null,"required":false,"aliases":["visibility","private_cdn: true","options.visibility"],"effect":"\"private\": media goes to a private bucket; poll_url returns a short-lived signed link instead of a public URL."},{"name":"listing","type":"string","enum":["private","public"],"default":"private","required":false,"effect":"\"public\" lists the finished video on its public page, Discover, the sitemap and feeds. Default \"private\": nothing is listed or indexed; the media URL is unchanged."},{"name":"webhook_url","type":"string","format":"uri","default":null,"required":false,"effect":"Public https URL called once when the job ends (signed with X-ReelsBuilder-Signature)."},{"name":"agent_run_id","type":"string","default":null,"required":false,"effect":"Your trace id, echoed in the receipt meta and webhook body."}]}}},{"id":"ai_video","endpoint":"/api/v1/videos/text-to-video","method":"POST","maturity":6,"recommended":true,"description":"AI-model video from a text prompt (Seedance, Veo, Kling, Wan…), finished with music, optional narration, captions and brand.","idempotency":"required","receipt":{"http_status":200,"job_id":"jobId","video_id":"videoId","poll_url":null,"note":"Top-level jobId (no data envelope); poll /api/v1/jobs/{jobId}. Model and tier are in the X-Api-Credits-Model / X-Api-Credits-Tier headers."},"layers":{"visuals":{"supported":true,"fields":[{"name":"prompt","type":"string","min_length":1,"max_length":1000,"default":null,"required":true,"aliases":["topic"],"effect":"What is SHOWN (the visual brief), not what is said."},{"name":"quality_tier","type":"string","enum":["low","medium","high","xhigh","max"],"default":null,"required":false,"effect":"Picks a model: low=wan-3.0, medium=kling-3.0-standard, high=kling-3.0-pro, xhigh=bytedance/seedance-2.0, max=google/veo-3.1. model wins when both are sent."},{"name":"model","type":"string","enum":["google/veo-3.1","bytedance/seedance-2.0","fal-ai/wan/v2.7","fal-ai/ltx-2.3","fal-ai/pixverse/v6","wan-3.0","kling-3.0-standard","kling-3.0-pro"],"default":"bytedance/seedance-2.0","required":false,"effect":"Exact model id."}]},"url_inputs":{"supported":true,"fields":[{"name":"reference_image_urls","type":"array<string>","format":"uri","default":null,"required":false,"effect":"Style/composition anchors on models that support them (e.g. max 3 on Veo 3.1). Any URL format is accepted; no SSRF host check yet."}]},"niche":{"supported":false,"note":"The model generates the footage."},"purpose":{"supported":true,"note":"Purpose only acts through narration; without script/content_purpose the video is unnarrated.","fields":[{"name":"content_purpose","type":"string","enum":["education","sales","awareness","product_demo","case_study","news","entertainment"],"default":null,"required":false,"effect":"With no script: a narration script is written for this purpose (adds narration, captions and the narrated price). It does not change the visuals."}]},"script":{"supported":true,"fields":[{"name":"script","type":"string","max_length":2000,"default":null,"required":false,"effect":"Narration spoken word for word (~2.4 words/s: ~72 words for 30s, ~144 for 60s). Slightly over budget adds one priced shot; far over returns 400."}]},"voice":{"supported":true,"note":"Only with narration (script or content_purpose). No language field: narration follows the script's language.","fields":[{"name":"voice_id","type":"string","pattern":"^[A-Za-z0-9_-]{6,64}$","default":null,"required":false,"effect":"ElevenLabs voice for the narration."},{"name":"voice_gender","type":"string","enum":["female","male"],"default":"female","required":false,"effect":"Default narration voice when voice_id is omitted."}]},"captions":{"supported":true,"note":"On/off only; caption colour follows brand.accent_color. No caption_style yet.","fields":[{"name":"captions","type":"boolean","default":true,"required":false,"effect":"Word-highlight captions of the narration; no effect without narration."}]},"music":{"supported":true,"fields":[{"name":"music","type":"boolean","default":true,"required":false,"effect":"Licensed instrumental bed (ducked under native audio). No price change."},{"name":"native_audio","type":"boolean","default":null,"required":false,"effect":"Keep the model's own soundtrack. Default off on kling-3.0-standard/pro (priced extra when on), on elsewhere."}]},"brand":{"supported":true,"note":"No account-brand fallback: send brand per request, or brand_id for a saved brand kit (POST /api/v1/b2b/brands).","fields":[{"name":"brand_id","type":"string","min_length":1,"max_length":128,"pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$","default":null,"required":false,"effect":"Saved brand kit id from POST /api/v1/b2b/brands; owner checked before billing."},{"name":"customer_id","type":"string","min_length":1,"max_length":128,"pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$","default":null,"required":false,"effect":"Optional customer scope for the saved kit; never widens access."},{"name":"brand.name","type":"string","min_length":1,"max_length":80,"default":null,"required":false,"effect":"Per-request brand: logo watermark (bottom-right), caption colour, name/website in a generated script. Brand name woven into a generated script."},{"name":"brand.website_url","type":"string","max_length":2048,"pattern":"^https:\\/\\/","format":"uri","default":null,"required":false,"effect":"https URL; said in the closing line of a generated script when no cta is sent."},{"name":"brand.logo_url","type":"string","max_length":2048,"pattern":"^https:\\/\\/","format":"uri","default":null,"required":false,"effect":"Public https PNG/JPG burned in as the logo watermark. IP literals and internal hosts are rejected (SSRF guard)."},{"name":"brand.primary_color","type":"string","pattern":"^#[0-9a-fA-F]{6}$","default":null,"required":false,"effect":"Brand colour; spoken-word caption colour when accent_color is absent."},{"name":"brand.accent_color","type":"string","pattern":"^#[0-9a-fA-F]{6}$","default":null,"required":false,"effect":"Spoken-word (highlight) caption colour unless caption_style.highlight_color is sent."},{"name":"brand.tone","type":"string","enum":["professional","casual","energetic","bold","calm","analytical"],"default":null,"required":false,"effect":"Script tone."},{"name":"brand.industry","type":"string","min_length":1,"max_length":80,"default":null,"required":false,"effect":"Script context; also infers clip_type (footage niche) when clip_type is omitted."},{"name":"brand.keywords","type":"array<string>","max_items":10,"max_length":40,"default":null,"required":false,"effect":"Terms the script should use; also used to infer clip_type."}]},"format":{"supported":true,"fields":[{"name":"duration_sec","type":"number","enum":[30,60],"default":30,"required":false,"aliases":["options.duration"],"effect":"Length: 30 or 60 s, assembled from coherent native shots (a single native clip length is also accepted)."},{"name":"aspect_ratio","type":"string","enum":["9:16","16:9","1:1"],"default":"9:16","required":false,"aliases":["options.aspect_ratio"],"effect":"Output shape."},{"name":"resolution","type":"string","enum":["480p","720p","1080p","1440p","2160p"],"default":null,"required":false,"aliases":["options.resolution"],"effect":"Model resolution (model default when omitted; prices differ)."}]},"delivery":{"supported":true,"fields":[{"name":"delivery.visibility","type":"string","enum":["private"],"default":null,"required":false,"aliases":["visibility","private_cdn: true","options.visibility"],"effect":"\"private\": media goes to a private bucket; poll_url returns a short-lived signed link instead of a public URL."},{"name":"listing","type":"string","enum":["private","public"],"default":"private","required":false,"effect":"\"public\" lists the finished video on its public page, Discover, the sitemap and feeds. Default \"private\": nothing is listed or indexed; the media URL is unchanged."},{"name":"webhook_url","type":"string","format":"uri","default":null,"required":false,"effect":"Public https URL called once when the job ends (signed with X-ReelsBuilder-Signature)."},{"name":"agent_run_id","type":"string","default":null,"required":false,"effect":"Your trace id, echoed in the receipt meta and webhook body."}]}}},{"id":"ai_video_image","endpoint":"/api/v1/videos/image-to-video","method":"POST","maturity":6,"recommended":true,"description":"AI-model video that animates your image, with the same finishing as text-to-video.","idempotency":"required","receipt":{"http_status":200,"job_id":"jobId","video_id":"videoId","poll_url":null,"note":"Top-level jobId (no data envelope); poll /api/v1/jobs/{jobId}. Model and tier are in the X-Api-Credits-Model / X-Api-Credits-Tier headers."},"layers":{"visuals":{"supported":true,"fields":[{"name":"prompt","type":"string","min_length":1,"max_length":1000,"default":null,"required":true,"aliases":["motion_prompt"],"effect":"Motion/scene brief for the image."},{"name":"quality_tier","type":"string","enum":["low","medium","high","xhigh","max"],"default":null,"required":false,"effect":"Picks a model: low=wan-3.0, medium=kling-3.0-standard, high=kling-3.0-pro, xhigh=bytedance/seedance-2.0, max=google/veo-3.1. model wins when both are sent."},{"name":"model","type":"string","enum":["google/veo-3.1","bytedance/seedance-2.0","fal-ai/wan/v2.7","fal-ai/ltx-2.3","fal-ai/pixverse/v6","wan-3.0","kling-3.0-standard","kling-3.0-pro"],"default":"bytedance/seedance-2.0","required":false,"effect":"Exact model id."}]},"url_inputs":{"supported":true,"fields":[{"name":"image_url","type":"string","format":"uri","default":null,"required":true,"aliases":["imageUrl"],"effect":"The image to animate (first frame / reference)."},{"name":"reference_image_urls","type":"array<string>","format":"uri","default":null,"required":false,"effect":"Style/composition anchors on models that support them (e.g. max 3 on Veo 3.1). Any URL format is accepted; no SSRF host check yet."}]},"niche":{"supported":false,"note":"The model generates the footage."},"purpose":{"supported":true,"note":"Purpose only acts through narration; without script/content_purpose the video is unnarrated.","fields":[{"name":"content_purpose","type":"string","enum":["education","sales","awareness","product_demo","case_study","news","entertainment"],"default":null,"required":false,"effect":"With no script: a narration script is written for this purpose (adds narration, captions and the narrated price). It does not change the visuals."}]},"script":{"supported":true,"fields":[{"name":"script","type":"string","max_length":2000,"default":null,"required":false,"effect":"Narration spoken word for word (~2.4 words/s: ~72 words for 30s, ~144 for 60s). Slightly over budget adds one priced shot; far over returns 400."}]},"voice":{"supported":true,"note":"Only with narration (script or content_purpose). No language field: narration follows the script's language.","fields":[{"name":"voice_id","type":"string","pattern":"^[A-Za-z0-9_-]{6,64}$","default":null,"required":false,"effect":"ElevenLabs voice for the narration."},{"name":"voice_gender","type":"string","enum":["female","male"],"default":"female","required":false,"effect":"Default narration voice when voice_id is omitted."}]},"captions":{"supported":true,"note":"On/off only; caption colour follows brand.accent_color. No caption_style yet.","fields":[{"name":"captions","type":"boolean","default":true,"required":false,"effect":"Word-highlight captions of the narration; no effect without narration."}]},"music":{"supported":true,"fields":[{"name":"music","type":"boolean","default":true,"required":false,"effect":"Licensed instrumental bed (ducked under native audio). No price change."},{"name":"native_audio","type":"boolean","default":null,"required":false,"effect":"Keep the model's own soundtrack. Default off on kling-3.0-standard/pro (priced extra when on), on elsewhere."}]},"brand":{"supported":true,"note":"No account-brand fallback: send brand per request, or brand_id for a saved brand kit (POST /api/v1/b2b/brands).","fields":[{"name":"brand_id","type":"string","min_length":1,"max_length":128,"pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$","default":null,"required":false,"effect":"Saved brand kit id from POST /api/v1/b2b/brands; owner checked before billing."},{"name":"customer_id","type":"string","min_length":1,"max_length":128,"pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$","default":null,"required":false,"effect":"Optional customer scope for the saved kit; never widens access."},{"name":"brand.name","type":"string","min_length":1,"max_length":80,"default":null,"required":false,"effect":"Per-request brand: logo watermark (bottom-right), caption colour, name/website in a generated script. Brand name woven into a generated script."},{"name":"brand.website_url","type":"string","max_length":2048,"pattern":"^https:\\/\\/","format":"uri","default":null,"required":false,"effect":"https URL; said in the closing line of a generated script when no cta is sent."},{"name":"brand.logo_url","type":"string","max_length":2048,"pattern":"^https:\\/\\/","format":"uri","default":null,"required":false,"effect":"Public https PNG/JPG burned in as the logo watermark. IP literals and internal hosts are rejected (SSRF guard)."},{"name":"brand.primary_color","type":"string","pattern":"^#[0-9a-fA-F]{6}$","default":null,"required":false,"effect":"Brand colour; spoken-word caption colour when accent_color is absent."},{"name":"brand.accent_color","type":"string","pattern":"^#[0-9a-fA-F]{6}$","default":null,"required":false,"effect":"Spoken-word (highlight) caption colour unless caption_style.highlight_color is sent."},{"name":"brand.tone","type":"string","enum":["professional","casual","energetic","bold","calm","analytical"],"default":null,"required":false,"effect":"Script tone."},{"name":"brand.industry","type":"string","min_length":1,"max_length":80,"default":null,"required":false,"effect":"Script context; also infers clip_type (footage niche) when clip_type is omitted."},{"name":"brand.keywords","type":"array<string>","max_items":10,"max_length":40,"default":null,"required":false,"effect":"Terms the script should use; also used to infer clip_type."}]},"format":{"supported":true,"fields":[{"name":"duration_sec","type":"number","enum":[30,60],"default":30,"required":false,"aliases":["options.duration"],"effect":"Length: 30 or 60 s, assembled from coherent native shots (a single native clip length is also accepted)."},{"name":"aspect_ratio","type":"string","enum":["9:16","16:9","1:1"],"default":"9:16","required":false,"aliases":["options.aspect_ratio"],"effect":"Output shape."},{"name":"resolution","type":"string","enum":["480p","720p","1080p","1440p","2160p"],"default":null,"required":false,"aliases":["options.resolution"],"effect":"Model resolution (model default when omitted; prices differ)."}]},"delivery":{"supported":true,"fields":[{"name":"delivery.visibility","type":"string","enum":["private"],"default":null,"required":false,"aliases":["visibility","private_cdn: true","options.visibility"],"effect":"\"private\": media goes to a private bucket; poll_url returns a short-lived signed link instead of a public URL."},{"name":"listing","type":"string","enum":["private","public"],"default":"private","required":false,"effect":"\"public\" lists the finished video on its public page, Discover, the sitemap and feeds. Default \"private\": nothing is listed or indexed; the media URL is unchanged."},{"name":"webhook_url","type":"string","format":"uri","default":null,"required":false,"effect":"Public https URL called once when the job ends (signed with X-ReelsBuilder-Signature)."},{"name":"agent_run_id","type":"string","default":null,"required":false,"effect":"Your trace id, echoed in the receipt meta and webhook body."}]}}},{"id":"ai_influencer","endpoint":"/api/v1/videos/ai-influencer","method":"POST","maturity":6,"recommended":true,"description":"A presenter (saved persona or one photo) speaks your script with lip-synced narration. format presenter_broll is the organic AI-explainer edit: layout creator (default, 9:16) is the creator edit: a purpose-driven storyboard, the presenter only on the hook, opinion/payoff lines and the close (at most 2.5 s at a time and 35% of the runtime, a punch-in step each time), full-screen stock footage and motion graphics everywhere else, cuts timed to the words, every visual changing within 4 s, short burned captions and subtle sound effects; layout split shows topic visuals in the top half for the whole video and the presenter, cropped chest-up, in the bottom half with a caption on the seam; layout cutaway keeps the presenter full frame and cuts to full-screen stock B-roll. metadata.storyboard (every shot with its purpose and rationale) and metadata.qa (4-second rule, presenter exposure, cut timing, loudness) come with the video. Send topic instead of script and we write a hook-first script.","idempotency":"required","required_one_of":[["image_url","avatar_id","presenter_video_url"]],"receipt":{"http_status":200,"job_id":"jobId","video_id":"videoId","poll_url":null,"note":"Top-level jobId; engine and estimated seconds in X-Api-Credits-Engine / X-Api-Credits-Estimated-Seconds. Completed artifacts do not report durationSec yet."},"input_schema":{"type":"object","properties":{"image_url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https:\\/\\/"},"avatar_id":{"type":"string","minLength":1,"maxLength":64},"presenter_video_url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https:\\/\\/"},"engine":{"type":"string","enum":["avatar_iii","avatar_iv","avatar_v"]},"format":{"type":"string","enum":["talking_head","presenter_broll"]},"script":{"type":"string","minLength":1,"maxLength":2000},"topic":{"type":"string","minLength":1,"maxLength":500},"duration_sec":{"type":"integer","minimum":15,"maximum":90},"content_purpose":{"type":"string","enum":["education","sales","awareness","product_demo","case_study","news","entertainment"]},"broll":{"type":"object","properties":{"coverage":{"type":"number","minimum":0.2,"maximum":0.8},"footage_keywords":{"type":"array","items":{"type":"string","minLength":1,"maxLength":100},"maxItems":32},"exclude_keywords":{"type":"array","items":{"type":"string","minLength":1,"maxLength":100},"maxItems":32},"clip_type":{"type":"string","minLength":1,"maxLength":64},"visuals":{"type":"string","enum":["stock","generated","mixed"]}},"additionalProperties":false},"layout":{"type":"string","enum":["creator","split","cutaway"]},"caption_style":{"type":"string","enum":["seam","karaoke"]},"presenter_placement":{"type":"string","enum":["bottom_left","bottom_center"]},"host":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","const":"avatar"}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"logo"},"logo_url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https:\\/\\/"},"style":{"type":"string","enum":["cube","card","auto"]},"show_url":{"type":"boolean"},"url_text":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[\\p{L}\\p{N}][\\p{L}\\p{N} ._/:&+-]*$"}},"required":["type"],"additionalProperties":false}]},"progress_bar":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"enabled":{"type":"boolean"},"position":{"type":"string","enum":["top","bottom"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"}},"required":["enabled"],"additionalProperties":false}]},"progress_bar_enabled":{"type":"boolean"},"outro":{"type":"boolean"},"outro_cta":{"type":"string","minLength":1,"maxLength":40},"voice_id":{"type":"string","minLength":1,"maxLength":100},"voice_gender":{"type":"string","enum":["female","male"]},"speed":{"type":"number","minimum":0.5,"maximum":1.5},"aspect_ratio":{"type":"string","enum":["9:16","16:9","1:1"]},"captions":{"type":"boolean"},"music":{"type":"boolean"},"brand":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"website_url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https:\\/\\/"},"logo_url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https:\\/\\/"},"primary_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"accent_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"tone":{"type":"string","enum":["professional","casual","energetic","bold","calm","analytical"]},"industry":{"type":"string","minLength":1,"maxLength":80},"keywords":{"type":"array","items":{"type":"string","minLength":1,"maxLength":40},"maxItems":10}},"additionalProperties":false},"content_stage":{"type":"string","enum":["awareness","consideration","decision"]},"content_type":{"type":"string","enum":["educational","infographic","statistic","checklist","hot_take","summary","comparison","how_to","case_study","insight","myth_vs_fact","alternatives","review","versus","demo","objection","pricing_explainer"]},"mode":{"type":"string","minLength":1,"maxLength":40},"submode":{"type":"string","minLength":1,"maxLength":60},"custom_ai_video_instructions":{"type":"string"},"instructions":{"type":"string","minLength":1,"maxLength":1000},"series_id":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$"},"variations":{"type":"object","properties":{"count":{"type":"integer","minimum":1,"maximum":5},"vary":{"type":"array","items":{"type":"string","enum":["hook","angle","content_type","presenter"]},"minItems":1,"maxItems":4},"presenters":{"type":"array","items":{"type":"string","minLength":1,"maxLength":64},"minItems":2,"maxItems":5}},"required":["count"],"additionalProperties":false},"variation_ref":{"type":"object","properties":{"set_id":{"type":"string","pattern":"^vs_[a-f0-9]{24}$"},"index":{"type":"integer","minimum":0,"maximum":4}},"required":["set_id","index"],"additionalProperties":false}},"additionalProperties":true,"$schema":"http://json-schema.org/draft-07/schema#"},"layers":{"visuals":{"supported":true,"fields":[{"name":"avatar_id","type":"string","min_length":1,"max_length":64,"default":null,"required":false,"aliases":["avatarId"],"effect":"A persona from POST /api/v1/avatars (cheapest, engine choice)."},{"name":"engine","type":"string","enum":["avatar_iii","avatar_iv","avatar_v"],"default":null,"required":false,"effect":"Render engine. avatar_id default avatar_iii; image_url always avatar_iv."},{"name":"broll.visuals","type":"string","enum":["stock","generated","mixed"],"default":"stock","required":false,"effect":"presenter_broll creator / split: what the full-screen shots (creator) or the top half (split) show. stock (default): the top half mostly shows motion graphics we render ourselves in your accent colour (the message thread, notification, inbox, number, steps, comparison or quote the line is about), real stock footage where a real-world scene helps, and headline cards; no AI images. generated (opt-in): the same graphics, with AI scene stills for the footage moments (at most about 1 shot in 4). mixed (opt-in): graphics and real footage, AI stills only when no footage fits. Graphics and cards are rendered on our servers (no third party). Stock footage comes from licensed free-stock libraries (Pixabay, Coverr; free commercial use, no attribution required) and our own library. People shown in stock footage are never presented as endorsing you or your product. Generated visuals are produced by a third-party image model (Higgsfield); prompts derived from your script are sent to it. The brand name and logo are never sent to any provider. Same price."}]},"url_inputs":{"supported":true,"fields":[{"name":"image_url","type":"string","max_length":2048,"pattern":"^https:\\/\\/","format":"uri","default":null,"required":false,"aliases":["imageUrl"],"effect":"Public https photo of one person (front-facing). SSRF-guarded."},{"name":"presenter_video_url","type":"string","max_length":2048,"pattern":"^https:\\/\\/","format":"uri","default":null,"required":false,"aliases":["presenterVideoUrl"],"effect":"presenter_broll only, NOT ENABLED YET (400 until priced): your own talking-head recording instead of an AI presenter (no HeyGen render). Public https mp4/mov, max 90 s and 200 MB, with a video and an audio track. script optional (we transcribe it). Output follows aspect_ratio, else the recording's aspect."}]},"niche":{"supported":true,"note":"presenter_broll only; a talking head has no B-roll.","fields":[{"name":"broll.clip_type","type":"string","enum":["premium","luxury","motivational","luxury_woman","default/money","tech","tech/abstract","tech/ai","tech/startup","tech/cyber","tech/futurism","tech/hardware","tech/minimal","business","business/office","business/hustle","business/success","business/entrepreneur","finance","finance/trading","finance/crypto","finance/wealth","finance/banking","travel","travel/beaches","travel/cities","travel/adventure","travel/nomad","health","health/fitness","health/yoga","health/nutrition","health/mental","ecommerce","ecommerce/products","ecommerce/shipping","ecommerce/online","mindset","mindset/growth","mindset/discipline","mindset/stoic","mindset/resilience","spiritual","spiritual/meditation","spiritual/energy","spiritual/dark_aesthetic","food","food/cooking","food/plating","food/drinks","urban","urban/nightlife","urban/street","urban/architecture","urban/aerial","realestate","realestate/luxury","realestate/interior","realestate/pools","automotive","default/cars","automotive/driving","default/jets","nature","nature/mountains","nature/forest","nature/water","nature/sunset","abstract","abstract/particles","abstract/gradients","abstract/geometric","abstract/liquid","satisfying","gym","default/houses","Space","tools","art","relaxing","soothing","useful_hacks","wood_works","overlays/particles","overlays/light_leaks","overlays/glitches","overlays/film_grain","overlays/bokeh","overlays/smoke","overlays/vj_loops","colors/gold","colors/neon","colors/black","places/new_york","places/dubai","places/tokyo","events/christmas","events/halloween","events/new_years"],"default":"business","required":false,"effect":"presenter_broll: stock footage library for the B-roll cutaways. Default: inferred from brand.industry/keywords and the topic/script, else business. Unknown values are rejected."},{"name":"broll.footage_keywords","type":"array<string>","max_items":32,"max_length":100,"default":null,"required":false,"effect":"presenter_broll: terms that steer every B-roll search (max 32, each <= 100 chars)."},{"name":"broll.exclude_keywords","type":"array<string>","max_items":32,"max_length":100,"default":null,"required":false,"effect":"presenter_broll: never use footage tagged with these terms (max 32)."}]},"purpose":{"supported":true,"note":"Only steers a script we write (presenter_broll + topic). A supplied script is spoken verbatim; content_stage/content_type still steer its graphics.","fields":[{"name":"content_purpose","type":"string","enum":["education","sales","awareness","product_demo","case_study","news","entertainment"],"default":"education","required":false,"effect":"presenter_broll with topic: the editorial job of the script we write (education teaches one idea). Ignored for talking_head and for a supplied script."},{"name":"content_stage","type":"string","enum":["awareness","consideration","decision"],"default":"awareness","required":false,"effect":"presenter_broll: funnel stage. presenter_broll only. content_stage (awareness | consideration | decision, default awareness) and content_type (default educational; awareness: educational, infographic, statistic, checklist, hot_take, summary; consideration: comparison, how_to, case_study, insight, myth_vs_fact; decision: alternatives, review, versus, demo, objection, pricing_explainer) pick the script structure (hook, body pattern, and a CTA that is soft for awareness, mid for consideration and direct for decision, using the brand kit's profile.cta) and the graphic templates. The type must belong to the stage (free 400). Also accepts the stage words conversion / bottom / bofu (decision), middle / mofu (consideration), education / top / tofu / marketing_funnel_top (awareness); an unknown value is a free 422 STAGE_UNKNOWN."},{"name":"mode","type":"string","min_length":1,"max_length":40,"default":null,"required":false,"effect":"presenter_broll only. Alias of content_stage: awareness | consideration | decision, plus the stage words conversion / bottom / bofu (= decision), middle / mofu (= consideration), education / top / tofu / marketing_funnel_top (= awareness); content_stage accepts the same words. If content_stage is also sent and they disagree: 422 MODE_CONFLICT (free); an unknown value: 422 MODE_UNKNOWN / STAGE_UNKNOWN with the valid list."},{"name":"submode","type":"string","min_length":1,"max_length":60,"default":null,"required":false,"effect":"presenter_broll only. Alias of content_type: any content_type value, or a natural word for it (objections -> objection, vs/comparison -> comparison while considering and versus at decision, how-to -> how_to, myths -> myth_vs_fact, pricing -> pricing_explainer, stats -> statistic, recap -> summary ...). Resolved within the stage (mode / content_stage); an unknown word for that stage: 422 SUBMODE_UNKNOWN listing the stage's valid values (free)."},{"name":"instructions","type":"string","min_length":1,"max_length":1000,"default":null,"required":false,"aliases":["custom_ai_video_instructions"],"effect":"presenter_broll only. Free-text steer for this video (1-1000 characters): angle, hook, tone, emphasis, what to stress or avoid. Applied to the script we write, the shot planner and the plan review, with lower priority than our rules: it can not override the brand kit's banned_topics, content moderation, the no-third-party-trademark rule, the production QA gates, the closing call-to-action line, or the rule that numbers come only from the brand kit's proof points / your topic. With a supplied script (spoken verbatim) it steers the visuals only. Moderated before billing (422 content_policy_violation, free). Same instructions for every item of a variations request. Stored on the job; video metadata keeps only its length and SHA-256."},{"name":"content_type","type":"string","enum":["educational","infographic","statistic","checklist","hot_take","summary","comparison","how_to","case_study","insight","myth_vs_fact","alternatives","review","versus","demo","objection","pricing_explainer"],"default":"educational","required":false,"effect":"presenter_broll: content type within the stage; picks the hook, the body pattern and the graphic templates (stat, steps/checklist, icon panel, comparison/vs, UI walkthrough, notification, quote). Must belong to content_stage."}]},"script":{"supported":true,"fields":[{"name":"script","type":"string","min_length":1,"max_length":2000,"default":null,"required":false,"effect":"Spoken word for word; max 120s of speech (~300 words). Send exactly one of script or topic."},{"name":"topic","type":"string","min_length":1,"max_length":500,"default":null,"required":false,"effect":"presenter_broll only: we write an organic, hook-first explainer script about this (one idea, concrete examples, no sales pitch or hard CTA; brand.name at most once). Returned as artifacts.script."},{"name":"duration_sec","type":"integer","min":15,"max":90,"default":30,"required":false,"effect":"With topic: target spoken length in seconds (15-90); the price is engine x duration_sec. Ignored with script (priced from the script)."}]},"voice":{"supported":true,"fields":[{"name":"voice_id","type":"string","min_length":1,"max_length":100,"default":null,"required":false,"effect":"ElevenLabs voice id. Default: the voice cast for the presenter's face (apparent gender, age and energy); an avatar keeps its cast voice for every video."},{"name":"voice_gender","type":"string","enum":["female","male"],"default":null,"required":false,"effect":"Default-voice hint when voice_id is omitted."},{"name":"speed","type":"number","min":0.5,"max":1.5,"default":1,"required":false,"effect":"Speech speed (also changes the price via spoken length)."}]},"captions":{"supported":true,"fields":[{"name":"captions","type":"boolean","default":true,"required":false,"effect":"Captions from the presenter's actual speech. Also accepts { enabled, style?, position? }: style karaoke | seam | kinetic_bold (= karaoke) sets caption_style, position is ignored; an unknown style or one that disagrees with caption_style is a free 422."},{"name":"caption_style","type":"string","enum":["seam","karaoke"],"default":null,"required":false,"effect":"presenter_broll: seam (default for creator and split) burns one 1-3 word phrase at a time, white bold text in a rounded dark box, the keyword in brand.accent_color: on the seam for split shots, on the lower-middle line inside the platform safe zone for full-screen shots; karaoke (default for cutaway) is word-highlight captions at the bottom. On layout creator either value burns the creator edit's own captions (1-2 words, the spoken word highlighted), placed clear of its graphics. seam needs layout creator or split."}]},"music":{"supported":true,"fields":[{"name":"music","type":"boolean","default":true,"required":false,"effect":"Licensed instrumental under the original voice; omitted if none available."}]},"brand":{"supported":true,"note":"brand_id (+ optional customer_id) selects a saved brand kit (POST /api/v1/b2b/brands), or website_url reuses / builds the kit for that domain before billing; inline brand fields override it. The kit's optional profile (industry, icp, offer, tone, proof_points, banned_topics, cta, default_presenter, languages) steers presenter_broll scripts: proof_points are the only numbers a script may state.","fields":[{"name":"brand_id","type":"string","min_length":1,"max_length":128,"pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$","default":null,"required":false,"effect":"Saved brand kit id from POST /api/v1/b2b/brands; owner checked before billing."},{"name":"customer_id","type":"string","min_length":1,"max_length":128,"pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$","default":null,"required":false,"effect":"Optional customer scope for the saved kit; never widens access."},{"name":"brand","type":"object","default":null,"required":false,"effect":"Per-request logo and caption accent; never loads the account brand profile or rewrites the script."},{"name":"series_id","type":"string","min_length":1,"max_length":128,"pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$","default":null,"required":false,"effect":"presenter_broll only; needs brand_id (+ optional customer_id). Your own id for a recurring series of this brand. The first video fixes the presenter (avatar_id), voice_id, engine, hook style and palette; later videos reuse them (sending a different avatar_id / voice_id / engine returns 409 SERIES_CONFLICT, free). Covered topics are remembered: the script avoids repeating them, and the exact same topic again returns 409 SERIES_TOPIC_REPEATED (free)."}]},"format":{"supported":true,"fields":[{"name":"format","type":"string","enum":["talking_head","presenter_broll"],"default":"talking_head","required":false,"effect":"talking_head: the presenter full frame. presenter_broll: the AI-explainer edit (see layout; presenter voice continues, captions throughout). Same price. Best effort: creator falls back to split, split to cutaway, cutaway to the talking head; metadata.presenterBroll.layout records what was delivered and applied is false for the talking head."},{"name":"layout","type":"string","enum":["creator","split","cutaway"],"default":null,"required":false,"effect":"presenter_broll: creator (default with 9:16) = 1080x1920 creator edit: the presenter (cropped around the face, 100/118/130% punch-ins) only on the hook, opinion/payoff lines and the close, at most 2.5 s at a time and 35% of the runtime; full-screen B-roll and motion graphics elsewhere; no clip over 4 s except one earned culmination hold; varied clip lengths and transitions; 1-3 word captions; subtle SFX. split = topic visuals in the top half changing every 1.5-4 s for the whole video, the presenter always visible in the bottom half cropped chest-up, caption on the seam, logo top-right. cutaway (default for 16:9 / 1:1) = presenter full frame with full-screen B-roll cutaways. creator and split need aspect_ratio 9:16."},{"name":"aspect_ratio","type":"string","enum":["9:16","16:9","1:1"],"default":"9:16","required":false,"effect":"9:16 and 16:9 at 1080p; 1:1 at 720p."},{"name":"presenter_placement","type":"string","enum":["bottom_left","bottom_center"],"default":"bottom_left","required":false,"effect":"presenter_broll layout creator only. Where the cut-out presenter (background removed) sits over the full-frame B-roll and graphics. bottom_left (default, the customer-reference look): a smaller presenter, about 30-34% of the frame height, anchored bottom-left with the body running off the bottom edge; 1-2 word captions at chest height beside him (never over his face or body, never under the platform's action buttons or caption text); graphics use the full width above his head. bottom_center: the presenter centred, chest-up, 35-42% of the frame height, captions on his chest below the face."},{"name":"host","type":"string|number","default":{"type":"avatar"},"required":false,"effect":"presenter_broll layout creator only. Who presents: { type: \"avatar\" } (default: avatar_id / image_url / presenter_video_url) or { type: \"logo\", logo_url?, style?, show_url?, url_text? } for a faceless edit: the brand's logo is the host, animated in our worker (style cube: a rotating 3D cube with the logo on its faces; card: a glassy 3D card for wide wordmarks or tall marks; auto (default) picks cube for a squarish logo, else card). It breathes and pulses with the narration, sends signal rings and data particles on speech peaks and a light stream into each graphic as it appears; brand colours from the kit. logo_url defaults to the brand logo (brand_id kit or brand.logo_url; neither = a free 422 LOGO_HOST_NO_LOGO). The URL line under the host (show_url, default true) reads url_text, default the brand website's domain. No avatar_id / image_url / engine; narration is ElevenLabs (voice_id, else the kit's default presenter voice, else voice_gender's default). The logo is never sent to an image or video model."},{"name":"variations","type":"object","default":null,"required":false,"effect":"presenter_broll + topic only. { count: 1-5, vary?: [\"hook\", \"angle\", \"content_type\", \"presenter\"] (default [\"hook\",\"angle\"]), presenters?: [avatar_id, ...] }. One request queues N jobs through the batch machinery and answers as soon as they are recorded; the N distinct scripts are written from the same brief right after the answer (Claude-scored pairwise similarity; a variant that is too similar is rewritten) and each job waits for its own. Price: N x the single-video price (dry_run quotes the total). Requires an Idempotency-Key: it covers the whole set (items use <key>:v<index>; a retry replays the same jobs). The same body sent again with another key while the first is handled or just accepted is not a second set (see conventions.idempotency.duplicate_requests). Response: data.job_ids[] in variant order; data.distinctness.status is \"pending\" until the scripts are checked (send the same request with the same key again to read the verdict; nothing is queued or charged again)."},{"name":"progress_bar","type":"object|boolean","default":{"enabled":false,"position":"bottom"},"required":false,"aliases":["progress_bar_enabled (boolean)","progress_bar: true|false"],"effect":"presenter_broll only. Optional in-video progress bar (off by default): { enabled, position: \"top\" | \"bottom\" (default bottom), color: \"#RRGGBB\" (default the brand accent, accentOnDark) }. A thin (8 px) bar that fills left to right over the video, flush with the very edge. Bottom is a known retention pattern; Instagram's UI may overlap the bottom edge. progress_bar_enabled: true is an alias for { enabled: true }."},{"name":"broll.coverage","type":"number","min":0.2,"max":0.8,"default":0.5,"required":false,"effect":"presenter_broll layout cutaway: share of the runtime on B-roll (the hook and the last line always stay on the presenter; at most ~8 s of B-roll in a row). Ignored by creator and split."}]},"delivery":{"supported":true,"fields":[{"name":"delivery.visibility","type":"string","enum":["private"],"default":null,"required":false,"aliases":["visibility","private_cdn: true","options.visibility"],"effect":"\"private\": media goes to a private bucket; poll_url returns a short-lived signed link instead of a public URL."},{"name":"listing","type":"string","enum":["private","public"],"default":"private","required":false,"effect":"\"public\" lists the finished video on its public page, Discover, the sitemap and feeds. Default \"private\": nothing is listed or indexed; the media URL is unchanged."},{"name":"webhook_url","type":"string","format":"uri","default":null,"required":false,"effect":"Public https URL called once when the job ends (signed with X-ReelsBuilder-Signature)."},{"name":"agent_run_id","type":"string","default":null,"required":false,"effect":"Your trace id, echoed in the receipt meta and webhook body."}]}}},{"id":"magic","endpoint":"/api/v1/videos/magic","method":"POST","maturity":5,"recommended":false,"description":"The stock engine with your account brand. Prefer /generate-and-post (per-request brand, private delivery, webhooks).","idempotency":"recommended","required_one_of":[["topic","prompt"]],"receipt":{"http_status":200,"job_id":"jobId","video_id":"videoId","poll_url":null,"note":"Top-level jobId; poll /api/v1/jobs/{jobId}."},"layers":{"visuals":{"supported":true,"note":"Licensed stock footage.","fields":[]},"url_inputs":{"supported":true,"fields":[{"name":"asset_urls","type":"array<string>","format":"uri","default":null,"required":false,"effect":"Your own clips as background (not validated)."}]},"niche":{"supported":true,"fields":[{"name":"clip_type","type":"string","enum":["premium","luxury","motivational","luxury_woman","default/money","tech","tech/abstract","tech/ai","tech/startup","tech/cyber","tech/futurism","tech/hardware","tech/minimal","business","business/office","business/hustle","business/success","business/entrepreneur","finance","finance/trading","finance/crypto","finance/wealth","finance/banking","travel","travel/beaches","travel/cities","travel/adventure","travel/nomad","health","health/fitness","health/yoga","health/nutrition","health/mental","ecommerce","ecommerce/products","ecommerce/shipping","ecommerce/online","mindset","mindset/growth","mindset/discipline","mindset/stoic","mindset/resilience","spiritual","spiritual/meditation","spiritual/energy","spiritual/dark_aesthetic","food","food/cooking","food/plating","food/drinks","urban","urban/nightlife","urban/street","urban/architecture","urban/aerial","realestate","realestate/luxury","realestate/interior","realestate/pools","automotive","default/cars","automotive/driving","default/jets","nature","nature/mountains","nature/forest","nature/water","nature/sunset","abstract","abstract/particles","abstract/gradients","abstract/geometric","abstract/liquid","satisfying","gym","default/houses","Space","tools","art","relaxing","soothing","useful_hacks","wood_works","overlays/particles","overlays/light_leaks","overlays/glitches","overlays/film_grain","overlays/bokeh","overlays/smoke","overlays/vj_loops","colors/gold","colors/neon","colors/black","places/new_york","places/dubai","places/tokyo","events/christmas","events/halloween","events/new_years"],"default":"business","required":false,"aliases":["clipType"],"effect":"Footage library. Default inferred from topic, else business."}]},"purpose":{"supported":true,"fields":[{"name":"content_purpose","type":"string","enum":["education","sales","awareness","product_demo","case_study","news","entertainment"],"default":null,"required":false,"effect":"Editorial angle of the generated script."}]},"script":{"supported":true,"fields":[{"name":"topic","type":"string","default":null,"required":false,"aliases":["prompt"],"effect":"What the video is about."},{"name":"script","type":"string","default":null,"required":false,"effect":"Your narration, word for word."},{"name":"cta","type":"object|string","max_length":120,"default":null,"required":false,"effect":"Closing call to action for a generated script."},{"name":"include_hook","type":"boolean","default":null,"required":false,"aliases":["include_hook_line"],"effect":"Opening hook line."}]},"voice":{"supported":true,"fields":[{"name":"voice_id","type":"string","default":null,"required":false,"aliases":["voice"],"effect":"ElevenLabs voice id. Default: picked from voice_gender, else the brand tone."},{"name":"voice_gender","type":"string","enum":["female","male"],"default":null,"required":false,"aliases":["voiceGender"],"effect":"Default-voice pick when voice_id is omitted."},{"name":"voice_speed","type":"number","min":0.7,"max":1.3,"default":1,"required":false,"effect":"Narration speed; generated scripts are sized for it."},{"name":"language","type":"string","enum":["af","am","ar","as","az","be","bg","bn","bs","ca","ceb","cs","cy","da","de","el","en","es","et","fa","fi","fil","fr","ga","gl","gu","ha","he","hi","hr","hu","hy","id","is","it","ja","jv","ka","kk","km","kn","ko","ky","lb","ln","lo","lt","lv","mk","ml","mn","mr","ms","mt","my","ne","nl","no","pa","pl","ps","pt","ro","ru","sd","si","sk","sl","so","sq","sr","sv","sw","ta","te","th","tr","uk","ur","uz","vi","zh"],"default":null,"required":false,"aliases":["voice_language"],"effect":"ISO 639-1 narration + script language. Default: detected from the brief. Unsupported voice languages return 400."}]},"captions":{"supported":true,"fields":[{"name":"include_captions","type":"boolean","default":true,"required":false,"aliases":["captions"],"effect":"Burned-in captions."},{"name":"caption_style.preset","type":"string","enum":["highlight","classic","none"],"default":"highlight","required":false,"aliases":["caption_style (string)","hormozi→highlight","standard|minimal|news→classic"],"effect":"highlight: 1-3 word chunks, spoken word coloured. classic: bold phrases. none: no captions. A bare string caption_style is read as the preset."},{"name":"caption_style.text_color","type":"string","pattern":"^#[0-9a-fA-F]{6}$","default":"#FFFFFF","required":false,"effect":"Caption text colour."},{"name":"caption_style.highlight_color","type":"string","pattern":"^#[0-9a-fA-F]{6}$","default":null,"required":false,"aliases":["caption_highlight_color"],"effect":"Spoken-word colour (highlight preset). Default brand accent/primary, else #FFD60A."},{"name":"caption_style.position","type":"string","enum":["lower_third","center","top"],"default":"lower_third","required":false,"aliases":["caption_position (bottom|middle)"],"effect":"Vertical caption anchor."},{"name":"caption_style.font_size","type":"string","enum":["small","medium","large"],"default":"large","required":false,"effect":"Caption size."},{"name":"caption_language","type":"string","default":null,"required":false,"aliases":["captionLanguage"],"effect":"ISO 639-1 caption language when it differs from the narration (captions are translated)."}]},"music":{"supported":true,"fields":[{"name":"music.enabled","type":"boolean","default":true,"required":false,"aliases":["include_music","includeMusic"],"effect":"Licensed background music from the niche's folder."},{"name":"music.volume","type":"number","min":0,"max":1,"default":0.35,"required":false,"aliases":["music_volume"],"effect":"Music level under the voice."}]},"brand":{"supported":false,"note":"Account brand only; per-request brand is ignored."},"format":{"supported":true,"fields":[{"name":"aspect_ratio","type":"string","enum":["9:16"],"default":"9:16","required":false,"effect":"Accepted but the renderer is portrait-only: always 9:16."},{"name":"duration_target_sec","type":"number","min":15,"max":120,"default":30,"required":false,"aliases":["duration"],"effect":"Target length."}]},"delivery":{"supported":false,"note":"No private delivery (422), no webhook_url; poll the job."}}},{"id":"motivational","endpoint":"/api/v1/videos/motivational","method":"POST","maturity":5,"recommended":false,"description":"Classic quote video over motivational footage (never auto-branded). Mixed snake/camelCase fields.","idempotency":"recommended","receipt":{"http_status":200,"job_id":"jobId","video_id":"videoId","poll_url":null,"note":"Top-level jobId; poll /api/v1/jobs/{jobId}."},"layers":{"visuals":{"supported":true,"note":"Motivational footage library.","fields":[]},"url_inputs":{"supported":false},"niche":{"supported":true,"fields":[{"name":"clipType","type":"string","enum":["premium","luxury","motivational","luxury_woman","default/money","tech","tech/abstract","tech/ai","tech/startup","tech/cyber","tech/futurism","tech/hardware","tech/minimal","business","business/office","business/hustle","business/success","business/entrepreneur","finance","finance/trading","finance/crypto","finance/wealth","finance/banking","travel","travel/beaches","travel/cities","travel/adventure","travel/nomad","health","health/fitness","health/yoga","health/nutrition","health/mental","ecommerce","ecommerce/products","ecommerce/shipping","ecommerce/online","mindset","mindset/growth","mindset/discipline","mindset/stoic","mindset/resilience","spiritual","spiritual/meditation","spiritual/energy","spiritual/dark_aesthetic","food","food/cooking","food/plating","food/drinks","urban","urban/nightlife","urban/street","urban/architecture","urban/aerial","realestate","realestate/luxury","realestate/interior","realestate/pools","automotive","default/cars","automotive/driving","default/jets","nature","nature/mountains","nature/forest","nature/water","nature/sunset","abstract","abstract/particles","abstract/gradients","abstract/geometric","abstract/liquid","satisfying","gym","default/houses","Space","tools","art","relaxing","soothing","useful_hacks","wood_works","overlays/particles","overlays/light_leaks","overlays/glitches","overlays/film_grain","overlays/bokeh","overlays/smoke","overlays/vj_loops","colors/gold","colors/neon","colors/black","places/new_york","places/dubai","places/tokyo","events/christmas","events/halloween","events/new_years"],"default":"motivational","required":false,"effect":"Footage library."}]},"purpose":{"supported":false},"script":{"supported":true,"fields":[{"name":"quote","type":"string","default":null,"required":false,"aliases":["topic"],"effect":"Your quote; omitted = AI-written quote."},{"name":"includeHook","type":"boolean","default":true,"required":false,"effect":"Visual hook intro."}]},"voice":{"supported":true,"fields":[{"name":"voice_id","type":"string","default":null,"required":true,"effect":"ElevenLabs voice id (required in practice)."}]},"captions":{"supported":true,"fields":[{"name":"captions","type":"boolean","default":true,"required":false,"effect":"Burned-in captions; false overrides any preset."},{"name":"caption_style.preset","type":"string","enum":["highlight","classic","none"],"default":"highlight","required":false,"aliases":["caption_style (string)"],"effect":"highlight: 1-3 word chunks, spoken word coloured. classic: bold phrases. none: no captions. A bare string caption_style is read as the preset."},{"name":"caption_style.text_color","type":"string","pattern":"^#[0-9a-fA-F]{6}$","default":"#FFFFFF","required":false,"effect":"Caption text colour."},{"name":"caption_style.highlight_color","type":"string","pattern":"^#[0-9a-fA-F]{6}$","default":null,"required":false,"aliases":["caption_highlight_color"],"effect":"Spoken-word colour (highlight preset). Default brand accent/primary, else #FFD60A."},{"name":"caption_style.position","type":"string","enum":["lower_third","center","top"],"default":"lower_third","required":false,"aliases":["caption_position"],"effect":"Vertical caption anchor."},{"name":"caption_style.font_size","type":"string","enum":["small","medium","large"],"default":"large","required":false,"effect":"Caption size."}]},"music":{"supported":true,"fields":[{"name":"includeMusic","type":"boolean","default":true,"required":false,"effect":"Background music."}]},"brand":{"supported":true,"note":"No customer brand; only the ReelsBuilder watermark toggle.","fields":[{"name":"includeRBBranding","type":"boolean","default":true,"required":false,"effect":"ReelsBuilder watermark."}]},"format":{"supported":false,"note":"Fixed 9:16 output."},"delivery":{"supported":false,"note":"No private delivery (422), no webhook_url; poll the job."}}},{"id":"blog_to_video","endpoint":"/api/v1/blog-to-video","method":"POST","maturity":4,"recommended":false,"description":"Narrated stock video from article text (the stock engine). The article URL is recorded but not fetched.","idempotency":"required","required_one_of":[["article_text","article_markdown","article_summary","article_title","article_url","script"]],"receipt":{"http_status":202,"job_id":"data.job_id","video_id":"data.video_id","poll_url":"data.poll_url"},"layers":{"visuals":{"supported":true,"note":"Licensed stock footage (same engine as stock).","fields":[]},"url_inputs":{"supported":true,"fields":[{"name":"article_url","type":"string","format":"uri","default":null,"required":false,"aliases":["url","source_url"],"effect":"Recorded on the job as the source; NOT fetched. Send article_text."},{"name":"asset_urls","type":"array<string>","format":"uri","default":null,"required":false,"effect":"Your own clips as background (http/https only; no SSRF host check)."}]},"niche":{"supported":true,"fields":[{"name":"clip_type","type":"string","enum":["premium","luxury","motivational","luxury_woman","default/money","tech","tech/abstract","tech/ai","tech/startup","tech/cyber","tech/futurism","tech/hardware","tech/minimal","business","business/office","business/hustle","business/success","business/entrepreneur","finance","finance/trading","finance/crypto","finance/wealth","finance/banking","travel","travel/beaches","travel/cities","travel/adventure","travel/nomad","health","health/fitness","health/yoga","health/nutrition","health/mental","ecommerce","ecommerce/products","ecommerce/shipping","ecommerce/online","mindset","mindset/growth","mindset/discipline","mindset/stoic","mindset/resilience","spiritual","spiritual/meditation","spiritual/energy","spiritual/dark_aesthetic","food","food/cooking","food/plating","food/drinks","urban","urban/nightlife","urban/street","urban/architecture","urban/aerial","realestate","realestate/luxury","realestate/interior","realestate/pools","automotive","default/cars","automotive/driving","default/jets","nature","nature/mountains","nature/forest","nature/water","nature/sunset","abstract","abstract/particles","abstract/gradients","abstract/geometric","abstract/liquid","satisfying","gym","default/houses","Space","tools","art","relaxing","soothing","useful_hacks","wood_works","overlays/particles","overlays/light_leaks","overlays/glitches","overlays/film_grain","overlays/bokeh","overlays/smoke","overlays/vj_loops","colors/gold","colors/neon","colors/black","places/new_york","places/dubai","places/tokyo","events/christmas","events/halloween","events/new_years"],"default":"business","required":false,"aliases":["clipType"],"effect":"Footage library. Default: inferred from the article title/script, else business."}]},"purpose":{"supported":true,"fields":[{"name":"content_purpose","type":"string","enum":["education","sales","awareness","product_demo","case_study","news","entertainment"],"default":null,"required":false,"effect":"Recorded on the job; the narration is built from the article text, so it has little effect."}]},"script":{"supported":true,"fields":[{"name":"article_text","type":"string","max_length":6000,"default":null,"required":false,"aliases":["article_markdown","markdown","content"],"effect":"Article body; the first 6000 characters become the narration (markdown stripped)."},{"name":"article_title","type":"string","default":null,"required":false,"aliases":["title","headline"],"effect":"Opening line (\"Here's what matters from …\")."},{"name":"article_summary","type":"string","default":null,"required":false,"aliases":["summary","excerpt"],"effect":"Used when there is no article_text."},{"name":"script","type":"string","default":null,"required":false,"effect":"Your narration word for word (overrides the article)."},{"name":"cta_text","type":"string","default":null,"required":false,"aliases":["cta"],"effect":"Appended to the article narration."}]},"voice":{"supported":true,"fields":[{"name":"voice_id","type":"string","default":null,"required":false,"aliases":["voice"],"effect":"ElevenLabs voice id. Default: picked from voice_gender, else the brand tone."},{"name":"voice_gender","type":"string","enum":["female","male"],"default":null,"required":false,"aliases":["voiceGender"],"effect":"Default-voice pick when voice_id is omitted."},{"name":"voice_speed","type":"number","min":0.7,"max":1.3,"default":1,"required":false,"effect":"Narration speed; generated scripts are sized for it."},{"name":"language","type":"string","enum":["af","am","ar","as","az","be","bg","bn","bs","ca","ceb","cs","cy","da","de","el","en","es","et","fa","fi","fil","fr","ga","gl","gu","ha","he","hi","hr","hu","hy","id","is","it","ja","jv","ka","kk","km","kn","ko","ky","lb","ln","lo","lt","lv","mk","ml","mn","mr","ms","mt","my","ne","nl","no","pa","pl","ps","pt","ro","ru","sd","si","sk","sl","so","sq","sr","sv","sw","ta","te","th","tr","uk","ur","uz","vi","zh"],"default":null,"required":false,"aliases":["voice_language"],"effect":"ISO 639-1 narration + script language. Default: detected from the brief. Unsupported voice languages return 400."}]},"captions":{"supported":true,"fields":[{"name":"include_captions","type":"boolean","default":true,"required":false,"aliases":["captions"],"effect":"Burned-in captions."},{"name":"caption_style.preset","type":"string","enum":["highlight","classic","none"],"default":"highlight","required":false,"aliases":["caption_style (string)","hormozi→highlight","standard|minimal|news→classic"],"effect":"highlight: 1-3 word chunks, spoken word coloured. classic: bold phrases. none: no captions. A bare string caption_style is read as the preset."},{"name":"caption_style.text_color","type":"string","pattern":"^#[0-9a-fA-F]{6}$","default":"#FFFFFF","required":false,"effect":"Caption text colour."},{"name":"caption_style.highlight_color","type":"string","pattern":"^#[0-9a-fA-F]{6}$","default":null,"required":false,"aliases":["caption_highlight_color"],"effect":"Spoken-word colour (highlight preset). Default brand accent/primary, else #FFD60A."},{"name":"caption_style.position","type":"string","enum":["lower_third","center","top"],"default":"lower_third","required":false,"aliases":["caption_position (bottom|middle)"],"effect":"Vertical caption anchor."},{"name":"caption_style.font_size","type":"string","enum":["small","medium","large"],"default":"large","required":false,"effect":"Caption size."},{"name":"caption_language","type":"string","default":null,"required":false,"aliases":["captionLanguage"],"effect":"ISO 639-1 caption language when it differs from the narration (captions are translated)."}]},"music":{"supported":true,"fields":[{"name":"music.enabled","type":"boolean","default":true,"required":false,"aliases":["include_music","includeMusic"],"effect":"Licensed background music from the niche's folder."},{"name":"music.volume","type":"number","min":0,"max":1,"default":0.35,"required":false,"aliases":["music_volume"],"effect":"Music level under the voice."}]},"brand":{"supported":false,"note":"Uses the account brand; a per-request brand is ignored."},"format":{"supported":true,"fields":[{"name":"aspect_ratio","type":"string","enum":["9:16"],"default":"9:16","required":false,"effect":"Accepted but the renderer is portrait-only: always 9:16."},{"name":"duration_target_sec","type":"number","min":15,"max":120,"default":30,"required":false,"aliases":["duration"],"effect":"Target length. Long articles are narrated fast rather than cut."}]},"delivery":{"supported":true,"note":"No private delivery (422) and no webhook_url yet; poll the job.","fields":[{"name":"agent_run_id","type":"string","default":null,"required":false,"effect":"Your trace id, echoed in the receipt meta and webhook body."}]}}},{"id":"news","endpoint":"/api/v1/videos/news","method":"POST","maturity":3,"recommended":false,"description":"News-style video with broadcast graphics. Being reworked; not recommended for partners. camelCase body passed straight to the news engine.","idempotency":"recommended","receipt":{"http_status":202,"job_id":"data.job_id","video_id":"data.video_id","poll_url":"data.poll_url"},"layers":{"visuals":{"supported":true,"note":"News footage + broadcast graphics.","fields":[]},"url_inputs":{"supported":true,"fields":[{"name":"sourceUrl","type":"string","format":"uri","default":null,"required":false,"effect":"News source to cover."}]},"niche":{"supported":true,"fields":[{"name":"niches","type":"array<string>","default":null,"required":false,"effect":"News niches."}]},"purpose":{"supported":false},"script":{"supported":true,"fields":[{"name":"keywords","type":"array<string>","default":null,"required":false,"effect":"Story keywords."},{"name":"format","type":"string","enum":["digest","single","headlines","weekly","breaking"],"default":null,"required":false,"effect":"Story format."}]},"voice":{"supported":true,"fields":[{"name":"voiceId","type":"string","default":null,"required":false,"effect":"ElevenLabs voice id."}]},"captions":{"supported":false,"note":"Broadcast captions are not configurable on the public API."},"music":{"supported":true,"fields":[{"name":"backgroundMusicUrl","type":"string","format":"uri","default":null,"required":false,"effect":"Your music URL."}]},"brand":{"supported":false},"format":{"supported":true,"fields":[{"name":"aspectRatio","type":"string","enum":["9:16","16:9","1:1"],"default":null,"required":false,"effect":"Output shape."},{"name":"duration","type":"string","enum":["30s","60s","90s","2min"],"default":null,"required":false,"effect":"Length."}]},"delivery":{"supported":false}}}],"retired_modes":{"status":410,"code":"MODE_NOT_AVAILABLE","endpoints":["/api/v1/videos/ai-story","/api/v1/videos/reddit-story","/api/v1/videos/fake-chat","/api/v1/videos/soothing","/api/v1/videos/ugc","/api/v1/videos/ai-ad","/api/v1/videos/rss"]},"pricing":{"currency":"USD","unit":"cents","ledger":"Prepaid API credits (api_credits_usd_cents). Charged on accept, refunded automatically if the render fails. Failed validation (4xx before queueing) and sandbox keys are free.","charge_headers":["X-Api-Credits-Cost-Usd-Cents","X-Api-Credits-Tool","X-Api-Credits-Model","X-Api-Credits-Tier","X-Api-Credits-Engine","X-Api-Credits-Estimated-Seconds"],"formulas":{"stock":"Flat per render, any length 15-120s.","blog_to_video":"Flat per render.","magic":"Flat per render.","motivational":"Flat per render.","news":"Flat per render.","clips":"$0.40 per REQUESTED clip (clip_count, default 5); dry_run is free.","ai_video":"Provider cost for the actual model, length (30s/60s), resolution and native_audio x the model's revenue multiple, rounded up to 5 cents; never below the model's flat floor. Narration (script or content_purpose) adds TTS + transcription; a script one shot over budget adds that shot. music, captions and brand are free.","ai_influencer":"(engine per-second provider cost x spoken seconds + narration + storage) x 2, rounded up to 5 cents; minimum 5 seconds"},"modes":{"stock":{"tool":"generate_and_post","price_usd_cents":60,"price_display":"$0.60","30s":60,"60s":60},"blog_to_video":{"tool":"blog_to_video","price_usd_cents":50,"price_display":"$0.50","30s":50,"60s":50},"magic":{"tool":"generate_video","price_usd_cents":50,"price_display":"$0.50","30s":50,"60s":50},"motivational":{"tool":"generate_video","price_usd_cents":50,"price_display":"$0.50","30s":50,"60s":50},"news":{"tool":"generate_video","price_usd_cents":50,"price_display":"$0.50","30s":50,"60s":50},"clips":{"tool":"clip_youtube","per_clip_usd_cents":40,"examples":{"1_clips":40,"3_clips":120,"5_clips":200,"10_clips":400},"dry_run":0},"ai_video":{"tool":"generate_ai_video","default_model":"bytedance/seedance-2.0","tiers":{"low":{"model":"wan-3.0","prices":{"30s":{"price_usd_cents":510,"price_display":"$5.10"},"60s":{"price_usd_cents":1020,"price_display":"$10.20"}},"prices_narrated":{"30s":{"price_usd_cents":520,"price_display":"$5.20"},"60s":{"price_usd_cents":1035,"price_display":"$10.35"}}},"medium":{"model":"kling-3.0-standard","prices":{"30s":{"price_usd_cents":430,"price_display":"$4.30"},"60s":{"price_usd_cents":860,"price_display":"$8.60"}},"prices_narrated":{"30s":{"price_usd_cents":435,"price_display":"$4.35"},"60s":{"price_usd_cents":870,"price_display":"$8.70"}}},"high":{"model":"kling-3.0-pro","prices":{"30s":{"price_usd_cents":575,"price_display":"$5.75"},"60s":{"price_usd_cents":1145,"price_display":"$11.45"}},"prices_narrated":{"30s":{"price_usd_cents":580,"price_display":"$5.80"},"60s":{"price_usd_cents":1155,"price_display":"$11.55"}}},"xhigh":{"model":"bytedance/seedance-2.0","prices":{"30s":{"price_usd_cents":1755,"price_display":"$17.55"},"60s":{"price_usd_cents":3510,"price_display":"$35.10"}},"prices_narrated":{"30s":{"price_usd_cents":1765,"price_display":"$17.65"},"60s":{"price_usd_cents":3530,"price_display":"$35.30"}}},"max":{"model":"google/veo-3.1","prices":{"30s":{"price_usd_cents":3900,"price_display":"$39.00"},"60s":{"price_usd_cents":7800,"price_display":"$78.00"}},"prices_narrated":{"30s":{"price_usd_cents":3910,"price_display":"$39.10"},"60s":{"price_usd_cents":7820,"price_display":"$78.20"}}}},"models":{"google/veo-3.1":{"label":"Veo 3.1","prices":{"30s":{"price_usd_cents":3900,"price_display":"$39.00"},"60s":{"price_usd_cents":7800,"price_display":"$78.00"}}},"bytedance/seedance-2.0":{"label":"Seedance 2.0","prices":{"30s":{"price_usd_cents":1755,"price_display":"$17.55"},"60s":{"price_usd_cents":3510,"price_display":"$35.10"}}},"fal-ai/wan/v2.7":{"label":"Wan 2.7","prices":{"30s":{"price_usd_cents":1465,"price_display":"$14.65"},"60s":{"price_usd_cents":2925,"price_display":"$29.25"}}},"fal-ai/ltx-2.3":{"label":"LTX 2.3","prices":{"30s":{"price_usd_cents":585,"price_display":"$5.85"},"60s":{"price_usd_cents":1170,"price_display":"$11.70"}}},"fal-ai/pixverse/v6":{"label":"PixVerse V6","prices":{"30s":{"price_usd_cents":2245,"price_display":"$22.45"},"60s":{"price_usd_cents":4485,"price_display":"$44.85"}}},"wan-3.0":{"label":"Wan 3.0","prices":{"30s":{"price_usd_cents":510,"price_display":"$5.10"},"60s":{"price_usd_cents":1020,"price_display":"$10.20"}}},"kling-3.0-standard":{"label":"Kling 3.0 Standard","prices":{"30s":{"price_usd_cents":430,"price_display":"$4.30"},"60s":{"price_usd_cents":860,"price_display":"$8.60"}}},"kling-3.0-pro":{"label":"Kling 3.0 Pro","prices":{"30s":{"price_usd_cents":575,"price_display":"$5.75"},"60s":{"price_usd_cents":1145,"price_display":"$11.45"}}}},"full_catalog":"GET /api/v1/tools -> data.pricing.ai_video (per resolution and native_audio rows)"},"ai_influencer":{"tool":"generate_ai_influencer","default_engine":{"avatar_id":"avatar_iii","image_url":"avatar_iv"},"engines":{"avatar_iii":{"30s":100,"60s":200,"input":"avatar_id"},"avatar_iv":{"30s":245,"60s":490,"input":"image_url or avatar_id"},"avatar_v":{"30s":725,"60s":1450,"input":"avatar_id"}},"create_avatar":265,"create_avatar_with_wardrobe":280}}},"avatars":{"endpoints":{"create":{"method":"POST","path":"/api/v1/avatars","tool":"create_avatar","body":["image_url","name?","wardrobe?"]},"create_look":{"method":"POST","path":"/api/v1/avatars/{avatar_id}/looks","tool":"create_avatar_look","body":["wardrobe","name?"],"note":"A new persona (new avatar_id, parent_avatar_id) wearing the outfit; same face and cast voice. Edits the ORIGINAL photo."},"list":{"method":"GET","path":"/api/v1/avatars"},"get":{"method":"GET","path":"/api/v1/avatars/{avatar_id}"},"delete":{"method":"DELETE","path":"/api/v1/avatars/{avatar_id}"}},"wardrobe":{"schema":{"type":"object","properties":{"preset":{"type":"string","enum":["tee","polo","oxford","blazer","hoodie","lab_coat","quarter_zip"],"description":"Garment. Default tee."},"color":{"type":"string","maxLength":40,"description":"#RRGGBB or a named colour. Default charcoal."},"logo":{"type":"object","properties":{"brand_id":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$","description":"A brand kit this account owns (POST /api/v1/b2b/brands) with a logo. The only logo a wardrobe can carry."},"customer_id":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$","description":"Optional: must match the kit's customer_id."},"placement":{"type":"string","enum":["chest_left","chest_center"],"default":"chest_left","description":"chest_left = the wearer's left chest (small mark); chest_center = centred print."}},"required":["brand_id"],"additionalProperties":false},"prompt":{"type":"string","minLength":3,"maxLength":200,"description":"Optional garment style detail (fit, fabric, collar). Moderated: no text, logos, insignia, schools, companies, teams or uniforms."}},"additionalProperties":false,"description":"Outfit for the presenter (\"shirt control\"). The face is kept (identity-checked); the only logo allowed is your own brand kit (wardrobe.logo.brand_id). Schools, companies, teams, uniforms, text and third-party marks are refused with a free 422."},"presets":["tee","polo","oxford","blazer","hoodie","lab_coat","quarter_zip"],"colors":{"hex":"#RRGGBB","names":["white","off_white","cream","black","charcoal","gray","grey","heather_gray","heather_grey","light_gray","navy","royal_blue","blue","light_blue","sky_blue","teal","green","forest_green","sage","olive","burgundy","maroon","red","orange","yellow","beige","khaki","tan","brown","purple","lavender","pink"]},"logo_placements":{"chest_left":"the wearer's left chest (viewer's right), a small mark","chest_center":"a centred chest print"},"logo_policy":"Only your own brand kit (wardrobe.logo.brand_id from POST /api/v1/b2b/brands, owned by this account) or no logo. The logo is printed on our servers after the outfit edit; it and the brand name are never sent to the image model.","refusals":{"status":422,"charged":false,"codes":{"WARDROBE_FALSE_AFFILIATION":"schools/universities, official, military, police, medical-credential or protected-emblem uniforms","WARDROBE_TRADEMARK":"companies, fashion/sportswear brands, teams, leagues","WARDROBE_TEXT_NOT_ALLOWED":"text, lettering, logos, patches, insignia or quoted words in prompt","WARDROBE_POLICY":"anything else the classifier refuses","WARDROBE_BRAND_NOT_ELIGIBLE":"a brand kit whose name is itself a famous third-party mark (contact support to verify)"}},"quality_checks":{"identity":"Face position, size, structure (SSIM), features and skin tone compared with the original; one retry, then 422 WARDROBE_IDENTITY_DRIFT (refunded). The original face pixels are kept.","logo":"Present, undistorted, readable contrast (auto one-colour ink), on the garment, clear of the face; else 422 WARDROBE_LOGO_QA_FAILED (refunded).","output":"The edited garment is checked to carry no text or marks before the logo is applied (422 WARDROBE_OUTPUT_REJECTED, refunded)."},"price_usd_cents":280,"latency_sec":{"min":20,"max":90},"sandbox":"Sandbox keys run the deterministic refusals and return a fixture; no provider is called."}},"examples":{"stock":{"minimal":{"prompt":"Why zero-trust networking matters for mid-size IT teams"},"full":{"prompt":"How Acme cuts onboarding time in half for IT teams","content_purpose":"sales","clip_type":"tech","content_style":"professional","cta":{"text":"Book a demo at acme.com"},"include_hook":true,"voice_gender":"male","voice_speed":1.1,"language":"en","caption_style":{"preset":"highlight","text_color":"#FFFFFF","highlight_color":"#00C2FF","position":"lower_third","font_size":"large"},"music":{"enabled":true,"volume":0.2},"brand":{"name":"Acme","website_url":"https://acme.com","logo_url":"https://cdn.acme.com/logo.png","primary_color":"#0A66C2","accent_color":"#00C2FF","tone":"professional","industry":"SaaS","keywords":["onboarding","IT"]},"aspect_ratio":"9:16","duration_target_sec":45,"progress_bar":{"enabled":true,"position":"bottom"},"delivery":{"visibility":"private"},"webhook_url":"https://hooks.example.com/reelsbuilder","agent_run_id":"run_123"}},"blog_to_video":{"minimal":{"article_title":"Five lessons from migrating to the cloud","article_text":"Moving to the cloud taught us five lessons. First, plan for cost visibility from day one."},"full":{"article_url":"https://blog.example.com/cloud-lessons","article_title":"Five lessons from migrating to the cloud","article_text":"Moving to the cloud taught us five lessons. First, plan for cost visibility from day one. Second, automate everything.","content_purpose":"education","clip_type":"tech","voice_gender":"female","language":"en","caption_style":{"preset":"classic","position":"lower_third"},"music":{"volume":0.2},"duration_target_sec":45,"agent_run_id":"run_123"}},"magic":{"minimal":{"topic":"Three habits of productive engineering teams"},"full":{"topic":"Three habits of productive engineering teams","content_purpose":"education","clip_type":"tech","voice_gender":"female","voice_speed":1,"caption_style":{"preset":"highlight"},"music":{"enabled":true,"volume":0.3},"cta":"Follow for more","duration_target_sec":30}},"motivational":{"minimal":{"voice_id":"21m00Tcm4TlvDq8ikWAM"},"full":{"voice_id":"21m00Tcm4TlvDq8ikWAM","quote":"Discipline is choosing what you want most over what you want now.","clipType":"motivational","captions":true,"caption_style":{"preset":"highlight","text_color":"#FFFFFF","highlight_color":"#FFAA00","position":"lower_third","font_size":"large"},"includeMusic":true,"includeHook":true}},"news":{"minimal":{"keywords":["AI chips"]},"full":{"keywords":["AI chips"],"format":"single","duration":"60s","tone":"professional","aspectRatio":"9:16"}},"clips":{"minimal":{"youtube_url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ"},"full":{"youtube_url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","clip_count":3,"aspect_ratio":"9:16","captions":true,"focus":"the part about pricing","content_purpose":"education","delivery":{"visibility":"private"},"webhook_url":"https://hooks.example.com/reelsbuilder","agent_run_id":"run_123"}},"ai_video":{"minimal":{"prompt":"Slow dolly shot across a modern data center, cool blue light"},"full":{"prompt":"Slow dolly shot across a modern data center, cool blue light","quality_tier":"medium","duration_sec":30,"aspect_ratio":"9:16","script":"Your data never sleeps. Neither does Acme. We watch every server so your team can ship.","voice_gender":"female","captions":true,"music":true,"native_audio":false,"brand":{"name":"Acme","website_url":"https://acme.com","logo_url":"https://cdn.acme.com/logo.png","accent_color":"#00C2FF"},"delivery":{"visibility":"private"},"webhook_url":"https://hooks.example.com/reelsbuilder","agent_run_id":"run_123"}},"ai_video_image":{"minimal":{"image_url":"https://cdn.example.com/product.jpg","prompt":"The product slowly rotates on a white table"},"full":{"image_url":"https://cdn.example.com/product.jpg","prompt":"The product slowly rotates on a white table, soft studio light","model":"kling-3.0-standard","duration_sec":30,"aspect_ratio":"9:16","content_purpose":"product_demo","voice_gender":"male","brand":{"name":"Acme","accent_color":"#00C2FF"},"webhook_url":"https://hooks.example.com/reelsbuilder"}},"ai_influencer":{"minimal":{"image_url":"https://cdn.example.com/presenter.jpg","script":"Hi, I'm Alex from Acme. Here is one tip to cut onboarding time in half."},"full":{"avatar_id":"persona_123","engine":"avatar_iii","format":"presenter_broll","topic":"Why most new hires take three months to become productive, and the one onboarding change that halves it","duration_sec":45,"content_purpose":"education","content_stage":"consideration","content_type":"how_to","layout":"creator","caption_style":"seam","presenter_placement":"bottom_left","progress_bar":{"enabled":true,"position":"bottom"},"broll":{"visuals":"stock","clip_type":"business","footage_keywords":["office","laptop"],"exclude_keywords":["gym"]},"voice_gender":"male","speed":1,"aspect_ratio":"9:16","captions":true,"music":true,"brand":{"name":"Acme","logo_url":"https://cdn.acme.com/logo.png","accent_color":"#00C2FF"},"delivery":{"visibility":"private"},"webhook_url":"https://hooks.example.com/reelsbuilder","agent_run_id":"run_123"}}},"limits":{"concurrency":{"active_renders_per_account":5,"applies_to":["/api/v1/generate-and-post","/api/v1/blog-to-video","/api/v1/jobs"],"error":"429 RENDER_CONCURRENCY_LIMIT_EXCEEDED (X-Render-Concurrency-Limit / -Used headers)"},"provider_job_concurrency":{"active_jobs_per_account":10,"applies_to":["/api/v1/videos/text-to-video","/api/v1/videos/image-to-video","/api/v1/videos/ai-influencer","/api/v1/clipper/youtube"],"error":"429 RENDER_CONCURRENCY_LIMIT_EXCEEDED before billing (X-Provider-Job-Concurrency-Limit / -Used headers); dry runs are never limited"},"rate_limits":{"metadata_reads_per_minute":60,"applies_to":"Authenticated GET requests, /mcp and /b2b/* (per key). Generate POSTs are bounded by concurrency, not a request rate.","error":"429 RATE_LIMIT_EXCEEDED with Retry-After and X-RateLimit-* headers"},"max_durations_sec":{"stock":{"min":15,"max":120,"default":30},"ai_video":{"allowed":[30,60],"default":30},"ai_influencer":{"max_spoken":120},"clips":"Set by the source video; up to 10 clips per job."},"text":{"ai_video_prompt_chars":1000,"ai_video_script_chars":2000,"ai_influencer_script_chars":2000,"blog_article_text_chars":6000,"cta_chars":120},"batch":{"endpoint":"/api/v1/batch","max_jobs":25,"endpoints":["/api/v1/generate-and-post","/api/v1/clipper/youtube","/api/v1/videos/text-to-video","/api/v1/videos/image-to-video","/api/v1/videos/ai-influencer"],"note":"Each item is billed and validated by its own endpoint; item idempotency keys default to <batch key>:<index>."}},"conventions":{"auth":{"header":"Authorization: Bearer <key>","alternative_header":"X-API-Key: <key>","live_key_prefix":"rb_","sandbox_key_prefix":"rb_test_","public_endpoints":["/api/v1/health","/api/v1/tools","/api/v1/capabilities","/api/v1/docs"]},"idempotency":{"header":"Idempotency-Key","length":{"min":8,"max":256},"required_on":"Every paid render (400 IDEMPOTENCY_KEY_REQUIRED on stock and blog when missing).","replay_header":"x-idempotent-replay","retention_hours":24,"behavior":"Same key + same body replays the first response without a second charge. The response is stored when the request is answered, also when the client had already disconnected.","duplicate_requests":{"applies_to":["/api/v1/generate-and-post","/api/v1/jobs","/api/v1/blog-to-video","/api/v1/videos/magic","/api/v1/videos/text-to-video","/api/v1/videos/image-to-video","/api/v1/videos/ai-influencer","/api/v1/clipper/youtube","/api/v1/avatars","/api/v1/avatars/{avatar_id}/looks"],"same_request":"Same account, same endpoint, same JSON body (key order ignored) and same x-repeat-token header, whatever the Idempotency-Key. Sandbox keys and dry runs are never deduplicated.","while_first_is_running":"The second request waits up to 10 s for the first answer and returns it; if the first is still running it gets 409 REQUEST_IN_PROGRESS (retryable, Retry-After: 5). Nothing is created or charged for the second request.","after_first_was_accepted":"For window_seconds after the first request was accepted, the same request returns the first response (x-idempotent-replay: true, x-idempotent-replay-match: body; in the JSON body meta.replayed: true and meta.replay_reason: \"identical_request\"): no second job or avatar, no second charge.","after_first_was_rejected":"A rejected request (4xx, 5xx or success false) is not remembered: the next attempt runs and is charged once. Neither is an accepted one whose jobs have all failed, or whose avatar failed or was deleted.","repeat_on_purpose":"Change the body, or send a different x-repeat-token header (any string up to 128 characters, e.g. take-2).","window_seconds":300,"replay_match_header":"x-idempotent-replay-match","repeat_token_header":"x-repeat-token"}},"polling":{"endpoint":"GET /api/v1/jobs/{job_id}","terminal_statuses":["completed","failed","cancelled","dead_lettered"],"result":"data.job.artifacts.videoUrl (videoUrls, thumbnailUrl, title, description, script, durationSec, clips[])","suggested_interval_sec":10},"webhooks":{"field":"webhook_url","modes":["stock","clips","ai_video","ai_video_image","ai_influencer"],"requirements":"Public https URL (no IPs or internal hosts).","event_header":"X-ReelsBuilder-Event: generation.job.terminal","body":"{ event (job.completed | job.failed), job_id, status, video_id, video_url, error, agent_run_id, poll_url, timestamp }","signature":{"header":"X-ReelsBuilder-Signature","format":"t=<unix>,v1=<hex>","algorithm":"HMAC-SHA256 over `${t}.${raw_body}`, hex","secret":"GET /api/v1/webhook-secret","tolerance_seconds":300},"retries_sec":[0,30,120],"timeout_sec":10,"note":"Always confirm the result with GET poll_url."},"listing":{"field":"listing","default":"private","values":["private","public"],"applies_to":"Every POST /api/v1 Generate endpoint.","result":"Videos are private by default: no public page, Discover, sitemap or feed entry. Send listing: \"public\" to list one. Independent of delivery.visibility, which only controls where the media files are stored.","invalid_error":"400 INPUT_INVALID before any charge"},"private_delivery":{"request":{"delivery":{"visibility":"private"}},"endpoints":["/api/v1/generate-and-post","/api/v1/jobs","/api/v1/clipper/youtube","/api/v1/videos/text-to-video","/api/v1/videos/image-to-video","/api/v1/videos/ai-influencer"],"result":"Media is stored privately; poll_url returns a signed, expiring link (default 24h).","unsupported_error":"422 PRIVATE_DELIVERY_UNAVAILABLE before any charge"},"sandbox":{"key_prefix":"rb_test_","behavior":"Generate calls return realistic fixtures; no job is created and nothing is charged."},"errors":{"envelope":"{ success: false, error: { code, message, retryable, details? }, meta? }","note":"AI video and AI influencer validation errors from the render route may still use the legacy { success:false, message } shape."},"dry_run":"POST /api/v1/clipper/youtube supports dry_run:true (free).","brand_kits":{"endpoints":["POST /api/v1/b2b/brands","GET /api/v1/b2b/brands","GET /api/v1/b2b/brands/{brand_id}","PATCH /api/v1/b2b/brands/{brand_id}","DELETE /api/v1/b2b/brands/{brand_id}"],"price":"free (no API credit charge)","scope":"Owner is always the API key's account; customer_id optionally pins a kit to one end customer and narrows reads and generation. Another account's kit is a 404.","fields":["brand_id (optional, your id)","customer_id","name (or website_url alone: built from the site)","website_url","refresh","confirm_authorized","logo_url","primary_color","accent_color","font_family (Google Fonts name)","style (label | minimal | bold_backdrop | split | auto)"],"logo":"Fetched once (public https PNG/JPG/WebP/SVG, max 8 MB), white background box removed, margins trimmed, aspect and luminance measured, stored on our CDN as normalized_logo_url. Short side under 64 px, broken or empty images: 422 LOGO_*.","colors":"Missing primary/accent are extracted from the logo. Text colours are contrast-checked (7:1) and never sit on a raw brand colour that fails.","style":"auto picks one variant per brand_id (stable hash), so every video of a brand looks the same.","generation":"Send brand_id (and optionally customer_id) on /generate-and-post, /jobs, /videos/text-to-video, /videos/image-to-video or /videos/ai-influencer. Unknown kit: 404 BRAND_NOT_FOUND before any charge. Or send website_url instead of brand_id: this account's kit for the domain is reused or built from the website before any charge (X-Brand-Kit-Id / X-Brand-Kit-Source built|reused / X-Brand-Kit-Stale headers); brand_id wins when both are sent; dry runs never crawl.","from_website":{"request":"POST /api/v1/b2b/brands { website_url } (no name; + optional customer_id, brand_id, refresh, confirm_authorized). Owner-sent fields (logo_url, colours, font, style, profile) are kept and locked.","crawl":"Home + about / pricing / customers (case studies) + one blog post discovered from the home page; same registrable domain only; at most 6 pages + 1 stylesheet; http/https, public addresses only (private, loopback, link-local and metadata addresses refused, also after DNS and on every redirect); 10 s per request, 2 MB per page, ~40 s total.","fills":["name","logo_url (inline header SVG / header logo image / apple-touch-icon / og:image / favicon, then normalized)","primary_color / accent_color (site theme and CSS colours that agree with the logo palette; else the logo palette)","font_family (verified Google Fonts family)","profile: industry, icp, offer, tone, cta, topic_pool (8-12), banned_topics (suggested), proof_points (verbatim spans of crawled pages with source_url; unverifiable claims dropped), languages"],"profile_model":"Claude (tool call); page text is treated as untrusted data. Without Claude the kit keeps the deterministic fields (autogen.analysis unavailable).","response":"source auto, domain, crawled_at, stale, fields_auto, locked_fields, authorized_by / authorized_at, autogen { pages, logo_source, color_source, font_source, socials, analysis, proof_points_dropped, warnings }, reused / refreshed.","brand_id_default":"domain slug: exampleclient.net -> exampleclient-net (next free -2, -3 ... on collision).","reuse":"One kit per (account, domain[, customer_id]): a second request returns it (200, reused: true, no crawl) unless refresh: true.","refresh":"PATCH { refresh: true } re-crawls; fields you set or edited are locked and never overwritten (unlock_fields releases them). Kits crawled over 30 days ago report stale: true and are still used.","guardrails":"Well-known brand domains need confirm_authorized: true (422 BRAND_CONFIRMATION_REQUIRED). The kit stores authorized_by + authorized_at; creation and refreshes are audit-logged per account.","errors":"422 BRAND_AUTOGEN_FAILED { reason: SITE_BLOCKED | SITE_UNREACHABLE | SITE_HTTP_ERROR | SITE_REDIRECTS_OFFSITE | NOT_HTML | NO_CONTENT | TIMEOUT } (free; nothing stored); 400 INPUT_INVALID for an IP, internal or malformed website_url."},"idempotency":"Optional Idempotency-Key on POST replays the first response; without one a duplicate brand_id is 409 BRAND_ALREADY_EXISTS.","limit_per_account":1000}}}