Create a new AI persona with avatar, voice, language, and niche prompt. avatarUrl is REQUIRED: every persona has a face. A video without a face is a per-video choice — set options.faceless on generate_persona_video.
ParametersnamerequirednicheimagesvoiceIdrequiredlanguageavatarUrlrequiredfaceQualityvideoAspectvideoLayoutscriptPromptparagraphNumberimagePrimaryIndex
List all existing personas for the authenticated user.
Takes no parameters.
List persona voices (voiceId options): 65 English house voices, each with a text description of how it sounds plus gender/accent/kind, and your ready clones. Filter with gender, origin and search (e.g. "deep calm").
Parametersgenderoriginsearch
List per-user Chatterbox voice clones (status, voice_id when ready).
Takes no parameters.
Register a voice clone from a short HTTPS audio URL (requires explicit consent).
ParametersconsentrequireddenoiserequiredaudioUrlrequiredlanguagerequired
Get one voice clone by id: its status (poll after create_cloned_voice until ready or failed) and voice_id once ready.
ParameterscloneIdrequired
Delete one of your voice clones by id.
ParameterscloneIdrequired
Synthesize a short MP3 preview for a ready voice clone, optionally speaking your own text (returns base64 audio; 10 previews per day).
ParameterstextcloneIdrequiredlanguage
List default/stock persona faces (avatar options). Each face includes id, url, name, gender, age (single number, not a range), ethnicity, hair, and description in English so you can pick without seeing the photo. Pass a face url as avatarUrl when calling create_persona.
Takes no parameters.
Update an existing AI persona (only the provided fields change).
ParametersnamenichevoiceIdlanguageavatarUrlpersonaIdrequiredvideoAspectvideoLayoutscriptPromptparagraphNumber
List connected social accounts (YouTube, Instagram, LinkedIn, Bluesky) with the account IDs needed for posting.
Takes no parameters.
get_persona_publishing_accounts
List a persona's default publishing accounts per provider. generate_persona_video falls back to these when no account IDs are passed; explicit IDs always win.
ParameterspersonaIdrequired
set_persona_publishing_accounts
Replace a persona's default publishing accounts (per provider). Account IDs come from list_social_accounts. Providers mapped to empty arrays keep no defaults.
ParametersaccountsrequiredpersonaIdrequired
Connect a social account. For youtube/instagram/linkedin: returns an authorization URL — the user must open it in a browser and authorize, then the account connects automatically (verify with list_social_accounts). For bluesky: connects directly with handle + appPassword (app password, not the main account password).
ParametershandleproviderrequiredappPassword
List all automation schedules for the authenticated user.
Takes no parameters.
List upcoming (scheduled) and past (published/failed) posts across all connected accounts. Returns two lists: upcoming slots and recent results, each with id, slot_at, status (awaiting|generating|ready|publishing|published|failed), title, schedule_id, task_id, progress (0-100: 0 for awaiting, 100 for ready/publishing/published, live engine progress for generating, last known for failed), stage (engine pipeline stage like "lipsync" while generating, "done" when complete, null otherwise), queuePosition/queueTotal (1-based position among the schedule's awaiting+generating slots; awaiting slots only, null otherwise). Failed slots also carry error and retryable (boolean: true when the failure looks transient). Use when the user asks about their posts — what is coming next, what already went out, how far a video has generated, where it sits in the queue, or why a post failed. Combine with list_schedules or list_social_accounts when persona/account names are needed.
Parameterslimit
Cancel (delete) an automation schedule by its schedule ID. Unpublished slots (pending, generating, or ready) are removed so they cannot publish, and their prepaid tokens are refunded. A post already publishing or already published is not recalled. Use list_schedules to find the ID.
ParametersscheduleIdrequired
Get one scheduled post's full detail by slot ID: status, title, scheduled time, generation progress, its schedule (providers, publish mode) and persona. Use the slotId from list_posts.
ParametersslotIdrequired
Edit the title text of one scheduled post. Only a slot that has not started generating (status pending/awaiting) can be edited — published or mid-flight slots are rejected.
ParameterstitlerequiredslotIdrequired
Delete one scheduled post slot. Only pending (awaiting) or failed slots can be deleted; published or mid-flight slots are rejected. The schedule's last slot cannot be deleted — use cancel_schedule to delete the whole schedule instead.
ParametersslotIdrequired
List the video generation history (newest first): one row per generated video with status, error code, token refund flag, and timestamps. Use get_video_generation for one row's detail.
Parameterslimit
Get one video generation's detail by generation ID (the generationId field from list_video_generations).
ParametersgenerationIdrequired
Cancel/remove one of your video tasks on the generation engine by task id (from get_video_status, get_video_task_progress, get_post or list_posts). Only the caller's own task can be cancelled; a persona-scoped API key can only cancel tasks belonging to its personas. Unknown or already-finished tasks return an error. No token refund is issued by this call.
ParameterstaskIdrequired
Get one post's full detail by id, whichever kind it is: a scheduled slot (kind "slot") or a direct video generation (kind "generation"). The server resolves the id, so there is no need to guess between get_slot and get_video_generation. Both kinds carry live generation progress while the video is still generating.
Parametersidrequired
Get per-video performance snapshots (views, likes, comments, saves) of published posts for one window (24h or 7d), newest first, optionally filtered by persona, account, provider (network) and script angle. Returns rows plus truncated (true when more rows exist than the server cap).
Parametersanglewindowrequiredaccountpersonaprovider
List the token ledger: every token credit and debit (purchases, generation spends, refunds), newest first, with amounts, reasons, and the related generation when there is one. Use to audit where tokens went.
Parameterslimitoffset
get_persona_delete_preview
Preview what deleting a persona would remove: counts of schedules, upcoming/published/failed slots, generated videos and library images, plus per-video download links (read-only, never mutates). Call before delete_persona.
ParameterspersonaIdrequired
DESTRUCTIVE and irreversible: delete a persona with all its schedules, slots, generated videos, and image library. No token refunds — prepaid tokens for pending slots are forfeited. Call get_persona_delete_preview first.
ParameterspersonaIdrequired
Disconnect a social account by provider and account ID (the IDs from list_social_accounts). The account stops being available for publishing.
ParametersproviderrequiredproviderAccountIdrequired
Get the prepaid token wallet balance. Check before triggering video generation, which costs tokens.
Takes no parameters.
Generate and schedule ONE persona video from a complete script. Product rule: generation is always tied to publishing — one call generates the video AND schedules its automatic publish; there is no orphan generation. Send the full script as segments (first hook, then body, last CTA; 60-200 words total, body at least 30, CTA 5-20, hook 15-40 words ending with terminal punctuation) — no LLM expands it. title is the slot label for this video. Pass providers plus per-provider account IDs (see list_social_accounts), startAt (ISO datetime, wall-clock in timezone when naive), times (HH:MM, 24h), and timezone. Set mode to 'asap' to publish the video the moment its generation finishes instead of scheduling it — startAt and times must NOT be set then. The slot must be 3h-30d ahead. idempotencyKey is generated automatically; reuse it to retry without generating twice (replayed: true). Poll the slot's taskId with get_video_task_progress.
ParametersmodetimestitlerequiredoptionsstartAtlanguagesegmentsrequiredtimezonepersonaIdprovidersrequiredidempotencyKeyblueskyAccountIds+3 more
Validate a segments script mechanically, without spending tokens: hook first, CTA last, exactly one of each, no placeholders/links/markdown/emoji/stage directions, hook terminal punctuation, word limits (total 60-200, body at least 30, CTA 5-20, hook 15-40 words before TTS). Returns the word counts and the hook window (8-12 seconds spoken). Measured hook duration is pending a hook-only TTS endpoint and is reported as pending, never invented.
Parameterssegmentsrequired
Upload a local image for a video segment and get a mediaId to use in a segment's media field (generate_persona_video). The file is stored as a temporary engine asset (1 hour TTL, same flow as debug uploads): upload shortly before generating, since a scheduled slot far in the future may outlive the asset and the segment then renders without it. JPG/JPEG, PNG, or WebP only, max 8MB (the engine photo limit). The real content type is validated, not the extension. Returns only the mediaId — never a local path or asset URL.
Parameterspathrequired
Mechanically check one public image URL for a segment, without an LLM and without judging relevance (the agent, who sees the image, decides relevance). Returns exactly one code: ok, blocked_403 (the host blocked the SSRF-safe download — retry with upload_media bytes fetched on your own machine), not_image, too_small, too_large, timeout, or face_detected. No fake User-Agent or Referer is sent to bypass hotlink blocks, and private addresses are never fetched. The URL never appears in the output.
Parametersurlrequired
Check the generation status and fetch final video URLs for a taskId.
ParameterstaskIdrequired
Poll one video task for its machine-readable progress: returns {task_id, state, progress, stage, error}. error is the engine failure reason when state is -1 (failed), null otherwise. Use for the video after generate_persona_video; prefer this over get_video_status when only progress matters.
ParameterstaskIdrequired
List the image library of a persona (up to 10 tagged images). Each entry has id, tag, description, and is_primary. Use the ids with generate_persona_video options.imageId to force a specific image for the video.
ParameterspersonaIdrequired
Add an image to a persona image library from a local file path (JPG/JPEG, PNG, or WebP, max 10MB). Optional tag and description drive the deterministic per-video image selection. The server rejects full libraries (10 max).
ParameterstagpathrequiredisPrimarypersonaIdrequireddescription
Update a persona library image tag, description, or primary flag.
ParametersidrequiredtagisPrimarydescription
Remove an image from a persona image library.
Parametersidrequired
Publish a ready-made video file directly to social accounts — no generation, no schedule. Reads a local video (.mp4 or .mov, max 2GB) and posts it immediately via POST /api/upload-content. YouTube requires title, description, tags, and privacyStatus; Instagram/Bluesky/LinkedIn require caption.
ParameterstagstitlecaptionproviderrequiredvideoPathrequiredaccountIdsrequireddescriptionprivacyStatus