GhostfeedGhostfeed MCPv8.2.0

What changed

Every released change to the agent surface, with the exact old and new wording shown as a diff.

One entry per released version, newest first. Green lines are new, red lines are what they replaced. Additions never break a connected agent: MCP clients re-read the tool list every session, so new tools, parameters, and enum values simply appear. Anything that could break an existing integration is labeled breaking and only ships with a new major version.

The current version is always reported by get_me as apiVersion.

v8.2.0

2026-10-12

Some video prices went up to match provider list prices. Seedance 2.0 at 1080p now costs 4 credits per second, and Seedance 2.5 at 1080p costs 6. Wan 3 Prime at 1080p costs 3. MiniMax H3 video-guided input at 2K costs 2 credits per reference second. Every mode in `list_reaction_video_modes` now has its own `maxCreditsPerClip`, based on that mode's highest possible charge, so longer 1080p clips fit. The top-level `maxCreditsPerClip` is the lowest of them.

  • WORDINGgenerate_reaction_videoparam description changed: maxCreditsUGC Reactions →
    Refuse to start any clip that would cost more than this many credits. Clone modes use the source clip length and the selected model/resolution rate. A per-clip ceiling of MAX_REACTION_VIDEO_CREDITS always applies; this only tightens it.
    Refuse to start any clip that would cost more than this many credits. Clone modes use the source clip length and the selected model/resolution rate. The mode’s maxCreditsPerClip (from list_reaction_video_modes) always applies; this only tightens it.

v8.1.0

2026-10-06

Nano Banana 2.1 is available for avatar, UGC frame, and slideshow image requests. Use `nano_banana_2_1` for avatar and UGC requests, or `nano-banana-2.1` for slideshow requests. It uses medium thinking and costs 1 credit for standard output or 1.5 credits for high resolution. The default model is unchanged.

  • ADDEDcreate_avatarenum values added to model: nano_banana_2_1Avatars →
  • ADDEDedit_reaction_frameenum values added to imageModel: nano_banana_2_1UGC Reactions →
  • ADDEDgenerate_reaction_framesenum values added to imageModel: nano_banana_2_1UGC Reactions →

v8.0.2

2026-10-05

Template imports no longer wait for video understanding. `import_reaction_template` reaches `succeeded` as soon as the source media is ready, and `videoUnderstanding` fills in afterwards. Inspiration imports now run in the background like links and uploads, keep the clip's saved analysis, and skip re-encoding videos that are already in the right format. `generate_reaction_frames` with an `inspirationId` starts from the clip's first frame without waiting for the video to import.

  • WORDINGimport_reaction_templatedescription changedUGC Reactions →
    Import a reaction TEMPLATE from exactly one source: sourceUrl (a TikTok/Instagram link), uploadedFileUrl (from request_reaction_upload, the local-file path), or inspirationId (a curated clip). Async: returns a reaction_import generation to poll with get_generation. succeeded means the complete source and canonical videoUnderstanding are ready to use, including sources longer than 30 seconds. Sources over 120 seconds are rejected. Costs no credits. New social/upload imports remain processing until understanding completes; inspiration imports reuse its saved result. Read get_reaction_template for status, description, contentStructure, demoType, sections, generationPrompt, and optional transcript/editing fields. Crop only when the chosen workflow needs a shorter reference. For cloning, load ghostfeed-ugc-reactions and establish which part the user wants before generation. Importing does not authorize paid generation. Deleting templates stays in the dashboard.
    Import a reaction TEMPLATE from exactly one source: sourceUrl (a TikTok/Instagram link), uploadedFileUrl (from request_reaction_upload, the local-file path), or inspirationId (a curated clip). Async: returns a reaction_import generation to poll with get_generation. succeeded means the complete source media is ready to use, including sources longer than 30 seconds. Sources over 120 seconds are rejected. Costs no credits. videoUnderstanding is filled in afterwards in the background (inspiration imports reuse the saved result immediately); check its status on get_reaction_template when you need it. Read get_reaction_template for status, description, contentStructure, demoType, sections, generationPrompt, and optional transcript/editing fields. Crop only when the chosen workflow needs a shorter reference. For cloning, load ghostfeed-ugc-reactions and establish which part the user wants before generation. Importing does not authorize paid generation. Deleting templates stays in the dashboard.

v8.0.1

2026-09-28

Prompt video requests that omit a model now use MiniMax H3 Max through fal.ai. It uses 768p and five seconds by default. Select a Seedance mode explicitly to keep using it. The dashboard also starts with MiniMax H3 Max and warns that Seedance may not work with images of real people.

  • WORDINGgenerate_video_from_promptparam description changed: modeUGC Reactions →
    A prompt-directed mode from list_reaction_video_modes. H3 and H3 Max belong here. Defaults to seedance_2_0_fast.
    A prompt-directed mode from list_reaction_video_modes. H3 and H3 Max belong here. Defaults to minimax_h3_max.

v8.0.0

2026-09-24

Wan 3 and MiniMax H3 Smart Motion now derive output duration from the measured guidance source in dashboard, MCP, and REST. The dashboard no longer submits its hidden duration default. Reference-guided generation no longer exposes a duration input: the backend takes it from the measured source. Legacy motion-control requests with an explicit duration are rejected before billing. MiniMax H3 uses its four-second minimum when the source is shorter. Already admitted generations keep their saved command and remain runnable.

  • BREAKINGgenerate_video_from_referenceparam removed: durationSecondsUGC Reactions →
  • WORDINGgenerate_reaction_videodescription changedUGC Reactions →
    generate_reaction_video is deprecated and scheduled to stop working on 2026-10-15. Migrate to the replacement tools. This compatibility release continues serving the existing call. Use generate_video_from_prompt for first-frame-guided written action, including H3 and H3 Max. A source template uses its canonical generationPrompt when present and legacy motion analysis otherwise. Use generate_video_from_reference for every audio-guided, video-guided, or motion-control request. Poll get_generation. Legacy behavior: PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames and exact prompt. For MiniMax H3, set minimaxH3Mode explicitly: prompt_based sends the selected frame and text; audio_guided also sends source audio; video_guided also sends the source video and includes its audio when present. Guided H3 calls require sourceTemplateId and durationSeconds, and sourceTemplateId must match every frame lineage. First call generate_reaction_prompt with the matching profile and show its complete prompt. The prompt already includes visible Mandatory reference guidance; do not remove or rewrite that section. Small user-approved changes belong only inside Action guidance. Ghostfeed sends the approved prompt without adding hidden text. Then call here with promptApproved true and a protective maxCredits. Other clone modes take no prompt and follow source duration. Other prompt modes use text and may support enableAudio. H3 defaults to 768p and supports optional 2k. Async: returns one reaction_video generation per frame to poll. Immediately call render_video_result with status generating, the generationId, prompt, model, method, aspect ratio, and relevant frame/avatar reference images. The view polls and replaces the pending card with the playable video.
    generate_reaction_video is deprecated and scheduled to stop working on 2026-10-15. Migrate to the replacement tools. This compatibility release continues serving the existing call. Use generate_video_from_prompt for first-frame-guided written action, including H3 and H3 Max. A source template uses its canonical generationPrompt when present and legacy motion analysis otherwise. Use generate_video_from_reference for every audio-guided, video-guided, or motion-control request. Poll get_generation. Legacy behavior: PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames and exact prompt. For MiniMax H3, set minimaxH3Mode explicitly: prompt_based sends the selected frame and text; audio_guided also sends source audio; video_guided also sends the source video and includes its audio when present. Guided H3 calls require sourceTemplateId, and sourceTemplateId must match every frame lineage. Omit durationSeconds for guided and motion-control calls; the backend derives output duration from the measured source. First call generate_reaction_prompt with the matching profile and show its complete prompt. The prompt already includes visible Mandatory reference guidance; do not remove or rewrite that section. Small user-approved changes belong only inside Action guidance. Ghostfeed sends the approved prompt without adding hidden text. Then call here with promptApproved true and a protective maxCredits. Other clone modes take no prompt and follow source duration. Other prompt modes use text and may support enableAudio. H3 defaults to 768p and supports optional 2k. Async: returns one reaction_video generation per frame to poll. Immediately call render_video_result with status generating, the generationId, prompt, model, method, aspect ratio, and relevant frame/avatar reference images. The view polls and replaces the pending card with the playable video.
  • WORDINGgenerate_video_from_referencedescription changedUGC Reactions →
    Create one video controlled by reference motion or audio. Default recommendation for direct cloning: Wan 3 Smart Motion, mode wan_3 with guidance video_guided; it uses the inspectable wan3-video-guided system template and needs no custom action prompt or source analysis by default. For Wan 3, set durationSeconds explicitly (2–30 whole seconds); when cloning a crop, match its intended length because omission defaults to five seconds regardless of source length. Supply actionPrompt only for an explicit change. systemPrompt replaces the default exactly; null removes it. Use Wan 3 audio_guided for audio-led performance. Respect explicit model choices and check catalog limits/pricing. Kling 2.6 Motion Control and Kling 3 Motion Control remain alternatives when explicitly selected. MiniMax H3 guided inputs remain accepted for compatibility but are not recommended for new work. One output; stable idempotencyKey prevents duplicate charges. To SHOW these results in an MCP Apps host, ALWAYS call render_video_result; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
    Create one video controlled by reference motion or audio. Default recommendation for direct cloning: Wan 3 Smart Motion, mode wan_3 with guidance video_guided; it uses the inspectable wan3-video-guided system template and needs no custom action prompt or source analysis by default. Every accepted mode takes output duration from the measured source in the backend; this tool has no duration input. H3 has a four-second minimum; Wan 3 has a two-second minimum. Supply actionPrompt only for an explicit change. systemPrompt replaces the default exactly; null removes it. Use Wan 3 audio_guided for audio-led performance. Respect explicit model choices and check catalog limits/pricing. Kling 2.6 Motion Control and Kling 3 Motion Control remain alternatives when explicitly selected. MiniMax H3 guided inputs remain accepted for compatibility but are not recommended for new work. One output; stable idempotencyKey prevents duplicate charges. To SHOW these results in an MCP Apps host, ALWAYS call render_video_result; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.

v7.1.0

2026-09-24

Blank slideshow creation accepts optional `aspectRatio` through MCP and REST: `3:4` (1080x1440), `1:1` (1080x1080), or `9:16` (1080x1920). Omitting it preserves the 9:16 default. Slides and text use the selected canvas from creation, so agents can build photo posts without resizing the deck afterward.

  • ADDEDcreate_blank_slideshowoptional param added: aspectRatioStudio →
  • WORDINGcreate_blank_slideshowdescription changedStudio →
    Create an empty slideshow with N blank slides, then build it slide by slide with set_slide_background and set_slide_texts. This is how an agent creates a deck: YOU do the creative work. The empty deck is free; the deck costs 1 credit, charged on your first set_slide_background or set_slide_texts (same price as a dashboard-made deck). Later edits are free.
    Create an empty slideshow with N blank slides, then build it slide by slide with set_slide_background and set_slide_texts. Set aspectRatio to 3:4, 1:1 (square), or 9:16 as requested; omitted defaults to 9:16. This is how an agent creates a deck: YOU do the creative work. The empty deck is free; the deck costs 1 credit, charged on your first set_slide_background or set_slide_texts (same price as a dashboard-made deck). Later edits are free.

v7.0.1

2026-09-23

Clarify that Wan 3 Video Guided clones require an explicit whole-second output duration for each cropped source segment. Without it, generation uses the model's five-second default even when the source crop is longer.

  • WORDINGcrop_reaction_templatedescription changedUGC Reactions →
    Create one reusable reaction template from an exact timestamp range of an existing owned/imported template. Async and free: poll the returned reaction_crop generation. On success output.id is the new template id. Use when the user supplies or approves exact start/end times and a shorter or cleaner reference is useful. The source remains usable.
    Create one reusable reaction template from an exact timestamp range of an existing owned/imported template. Async and free to the user: poll the returned reaction_crop generation; on success output.id is the new template id. Crop-specific video understanding may still be processing, so read the new template before using its descriptions or prompt. Use when the user supplies or approves exact start/end times and a shorter or cleaner reference is useful. For a full clone longer than a model's reference limit, choose natural boundaries and crop adjacent ranges from the original source; each call creates one crop, not a stitched video. The source remains usable.
  • WORDINGgenerate_video_from_referencedescription changedUGC Reactions →
    Create one video controlled by reference motion or audio. Default recommendation for direct cloning: Wan 3 Smart Motion, mode wan_3 with guidance video_guided; it uses the inspectable wan3-video-guided system template and needs no custom action prompt or source analysis by default. Supply actionPrompt only for an explicit change. systemPrompt replaces the default exactly; null removes it. Use Wan 3 audio_guided for audio-led performance. Respect explicit model choices and check catalog limits/pricing. Kling 2.6 Motion Control and Kling 3 Motion Control remain alternatives when explicitly selected. MiniMax H3 guided inputs remain accepted for compatibility but are not recommended for new work. One output; stable idempotencyKey prevents duplicate charges. To SHOW these results in an MCP Apps host, ALWAYS call render_video_result; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
    Create one video controlled by reference motion or audio. Default recommendation for direct cloning: Wan 3 Smart Motion, mode wan_3 with guidance video_guided; it uses the inspectable wan3-video-guided system template and needs no custom action prompt or source analysis by default. For Wan 3, set durationSeconds explicitly (2–30 whole seconds); when cloning a crop, match its intended length because omission defaults to five seconds regardless of source length. Supply actionPrompt only for an explicit change. systemPrompt replaces the default exactly; null removes it. Use Wan 3 audio_guided for audio-led performance. Respect explicit model choices and check catalog limits/pricing. Kling 2.6 Motion Control and Kling 3 Motion Control remain alternatives when explicitly selected. MiniMax H3 guided inputs remain accepted for compatibility but are not recommended for new work. One output; stable idempotencyKey prevents duplicate charges. To SHOW these results in an MCP Apps host, ALWAYS call render_video_result; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.

v7.0.0

2026-09-23

