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.
/v1/accountAccount info
Read-only, free. Your account profile, remaining credits, and connected platforms.
👤 Account info
No params — returns plan, credits, industry, and connected platforms.
Loading…
/v1/accountsList connected accounts
Read-only, free. The social platforms currently connected to your account.
🔌 Connected accounts
No params — returns each connected platform + username + status.
Loading…
/v1/analyticsAnalytics 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…
/v1/collect_ideasGenerate 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…
/v1/create_contentCreate 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…
/v1/create_imageGenerate 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…
/v1/create_videoCreate 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…
/v1/edit_sessionOpen/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…
/v1/foundation_videosBrowse 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…
/v1/modify_sceneEdit 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 `
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…
/v1/notification/sendSend 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…
/v1/platform_settingsSave 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…
/v1/platform_settingsLoad 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…
/v1/production_planWeekly 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…
/v1/publishPublish 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…
/v1/roadmapContent roadmap
Read-only, free. The account's content roadmap — weeks, slots, completion, streak.
🗺️ Roadmap
Fetch the roadmap for a cycle (default 1).
Loading…
/v1/scene_geometryRead 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…
/v1/scene_inspectorLive 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
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 (`
Loading…
/v1/search_brollSearch 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…
/v1/skills/editingGet 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=
📦 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…
/v1/upload_assetUpload 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 `` for images, or
`curl
📎 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 `` for images, or `curl` the URL to read a document body for blog_text / script_text.
Loading…
/v1/video_dataRead 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
📜 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…
/v1/videosList 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…