WideCast.ai

WideCast Playground

Every API, every variant, one scrolling page. Each card is a working example — params pre-filled, just hit Run or copy the code in your language.

GET/v1/account

Account info

Read-only, free. Your account profile, remaining credits, and connected platforms.

👤 Account info

No params — returns plan, credits, industry, and connected platforms.

Loading…

GET/v1/accounts

List connected accounts

Read-only, free. The social platforms currently connected to your account.

🔌 Connected accounts

No params — returns each connected platform + username + status.

Loading…

GET/v1/analytics

Analytics dashboard

Read-only, free — but SLOW (aggregates across connected platforms). Pick a period.

📊 Analytics dashboard

Aggregate follower / view / engagement stats for the chosen period.

Loading…

POST/v1/collect_ideas

Generate video ideas from a product/service

Synchronous — Run returns video ideas derived from a product/service description (≥10 chars) immediately. Consumes credits.

🧩 Ideas from a product

Describe a product/service + audience market, then Run. Ideas come back in the response.

Loading…

POST/v1/create_content

Create written content — a blog or social post

Generate written content (blog / Facebook / X / LinkedIn post) from a URL, an idea/topic, or pasted text. Async: submit, then this card auto-polls `/v1/status` until `completed` — `result.review_url` is the public content viewer. Consumes credits.

📝 Written content

Paste a URL / idea / text, pick the **content type** (blog, Facebook, X, LinkedIn) and **language**, then Run. WideCast queues the content; this card polls until it's ready and shows the viewer URL.

Loading…

POST/v1/create_image

Generate AI images (1-4 variations, numbered)

Synchronous. Charges **1 credit per image generated** (count=4 → 4 credits). Returns an `image_set` with each image labeled by `number` so an AI agent can render a numbered thumbnail list for the user to pick by number.

🖼️ Single portrait image

One 768×1344 portrait image (Reels/TikTok/Shorts ratio). The default — costs 1 credit.

Loading…

🎴 4 square variations to pick from

Generate 4 square variations (4 credits) so the user can pick one. Square ratio is the IG-feed default.

Loading…

POST/v1/create_video

Create video — from a script, an idea, or a blog/article

Every section below is a working example you can run as-is. Pick an industry pill to load a domain-specific script (Real Estate market data, Insurance regulation, News structural analysis…). WideCast is built for videos with depth — substantive narration, story structure, B-roll that matches the subject — not shallow entertainment clips.

📜 Script · English

You have a finished narration (~120 words). Pick how far to take it with the **output type** radio: `scene` stops at scenes-ready-for-review; `video` renders the final MP4 end-to-end. Pick an industry pill to load a domain script, edit it freely, then Run.

Loading…

💡 Idea · English

Just a brief — the AI writes the script. Pick **output type**: `text` stops at the editable script (Script Editor); `scene` continues to scenes-ready; `video` renders the final MP4. **Video length** picks short (~90s) or normal (~3 min). Pick an industry pill to load a brief, edit it, then Run.

Loading…

📰 Blog / Article · English

Paste a blog post or article — the AI condenses it into a video script. Default **output type** is `text` (stops at the editable script in the Script Editor, the UI default flow); switch to `scene`/`video` to go further. **Video length** picks short (~90s) or normal (~3 min). Only industries with a full article fixture appear here; pick a pill, edit the text, then Run.

Loading…

🎬 Video URL → Auto-Edit · English

Paste **any public video URL** (≤5 min) — a direct file link (S3 / R2 / transfer.sh / your CDN) OR a YouTube / TikTok / Facebook page URL. The server downloads it and turns the footage into a video (the footage becomes the B-roll). **Output type**: `text` = Remake (extract the transcript only → Script Editor); `scene` = scenes-ready; `video` = final MP4. The demo pills load Creative-Commons open movies — swap in your own URL. (Prefer uploading a file? See the **Video file** card below.)

Loading…

🎧 Audio URL → Audio-to-Video · English

Paste **any public audio/video URL** (≤5 min) — a direct file link (transfer.sh / file.io / S3 / R2 / your CDN) OR a YouTube / TikTok / Facebook page URL. The server extracts the audio and uses it as the narration, generating matching scenes. **This is the right path for an AI agent forwarding a chat-attached voice memo** — drop the file on a public host, pass the URL. **Output type**: `text` = transcript only; `scene` = scenes-ready; `video` = final MP4. (Prefer uploading a file? See the **Audio file** card below.)

Loading…

🎬 Video file → Auto-Edit · English