UGC creation through MCP and REST now uses the shared dashboard image and video generation architecture. Agents can manage Brands and Products, inspect saved video understanding, choose source sections, create images and videos, and inspect or reuse generation settings. Wan 3 Video Guided keeps its inspectable system prompt without adding a custom action by default; prompt-directed video generation uses the caller-written prompt. MCP Apps provide contextual actions without starting paid work. Legacy generation tools remain available until October 15, 2026.

  • BREAKINGsmart_crop_reaction_templatetool removed
  • ADDEDadd_product_imagesnew toolBrands and Product images →
    Add up to 20 uploaded Product images directly to a Brand. Accepts only upload keys from request_product_image_upload for this user, workspace, and Brand. Repeat the identical ordered input on retries; naming runs in the background without user credit charges.
  • ADDEDanalyze_videonew toolUGC Reactions →
    Read or prepare video analysis for an accessible template or uploaded VIDEO. Use understanding for saved structure, sections, and the provider-authored generationPrompt. For template standard/audio_guided/video_guided profiles, the saved canonical generationPrompt is reused without another provider request; older templates and direct media use durable legacy action analysis. Guided profiles return reference system guidance and action text in separate fields. They remain available for compatible saved MiniMax H3 workflows but are not recommended for new work; prefer Wan 3 reference guidance. Audio-only media cannot provide visual action analysis; use it directly for audio-guided generation.
  • ADDEDclone_imagenew toolUGC Reactions →
    Recreate a Template or image composition with one Avatar and an optional Product image. Automatically uses the Avatar clone default or the Product-aware default, which inserts the supplied Product even if the source has none. Defaults are inspectable and replaceable via systemPrompt. Use get_source_frame to choose a precise source-video frame. Creates one image; it does not generate a video. To SHOW these results in an MCP Apps host, ALWAYS call render_image_results; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
  • ADDEDcomplete_media_uploadnew toolMedia →
    Validate and save uploaded original media. Returns mediaId for generation references. Retrying the same upload is safe.
  • ADDEDcreate_brandnew toolBrands and Product images →
    Create a Brand from a website URL or a name and description. Website enrichment and Product image harvesting run asynchronously; poll get_brand for status.
  • ADDEDedit_imagenew toolUGC Reactions →
    Create a new image by applying a requested change to one existing image or completed image upload. The default preserves unrequested content; replace it with systemPrompt when needed. The original image is preserved. Returns a generation ID to poll with get_generation. To SHOW these results in an MCP Apps host, ALWAYS call render_image_results; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
  • ADDEDgenerate_imagenew toolUGC Reactions →
    Create one image from a written instruction with optional Avatar, Product image, or multiple image references. Text-only creation is supported. Use clone_image for recreating a composition with an Avatar, or edit_image for a specific change. Uses shared dashboard models and durable jobs; use a stable idempotencyKey for retries. To SHOW these results in an MCP Apps host, ALWAYS call render_image_results; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
  • ADDEDgenerate_video_from_promptnew toolUGC Reactions →
    Create one first-frame-guided video from the prompt you write. When recreating a source, read its saved videoUnderstanding and write the requested performance yourself; this tool never inserts source text automatically. Use this for H3, H3 Max, and other prompt-directed models. Use generate_video_from_reference for every audio-guided or video-guided request. Ghostfeed does not add hidden guided text. Use a stable idempotencyKey for retries. To SHOW these results in an MCP Apps host, ALWAYS call render_video_result; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
  • ADDEDgenerate_video_from_referencenew toolUGC Reactions →
    Create one video controlled by reference motion or audio. Default recommendation for direct cloning: Wan 3 Smart Motion, mode wan_3 with guidance video_guided; it uses the inspectable wan3-video-guided system template and needs no custom action prompt or source analysis by default. Supply actionPrompt only for an explicit change. systemPrompt replaces the default exactly; null removes it. Use Wan 3 audio_guided for audio-led performance. Respect explicit model choices and check catalog limits/pricing. Kling 2.6 Motion Control and Kling 3 Motion Control remain alternatives when explicitly selected. MiniMax H3 guided inputs remain accepted for compatibility but are not recommended for new work. One output; stable idempotencyKey prevents duplicate charges. To SHOW these results in an MCP Apps host, ALWAYS call render_video_result; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
  • ADDEDget_brandnew toolBrands and Product images →
    Read full Brand details, website enrichment status, and image-harvest status.
  • ADDEDget_generation_promptnew toolGenerations →
    Inspect the actual saved system, user, and compiled provider prompts of a public generation. Returns unavailable fields honestly for older records; never substitutes today’s defaults. Use get_prompt_template only when you want the current default.
  • ADDEDget_generation_setupnew toolGenerations →
    Read saved nonbilling generation settings, ordered references and prompts for reuse or debugging. Exact saved snapshots are distinguished from incomplete legacy history. Reuse reauthorizes assets and requires a new idempotency key for new work; this read does not generate anything.
  • ADDEDget_imagenew toolGenerations →
    Read one accessible generated/source frame or completed image upload, including saved prompt provenance and lineage when available. Choose source upload for a mediaId. Use get_generation_prompt for an in-flight generation’s prompt.
  • ADDEDget_prompt_templatenew toolGenerations →
    Read one versioned image default or guided-video system template. Image defaults and Wan 3 Video Guided select their matching templates automatically; other guided templates require an explicit systemPrompt. Inspect a submitted generation with get_generation_prompt.
  • ADDEDget_skillnew toolWorkflow skills →
    Read one public workflow skill by name. Returns the canonical instructions and content digest. Follow the user’s goal and use the described tools; this call does not start generation or change shared settings.
  • ADDEDget_source_framenew toolMedia →
    Extract and save a frame at a timestamp from an accessible source template or uploaded video. Use it to inspect sections or choose the exact image to recreate.
  • ADDEDlist_brandsnew toolBrands and Product images →
    List Brands and their website enrichment and image-harvest status. Use list_product_images for their directly owned Product images.
  • ADDEDlist_product_imagesnew toolBrands and Product images →
    List directly owned Product images for a Brand, including editable names, naming status, and capacity. Images with deletionPending are unavailable for generation.
  • ADDEDlist_skillsnew toolWorkflow skills →
    Discover Ghostfeed’s public workflow skills. Read the relevant skill before composing a multi-step avatar, UGC image/video, or slideshow workflow. No separate skill installation is required to read these instructions.
  • ADDEDremove_product_imagenew toolBrands and Product images →
    Permanently remove a Product image from its Brand, including exclusively owned stored media. Only call when the user requests removal.
  • ADDEDrename_product_imagenew toolBrands and Product images →
    Change the editable name of a directly owned Product image.
  • ADDEDrequest_media_uploadnew toolMedia →
    Request an upload URL for original image, video, or audio bytes. PUT the bytes to the URL, then complete_media_upload. No generation is started.
  • ADDEDrequest_product_image_uploadnew toolBrands and Product images →
    Request a Brand-bound upload URL for one JPEG, PNG, or WebP image of at most 10 MB. Upload its bytes then call add_product_images.
  • ADDEDupdate_brandnew toolBrands and Product images →
    Update Brand details. An empty URL clears it. Updating the URL does not automatically re-run website enrichment or image harvesting.
  • WORDINGcrop_reaction_templatedescription changedUGC Reactions →
    Create one reusable reaction template from an exact timestamp range of an existing owned/imported template. Async and free: poll the returned reaction_crop generation. On success output.id is the new template id. Use when the user supplies or approves exact start/end times; this creates a derivative and archives the source only when the source was blocked in needs_crop.
    Create one reusable reaction template from an exact timestamp range of an existing owned/imported template. Async and free: poll the returned reaction_crop generation. On success output.id is the new template id. Use when the user supplies or approves exact start/end times and a shorter or cleaner reference is useful. The source remains usable.
  • WORDINGedit_reaction_framedescription changedUGC Reactions →
    Edit one existing reaction frame with a text prompt. Use frameId from list_reaction_frames. This creates a new frame and preserves the source frame plus its lineage. It charges the selected image-model and resolution cost once. The returned reaction_frame generation is normally succeeded; a concurrent idempotent replay can return the same queued generation and must be polled. On success, output.url is the edited image and output.id is the new frameId. Show the edit to the user and get approval before generate_reaction_video.
    edit_reaction_frame is deprecated and scheduled to stop working on 2026-10-15. Migrate to the replacement tools. This compatibility release continues serving the existing call. Call edit_image with image:{kind:"frame",frameId} and instruction. Poll the returned generation with get_generation. Legacy behavior: Edit one existing reaction frame with a text prompt. Use frameId from list_reaction_frames. This creates a new frame and preserves the source frame plus its lineage. It charges the selected image-model and resolution cost once. The returned reaction_frame generation is normally succeeded; a concurrent idempotent replay can return the same queued generation and must be polled. On success, output.url is the edited image and output.id is the new frameId. Show the edit to the user and get approval before generate_reaction_video.
  • WORDINGgenerate_reaction_framesdescription changedUGC Reactions →
    PHASE 1 of a UGC reaction: create ONE first frame per avatar. With a source, render the avatar into the source pose. Without a source, supply a non-empty stylingPrompt to create the frame directly from the avatar. Source is at most one of templateId, inspirationId (auto-saved to a template first), or referenceImageUrl. For a source-based request, search list_reaction_templates first, then list_inspiration_reactions if the user did not supply an exact source. imageOutputResolution defaults to standard. Source-based work is async and must be polled. Prompt-only work normally returns succeeded reaction_frame generations; a concurrent idempotent replay can return the same queued generation and must be polled. In both flows, the finished frame is output.url and output.id is the frameId. For async generations, immediately call render_image_results with one generating frame item per generation: set generationId to the returned generation id and keep the shared prompt, image model, and requested aspect ratio. The widget polls the read-only result itself. The selected image model and resolution charge applies per avatar. Show all frames and get approval before generate_reaction_video.
    generate_reaction_frames is deprecated and scheduled to stop working on 2026-10-15. Migrate to the replacement tools. This compatibility release continues serving the existing call. Use clone_image to recreate a source composition with an Avatar and optional Product image. Use generate_image for prompt-led creation. Each call creates one image; poll get_generation. Legacy behavior: PHASE 1 of a UGC reaction: create ONE first frame per avatar. With a source, render the avatar into the source pose. Without a source, supply a non-empty stylingPrompt to create the frame directly from the avatar. Source is at most one of templateId, inspirationId (auto-saved to a template first), or referenceImageUrl. For a source-based request, search list_reaction_templates first, then list_inspiration_reactions if the user did not supply an exact source. imageOutputResolution defaults to standard. Source-based work is async and must be polled. Prompt-only work normally returns succeeded reaction_frame generations; a concurrent idempotent replay can return the same queued generation and must be polled. In both flows, the finished frame is output.url and output.id is the frameId. For async generations, immediately call render_image_results with one generating frame item per generation: set generationId to the returned generation id and keep the shared prompt, image model, and requested aspect ratio. The widget polls the read-only result itself. The selected image model and resolution charge applies per avatar. Show all frames and get approval before generate_reaction_video.
  • WORDINGgenerate_reaction_promptdescription changedUGC Reactions →
    Generate the exact prompt the user will review before video creation. promptProfile prompt_based returns the normal visual-action prompt and remains a repair path when the template motionAnalysis is missing. For MiniMax H3, audio_guided and video_guided are on-demand profiles and require outputDurationSeconds. Their returned prompt visibly includes a Mandatory reference guidance section followed by Action guidance. Show the complete returned prompt, H3 plan, settings, warning, and estimated credits to the user. Tell the user not to change Mandatory reference guidance and to make only small changes inside Action guidance. Every profile still uses the selected first frame during video generation.
    generate_reaction_prompt is deprecated and scheduled to stop working on 2026-10-15. Migrate to the replacement tools. This compatibility release continues serving the existing call. Read the template videoUnderstanding generationPrompt for new imports. Use analyze_video standard only when an older source has no canonical prompt; source-directed generation performs that fallback automatically. Guided generation receives no hidden MCP system text. Legacy behavior: Generate the exact prompt the user will review before video creation. promptProfile prompt_based returns the normal visual-action prompt and remains a repair path when the template motionAnalysis is missing. For MiniMax H3, audio_guided and video_guided are on-demand profiles and require outputDurationSeconds. Their returned prompt visibly includes a Mandatory reference guidance section followed by Action guidance. Show the complete returned prompt, H3 plan, settings, warning, and estimated credits to the user. Tell the user not to change Mandatory reference guidance and to make only small changes inside Action guidance. Every profile still uses the selected first frame during video generation.
  • WORDINGgenerate_reaction_videodescription changedUGC Reactions →
    PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames and exact prompt. For MiniMax H3, set minimaxH3Mode explicitly: prompt_based sends the selected frame and text; audio_guided also sends source audio; video_guided also sends the source video and includes its audio when present. Guided H3 calls require sourceTemplateId and durationSeconds, and sourceTemplateId must match every frame lineage. First call generate_reaction_prompt with the matching profile and show its complete prompt. The prompt already includes visible Mandatory reference guidance; do not remove or rewrite that section. Small user-approved changes belong only inside Action guidance. Ghostfeed sends the approved prompt without adding hidden text. Then call here with promptApproved true and a protective maxCredits. Other clone modes take no prompt and follow source duration. Other prompt modes use text and may support enableAudio. H3 defaults to 768p and supports optional 2k. Async: returns one reaction_video generation per frame to poll. Immediately call render_video_result with status generating, the generationId, prompt, model, method, aspect ratio, and relevant frame/avatar reference images. The view polls and replaces the pending card with the playable video.
    generate_reaction_video is deprecated and scheduled to stop working on 2026-10-15. Migrate to the replacement tools. This compatibility release continues serving the existing call. Use generate_video_from_prompt for first-frame-guided written action, including H3 and H3 Max. A source template uses its canonical generationPrompt when present and legacy motion analysis otherwise. Use generate_video_from_reference for every audio-guided, video-guided, or motion-control request. Poll get_generation. Legacy behavior: PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames and exact prompt. For MiniMax H3, set minimaxH3Mode explicitly: prompt_based sends the selected frame and text; audio_guided also sends source audio; video_guided also sends the source video and includes its audio when present. Guided H3 calls require sourceTemplateId and durationSeconds, and sourceTemplateId must match every frame lineage. First call generate_reaction_prompt with the matching profile and show its complete prompt. The prompt already includes visible Mandatory reference guidance; do not remove or rewrite that section. Small user-approved changes belong only inside Action guidance. Ghostfeed sends the approved prompt without adding hidden text. Then call here with promptApproved true and a protective maxCredits. Other clone modes take no prompt and follow source duration. Other prompt modes use text and may support enableAudio. H3 defaults to 768p and supports optional 2k. Async: returns one reaction_video generation per frame to poll. Immediately call render_video_result with status generating, the generationId, prompt, model, method, aspect ratio, and relevant frame/avatar reference images. The view polls and replaces the pending card with the playable video.
  • WORDINGget_reaction_templatedescription changedUGC Reactions →
    Read one source template by its templateId (or a generated video’s sourceReactionId). New uploads and social imports become ready only after canonical videoUnderstanding is complete. The saved understanding supplies firstFrameScene, factual sections, and a provider-authored generationPrompt that must remain visible and editable before generation. Legacy opensOn and motionAnalysis fields can still be present for older templates. Use this read after list_reaction_videos to resolve each unique source once.
    Read one source template by its templateId (or a generated video’s sourceReactionId). Returns source media, import metadata, full opening-composition and legacy motion analysis when available, plus the canonical saved videoUnderstanding result. New uploads and social imports finish understanding before becoming ready; saved inspiration imports reuse its analysis. New crops are exact assets with their own understanding. Completed v8 understanding includes a provider-authored generationPrompt for generation as well as factual source evidence. Reading does not start a new analysis. Use analyze_video understanding only when the saved result is missing or failed and the user wants a retry.
  • WORDINGget_reaction_videodescription changedUGC Reactions →
    Read one reaction video’s full render record after finding it with list_reaction_videos. Returns the canonical generated video URL, sourceReactionId, exact first-frame and video prompts, selected frame, models, duration, and post-edit URL. Call get_reaction_template separately for source media and Gemini analysis. Use this only for videos you need to recreate or inspect in detail; the list stays compact enough to inventory up to 100 videos. To SHOW these results in an MCP Apps host, ALWAYS call render_video_result; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
    Read one reaction video’s full render record after finding it with list_reaction_videos. Returns the canonical generated video URL, sourceReactionId, exact first-frame and video prompts, selected frame, models, duration, and post-edit URL. When sourceReactionId is present, get_reaction_template reads source media and stored analysis. When generationId is known, prefer get_generation_prompt and get_generation_setup for exact saved instructions and reusable settings. Use this only for videos you need to recreate or inspect in detail; the list stays compact enough to inventory up to 100 videos. To SHOW these results in an MCP Apps host, ALWAYS call render_video_result; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
  • WORDINGimport_reaction_templatedescription changedUGC Reactions →
    Import a reaction TEMPLATE from exactly one source: sourceUrl (a TikTok/Instagram link), uploadedFileUrl (from request_reaction_upload, the local-file path), or inspirationId (a curated clip). Async: returns a reaction_import generation to poll with get_generation. succeeded = ready to use; needs_action = the source is 30-120s and must be cropped in the dashboard first (open dashboardUrl); >120s is rejected. Costs no credits. Managing, cropping, and deleting templates all happen in the dashboard.
    Import a reaction TEMPLATE from exactly one source: sourceUrl (a TikTok/Instagram link), uploadedFileUrl (from request_reaction_upload, the local-file path), or inspirationId (a curated clip). Async: returns a reaction_import generation to poll with get_generation. succeeded means the complete source and canonical videoUnderstanding are ready to use, including sources longer than 30 seconds. Sources over 120 seconds are rejected. Costs no credits. New social/upload imports remain processing until understanding completes; inspiration imports reuse its saved result. Read get_reaction_template for status, description, contentStructure, demoType, sections, generationPrompt, and optional transcript/editing fields. Crop only when the chosen workflow needs a shorter reference. For cloning, load ghostfeed-ugc-reactions and establish which part the user wants before generation. Importing does not authorize paid generation. Deleting templates stays in the dashboard.
  • WORDINGlist_avatar_imagesdescription changedStudio →
    List a saved avatar's generated photos (urls + captions), newest first, 30 per page. A worked avatar can hold hundreds, so this is paged: read total/pages and ask for the next page rather than expecting everything at once. The captions describe each shot, so use them to pick a specific pose or framing — that is how you cast a first frame for generate_reaction_frames via referenceImageUrl. Reusing them is free; use set_slide_background type 'avatar' to cast one. To SHOW these results in an MCP Apps host, ALWAYS call render_image_results; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
    List a saved avatar's generated photos (urls + captions), newest first, 30 per page. A worked avatar can hold hundreds, so this is paged: read total/pages and ask for the next page rather than expecting everything at once. The captions describe each shot. New image/video tools accept avatarId for the base avatar identity, not a photo id. To use a specific saved photo, upload its bytes through request_media_upload and complete_media_upload, then use the returned mediaId as an upload reference. Reusing them is free; use set_slide_background type 'avatar' to cast one. To SHOW these results in an MCP Apps host, ALWAYS call render_image_results; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
  • WORDINGlist_image_modelsdescription changedAvatars →
    Discover image models, quality/resolution choices, per-image prices, reference capabilities, and saved-model aliases for avatar, frame, and slideshow generation.
    Discover model IDs for generate_image, clone_image, edit_image, and create_avatar, including text-only/reference capabilities, quality/resolution choices, prices, and saved-model aliases. Slideshow model metadata is also included.
  • WORDINGlist_inspiration_reactionsdescription changedUGC Reactions →
    SECOND source search for every new reaction request, after list_reaction_templates has no suitable opening pose. Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). Analyzed clips carry firstFrameScene and a provider-authored generationPrompt inside videoUnderstanding; older clips may expose legacy opensOn and motion fields. render_inspiration_browser (workspace plus optional category) loads 12 real library items per page and changes pages without another model turn. A selection asks what the user wants to create and does not start paid work. Choose primarily on firstFrameScene. A prompt-mode video may reuse the opening pose without copying the source motion. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first. Only fall back to a custom referenceImageUrl after both libraries lack a reasonable match. To SHOW these results in an MCP Apps host, ALWAYS call render_inspiration_browser; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
    Browse the curated inspiration library when the user needs a source composition or motion reference. Captioned clips include opensOn and motion. render_inspiration_browser loads 12 library items per page and changes pages without another model turn; selecting a clip asks what to create and does not start paid work. Pass the inspiration id to import_reaction_template, wait for readiness, then use the returned templateId with clone_image, analyze_video, or either video generation intent. Source browsing is optional for custom generation and user-supplied references. To SHOW these results in an MCP Apps host, ALWAYS call render_inspiration_browser; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
  • WORDINGlist_productsdescription changedLibrary →
    List the workspace's registered products: id, name, description, url, dashboardUrl, and linkedCollections (the product's OWN photo collections, each with its own dashboardUrl). To plug a product, weave it into ONE slide in a soft peer-recommendation voice: browse a linked collection with list_collection_images and cast a real product image on that slide with set_slide_background. Call this BEFORE building a deck that should plug a product.
    list_products is deprecated and scheduled to stop working on 2026-10-15. Migrate to the replacement tools. This compatibility release continues serving the existing call. Use list_brands to choose a Brand, then list_product_images with its brandId for directly owned Product images. The existing linkedCollections response remains available during migration. Legacy behavior: List the workspace's registered products: id, name, description, url, dashboardUrl, and linkedCollections (the product's OWN photo collections, each with its own dashboardUrl). To plug a product, weave it into ONE slide in a soft peer-recommendation voice: browse a linked collection with list_collection_images and cast a real product image on that slide with set_slide_background. Call this BEFORE building a deck that should plug a product.
  • WORDINGlist_reaction_framesdescription changedUGC Reactions →
    List reusable reaction FRAMES on the workspace board, newest first, including ones a person made in the dashboard. Filter by both avatar and template before generating a new first frame. Each row carries its image, lineage and generation metadata, preferenceStatus, videoStage, and animationStatus. A complete frame is still reusable for another video. Show candidates and let the user reuse one for free or request a fresh variation; never silently assume an old take is approved. To SHOW these results in an MCP Apps host, ALWAYS call render_image_results; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
    List reusable image frames on the workspace board, newest first, including dashboard results. Filter by avatar or template when relevant. Each row carries its image, lineage, generation metadata, preferenceStatus, videoStage, and animationStatus. A completed frame remains reusable. Pass an image reference {kind: frame, frameId} to generate_video_from_prompt or generate_video_from_reference, or use edit_image to change it. Follow the user’s review preferences when choosing an existing take. To SHOW these results in an MCP Apps host, ALWAYS call render_image_results; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
  • WORDINGlist_reaction_templatesdescription changedUGC Reactions →
    FIRST source search for every new reaction request unless the user explicitly supplied an exact source. List reaction TEMPLATES usable in this workspace: platform stock plus your own imported/uploaded motion clips. Each has an id, name, category, duration, thumbnail, and status. Analyzed clips also carry firstFrameScene (the opening still your avatar gets rendered into) and a provider-authored generationPrompt inside videoUnderstanding; older clips may expose legacy opensOn and motion fields. Choose primarily on firstFrameScene. A prompt-mode video may reuse the opening pose without copying the source motion. If no template has a reasonable opening-pose match, search list_inspiration_reactions next.
    Browse source templates when the request needs an existing composition or motion reference: platform stock plus workspace imports/uploads. Custom image and prompt-directed video creation do not require a template search. Analyzed clips carry firstFrameScene and videoUnderstanding; older clips may expose opensOn and motion summaries. Use clone_image to recreate a composition. For generate_video_from_prompt, read source understanding and write the prompt yourself. Use generate_video_from_reference for media-guided motion. analyze_video gets or creates source analysis when needed.
  • WORDINGlist_reaction_video_modesdescription changedUGC Reactions →
    List the video modes for the reaction video phase, with costs, resolutions, prompt rules, and audio behavior. MiniMax H3 also returns minimaxH3Modes: prompt_based, audio_guided, and video_guided. Every H3 mode uses the selected frame. Audio-guided adds free source audio. Video-guided adds billed source-video input and includes its audio when present. Read these fields before creating an H3 prompt or video.
    List video modes for generate_video_from_prompt and generate_video_from_reference, with supported intent tools, reference capabilities, costs, resolutions, prompt rules, and audio behavior. MiniMax H3 also returns minimaxH3Modes: prompt_based, audio_guided, and video_guided. Every H3 mode uses the selected frame. Audio-guided adds free source audio. Video-guided adds billed source-video input and includes its audio when present. Read these fields before creating an H3 prompt or video.
  • WORDINGlist_reaction_videosdescription changedUGC Reactions →
    List the reaction VIDEOS in this workspace, newest first, agent-made or not. Each has a videoId, name, stage, a playable videoUrl once stage is "complete", a dashboardUrl, and sourceReactionId when it came from a template. videoUrl is the canonical clip: the post-edit version once one exists, otherwise the raw render. generation is a compact model/mode/duration summary. Rows carry avatarId but not the avatar name; resolve names with list_avatars when you need them. Call get_reaction_template with sourceReactionId for source media and Gemini analysis, or get_reaction_video for the exact prompt/settings of one rendered video. Managing and deleting videos stays in the dashboard. To SHOW these results in an MCP Apps host, ALWAYS call render_video_result; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
    List the reaction VIDEOS in this workspace, newest first, agent-made or not. Each has a videoId, name, stage, a playable videoUrl once stage is "complete", a dashboardUrl, and sourceReactionId when it came from a template. videoUrl is the canonical clip: the post-edit version once one exists, otherwise the raw render. generation is a compact model/mode/duration summary. Rows carry avatarId but not the avatar name; resolve names with list_avatars when you need them. When sourceReactionId is present, get_reaction_template reads source media and stored analysis. get_reaction_video reads one render record; when generationId is known, get_generation_prompt and get_generation_setup provide exact saved instructions and reusable settings. Managing and deleting videos stays in the dashboard. To SHOW these results in an MCP Apps host, ALWAYS call render_video_result; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
  • WORDINGregenerate_reaction_framedescription changedUGC Reactions →
    Redo a frame the user was not happy with. Identify it with EITHER frameId (any frame from list_reaction_frames, including ones a person made in the dashboard) OR generationId (a frame this API started); pass exactly one. Re-runs frame generation on the same avatar + source and charges another frame credit. Poll the same generation until it succeeds with a fresh frame, then get approval before generate_reaction_video.
    regenerate_reaction_frame is deprecated and scheduled to stop working on 2026-10-15. Migrate to the replacement tools. This compatibility release continues serving the existing call. Read get_generation_setup for saved generation inputs, or get_image for frame lineage. Start clone_image or generate_image with the intended settings and a new idempotencyKey. Reuse a key only to retry the same request. Legacy behavior: Redo a frame the user was not happy with. Identify it with EITHER frameId (any frame from list_reaction_frames, including ones a person made in the dashboard) OR generationId (a frame this API started); pass exactly one. Re-runs frame generation on the same avatar + source and charges another frame credit. Poll the same generation until it succeeds with a fresh frame, then get approval before generate_reaction_video.

v6.4.1

2026-09-22

