# PageToVid (remote · pagetovid.com)

Turn any web page into a narrated video: films the real site, writes, voices and captions it

- Trust score: 85/100 (high trust)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- remote · `pagetovid.com`: 85/100 (this document), [markdown](https://verifymcp.io/servers/com-pagetovid-pagetovid/pagetovid.md), [page](https://verifymcp.io/servers/com-pagetovid-pagetovid/pagetovid)

## Channel facts

- Endpoint: `https://pagetovid.com/mcp`
- Transports: `streamable-http`
- Auth: `required`
- Version: `1.192.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Endpoint Security**: 97/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token.
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
  - The authorisation server supports Client ID Metadata Documents, the current MCP client-registration mechanism.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 60/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 14950 tokens (~182/item across 82 items; 82 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 53/100
  - Stability observed for 16 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 3 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 83 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### How do I install the PageToVid MCP server?

PageToVid is a hosted endpoint at https://pagetovid.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http com-pagetovid-pagetovid 'https://pagetovid.com/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "com-pagetovid-pagetovid": {
      "url": "https://pagetovid.com/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "com-pagetovid-pagetovid": {
      "type": "http",
      "url": "https://pagetovid.com/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.com-pagetovid-pagetovid]
url = "https://pagetovid.com/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-pagetovid-pagetovid": {
      "type": "remote",
      "url": "https://pagetovid.com/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add com-pagetovid-pagetovid --url 'https://pagetovid.com/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  com-pagetovid-pagetovid:
    url: "https://pagetovid.com/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "com-pagetovid-pagetovid": {
      "Transport": "http",
      "Url": "https://pagetovid.com/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add com-pagetovid-pagetovid -t streamable-http -u 'https://pagetovid.com/mcp'
```

### Other

```json
{
  "mcpServers": {
    "com-pagetovid-pagetovid": {
      "type": "http",
      "url": "https://pagetovid.com/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-05 (score 85, 0)

- [functional] This server's schema is too large to store in full, so we cannot compare its tools day to day

### 2026-11-04 (score 85, +1)

- [functional] This server's schema is too large to store in full, so we cannot compare its tools day to day

### 2026-11-03 (score 84, 0)

- [functional] This server's schema is too large to store in full, so we cannot compare its tools day to day

### 2026-11-02 (score 84, +1)

- [functional] This server's schema is too large to store in full, so we cannot compare its tools day to day

### 2026-11-01 (score 83, 0)

- [functional] This server's schema is too large to store in full, so we cannot compare its tools day to day

### 2026-10-31 (score 83, +1)

- [functional] This server's schema is too large to store in full, so we cannot compare its tools day to day

### 2026-10-30 (score 82, 0)

- [functional] This server's schema is too large to store in full, so we cannot compare its tools day to day

### 2026-10-29 (score 82, +1)

- [functional] This server's schema is too large to store in full, so we cannot compare its tools day to day

## MCP tools (82)

### `create_video` (~1288 tokens)

Create video from web page

[40 credits] [paid plans: + 40 per AI still unless ai_mode none; dry_run quotes] Turns a public web page into a narrated video: AI voiceover, motion graphics, optional subtitles. Asynchronous (minutes, sometimes past fifteen): returns a receipt with the video_id at once; get_video for the full status. A page behind a login is filmed only with a capture session from the VS Code or browser extension (Scale plan and up).

Input parameters:

- `ai_budget` (object): Ceiling on AI visuals, given to the planner.
- `ai_mode` (string): AI visuals for beats the page cannot show (paid plans): none; assist = a few stills; rich = stills and clips within ai_budget. Omitted: assist where the plan generates, else none. Charged per visual,…
- `aspect_ratio` (string): 9:16 (Reels/Shorts) films the page's MOBILE layout in a phone viewport; 16:9, 1:1 and 4:5 film the 1280-wide desktop layout.
- `brand_name` (string): Name on the intro and outro cards; default the site's.
- `callback_url` (string): https URL POSTed a JSON event when the render ends (done/held/error/cancelled), 3 tries. Verify: X-PageToVid-Signature = "sha256=" + hex HMAC-SHA256(secret, X-PageToVid-Timestamp + "." + raw body); r…
- `callout` (string): What points at a screencast's subject.
- `caption_animation` (string): What a spoken word does; overrides the look's.
- `caption_emphasis` (string): Brand-coloured words: **asterisked** (manual), plus figures (auto), or none.
- `caption_style` (string): Overrides the look's captions.
- `cursor_style` (string): The pointer a recording draws.
- `draft` (boolean): Free preview: 1/3 resolution, DRAFT mark, no AI visuals. 5/hour. rerender_video without draft then makes the paid film, no re-plan.
- `dry_run` (boolean): Quote only; nothing made or charged.
- `edit_style` (string): Cutting rhythm (list_motions); a scene's own transition still wins.
- `end_screen` (string): The closing card.
- `focus` (string): Context the page cannot show (an offer, the audience, a code, what to avoid). Anything here may be voiced as FACT in the customer's voice; a line in quotation marks is placed verbatim, usually as the…
- `generate_motion` (boolean): Custom motion graphics for beats no built-in visual fits (AI plans or a film pass, else built-in).
- `goal` (string): What the video is for; shapes the script.
- `grade` (string): Footage colour grade; overrides the look's.
- `idempotency_key` (string): Same key within 24 h returns the original video, uncharged. Without one, an identical call within 120 s returns the first video (idempotent_replay).
- `intro` (boolean): Opening title card (1.5 s). Omitted: true, except goal "ad" (opens on its hook).
- `language` (string): Language of the script and voiceover. Omitted: the page's own language, else its country domain's (.fr, .de…), else the account's.
- `look` (string): The film's look: captions, cutting, sound cues, music family and motion together; auto varies with goal, shape and the site's films (list_video_options).
- `max_credits` (integer): Refuse (budget_exceeded + quote) above this.
- `model` (string): Clip model (list_models) for ai_mode rich, or auto (routed per scene, see optimize); omit for the house clip.
- `music` (string): Music bed, "none", or "asset:<id>" (upload_asset). auto fits the goal and differs from the site's previous films.
- `optimize` (string): With model auto: quality, balanced (default), speed or cost.
- `outputs` (array): One storyboard in 1-4 shapes: the first is this video (replaces aspect_ratio), each other a sibling (get_video formats), a render each, started when the first ends.
- `outro` (boolean): Closing call-to-action card.
- `press_effect` (string): What the picture does on a click.
- `pronunciations` (array): Voice-only lexicon, e.g. [{"text":"Nginx","say":"engine x"}]; captions keep the text.
- `quality_gate` (object): auto_fix (default): dead air and colliding overlays fixed before rendering (auto_fixes). hold: also, a film scored under min_score ends "held" until release_video. deliver: as authored. The score jud…
- `routing` (object): {planner?: flash|pro, footage?: prefer-recorded|record-fresh}. flash is the benched default (pro is a choice, not an upgrade); prefer-recorded reuses the site's banked flow recordings.
- `sfx_level` (string): Sound-design loudness; overrides the look's.
- `subtitles` (boolean): Burn captions in and emit a .vtt sidecar.
- `target_seconds` (integer): Length asked for: the words are written to fit it.
- `theme` (object): Palette, type and mode; list_themes has the presets and rules, detect_brand reads a site's. Omitted: a filmed video adopts the page's CSS.
- `tone` (string): Narration delivery, e.g. calm, or a short direction.
- `url` (string, required): Public http(s) page to film; you must have the right to.
- `voice` (string): Narrator (all multilingual). auto picks a voice that fits the goal and tone and differs from the site's previous films.

Output parameters:

- `ai_mode` (string)
- `ai_prices` (object): Credits per clip, per still, and the ai_budget maximum (null: uncapped).
- `credits_charged` (number)
- `draft` (boolean)
- `dry_run` (boolean)
- `editor_url` (string)
- `error` (string|null)
- `estimate` (object)
- `eta_seconds` (number)
- `format_group_id` (string)
- `formats` (array): Every shape: video_id, aspect_ratio, status, primary, video_url.
- `idempotent_replay` (boolean)
- `next_step` (string)
- `notes` (array)
- `page_url` (string|null)
- `phase_label` (string)
- `poll_after_seconds` (number)
- `progress` (number)
- `quote` (object)
- `status` (string)
- `upgrade` (object)
- `video_id` (string)
- `video_url` (string|null)
- `warnings` (array)
- `webhook_secret` (string)

### `create_animation` (~793 tokens)

Create an animated video from your own content

[40 credits] From content you hold (figures, notes, story), no URL. You write scenes; each drawn, voiced, captioned (list_motions: 25 visuals, some with kinds; visual "rushie" = 964 designed cards, e.g. data {rushie:{template:"end-card",props:{headline,mark,url,cta}}}). AI clips (paid plans) only if asked: data.generate (+data.clip) per scene, or ai_mode rich (assist: stills), the server picks scenes, writes prompts; dry_run shows ai_plan.added. Returns a receipt; get_video for the full status.

Input parameters:

- `ai_budget` (object): A ceiling on this render's AI generation; the receipt's ai_plan says what was asked for and its cost. Omitted: uncapped.
- `ai_mode` (string): As create_video. Server picks scenes and prompts; omitted: data.generate only.
- `aspect_ratio` (string): 16:9 for web and YouTube, 9:16 for Reels/Shorts/TikTok, 1:1 and 4:5 (1080×1350) for feeds.
- `brand_name` (string): Name shown on the intro and outro cards.
- `callback_url` (string): As create_video.
- `callout` (string): As create_video.
- `caption_animation` (string): As create_video.
- `caption_emphasis` (string): As create_video.
- `caption_style` (string): As create_video.
- `character` (string): With ai_mode: in every added shot.
- `cta_text` (string): Call to action on the closing card.
- `cursor_style` (string): As create_video.
- `draft` (boolean): As create_video.
- `dry_run` (boolean): Quote only; nothing made or charged.
- `edit_style` (string): As create_video.
- `end_screen` (string): As create_video.
- `generate_motion` (boolean): As create_video.
- `grade` (string): As create_video.
- `idempotency_key` (string): As create_video.
- `intro` (boolean): Include the branded opening title card.
- `language` (string): As create_video. Write the narration in it.
- `look` (string): As create_video.
- `max_credits` (integer): Refuse (budget_exceeded + quote) above this.
- `model` (string): As create_video.
- `music` (string): As create_video.
- `objects` (array): With ai_mode: in every added shot.
- `outputs` (array): As create_video.
- `outro` (boolean): As create_video.
- `press_effect` (string): As create_video.
- `pronunciations` (array): As create_video.
- `scenes` (array, required): The scenes, in order, 1-20, all validated before anything is charged. On top of the render, a still (data.generate) costs 40 and a clip (data.clip) 311, refunded if it fails.
- `sfx_level` (string): As create_video.
- `source_url` (string): Attribution only; nothing is fetched or filmed.
- `subtitles` (boolean): As create_video.
- `target_seconds` (integer): A check, not a setting: your words set the length. A script over 15% off is refused before any credit moves, with the words to cut or add. Omitted: the scenes alone must run at least 15 s, the film a…
- `theme` (object): As create_video. Omitted: the house palette.
- `title` (string): Name for the video. Defaults to the first scene's heading.
- `tone` (string): As create_video.
- `voice` (string): As create_video.

Output parameters:

- `ai_plan` (object)
- `credits_charged` (number)
- `draft` (boolean)
- `dry_run` (boolean)
- `editor_url` (string)
- `error` (string|null)
- `eta_seconds` (number)
- `format_group_id` (string)
- `formats` (array): Every shape: video_id, aspect_ratio, status, primary, video_url.
- `idempotent_replay` (boolean)
- `models_used` (array): Per generated visual: scene, kind, model, reason.
- `next_step` (string)
- `notes` (array)
- `page_url` (string|null)
- `phase_label` (string)
- `poll_after_seconds` (number)
- `progress` (number)
- `quote` (object)
- `status` (string)
- `upgrade` (object)
- `video_id` (string)
- `video_url` (string|null)
- `warnings` (array)
- `webhook_secret` (string)

### `cancel_video` (~88 tokens)

Stop a render and get the credits back

[Free] Stops a running render and refunds its render credit and any AI visual still in flight; AI visuals already made stay (reused free). Use it when get_storyboard shows a plan you do not want. A finished render cannot be cancelled. The video is marked cancelled at once; the worker stops at its next step.

Input parameters:

- `video_id` (string, required): The running video to stop.

Output parameters:

- `cancelled` (boolean)
- `credits_refunded` (boolean)
- `video_id` (string)
- `was` (string)

### `get_video` (~180 tokens)

Get video status and links

[Free] Reads this account. The full status of a render: phase and progress while it runs (with poll_after_seconds), then the files, length, credits, warnings and quality; on a free film, `upgrade` to relay once. `status` is one of, in pipeline order: draft, queued, analyzing, scripting, recording, voicing, rendering, held, done, error. In flight, so poll again after poll_after_seconds: queued, analyzing, scripting, recording, voicing, rendering. Terminal, so stop polling: held, done, error — a cancelled render ends as error with the reason in `error`, and a film can be done and still carry warnings. held: finished but unpublished by quality_gate. draft has not been queued.

Input parameters:

- `video_id` (string, required): The video_id returned by create_video.

Output parameters:

- `ai_report` (object): AI visuals: scenes_ai, generated, failed, skipped_budget, credits_spent and credits_refunded (both gross; credits_net is the cost), failures[], note. credits_spent 0 with generated scenes is correct…
- `aspect_ratio` (string)
- `auto_fixes` (array)
- `brand_name` (string|null)
- `callback` (object): Last webhook delivery: event_id, status, delivered, attempts, last_http_status, refused.
- `caption_style` (string|null)
- `completed_at` (string)
- `created_at` (string)
- `credits` (object): render, ai_clips, ai_images, other, refunded, total (charged minus refunded).
- `credits_by_reason` (object)
- `credits_charged` (number)
- `credits_refunded` (number)
- `draft` (boolean)
- `duration_seconds` (number|null)
- `editor_url` (string)
- `error` (string|null)
- `eta_seconds` (number)
- `filmed_url` (string|null)
- `format_group_id` (string)
- `formats` (array): Every shape: video_id, aspect_ratio, status, primary, video_url.
- `goal` (string)
- `has_warnings` (boolean)
- `height` (number)
- `intro` (boolean)
- `kind` (string)
- `language` (string)
- `length_remedy` (string)
- `length_report` (object): Why the film is this length: words, measured_wpm, voice_ms, action, rewrite ("skipped-authored": you wrote the words, so a re-render returns the same length), tempo (1 = untouched), final_gap_pct, sp…
- `length_within_tolerance` (boolean|null)
- `look` (string|null)
- `models_used` (array): Per generated visual: scene, kind, model, reason.
- `music` (string)
- `music_picked` (boolean)
- `outro` (boolean)
- `page_url` (string|null)
- `permanent_poster_url` (string|null)
- `permanent_subtitle_url` (string|null)
- `permanent_url` (string|null)
- `phase_label` (string)
- `poll_after_seconds` (number)
- `poster_url` (string|null)
- `progress` (number)
- `quality` (object): {score, issues[]}: a lead, not a verdict.
- `quality_gate` (object): min_score, on_fail, result, held.
- `quality_note` (string)
- `render_seconds` (number|null)
- `resolved`: Per option: {value, from}; list_options.inheritance names both.
- `slow_stage` (string)
- `source_url` (string|null)
- `stalled` (boolean)
- `status` (string)
- `style`
- `submitted_url` (string)
- `subtitle_url` (string|null)
- `subtitles` (boolean)
- `sync_report` (object): Only when scenes are off: tolerance_s, scenes_off, worst_drift_s, scenes[] {scene, scene_id, narration_s, visual_s, drift_s, words}.
- `target_seconds` (number)
- `tone` (string)
- `upgrade` (object): Free account's finished film: message plus checkout offers (clean_export, plan, pack_single, ai_film). Relay once.
- `video_id` (string)
- `video_url` (string|null)
- `voice` (string)
- `voice_picked` (boolean): true when the voice was chosen by PageToVid (voice "auto"), false when the caller named it.
- `warnings` (array)
- `watermarked` (boolean)
- `width` (number)

### `release_video` (~49 tokens)

Publish a held video

[Free] Publishes a video its quality_gate held (status "held") as it is: status becomes done. Nothing is re-rendered.

Input parameters:

- `video_id` (string, required): The held video.

Output parameters:

- `page_url` (string|null)
- `permanent_url` (string|null)
- `status` (string)
- `video_id` (string)
- `video_url` (string|null)

### `get_video_embed` (~147 tokens)

Get embed and SEO tags for a video

[Free] Returns ready-to-paste markup for a finished PageToVid video: an HTML video element, Open Graph and Twitter player meta tags so the page unfurls as a playable video, and a schema.org VideoObject JSON-LD block.

Input parameters:

- `description` (string): Overrides the share description. Defaults to a sentence written in the video's language.
- `page_url` (string): The page this markup will be pasted into. Used for og:url so a share resolves to your page rather than nothing.
- `title` (string): Overrides the title in the share card. Defaults to the video's own title.
- `video_id` (string, required): The video_id of a finished render.

Output parameters:

- `aspect_ratio` (string)
- `description` (string)
- `embed_url` (string)
- `height` (number)
- `html` (string)
- `iframe` (string)
- `json_ld` (string)
- `meta_tags` (string)
- `title` (string)
- `video_id` (string)
- `width` (number)

### `list_models` (~108 tokens)

List generation models and prices

[Free] Every model this account can generate clips and stills with — capabilities, limits and the exact credit price — before spending anything. Omit model in a scene for the house clip; name one (data.model, or set_inset model) to choose it and pay its price. quote_cost prices a specific request.

Input parameters:

- `include_unavailable` (boolean): Also list models this account cannot use now, with the reason.
- `modality` (string): Only video or only image models.

Output parameters:

- `credit_value_note` (string)
- `models` (array)

### `quote_cost` (~215 tokens)

Quote a cost before spending

[Free] What something will cost, spending nothing: one generation (kind clip or image, optional model, duration_s, resolution, role, count), or a video_id's next rerender_video (render plus every AI visual not yet made). A length between two a model makes is rounded UP, with a warning; one it cannot make is refused with what it can. plan_note says when this plan has no AI generation.

Input parameters:

- `count` (integer): How many, 1-4.
- `duration_s` (number): Clip length in seconds, within the model's range.
- `kind` (string): Price one generation of this kind.
- `model` (string): A model id from list_models. Omit for the house model.
- `resolution` (string): Clip resolution, one the model offers.
- `role` (string): A full-frame scene or a presenter in a corner (a presenter uses the cheapest resolution).
- `video_id` (string): Price the next rerender_video of this video.

Output parameters:

- `breakdown` (array)
- `cover_note` (string)
- `credits` (number)
- `plan_note` (string)
- `warnings` (array)

### `list_video_options` (~60 tokens)

List available video options

[Free] Lists what create_video accepts: goals, aspect ratios, languages, voices, background music beds (9, each with a family: calm, energetic, serious, playful) and the allowed length range. Static reference data — no account access.

Output parameters:

- `aspect_ratios` (array)
- `caption_styles` (array)
- `devices` (array): aspect_ratio, device, viewport, layout.
- `goals` (array)
- `languages` (array): code, name.
- `looks` (array): id, note.
- `music` (array): id, name, family.
- `notes` (string)
- `target_seconds` (object): min, max, default.
- `voices` (array): id, style, pitch, hz.

### `list_motions` (~83 tokens)

List animation styles

[Free] How a scene can look: 26 visuals, 1117 animations, motions, transitions, fx. Check pairs before writing scenes. New: get_motion_grammar.

Input parameters:

- `for_scene` (string): Narration → 5 picks.
- `rushie` (string): Search: words, id or beat (+9:16/1:1).

Output parameters:

- `edit_styles` (array)
- `families` (object)
- `fx` (array)
- `motions` (array): id, label, energy, description, tags, family, min_seconds.
- `presets` (array)
- `recommended` (array)
- `rule` (string)
- `rushie_index` (object)
- `rushie_summary` (object): total, by_aspect, catalogue, top_by_beat, example.
- `rushie_templates` (array): id, use, beat, requires, optional, aspects, min_seconds, poster_url, page_url, ui_text, facets, props_schema.
- `transitions` (array)
- `visuals` (array): id, family, description, requires, types (path → string|number|boolean), available_in, min_seconds, default_motion.

### `list_themes` (~51 tokens)

List theme presets and the rules a theme must satisfy

[Free] Lists what the theme parameter accepts: the built-in presets, the modes, the type faces the renderer can load, and the contrast and palette rules enforced before a credit moves. Static reference data.

Output parameters:

- `corners` (array)
- `fonts` (object)
- `max_colors` (number)
- `modes` (array)
- `presets` (array)
- `rules` (array)
- `slots` (array)

### `inspect_page` (~284 tokens)

See what is on a page worth filming

[Free] Opens a public page in a real browser and ranks what a video could film — calls to action, images, cards, pricing, testimonials, search boxes, headings — each with a CSS selector, kind, size and score (a rank, not a percentage). Says when a robot check, sign-in or missing page stood in front of it (blocked, block_kind), and which fields will never be typed into.

Input parameters:

- `aspect_ratio` (string): The viewport to look through. 9:16 loads the page as a phone does, which is the layout a vertical video films — a responsive site offers different elements there (a sticky call bar, stacked cards) an…
- `kinds` (string): Comma-separated kinds to keep, e.g. "cta,search,card". The vocabulary is in the `kinds` histogram of any reply: cta, media, image, card, pricing, testimonial, logos, heading, section, nav, search, ch…
- `limit` (integer): How many candidates to return, best first (a page offers up to 40; a film uses four or five). The `kinds` histogram still counts every one.
- `url` (string, required): A public page to look at. Nothing is filmed and no credit is spent.

Output parameters:

- `aspect_ratio` (string)
- `block_kind` (string|null)
- `block_reason` (string|null)
- `blocked` (boolean)
- `candidates` (array)
- `device` (string)
- `kinds` (object)
- `layout` (string)
- `pages` (array): The other pages of this site a film may be sent to, taken from this page's own links. A scene's page_url is DROPPED unless it is one of these or the page itself, so this is the complete set — not a s…
- `refused_fields` (array): selector, label, reason: fields never typed into.
- `title` (string)
- `url` (string)
- `viewport` (object): width, height.

### `detect_brand` (~95 tokens)

Read a site's colours and typography

[Free] Reads a public page's design tokens from its live CSS: accent colours, heading typeface, light or dark ground, corner style. Returns a theme ready for create_video, create_animation or rerender_video, plus any site colour the film cannot paint with and why.

Input parameters:

- `url` (string, required): A public page of the site. A heavy home page can time out (read_failed); then try a content page.

Output parameters:

- `detected_font_family` (string|null)
- `domain` (string)
- `font_loadable` (boolean)
- `read_failed` (boolean)
- `read_failed_reason` (string)
- `rejected_colors` (array)
- `theme` (object)
- `title` (string)
- `url` (string)

### `get_account` (~81 tokens)

Get plan and credit balance

[Free] Reads this account. CALL THIS FIRST: plan, credits, whether AI visuals are available and charged, watermark, revisions, film passes, add-on clips, renders running, limits. Then: inspect_page (in the aspect you will film), create_video or create_animation, get_storyboard (the chosen shots), update_storyboard, rerender_video.

Output parameters:

- `active_renders` (number)
- `ai_generation_charged` (boolean)
- `capabilities` (object): ai_generation, packs, public_api, logged_in_capture, ai_revisions (booleans).
- `clip_balances` (object)
- `credit_costs` (object): video, ai_image, ai_clip.
- `credits` (number)
- `effective_plan` (string)
- `film_passes` (array): id, kind, video_id, clips_left, images_left.
- `free_allowance` (object)
- `limits` (object): min_seconds, max_seconds, renders_per_minute, drafts_per_hour.
- `plan` (string)
- `pricing_url` (string)
- `revisions` (string)
- `stale_renders_cleared` (number)
- `upgrade_url` (string)
- `watermarked` (boolean)
- `webhook` (object): url, secret_set.

### `list_videos` (~132 tokens)

List videos on this account

[Free] Reads this account. Lists videos newest first with their status and, when finished, their links. Filter by status or by a word in the page URL or title. Returns a cursor when more remain.

Input parameters:

- `created_after` (string): ISO 8601 timestamp; only videos created after it.
- `cursor` (string): The next_cursor from a previous call. Opaque — pass it back unchanged.
- `limit` (integer): How many to return.
- `query` (string): Matches part of the source URL or the title.
- `status` (string): Only videos in this state.

Output parameters:

- `has_more` (boolean)
- `next_cursor` (string|null)
- `total_count` (number)
- `videos` (array)

### `get_storyboard` (~74 tokens)

Get the scenes of a video

[Free] Reads this account. Returns the scene-by-scene plan of a video: what each scene narrates, its on-screen caption, how long it holds, and whether it is real footage of the page or a motion graphic (and which motion).

Input parameters:

- `video_id` (string, required): The video_id to read.

Output parameters:

- `claims` (array): scene, text, kind, source.
- `claims_summary` (string|null)
- `duration_source` (string): Whether duration_seconds (per scene and in totals) was measured on the last render or is still the plan. "rendered" only when every timed scene was measured; a scene added since the render keeps the…
- `editor_url` (string)
- `pronunciations` (array)
- `resolved`
- `scene_count` (number)
- `scenes` (array)
- `totals` (object): Speech over picture for the whole film; before the first render it is estimated from the words (coverage_is_estimated). Below about 0.7 there is visible dead air, but read the per-scene figures first…
- `video_id` (string)

### `update_storyboard` (~171 tokens)

Edit the scenes of a video

[Free] Edits a video's storyboard in 22 operations, each described on its branch: words, captions, visuals (incl. "rushie" designed cards: data.rushie {template, props}), data, shots, scenes, transitions, fx, presenter, voice, music, look. Does not re-render — rerender_video makes the new film. Every call is snapshotted, so an edit can be undone (list_revisions).

Input parameters:

- `operations` (array, required): The changes, in order, up to 20; all are validated before any is written, so a bad batch changes nothing. A wrong figure is set_data plus one rerender_video, not a new video.
- `video_id` (string, required): The video to edit. Its scene ids come from get_storyboard.

Output parameters:

- `applied` (array)
- `created` (array)
- `editor_url` (string)
- `needs_rerender` (boolean)
- `notes` (array)
- `revision_id` (string)
- `scene_count` (number)
- `video_id` (string)

### `rerender_video` (~410 tokens)

Re-render a video from its storyboard

[40 credits] [free: captions_only once per paid render; a missed length target once] A new film from the video's current storyboard, without re-planning, plus any AI visual not yet made (quote_cost prices it). Free once per video when the film missed its length target (length_within_tolerance: false). The file is replaced when the new render finishes. Returns a start receipt; call get_video for the full status.

Input parameters:

- `callback_url` (string): As create_video, for this render.
- `captions_only` (boolean): true re-times the subtitles on the existing voice track and renders again; nothing is re-recorded, re-scripted or re-voiced. The first resync after a paid render is free, the next costs a render's cr…
- `draft` (boolean): As create_video; only before the first paid render.
- `dry_run` (boolean): Quote only; nothing made or charged.
- `idempotency_key` (string): A caller-chosen id for this request. Sending the same key again within 24 hours returns the same re-render instead of starting and charging a second time — use it if your client may retry.
- `max_credits` (integer): Refuse (budget_exceeded + quote) above this.
- `outputs` (array): As create_video; must include this video's shape. Other shapes re-render their sibling or make one, a render each.
- `quality_gate` (object): As create_video, for this render.
- `target_seconds` (integer): What this film should run now, if it has legitimately grown or shrunk since creation. length_within_tolerance is measured against it and later re-renders keep it; their length fit aims at it (words y…
- `theme` (object): As create_video; replaces the video's theme and is kept for later re-renders.
- `video_id` (string, required): The video to re-render.

Output parameters:

- `credits_charged` (number)
- `draft` (boolean)
- `dry_run` (boolean)
- `editor_url` (string)
- `error` (string|null)
- `eta_seconds` (number)
- `format_group_id` (string)
- `formats` (array): Every shape: video_id, aspect_ratio, status, primary, video_url.
- `free_length_fix` (boolean)
- `free_resync` (boolean)
- `idempotent_replay` (boolean)
- `next_step` (string)
- `notes` (array)
- `page_url` (string|null)
- `phase_label` (string)
- `poll_after_seconds` (number)
- `progress` (number)
- `quote` (object)
- `status` (string)
- `upgrade` (object)
- `video_id` (string)
- `video_url` (string|null)
- `warnings` (array)
- `webhook_secret` (string)

### `translate_video` (~148 tokens)

Translate a video into other languages

[40 credits] per language: a NEW video from an existing one — same storyboard and pictures, narration translated, re-voiced and re-captioned, card text (rushie cards too) translated. Filmed scenes are re-recorded on the site's page in that language when it has one (hreflang), else the footage is reused and `scenes` says so. Charged and refunded like any render; AI visuals already made are reused free.

Input parameters:

- `idempotency_key` (string): Same key within 24 h returns the videos already started, uncharged.
- `languages` (array, required): One new video each.
- `video_id` (string, required): A finished video.

Output parameters:

- `credits_charged` (number)
- `source_video_id` (string)
- `videos` (array)

### `get_site_plan` (~233 tokens)

Get the video plan for a whole site

[Free] Up to 5 ranked videos a site should have, one per subject: goal, pitch, the real page it films (checked), the video made; detail full adds the brief, sources and shots. First call generates it (~10-20 s, no credit), then banks the site's images, videos and page clips in the background (media counts them). generate_site_videos works from it.

Input parameters:

- `detail` (string): short: title, goal, pitch, page and whether it was made. full: also the brief (focus), its sources, audience, tone and shots.
- `language` (string): Language the ideas and shot list are written in. This is the planner's working language, not the videos' — generate_site_videos sets that.
- `limit` (integer): How many ideas, best first.
- `refresh` (boolean): true regenerates the plan even if one exists, overwriting it. A plan is generated automatically the first time.
- `site_url` (string, required): Any public http(s) URL on the site; the site is identified by its domain.

Output parameters:

- `detail` (string)
- `freshly_generated` (boolean)
- `generated_at` (string|null)
- `grounding_notes` (array)
- `ideas` (array)
- `made_count` (number)
- `media` (object)
- `next_step` (string)
- `site` (string)
- `site_url` (string)
- `to_make_count` (number)
- `total_ideas` (number)

### `generate_site_videos` (~350 tokens)

Make the videos a site's plan asks for

[40 credits] Per video started. One filmed video per get_site_plan idea without one (or the idea_ids given), of its verified page with its sourced brief as focus. Without confirm it lists what it would make and the cost, capped at the balance (the rest under needs_credits), creating nothing; confirm=true starts those. get_video reports each. A retry never starts an idea twice.

Input parameters:

- `aspect_ratio` (string): As create_video.
- `brand_name` (string): Name shown on the intro and outro cards.
- `caption_style` (string): As create_video.
- `confirm` (boolean): false (the default) previews the videos and spends nothing. true starts them and spends 40 credits each.
- `idea_ids` (array): Which ideas from get_site_plan to make, in order. Omitted: every idea that has no video yet.
- `intro` (boolean): Include the branded opening title card.
- `language` (string): As create_video.
- `look` (string): As create_video.
- `max_videos` (integer): At most this many videos in one call. Call again for the rest.
- `music` (string): As create_video.
- `outro` (boolean): As create_video.
- `site_url` (string, required): Any public http(s) URL on the site; the site is identified by its domain.
- `subtitles` (boolean): As create_video.
- `theme` (object): As create_video.
- `url` (string): The page to film for every video. Omitted, each idea films its own verified page (page_url in get_site_plan).
- `voice` (string): As create_video.

Output parameters:

- `credits_available` (number)
- `credits_charged` (number)
- `credits_needed` (number)
- `needs_confirmation` (boolean)
- `needs_credits` (array)
- `next_step` (string)
- `site` (string)
- `skipped` (array)
- `started` (array)
- `would_make` (array)

### `create_show` (~953 tokens)

Create a show: a recurring video from a feed

[Free] A show makes a video from each new item in a feed: a weekly release video from a changelog, a daily listing video from an RSS feed, a clip per new post. Episodes are ordinary videos made by run_show or, once confirmed, by the scheduler at the show's cadence. A new show is HELD: nothing renders until its owner has called run_show once with confirm=true, and it never spends more than max_credits_per_day.

Input parameters:

- `aspect_ratio` (string): As create_format.
- `brand_name` (string): As create_format.
- `cadence` (string): How often the scheduler runs the show once it is confirmed. manual: only when run_show is called. Default daily; manual for manual and webhook feeds.
- `feed_kind` (string): rss: RSS/Atom. json: a JSON Feed or any JSON API via feed_map. query: one call per run on a registered connection (`source`). watchlist: the fixed items in `watchlist`. webhook: another system POSTs…
- `feed_map` (object): For feed_kind json when the document is not a JSON Feed: dotted paths, e.g. {"items":"data.results","id":"slug","title":"name","summary":"excerpt","link":"href","image":"cover.url","date":"published_…
- `feed_url` (string): The feed's public URL for rss and json. It is read once now to make sure it parses.
- `focus_template` (string): As create_format. Omitted: a brief leading with the item's title and summary.
- `format_id` (string): Run an existing format (create_format / list_formats) instead of the fields below; its kind must match. Without it, the fields below become the show's own format, version 1, editable later with updat…
- `format_version` (integer): With format_id: pin the show to this version. Omitted, the show follows the format's latest version.
- `goal` (string): As create_format.
- `intro` (boolean): As create_format.
- `kind` (string): video: each episode films the item's own page (like create_video) with focus_template as its brief. animation: each episode is drawn from `scenes` (like create_animation) with the item's data filled…
- `language` (string): As create_format.
- `max_credits_per_day` (integer): The show never spends more than this in a UTC day, however many items the feed gains. An episode is 40 credits.
- `max_episodes_per_run` (integer): Newest items first; at most this many episodes per run.
- `music` (string): As create_format.
- `name` (string, required): The show's name, e.g. "Le mot du chantier". Available as {{show}} in templates.
- `outro` (boolean): As create_format.
- `repeat_every` (string): query and watchlist shows: make every item again each period (the period is in the episode key and available to a programme as {{ item.period }}). none: each item once, ever.
- `routing` (object): As create_format.
- `scenes` (array): As create_format. An image scene whose {{image}} is empty for an item is dropped from that episode.
- `site_url` (string, required): Any public http(s) URL on the site; the site is identified by its domain.
- `source` (object): feed_kind query: {call: {mcp: alias, tool, input} | {http: url, query}, select: an expression into the answer that yields the list, map: dotted paths from an element to the item ({id, title, summary,…
- `subtitles` (boolean): As create_format.
- `target_seconds` (integer): As create_format.
- `theme` (object): As create_video.
- `title_template` (string): As create_format.
- `tone` (string): As create_format.
- `voice` (string): As create_format.
- `watchlist` (array): feed_kind watchlist: the items, as run_show takes them. Each is made once — or once per period with repeat_every.

Output parameters:

- `held` (boolean)
- `next_step` (string)
- `show` (object)
- `webhook_secret` (string)

### `list_shows` (~79 tokens)

List shows

[Free] Reads this account. Lists the shows on this account — or one site's — with their cadence, caps, whether each is confirmed or still held, what it spent today, and its five most recent episodes with the video each became.

Input parameters:

- `site_url` (string): Only this site's shows. Omitted: every show on the account.

Output parameters:

- `count` (number)
- `shows` (array)

### `run_show` (~184 tokens)

Run a show now

[40 credits] Per episode started. Reads the show's feed (or the items given), skips items already made, and — within max_episodes_per_run and max_credits_per_day — starts one video per new item. Without confirm: the list, nothing spent. On a held show, confirm=true is the owner's one-time approval: it makes the episodes and lets the scheduler run the show from then on.

Input parameters:

- `confirm` (boolean): false (the default): a free preview of the episodes this run would make. true: make them, and on a held show, confirm it — from then on the scheduler runs it at its cadence.
- `items` (array): The items to make episodes from, for a manual show. A feed show ignores this and reads its feed.
- `show_id` (string, required): The show_id from create_show or list_shows.

Output parameters:

- `confirmed` (boolean)
- `credits_charged` (number)
- `credits_left_today` (number|null)
- `held` (boolean)
- `needs_confirmation` (boolean)
- `next_step` (string)
- `reason` (string|null)
- `show_id` (string)
- `skipped` (array)
- `started` (array)
- `would_make` (array)

### `update_show` (~322 tokens)

Pause, resume or retune a show

[Free] Changes a show's switch, cadence, caps or name, or moves it to another format or format version. The template itself is edited with update_format, which writes a new version and leaves every episode already made where it is. Nothing is rendered.

Input parameters:

- `active` (boolean): false pauses the show (the scheduler skips it, run_show refuses); true resumes it.
- `cadence` (string): A new cadence.
- `format_id` (string): Move the show to another format of the same kind.
- `format_version` (integer): Pin the show to this version of its format.
- `format_version_latest` (boolean): true unpins the show so it follows its format's latest version.
- `max_credits_per_day` (integer): A new daily credit cap (an episode is 40 credits).
- `max_episodes_per_run` (integer): A new per-run cap.
- `name` (string): A new name.
- `repeat_every` (string): query and watchlist shows: a new period, or none to stop repeating.
- `rotate_webhook_secret` (boolean): webhook shows: mint a new signing secret (returned once in this call's webhook_secret); the old one stops working at once.
- `show_id` (string, required): The show_id from create_show or list_shows.
- `source` (object): query shows: a new source (same shape as create_show).
- `watchlist` (array): watchlist shows: the new list; it replaces the old one. Items already made stay made.

Output parameters:

- `show` (object)
- `webhook_secret` (string)

### `create_format` (~1004 tokens)

Create a format: the reusable shape of a programme

[Free] A format is how an episode is made — aspect, language, voice, music, tone, goal, length, cards, brand, theme, the brief or the scene templates — and knows nothing about any subject. It is versioned: update_format writes a new version, shows pin one or follow latest, and every episode records the version that made it. Validated now against a sample item; nothing is rendered.

Input parameters:

- `aspect_ratio` (string): 16:9 for web and YouTube, 9:16 for Reels/Shorts/TikTok, 1:1 and 4:5 (1080×1350) for feeds.
- `brand_name` (string): Name shown on the intro and outro cards.
- `focus_template` (string): video formats: the brief every episode's script writer gets, with {{title}} {{summary}} {{link}} {{date}} {{image}} {{show}} {{site}} filled from the item.
- `goal` (string): What the video is for; shapes the script.
- `intro` (boolean): Include the branded opening title card.
- `kind` (string): video: episodes film the item's page. animation: episodes are drawn from `scenes` with the item's data filled in.
- `language` (string): Language of the voiceover and captions. Write the narration in this language.
- `music` (string): Music bed, "none", or "asset:<id>" (upload_asset). auto fits the goal and differs from the site's previous films.
- `name` (string, required): The format's name, e.g. "Le mot du chantier". Available as {{show}} in templates.
- `outro` (boolean): Include the closing call-to-action card.
- `programme` (object): animation formats: the programme instead of plain scenes. {beats: [...], resolvers: [...], computed: {...}, requires_beats: [...], reject_if: [...]}. A beat is a scene (visual, motion, mood, heading,…
- `routing` (object): How episodes are made: {planner?: flash|pro, footage?: prefer-recorded|record-fresh}. flash is the benched default (it beat every larger model under the real prompt); pro is a deliberate choice. pref…
- `scenes` (array): animation formats: the scene templates, as create_animation's scenes (not from_library), with the placeholders in any string.
- `site_url` (string, required): Any public http(s) URL on the site the format belongs to; the site is identified by its domain.
- `subtitles` (boolean): Burn captions into the picture and emit a .vtt sidecar.
- `target_seconds` (integer): A check, not a setting: your words set the length. A script over 15% off is refused before any credit moves, with the words to cut or add. Omitted: the scenes alone must run at least 15 s, the film a…
- `theme` (object): As create_video.
- `title_template` (string): animation formats: the episode's title, same placeholders. Default "{{show}} — {{title}}".
- `tone` (string): Delivery of the narration, up to 80 characters — e.g. energetic, calm, authoritative, or a short direction like "dry and deadpan, like a friend telling a story".
- `voice` (string): Narrator (all multilingual). auto picks a voice that fits the goal and tone and differs from the site's previous films.

Output parameters:

- `format` (object)
- `next_step` (string)

### `update_format` (~317 tokens)

Revise a format: writes a new version

[Free] Changes any of a format's template fields. The result is a NEW version — the previous ones stay exactly as they were, and every episode already made keeps the version that made it. Shows following latest use the new version from their next run; pinned shows do not move until update_show moves them. Validated whole before anything is written.

Input parameters:

- `aspect_ratio` (string): As create_format.
- `brand_name` (string): As create_format.
- `focus_template` (string): As create_format.
- `format_id` (string, required): The format_id from create_format or list_formats.
- `goal` (string): As create_format.
- `intro` (boolean): As create_format.
- `language` (string): As create_format.
- `music` (string): As create_format.
- `name` (string): A new name.
- `note` (string): What this version changes, for the version history.
- `outro` (boolean): As create_format.
- `programme` (object): As create_format.
- `routing` (object): As create_format.
- `scenes` (array): animation formats: the scene templates, as create_animation's scenes (not from_library), with the placeholders in any string.
- `subtitles` (boolean): As create_format.
- `target_seconds` (integer): As create_format.
- `theme` (object): As create_video.
- `title_template` (string): As create_format.
- `tone` (string): As create_format.
- `voice` (string): As create_format.

Output parameters:

- `format` (object)
- `version` (number)

### `get_format` (~49 tokens)

Read a format and its versions

[Free] The format's current template, its version history and the shows that run it, with each show's pin.

Input parameters:

- `format_id` (string, required): The format_id from create_format or list_formats.

Output parameters:

- `format` (object)

### `list_formats` (~49 tokens)

List formats

[Free] The account's formats, newest change first, with versions and the shows running each.

Input parameters:

- `site_url` (string): Only this site's formats. Omitted, every format on the account.

Output parameters:

- `formats` (array)
- `total_count` (number)

### `fork_format` (~101 tokens)

Copy a format

[Free] A new format whose version 1 is the original's latest version, unpinned from its parent. Edit the copy without touching the original.

Input parameters:

- `format_id` (string, required): The format_id from create_format or list_formats.
- `name` (string): The copy's name. Default: the original's name with " (copy)".
- `site_url` (string): The site the copy belongs to. Default: the original's site.

Output parameters:

- `format` (object)

### `validate_format` (~297 tokens)

Validate a format against a sample item

[Free] Compiles the template against a sample item, touching no database or feed: the catalogue checks (voice, music, language, theme…), the scene templates filled and checked as an animation, and what the first episode's title, brief and scene count would be. Returns problems by field; nothing is created, rendered or charged.

Input parameters:

- `aspect_ratio` (string): As create_format.
- `brand_name` (string): As create_format.
- `focus_template` (string): As create_format.
- `goal` (string): As create_format.
- `intro` (boolean): As create_format.
- `kind` (string): video or animation.
- `language` (string): As create_format.
- `music` (string): As create_format.
- `name` (string): The format's name, for {{show}}.
- `outro` (boolean): As create_format.
- `programme` (object): As create_format.
- `routing` (object): As create_format.
- `scenes` (array): animation formats: the scene templates, as create_animation's scenes (not from_library), with the placeholders in any string.
- `subtitles` (boolean): As create_format.
- `target_seconds` (integer): As create_format.
- `theme` (object): As create_video.
- `title_template` (string): As create_format.
- `tone` (string): As create_format.
- `voice` (string): As create_format.

Output parameters:

- `problems` (array)
- `sample` (object)
- `valid` (boolean)

### `preview_episode` (~132 tokens)

Preview one episode of a format, for free

[Free] Runs the format's resolvers against the item (real calls, cached) and compiles the storyboard: every beat's final text, the beats dropped and why, the integrity report and where every bound value came from. Nothing is rendered. Read it before run_show confirm=true.

Input parameters:

- `format_id` (string, required): The format_id from create_format or list_formats.
- `format_version` (integer): Preview this version; omitted, the latest.
- `item` (object): The item to make the episode of: {title, summary, link, image, date}. Omitted, a sample item.

Output parameters:

- `beats` (array): visual, heading, narration, caption.
- `dropped` (array): beat, reason.
- `ok` (boolean)
- `provenance` (object): Per source: kind, target, fetched_at, cached.
- `refusal` (string|null)
- `report` (object): ok, words, estimated_seconds, issues[] {check, beat, message}.
- `title` (string)
- `upstream` (object): calls, records[] {id, kind, target, ms, cached, ok}.

### `verify_episode` (~137 tokens)

Verify what a video says against its record

[Free] The proof behind a film: the format version that made it (template SHA-256), every resolver source and what it fetched, the integrity report, the claim ledger (which figures trace to the page, the brief or nothing), the Content Credentials (C2PA), and a check recompiling the stored data against the narration word for word.

Input parameters:

- `episode_id` (string): The episode to verify, from run_show or a show's recent_episodes.
- `video_id` (string): Or a video id: the episode is found through it when there is one; a plain video is verified on its claim ledger and credentials.

Output parameters:

- `claims` (object)
- `credentials`
- `episode_id` (string|null)
- `format`
- `page_url` (string|null)
- `provenance`: sources (per id: kind, target, fetched_at, cached), calls[], report {ok, words, estimated_seconds, issues[]}, dropped[].
- `recompiled_matches` (boolean|null)
- `verdict` (string)
- `video_id` (string|null)
- `video_status` (string|null)

### `register_mcp_connection` (~194 tokens)

Name an upstream server for resolvers

[Free] Registers (or replaces) a connection by alias: the URL and, optionally, a credential kept encrypted on this account. Formats refer to the alias only, so a format never carries a secret and is safe to publish or fork. Nothing is called now.

Input parameters:

- `alias` (string, required): The name a format's resolvers use: {"mcp": "finance_ds", ...}. Letters, digits, underscore.
- `kind` (string): mcp: JSON-RPC tools/call. http: plain JSON endpoints under this base.
- `note` (string): What this server is, for the list.
- `secret` (string): A bearer token or API key sent as Authorization: Bearer. Stored encrypted, never returned, never in a format.
- `url` (string, required): The server's public http(s) address: an MCP endpoint (streamable HTTP) or an http API base.

Output parameters:

- `connection` (object)

### `create_character` (~280 tokens)

Create a reusable character for consistent clips

[Free or 40 credits] Names a character so generated clips that name it keep one identity. refs (1 to 3 image URLs on this account) is free; a generate prompt DRAWS the reference (paid plans, refunded on failure). Then an image scene's data.clip=true and data.character="<name>". From one of your films take raw_frame_url, never thumbnail_url: its burnt-in text teaches the generator to draw text.

Input parameters:

- `description` (string): A short line describing the character, added to every clip's prompt so words and image agree.
- `generate` (string): Draw the reference portrait instead of supplying one — e.g. "a woman in her late twenties, platinum blonde, grey tee". Paid plans: 40 credits (one still), refunded if it fails. Ignored when refs are…
- `name` (string, required): The character's name, e.g. "Ada, the founder". A clip scene names it in data.character to stay consistent.
- `refs` (array): 1 to 3 reference image URLs — media on this account (a generated still, a bank asset, a commons asset from list_commons_assets). These become Veo's ingredients so the same character recurs. Give thes…
- `site_url` (string): Scope the character to one site.

Output parameters:

- `character` (object)
- `credits_charged` (number)

### `list_characters` (~27 tokens)

List the account's characters

[Free] The reusable characters on this account, each with its reference images and description.

Output parameters:

- `characters` (array)

### `list_commons_assets` (~145 tokens)

Browse the asset commons

[Free] Media people shared from their banks for anyone's films — logos, product shots, illustrations, recorded flows — with tags, a licence and the site to credit. An image scene takes an asset's id as data.asset_id (or its url as imageUrl); a gallery takes urls. Only assets their owners switched to shared.

Input parameters:

- `kind` (string): Only images, or only clips.
- `limit` (integer): At most this many, newest first (default 40).
- `q` (string): A word to find in tags or the asset's brief.
- `tag` (string): One tag, e.g. logo, dashboard, person.

Output parameters:

- `assets` (array)
- `commons_url` (string)

### `generate_asset` (~484 tokens)

Generate one image or clip, without making a video

[40 or 311 credits] One AI still (40 credits each) or clip (house 311, a named model its list_models price) straight into your bank — no render. Clip controls are refused, with the allowed values, when the model is not sent them; model auto picks one and says why. best_of makes N and keeps the best graded (all N charged). Charged before, refunded on failure; dry_run quotes it free. Paid plans.

Input parameters:

- `aspect_ratio` (string): Default 16:9. 21:9 and 4:5 only where list_models says the model takes them.
- `best_of` (integer): N graded, best kept, all charged.
- `camera` (object): Folded into the prompt.
- `character` (string): A character from create_character, so the same face comes back.
- `count` (integer): Stills: how many, each charged.
- `dry_run` (boolean): Quote only; nothing made or charged.
- `duration_s` (integer): Seconds (list_models range).
- `first_frame` (string): Bank image id/URL to start on.
- `idempotency_key` (string): Same key within 24 h returns what it made, uncharged. Without one, an identical call within 10 min does; one still running is reported, not restarted.
- `kind` (string): image (a still) or video (a clip). Default image.
- `last_frame` (string): Bank image to end on.
- `max_credits` (integer): Refuse (budget_exceeded + quote) above this.
- `model` (string): list_models id, house, house-image, or auto (clips; see optimize).
- `negative_prompt` (string): Where the model takes one.
- `objects` (array): Object names (list_objects) kept consistent, after the character.
- `optimize` (string): For model auto. Default balanced.
- `prompt` (string, required): What to draw or film.
- `resolution` (string): One the model offers.
- `seed` (integer): Where the model takes one.
- `shot` (string): Folded into the prompt.
- `site_url` (string): Attach it to one of your sites.
- `tags` (string): Comma-separated tags, to find it again.

Output parameters:

- `asset` (object)
- `assets` (array)
- `candidates` (array)
- `credits_charged` (number)
- `dry_run` (boolean)
- `idempotent_replay` (boolean)
- `model` (string)
- `model_reason` (string)
- `quote` (object)
- `warnings` (array)

### `list_assets` (~194 tokens)

List the account's own media bank

[Free] Your PRIVATE bank: every image, clip and audio file, by origin and subject, with id, URL, brief, tags and facets. Reuse a picture by putting its id in an image scene as data.asset_id (a clip resolves to clipUrl by itself; a recorded flow's steps are clips of their own, tagged rush-step, each exactly one step of the rush); an audio asset is a film's music as "asset:<id>". Reusing costs no credit.

Input parameters:

- `character` (string): Only assets generated for this character.
- `kind` (string): Only images, clips, uploaded audio or fonts.
- `limit` (integer): At most this many, newest first (default 40).
- `q` (string): Words, and/or facets origin: subject: camera: light: look: mood: orientation:
- `site_url` (string): Only assets attached to this site.

Output parameters:

- `assets` (array)

### `list_connections` (~27 tokens)

List the account's upstream connections

[Free] Every registered connection with its alias, kind and URL. Credentials are never returned.

Output parameters:

- `connections` (array)

### `create_object` (~222 tokens)

Create a reusable object

[Free] Names a product, logo, packaging, place, vehicle or UI screen from reference images so films keep it identical. Generated pictures take it in data.objects (clips, stills, insets, generate_asset) next to a character; image, gallery, pricing and compare cards draw it from data.object with its name and price.

Input parameters:

- `description` (string|null): One line added to every prompt that names it.
- `kind` (string, required): What it is.
- `metadata` (object): {price, currency (ISO 4217), brand, sku, url}. A price is drawn on pricing/compare/image cards.
- `name` (string, required): The object's name, e.g. "Aurora watch". Scenes name it.
- `refs` (array, required): 1-6 reference images, best first: asset ids (list_assets) or media URLs on this account.
- `site_url` (string): Scope it to one of your sites.
- `source_url` (string): Where it comes from (a product page). Attribution only.

Output parameters:

- `object` (object)
- `replaced` (boolean)

### `list_objects` (~71 tokens)

List the account's objects

[Free] The reusable objects on this account, with reference images, kind and metadata (price, brand, sku).

Input parameters:

- `kind` (string): Only this kind.
- `q` (string): A word in the name or description.
- `site_url` (string): Scope it to one of your sites.

Output parameters:

- `objects` (array)

### `update_object` (~142 tokens)

Change an object

[Free] Changes only the fields sent. Media already generated with it is kept until a scene's description changes.

Input parameters:

- `description` (string|null): One line added to every prompt that names it.
- `kind` (string): What it is.
- `metadata` (object): Merged into the metadata; a null value clears that key.
- `name` (string, required): The object to change.
- `new_name` (string): Rename it.
- `refs` (array): Replace the references.
- `site_url` (string): Scope it to one of your sites.
- `source_url` (string): Where it comes from (a product page). Attribution only.

Output parameters:

- `object` (object)

### `delete_object` (~44 tokens)

Delete an object

[Free] Deletes an object by name. Its images stay in your bank and media made with it stays in its films.

Input parameters:

- `name` (string, required): The object to delete.

Output parameters:

- `deleted` (boolean)
- `name` (string)

### `import_objects` (~100 tokens)

Import a catalogue as objects

[Free] Creates or replaces up to 50 objects from a product feed. Each image is downloaded (public addresses only) and banked as a reference. Failed rows are listed with the reason.

Input parameters:

- `items` (array, required): 1-50 catalogue rows. image_url: one public image URL or a list (best first, up to 6); kind defaults to product.
- `site_url` (string): Scope it to one of your sites.

Output parameters:

- `created` (array)
- `failed` (array)

### `save_scene` (~140 tokens)

Save a scene to the library

[Free] Saves a scene for reuse: narration, visual, data, style AND its footage and generated media (a copy). Reusing it — update_storyboard add_scene_from_library, create_animation from_library — films and generates nothing, so no AI credit. Write {{placeholders}} in its narration or data first to fill them per use.

Input parameters:

- `name` (string, required): A name to reuse it by. The same name replaces the earlier entry.
- `scene_id` (string, required): The scene, from get_storyboard.
- `tags` (array): Tags to find it by.
- `video_id` (string, required): The video the scene is in.

Output parameters:

- `replaced` (boolean)
- `scene` (object)
- `warnings` (array)

### `list_scenes` (~108 tokens)

List the scene library

[Free] Saved scenes, newest first: name, id, visual, aspect, whether footage is kept, the {{placeholders}} each needs as params, and tags.

Input parameters:

- `limit` (integer): At most this many, newest first (default 40).
- `q` (string): A word in the name, heading or narration.
- `site_url` (string): Scope it to one of your sites.
- `tags` (array): Only scenes carrying every one of these tags.

Output parameters:

- `scenes` (array)

### `copy_scene` (~131 tokens)

Copy a scene into another video

[Free] Copies a scene into another of your videos with its footage and generated media, so nothing is filmed or generated again. A recording cannot change aspect, nor go into a film made from data. Does not re-render.

Input parameters:

- `after_scene_id` (string): Put it after this scene of the target. Omitted: at the end.
- `from_video_id` (string, required): The video the scene is in.
- `scene_id` (string, required): The scene to copy, from get_storyboard.
- `to_video_id` (string, required): The video to copy it into (may be the same one).

Output parameters:

- `created` (object)
- `needs_rerender` (boolean)
- `revision_id` (string)
- `video_id` (string)
- `warnings` (array)
- `with_footage` (boolean)

### `create_motion` (~147 tokens)

Design a motion graphic

[Paid plans] Designs a custom motion graphic from a brief (one text-model call; AI plans or a film pass; no credits charged), checks layout, legibility, contrast and timing, and saves it as a private template with params. Use it in a scene: visual "motion", data {motion:{specId, params}}.

Input parameters:

- `brief` (string, required): What the scene shows and says, with its facts and figures.
- `language` (string): On-screen language (default en).
- `name` (string): A name for the template.
- `site_url` (string): Use this site's brand kit colours.
- `tags` (array): Labels to find it by.

Output parameters:

- `attempts` (number)
- `template` (object)
- `tokens` (number)
- `warnings` (array)

### `list_motion_templates` (~66 tokens)

List motion templates

[Free] Your saved motion graphics (visual "motion") and the commons, with their params. Rushie designed cards: list_motions {rushie}.

Input parameters:

- `q` (string): A word in the name, brief or tags.
- `scope` (string): Default all.

Output parameters:

- `templates` (array)

### `get_motion_template` (~39 tokens)

Read a motion template

[Free] One template with its full spec (layers, motion tokens, declared params).

Input parameters:

- `template_id` (string, required): The template's id.

Output parameters:

- `spec` (object)
- `template` (object)

### `update_motion_template` (~133 tokens)

Change a motion template

[Free] Renames, retags, sets param defaults or visibility, or replaces the spec of a template you wrote. Films already using it keep their picture.

Input parameters:

- `defaults` (object): New default values for its params, by name.
- `name` (string): Rename it.
- `spec` (object): A new spec for a template you wrote (save_motion_spec); checked like validate_motion_spec.
- `tags` (array): Labels to find it by.
- `template_id` (string, required): The template's id.
- `visibility` (string): commons shares it with every account (owner/admin only).

Output parameters:

- `template` (object)
- `warnings` (array)

### `get_motion_grammar` (~81 tokens)

Motion spec grammar

[Free] The grammar for writing your own animation as a motion spec: no topic → a short index and the authoring loop; topic → one rule file (layers, params, timing, motion, colour, layout, doctrine, examples, brief). Generated from the DSL itself.

Input parameters:

- `topic` (string): One topic; omit for the index.

Output parameters:

- `text` (string)
- `topic` (string|null)
- `topics` (array)

### `validate_motion_spec` (~112 tokens)

Check a motion spec

[Free] Dry-run a spec: deterministic repairs, schema, params, layout/legibility/contrast/timing on four frames and the motion doctrine. Returns ok, every problem with its path and fix, the repaired spec and the params schema. Nothing is saved.

Input parameters:

- `params` (object): Param values to check it with (default: the declared defaults).
- `site_url` (string): Lint against this site's brand colours.
- `spec` (object, required): A motion spec (get_motion_grammar).

Output parameters:

- `errors` (number)
- `example_scene` (object)
- `ok` (boolean)
- `params_schema` (array)
- `problems` (array)
- `repaired_spec` (object)
- `repairs` (array)
- `warnings` (number)

### `preview_motion` (~186 tokens)

Preview a motion spec

[Free] Frames back without a render: per aspect (16:9, 9:16, 1:1) a PNG sheet of four beats (entering, landed, hold, exit) — a deterministic LAYOUT wireframe from the DSL's geometry (exact boxes, wrapping, sizes, colours, timing; system font, no blur or shadow) — plus the problems measured on that frame.

Input parameters:

- `aspects` (array): Default all three.
- `params` (object): Param values to check it with (default: the declared defaults).
- `seconds` (number): The scene's length (its narration slice). Default 5.
- `site_url` (string): Lint against this site's brand colours.
- `spec` (object): The spec to preview (or template_id).
- `template_id` (string): A saved template to preview instead of a spec.

Output parameters:

- `aspects` (array)
- `errors` (number)
- `note` (string)
- `ok` (boolean)
- `preview` (string)
- `scene_seconds` (number)
- `warnings` (number)

### `save_motion_spec` (~149 tokens)

Save a motion spec

[Free] Saves a spec you wrote as a private template once it passes validate_motion_spec (repairs applied). Returns its id, params schema and the scene JSON that uses it: visual "motion", data {motion:{specId, params}}.

Input parameters:

- `name` (string): Default: the spec's name.
- `params` (object): Param values to check it with (default: the declared defaults).
- `site_url` (string): Lint against this site's brand colours.
- `spec` (object, required): A motion spec (get_motion_grammar).
- `tags` (array): Labels to find it by.
- `visibility` (string): Default private; commons is owner/admin only.

Output parameters:

- `params_schema` (array)
- `repairs` (array)
- `template` (object)
- `use` (object)
- `warnings` (array)

### `upload_asset` (~206 tokens)

Upload your own image, footage, music or slide deck

[Free] Puts a file in your bank from a public https url or small data_base64 (a bigger file you hold: create_upload). Picture or clip → data.asset_id in an image scene; audio → music "asset:<id>"; deck (PDF/PPTX) → every slide's text and pictures, to write the storyboard from. Identical bytes return the existing asset.

Input parameters:

- `data_base64` (string): The file, base64, ≤ 2 MB.
- `filename` (string): Its file name.
- `kind` (string): Required with url. image ≤ 20 MB, video ≤ 200 MB/60 s, audio ≤ 50 MB, font ≤ 2 MB, deck (PDF/PPTX) ≤ 30 MB.
- `name` (string): A label to find it again.
- `site_url` (string): Attach an image or clip to one of your sites.
- `url` (string): Public https URL.

Output parameters:

- `asset` (object)
- `deck` (object)
- `deduplicated` (boolean)
- `use` (string)

### `create_upload` (~99 tokens)

Get an address to send a file to

[Free] A one-hour address to send a file you hold (picture, clip, music, font, PDF/PPTX deck, ≤ 30 MB): curl -sS -T <file> "<upload_url>". The reply is the asset or the deck's slides.

Input parameters:

- `kind` (string): Read from the bytes if omitted.
- `name` (string): A label.
- `site_url` (string): Attach to this site.

Output parameters:

- `curl` (string)
- `expires_at` (string)
- `max_bytes` (number)
- `method` (string)
- `upload_url` (string)

### `list_voices` (~70 tokens)

List the narrator voices

[Free] The narrator voices with measured pitch (band and median Hz) and a short sample in the chosen language where one exists (else sample_url is null). Every voice speaks every language.

Input parameters:

- `language` (string): Language of the samples.
- `pitch` (string): Only this pitch band.

Output parameters:

- `language` (string)
- `samples_available` (boolean)
- `voices` (array)

### `get_timeline` (~96 tokens)

Get a finished film's timeline

[Free] Each scene's start and end in the finished MP4 (seconds), what drew it (recording, page still, AI clip/still, footage, graphic, card, inset), its transition, its slice of the one voice track with word onsets, plus the music and caption style. timeline_source: stored by the render, or rebuilt from the scenes.

Input parameters:

- `video_id` (string, required): The video's id.

Output parameters:

- `caption_style` (string|null)
- `duration_seconds` (number)
- `film_duration_seconds` (number|null)
- `fps` (number)
- `music` (object)
- `scenes` (array): scene, kind, start_seconds, end_seconds, visual, source, inset, transition, voice {text, start_seconds, end_seconds, word_starts_seconds}.
- `subtitles` (boolean)
- `timeline_source` (string)
- `video_id` (string)
- `voice_starts_at_seconds` (number|null)

### `get_frames` (~75 tokens)

Get stills from a finished film

[Free] JPEG stills (≤ 1280 px wide) cut from the finished MP4 at 1–6 moments in seconds, as URLs. Cached per render.

Input parameters:

- `times` (array, required): 1–6 times in seconds (0.1 s steps).
- `video_id` (string, required): The video's id.

Output parameters:

- `frames` (array)
- `max_width` (number)
- `video_id` (string)
- `video_url` (string)

### `set_brand_kit` (~315 tokens)

Set a site's brand kit

[Free] Partial update of a site's brand kit: logo, palette, face (named or an uploaded font), intro/outro templates, watermark and logo corner, default voice/music/captions/look/transition. null clears a field. Films of the site inherit it unless the call overrides.

Input parameters:

- `caption_style` (string): Default caption style.
- `colors` (object|null): Hex per slot; partial merges.
- `end_screen` (string): Outro card template.
- `font_asset_id` (string): Font asset id (upload_asset kind "font"); outranks font_family.
- `font_family` (string): A list_options face.
- `from_detect` (boolean): Fill palette, face and logo from detect_brand first; your fields win.
- `intro` (string): Intro card template.
- `logo_asset_id` (string): Image asset id (upload_asset).
- `logo_corner` (string): Logo corner on the picture, or none.
- `logo_safe_zone` (number): Logo clear space, % of the short side.
- `look` (string): Default look.
- `model` (string): Clip model for ai_mode rich (list_models).
- `music` (string): Default bed, or "asset:<id>".
- `site_url` (string, required): Any URL of the site.
- `transition` (string): Default arrival for scenes naming none.
- `voice` (string): Default narrator.
- `watermark` (boolean): Paid plans: badge on or off. Free keeps it.

Output parameters:

- `account_defaults`
- `detected` (boolean)
- `domain` (string)
- `exists` (boolean)
- `film_theme`
- `font_url` (string|null)
- `kit` (object): The set_brand_kit fields; null = inherited.
- `logo_url` (string|null)
- `not_painted` (array)
- `painted` (array)
- `watermark_effective` (boolean)
- `watermark_from` (string)

### `get_brand_kit` (~57 tokens)

Get a site's brand kit

[Free] A site's brand kit, what a film paints from it (and what it cannot, with why), the effective watermark, and the account defaults beneath it.

Input parameters:

- `site_url` (string, required): Any URL of the site.

Output parameters:

- `account_defaults`
- `detected` (boolean)
- `domain` (string)
- `exists` (boolean)
- `film_theme`
- `font_url` (string|null)
- `kit` (object): The set_brand_kit fields; null = inherited.
- `logo_url` (string|null)
- `not_painted` (array)
- `painted` (array)
- `watermark_effective` (boolean)
- `watermark_from` (string)

### `set_account_defaults` (~140 tokens)

Set the account's option defaults

[Free] Partial update of the options every film starts from (below a site's brand kit). null clears a field.

Input parameters:

- `caption_style` (string): Default caption style.
- `end_screen` (string): Outro card template.
- `font_family` (string): A list_options face.
- `intro` (string): Intro card template.
- `look` (string): Default look.
- `model` (string): Clip model for ai_mode rich (list_models).
- `music` (string): Default bed, or "asset:<id>".
- `transition` (string): Default arrival for scenes naming none.
- `voice` (string): Default narrator.

Output parameters:

- `defaults` (object)

### `list_options` (~54 tokens)

List every option in one call

[Free] Every enum and range a film accepts (voices, languages, beds, looks, captions, motions, transitions, visuals, aspects, faces, brand kit), the models with a credit example, and the inheritance levels.

Output parameters:

- `aspects` (array)
- `brand_kit` (object): color_slots, logo_corners, logo_safe_zone {min, max, default}.
- `callouts` (array)
- `caption_animations` (array)
- `caption_emphasis` (array)
- `caption_styles` (array)
- `cursor_styles` (array)
- `end_screens` (array)
- `font_upload` (object): exts, max_bytes.
- `fonts` (object)
- `goals` (array)
- `grades` (array)
- `inheritance` (object): levels, sources, options (option → levels).
- `intro_templates` (array)
- `languages` (array)
- `looks` (array)
- `models` (array): id, modality, example_credits, available.
- `motions` (object): text, block: motion ids by family.
- `music` (object): ids, asset_pattern.
- `press_effects` (array)
- `sfx_levels` (array)
- `target_seconds` (object): min, max, default.
- `transitions` (array)
- `visuals` (array)
- `voices` (array)

### `invite_member` (~124 tokens)

Invite a team member

[Free] Emails an invite to this workspace with a role, optional site limits and monthly credit cap. Members spend the owner's credits. Seats incl. owner: Free/Creator 1, Pro 3, Scale 5, Business 15, Agency unlimited.

Input parameters:

- `credit_cap` (integer|null): Monthly credit cap; null = none.
- `email` (string, required): They join by signing in with it.
- `role` (string, required): editor makes and spends; reviewer comments and approves.
- `site_urls` (array|null): Limit to these sites; null = all.

Output parameters:

- `email_sent` (boolean)
- `member` (object)

### `list_members` (~59 tokens)

List team members

[Free] Members with role, sites, cap and spend this month; seats; your workspaces (send one as the X-PageToVid-Workspace header to act in it).

Input parameters:

- `site_url` (string): Only members with this site.

Output parameters:

- `members` (array)
- `owner_email` (string)
- `seats_included` (number|null)
- `seats_used` (number)
- `workspace_id` (string)
- `your_role` (string)
- `your_workspaces` (array)

### `update_member` (~80 tokens)

Change a member's role, sites or cap

[Free] Changes only the fields sent. Only the owner grants or changes admin and billing.

Input parameters:

- `credit_cap` (integer|null): Monthly credit cap; null = none.
- `member_id` (string, required): From list_members.
- `role` (string): New role.
- `site_urls` (array|null): Limit to these sites; null = all.

Output parameters:

- `member` (object)

### `remove_member` (~47 tokens)

Remove a member

[Free] Removes a member or cancels an invite, freeing the seat; your own member id leaves the workspace. Their work stays.

Input parameters:

- `member_id` (string, required): From list_members.

Output parameters:

- `member` (object)

### `create_review_link` (~70 tokens)

Share a video for review

[Free] A link to watch the film and, if allowed, comment with no account. Shown once; only its hash is stored.

Input parameters:

- `can_comment` (boolean): Guests may comment.
- `expires_in_hours` (integer): Lifetime.
- `video_id` (string, required): The video's id.

Output parameters:

- `expires_at` (string)
- `review_url` (string)

### `request_approval` (~56 tokens)

Ask for approval

[Free] Opens an approval round for the named approvers; supersedes a pending one.

Input parameters:

- `approver_ids` (array, required): Member ids, or the owner's user id.
- `video_id` (string, required): The video's id.

Output parameters:

- `approval` (object)

### `approve` (~43 tokens)

Approve a video

[Free] Approves the pending round, as one of its approvers.

Input parameters:

- `comment` (string): Optional note.
- `video_id` (string, required): The video's id.

Output parameters:

- `approval` (object)

### `request_changes` (~41 tokens)

Request changes on a video

[Free] Closes the pending round as changes requested.

Input parameters:

- `comment` (string, required): What to change.
- `video_id` (string, required): The video's id.

Output parameters:

- `approval` (object)

### `list_comments` (~40 tokens)

Read a video's comments

[Free] Timestamped comments from members and review-link guests, oldest first, and the approval round.

Input parameters:

- `video_id` (string, required): The video's id.

Output parameters:

- `approval`
- `comments` (array)

### `add_comment` (~72 tokens)

Comment on a video

[Free] Adds a timestamped comment; open comments feed the editor's AI revision.

Input parameters:

- `at_s` (number): Moment in the film, seconds.
- `scene_id` (string): From get_storyboard.
- `text` (string, required): The comment.
- `video_id` (string, required): The video's id.

Output parameters:

- `comment` (object)

### `get_audit_log` (~58 tokens)

Read the workspace audit log

[Free] Who did what here, newest first: members, spending, review links, approvals, comments.

Input parameters:

- `since` (string): Only entries from this time on.
- `site_url` (string): Only entries about this site.

Output parameters:

- `entries` (array)

### `set_webhook` (~89 tokens)

Set the account's completion webhook

[Free] Sets (or with null clears) the account-wide URL that receives a signed JSON event whenever a render ends. The first time a secret is needed it is created and returned here, once.

Input parameters:

- `url` (string|null, required): Public https URL for the completion event of every render that has no callback_url of its own; null removes it. Signed as callback_url describes on create_video.

Output parameters:

- `secret_set` (boolean)
- `webhook_secret` (string)
- `webhook_url` (string|null)

### `rotate_webhook_secret` (~45 tokens)

Rotate the webhook signing secret

[Free] Replaces the secret completion events are signed with and returns the new one, once. The old secret stops verifying at once, including for retries still in flight.

Output parameters:

- `secret_set` (boolean)
- `webhook_secret` (string)
- `webhook_url` (string|null)

### `list_revisions` (~65 tokens)

List a storyboard's revisions

[Free] Every storyboard edit, newest first: what changed and a revision_id. restore_revision puts the storyboard back as it was before one.

Input parameters:

- `limit` (integer): How many, newest first.
- `video_id` (string, required): The video whose storyboard history to use.

Output parameters:

- `revisions` (array)
- `video_id` (string)

### `restore_revision` (~91 tokens)

Undo storyboard edits

[Free] Puts the storyboard back as it was before a revision, undoing that edit and every later one. Itself a revision, so it can be undone. Nothing is re-rendered until rerender_video.

Input parameters:

- `revision_id` (string, required): From list_revisions. The storyboard returns to how it was BEFORE this edit.
- `video_id` (string, required): The video whose storyboard history to use.

Output parameters:

- `restored_to_before` (string)
- `scene_count` (number)
- `undo_revision_id` (string)
- `video_id` (string)

### `update_character` (~109 tokens)

Update a character

[Free] Changes a character's references, description or name; anything not given is kept. Clips already made keep the look they were made with.

Input parameters:

- `description` (string|null): What the character looks like; null clears it.
- `name` (string, required): The character's current name.
- `new_name` (string): Rename it. Scenes that name the old name must be updated.
- `refs` (array): 1-3 reference image URLs from your bank, replacing the current ones.

Output parameters:

- `character` (object)

### `delete_character` (~46 tokens)

Delete a character

[Free] Deletes a character by name. Its reference images stay in your bank and clips made with it stay in their films.

Input parameters:

- `name` (string, required): The character's current name.

Output parameters:

- `deleted` (boolean)
- `name` (string)

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/com-pagetovid-pagetovid/pagetovid#diagnostics

## Score history

- 2026-11-05: 85
- 2026-11-04: 85
- 2026-11-03: 84
- 2026-11-02: 84
- 2026-11-01: 83
- 2026-10-31: 83
- 2026-10-30: 82
- 2026-10-29: 82
- 2026-10-28: 81
- 2026-10-27: 81
- 2026-10-26: 80
- 2026-10-25: 80
- 2026-10-24: 79
- 2026-10-23: 79
- 2026-10-22: 79
- 2026-10-21: 78
- 2026-10-20: 78

## Common questions

### What is the PageToVid MCP server?

PageToVid is an MCP server listed in the public MCP registry as com.pagetovid/pagetovid. Turn any web page into a narrated video: films the real site, writes, voices and captions it. This page covers its hosted endpoint (https://pagetovid.com/mcp).

### Is the PageToVid MCP server safe to use?

PageToVid scores 85 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the PageToVid MCP server expose?

PageToVid exposes 82 tools: create_video, create_animation, cancel_video, get_video, release_video, and 77 more. Their descriptions and schemas cost roughly 14,133 tokens of context every time the server is loaded.

### Does the PageToVid MCP server require authentication?

Yes. PageToVid asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

### Is the PageToVid MCP server still maintained?

PageToVid is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://pagetovid.com/mcp
- Website: https://pagetovid.com/
- Changelog RSS feed: https://verifymcp.io/servers/com-pagetovid-pagetovid/pagetovid.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-pagetovid-pagetovid/pagetovid.json
- HTML version of this page: https://verifymcp.io/servers/com-pagetovid-pagetovid/pagetovid