**Upload a video file** (≤5 min) — the footage becomes the video (Auto-Edit). **Output type**: `text` = Remake (transcript only); `scene` = scenes-ready; `video` = final MP4. Clicking **Run** uploads the file as multipart/form-data.

Loading…

🎧 Audio file → Audio-to-Video · English

**Upload an audio file** (≤5 min) — the audio becomes the narration and the AI builds matching scenes. **Output type**: `text` = transcript only; `scene` = scenes-ready; `video` = final MP4. Clicking **Run** uploads the file as multipart/form-data.

Loading…

POST/v1/edit_session

Open/close the per-video edit session

Synchronous, free. Manages a per-video in-memory edit session that makes an AI editing run safe under PARALLEL scene edits and gives instant read-after-write. `start` caches the whole video in memory (crash-safe via a write-ahead file) so every /v1/modify_scene write lands in the cache and ElasticSearch is written ONCE at commit; `commit` flushes to storage (REQUIRED to finish — idle sessions auto-commit after 45 min); `abort` discards staged edits; `status` reports {active, staged_writes}. If the response has cache_enabled=false the server is in legacy direct-write mode — proceed without a session.

▶️ Start an edit session before the first scene edit

Caches the whole video document in memory so parallel modify_scene writes are conflict-free and reads are instant. Returns {object:'edit_session', action:'start', cache_enabled, active:true, ttl_seconds:2700}.

Loading…

✅ Commit after the last scene (REQUIRED to finish)

Flushes the cached edits to permanent storage. An idle session auto-commits after 45 minutes as a backstop, but call commit explicitly to finish promptly.

Loading…

GET/v1/foundation_videos

Browse the foundation-video template library

Read-only, free. The curated FOUNDATION-VIDEO template library — proven starter angles for an industry that a user can adapt into a new video. A navigation / discovery aid: creates or modifies nothing. Re-promoted to the public surface 2026-07-13 (Round 30). `industry` falls back to the account's saved industry.

🎬 Browse templates for an industry

List curated foundation-video templates. Returns {object:'list', data:[{id, title, description, thumbnail_url, industry, group}], total}. Omit industry to use the account's saved industry.

Loading…

POST/v1/modify_scene

Edit one scene (media / overlay / layout / audio / text / metadata)

Synchronous for most branches, no credit charged until /v1/export_video re-renders the final MP4. Pick ONE scene by `voice_file` (the stable per-scene UID — preferred), `id` (display/order, UNSTABLE), or `text` (fuzzy). Then send exactly ONE field family per call — the only intentional multi-family call is `layout.batch`, which composes layout-only children. Branches: (A) mediaUrl/mediaType — background media swap (roll-aware) (B) remotion.upload_overlay — FREE agent-supplied image → Remotion spec (NOT Regenerate Overlay) (C) remotion.object.rect — PREFERRED overlay layout (read layout_id from /v1/scene_geometry first; uses 280×498 preview coords) (D) remotion.group.rect — low-level wrapper edit (canvas or preview) (E) overlay.narrator.rect — narrator box layout in 280×498 preview (F) overlay.caption.y — vertical-only caption placement in 280×498 (G) layout.batch — composes E/F/C/D atomically (one persist, one MQTT) (H) voice.upload — async; user-supplied narration audio (I) narrator.upload_video — async; user-supplied A-roll video (J) roll.active / roll.switch — sync A/B-roll data switch (K) segment.text — text correction (keeps audio timing) (L) metadata — pattern / type / visual / keyword / quote / talking_point segment.remotion_spec='none' = user-disabled overlay; do NOT auto-enable.

(A) Background swap — image, by voice_file

Most reliable. Roll-aware — B-roll updates mediaUrl/brollUrl; A-roll registers as brollUrl/user_asset_url without disturbing the narrator.

Loading…

(A) Background swap — match by narration text, video

Fuzzy match on the narration. May return a clarification — pick a voice_file and retry.

Loading…

(B) Upload Overlay — agent-supplied PNG → Remotion spec (raster path, FREE)

NOT Regenerate Overlay (paid). Raster path: classifier-driven graphic-vs-realistic decomposition with strict no-AI fallback. Prefer a portrait 720×1280 transparent PNG; ground the image in scene context (text/talking_point/visual/quote/keyword/type).

Loading…

(B) Upload Overlay — agent-authored SVG → svg2spec (PREFERRED, FREE)