Template imports now finish only after their saved video understanding is ready. Prompt generation reuses that canonical result, so agents submit the exact editable prompt without triggering another source-video analysis. Wan 3 guided requests use versioned default guidance when the caller omits an instruction.

  • WORDINGget_reaction_templatedescription changedUGC Reactions →
    Read one source template by its templateId (or a generated video’s sourceReactionId). Returns the original/source clip, external import URL when present, duration, import type, the full opensOn still description, and the full stored motion analysis. New uploads and social imports request craft and motion analysis in the background. Saved inspiration imports reuse available metadata; crops do not automatically request analysis. opensOn and motionAnalysis can be absent. videoUnderstanding is a separate factual result, not a generation prompt. list_reaction_templates only carries a one-line teaser of it. Use it after list_reaction_videos to resolve each unique source once, rather than repeating source metadata on every generated video.
    Read one source template by its templateId (or a generated video’s sourceReactionId). New uploads and social imports become ready only after canonical videoUnderstanding is complete. The saved understanding supplies firstFrameScene, factual sections, and a provider-authored generationPrompt that must remain visible and editable before generation. Legacy opensOn and motionAnalysis fields can still be present for older templates. Use this read after list_reaction_videos to resolve each unique source once.
  • WORDINGlist_inspiration_reactionsdescription changedUGC Reactions →
    SECOND source search for every new reaction request, after list_reaction_templates has no suitable opening pose. Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip). render_inspiration_browser (workspace plus optional category) loads 12 real library items per page and changes pages without another model turn. A selection asks what the user wants to create and does not start paid work. Choose primarily on opensOn. A prompt-mode video may reuse the opening pose without copying the source motion. Use motion only to judge a requested clone, and never paste it into generate_reaction_video as the prompt. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first. Only fall back to a custom referenceImageUrl after both libraries lack a reasonable match. To SHOW these results in an MCP Apps host, ALWAYS call render_inspiration_browser; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
    SECOND source search for every new reaction request, after list_reaction_templates has no suitable opening pose. Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). Analyzed clips carry firstFrameScene and a provider-authored generationPrompt inside videoUnderstanding; older clips may expose legacy opensOn and motion fields. render_inspiration_browser (workspace plus optional category) loads 12 real library items per page and changes pages without another model turn. A selection asks what the user wants to create and does not start paid work. Choose primarily on firstFrameScene. A prompt-mode video may reuse the opening pose without copying the source motion. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first. Only fall back to a custom referenceImageUrl after both libraries lack a reasonable match. To SHOW these results in an MCP Apps host, ALWAYS call render_inspiration_browser; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
  • WORDINGlist_reaction_templatesdescription changedUGC Reactions →
    FIRST source search for every new reaction request unless the user explicitly supplied an exact source. List reaction TEMPLATES usable in this workspace: platform stock plus your own imported/uploaded motion clips. Each has an id, name, category, duration, thumbnail, and status. Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip); older clips may not have them yet. Choose primarily on opensOn. A prompt-mode video may reuse the opening pose without copying the source motion. Use motion only to judge a requested clone, and never paste it into generate_reaction_video as the prompt. If no template has a reasonable opening-pose match, search list_inspiration_reactions next.
    FIRST source search for every new reaction request unless the user explicitly supplied an exact source. List reaction TEMPLATES usable in this workspace: platform stock plus your own imported/uploaded motion clips. Each has an id, name, category, duration, thumbnail, and status. Analyzed clips also carry firstFrameScene (the opening still your avatar gets rendered into) and a provider-authored generationPrompt inside videoUnderstanding; older clips may expose legacy opensOn and motion fields. Choose primarily on firstFrameScene. A prompt-mode video may reuse the opening pose without copying the source motion. If no template has a reasonable opening-pose match, search list_inspiration_reactions next.

v6.4.0

2026-09-21

Inspiration and template reads add optional saved `videoUnderstanding`. New inspiration imports reuse saved results, and crop sections use crop-relative times with whole-source labels kept as source context. Old templates are not backfilled. Complete long imports no longer require a crop to become usable. Model capabilities expose the supported Kling and H3 reference-duration limits.

  • WORDINGget_reaction_templatedescription changedUGC Reactions →
    Read one source template by its templateId (or a generated video’s sourceReactionId). Returns the original/source clip, external import URL when present, duration, import type, the full opensOn still description, and the full stored motion analysis. Every clip is analysed automatically on import, so this free read is normally where the complete motionAnalysis.prompt already is. list_reaction_templates only carries a one-line teaser of it. Use it after list_reaction_videos to resolve each unique source once, rather than repeating source metadata on every generated video.
    Read one source template by its templateId (or a generated video’s sourceReactionId). Returns the original/source clip, external import URL when present, duration, import type, the full opensOn still description, and the full stored motion analysis. New uploads and social imports request craft and motion analysis in the background. Saved inspiration imports reuse available metadata; crops do not automatically request analysis. opensOn and motionAnalysis can be absent. videoUnderstanding is a separate factual result, not a generation prompt. list_reaction_templates only carries a one-line teaser of it. Use it after list_reaction_videos to resolve each unique source once, rather than repeating source metadata on every generated video.
  • WORDINGlist_reaction_templatesparam description changed: includeUnusableUGC Reactions →
    Include templates that cannot be generated from yet: ones still importing, ones that failed, and ones over 30s awaiting a crop. Off by default, because generating from them is refused anyway.
    Include templates that cannot be generated from yet: ones still importing, ones that failed. Off by default, because generating from them is refused anyway.

v6.3.0

2026-09-18

Video generation now exposes Wan 3 as one model family with first-frame, audio-guided, and video-guided reference modes. The optional `modeInput` object selects `{ guidance, prime }`; Prime uses the higher resolution-specific credit rates and the corresponding fal.ai endpoint. Wan 3 accepts explicit 2–30 second outputs, and the public mode catalog reports its reference and Prime pricing contract.

v6.2.0

2026-09-12

Image model discovery now includes quality and resolution choices, their per-image credit prices, reference capabilities, display labels, generation-time estimates, and saved-model aliases. Existing `list_image_models` fields and model IDs are unchanged; slideshow discovery also identifies its compatible model IDs and reference support. REST and MCP return the same backend-owned catalog.

  • WORDINGlist_image_modelsdescription changedAvatars →
    List the image models create_avatar can use, with per-image credit cost, so you can offer the user options with prices.
    Discover image models, quality/resolution choices, per-image prices, reference capabilities, and saved-model aliases for avatar, frame, and slideshow generation.

v6.1.0

2026-09-09

- Add GPT Image 2.5 Flare and Sunburst, Seedance 2.5, and MiniMax H3 Max to the applicable model catalogs. - Add optional `imageQuality` to image generation and edit requests. Saved frames return the selected quality. Existing GPT Image 2 IDs retain their quality. - Add 480p to the video resolution input. Each model retains its own supported resolution set. - Preserve existing model IDs and saved generation reuse.

  • ADDEDcreate_avatarenum values added to model: gpt_flare, gpt_sunburstAvatars →
  • ADDEDedit_reaction_frameenum values added to imageModel: gpt_flare, gpt_sunburstUGC Reactions →
  • ADDEDedit_reaction_frameoptional param added: imageQualityUGC Reactions →
  • ADDEDgenerate_reaction_framesenum values added to imageModel: gpt_flare, gpt_sunburstUGC Reactions →
  • ADDEDgenerate_reaction_framesoptional param added: imageQualityUGC Reactions →
  • ADDEDgenerate_reaction_videoenum values added to mode: minimax_h3_max, seedance_2_5UGC Reactions →
  • ADDEDgenerate_reaction_videoenum values added to outputResolution: 480pUGC Reactions →

v6.0.1

2026-09-10