URL ending .svg triggers svg2spec. Required: viewBox 0 0 720 1280. Each `` group becomes one Storyboard object with pixel-perfect placement (NO auto-fit). Per-group attrs: data-wc-object (REQUIRED stable id; unmarked groups become background), data-wc-kind ∈ {object,text,bar,mark,callout}, data-wc-anim ∈ {slide-up,slide-down,slide-left,slide-right,pop,grow-x,grow-y,fade,…}, data-wc-z (paint order). Deterministic — no classifier. SVG errors → 422 svg2spec_failed.

Loading…

(O) Overlay text edit — retype a poster line (0-LLM, SVG-sourced)

Changes ONLY the words of one overlay object. Server rewrites {voice_file}_overlay.svg, re-rasterizes only the touched group, patches the spec in place (layout preserved). Requires spec._source=svg2spec (endpoint posters / uploaded SVG overlays); typography/image scenes return 422 no_svg_overlay_source. Poster copy rules (≤3 lines, ≤4 words/line, uppercase) come back as applied.warnings only. Thumbnail clone is not auto-synced — repeat the edit on the thumbnail voice_file.

Loading…

(C) Object-layer rect — preferred overlay layout (one_by_one)

Read boxes.remotion.object_layer.objects from /v1/scene_geometry; pass the logical *.one_by_one layout_id to transform all timed sequence items together. WideCast keeps the group wrapper unchanged.

Loading…

(C) Object-layer rect — move a single overlay text object

Per-object layout_id (e.g. main.obj_03_text). Server maps the preview rect onto raw Storyboard offsets/sizes.

Loading…

(D) Group rect — move whole Storyboard group up by 120px (canvas)

Low-level wrapper edit — child objects untouched. Canvas (720×1280) is NOT clamped; negative y is allowed.

Loading…

(D) Group rect — resize + scale children

Resize triggers `scale_children`: wrapper + every child object + root background.bbox scale together. `wrapper_only` is advanced.

Loading…

(E) Narrator layout rect — 280×498 preview coords

Preserves narrator metadata + source-space segment.narrator_face. Marks overlay.narrator.touched=true so auto-fit doesn't overwrite. No media/audio/timeline/Remotion-spec changes.

Loading…

(F) Caption Y — vertical placement only (280×498)

ONLY Y — does not change x/w/h, visibility, config, segment.text, segment.words, audio, duration, or Remotion specs.

Loading…

(G) Layout batch — multiple layout fields directly

One persist, one MQTT scene_modified. Allowed children: overlay.narrator.*, overlay.caption.y, remotion.object.rect, remotion.group.rect.

Loading…

(G) Layout batch — via the explicit `layout.batch` envelope

Same composer, alternate request shape. Useful when the orchestrator already knows it's batching.

Loading…

(H) Upload Voice — user-supplied audio (ASYNC; queued)

Free; not Use-AI-Voice. Returns scene_voice_upload_queued + queue_id. Wait for MQTT scene_voice_upload_applied, then call /v1/video_data to verify.

Loading…

(I) Upload Narrator Video — user-supplied A-roll (ASYNC; queued)

Free; user-supplied video. If target is B-roll, server preserves the previous background and switches to A-roll on completion.

Loading…

(J) A/B-roll switch — show narrator A-roll

Sync data switch. Preserves both lanes; swaps the active runtime fields. A→B mirrors the editor's _switched file-family protection.

Loading…

(K) Segment text correction

Rebuilds word timings over existing audio; no duration/timeline change.

Loading…

(L) Scene metadata — validated pattern + quote

pattern is validated against ai_segment_text canonical values; type ∈ {HOOK, STAT, KEY POINT, DATA, FACT, CALL TO ACTION}. pattern='typography_only' auto-clears visual.

Loading…

(M) Remotion add element — bare-string shortcut for kind=text

Add-only: appends a new Storyboard text object. Returns a new layout_id; follow up with layout.batch + remotion.object.rect to land it inside safe zones.

Loading…

(M) Remotion add element — stat with position hint

kind=stat draws value + label. position picks a server-side default rect on the named side (top/bottom/left/right/center).

Loading…

(M) Remotion add element — image with explicit 280×498 preview rect

kind=image places the URL inline. Use rect to pin the position; coordinate_space defaults to 'preview' (280×498).

Loading…

(N) Disable overlay — hide Remotion overlay without deleting the spec

Sets segment.remotion_spec='none' (opt-out sentinel). Does NOT delete {voice_file}_spec.json or the overlay poster. Must be sent ALONE. Re-enable later via (B) Upload Overlay.

Loading…

POST/v1/notification/send

Send a self-notify notification (email default + Telegram)

Synchronous, no credit. Push a notification to YOUR OWN account. EMAIL is the default channel (always sent when the account has an email on file); if you have also completed `Connect Telegram` at https://widecast.ai/#setup, the same notification is ALSO sent to Telegram. `subject` (required) is the email subject line and is prepended in bold before the Telegram body. No email + Telegram connected → Telegram only; neither → 400 no_delivery_channel.

🔔 Plain notification (email + Telegram if connected)

subject + message. Email is always sent when an email is on file; Telegram is added when connected. Response `delivery` lists the channels that succeeded.

Loading…

✨ HTML-formatted body

Use a small subset of HTML tags (`b`, `i`, `u`, `s`, `code`, `pre`, `a`) in the body for emphasis or links. The subject is bolded automatically.

Loading…

POST/v1/platform_settings

Save publish settings

Free. Save one platform's publish PREFERENCES (e.g. youtube privacy, reddit subreddit, facebook page id). ⚠ Running writes to your account.

💾 Save publish settings

Pick a platform and provide its settings object. ⚠ Run writes to your account.

Loading…

GET/v1/platform_settings

Load publish settings

Read-only, free. The saved per-platform publish preferences (privacy / page / subreddit) — not access controls.

⚙️ Load publish settings

No params — returns the saved settings object keyed by platform.

Loading…

GET/v1/production_plan

Weekly production plan

Read-only, free. The weekly production plan (ideas + topics). Omit the week range for a pure read of the current plan.

📅 Production plan

Fetch the current plan (page 0). Add a week range to scope it.

Loading…

POST/v1/publish

Publish a video / blog / text to social platforms

Distribute content to the social platforms connected to your account. Provide **exactly one** of `topic_id` (an existing WideCast video/blog), `text` (arbitrary post), or `video_url` (an external video FILE url, needs `title`). `platforms` defaults to **all connected**. **⚠ Running posts PUBLICLY and charges 1 credit.** The response carries the upstream `request_ids` — poll `GET /v1/status/{request_id}` for per-platform post URLs.

📣 Publish an existing WideCast video/blog

Pass the `topic_id` from /v1/create_video or /v1/create_content. WideCast auto-detects article vs video (a video must be rendered first). Omit `platforms` to post to all connected.

Loading…

✍️ Post arbitrary text

Post text you provide directly (not from a WideCast topic) to all connected text platforms.

Loading…

🎬 Post an external video URL

Give a direct video FILE url + a `title`; WideCast downloads it and posts it.

Loading…

GET/v1/roadmap

Content roadmap

Read-only, free. The account's content roadmap — weeks, slots, completion, streak.

🗺️ Roadmap

Fetch the roadmap for a cycle (default 1).

Loading…

POST/v1/scene_geometry

Read data-only scene layout geometry (narrator / caption / Remotion boxes)

Synchronous, free, read-only. Use AFTER /v1/video_data and BEFORE /v1/modify_scene or /v1/scene_inspector. Resolves one scene by stable voice_file (preferred), loads {voice_file}_spec.json if available, and returns narrator/caption/Remotion Storyboard display boxes in one 280×498 editor-preview coordinate space — plus dead zones, collision violations, and warnings. Designed for LLM-only agents that cannot see images: reason over JSON, then call /v1/modify_scene with a layout.batch (or single-field) edit. Never broadcasts MQTT, never renders screenshots, never modifies the video.

🧭 Audit a scene by voice_file (preferred)

Default response — actionable data only. Cheapest, most reliable selector; paste the scene's voice_file from /v1/video_data.

Loading…

📝 Audit a scene by fuzzy narration text

Use when the user names a scene by what's said. Multi-match returns a ClarificationResponse — pick a voice_file and retry.

Loading…

🔬 Server/debug audit — include violations + warnings + counts

Opt back into the full debug payload (violations[], warnings[], summary.error_count/warning_count, remotion_poster_*). The mechanical collision math is approximate; treat results as hints.

Loading…

POST/v1/scene_inspector

Live browser inspector for an open scene editor

Synchronous, free. Use ONLY after data-first audit with /v1/video_data, when you specifically need BROWSER TRUTH (mounted DOM, computed boxes, preview play state, a small 280×498 screenshot) — not what's stored in ES. Server publishes a tiny MQTT probe to every open editor tab for this video, elects ONE healthy foreground/active browser within ~800ms, then sends the command there. If no editor is open the response is `status="unavailable"` with `code="no_live_editor"` (no presence) or `"no_active_editor"` (presence but unresponsive) — fall back to /v1/video_data + fetching `remotion_spec_url`.