Standard MCP tools return text JSON with all existing media URLs. Optional resource-link blocks remain on explicit MCP Apps render tools, so clients that cannot read those blocks can still use the generation and source-read tools. Video generation accepts copied frame mentions and returns a recovery step when a frame is missing or inaccessible. Tool error references now link to the connection history, including failures returned with HTTP 200.

    v6.0.0

    2026-08-24

    Slideshow text composition now has a four-element ceiling per slide, replacing the previous five-element limit. Agents should combine or redistribute copy that would require a fifth text box. The Director remains free to choose the best mix of headings and supporting text within that ceiling and the existing safe-area fit rules.

    • BREAKINGset_slide_textsconstraint tightened: texts maxItems: 5 -> 4Studio →
    • WORDINGset_slide_textsdescription changedStudio →
      Replace one slide's text boxes (1-5 texts with placement top/center/bottom and role heading/subheading/body/cta - role sets the font size, positions are computed server-side exactly like the dashboard). Infer copy density from the user's full brief and this slide's narrative job: headings are usually 3-8 words and body copy 8-20 words, but conversational brevity/detail guidance and explicit word or line limits win. The server rejects copy beyond heading 2, subheading 3, body 4, or CTA 2 rendered lines, or outside the safe area; it never truncates. Rewrite or redistribute and retry after a fit error. Optionally mark isProductSlide. If this is the deck's first build edit it charges 1 credit and returns creditsSpent/creditsRemaining.
      Replace one slide's text boxes (1-4 texts with placement top/center/bottom and role heading/subheading/body/cta - role sets the font size, positions are computed server-side exactly like the dashboard). Infer copy density from the user's full brief, the slide's narrative job, and the slideshow's established style. There are no default word-count or rendered-line quotas; deliberate dense copy and walls of text are valid creative choices. Explicit user limits win. The server enforces physical safe-area fit; it never truncates. Rewrite or restructure after a fit error. Optionally mark isProductSlide. If this is the deck's first build edit it charges 1 credit and returns creditsSpent/creditsRemaining.
    • WORDINGset_slide_textsparam description changed: textsStudio →
      Replaces ALL text boxes on the slide; positions are computed server-side. Hard fit limits: heading 2 rendered lines, subheading 3, body 4, CTA 2.
      Replaces ALL text boxes on the slide; positions are computed server-side. There are no default word or line quotas: use the density the slide needs. The server enforces physical safe-area fit and any explicit limits from the user's brief; it never truncates.

    v5.20.2

    2026-08-14

    MiniMax H3 video-guided generation now accepts source videos without audio. When source audio exists, Ghostfeed preserves and sends it; when the source is silent, Ghostfeed sends the selected frame, reference video, and approved text without inventing an audio track. Audio-guided generation still requires a supported source-audio stream.

    • WORDINGgenerate_reaction_videodescription changedUGC Reactions →
      PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames and exact prompt. For MiniMax H3, set minimaxH3Mode explicitly: prompt_based sends the selected frame and text; audio_guided also sends source audio; video_guided also sends the source video and its audio. Guided H3 calls require sourceTemplateId and durationSeconds, and sourceTemplateId must match every frame lineage. First call generate_reaction_prompt with the matching profile and show its complete prompt. The prompt already includes visible Mandatory reference guidance; do not remove or rewrite that section. Small user-approved changes belong only inside Action guidance. Ghostfeed sends the approved prompt without adding hidden text. Then call here with promptApproved true and a protective maxCredits. Other clone modes take no prompt and follow source duration. Other prompt modes use text and may support enableAudio. H3 defaults to 768p and supports optional 2k. Async: returns one reaction_video generation per frame to poll. Immediately call render_video_result with status generating, the generationId, prompt, model, method, aspect ratio, and relevant frame/avatar reference images. The view polls and replaces the pending card with the playable video.
      PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames and exact prompt. For MiniMax H3, set minimaxH3Mode explicitly: prompt_based sends the selected frame and text; audio_guided also sends source audio; video_guided also sends the source video and includes its audio when present. Guided H3 calls require sourceTemplateId and durationSeconds, and sourceTemplateId must match every frame lineage. First call generate_reaction_prompt with the matching profile and show its complete prompt. The prompt already includes visible Mandatory reference guidance; do not remove or rewrite that section. Small user-approved changes belong only inside Action guidance. Ghostfeed sends the approved prompt without adding hidden text. Then call here with promptApproved true and a protective maxCredits. Other clone modes take no prompt and follow source duration. Other prompt modes use text and may support enableAudio. H3 defaults to 768p and supports optional 2k. Async: returns one reaction_video generation per frame to poll. Immediately call render_video_result with status generating, the generationId, prompt, model, method, aspect ratio, and relevant frame/avatar reference images. The view polls and replaces the pending card with the playable video.
    • WORDINGgenerate_reaction_videoparam description changed: minimaxH3ModeUGC Reactions →
      MiniMax H3 input mode. Every value uses the selected frame. prompt_based adds text only; audio_guided also sends source audio; video_guided also sends the source video and its audio.
      MiniMax H3 input mode. Every value uses the selected frame. prompt_based adds text only; audio_guided also sends source audio; video_guided also sends the source video and includes its audio when present.
    • WORDINGlist_reaction_video_modesdescription changedUGC Reactions →
      List the video modes for the reaction video phase, with costs, resolutions, prompt rules, and audio behavior. MiniMax H3 also returns minimaxH3Modes: prompt_based, audio_guided, and video_guided. Every H3 mode uses the selected frame. Audio-guided adds free source audio. Video-guided adds billed source-video input and its audio. Read these fields before creating an H3 prompt or video.
      List the video modes for the reaction video phase, with costs, resolutions, prompt rules, and audio behavior. MiniMax H3 also returns minimaxH3Modes: prompt_based, audio_guided, and video_guided. Every H3 mode uses the selected frame. Audio-guided adds free source audio. Video-guided adds billed source-video input and includes its audio when present. Read these fields before creating an H3 prompt or video.

    v5.20.1

    2026-08-13

    Data tools whose results the user can see now carry one uniform presentation rule: in an MCP Apps host, show results with the mapped render tool instead of hand-building galleries or embedding thumbnails in chat. Nine tools gained the sentence (avatars, draft avatars, avatar images, collection images, reaction frames, reaction videos, video detail, generations, inspirations). Behavior and inputs are unchanged.

    • WORDINGget_reaction_videodescription changedUGC Reactions →
      Read one reaction video’s full render record after finding it with list_reaction_videos. Returns the canonical generated video URL, sourceReactionId, exact first-frame and video prompts, selected frame, models, duration, and post-edit URL. Call get_reaction_template separately for source media and Gemini analysis. Use this only for videos you need to recreate or inspect in detail; the list stays compact enough to inventory up to 100 videos.
      Read one reaction video’s full render record after finding it with list_reaction_videos. Returns the canonical generated video URL, sourceReactionId, exact first-frame and video prompts, selected frame, models, duration, and post-edit URL. Call get_reaction_template separately for source media and Gemini analysis. Use this only for videos you need to recreate or inspect in detail; the list stays compact enough to inventory up to 100 videos. To SHOW these results in an MCP Apps host, ALWAYS call render_video_result; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
    • WORDINGlist_avatar_imagesdescription changedStudio →
      List a saved avatar's generated photos (urls + captions), newest first, 30 per page. A worked avatar can hold hundreds, so this is paged: read total/pages and ask for the next page rather than expecting everything at once. The captions describe each shot, so use them to pick a specific pose or framing — that is how you cast a first frame for generate_reaction_frames via referenceImageUrl. Reusing them is free; use set_slide_background type 'avatar' to cast one.
      List a saved avatar's generated photos (urls + captions), newest first, 30 per page. A worked avatar can hold hundreds, so this is paged: read total/pages and ask for the next page rather than expecting everything at once. The captions describe each shot, so use them to pick a specific pose or framing — that is how you cast a first frame for generate_reaction_frames via referenceImageUrl. Reusing them is free; use set_slide_background type 'avatar' to cast one. To SHOW these results in an MCP Apps host, ALWAYS call render_image_results; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
    • WORDINGlist_avatarsdescription changedAvatars →
      List SAVED (library) avatars in the active workspace: id, name, thumbnail. Use this to find an avatarId for rename_avatar or content generation. Unapproved drafts are separate (list_draft_avatars).
      List SAVED (library) avatars in the active workspace: id, name, thumbnail. Use this to find an avatarId for rename_avatar or content generation. Unapproved drafts are separate (list_draft_avatars). To SHOW these results in an MCP Apps host, ALWAYS call render_image_results; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
    • WORDINGlist_collection_imagesdescription changedStudio →
      List a collection's actual images (urls + AI captions of what each shows), 30 per page. Use to hand-pick a specific image for set_slide_background.
      List a collection's actual images (urls + AI captions of what each shows), 30 per page. Use to hand-pick a specific image for set_slide_background. To SHOW these results in an MCP Apps host, ALWAYS call render_image_results; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
    • WORDINGlist_draft_avatarsdescription changedAvatars →
      List draft avatars awaiting approval in the active workspace, newest first (paginated).
      List draft avatars awaiting approval in the active workspace, newest first (paginated). To SHOW these results in an MCP Apps host, ALWAYS call render_image_results; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
    • WORDINGlist_generationsdescription changedGenerations →
      List recent ASYNC agent jobs in the active workspace for polling and operational status, newest first. This ledger is not the product media library and must never be used to decide which content exists. Avatar creation is synchronous and never appears. Optionally filter by kind or state. Use show_generations when the user wants the real visual product library.
      List recent ASYNC agent jobs in the active workspace for polling and operational status, newest first. This ledger is not the product media library and must never be used to decide which content exists. Avatar creation is synchronous and never appears. Optionally filter by kind or state. Use show_generations when the user wants the real visual product library. To SHOW these results in an MCP Apps host, ALWAYS call render_generation_gallery; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
    • WORDINGlist_inspiration_reactionsdescription changedUGC Reactions →
      SECOND source search for every new reaction request, after list_reaction_templates has no suitable opening pose. Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip). When the user wants a visual browser, call render_inspiration_browser with the workspace and optional category. The widget loads 12 real library items per page and can change pages without another model turn. A selection asks what the user wants to create and does not start paid work. Choose primarily on opensOn. A prompt-mode video may reuse the opening pose without copying the source motion. Use motion only to judge a requested clone, and never paste it into generate_reaction_video as the prompt. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first. Only fall back to a custom referenceImageUrl after both libraries lack a reasonable match.
      SECOND source search for every new reaction request, after list_reaction_templates has no suitable opening pose. Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip). render_inspiration_browser (workspace plus optional category) loads 12 real library items per page and changes pages without another model turn. A selection asks what the user wants to create and does not start paid work. Choose primarily on opensOn. A prompt-mode video may reuse the opening pose without copying the source motion. Use motion only to judge a requested clone, and never paste it into generate_reaction_video as the prompt. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first. Only fall back to a custom referenceImageUrl after both libraries lack a reasonable match. To SHOW these results in an MCP Apps host, ALWAYS call render_inspiration_browser; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
    • WORDINGlist_reaction_framesdescription changedUGC Reactions →
      List reusable reaction FRAMES on the workspace board, newest first, including ones a person made in the dashboard. Filter by both avatar and template before generating a new first frame. Each row carries its image, lineage and generation metadata, preferenceStatus, videoStage, and animationStatus. A complete frame is still reusable for another video. Show candidates and let the user reuse one for free or request a fresh variation; never silently assume an old take is approved.
      List reusable reaction FRAMES on the workspace board, newest first, including ones a person made in the dashboard. Filter by both avatar and template before generating a new first frame. Each row carries its image, lineage and generation metadata, preferenceStatus, videoStage, and animationStatus. A complete frame is still reusable for another video. Show candidates and let the user reuse one for free or request a fresh variation; never silently assume an old take is approved. To SHOW these results in an MCP Apps host, ALWAYS call render_image_results; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
    • WORDINGlist_reaction_videosdescription changedUGC Reactions →
      List the reaction VIDEOS in this workspace, newest first, agent-made or not. Each has a videoId, name, stage, a playable videoUrl once stage is "complete", a dashboardUrl, and sourceReactionId when it came from a template. videoUrl is the canonical clip: the post-edit version once one exists, otherwise the raw render. generation is a compact model/mode/duration summary. Rows carry avatarId but not the avatar name; resolve names with list_avatars when you need them. Call get_reaction_template with sourceReactionId for source media and Gemini analysis, or get_reaction_video for the exact prompt/settings of one rendered video. Managing and deleting videos stays in the dashboard.
      List the reaction VIDEOS in this workspace, newest first, agent-made or not. Each has a videoId, name, stage, a playable videoUrl once stage is "complete", a dashboardUrl, and sourceReactionId when it came from a template. videoUrl is the canonical clip: the post-edit version once one exists, otherwise the raw render. generation is a compact model/mode/duration summary. Rows carry avatarId but not the avatar name; resolve names with list_avatars when you need them. Call get_reaction_template with sourceReactionId for source media and Gemini analysis, or get_reaction_video for the exact prompt/settings of one rendered video. Managing and deleting videos stays in the dashboard. To SHOW these results in an MCP Apps host, ALWAYS call render_video_result; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.

    v5.20.0

    2026-08-10

    Ghostfeed MCP Apps now use the product avatar setup rules. Avatar preparation uses all product traits, required fields, field locks, the server randomizer, one draft per request, and product model names and prices. Inspiration items now include their source video URL, so full-screen inspiration has native video playback and video downloads. Full-screen media now reports the complete host height and ends at the MCP App boundary above the host composer.

      v5.19.0

      2026-08-09

      Ghostfeed MCP Apps now provide six focused views: avatar builder, source crop, image results, video result, generation gallery, and inspiration browser. The gallery and inspiration browser each read their real product collection and show 12 items per page. Their controls use read-only server tools directly; they do not require a new model turn. Full-screen media uses host controls, native video controls, and host-mediated downloads.

      • ADDEDedit_reaction_framenew toolUGC Reactions →
        Edit one existing reaction frame with a text prompt. Use frameId from list_reaction_frames. This creates a new frame and preserves the source frame plus its lineage. It charges the selected image-model and resolution cost once. The returned reaction_frame generation is normally succeeded; a concurrent idempotent replay can return the same queued generation and must be polled. On success, output.url is the edited image and output.id is the new frameId. Show the edit to the user and get approval before generate_reaction_video.
      • WORDINGcreate_avatardescription changedAvatars →
        Generate draft avatar(s) from appearance traits + an optional scene prompt. Returns drafts that are NOT saved to the library; the user must approve them. Any traits you omit are randomized. Costs credits per image; the result reports creditsSpent and creditsRemaining. Drafts are billed once at creation, never expire, and cost nothing to keep unapproved. Each draft carries dashboardUrl, the dashboard door to that draft.
        Generate draft avatar(s) from appearance traits + an optional scene prompt. Returns drafts that are NOT saved to the library; the user must approve them. Any traits you omit are randomized. Costs credits per image; the result reports creditsSpent and creditsRemaining. Drafts are billed once at creation, never expire, and cost nothing to keep unapproved. Each draft carries dashboardUrl, the dashboard door to that draft. After a successful result, call render_image_results with one ready avatar-draft item per imageUrl so the user can review the images in chat.
      • WORDINGgenerate_reaction_framesdescription changedUGC Reactions →
        PHASE 1 of a UGC reaction: render one or more avatars into the source pose, ONE frame per avatar. LIBRARY-FIRST RULE: unless the user explicitly supplied an exact source, call list_reaction_templates first, then list_inspiration_reactions if needed, and use a reasonable library opening-pose match. A custom motion request can still use a library first frame with prompt-mode animation. Use referenceImageUrl only after both Ghostfeed libraries lack a suitable opening pose, and tell the user why the custom fallback was necessary. Source is exactly one of templateId, inspirationId (auto-saved to a template first), or referenceImageUrl. imageOutputResolution is optional and defaults to standard; set it to 1080p only when the user requests a higher-resolution frame. Async: returns one reaction_frame generation per avatar to poll; the finished frame is output.url and output.id is the frameId. Charges the selected image-model and resolution cost per avatar as frames render (gemini_flash unless imageModel is set). STOP after this: show the frame(s) to the user and get approval BEFORE generate_reaction_video, because video credits are far higher.
        PHASE 1 of a UGC reaction: create ONE first frame per avatar. With a source, render the avatar into the source pose. Without a source, supply a non-empty stylingPrompt to create the frame directly from the avatar. Source is at most one of templateId, inspirationId (auto-saved to a template first), or referenceImageUrl. For a source-based request, search list_reaction_templates first, then list_inspiration_reactions if the user did not supply an exact source. imageOutputResolution defaults to standard. Source-based work is async and must be polled. Prompt-only work normally returns succeeded reaction_frame generations; a concurrent idempotent replay can return the same queued generation and must be polled. In both flows, the finished frame is output.url and output.id is the frameId. For async generations, immediately call render_image_results with one generating frame item per generation: set generationId to the returned generation id and keep the shared prompt, image model, and requested aspect ratio. The widget polls the read-only result itself. The selected image model and resolution charge applies per avatar. Show all frames and get approval before generate_reaction_video.
      • WORDINGgenerate_reaction_videodescription changedUGC Reactions →
        PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames and exact prompt. For MiniMax H3, set minimaxH3Mode explicitly: prompt_based sends the selected frame and text; audio_guided also sends source audio; video_guided also sends the source video and its audio. Guided H3 calls require sourceTemplateId and durationSeconds, and sourceTemplateId must match every frame lineage. First call generate_reaction_prompt with the matching profile and show its complete prompt. The prompt already includes visible Mandatory reference guidance; do not remove or rewrite that section. Small user-approved changes belong only inside Action guidance. Ghostfeed sends the approved prompt without adding hidden text. Then call here with promptApproved true and a protective maxCredits. Other clone modes take no prompt and follow source duration. Other prompt modes use text and may support enableAudio. H3 defaults to 768p and supports optional 2k. Async: returns one reaction_video generation per frame to poll.
        PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames and exact prompt. For MiniMax H3, set minimaxH3Mode explicitly: prompt_based sends the selected frame and text; audio_guided also sends source audio; video_guided also sends the source video and its audio. Guided H3 calls require sourceTemplateId and durationSeconds, and sourceTemplateId must match every frame lineage. First call generate_reaction_prompt with the matching profile and show its complete prompt. The prompt already includes visible Mandatory reference guidance; do not remove or rewrite that section. Small user-approved changes belong only inside Action guidance. Ghostfeed sends the approved prompt without adding hidden text. Then call here with promptApproved true and a protective maxCredits. Other clone modes take no prompt and follow source duration. Other prompt modes use text and may support enableAudio. H3 defaults to 768p and supports optional 2k. Async: returns one reaction_video generation per frame to poll. Immediately call render_video_result with status generating, the generationId, prompt, model, method, aspect ratio, and relevant frame/avatar reference images. The view polls and replaces the pending card with the playable video.
      • WORDINGlist_generationsdescription changedGenerations →
        List recent ASYNC generations in the active workspace, newest first (slideshow creations appear here). Avatar creation is synchronous and never appears. Optionally filter by kind or state.
        List recent ASYNC agent jobs in the active workspace for polling and operational status, newest first. This ledger is not the product media library and must never be used to decide which content exists. Avatar creation is synchronous and never appears. Optionally filter by kind or state. Use show_generations when the user wants the real visual product library.
      • WORDINGlist_inspiration_reactionsdescription changedUGC Reactions →
        SECOND source search for every new reaction request, after list_reaction_templates has no suitable opening pose. Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip). Choose primarily on opensOn. A prompt-mode video may reuse the opening pose without copying the source motion. Use motion only to judge a requested clone, and never paste it into generate_reaction_video as the prompt. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first. Only fall back to a custom referenceImageUrl after both libraries lack a reasonable match.
        SECOND source search for every new reaction request, after list_reaction_templates has no suitable opening pose. Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip). When the user wants a visual browser, call render_inspiration_browser with the workspace and optional category. The widget loads 12 real library items per page and can change pages without another model turn. A selection asks what the user wants to create and does not start paid work. Choose primarily on opensOn. A prompt-mode video may reuse the opening pose without copying the source motion. Use motion only to judge a requested clone, and never paste it into generate_reaction_video as the prompt. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first. Only fall back to a custom referenceImageUrl after both libraries lack a reasonable match.

      v5.17.1

      2026-08-08

      MiniMax H3 guided prompts now show every instruction sent to the provider. Audio-guided and video-guided prompt generation includes a visible `Mandatory reference guidance` section and a separate `Action guidance` section. Agents must show the complete prompt, tell the user not to change the mandatory section, and limit approved edits to the action section. Ghostfeed no longer adds hidden video-audio prompt text after approval.

      • WORDINGgenerate_reaction_promptdescription changedUGC Reactions →
        Generate the exact prompt the user will review before video creation. promptProfile prompt_based returns the normal visual-action prompt and remains a repair path when the template motionAnalysis is missing. For MiniMax H3, audio_guided and video_guided are on-demand profiles and require outputDurationSeconds: audio_guided analyzes visible performance plus source audio; video_guided adds strong motion-transfer instructions and exact hard-cut timing. Every profile still uses the selected first frame during video generation. Show the returned prompt, H3 plan, settings, warning, and estimated credits to the user before calling generate_reaction_video.
        Generate the exact prompt the user will review before video creation. promptProfile prompt_based returns the normal visual-action prompt and remains a repair path when the template motionAnalysis is missing. For MiniMax H3, audio_guided and video_guided are on-demand profiles and require outputDurationSeconds. Their returned prompt visibly includes a Mandatory reference guidance section followed by Action guidance. Show the complete returned prompt, H3 plan, settings, warning, and estimated credits to the user. Tell the user not to change Mandatory reference guidance and to make only small changes inside Action guidance. Every profile still uses the selected first frame during video generation.
      • WORDINGgenerate_reaction_videodescription changedUGC Reactions →
        PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames and exact prompt. For MiniMax H3, set minimaxH3Mode explicitly: prompt_based sends the selected frame and text; audio_guided also sends source audio; video_guided also sends the source video and its audio. Guided H3 calls require sourceTemplateId and durationSeconds, and sourceTemplateId must match every frame lineage. First call generate_reaction_prompt with the matching profile, show its exact prompt, settings, warning, and estimated cost, then call here with promptApproved true and a protective maxCredits. Other clone modes take no prompt and follow source duration. Other prompt modes use text and may support enableAudio. H3 defaults to 768p and supports optional 2k. Async: returns one reaction_video generation per frame to poll.
        PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames and exact prompt. For MiniMax H3, set minimaxH3Mode explicitly: prompt_based sends the selected frame and text; audio_guided also sends source audio; video_guided also sends the source video and its audio. Guided H3 calls require sourceTemplateId and durationSeconds, and sourceTemplateId must match every frame lineage. First call generate_reaction_prompt with the matching profile and show its complete prompt. The prompt already includes visible Mandatory reference guidance; do not remove or rewrite that section. Small user-approved changes belong only inside Action guidance. Ghostfeed sends the approved prompt without adding hidden text. Then call here with promptApproved true and a protective maxCredits. Other clone modes take no prompt and follow source duration. Other prompt modes use text and may support enableAudio. H3 defaults to 768p and supports optional 2k. Async: returns one reaction_video generation per frame to poll.

      v5.17.0

      2026-08-07

      MiniMax H3 now has three explicit agent modes: `prompt_based`, `audio_guided`, and `video_guided`. All three modes require an approved first frame. Guided modes also bind the request to its source template and require an explicit output duration. Agents can generate the matching prompt on demand, show the exact prompt and cost plan for approval, and then submit the video with the same mode. Audio guidance adds the source audio at no input charge. Video guidance adds the source video, its audio, and a billed reference-video line item. The REST and MCP surfaces use the same schemas, validation, billing, idempotency, durable queue, and provider lifecycle.

      • ADDEDgenerate_reaction_promptoptional param added: promptProfileUGC Reactions →
      • ADDEDgenerate_reaction_promptoptional param added: outputDurationSecondsUGC Reactions →
      • ADDEDgenerate_reaction_promptoptional param added: outputResolutionUGC Reactions →
      • ADDEDgenerate_reaction_videoenum values added to mode: minimax_h3UGC Reactions →
      • ADDEDgenerate_reaction_videoconstraint removed: prompt maxLength: 2000 -> noneUGC Reactions →
      • ADDEDgenerate_reaction_videoenum values added to outputResolution: 768p, 2kUGC Reactions →
      • ADDEDgenerate_reaction_videooptional param added: minimaxH3ModeUGC Reactions →
      • ADDEDgenerate_reaction_videooptional param added: sourceTemplateIdUGC Reactions →
      • WORDINGgenerate_reaction_promptdescription changedUGC Reactions →
        REPAIR PATH, not the first stop. Every clip is analysed automatically when it is imported, so call get_reaction_template FIRST and use its motionAnalysis.prompt; that read is free. Call this only when motionAnalysis is missing, its status is not "complete", or the source was re-cropped after it was written. It reuses an analysis of the same footage from anywhere in either library when one exists, and otherwise watches the full source video and caches the result on the template. Returns timed motion guidance plus a compact prompt for a prompt-mode reaction (Seedance, Grok, PixVerse, or Kling); pass that prompt to generate_reaction_video. Never needed for one_to_one clone modes.
        Generate the exact prompt the user will review before video creation. promptProfile prompt_based returns the normal visual-action prompt and remains a repair path when the template motionAnalysis is missing. For MiniMax H3, audio_guided and video_guided are on-demand profiles and require outputDurationSeconds: audio_guided analyzes visible performance plus source audio; video_guided adds strong motion-transfer instructions and exact hard-cut timing. Every profile still uses the selected first frame during video generation. Show the returned prompt, H3 plan, settings, warning, and estimated credits to the user before calling generate_reaction_video.
      • WORDINGgenerate_reaction_videodescription changedUGC Reactions →
        PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames. mode picks the family: a CLONE mode (one_to_one_*) copies the motion straight from the source clip and takes no prompt; a PROMPT mode (default seedance_2_0_fast) animates from text and needs a prompt. In PROMPT mode, show the user the exact prompt plus selected mode, duration, resolution, and audio setting; call only after explicit approval, with promptApproved true. The source template supplied only the first frame — movement comes from what the USER asked for. Never paste the template `motion` browsing summary in as the prompt. Duration is auto unless durationSeconds is set (ignored by clone modes, which follow the source clip). PixVerse and the Seedance 2.0 series generate synchronized audio by default; set enableAudio false for silent output. Unsupported modes default to silent and reject enableAudio true. There is no audio surcharge beyond the selected model/resolution rate. Before setting outputResolution to 1080p, call list_reaction_video_modes and confirm that the chosen mode lists 1080p in supportedResolutions; Seedance 2.0 Fast and Mini are 720p-only. Async: returns one reaction_video generation per frame to poll; the clip is output.url. Charges per second of video and reports creditsSpent/creditsRemaining.
        PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames and exact prompt. For MiniMax H3, set minimaxH3Mode explicitly: prompt_based sends the selected frame and text; audio_guided also sends source audio; video_guided also sends the source video and its audio. Guided H3 calls require sourceTemplateId and durationSeconds, and sourceTemplateId must match every frame lineage. First call generate_reaction_prompt with the matching profile, show its exact prompt, settings, warning, and estimated cost, then call here with promptApproved true and a protective maxCredits. Other clone modes take no prompt and follow source duration. Other prompt modes use text and may support enableAudio. H3 defaults to 768p and supports optional 2k. Async: returns one reaction_video generation per frame to poll.
      • WORDINGgenerate_reaction_videoparam description changed: promptUGC Reactions →
        Motion prompt for prompt modes. Call list_reaction_video_modes and obey the selected mode’s maxPromptCharacters; clone modes reject prompt.
      • WORDINGgenerate_reaction_videoparam description changed: enableAudioUGC Reactions →
        Controls synchronized generated audio. PixVerse and the Seedance 2.0 series default to true; set false for silent output. Unsupported modes default to silent and reject true. There is no audio surcharge beyond the selected model/resolution rate.
        Controls synchronized generated audio for modes that advertise supportsAudio true. Unsupported modes reject true; MiniMax H3 output audio is provider-native and is not configurable here.
      • WORDINGgenerate_reaction_videoparam description changed: outputResolutionUGC Reactions →
        Requested output resolution. Call list_reaction_video_modes first and use the selected mode’s supportedResolutions; Seedance 2.0 Fast and Mini support 720p only.
        Requested output resolution. Call list_reaction_video_modes first and use the selected mode’s supportedResolutions. Resolution availability and defaults are mode-specific; MiniMax H3 defaults to 768p and supports an optional 2k upgrade.
      • WORDINGlist_reaction_video_modesdescription changedUGC Reactions →
        List the video modes for the reaction video phase, with per-second credit cost, supported output resolutions, whether each needs a prompt or supports audio, and audioEnabledByDefault. Two families: CLONE modes reproduce a template motion (default one_to_one_standard, Kling motion-control, no prompt); PROMPT modes animate the frame from text (default seedance_2_0_fast). PixVerse and Seedance 2.0, Fast, and Mini generate audio by default with no surcharge; set enableAudio false for silent output and check supportedResolutions before choosing a resolution.
        List the video modes for the reaction video phase, with costs, resolutions, prompt rules, and audio behavior. MiniMax H3 also returns minimaxH3Modes: prompt_based, audio_guided, and video_guided. Every H3 mode uses the selected frame. Audio-guided adds free source audio. Video-guided adds billed source-video input and its audio. Read these fields before creating an H3 prompt or video.

      v5.14.0

      2026-07-28

      UGC reaction agents now search the workspace's existing first frames before spending credits on a new one. `list_reaction_frames` exposes lineage, model, resolution, preference, and accurate animation-state metadata so an agent can show reusable candidates and let the user choose between reuse and a fresh take. Already-animated frames remain reusable for new prompts and settings.

      • ADDEDcrop_reaction_templatenew toolUGC Reactions →
        Create one reusable reaction template from an exact timestamp range of an existing owned/imported template. Async and free: poll the returned reaction_crop generation. On success output.id is the new template id. Use when the user supplies or approves exact start/end times; this creates a derivative and archives the source only when the source was blocked in needs_crop.
      • ADDEDsmart_crop_reaction_templatenew toolUGC Reactions →
        Split an existing owned/imported reaction source into up to 8 reusable templates using FFmpeg scene-change detection. This is cut detection, not semantic highlight selection. Async and free: poll the returned reaction_smart_crop generation; outputs appear incrementally and each output.id is a new template id.
      • ADDEDlist_generationsenum values added to kind: reaction_crop, reaction_smart_cropGenerations →
      • WORDINGlist_reaction_framesdescription changedUGC Reactions →
        List the reaction FRAMES on the workspace board, newest first, including ones a person made in the dashboard rather than through an agent. Each has a frameId, image, the avatar it used, its source template, the videoStage of the shell it lives in, and isAnimated (false means nothing has been animated from it yet, so it is free to use). Use this to act on existing work: "animate the frame I made this morning" starts here, then pass the frameId to generate_reaction_video.
        List reusable reaction FRAMES on the workspace board, newest first, including ones a person made in the dashboard. Filter by both avatar and template before generating a new first frame. Each row carries its image, lineage and generation metadata, preferenceStatus, videoStage, and animationStatus. A complete frame is still reusable for another video. Show candidates and let the user reuse one for free or request a fresh variation; never silently assume an old take is approved.
      • WORDINGset_slide_textsdescription changedStudio →
        Replace one slide's text boxes (1-5 texts with placement top/center/bottom and role heading/subheading/body/cta - role sets the font size, positions are computed server-side exactly like the dashboard). Optionally mark isProductSlide. If this is the deck's first build edit it charges 1 credit and returns creditsSpent/creditsRemaining.
        Replace one slide's text boxes (1-5 texts with placement top/center/bottom and role heading/subheading/body/cta - role sets the font size, positions are computed server-side exactly like the dashboard). Infer copy density from the user's full brief and this slide's narrative job: headings are usually 3-8 words and body copy 8-20 words, but conversational brevity/detail guidance and explicit word or line limits win. The server rejects copy beyond heading 2, subheading 3, body 4, or CTA 2 rendered lines, or outside the safe area; it never truncates. Rewrite or redistribute and retry after a fit error. Optionally mark isProductSlide. If this is the deck's first build edit it charges 1 credit and returns creditsSpent/creditsRemaining.
      • WORDINGset_slide_textsparam description changed: textsStudio →
        Replaces ALL text boxes on the slide; positions are computed server-side.
        Replaces ALL text boxes on the slide; positions are computed server-side. Hard fit limits: heading 2 rendered lines, subheading 3, body 4, CTA 2.
      • WORDINGset_slide_textsparam description changed: texts[].textStudio →
        Final copy for this box. Follow the user's requested density; visual overflow is rejected, never silently truncated.

      v5.13.0

      2026-07-27

      Seedance 2.0, Seedance 2.0 Fast, and Seedance 2.0 Mini now support optional synchronized generated audio in both the dashboard and agent API. Agents can discover the capability through `list_reaction_video_modes` and request it with `enableAudio`. PixVerse and every audio-capable Seedance mode default audio on; set `enableAudio: false` for silent output. Audio remains flat-priced at each selected model and resolution rate.

      • WORDINGgenerate_reaction_videodescription changedUGC Reactions →
        PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames. mode picks the family: a CLONE mode (one_to_one_*) copies the motion straight from the source clip and takes no prompt; a PROMPT mode (default seedance_2_0_fast) animates from text and needs a prompt. In PROMPT mode, show the user the exact prompt plus selected mode, duration, resolution, and audio setting; call only after explicit approval, with promptApproved true. The source template supplied only the first frame — movement comes from what the USER asked for. Never paste the template `motion` browsing summary in as the prompt. Duration is auto unless durationSeconds is set (ignored by clone modes, which follow the source clip). Before setting outputResolution to 1080p, call list_reaction_video_modes and confirm that the chosen mode lists 1080p in supportedResolutions; Seedance 2.0 Fast and Mini are 720p-only. Async: returns one reaction_video generation per frame to poll; the clip is output.url. Charges per second of video and reports creditsSpent/creditsRemaining.
        PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames. mode picks the family: a CLONE mode (one_to_one_*) copies the motion straight from the source clip and takes no prompt; a PROMPT mode (default seedance_2_0_fast) animates from text and needs a prompt. In PROMPT mode, show the user the exact prompt plus selected mode, duration, resolution, and audio setting; call only after explicit approval, with promptApproved true. The source template supplied only the first frame — movement comes from what the USER asked for. Never paste the template `motion` browsing summary in as the prompt. Duration is auto unless durationSeconds is set (ignored by clone modes, which follow the source clip). PixVerse and the Seedance 2.0 series generate synchronized audio by default; set enableAudio false for silent output. Unsupported modes default to silent and reject enableAudio true. There is no audio surcharge beyond the selected model/resolution rate. Before setting outputResolution to 1080p, call list_reaction_video_modes and confirm that the chosen mode lists 1080p in supportedResolutions; Seedance 2.0 Fast and Mini are 720p-only. Async: returns one reaction_video generation per frame to poll; the clip is output.url. Charges per second of video and reports creditsSpent/creditsRemaining.
      • WORDINGgenerate_reaction_videoparam description changed: enableAudioUGC Reactions →
        Controls synchronized generated audio. PixVerse and the Seedance 2.0 series default to true; set false for silent output. Unsupported modes default to silent and reject true. There is no audio surcharge beyond the selected model/resolution rate.
      • WORDINGlist_reaction_video_modesdescription changedUGC Reactions →
        List the video modes for the reaction video phase, with per-second credit cost, supported output resolutions, and whether each needs a prompt or supports audio. Two families: CLONE modes reproduce a template motion (default one_to_one_standard, Kling motion-control, no prompt); PROMPT modes animate the frame from text (default seedance_2_0_fast). Use a clone mode only when the user wants to reproduce the reference video motion, and check supportedResolutions before requesting 1080p.
        List the video modes for the reaction video phase, with per-second credit cost, supported output resolutions, whether each needs a prompt or supports audio, and audioEnabledByDefault. Two families: CLONE modes reproduce a template motion (default one_to_one_standard, Kling motion-control, no prompt); PROMPT modes animate the frame from text (default seedance_2_0_fast). PixVerse and Seedance 2.0, Fast, and Mini generate audio by default with no surcharge; set enableAudio false for silent output and check supportedResolutions before choosing a resolution.

      v5.12.0

      2026-07-27

      MCP results now include native media resource links alongside the unchanged JSON envelope, so compatible clients can preview, play, or download generated images and videos directly in the conversation. Links are capped per result to keep media-heavy library searches usable.

      • ADDEDgenerate_reaction_videooptional param added: promptApprovedUGC Reactions →
      • WORDINGgenerate_reaction_videodescription changedUGC Reactions →
        PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames. mode picks the family: a CLONE mode (one_to_one_*) copies the motion straight from the source clip and takes no prompt; a PROMPT mode (default seedance_2_0_fast) animates from text and needs a prompt. In PROMPT mode the source template supplied only the first frame — the movement comes from what the USER asked for, so write `prompt` from their words. Never paste the template `motion` text in as the prompt: that field exists to help you CHOOSE a clip, and using it would animate the reference performance instead of the one the user described. Duration is auto unless durationSeconds is set (ignored by clone modes, which follow the source clip). Before setting outputResolution to 1080p, call list_reaction_video_modes and confirm that the chosen mode lists 1080p in supportedResolutions; Seedance 2.0 Fast and Mini are 720p-only. Async: returns one reaction_video generation per frame to poll; the clip is output.url. Charges per second of video and reports creditsSpent/creditsRemaining.
        PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames. mode picks the family: a CLONE mode (one_to_one_*) copies the motion straight from the source clip and takes no prompt; a PROMPT mode (default seedance_2_0_fast) animates from text and needs a prompt. In PROMPT mode, show the user the exact prompt plus selected mode, duration, resolution, and audio setting; call only after explicit approval, with promptApproved true. The source template supplied only the first frame — movement comes from what the USER asked for. Never paste the template `motion` browsing summary in as the prompt. Duration is auto unless durationSeconds is set (ignored by clone modes, which follow the source clip). Before setting outputResolution to 1080p, call list_reaction_video_modes and confirm that the chosen mode lists 1080p in supportedResolutions; Seedance 2.0 Fast and Mini are 720p-only. Async: returns one reaction_video generation per frame to poll; the clip is output.url. Charges per second of video and reports creditsSpent/creditsRemaining.

      v5.11.0

      2026-07-27

      `list_reaction_video_modes` now reports `supportedResolutions` for every mode, so agents can discover that Seedance 2.0 Fast and Mini are 720p-only before calling `generate_reaction_video`. The video generation schema and tool description now point agents to that per-mode capability field.

      • WORDINGgenerate_reaction_videodescription changedUGC Reactions →
        PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames. mode picks the family: a CLONE mode (one_to_one_*) copies the motion straight from the source clip and takes no prompt; a PROMPT mode (default seedance_2_0_fast) animates from text and needs a prompt. In PROMPT mode the source template supplied only the first frame — the movement comes from what the USER asked for, so write `prompt` from their words. Never paste the template `motion` text in as the prompt: that field exists to help you CHOOSE a clip, and using it would animate the reference performance instead of the one the user described. Duration is auto unless durationSeconds is set (ignored by clone modes, which follow the source clip). Async: returns one reaction_video generation per frame to poll; the clip is output.url. Charges per second of video and reports creditsSpent/creditsRemaining.
        PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames. mode picks the family: a CLONE mode (one_to_one_*) copies the motion straight from the source clip and takes no prompt; a PROMPT mode (default seedance_2_0_fast) animates from text and needs a prompt. In PROMPT mode the source template supplied only the first frame — the movement comes from what the USER asked for, so write `prompt` from their words. Never paste the template `motion` text in as the prompt: that field exists to help you CHOOSE a clip, and using it would animate the reference performance instead of the one the user described. Duration is auto unless durationSeconds is set (ignored by clone modes, which follow the source clip). Before setting outputResolution to 1080p, call list_reaction_video_modes and confirm that the chosen mode lists 1080p in supportedResolutions; Seedance 2.0 Fast and Mini are 720p-only. Async: returns one reaction_video generation per frame to poll; the clip is output.url. Charges per second of video and reports creditsSpent/creditsRemaining.
      • WORDINGgenerate_reaction_videoparam description changed: outputResolutionUGC Reactions →
        Requested output resolution. Call list_reaction_video_modes first and use the selected mode’s supportedResolutions; Seedance 2.0 Fast and Mini support 720p only.
      • WORDINGlist_reaction_video_modesdescription changedUGC Reactions →
        List the video modes for the reaction video phase, with per-second credit cost and whether each needs a prompt or supports audio. Two families: CLONE modes reproduce a template motion (default one_to_one_standard, Kling motion-control, no prompt); PROMPT modes animate the frame from text (default seedance_2_0_fast). Use a clone mode only when the user wants to reproduce the reference video motion.
        List the video modes for the reaction video phase, with per-second credit cost, supported output resolutions, and whether each needs a prompt or supports audio. Two families: CLONE modes reproduce a template motion (default one_to_one_standard, Kling motion-control, no prompt); PROMPT modes animate the frame from text (default seedance_2_0_fast). Use a clone mode only when the user wants to reproduce the reference video motion, and check supportedResolutions before requesting 1080p.

      v5.10.0

      2026-07-27

      `generate_reaction_frames` now accepts an optional `imageOutputResolution`. Agents can request standard output or 1080p frames, and the selected image model's resolution-specific cost is estimated and charged before video generation.

      • ADDEDgenerate_reaction_framesoptional param added: imageOutputResolutionUGC Reactions →
      • WORDINGgenerate_reaction_framesdescription changedUGC Reactions →
        PHASE 1 of a UGC reaction: render one or more avatars into the source pose, ONE frame per avatar. LIBRARY-FIRST RULE: unless the user explicitly supplied an exact source, call list_reaction_templates first, then list_inspiration_reactions if needed, and use a reasonable library opening-pose match. A custom motion request can still use a library first frame with prompt-mode animation. Use referenceImageUrl only after both Ghostfeed libraries lack a suitable opening pose, and tell the user why the custom fallback was necessary. Source is exactly one of templateId, inspirationId (auto-saved to a template first), or referenceImageUrl. Async: returns one reaction_frame generation per avatar to poll; the finished frame is output.url and output.id is the frameId. Charges the image-model cost per avatar as frames render (gemini_flash unless imageModel is set). STOP after this: show the frame(s) to the user and get approval BEFORE generate_reaction_video, because video credits are far higher.
        PHASE 1 of a UGC reaction: render one or more avatars into the source pose, ONE frame per avatar. LIBRARY-FIRST RULE: unless the user explicitly supplied an exact source, call list_reaction_templates first, then list_inspiration_reactions if needed, and use a reasonable library opening-pose match. A custom motion request can still use a library first frame with prompt-mode animation. Use referenceImageUrl only after both Ghostfeed libraries lack a suitable opening pose, and tell the user why the custom fallback was necessary. Source is exactly one of templateId, inspirationId (auto-saved to a template first), or referenceImageUrl. imageOutputResolution is optional and defaults to standard; set it to 1080p only when the user requests a higher-resolution frame. Async: returns one reaction_frame generation per avatar to poll; the finished frame is output.url and output.id is the frameId. Charges the selected image-model and resolution cost per avatar as frames render (gemini_flash unless imageModel is set). STOP after this: show the frame(s) to the user and get approval BEFORE generate_reaction_video, because video credits are far higher.

      v5.9.0

      2026-07-27

      `generate_reaction_video` now accepts an optional `outputResolution` so agents can request 720p or 1080p explicitly. The spend estimate, reservation, recovery, and settlement use the selected model's resolution-specific rate. The `maxCredits` description now explains that the ceiling is evaluated against the selected model and resolution rather than assuming one universal rate.

      • ADDEDgenerate_reaction_videooptional param added: outputResolutionUGC Reactions →
      • WORDINGgenerate_reaction_videoparam description changed: maxCreditsUGC Reactions →
        Refuse to start any clip that would cost more than this many credits. Clone modes take their length from the source clip, so a 30s template is 30 credits at 1 credit/second and 60 at 2. A ceiling of MAX_REACTION_VIDEO_CREDITS credits per clip always applies; this only tightens it.
        Refuse to start any clip that would cost more than this many credits. Clone modes use the source clip length and the selected model/resolution rate. A per-clip ceiling of MAX_REACTION_VIDEO_CREDITS always applies; this only tightens it.

      v5.8.0

      2026-07-23

      Reported by a free-plan user whose `create_blank_slideshow` answered `internal_error`, HTTP 500, `retryable: true`. The real cause was ordinary and fixable: "Free plan includes 1 slideshow project. Upgrade for unlimited projects." A 500 tells a well-behaved agent to retry a call that can never succeed, and the scrubbing threw away the one sentence that said how to fix it.

        v5.7.0

        2026-07-22

        Found by reviewing 5.6.0 against the enrichment job that already analyses every clip: the new reaction tools read the same `motionPromptAnalysis` the ingestion pipeline writes, but presented themselves as if that analysis did not exist.

        • WORDINGgenerate_reaction_promptdescription changedUGC Reactions →
          Analyze one completed source template into a reusable prompt for a prompt-mode reaction (Seedance, Grok, PixVerse, or Kling). This is the dashboard's “Generate prompt from original template” action: it watches the full source video, returns timed motion guidance plus a compact prompt, and caches the result on the template. Pass that prompt to generate_reaction_video with a prompt mode; do not use it for one_to_one clone modes.
          REPAIR PATH, not the first stop. Every clip is analysed automatically when it is imported, so call get_reaction_template FIRST and use its motionAnalysis.prompt; that read is free. Call this only when motionAnalysis is missing, its status is not "complete", or the source was re-cropped after it was written. It reuses an analysis of the same footage from anywhere in either library when one exists, and otherwise watches the full source video and caches the result on the template. Returns timed motion guidance plus a compact prompt for a prompt-mode reaction (Seedance, Grok, PixVerse, or Kling); pass that prompt to generate_reaction_video. Never needed for one_to_one clone modes.
        • WORDINGget_reaction_templatedescription changedUGC Reactions →
          Read one source template by its templateId (or a generated video’s sourceReactionId). Returns the original/source clip, external import URL when present, duration, import type, and the current Gemini motion analysis. Use it after list_reaction_videos to resolve each unique source once, rather than repeating source metadata on every generated video.
          Read one source template by its templateId (or a generated video’s sourceReactionId). Returns the original/source clip, external import URL when present, duration, import type, the full opensOn still description, and the full stored motion analysis. Every clip is analysed automatically on import, so this free read is normally where the complete motionAnalysis.prompt already is. list_reaction_templates only carries a one-line teaser of it. Use it after list_reaction_videos to resolve each unique source once, rather than repeating source metadata on every generated video.
        • WORDINGlist_reaction_videosdescription changedUGC Reactions →
          List the reaction VIDEOS in this workspace, newest first, agent-made or not. Each has a videoId, name, stage, a playable videoUrl once stage is "complete", and sourceReactionId when it came from a template. generation is a compact model/mode/duration summary. Call get_reaction_template with sourceReactionId for source media and Gemini analysis, or get_reaction_video for the exact prompt/settings of one rendered video. Managing and deleting videos stays in the dashboard.
          List the reaction VIDEOS in this workspace, newest first, agent-made or not. Each has a videoId, name, stage, a playable videoUrl once stage is "complete", a dashboardUrl, and sourceReactionId when it came from a template. videoUrl is the canonical clip: the post-edit version once one exists, otherwise the raw render. generation is a compact model/mode/duration summary. Rows carry avatarId but not the avatar name; resolve names with list_avatars when you need them. Call get_reaction_template with sourceReactionId for source media and Gemini analysis, or get_reaction_video for the exact prompt/settings of one rendered video. Managing and deleting videos stays in the dashboard.

        v5.6.0

        2026-07-22

        `list_reaction_videos` now returns up to 100 compact generated-video records: the canonical generated `videoUrl`, `sourceReactionId`, and a small model/mode/duration summary. `get_reaction_template` resolves each unique source record (media, original import URL, duration, and cached Gemini analysis), while `get_reaction_video` returns the exact prompt, model, duration, and first-frame settings used for one render. `generate_reaction_prompt` is the dashboard's source-video analysis action over MCP/REST: it returns and caches a prompt for prompt-mode generation; one-to-one motion-control clones continue to need none.

        • ADDEDgenerate_reaction_promptnew toolUGC Reactions →
          Analyze one completed source template into a reusable prompt for a prompt-mode reaction (Seedance, Grok, PixVerse, or Kling). This is the dashboard's “Generate prompt from original template” action: it watches the full source video, returns timed motion guidance plus a compact prompt, and caches the result on the template. Pass that prompt to generate_reaction_video with a prompt mode; do not use it for one_to_one clone modes.
        • ADDEDget_reaction_templatenew toolUGC Reactions →
          Read one source template by its templateId (or a generated video’s sourceReactionId). Returns the original/source clip, external import URL when present, duration, import type, and the current Gemini motion analysis. Use it after list_reaction_videos to resolve each unique source once, rather than repeating source metadata on every generated video.
        • ADDEDget_reaction_videonew toolUGC Reactions →
          Read one reaction video’s full render record after finding it with list_reaction_videos. Returns the canonical generated video URL, sourceReactionId, exact first-frame and video prompts, selected frame, models, duration, and post-edit URL. Call get_reaction_template separately for source media and Gemini analysis. Use this only for videos you need to recreate or inspect in detail; the list stays compact enough to inventory up to 100 videos.
        • WORDINGlist_reaction_videosdescription changedUGC Reactions →
          List the reaction VIDEOS in this workspace, newest first, agent-made or not. Each has a videoId, name, stage, the avatar, and a playable videoUrl once stage is "complete". Use it to report what is finished or still rendering. Managing and deleting videos stays in the dashboard.
          List the reaction VIDEOS in this workspace, newest first, agent-made or not. Each has a videoId, name, stage, a playable videoUrl once stage is "complete", and sourceReactionId when it came from a template. generation is a compact model/mode/duration summary. Call get_reaction_template with sourceReactionId for source media and Gemini analysis, or get_reaction_video for the exact prompt/settings of one rendered video. Managing and deleting videos stays in the dashboard.

        v5.3.0

        2026-07-21

        Found by a founder building a Pinterest deck over MCP and reopening it: every slide's search box was blank.

        • ADDEDset_slide_backgroundoptional param added: background.queryStudio →
        • ADDEDset_slide_backgroundoptional param added: background.candidateUrlsStudio →
        • ADDEDset_slide_backgroundoptional param added: background.candidateUrls[]Studio →
        • WORDINGsearch_pinterestdescription changedStudio →
          Search Pinterest directly (up to 8 queries, default 12 images each) and get raw image urls back. Search for SCENES, not topics. LOOK at the images yourself before picking - that is the whole point of this tool - then set_slide_background with the winner. Costs no credits.
          Search Pinterest directly (up to 8 queries, default 12 images each) and get raw image urls back. Search for SCENES, not topics. LOOK at the images yourself before picking - that is the whole point of this tool - then set_slide_background with the winner AND the query that found it, so the editor reopens on that search and shuffle can re-run it. Costs no credits.
        • WORDINGset_slide_backgrounddescription changedStudio →
          Set one slide's background: a Pinterest url, a collection image, an avatar photo, any image url, or a solid color. For a LOCAL image file, call request_slide_image_upload first, PUT the bytes, then pass the returned fileUrl here as type 'url'. External urls are re-hosted to durable storage automatically. Image picks are gated server-side (browser-displayable, 720px+ short side). The dashboard updates live. If this is the deck's first build edit it charges 1 credit and returns creditsSpent/creditsRemaining.
          Set one slide's background: a Pinterest url, a collection image, an avatar photo, any image url, or a solid color. On a Pinterest pick, pass background.query (the search_pinterest query that found it) so the editor's Pinterest tab reopens on that search. For a LOCAL image file, call request_slide_image_upload first, PUT the bytes, then pass the returned fileUrl here as type 'url'. External urls are re-hosted to durable storage automatically. Image picks are gated server-side (browser-displayable, 720px+ short side). The dashboard updates live. If this is the deck's first build edit it charges 1 credit and returns creditsSpent/creditsRemaining.

        v5.2.2

        2026-07-21

        Found by spending real credits against the rewritten charging path, which unit tests had covered and never exercised.

        • WORDINGgenerate_reaction_framesdescription changedUGC Reactions →
          PHASE 1 of a UGC reaction: render one or more avatars into the source pose, ONE frame per avatar. Source is exactly one of templateId, inspirationId (auto-saved to a template first), or referenceImageUrl. Async: returns one reaction_frame generation per avatar to poll; the finished frame is output.url and output.id is the frameId. Charges the image-model cost per avatar as frames render (gemini_flash unless imageModel is set). STOP after this: show the frame(s) to the user and get approval BEFORE generate_reaction_video, because video credits are far higher.
          PHASE 1 of a UGC reaction: render one or more avatars into the source pose, ONE frame per avatar. LIBRARY-FIRST RULE: unless the user explicitly supplied an exact source, call list_reaction_templates first, then list_inspiration_reactions if needed, and use a reasonable library opening-pose match. A custom motion request can still use a library first frame with prompt-mode animation. Use referenceImageUrl only after both Ghostfeed libraries lack a suitable opening pose, and tell the user why the custom fallback was necessary. Source is exactly one of templateId, inspirationId (auto-saved to a template first), or referenceImageUrl. Async: returns one reaction_frame generation per avatar to poll; the finished frame is output.url and output.id is the frameId. Charges the image-model cost per avatar as frames render (gemini_flash unless imageModel is set). STOP after this: show the frame(s) to the user and get approval BEFORE generate_reaction_video, because video credits are far higher.
        • WORDINGlist_inspiration_reactionsdescription changedUGC Reactions →
          Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). This is the catalogue to start from when the workspace has no templates of its own. Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip). These are SELECTION aids: read them to pick a clip and to describe it to the user, never as the prompt for generate_reaction_video. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first.
          SECOND source search for every new reaction request, after list_reaction_templates has no suitable opening pose. Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip). Choose primarily on opensOn. A prompt-mode video may reuse the opening pose without copying the source motion. Use motion only to judge a requested clone, and never paste it into generate_reaction_video as the prompt. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first. Only fall back to a custom referenceImageUrl after both libraries lack a reasonable match.
        • WORDINGlist_reaction_templatesdescription changedUGC Reactions →
          List reaction TEMPLATES (the source motion clips) usable in this workspace: platform stock plus your own imported/uploaded ones. Each has an id, name, category, duration, thumbnail, and status. Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip); older clips may not have them yet. These are SELECTION aids: read them to pick a clip and to describe it to the user, never as the prompt for generate_reaction_video. Find a templateId here for generate_reaction_frames.
          FIRST source search for every new reaction request unless the user explicitly supplied an exact source. List reaction TEMPLATES usable in this workspace: platform stock plus your own imported/uploaded motion clips. Each has an id, name, category, duration, thumbnail, and status. Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip); older clips may not have them yet. Choose primarily on opensOn. A prompt-mode video may reuse the opening pose without copying the source motion. Use motion only to judge a requested clone, and never paste it into generate_reaction_video as the prompt. If no template has a reasonable opening-pose match, search list_inspiration_reactions next.

        v5.2.1

        2026-07-21

        Wording that 5.0.0 left behind. Both clip catalogues still told agents to "filter a large library with shotSize and energy" and listed those fields as things a captioned clip carries, for parameters that release removed. The example payloads still showed them too.

        • WORDINGlist_inspiration_reactionsdescription changedUGC Reactions →
          Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). This is the catalogue to start from when the workspace has no templates of its own. Captioned clips also carry opensOn (the opening still your avatar gets rendered into), motion (what happens in the clip), shotSize, and energy. These are SELECTION aids: use them to pick a clip and to describe it to the user, never as the prompt for generate_reaction_video. Narrow with shotSize/energy before paging. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first.
          Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). This is the catalogue to start from when the workspace has no templates of its own. Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip). These are SELECTION aids: read them to pick a clip and to describe it to the user, never as the prompt for generate_reaction_video. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first.
        • WORDINGlist_reaction_templatesdescription changedUGC Reactions →
          List reaction TEMPLATES (the source motion clips) usable in this workspace: platform stock plus your own imported/uploaded ones. Each has an id, name, category, duration, thumbnail, and status. Captioned clips also carry opensOn (the opening still your avatar gets rendered into), motion (what happens in the clip), shotSize, and energy; older clips may not have them yet. These are SELECTION aids: use them to pick a clip and to describe it to the user, never as the prompt for generate_reaction_video. Filter a large library with shotSize and energy before paging. Find a templateId here for generate_reaction_frames.
          List reaction TEMPLATES (the source motion clips) usable in this workspace: platform stock plus your own imported/uploaded ones. Each has an id, name, category, duration, thumbnail, and status. Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip); older clips may not have them yet. These are SELECTION aids: read them to pick a clip and to describe it to the user, never as the prompt for generate_reaction_video. Find a templateId here for generate_reaction_frames.

        v5.2.0

        2026-07-21

        A prioritised defect list, worked top down.

          v5.1.0

          2026-07-21

          `regenerate_reaction_frame` now accepts a `frameId` as well as a `generationId`, and needs exactly one of them.

          • ADDEDregenerate_reaction_frameparam made optional: generationIdUGC Reactions →
          • ADDEDregenerate_reaction_frameoptional param added: frameIdUGC Reactions →
          • WORDINGregenerate_reaction_framedescription changedUGC Reactions →
            Redo the frame of a reaction_frame generation the user was not happy with, by its generationId. Re-runs frame generation on the same avatar + source and charges another frame credit. Poll the same generation until it succeeds with a fresh frame, then get approval before generate_reaction_video.
            Redo a frame the user was not happy with. Identify it with EITHER frameId (any frame from list_reaction_frames, including ones a person made in the dashboard) OR generationId (a frame this API started); pass exactly one. Re-runs frame generation on the same avatar + source and charges another frame credit. Poll the same generation until it succeeds with a fresh frame, then get approval before generate_reaction_video.
          • WORDINGregenerate_reaction_frameparam description changed: generationIdUGC Reactions →
            The generationId of a frame you started through the agent API.

          v5.0.0

          2026-07-21

          BREAKING: `shotSize`, `energy` and `holdsProduct` are gone from `list_reaction_templates` and `list_inspiration_reactions`, as fields and as filters. A clip now describes itself with two pieces of prose and nothing else: `opensOn`, the opening still your avatar is rendered into, and `motion`, what happens across the clip.

          v4.10.0

          2026-07-21

          Fixes for defects a paid field test found, where ten agents used the surface with real credits. Every one of these sat at a seam between two tools rather than inside either of them.

          v4.9.1

          2026-07-21

          Three text-heavy lists advertise a smaller maximum page. `list_reaction_templates` caps at 25, `list_products` and `list_generations` at 40, instead of the surface-wide 100. A template row now carries an opening-frame description and a motion summary, a product row carries a 400-character description plus its linked collections, and a generation row echoes its whole input and outputs — so a page of 100 measured 112KB, 80KB and 80KB, against a 60KB ceiling. That is the same context blowup the pagination work was done to prevent, rebuilt by the fields added since.

          • WORDINGlist_generationsparam description changed: limitGenerations →
            Per page (max 40; lower than other tools because these rows carry their full input and outputs).
          • WORDINGlist_productsparam description changed: limitLibrary →
            Per page (max 100). Each tool documents its own default.
            Per page (max 40; lower than other tools because these rows carry long descriptions). Each tool documents its own default.
          • WORDINGlist_reaction_templatesparam description changed: limitUGC Reactions →
            Per page (max 100). Each tool documents its own default.
            Per page (max 25; lower than other tools because these rows carry long descriptions). Each tool documents its own default.

          v4.9.0

          2026-07-21

          `list_reaction_templates` stops offering templates you cannot generate from. Anything still importing, failed, or over 30s awaiting a crop is now hidden by default, because `generate_reaction_frames` refuses those anyway: picking one cost the agent a call and returned an error telling it to go and crop in the dashboard. Pass `includeUnusable` to see them, and the response says how many were hidden.

          v4.8.0

          2026-07-21

          Reaction videos now report what they actually cost, and cannot quietly cost a fortune. `creditsSpent` was measured as the balance before minus the balance after. On a team plan that balance is a single shared pool, so a teammate spending during your call inflated your number, a refund deflated it, and the clamp at zero could report a paid video as free. It is now summed from the price each clip was charged, which was already known before the debit.

          v4.7.0

          2026-07-20

          Paged reads now say where you are, and `list_collection_images` stops under-reporting. It returned `total` as the length of the page it had just handed back, so asking for 5 images from a 200-image collection was answered "total: 5" and an agent reasonably concluded it had seen everything and built the whole deck from those five. The real count was already being computed one call down and discarded. It now reports the collection size and carries `page` and `pages` like every other paged read. `list_slideshows` gained the `page` it was missing alongside its `total` and `pages`.

            v4.6.4

            2026-07-20

            Two import defects found by running the flow as a new user would.

              v4.6.3

              2026-07-20

              Second field-test pass. `list_reaction_video_modes` now flags exactly one mode as `isDefault` — the one you get when `mode` is omitted — with `isFamilyDefault` marking the clone and prompt defaults separately. Flagging both meant an agent that wanted a clone, omitted `mode`, and passed a prompt got prompt-mode Seedance at 1.5 credits per second instead of clone at 1, in the wrong family, with nothing in the response naming which family ran.

              • WORDINGget_generationparam description changed: workspaceGenerations →
                Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
                Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              • WORDINGget_slideshowparam description changed: workspaceSlideshows →
                Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
                Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              • WORDINGlist_avatar_imagesparam description changed: workspaceStudio →
                Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
                Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              • WORDINGlist_avatarsparam description changed: workspaceAvatars →
                Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
                Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              • WORDINGlist_collection_imagesparam description changed: workspaceStudio →
                Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
                Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              • WORDINGlist_collectionsparam description changed: workspaceLibrary →
                Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
                Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              • WORDINGlist_draft_avatarsparam description changed: workspaceAvatars →
                Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
                Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              • WORDINGlist_generationsparam description changed: workspaceGenerations →
                Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
                Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              • WORDINGlist_inspiration_reactionsparam description changed: workspaceUGC Reactions →
                Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
                Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              • WORDINGlist_productsparam description changed: workspaceLibrary →
                Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
                Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              • WORDINGlist_reaction_framesparam description changed: workspaceUGC Reactions →
                Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
                Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              • WORDINGlist_reaction_templatesparam description changed: workspaceUGC Reactions →
                Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
                Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              • WORDINGlist_reaction_videosparam description changed: workspaceUGC Reactions →
                Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
                Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              • WORDINGlist_slideshowsparam description changed: workspaceSlideshows →
                Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
                Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              • WORDINGread_social_postparam description changed: workspaceStudio →
                Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
                Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              • WORDINGsearch_pinterestparam description changed: workspaceStudio →
                Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
                Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.

              v4.6.2

              2026-07-20

              Fixes from a field test where ten agents used the surface as a new user would.

              • WORDINGget_slideshowparam description changed: limitSlideshows →
                Per page (default 50, max 100).
                Per page (max 100). Each tool documents its own default.
              • WORDINGlist_avatar_imagesparam description changed: limitStudio →
                Per page (default 50, max 100).
                Per page (max 100). Each tool documents its own default.
              • WORDINGlist_avatarsparam description changed: limitAvatars →
                Per page (default 50, max 100).
                Per page (max 100). Each tool documents its own default.
              • WORDINGlist_collection_imagesparam description changed: limitStudio →
                Per page (default 50, max 100).
                Per page (max 100). Each tool documents its own default.
              • WORDINGlist_collectionsparam description changed: limitLibrary →
                Per page (default 50, max 100).
                Per page (max 100). Each tool documents its own default.
              • WORDINGlist_draft_avatarsparam description changed: limitAvatars →
                Per page (default 50, max 100).
                Per page (max 100). Each tool documents its own default.
              • WORDINGlist_inspiration_reactionsparam description changed: limitUGC Reactions →
                Per page (default 50, max 100).
                Per page (max 100). Each tool documents its own default.
              • WORDINGlist_productsparam description changed: limitLibrary →
                Per page (default 50, max 100).
                Per page (max 100). Each tool documents its own default.
              • WORDINGlist_reaction_framesparam description changed: limitUGC Reactions →
                Per page (default 50, max 100).
                Per page (max 100). Each tool documents its own default.
              • WORDINGlist_reaction_templatesparam description changed: limitUGC Reactions →
                Per page (default 50, max 100).
                Per page (max 100). Each tool documents its own default.
              • WORDINGlist_reaction_videosparam description changed: limitUGC Reactions →
                Per page (default 50, max 100).
                Per page (max 100). Each tool documents its own default.
              • WORDINGlist_slideshowsparam description changed: limitSlideshows →
                Per page (default 50, max 100).
                Per page (max 100). Each tool documents its own default.

              v4.6.1

              2026-07-20

              Wording, to state an intent the code already enforced. `opensOn` and `motion` exist so an agent can CHOOSE a clip, and the tool descriptions now say that outright, including that `motion` must never be pasted into `prompt`.

              • WORDINGgenerate_reaction_videodescription changedUGC Reactions →
                PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames. mode picks the family: a CLONE mode (one_to_one_*) reproduces the template motion and needs a template-backed frame (no prompt); a PROMPT mode (default seedance_2_0_fast) animates from text and needs a prompt. Duration is auto unless durationSeconds is set (ignored by clone modes, which follow the source clip). Async: returns one reaction_video generation per frame to poll; the clip is output.url. Charges per second of video and reports creditsSpent/creditsRemaining.
                PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames. mode picks the family: a CLONE mode (one_to_one_*) copies the motion straight from the source clip and takes no prompt; a PROMPT mode (default seedance_2_0_fast) animates from text and needs a prompt. In PROMPT mode the source template supplied only the first frame — the movement comes from what the USER asked for, so write `prompt` from their words. Never paste the template `motion` text in as the prompt: that field exists to help you CHOOSE a clip, and using it would animate the reference performance instead of the one the user described. Duration is auto unless durationSeconds is set (ignored by clone modes, which follow the source clip). Async: returns one reaction_video generation per frame to poll; the clip is output.url. Charges per second of video and reports creditsSpent/creditsRemaining.
              • WORDINGlist_inspiration_reactionsdescription changedUGC Reactions →
                Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). This is the catalogue to start from when the workspace has no templates of its own. Captioned clips also carry opensOn (the opening still your avatar gets rendered into), motion (what happens in the clip), shotSize, and energy, so pick on those rather than the name, and narrow with shotSize/energy before paging. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first.
                Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). This is the catalogue to start from when the workspace has no templates of its own. Captioned clips also carry opensOn (the opening still your avatar gets rendered into), motion (what happens in the clip), shotSize, and energy. These are SELECTION aids: use them to pick a clip and to describe it to the user, never as the prompt for generate_reaction_video. Narrow with shotSize/energy before paging. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first.
              • WORDINGlist_reaction_templatesdescription changedUGC Reactions →
                List reaction TEMPLATES (the source motion clips) usable in this workspace: platform stock plus your own imported/uploaded ones. Each has an id, name, category, duration, thumbnail, and status. Captioned clips also carry opensOn (the opening still your avatar gets rendered into), motion (what happens in the clip), shotSize, and energy, so pick on those rather than guessing from the name; older clips may not have them yet. Filter a large library with shotSize and energy before paging. Find a templateId here for generate_reaction_frames.
                List reaction TEMPLATES (the source motion clips) usable in this workspace: platform stock plus your own imported/uploaded ones. Each has an id, name, category, duration, thumbnail, and status. Captioned clips also carry opensOn (the opening still your avatar gets rendered into), motion (what happens in the clip), shotSize, and energy; older clips may not have them yet. These are SELECTION aids: use them to pick a clip and to describe it to the user, never as the prompt for generate_reaction_video. Filter a large library with shotSize and energy before paging. Find a templateId here for generate_reaction_frames.

              v4.6.0

              2026-07-20

              The curated inspiration library is now described too, which matters more for a new account than the template library does. A fresh workspace owns no templates, so `list_inspiration_reactions` IS the catalogue you start from, and it was returning names and thumbnails only. 4.5.0 gave templates `opensOn` and `motion` while leaving the surface a first-time user actually reaches untouched.

              • ADDEDlist_inspiration_reactionsoptional param added: shotSizeUGC Reactions →
              • ADDEDlist_inspiration_reactionsoptional param added: energyUGC Reactions →
              • WORDINGlist_inspiration_reactionsdescription changedUGC Reactions →
                Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first.
                Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). This is the catalogue to start from when the workspace has no templates of its own. Captioned clips also carry opensOn (the opening still your avatar gets rendered into), motion (what happens in the clip), shotSize, and energy, so pick on those rather than the name, and narrow with shotSize/energy before paging. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first.

              v4.5.1

              2026-07-20

              Wording only. `list_collections` was already returning `summary`, one line saying what a collection's images actually show, distilled from their AI captions. Nothing declared it or mentioned it, so agents kept choosing collections from a name and a count, which is the exact guessing the summaries exist to remove. A folder called "August" tells you nothing; "62 lifestyle shots of a woman in athleisure in bright home interiors" tells you whether to open it. The field is now named in the response type and the description tells the agent to read it before opening a collection.

              • WORDINGlist_collectionsdescription changedLibrary →
                List the workspace's image collections (the user's own saved images): id, name, image count, and dashboardUrl. To feature a collection's images in a deck, browse it with list_collection_images and cast the ones you want with set_slide_background (type collection). Call this BEFORE building a deck that should feature the user's own images.
                List the workspace's image collections (the user's own saved images): id, name, image count, dashboardUrl, and summary, one line saying what the images actually show. Read the summary to pick which collection is worth opening rather than guessing from its name, then browse that one with list_collection_images and cast the images you want with set_slide_background (type collection). Call this BEFORE building a deck that should feature the user's own images.

              v4.5.0

              2026-07-20

              The agent can see what a reaction clip actually looks like. `list_reaction_templates` used to return a name, a category and a duration, and its own description admitted the agent could not watch the motion, so choosing a template meant guessing from a title. Half the library's titles were the creator's scraped caption, which for one real template read in full as "this dress is so prettyyy".

              • ADDEDlist_reaction_templatesoptional param added: shotSizeUGC Reactions →
              • ADDEDlist_reaction_templatesoptional param added: energyUGC Reactions →
              • WORDINGlist_reaction_templatesdescription changedUGC Reactions →
                List reaction TEMPLATES (the source motion clips) usable in this workspace: platform stock plus your own imported/uploaded ones. Each has an id, name, category, duration, thumbnail, and status. You cannot watch the motion, so describe it from name/category if the user must choose. Find a templateId here for generate_reaction_frames.
                List reaction TEMPLATES (the source motion clips) usable in this workspace: platform stock plus your own imported/uploaded ones. Each has an id, name, category, duration, thumbnail, and status. Captioned clips also carry opensOn (the opening still your avatar gets rendered into), motion (what happens in the clip), shotSize, and energy, so pick on those rather than guessing from the name; older clips may not have them yet. Filter a large library with shotSize and energy before paging. Find a templateId here for generate_reaction_frames.

              v4.4.0

              2026-07-20

              Every list tool can now be asked for a page. A worked avatar accumulates one image per reaction frame ever rendered, and `list_avatar_images` returned all of them at once: 254 images came back as a 96KB response that buried an agent's context outright, mid-task. It now returns 30 per page with `total` and `pages`, and it captions only the page it hands back rather than the whole pool.

              • ADDEDget_slideshowoptional param added: variantSlideshows →
              • ADDEDget_slideshowoptional param added: pageSlideshows →
              • ADDEDget_slideshowoptional param added: limitSlideshows →
              • ADDEDlist_avatar_imagesoptional param added: pageStudio →
              • ADDEDlist_avatar_imagesoptional param added: limitStudio →
              • ADDEDlist_collection_imagesoptional param added: limitStudio →
              • ADDEDlist_collectionsoptional param added: pageLibrary →
              • ADDEDlist_collectionsoptional param added: limitLibrary →
              • ADDEDlist_generationsoptional param added: pageGenerations →
              • ADDEDlist_productsoptional param added: pageLibrary →
              • ADDEDlist_productsoptional param added: limitLibrary →
              • WORDINGlist_avatar_imagesdescription changedStudio →
                List a saved avatar's generated photos (urls + captions). Reusing them is free; use set_slide_background type 'avatar' to cast one.
                List a saved avatar's generated photos (urls + captions), newest first, 30 per page. A worked avatar can hold hundreds, so this is paged: read total/pages and ask for the next page rather than expecting everything at once. The captions describe each shot, so use them to pick a specific pose or framing — that is how you cast a first frame for generate_reaction_frames via referenceImageUrl. Reusing them is free; use set_slide_background type 'avatar' to cast one.
              • WORDINGlist_collection_imagesparam description changed: pageStudio →
                Page number (default 1, 30 per page).
                Page number (default 1).

              v4.3.1

              2026-07-20

              Wording only. `list_reaction_frames` advertised a `hasVideo` field it no longer returns. Every frame is created inside a video shell, so that flag was true for every frame and told an agent nothing. The description now names what the tool actually returns: `videoStage`, and `isAnimated`, which is false when nothing has been animated from that frame yet and it is free to use.

              • WORDINGlist_reaction_framesdescription changedUGC Reactions →
                List the reaction FRAMES on the workspace board, newest first, including ones a person made in the dashboard rather than through an agent. Each has a frameId, image, the avatar it used, its source template, and hasVideo. Use this to act on existing work: "animate the frame I made this morning" starts here, then pass the frameId to generate_reaction_video.
                List the reaction FRAMES on the workspace board, newest first, including ones a person made in the dashboard rather than through an agent. Each has a frameId, image, the avatar it used, its source template, the videoStage of the shell it lives in, and isAnimated (false means nothing has been animated from it yet, so it is free to use). Use this to act on existing work: "animate the frame I made this morning" starts here, then pass the frameId to generate_reaction_video.

              v4.3.0

              2026-07-20

              Agents can now see reaction work they did not start. `list_reaction_frames` and `list_reaction_videos` read the workspace board itself rather than the agent's own ledger, so frames and clips a person made in the dashboard are visible too. That closes the gap behind a very ordinary request: animate the frame I made this morning. Frames come back with the avatar and source template that produced them and whether a video was already started; videos come back with their stage and a playable url once finished. Managing and deleting still live in the dashboard.

              • ADDEDlist_reaction_framesnew toolUGC Reactions →
                List the reaction FRAMES on the workspace board, newest first, including ones a person made in the dashboard rather than through an agent. Each has a frameId, image, the avatar it used, its source template, and hasVideo. Use this to act on existing work: "animate the frame I made this morning" starts here, then pass the frameId to generate_reaction_video.
              • ADDEDlist_reaction_videosnew toolUGC Reactions →
                List the reaction VIDEOS in this workspace, newest first, agent-made or not. Each has a videoId, name, stage, the avatar, and a playable videoUrl once stage is "complete". Use it to report what is finished or still rendering. Managing and deleting videos stays in the dashboard.

              v4.2.0

              2026-07-20

              Agents can put a local image on a slide. `request_slide_image_upload` mints a short-lived presigned R2 URL for a local image file, the same supply-chain shape as `request_reaction_upload`: PUT the raw bytes straight to storage (never as a tool argument), then `set_slide_background` with type `url` and the returned `fileUrl`. `set_slide_background` also gained durability on plain image urls: an external `url` background is now re-hosted to our storage automatically, so a slide never points at a link that can rot, while Pinterest picks keep their `pinterest` provenance and images already on our storage pass through untouched.

              • ADDEDrequest_slide_image_uploadnew toolStudio →
                Get a short-lived presigned R2 upload URL for a LOCAL image file (too large to pass as a tool argument). PUT the raw bytes to uploadUrl with the given Content-Type, then call set_slide_background with background.type "url" and background.url = the returned fileUrl. Costs no credits.
              • WORDINGset_slide_backgrounddescription changedStudio →
                Set one slide's background: a Pinterest url, a collection image, an avatar photo, any image url, or a solid color. Image picks are gated server-side (browser-displayable, 720px+ short side). The dashboard updates live. If this is the deck's first build edit it charges 1 credit and returns creditsSpent/creditsRemaining.
                Set one slide's background: a Pinterest url, a collection image, an avatar photo, any image url, or a solid color. For a LOCAL image file, call request_slide_image_upload first, PUT the bytes, then pass the returned fileUrl here as type 'url'. External urls are re-hosted to durable storage automatically. Image picks are gated server-side (browser-displayable, 720px+ short side). The dashboard updates live. If this is the deck's first build edit it charges 1 credit and returns creditsSpent/creditsRemaining.
              • WORDINGset_slide_backgroundparam description changed: background.typeStudio →
                Where this background comes from. 'pinterest' = a url from search_pinterest; 'collection'/'avatar' = a url from the matching list tool (id required); 'url' = any other image url; 'color' = solid background.
                Where this background comes from. 'pinterest' = a url from search_pinterest; 'collection'/'avatar' = a url from the matching list tool (id required); 'url' = any other image url, INCLUDING a fileUrl from request_slide_image_upload (an external url is re-hosted to durable storage automatically); 'color' = solid background. To use a LOCAL image file, call request_slide_image_upload first, PUT the bytes, then set type 'url' with the returned fileUrl.
              • WORDINGset_slide_backgroundparam description changed: background.urlStudio →
                The image url (all types except color).
                The image url (types 'pinterest'/'collection'/'avatar'/'url').

              v4.1.0

              2026-07-19

              UGC reactions come to the agent surface: create reaction videos over chat instead of clicking through the dashboard, following the exact two-phase flow the app already uses. Eight tools ship in a new UGC Reactions group. The supply chain first: `import_reaction_template` turns a TikTok/Instagram link, a local file (uploaded to a presigned URL from `request_reaction_upload`), or a curated `list_inspiration_reactions` clip into a workspace template, with one uniform rule on every path (a clip up to 30s is ready immediately; 30 to 120s imports in full but must be cropped in the dashboard first; longer is rejected). Then the two phases: `generate_reaction_frames` renders one or more avatars into the source pose, one frame per avatar, and `generate_reaction_video` animates an approved frame, either cloning the reference motion (default `one_to_one_standard`, Kling motion-control) or from a text prompt (default `seedance_2_0_fast`). `regenerate_reaction_frame` redoes a weak frame; `list_reaction_templates` and `list_reaction_video_modes` are the discovery reads. The frame is a deliberate checkpoint: the tools and the skill push the agent to show it and get the user's approval before spending the far larger video credits. Reaction work is async and polled through the existing `get_generation` ledger, which gains three kinds (`reaction_import`, `reaction_frame`, `reaction_video`); a 30 to 120s import surfaces as `needs_action` until cropped. Bulk creation only. Managing, cropping, and deleting templates and videos all stay in the dashboard, the same human-in-the-loop line the delete removal in 4.0.0 drew.

              • ADDEDgenerate_reaction_framesnew toolUGC Reactions →
                PHASE 1 of a UGC reaction: render one or more avatars into the source pose, ONE frame per avatar. Source is exactly one of templateId, inspirationId (auto-saved to a template first), or referenceImageUrl. Async: returns one reaction_frame generation per avatar to poll; the finished frame is output.url and output.id is the frameId. Charges the image-model cost per avatar as frames render (gemini_flash unless imageModel is set). STOP after this: show the frame(s) to the user and get approval BEFORE generate_reaction_video, because video credits are far higher.
              • ADDEDgenerate_reaction_videonew toolUGC Reactions →
                PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames. mode picks the family: a CLONE mode (one_to_one_*) reproduces the template motion and needs a template-backed frame (no prompt); a PROMPT mode (default seedance_2_0_fast) animates from text and needs a prompt. Duration is auto unless durationSeconds is set (ignored by clone modes, which follow the source clip). Async: returns one reaction_video generation per frame to poll; the clip is output.url. Charges per second of video and reports creditsSpent/creditsRemaining.
              • ADDEDimport_reaction_templatenew toolUGC Reactions →
                Import a reaction TEMPLATE from exactly one source: sourceUrl (a TikTok/Instagram link), uploadedFileUrl (from request_reaction_upload, the local-file path), or inspirationId (a curated clip). Async: returns a reaction_import generation to poll with get_generation. succeeded = ready to use; needs_action = the source is 30-120s and must be cropped in the dashboard first (open dashboardUrl); >120s is rejected. Costs no credits. Managing, cropping, and deleting templates all happen in the dashboard.
              • ADDEDlist_inspiration_reactionsnew toolUGC Reactions →
                Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first.
              • ADDEDlist_reaction_templatesnew toolUGC Reactions →
                List reaction TEMPLATES (the source motion clips) usable in this workspace: platform stock plus your own imported/uploaded ones. Each has an id, name, category, duration, thumbnail, and status. You cannot watch the motion, so describe it from name/category if the user must choose. Find a templateId here for generate_reaction_frames.
              • ADDEDlist_reaction_video_modesnew toolUGC Reactions →
                List the video modes for the reaction video phase, with per-second credit cost and whether each needs a prompt or supports audio. Two families: CLONE modes reproduce a template motion (default one_to_one_standard, Kling motion-control, no prompt); PROMPT modes animate the frame from text (default seedance_2_0_fast). Use a clone mode only when the user wants to reproduce the reference video motion.
              • ADDEDregenerate_reaction_framenew toolUGC Reactions →
                Redo the frame of a reaction_frame generation the user was not happy with, by its generationId. Re-runs frame generation on the same avatar + source and charges another frame credit. Poll the same generation until it succeeds with a fresh frame, then get approval before generate_reaction_video.
              • ADDEDrequest_reaction_uploadnew toolUGC Reactions →
                Get a short-lived presigned R2 upload URL for a LOCAL video file (a video is too large for a tool argument). PUT the raw bytes to uploadUrl with the given Content-Type, then pass the returned fileUrl to import_reaction_template as uploadedFileUrl. Costs no credits.
              • ADDEDlist_generationsenum values added to kind: reaction_import, reaction_frame, reaction_videoGenerations →

              v4.0.0

              2026-07-19

              Agents can no longer delete library objects. Founder ruling: an agent over the public API creates and organizes, but destroying content stays a human decision in the dashboard. `delete_draft_avatar` is REMOVED from the agent surface entirely, its MCP tool and its `DELETE /avatars/drafts/:id` REST twin both gone. This is the breaking removal behind the major bump. Draft avatars are now resolved one of two ways: approve the ones to keep with `approve_avatar`, and manage or discard the rest from the dashboard. The `create_avatar` and `list_draft_avatars` guidance now says exactly that. Nothing else about the avatar flow changes: drafts still never enter the library without human approval, and the underlying dashboard delete path is untouched. Note the in-session build primitive `remove_slide` is NOT a delete of a library object (it edits an in-progress deck) and is unaffected.

              • BREAKINGdelete_draft_avatartool removed

              v3.0.1

              2026-07-19

              Dogfood fixes. `create_variant` now tells the truth about what it is: a COPY of the base deck that YOU must differentiate, re-casting a fresh image and rewriting the copy on each slide the same way the dashboard's Director shuffles a variant. Four behavior fixes, no schema changes: `create_avatar` with an `idempotencyKey` is now truly idempotent (a same-key retry returns the ORIGINAL drafts with `creditsSpent: 0` instead of generating new avatars and mis-reporting a charge); a first Studio build edit that fails its image gate no longer charges silently (validation runs before the charge, so the credit lands only on the first edit that actually applies and always reports `creditsSpent`/`creditsRemaining`); agent-built decks now stamp `createdVia: "mcp"`; and the avatar auto-namer is heritage-aware (no more "Kenji Park" for a South Asian persona).

              • WORDINGcreate_variantdescription changedStudio →
                Add a variant to a slideshow: a COPY of the base deck you then tweak into an A/B version by passing its variantIndex to set_slide_background / set_slide_texts. Costs 1 credit (same as a dashboard-generated variant); returns the new variantIndex and creditsSpent/creditsRemaining. Editing the variant afterwards is free.
                Add a variant to a slideshow: a COPY of the base deck, returned with a new variantIndex. Differentiate it the same way the dashboard shuffles variants, by passing that variantIndex to set_slide_background / set_slide_texts per slide: re-cast a FRESH image on each slide (search_pinterest + a new pick for Pinterest slides; a different image from the same collection/avatar for those) and REWRITE the copy. Keep uploaded, plain-url, and AI-generated images as-is. Costs 1 credit (same as a dashboard-generated variant); returns creditsSpent/creditsRemaining. Editing the variant afterwards is free.

              v3.0.0

              2026-07-19

              Slideshow creation on MCP is now the agent's own hand-build via Studio, not the server's one-shot composer. The founder thesis taken to its conclusion: a frontier harness out-sees the server's small vision model, so it art-directs the deck itself. `create_slideshow` (the one-shot prompt/remix composer) is REMOVED from the agent surface and stays a dashboard-only convenience; this is the breaking change behind the major bump. In its place the agent has every creation surface, all at the same dashboard-parity price of 1 credit per deck or variant: build from an idea with the Studio tools; remix a TikTok or Instagram post with the new `read_social_post` (it scrapes the source; you hand-build the remix); and make A/B variants with the new `create_variant` (a copy of the base you then tweak). Every Studio build op gains an optional `variantIndex` so you can target a specific variant. The 1-credit charge lands on the first real build edit (never the empty blank deck), is idempotent per deck, and reports `creditsSpent`/`creditsRemaining`. `list_collections` and `list_products` guidance now points at the Studio cast path.

              • BREAKINGcreate_slideshowtool removed
              • ADDEDcreate_variantnew toolStudio →
                Add a variant to a slideshow: a COPY of the base deck you then tweak into an A/B version by passing its variantIndex to set_slide_background / set_slide_texts. Costs 1 credit (same as a dashboard-generated variant); returns the new variantIndex and creditsSpent/creditsRemaining. Editing the variant afterwards is free.
              • ADDEDread_social_postnew toolStudio →
                Read a TikTok Photo Mode or Instagram carousel post so YOU can remix it: returns the caption, slide count, and each slide image url. This is the SOURCE, not a deck. There is no server-side remix; LOOK at the images, then create_blank_slideshow and hand-build - write your own copy in the same structure and cast fresh images. Costs no credits (the deck costs 1 credit on your first build edit).
              • ADDEDadd_slideoptional param added: variantIndexStudio →
              • ADDEDremove_slideoptional param added: variantIndexStudio →
              • ADDEDreorder_slidesoptional param added: variantIndexStudio →
              • ADDEDset_captionoptional param added: variantIndexStudio →
              • ADDEDset_slide_backgroundoptional param added: variantIndexStudio →
              • ADDEDset_slide_textsoptional param added: variantIndexStudio →
              • WORDINGcreate_blank_slideshowdescription changedStudio →
                Create an empty slideshow with N blank slides, ready to be built slide by slide with set_slide_background and set_slide_texts. Use when YOU are doing the creative work; use create_slideshow when the server-side Director should. Costs no credits.
                Create an empty slideshow with N blank slides, then build it slide by slide with set_slide_background and set_slide_texts. This is how an agent creates a deck: YOU do the creative work. The empty deck is free; the deck costs 1 credit, charged on your first set_slide_background or set_slide_texts (same price as a dashboard-made deck). Later edits are free.
              • WORDINGget_slideshowdescription changedSlideshows →
                Read a slideshow's full anatomy: every variant with status, caption, and per-slide texts + background image url + provenance (backgroundSource: ai | pinterest | collection | avatar | image). Use it to review what was generated; for the visually composed slides (text on image), send the user the dashboardUrl.
                Read a slideshow's full anatomy: every variant with status, caption, and per-slide texts + background image url + provenance (backgroundSource: ai | pinterest | collection | avatar | image). Variant status is pending | processing | ready | failed (the generation ledger maps ready to succeeded, pending to queued, processing to running). Use it to review what was generated; for the visually composed slides (text on image), send the user the dashboardUrl.
              • WORDINGget_slideshowparam description changed: slideshowIdSlideshows →
                The slideshow (project) id from create_slideshow or list_slideshows.
                The slideshow (project) id from list_slideshows or create_blank_slideshow.
              • WORDINGlist_collectionsdescription changedLibrary →
                List the workspace's image collections (the user's own saved images): id, name, image count, and dashboardUrl. Pass an id as create_slideshow collectionId to mention that collection — mentioning is the ONLY way the user's own images enter a slideshow's casting (its images then contend where they fit; products carry their own photo collections via linkedCollections). Call this BEFORE creating a slideshow that should feature the user's own images.
                List the workspace's image collections (the user's own saved images): id, name, image count, and dashboardUrl. To feature a collection's images in a deck, browse it with list_collection_images and cast the ones you want with set_slide_background (type collection). Call this BEFORE building a deck that should feature the user's own images.
              • WORDINGlist_productsdescription changedLibrary →
                List the workspace's registered products: id, name, description, url, dashboardUrl, and linkedCollections (the product's OWN photo collections, each with its own dashboardUrl). Pass an id as create_slideshow productId to weave that product into ONE slide in a soft peer-recommendation voice; for hand-built decks, browse a linked collection with list_collection_images and cast a real product image on the product slide. Call this BEFORE creating a slideshow that should plug a product.
                List the workspace's registered products: id, name, description, url, dashboardUrl, and linkedCollections (the product's OWN photo collections, each with its own dashboardUrl). To plug a product, weave it into ONE slide in a soft peer-recommendation voice: browse a linked collection with list_collection_images and cast a real product image on that slide with set_slide_background. Call this BEFORE building a deck that should plug a product.
              • WORDINGset_slide_backgrounddescription changedStudio →
                Set one slide's background: a Pinterest url, a collection image, an avatar photo, any image url, or a solid color. Image picks are gated server-side (browser-displayable, 720px+ short side). The dashboard updates live.
                Set one slide's background: a Pinterest url, a collection image, an avatar photo, any image url, or a solid color. Image picks are gated server-side (browser-displayable, 720px+ short side). The dashboard updates live. If this is the deck's first build edit it charges 1 credit and returns creditsSpent/creditsRemaining.
              • WORDINGset_slide_textsdescription changedStudio →
                Replace one slide's text boxes (1-5 texts with placement top/center/bottom and role heading/subheading/body/cta - role sets the font size, positions are computed server-side exactly like the dashboard). Optionally mark isProductSlide.
                Replace one slide's text boxes (1-5 texts with placement top/center/bottom and role heading/subheading/body/cta - role sets the font size, positions are computed server-side exactly like the dashboard). Optionally mark isProductSlide. If this is the deck's first build edit it charges 1 credit and returns creditsSpent/creditsRemaining.

              v2.2.0

              2026-07-17

              REST is now a true transport twin of MCP. All 28 public operations are available under `/api/v2`, including workspaces, credits, transactions, library discovery, image browsing, Pinterest search, blank-deck creation, and every granular Studio edit. One canonical operation manifest drives generated REST references and a bidirectional CI gate: an MCP-only tool, a REST-only endpoint, or an undocumented method/path change now fails before merge.

              • ADDEDadd_slideREST endpoint added: POST /slideshows/:slideshowId/slidesStudio →
              • ADDEDapprove_avatarREST endpoint added: POST /avatars/:id/approveAvatars →
              • ADDEDcreate_avatarREST endpoint added: POST /avatarsAvatars →
              • ADDEDcreate_blank_slideshowREST endpoint added: POST /slideshows/blankStudio →
              • ADDEDcreate_slideshowREST endpoint added: POST /slideshowsSlideshows →
              • ADDEDdelete_draft_avatarREST endpoint added: DELETE /avatars/drafts/:idAvatars →
              • ADDEDget_creditsREST endpoint added: GET /creditsCore →
              • ADDEDget_generationREST endpoint added: GET /generations/:idGenerations →
              • ADDEDget_meREST endpoint added: GET /meCore →
              • ADDEDget_slideshowREST endpoint added: GET /slideshows/:idSlideshows →
              • ADDEDlist_avatar_imagesREST endpoint added: GET /avatars/:avatarId/imagesStudio →
              • ADDEDlist_avatarsREST endpoint added: GET /avatarsAvatars →
              • ADDEDlist_collection_imagesREST endpoint added: GET /collections/:collectionId/imagesStudio →
              • ADDEDlist_collectionsREST endpoint added: GET /collectionsLibrary →
              • ADDEDlist_draft_avatarsREST endpoint added: GET /avatars/draftsAvatars →
              • ADDEDlist_generationsREST endpoint added: GET /generationsGenerations →
              • ADDEDlist_image_modelsREST endpoint added: GET /image-modelsAvatars →
              • ADDEDlist_productsREST endpoint added: GET /productsLibrary →
              • ADDEDlist_slideshowsREST endpoint added: GET /slideshowsSlideshows →
              • ADDEDlist_transactionsREST endpoint added: GET /transactionsCore →
              • ADDEDlist_workspacesREST endpoint added: GET /workspacesCore →
              • ADDEDremove_slideREST endpoint added: DELETE /slideshows/:slideshowId/slides/:slideIndexStudio →
              • ADDEDrename_avatarREST endpoint added: PATCH /avatars/:idAvatars →
              • ADDEDreorder_slidesREST endpoint added: PUT /slideshows/:slideshowId/slides/orderStudio →
              • ADDEDsearch_pinterestREST endpoint added: POST /pinterest/searchStudio →
              • ADDEDset_captionREST endpoint added: PUT /slideshows/:slideshowId/captionStudio →
              • ADDEDset_slide_backgroundREST endpoint added: PUT /slideshows/:slideshowId/slides/:slideIndex/backgroundStudio →
              • ADDEDset_slide_textsREST endpoint added: PUT /slideshows/:slideshowId/slides/:slideIndex/textsStudio →
              • WORDINGcreate_blank_slideshowdescription changedStudio →
                Create an empty slideshow with N blank slides, ready to be built slide by slide with set_slide_background and set_slide_texts. Use when YOU are doing the creative work; use create_slideshow when the server pipeline should. Costs no credits.
                Create an empty slideshow with N blank slides, ready to be built slide by slide with set_slide_background and set_slide_texts. Use when YOU are doing the creative work; use create_slideshow when the server-side Director should. Costs no credits.
              • WORDINGcreate_slideshowdescription changedSlideshows →
                Create a TikTok photo slideshow from a prompt OR by remixing a TikTok/Instagram post url (exactly one). The server pipeline writes the slide copy, searches Pinterest, and a taste-tuned vision judge casts each background from the Pinterest results plus any collections the brief mentions (weak batches trigger one automatic re-search). Collections are never used unless mentioned via collectionId or a product's linked photos. Costs no credits. ASYNC: returns a gen_ id immediately; poll get_generation until terminal (typically 1-3 minutes), then read the result with get_slideshow. Free plan allows 1 project.
                Create a TikTok photo slideshow from a prompt OR by remixing a TikTok/Instagram post url (exactly one). The server's Director engine composes the deck in one agentic loop: it writes the slide copy, searches Pinterest, looks at the candidate images, and casts each background from what it saw plus any collections the brief mentions. It repairs its own gaps before finishing; if it cannot finish, the generation reports failed honestly instead of shipping a broken deck. Collections are never used unless mentioned via collectionId or a product's linked photos. Costs no credits. ASYNC: returns a gen_ id immediately; poll get_generation until terminal (typically 1-3 minutes), then read the result with get_slideshow. Free plan allows 1 project.
              • WORDINGcreate_slideshowparam description changed: promptSlideshows →
                Describe the slideshow: topic, angle, audience. The pipeline writes the slide copy and casts the images. Exactly one of prompt or sourceUrl.
                Describe the slideshow: topic, angle, audience. The Director engine writes the slide copy and casts the images. Exactly one of prompt or sourceUrl.
              • WORDINGcreate_slideshowparam description changed: sourceUrlSlideshows →
                A TikTok Photo Mode or Instagram post URL to remix: the pipeline rewrites the copy in the same structure and re-casts every image. Exactly one of prompt or sourceUrl.
                A TikTok Photo Mode or Instagram post URL to remix: the Director rewrites the copy in the same structure and casts entirely new images. Exactly one of prompt or sourceUrl.

              v2.1.0

              2026-07-17

              Library results now open what they name. `list_collections` returns a workspace-qualified `dashboardUrl` for every collection, while `list_products` returns one for every product and each linked collection. Product links land on a stable `/w/<slug>/products/<id>` route whose edit dialog survives refresh, login, and browser history.

              • WORDINGlist_collectionsdescription changedLibrary →
                List the workspace's image collections (the user's own saved images): id, name, image count. Pass an id as create_slideshow collectionId to mention that collection — mentioning is the ONLY way the user's own images enter a slideshow's casting (its images then contend where they fit; products carry their own photo collections via linkedCollections). Call this BEFORE creating a slideshow that should feature the user's own images.
                List the workspace's image collections (the user's own saved images): id, name, image count, and dashboardUrl. Pass an id as create_slideshow collectionId to mention that collection — mentioning is the ONLY way the user's own images enter a slideshow's casting (its images then contend where they fit; products carry their own photo collections via linkedCollections). Call this BEFORE creating a slideshow that should feature the user's own images.
              • WORDINGlist_productsdescription changedLibrary →
                List the workspace's registered products: id, name, description, url, and linkedCollections (the product's OWN photo collections). Pass an id as create_slideshow productId to weave that product into ONE slide in a soft peer-recommendation voice; for hand-built decks, browse a linked collection with list_collection_images and cast a real product image on the product slide. Call this BEFORE creating a slideshow that should plug a product.
                List the workspace's registered products: id, name, description, url, dashboardUrl, and linkedCollections (the product's OWN photo collections, each with its own dashboardUrl). Pass an id as create_slideshow productId to weave that product into ONE slide in a soft peer-recommendation voice; for hand-built decks, browse a linked collection with list_collection_images and cast a real product image on the product slide. Call this BEFORE creating a slideshow that should plug a product.

              v2.0.0

              2026-07-17

              Workspace intent is now deterministic. Every credential pins one default workspace for reads at consent time, while every workspace-scoped write must name its target explicitly. Dashboard links carry the workspace in the path (`/w/<slug>/...`), and dashboard navigation can no longer retarget an MCP connection behind the user's back. This is a clean development reset: reconnect existing MCP clients at `/api/v2/mcp`; v1 credentials and endpoints are not migrated.

              • BREAKINGadd_slideparam made required: workspaceStudio →
              • BREAKINGapprove_avatarparam made required: workspaceAvatars →
              • BREAKINGcreate_avatarparam made required: workspaceAvatars →
              • BREAKINGcreate_blank_slideshowparam made required: workspaceStudio →
              • BREAKINGcreate_slideshowparam made required: workspaceSlideshows →
              • BREAKINGdelete_draft_avatarparam made required: workspaceAvatars →
              • BREAKINGremove_slideparam made required: workspaceStudio →
              • BREAKINGrename_avatarparam made required: workspaceAvatars →
              • BREAKINGreorder_slidesparam made required: workspaceStudio →
              • BREAKINGset_captionparam made required: workspaceStudio →
              • BREAKINGset_slide_backgroundparam made required: workspaceStudio →
              • BREAKINGset_slide_textsparam made required: workspaceStudio →
              • WORDINGadd_slideparam description changed: workspaceStudio →
                Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
                Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
              • WORDINGapprove_avatarparam description changed: workspaceAvatars →
                Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
                Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
              • WORDINGcreate_avatarparam description changed: workspaceAvatars →
                Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
                Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
              • WORDINGcreate_blank_slideshowparam description changed: workspaceStudio →
                Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
                Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
              • WORDINGcreate_slideshowdescription changedSlideshows →
                Create a TikTok photo slideshow from a prompt OR by remixing a TikTok/Instagram post url (exactly one). The server pipeline writes the slide copy, searches Pinterest, and a taste-tuned vision judge casts each background from the Pinterest results plus the project's pinned collection (weak batches trigger one automatic re-search). Collections are never used unless pinned via collectionId or a product's linked photos. Costs no credits. ASYNC: returns a gen_ id immediately; poll get_generation until terminal (typically 1-3 minutes), then read the result with get_slideshow. Free plan allows 1 project.
                Create a TikTok photo slideshow from a prompt OR by remixing a TikTok/Instagram post url (exactly one). The server pipeline writes the slide copy, searches Pinterest, and a taste-tuned vision judge casts each background from the Pinterest results plus any collections the brief mentions (weak batches trigger one automatic re-search). Collections are never used unless mentioned via collectionId or a product's linked photos. Costs no credits. ASYNC: returns a gen_ id immediately; poll get_generation until terminal (typically 1-3 minutes), then read the result with get_slideshow. Free plan allows 1 project.
              • WORDINGcreate_slideshowparam description changed: workspaceSlideshows →
                Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
                Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
              • WORDINGdelete_draft_avatarparam description changed: workspaceAvatars →
                Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
                Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
              • WORDINGget_medescription changedCore →
                Who am I, which workspace am I pointed at, and what does my credential allow. Call this first. credential.workspaceScope "all" means every workspace you can currently access (grantedWorkspaceIds stays empty); "listed" pins the credential to exactly grantedWorkspaceIds. Workspace-scoped tools accept a per-call workspace (id or exact name) to target any workspace within that grant.
                Who am I, which workspace did this read resolve to, and what does my credential allow. Call this first. credential.defaultWorkspaceId is immutable for the connection. credential.workspaceScope "all" means every workspace you can currently access (grantedWorkspaceIds stays empty); "listed" pins the credential to exactly grantedWorkspaceIds. Reads may omit workspace and use the connection default; every workspace-scoped write must pass workspace explicitly.
              • WORDINGlist_workspacesdescription changedCore →
                List the workspaces this credential can act in, and which is active. Each has an id, name, and stable slug. Pass any of them as the workspace parameter on workspace-scoped tools; the slug is what appears in dashboardUrl links.
                List the live workspaces this credential can act in, its immutable defaultWorkspaceId, and the workspace resolved for this request. Each has an id, name, and stable slug. Pass the slug or id as workspace on every write; the slug appears in dashboardUrl links.
              • WORDINGremove_slideparam description changed: workspaceStudio →
                Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
                Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
              • WORDINGrename_avatarparam description changed: workspaceAvatars →
                Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
                Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
              • WORDINGreorder_slidesparam description changed: workspaceStudio →
                Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
                Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
              • WORDINGset_captionparam description changed: workspaceStudio →
                Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
                Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
              • WORDINGset_slide_backgroundparam description changed: workspaceStudio →
                Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
                Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
              • WORDINGset_slide_textsparam description changed: workspaceStudio →
                Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
                Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.

              v1.6.2

              2026-07-17

              Pinning is now a product concept only. create_slideshow's collectionId no longer pins the collection onto the project; it records the same explicit mention an @mention in the dashboard prompt box creates, and the images join casting through that path. Products keep their own photo collections via linkedCollections, resolved live when the deck is built. Nothing structural changed: the param name, type, and optionality are identical, and existing calls keep working.

              • WORDINGcreate_slideshowparam description changed: collectionIdSlideshows →
                Pin a collection: its images join every slide's casting pool and the vision judge uses them where they fit (product slides prefer them). Pinning is the ONLY way the user's own images enter casting — unpinned collections never contend. Must belong to the workspace.
                Mention a collection: its images join the casting pool and are used where they fit. Equivalent to @mentioning the collection in the dashboard prompt box (there is no project-level pinning; products carry their own photo collections via linkedCollections). Must belong to the workspace.
              • WORDINGlist_collectionsdescription changedLibrary →
                List the workspace's image collections (the user's own saved images): id, name, image count. Pass an id as create_slideshow collectionId to pin that collection — pinning is the ONLY way the user's own images enter a slideshow's casting (its images then contend for every slide, and product slides prefer them). Call this BEFORE creating a slideshow that should feature the user's own images.
                List the workspace's image collections (the user's own saved images): id, name, image count. Pass an id as create_slideshow collectionId to mention that collection — mentioning is the ONLY way the user's own images enter a slideshow's casting (its images then contend where they fit; products carry their own photo collections via linkedCollections). Call this BEFORE creating a slideshow that should feature the user's own images.

              v1.6.1

              2026-07-17

              Products now hand agents their imagery. list_products returns each product's linkedCollections (its own photo collections, with names), and the tool descriptions teach the path: mention or weave a product, browse its linked collection with list_collection_images, and cast a real product image on the plug slide. This is the resolver behind product mentions.

              • WORDINGlist_productsdescription changedLibrary →
                List the workspace's registered products: id, name, description, url. Pass an id as create_slideshow productId to weave that product into ONE slide in a soft peer-recommendation voice. Call this BEFORE creating a slideshow that should plug a product.
                List the workspace's registered products: id, name, description, url, and linkedCollections (the product's OWN photo collections). Pass an id as create_slideshow productId to weave that product into ONE slide in a soft peer-recommendation voice; for hand-built decks, browse a linked collection with list_collection_images and cast a real product image on the product slide. Call this BEFORE creating a slideshow that should plug a product.

              v1.6.0

              2026-07-15

              The agent gets its own hands. Ten Studio tools expose the slideshow editor's creation moves one at a time: search_pinterest returns raw image urls for up to 8 queries, list_collection_images and list_avatar_images show the library's actual photos, create_blank_slideshow starts an empty deck, and set_slide_background, set_slide_texts, add_slide, remove_slide, reorder_slides, and set_caption build it piece by piece with the dashboard updating live. Image picks pass the same physical gates as the pipeline (browser-displayable, 720px minimum). Nothing about create_slideshow changed; Studio exists so a frontier agent can do the taste work itself, looking at every candidate with its own eyes.

              • ADDEDadd_slidenew toolStudio →
                Insert a blank slide (append by default). Decks cap at 12 slides.
              • ADDEDcreate_blank_slideshownew toolStudio →
                Create an empty slideshow with N blank slides, ready to be built slide by slide with set_slide_background and set_slide_texts. Use when YOU are doing the creative work; use create_slideshow when the server pipeline should. Costs no credits.
              • ADDEDlist_avatar_imagesnew toolStudio →
                List a saved avatar's generated photos (urls + captions). Reusing them is free; use set_slide_background type 'avatar' to cast one.
              • ADDEDlist_collection_imagesnew toolStudio →
                List a collection's actual images (urls + AI captions of what each shows), 30 per page. Use to hand-pick a specific image for set_slide_background.
              • ADDEDremove_slidenew toolStudio →
                Remove a slide by position. A deck keeps at least one slide.
              • ADDEDreorder_slidesnew toolStudio →
                Reorder slides with a permutation of current positions, e.g. [2,0,1].
              • ADDEDsearch_pinterestnew toolStudio →
                Search Pinterest directly (up to 8 queries, default 12 images each) and get raw image urls back. Search for SCENES, not topics. LOOK at the images yourself before picking - that is the whole point of this tool - then set_slide_background with the winner. Costs no credits.
              • ADDEDset_captionnew toolStudio →
                Set the slideshow's post caption.
              • ADDEDset_slide_backgroundnew toolStudio →
                Set one slide's background: a Pinterest url, a collection image, an avatar photo, any image url, or a solid color. Image picks are gated server-side (browser-displayable, 720px+ short side). The dashboard updates live.
              • ADDEDset_slide_textsnew toolStudio →
                Replace one slide's text boxes (1-5 texts with placement top/center/bottom and role heading/subheading/body/cta - role sets the font size, positions are computed server-side exactly like the dashboard). Optionally mark isProductSlide.

              v1.5.0

              2026-07-15

              The casting brain traded cleverness for taste. Slideshow backgrounds now come from exactly two places, Pinterest and the collection you pinned, and nothing from the library is ever used unless you pinned it (via collectionId or a product's linked photos). In exchange the picker got much better eyes. Every slide auditions up to 12 candidates against a camera-roll rubric that rejects infographics, baked-in text, staged stock, brand-logo shots, and anything under 600px, and when an entire search comes back weak the judge can veto it and trigger one automatic re-search on a backup query. Generated variants now go through the same judged casting instead of picking at random.

              • WORDINGcreate_slideshowdescription changedSlideshows →
                Create a TikTok photo slideshow from a prompt OR by remixing a TikTok/Instagram post url (exactly one). The server pipeline writes the slide copy, searches Pinterest, and a vision judge casts each background from Pinterest + the user's collections. Costs no credits. ASYNC: returns a gen_ id immediately; poll get_generation until terminal (typically 1-3 minutes), then read the result with get_slideshow. Free plan allows 1 project.
                Create a TikTok photo slideshow from a prompt OR by remixing a TikTok/Instagram post url (exactly one). The server pipeline writes the slide copy, searches Pinterest, and a taste-tuned vision judge casts each background from the Pinterest results plus the project's pinned collection (weak batches trigger one automatic re-search). Collections are never used unless pinned via collectionId or a product's linked photos. Costs no credits. ASYNC: returns a gen_ id immediately; poll get_generation until terminal (typically 1-3 minutes), then read the result with get_slideshow. Free plan allows 1 project.
              • WORDINGcreate_slideshowparam description changed: collectionIdSlideshows →
                Pin a collection: its images join every slide's casting pool and the vision judge uses them where they fit (product slides prefer them). Other workspace collections still contend automatically by name. Must belong to the workspace.
                Pin a collection: its images join every slide's casting pool and the vision judge uses them where they fit (product slides prefer them). Pinning is the ONLY way the user's own images enter casting — unpinned collections never contend. Must belong to the workspace.
              • WORDINGlist_collectionsdescription changedLibrary →
                List the workspace's image collections (the user's own saved images): id, name, image count. Pass an id as create_slideshow collectionId to pin that collection — its images then contend for every slide and product slides prefer them. Call this BEFORE creating a slideshow that should feature the user's own images.
                List the workspace's image collections (the user's own saved images): id, name, image count. Pass an id as create_slideshow collectionId to pin that collection — pinning is the ONLY way the user's own images enter a slideshow's casting (its images then contend for every slide, and product slides prefer them). Call this BEFORE creating a slideshow that should feature the user's own images.

              v1.4.0

              2026-07-12

              Agents can now see the workspace library. Two new tools, `list_collections` and `list_products`, surface the user's own image collections and registered products with real ids, so an agent can pin a collection (`create_slideshow` `collectionId`) or weave a product (`productId`) instead of hoping the pipeline guesses right. Behind the scenes the slideshow casting brain got smarter about the user's own images: products remember which collections hold their photos and auto-pin them on product slides, product-slide collection hints always survive the per-deck fetch budget, and image formats browsers cannot display (HEIC and friends) are filtered out of casting before they can ship as a black slide.

              • ADDEDlist_collectionsnew toolLibrary →
                List the workspace's image collections (the user's own saved images): id, name, image count. Pass an id as create_slideshow collectionId to pin that collection — its images then contend for every slide and product slides prefer them. Call this BEFORE creating a slideshow that should feature the user's own images.
              • ADDEDlist_productsnew toolLibrary →
                List the workspace's registered products: id, name, description, url. Pass an id as create_slideshow productId to weave that product into ONE slide in a soft peer-recommendation voice. Call this BEFORE creating a slideshow that should plug a product.
              • WORDINGget_slideshowdescription changedSlideshows →
                Read a slideshow's full anatomy: every variant with status, caption, and per-slide texts + background image url + provenance (backgroundSource: ai | pinterest | collection | image). Use it to review what was generated; for the visually composed slides (text on image), send the user the dashboardUrl.
                Read a slideshow's full anatomy: every variant with status, caption, and per-slide texts + background image url + provenance (backgroundSource: ai | pinterest | collection | avatar | image). Use it to review what was generated; for the visually composed slides (text on image), send the user the dashboardUrl.

              v1.3.0

              2026-07-12

              Every made thing now hands you its door, and links read like English. Avatar drafts, approvals, and renames return `dashboardUrl` alongside the data, the same field slideshows already carry, and the generation poll now carries it on every check (not just at creation) so a job you come back to later still has a link. Every workspace gains a stable, human-readable `slug` (e.g. `client-beta`) that appears in those links instead of a raw id, so a pasted link says where it lands; you can target a workspace by slug, name, or id, and list/read responses now echo the resolved `workspace: {id, name, slug}` so an empty result is distinguishable from a filter that never matched. Links are canonical (production domain) and carry `ref=agent` so agent-driven visits are measurable.

              • ADDEDcreate_slideshownew toolSlideshows →
                Create a TikTok photo slideshow from a prompt OR by remixing a TikTok/Instagram post url (exactly one). The server pipeline writes the slide copy, searches Pinterest, and a vision judge casts each background from Pinterest + the user's collections. Costs no credits. ASYNC: returns a gen_ id immediately; poll get_generation until terminal (typically 1-3 minutes), then read the result with get_slideshow. Free plan allows 1 project.
              • ADDEDget_slideshownew toolSlideshows →
                Read a slideshow's full anatomy: every variant with status, caption, and per-slide texts + background image url + provenance (backgroundSource: ai | pinterest | collection | image). Use it to review what was generated; for the visually composed slides (text on image), send the user the dashboardUrl.
              • ADDEDlist_slideshowsnew toolSlideshows →
                List slideshow projects in the active workspace, latest activity first: id, name, variant count, whether one is still generating, and the dashboard url.
              • ADDEDlist_generationsenum values added to kind: slideshow_variantGenerations →
              • WORDINGapprove_avatardescription changedAvatars →
                Approve a draft avatar by its avatarId, promoting it into the library (optionally rename). Only approve drafts the USER chose to keep.
                Approve a draft avatar by its avatarId, promoting it into the library (optionally rename). Only approve drafts the USER chose to keep. Returns dashboardUrl for the saved avatar.
              • WORDINGcreate_avatardescription changedAvatars →
                Generate draft avatar(s) from appearance traits + an optional scene prompt. Returns drafts that are NOT saved to the library; the user must approve them. Any traits you omit are randomized. Costs credits per image; the result reports creditsSpent and creditsRemaining. Drafts are billed once at creation, never expire, and cost nothing to keep unapproved.
                Generate draft avatar(s) from appearance traits + an optional scene prompt. Returns drafts that are NOT saved to the library; the user must approve them. Any traits you omit are randomized. Costs credits per image; the result reports creditsSpent and creditsRemaining. Drafts are billed once at creation, never expire, and cost nothing to keep unapproved. Each draft carries dashboardUrl, the dashboard door to that draft.
              • WORDINGget_generationdescription changedGenerations →
                Check on an ASYNCHRONOUS generation you started, by its gen_ id: its normalized state and the finished asset urls once it succeeds. Poll until state is terminal (succeeded/failed/canceled). Avatars are created synchronously by create_avatar and are NOT polled here.
                Check on an ASYNCHRONOUS generation you started, by its gen_ id: its normalized state and the finished asset urls once it succeeds. Poll until state is terminal (succeeded/failed/canceled); slideshow generations typically take 1-3 minutes. Avatars are created synchronously by create_avatar and are NOT polled here.
              • WORDINGlist_generationsdescription changedGenerations →
                List recent ASYNC generations in the active workspace, newest first. Avatar creation is synchronous and never appears here; this feed serves async verticals as they ship. Optionally filter by kind or state.
                List recent ASYNC generations in the active workspace, newest first (slideshow creations appear here). Avatar creation is synchronous and never appears. Optionally filter by kind or state.
              • WORDINGlist_workspacesdescription changedCore →
                List the workspaces this credential can act in, and which is active. Pass any listed id or exact name as the workspace parameter on workspace-scoped tools to act in that workspace.
                List the workspaces this credential can act in, and which is active. Each has an id, name, and stable slug. Pass any of them as the workspace parameter on workspace-scoped tools; the slug is what appears in dashboardUrl links.

              v1.1.0

              2026-07-11

              Spend attribution, workspace targeting, and a wider trait catalog. Your agent can now read the credit ledger behind the shared balance (`list_transactions`, with `mine: true` to isolate its own spend), aim any workspace-scoped tool at a specific workspace (`workspace`, by id or exact name), page through drafts, and see who created each avatar. The trait catalog gains ages 50s to 70+, gray and silver hair, traditional wear (Kurta, Sari, Sherwani, Hijab with modest outfit), Blazer, Messy tousled hair, and Gray-Blue eyes; none of these are ever rolled by the randomizer, so a "surprise me" avatar keeps the same register as before. Batch creation now samples a distinct scene per image, and every tool description was rewritten for zero ambiguity.

              • ADDEDlist_transactionsnew toolCore →
                The credit ledger behind get_credits, newest first: every charge, grant, and refund that moved the balance. Negative amount = spend. Entries made through the agent API carry attribution (which credential and client). On a shared team balance, pass mine: true to reconcile exactly what this credential spent.
              • ADDEDapprove_avataroptional param added: workspaceAvatars →
              • ADDEDcreate_avatarenum values added to traits.ageBand: 50s, 60s, 70+Avatars →
              • ADDEDcreate_avatarenum values added to traits.hairColor: Salt & Pepper, Gray, Silver, WhiteAvatars →
              • ADDEDcreate_avatarenum values added to traits.hairStyle: Messy tousledAvatars →
              • ADDEDcreate_avatarenum values added to traits.eyeColor: Gray-BlueAvatars →
              • ADDEDcreate_avatarenum values added to traits.outfitStyle: Blazer, Kurta, Sari, Sherwani, Hijab with modest outfitAvatars →
              • ADDEDcreate_avataroptional param added: workspaceAvatars →
              • ADDEDdelete_draft_avataroptional param added: workspaceAvatars →
              • ADDEDget_generationoptional param added: workspaceGenerations →
              • ADDEDlist_avatarsoptional param added: workspaceAvatars →
              • ADDEDlist_draft_avatarsoptional param added: pageAvatars →
              • ADDEDlist_draft_avatarsoptional param added: limitAvatars →
              • ADDEDlist_draft_avatarsoptional param added: workspaceAvatars →
              • ADDEDlist_generationsoptional param added: workspaceGenerations →
              • ADDEDrename_avataroptional param added: workspaceAvatars →
              • WORDINGcreate_avatardescription changedAvatars →
                Generate draft avatar(s) from appearance traits + an optional scene prompt. Returns drafts that are NOT saved to the library; the user must approve them. Any traits you omit are randomized. Costs credits per image; the result reports creditsSpent and creditsRemaining.
                Generate draft avatar(s) from appearance traits + an optional scene prompt. Returns drafts that are NOT saved to the library; the user must approve them. Any traits you omit are randomized. Costs credits per image; the result reports creditsSpent and creditsRemaining. Drafts are billed once at creation, never expire, and cost nothing to keep unapproved.
              • WORDINGcreate_avatarparam description changed: notesAvatars →
                Free-text scene / pose / mood. Anything that is NOT a fixed trait.
                Free-text scene / pose / mood. Anything that is NOT a fixed trait. Scene wishes are best effort, not guaranteed: view the returned image before presenting it.
              • WORDINGcreate_avatarparam description changed: countAvatars →
                How many draft variations to generate (default 1).
                How many draft variations to generate (default 1). Every draft in a call shares this ONE trait spec; count gives look variations of the same persona, not distinct people. For distinct personas, make one call per persona.
              • WORDINGcreate_avatarparam description changed: namesAvatars →
                A name for each draft, index-aligned with count. YOU (the AI) should pick trait-appropriate names; omit to let the server auto-name.
                A name for each draft, index-aligned with count. YOU (the AI) should pick trait-appropriate names; omit to let the server auto-name. Fewer names than count is fine: the remaining drafts get server-generated names.
              • WORDINGget_creditsdescription changedCore →
                Current spendable credit balance for this account.
                Current spendable credit balance for this account. On a team plan this is a live shared pool that teammates and their agents also draw from, so it can change between your calls; use list_transactions to attribute movements.
              • WORDINGget_medescription changedCore →
                Who am I, which workspace am I pointed at, and what does my credential allow. Call this first.
                Who am I, which workspace am I pointed at, and what does my credential allow. Call this first. credential.workspaceScope "all" means every workspace you can currently access (grantedWorkspaceIds stays empty); "listed" pins the credential to exactly grantedWorkspaceIds. Workspace-scoped tools accept a per-call workspace (id or exact name) to target any workspace within that grant.
              • WORDINGlist_draft_avatarsdescription changedAvatars →
                List draft avatars awaiting approval in the active workspace.
                List draft avatars awaiting approval in the active workspace, newest first (paginated).
              • WORDINGlist_generationsdescription changedGenerations →
                List recent generations in the active workspace, newest first. Optionally filter by kind or state.
                List recent ASYNC generations in the active workspace, newest first. Avatar creation is synchronous and never appears here; this feed serves async verticals as they ship. Optionally filter by kind or state.
              • WORDINGlist_workspacesdescription changedCore →
                List the workspaces this credential can act in, and which is active.
                List the workspaces this credential can act in, and which is active. Pass any listed id or exact name as the workspace parameter on workspace-scoped tools to act in that workspace.