🌐 Who has the editor open right now?

Presence list of open editor tabs (browser/OS/last_seen). No election — purely discovery.

Loading…

📐 Computed boxes for scene XcR0k (preferred structural audit)

Returns getBoundingClientRect() for elements in the scene. Cheaper than screenshots and survives resolution changes.

Loading…

📸 Small 280×498 screenshot — temporary public URL (15-min TTL)

Full composite (background + Remotion overlay poster + narrator + caption). Response is a regular SceneInspectorResponse whose `result.screenshot.url` is a public path the agent fetches with `curl ` (no auth header). Shape: `{url:'https://origin.widecast.ai/downloads///inspector/_.jpg?v=', mime_type:'image/jpeg', width:280, height:498, bytes:N, expires_at:'', ttl_seconds:900}`. Every call publishes a fresh unique file (16-hex token) — URLs are never reused across calls, matching the realtime semantics of inspector data. The server only responds after fsync+rename, so the URL is guaranteed readable when this response arrives.

Loading…

🎨 Overlay-only on solid black — audit typos/diacritics/glyph/grammar/semantic

Companion to screenshot_scene_280x498. Server composites ONLY the Remotion overlay poster on a solid black 280×498 canvas (no background image, no narrator, no caption). Purpose: catch text-quality issues (readability / typos / grammar / semantic drift / missing Vietnamese diacritics / □ tofu glyph / punctuation) that the busy background can visually camouflage. Response shape: `result.overlay_poster.{url, mime_type, width, height, bytes, expires_at, ttl_seconds}` + `result.review_checklist` — a bilingual reminder walking the agent through 8 audit dimensions before PASSing the scene. Filename is STABLE (`_poster.jpg`, overwritten each call); `?v=` bumps every write so the URL string is fresh in every response. Server still fsync+atomic-renames BEFORE responding. Errors: 409 `overlay_not_available` when the scene has no poster (`remotion_spec='none'` or spec not built), 500 `overlay_publish_failed`.

Loading…

POST/v1/search_broll

Search stock B-roll (video clips or real photos)

Synchronous, free. Search stock B-roll for a keyword. Use **kind=video** for stock clips (Pexels/Pixabay/Shutterstock — same engine as the broll.js Stock tab) or **kind=image** for real photos (Google — broll.js Photos tab). Returns a list with each result labeled by `number` so an AI agent can render a numbered thumbnail list for the user to pick by number. **Special**: when `keyword` is the exact single word `"grid"` (case-insensitive) AND `kind="video"`, the server skips Pexels/Pixabay/Shutterstock and returns WideCast's curated internal grid-background video list in the SAME `results[]` shape. Phrases like `"grid background"` still hit normal stock search.

🎬 Stock video clips (portrait)

Search Pexels + Pixabay + Shutterstock for portrait-ratio video clips matching a keyword. Returns up to `limit` results, each pre-numbered for an agent to render as a thumbnail picker.

Loading…

🖼️ Real photos (Google search)

Search Google image search for real photos matching a keyword — best when the user wants a SPECIFIC real-world asset (landmark, product, person in the news).

Loading…

🪟 Curated WideCast grid backgrounds (special `keyword="grid"`)

Single word `"grid"` + `kind="video"` triggers the curated internal grid-background list — same result shape as normal stock search. Picked URL → /v1/modify_scene `field_name="mediaUrl"` like any other clip. Note: `"grid background"` (multi-word) still hits normal stock search.

Loading…

GET/v1/skills/editing

Get the AI-video-editor skill (download-zip + Read local)

Load the WideCast AI-VIDEO-EDITOR playbook for refining/editing an EXISTING video. Different from /v1/skills/writing — that one is for AUTHORING new scripts; this one is for EDITING already-generated scenes. **Delivery mode**: download_zip (experiment, 2026-06-30). The response carries (a) a `preload_tools` hint block + (b) a 4-step instruction: mkdir + curl + verify + unzip, then Read `./.widecast-skill-video-editing/video-editing/SKILL.md` from local disk and follow its LOAD MAP. The skill content is identical to previous inline-content mode (master INDEX + 5 core modules + per-scene modules + style libs). **Preload tools first** (`preload_tools` field): before running the 4 setup commands, copy `preload_tools.one_shot_query` into your MCP host's `ToolSearch` `query` param. This loads EVERY WideCast tool (video_data, scene_geometry, scene_inspector, modify_scene, search_broll, upload_asset, etc.) in one round-trip. Some hosts (Codex, Claude Code) default to NARROW keyword search and drop critical tools like `widecast_modify_scene` — the edit flow then fails mid-run. The list is auto-derived from the live MCP registry, so adding a new tool later is zero-config. Fallback for hosts without `select:` syntax: `preload_tools.broad_query` (`widecast`) with `broad_max_results` (~30). **Always-returned `contract` field** (~1.5 KB cross-cutting rules) survives even if the agent cannot complete the download — it is the safety net. **Host requirements**: local shell + curl + unzip + a file-reading tool (`Read`/`cat`/view_file). If your host has none of these, you cannot follow the full skill in this mode. **Adding/editing modules**: drop `.md` files under `widecast/skills/video-editing/` → `bash deploy_widecast.sh` (no Flask restart needed for content updates). Server picks up new zip mtime automatically on next request. **Reverting**: server env `WIDECAST_EDITING_DELIVERY_MODE=inline_content` + Flask restart → falls back to multi-module inline-content mode (with `available_modules[]` + per-module `?module=` lazy-load).

📦 Get the preload-tools hint + download instructions for the editing skill zip

Returns (a) the `preload_tools` block — copy `one_shot_query` into your ToolSearch to load every WideCast tool at once — and (b) the 4-step setup (mkdir + curl + verify + unzip) plus the always-on `contract` field. Agent runs Step 0 (preload) FIRST, then the 4 setup commands locally, then Reads SKILL.md from `./.widecast-skill-video-editing/video-editing/SKILL.md` and follows its LOAD MAP. `preload_tools.tools[]` is auto-derived from the live MCP registry so it stays in sync as new tools are added.

Loading…

POST/v1/upload_asset

Upload an audio / video / image / document (24-hour S3 URL)

Synchronous, no credit. Upload an audio / video / image / document (HTML / PDF / Markdown) file and get back a public S3 URL valid for 24 hours. Use the URL as `audio_url` / `video_url` on /v1/create_video, paste into `script_text` as an inline `![alt](url)` for images, or `curl ` to fetch a document body before passing it as blog_text / script_text. Server cap 500 MB.

📎 Upload an asset (audio / video / image / document)

Pick any audio (mp3 / wav / m4a), video (mp4 / mov / webm), image (jpg / png / webp), or document (html / pdf / md) file ≤ 500 MB. Click **Run** — the response carries a 24-hour public S3 URL you can pass into /v1/create_video as `audio_url` / `video_url`, paste into `script_text` as an inline `![alt](url)` for images, or `curl` the URL to read a document body for blog_text / script_text.

Loading…

POST/v1/video_data

Read structured scene data (data-first audit/edit entry point)

Synchronous, free. First step for data-first scene audit/edit — call this BEFORE /v1/modify_scene or /v1/scene_inspector. URL-RESPONSE CONTRACT: the HTTP response is a small envelope; the full video_data tree is published to a temporary public JSON file on `origin.widecast.ai` and the envelope carries `data.url` + size + 15-min TTL + a 3-step `instructions` block. The agent fetches the JSON file with `curl ` and reads it locally — the full tree is NOT inlined. Bypasses MCP per-tool-call output caps that previously truncated 50–300 KB payloads mid-JSON. Every call publishes a NEW unique file so URLs are never reused (matches realtime semantics). The published JSON file content is the same as the legacy inline response: annotated segment dicts with stable-identity fields, Remotion spec metadata, and coordinate-space hints (720×1280 canvas vs 280×498 legacy editor preview). `voice_file` is the stable per-scene UID; `segment.id` is only current display/order.

📜 Audit a video — list every scene + Remotion spec status

Default response. Paste a topic_id (the id returned by /v1/create_video) to see scene_identity, every scene's voice_file (stable UID), current mediaUrl/mediaType, narrator config, and remotion_spec_url (cache-busted) + remotion_spec_state (ready/missing/disabled). Spec content is NOT inlined — fetch remotion_spec_url only when state is ready and you need object boxes.

Loading…

🔬 Server/debug audit — include remotion_poster_*

Opt back into the diagnostic poster keys per-segment (file, url, version, state, exists, warnings). For server/debug audits only — agents don't act on these.

Loading…

GET/v1/videos

List recent videos

Read-only, free. Lists the account's recent videos/scripts (20 per page).

🎬 Recent videos

List the most recent videos. Increase `from_record` to page.

Loading…