> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sigmora.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Changelog

> New capabilities, improvements and deprecations in the Sigmora API.

<Update label="2026-10-14" description="Footage edits: autopilot packs priced per output, and a long-source add-on" tags={["Video", "Agents", "Billing"]}>
  ## `POST /v1/video/edit`, `POST /v1/video/edit/approve`, `/v1/autopilots`

  * A source longer than 20 minutes adds one `footage-edit` unit per started
    20 minutes beyond the first: 30 minutes adds 1, 45 adds 2, 90 adds 4. The
    quote (`x-sigmora-quote-only`), the `x-sigmora-max-credits` check and the
    charge include it. It is charged with the first output and refunded with
    it if that output fails. A review-mode submit (`reviewCuts`) is charged
    at approval, add-on included.
  * A footage autopilot (`sourceClipIds`) is priced like the editor: one
    `footage-edit` unit for the long video and one for each of `shortsCount`
    shorts. A short that is not delivered is refunded when the run settles.
    The long-source add-on is charged at settlement from the length the edit
    measured.
  * The default per-run credit cap of an autopilot is now 1,500 credits, so
    the default pack fits. A cap you set is unchanged.
</Update>

<Update label="2026-10-10" description="Uploads: a Library lane, device fields, readiness on status" tags={["Assets", "Uploads"]}>
  ## `/v1/assets/upload/prepare`, `parts`, `complete`, `status`

  * `projectId` is optional on all four calls. Without it the file goes to
    your workspace Library and belongs to no project; omit it on every later
    call for that upload too (a `projectId` it does not have answers
    `404 not_found`). Success bodies return `projectId: null` for such an
    upload.
  * New optional fields for a device that uploads for you:
    * `deviceId` (`prepare`, `complete`): the device's stable id; Sigmora
      records its sync health and counts each completed file.
    * `partSize` (`prepare`): the multipart part size, 5 to 64 MiB, for a
      client that holds each part in memory.
    * `metadata` (`prepare`): up to 50 `sig.*` entries stored with the file
      (string or number values). Other keys are refused with `400`.
    * `contentFingerprint` (`prepare`, `complete`): the file's
      `sha256-8m:<hex>` fingerprint, recorded on the asset so the same file
      is understood once.
  * `status` now returns `ingestReady`, the same readiness answer `complete`
    gives, and turns it `true` once the file is stored and admitted. A
    `complete` replayed after that reports `ingestReady: true` as well.
    Before, a session that completed while the file was still being prepared
    kept `ingestReady: false`. The `complete` `202` carries
    `ingestReady: false`.
  * An image, audio or video file reads `processing` until storage has
    admitted it (metadata stripped and verified), on every call and in your
    Library; it is never reported ready before that.
  * `sizeBytes` is at most 50 GiB on `sigmora.org/api/v1` too, as on
    `api.sigmora.org`.
  * Signed-in callers (the Sigmora apps) prepare uploads under the app's own
    start limit; the API-key limit (30 per 5 minutes) is unchanged.
</Update>

<Update label="2026-10-10" description="Projects and asset doors during a release window" tags={["Projects", "Errors"]}>
  ## `/v1/projects` and `/v1/assets/{assetId}/transcript|analysis` on `api.sigmora.org`

  * While a release is rolling out, `api.sigmora.org` can briefly run ahead of
    `sigmora.org`. Listing, reading and creating projects keep working in that
    window, with `status` and `archivedAt` on every project as documented.
  * In that window, archiving or unarchiving a project (`PATCH` with `status`)
    and the two priced asset doors answer `503 upstream_unavailable` (retry later) with
    `Retry-After` and `details.reason: "web_release_pending"`. Nothing is
    changed or charged; retry after the `Retry-After` delay, once the release
    completes.
  * A create sends one media type: `kind` is still accepted as an alias of
    `mediaType`, and a `kind` that disagrees with `mediaType` is refused with
    `400 invalid_request`.
</Update>

<Update label="2026-10-10" description="UGC takes with lip-sync are priced for it; agent edits keep their pause" tags={["Video", "Agents"]}>
  ## `POST /v1/video/ugc`

  * A take that re-animates the presenter's lips (every mode except the
    HeyGen talking photo) is now priced as the render plus the lip-sync over
    its 12 seconds: 600 credits instead of 300. A talking-head take on the
    talking photo stays 300. The quote (`X-Sigmora-Quote-Only`), the
    `x-sigmora-max-credits` check and the charge all use the new price.

  ## Agent create and edit (`create_agent`, the agents API)

  * An edit by `id` that leaves `status` out keeps the agent's current status;
    it no longer turns a paused agent back on. A create without `status` still
    starts `active`.
</Update>

<Update label="2026-10-10" description="Footage edit: short length, a saved layout, and one output rule" tags={["Video"]}>
  ## `/v1/video/edit`

  * New optional `shortTargetDurationSec` (whole seconds, 15-90): the length
    of each short.
  * New optional `compositionId` + `compositionRevisionId` (send both or
    neither): lay the edited cut out on a saved project composition (its
    overlays, text and layout). The layout is read from the project; a
    revision that is no longer the latest answers `409 conflict` and nothing
    is charged.
  * New optional `settings.captionStyle`: a full caption style that overrides
    `captionPreset`.
  * When the project was promoted from an idea, every output is linked to that
    idea, as it already was in the app.
  * The app's own footage editor, Sigma's edit plans and cut approvals now run
    this capability and `/v1/video/edit/approve` themselves: the same price,
    gates and per-output charge after the engine accepted, whichever door you
    use. A request with a fractional `shortsCount` is still refused (`400`);
    the app rounds down to whole shorts before it calls.
</Update>

<Update label="2026-10-10" description="One Brand store on both hosts; dashboard Brands carry their theme profile" tags={["Brands"]}>
  ## `POST /v1/brands`, `PATCH /v1/brands/{brandId}`

  * Paths, bodies and answers are unchanged. `api.sigmora.org` now forwards
    these writes to `sigmora.org`, which owns Brands, so a Brand made through
    the API and one made in the dashboard are the same record written the
    same way. An `Idempotency-Key` is still optional; a retry with the same key
    returns the first answer (`Idempotent-Replay: true`), and the same key with
    a different body answers `409 conflict`.
  * `themeProfile` is now present on every Brand that names a niche or a
    description, including Brands made or edited in the dashboard (they used
    to read `null`, so topic discovery planned them as general). Editing the
    name, niche or description recomputes it.

  ## `POST /v1/brands/{brandId}/destinations`, `PATCH …/destinations/{destinationId}`

  * Unchanged on the wire, forwarded the same way. Attaching a destination now
    also links the Brand to that connected account, as the dashboard does, so
    a commitment made through the API publishes like one made on the Brand
    page. A stale `version` still answers `409 conflict`.
</Update>

<Update label="2026-10-10" description="Release fan support pays the artist through Stripe Connect" tags={["Billing", "Audiotool"]}>
  ## Release Planner: fan support

  * The release kit's support link is now called **Fan support**, and fans pay
    the artist: the Stripe Payment Link is created on the workspace's own
    connected Stripe account (Settings, Storefront payments; Stripe Connect
    Standard, direct charge). Sigmora takes no fee. Before this change the link
    was created on Sigmora's account.
  * A workspace without a connected Stripe account is asked to connect one;
    nothing is created until it does.
  * One link per release. It is stored with the release, so reloading the
    Release Planner shows the same link instead of creating another.
  * Each fan payment is counted once in the workspace's revenue totals.
  * This is fan support, not a streaming pre-save. Spotify pre-save is not
    offered.
</Update>

<Update label="2026-10-10" description="Brand Assistance: team review of plans and renders, and a guidance booking" tags={["Plans", "Review"]}>
  ## Brand Assistance

  * The Brand Assistance plan (and Enterprise, including workspaces that
    inherit it from their organization) now includes human review by the
    Sigmora team. In a project, open **Export** and choose **Request team
    review**: send the finished render (the team comments on it through a
    comment-enabled share link) or the plan (the project brief). The team
    replies within two business days, and the workspace owner and the member
    who asked are notified of the decision: approved, or changes requested,
    with a note.
  * A new **Brand Assistance** page in the account menu lists every review
    and its status, lets you withdraw one that is still waiting, and books
    your brand workflow guidance session. Without the plan, the page explains
    what it adds.
  * Subscribing opens a kickoff with the team automatically, once per
    subscription.
  * Workspace approvals are unchanged: a team review is advice and gates
    nothing.
</Update>

<Update label="2026-10-10" description="Finalize a draft render with POST /v1/jobs/{jobId}/finalize; render and shorts on sigmora.org forward to api.sigmora.org" tags={["Video", "Jobs", "Billing"]}>
  ## `POST /v1/jobs/{jobId}/finalize` (new)

  * Finalizes a `draft: true` render: the same video renders at full quality
    as a new `video.render` job, reusing the draft's script and narration.
    Send the draft's `projectId` in the body. Charged as one render
    (`curriculum-render`); the draft keeps its own charge.
  * The same `Idempotency-Key` returns the same final job and is never
    charged twice; a new key is a new render. A job that is not a draft
    answers `409 conflict`; a job that is not yours, or another project,
    answers `404 not_found`. A failed final render is refunded.
  * MCP: `video_render_finalize`.

  ## `/v1/video/render`, `/v1/video/shorts`

  * On `sigmora.org` both now forward to `api.sigmora.org`, which prices,
    limits and charges them and owns the render's job record. Prices and
    units are unchanged. Jobs submitted on either host are polled, cancelled
    and refunded through `GET /v1/jobs/{jobId}` on either host.
  * One request body on both hosts. `sigmora.org` now also accepts
    `package`; `api.sigmora.org` now also accepts `domain: "stories"` with
    `story` (a story), a `ttsModel` without `ttsProvider` (Speechify's), a
    padded `videoId` (trimmed) and `maxPerPlatform` as a numeric string.
  * Changed on `sigmora.org`: a `story` render with no `quality` now
    defaults to `h`, and `/v1/video/shorts` refuses a `platforms` entry
    outside `tiktok`, `reels`, `shorts`, `twitter` with `400` (the render
    service never accepted others).
  * New on `api.sigmora.org`: hourly quotas, the ones `sigmora.org` already
    applied. `video.render` 20 an hour, `video.shorts` 30 an hour.
</Update>

<Update label="2026-10-10" description="Concurrent calls can no longer overspend a budget; research doors answer the standard error envelope" tags={["Billing", "Errors", "Research"]}>
  ## Budget caps

  * Concurrent calls can no longer overspend a budget. A metered call now
    reserves its price against every budget cap that covers you before any
    work starts, on `sigmora.org` and `api.sigmora.org` alike; a second call
    that would pass the cap while the first is still running is refused with
    `402 budget_capped` and is not charged. The reservation becomes the
    charge when the work is billed, and is given back when the call fails or
    is refused. Retrying with the same `Idempotency-Key` never reserves twice.
  * `details.spent` on a `budget_capped` refusal now includes credits held by
    your calls that are still running.

  ## Research doors

  * `/v1/hooks`, `/v1/discovery/*`, `/v1/topic-monitors/*`,
    `/v1/research/briefs`, `/v1/brands`, `/v1/creators/{id}/outliers` and
    `/v1/video/analyze` / `/v1/video/analyses/{id}` on `sigmora.org` now
    answer refusals in the standard envelope,
    `{ "error": { "code", "message", "details" } }`, instead of a flat
    `{ "error": "<message>", "code" }`. Branch on `error.code`.
  * Their own request limit answers `429` with `error.code: "rate_limited"`.
</Update>

<Update label="2026-10-10" description="Asset reads check your edit access; moments, music and 3D quotas on api.sigmora.org" tags={["Assets", "Video", "Audio", "3D", "Errors"]}>
  ## Reading an asset by `assetId`

  * `/v1/video/moments`, `/v1/text/localize` and `/v1/image/thumbnail`
    (`assetId` and `source.assetId`) read an asset only if the member behind
    the call may edit it: the key's owner, or the signed-in member on
    `sigmora.org` and MCP. An asset in a project that member cannot see is
    answered exactly like a missing one, `404 not_found`, on both hosts and
    every credential, before anything is run or charged. A missing asset,
    another workspace's asset and one not yet transcribed get the same answer.
  * Changed: `/v1/image/thumbnail` with an API key used to refuse such a
    `source.assetId` with `403 forbidden`; it is now `404 not_found`.
  * If the access check cannot be answered, the call is refused with
    `503 upstream_unavailable` and nothing is charged; retry shortly.

  ## `/v1/video/moments`, `/v1/audio/music`

  * On `sigmora.org` both now forward to `api.sigmora.org`, which prices,
    limits and charges them. Prices, units and request bodies are unchanged.
  * The `sigmora.org` `/v1/audio/music` response's `music` object now carries
    only the four documented fields: `url`, `contentId`, `durationSec` and
    `fileName`. It no longer echoes `success` or `prompts`.
  * New on `api.sigmora.org`: hourly quotas, the ones `sigmora.org` already
    applied. `video.moments` 60 an hour, `audio.music` 30 an hour. Past the
    bound a call answers `429 rate_limited` and is not charged.
  * `/v1/video/moments` with `assetId` now returns `reused` on
    `api.sigmora.org` too: which indexed transcript was scored, how many cues
    and when it was captured.
  * Fixed: on `api.sigmora.org`, `/v1/text/localize` with `assetId` failed
    with a 500 error before anything ran or was charged (a quote worked);
    it now translates the indexed transcript.

  ## `/v1/3d/from-text`, `/v1/3d/from-image`

  * New on `api.sigmora.org`: 10 calls an hour per capability, the bound
    `sigmora.org` applies. Past it a call answers `429 rate_limited` and is not
    charged.
</Update>

<Update label="2026-10-10" description="Pausing an autopilot stops a run that is already going" tags={["Autopilot"]}>
  ## `/v1/autopilots/{brandId}` and `/v1/autopilot-runs`

  * Setting `"enabled": false` on a Brand autopilot now stops its run in
    progress before the next step, not only the next run. Pause stops spending
    the same way the Governance kill switch does. The run ends `capped` with
    the reason on its last step: `output: { "kind": "run-stop", "reason":
    "disabled" }` (or `"killed"` for the kill switch). The credits it had not
    used are refunded as for any capped run. Resume with `"enabled": true`,
    then start a new run.
  * If the engine cannot read whether the autopilot may continue, it does not
    start a paid step. It waits and asks again, and if the answer never comes
    the run ends `capped` with reason `"unavailable"`, without spending.
  * Scheduled posts from autopilots check every post already scheduled in
    their time window before picking a slot, however many a workspace has
    queued.
</Update>

<Update label="2026-10-10" description="Install instructions for all 11 agent hosts" tags={["MCP", "Docs"]}>
  * [MCP server](/mcp-server#install-in-your-agent) now has an **Install in
    your agent** section for each host the Sigmora agent kit supports: Codex,
    Claude Code, OpenCode, Antigravity, Qwen Code, Kimi Code CLI, DeepSeek
    Harness, ZCode, CodeBuddy, Cursor and Gemini CLI, plus ChatGPT. Each shows
    the configuration exactly as the kit ships it and where it goes. The
    kit's `install` and `doctor --network` commands appear there once the kit
    is published.
  * Codex is shown as TOML for your user config (`~/.codex/config.toml`), with
    the plugin's own `.mcp.json` labelled separately. The connect examples read
    the key from `SIGMORA_API_KEY` instead of showing it inline.
  * The agent kit is not published yet. Until it is, paste the
    configuration for your host; `sigmora upload` and the plugin
    marketplaces work once it is published.
  * [sigmora.org/plugins](https://sigmora.org/plugins) shows the same
    configuration for every host, and it and
    [sigmora.org/chatgpt](https://sigmora.org/chatgpt) are now in Spanish and
    Hindi too.
</Update>

<Update label="2026-10-10" description="The agent kit is ready to publish as a plugin marketplace" tags={["Integrations"]}>
  ## Sigmora agent kit

  * The agent kit (`@sigmora/agent-kit`) is now a plugin marketplace for
    Claude Code and Codex: once its public repository is live, add it with
    `/plugin marketplace add` and install `sigmora@sigmora`. It is not
    published yet.
  * It will publish to npm from that public repository with a provenance
    statement.
  * The Codex, Claude Code, ZCode and Antigravity manifests now share one
    name, version, color and icon set. The Antigravity bundle has a
    description and an icon.
  * `sigmora uninstall` now leaves a host's config file as it was before
    `sigmora install`. It no longer leaves an empty `mcpServers` block behind.
  * Antigravity, Qwen Code, Cursor and Gemini CLI sign in with OAuth today.
    The kit's README no longer says they have to wait.
</Update>

<Update label="2026-10-10" description="ChatGPT: a card on every result, Apply and Undo" tags={["ChatGPT", "MCP"]}>
  * In ChatGPT, every Sigmora tool except `playbook_get` now answers with the
    inline card. New in the card: a proposed edit from the `edit_` tools with
    **Apply** (`sigma_apply`, free) and then **Undo** (`sigma_revert`); lists of
    projects, media, connected accounts, hooks and creator outliers; a timed
    transcript excerpt; and upload status. A paid step still only runs from the
    card after its quote. The card resource is now `ui://sigmora/card-v2.html`.
  * The ChatGPT copy for `video_edit` now says what it is for: a finished,
    rendered file. Removing ums, tightening pauses, adding captions or trimming
    to a length in a project goes to the free `edit_` tools and `sigma_apply`.
    See [Sigmora in ChatGPT](/chatgpt).
  * ChatGPT applies or drops each proposed edit before it asks for the next; an
    out-of-date proposal now tells it to call the same `edit_` tool again, and
    the card says to propose the edit again. `ui://sigmora/card-v1.html` still
    reads as the v2 card for one release.
</Update>

<Update label="2026-10-10" description="One page for the automation connectors" tags={["Integrations"]}>
  ## Automation platforms

  * New guide: [Automation platforms](/automation) has install steps for n8n,
    Zapier, Make, Pipedream and Power Automate, each with its listing status.
    None is in its platform's public directory yet; Power Automate works today
    by importing the connector file from
    `https://sigmora.org/kit/sigmora-power-automate.swagger.json`.
  * In the app, **Settings → Integrations** lists each connector with its
    install steps and a link to its section of the guide, and will link the
    directory listing once it is live.
  * The n8n community node (`n8n-nodes-sigmora`) will publish from its public
    repository, `mlsniperpro/n8n-nodes-sigmora`, with an npm provenance
    statement.
</Update>

<Update label="2026-10-10" description="The Sigma skill and the developer files install from sigmora.org" tags={["Integrations", "Docs"]}>
  * The [agent skill](/agent-skill) installs with
    `npx skills add https://sigmora.org/kit/sigmora-skill.zip`, or by unzipping
    that archive into your agent's skills folder. The old install line pointed
    at a repository you could not reach.
  * The [chess video client](/chess-video-api) downloads from
    `https://sigmora.org/kit/chess-video.mjs`, and the Power Automate connector
    definition from
    `https://sigmora.org/kit/sigmora-power-automate.swagger.json`.
  * The skill and the Sigmora agent kit are MIT licensed.
  * The Claude Code, Codex and ZCode plugins load only the seven playbooks and
    the `sigmora-media` skill. This API-key skill installs on its own and never
    comes with a plugin install.
</Update>

<Update label="2026-10-10" description="Brand rules on adapt; the writing capabilities return their text" tags={["Text"]}>
  ## `/v1/text/adapt`

  * New optional `brandContext` (up to 12,000 characters): your brand's voice,
    audience, claims and words to avoid. The adaptation follows it; it is
    never treated as the source.

  ## `/v1/text/copywrite`, `research`, `paraphrase`, `questions`, `solve`, `film`

  * Fixed: on `api.sigmora.org` (and on `sigmora.org`, which forwards to it)
    these answered `502 upstream_error` after the writer had run; nothing was
    charged. They now return the text: `copy`, `research`, `paraphrase`,
    `questions`, `solution` and `outline` are objects with the text under
    `result`, plus the `platform` or `domain` the call named.

  ## Internal

  * Sigmora's own first-party tools (the content studio, the browser
    extension, comment replies, the brief form) run these capabilities and
    plain AI thumbnails without a project, on a channel that is internal to
    Sigmora. It is not available to API keys: every call you make still
    requires `projectId`, and an API-key call carrying Sigmora's internal
    project-scope marker is refused with `403 forbidden`. Because of it,
    `projectId` in a success body is marked optional in the reference; on a
    call made with an API key it is always present.
</Update>

<Update label="2026-10-10" description="Thumbnails are quota'd and priced per image; a withheld remix says so" tags={["Image", "Remix", "Errors"]}>
  ## `/v1/image/thumbnail`

  * The hourly quota counts images, not calls: a call with `variants: 4` uses
    four of the 60 an hour (`THUMBNAIL_LIMIT_PER_HOUR`). A call that would
    pass the bound is refused with `429 rate_limited` and is not charged.
  * The catalogue (`GET /v1/capabilities`, the MCP tool description and
    `llms.txt`) publishes the price per image, as it is charged.
  * With an `sk_live_`/`sk_test_` key on `api.sigmora.org`, `source.assetId`
    must name a video you may edit: one in a project you cannot see is
    refused with `403 forbidden` before anything is made or charged, as on
    `sigmora.org`.
  * On `sigmora.org/api/v1/image/thumbnail` every image made is also saved to
    the project the call named, so it is in that project's media.

  ## `/v1/video/remix`

  * A script that `verify: true` did not clear now answers
    `422 content_not_cleared` instead of `400 invalid_request`.
    `details.gate` carries the `decision` (`killed` or `escalated`), the
    fact-check `reportId` and `reasons`; no script is returned and nothing is
    charged. Retrying with the same `Idempotency-Key` returns the same answer.
  * `content_not_cleared` is a new error code (422, not retryable as-is).
</Update>

<Update label="2026-10-10" description="Transcribe and analyze an asset; one project store on both hosts" tags={["Assets", "Projects", "MCP"]}>
  ## `POST /v1/assets/{assetId}/transcript`

  * New. Transcribes an asset in your project into the `formats` you ask for.
    `instruction` rewrites the transcript in plain words (an ElevenLabs Scribe
    transcript edit, +30%) and returns it as `result.editedTranscript`; where
    Scribe is not configured it is refused with `invalid_request`. Requires an
    `Idempotency-Key`; quote it with `X-Sigmora-Quote-Only: 1`, since the price
    is held from the asset's measured length. MCP: `assets_transcribe`.

  ## `POST /v1/assets/{assetId}/analysis`

  * New. A retention analysis of an asset, answered with a `media.analysis`
    `jobId` to poll at `GET /v1/jobs/{jobId}`. Requires an `Idempotency-Key`.
    MCP: `assets_analyze`.

  ## `/v1/projects`

  * `api.sigmora.org` now answers projects from the same store as
    `sigmora.org`, so both hosts list, read and change the same projects.
  * New: `DELETE /v1/projects/{projectId}` on `api.sigmora.org` (it existed on
    `sigmora.org`). Irreversible; archive with `PATCH` `status: "archived"` to
    hide a project reversibly.
  * `PATCH` takes `visibility` (owner only) beside `title` and `status`, and
    `GET /v1/projects` takes `view=shared`. On `sigmora.org`, `GET` takes
    `status` (default `active`, so archived projects are hidden), `PATCH` takes
    `status`, and `POST` accepts `kind` and an omitted media type (an audio
    project), as `api.sigmora.org` always has.
  * Every project carries `status` and `archivedAt`; `GET /v1/projects/{projectId}`
    on `api.sigmora.org` adds `itemCount` and `items`.
  * A `nextCursor` from `GET /v1/projects` issued before this change is refused
    with `invalid_request`: list again from the first page. A project-create
    retry that was first sent before this change is treated as a new request.
</Update>

<Update label="2026-10-10" description="Thumbnails with words, variants and video frames; remix with brand rules and a fact-check" tags={["Image", "Remix"]}>
  ## `/v1/image/thumbnail`

  * `headline` lays words on the thumbnail. Without it the image is unchanged:
    no text, as before.
  * `variants` (1 to 4) makes several images in one call, each priced as one
    thumbnail. The answer lists them in `thumbnail.variants`, each with a
    `previewUrl`; `thumbnail.url` is the first.
  * `palette` and `fontFamily` style the headline in your brand.
  * `source` makes the thumbnail from a frame of your own video (`assetId` or
    `videoUrl`, optional `atSeconds`) instead of generating an image. One
    image per call.
  * 9:16 platforms (`youtube_shorts`, `instagram_reels`, `tiktok`) get a
    1080×1920 image with the words placed for a vertical cover.
  * The quota of 60 thumbnail calls an hour applies on `api.sigmora.org` too.
  * On `sigmora.org/api/v1/image/thumbnail` the body is the same as on
    `api.sigmora.org`: `title` is at most 200 characters, `subject` 300,
    `transcript` 3,000 and `description` 500 (the narrower limits the engine
    always enforced). A paid call sent without an `Idempotency-Key` is given
    one, returned in the `Idempotency-Key` response header.

  ## `/v1/video/remix`

  * `brandContext` gives the writer your brand's rules.
  * `verify: true` fact-checks the finished script before it is returned and
    adds `gate` (`decision`, and `patchedScript` for a corrected pass). A
    script whose hook or thesis cannot be verified is withheld and nothing is
    charged. Where web search is not configured the script is returned with
    `gate.decision: "unchecked"` and a `warning`.
</Update>

<Update label="2026-10-10" description="Member budgets count API and MCP spend" tags={["Billing", "Text", "Remix"]}>
  ## Member budget caps count every host

  * A member's monthly budget now counts what they spend through
    `api.sigmora.org`, through `sigmora.org/api/v1` text tools and remix, and
    through MCP. Those charges are recorded under the member who made the call
    (the API key's owner, or the signed-in member), and a refund of a failed
    job gives the spend back in the same budget. Before, they counted toward
    no member's cap, only the workspace balance.
  * On `sigmora.org/api/v1` (text tools, remix, `video/analyze`) and MCP, a
    quote (`X-Sigmora-Quote-Only: 1`) now reports `budgetCapped: true` when the
    member is at their cap; it always said `false`.
  * A retry with the same `Idempotency-Key` of a call that already completed
    returns that result even when the call took the member to their cap.
    Before, the retry answered `402 budget_capped`.

  ## A paid `sigmora.org/api/v1` call is always recoverable

  * A paid text or remix call sent without an `Idempotency-Key` is given one.
    It comes back in the `Idempotency-Key` response header. If the work
    outlasts the wait, the `503 upstream_unavailable` names the key in
    `error.details.idempotencyKey`: retry with it to collect the result, which
    is never charged twice. `video/analyze` still requires you to send an
    `Idempotency-Key` (`400 invalid_request` without one).

  ## Per-capability quotas: who shares a bucket

  * Each API key keeps its own hourly quota, and so does each connected MCP or
    ChatGPT client (its OAuth token), as on `sigmora.org/api/v1` before. The
    signed-in members of a workspace share one bucket.
  * Every paid call counts toward the workspace ceiling of five buckets,
    signed-in members included. Before, members' calls were outside it, so a
    workspace could do six times the quota.

  ## Text and remix errors on `sigmora.org/api/v1`

  * A `400 invalid_request` keeps the `details` shape `sigmora.org` has always
    published: `{ formErrors, fieldErrors }`, keyed by the top-level field.
  * A refusal from `api.sigmora.org`, a `400 invalid_request` included, now
    carries `requestId` beside `error` (and the `x-request-id` header):
    include it when you contact support. A refusal `sigmora.org` gives before
    it calls `api.sigmora.org` (sign-in, role, a missing `Idempotency-Key`)
    has none.

  ## MCP text tools describe what they accept

  * The MCP tools for the text capabilities and remix now publish the same
    request schema `api.sigmora.org` enforces: `text_research` lists its
    `domain` and `outputFormat` values, `text_solve` its `domain` and
    `difficulty`, `text_film` its `genre` and `format`. Before, the tools said
    any string, and a value outside the list answered `400`.
</Update>

<Update label="2026-10-10" description="Narrated render: one rule for renderer and course options on both hosts" tags={["Video"]}>
  ## `POST /v1/video/render`

  * `sigmora.org/api` and `api.sigmora.org` now answer `renderer`,
    `visionRefine`, `offlineSlots` and the course workflow fields with the same
    rule: `renderer` only for a story render (`domain: "stories"`, or `story`
    with `videoType: "story"`), `visionRefine: true` only with
    `renderer: "blender"` on a story render, no `offlineSlots` with Blender,
    and `courseWorkflowId` with `courseWorkflowVersion`.
  * `courseVideoArchetype` and `courseVideoTemplateId` no longer need a
    `courseWorkflowId`; only `courseCapabilities` does, as the render engine
    rules. A course render naming an archetype or template alone used to
    answer `400`.
  * `visionRefine: false` on a render that is not a Blender story is accepted
    on `api.sigmora.org` too (it was refused there and accepted here).
</Update>

<Update label="2026-10-10" description="Per-capability quotas, copywrite values, one text and remix contract, the full UGC body" tags={["Text", "Remix", "UGC", "Limits"]}>
  ## Per-capability hourly quotas on `api.sigmora.org`

  * The text tools and remix now carry their own hourly quota on the API host,
    the same numbers `sigmora.org/api/v1` enforced: `text/script` and
    `video/remix` 10 an hour, `text/localize` 20, `text/article` and
    `text/packaging` 30, the other text tools 60. The quota is per API key
    (per workspace for a signed-in session), and a workspace may do five times
    one key's quota. Past it the call answers `429 rate_limited` with
    `Retry-After`. A quote (`X-Sigmora-Quote-Only: 1`) and an
    `Idempotency-Key` replay of a call already made never count.

  ## `POST /v1/text/copywrite` accepts only values the writer takes

  * `platform` is one of `twitter`, `twitter-x`, `x` (the same platform as
    `twitter-x`), `medium`, `reddit`, `linkedin`, `youtube`,
    `binance-square`, `facebook`, `instagram`, `tiktok`, `threads`.
  * `tone` is one of `professional`, `casual`, `humorous`, `inspirational`,
    `educational`.
  * Anything else answers `400 invalid_request` at the door and is not
    charged. Those values always failed after the balance check; `x` now
    works. The old examples (`plain`, `wry`, `authoritative`) are corrected.

  ## One contract for text tools and remix on both hosts

  * `sigmora.org/api/v1/text/*` and `/v1/video/remix` now forward to
    `api.sigmora.org`, so both hosts answer with the published response:
    successes also carry `credits` and `creditBalance`, and the tool's result
    is the published object (for example `copy` is the post itself, not a
    wrapper with `usage` and `model`; `text/packaging` returns the package).
    Errors keep the `sigmora.org` envelope.
  * `text/localize` called with `assetId` reports `reused`: the indexed
    transcript it priced and ran against, its cue count and when it was
    captured.

  ## `POST /v1/video/ugc` publishes the full body

  * The reference now shows `mode` (`generate`, `talking-avatar`,
    `source-performance`) and the source-performance fields (`sourceVideo`,
    `sourceAssetId`, `sourceUse`, `sourceWindow`, `sourcePerformerRights`,
    `sourceRightsholderRights`). `api.sigmora.org` checks them before the work
    starts, with the same rules `sigmora.org` applies.
</Update>

<Update label="2026-10-10" description="Narrated render: stories renderer and drafts" tags={["Video"]}>
  ## `POST /v1/video/render` on `sigmora.org/api`

  * `renderer` (and `visionRefine` with `renderer: "blender"`) is accepted for
    a `stories` catalogue `videoId`, as the render engine allows. Before, only
    submitted `story` prose could name a renderer, and a catalogue story with
    one answered `400`.
  * A `draft: true` render is now recorded as a draft: its completion callback
    reports `draft: true`, and the release check meant for a full-quality
    render no longer runs on the review copy. Finalize a draft as before, by
    submitting the same source and controls with `draft: false`.
</Update>

<Update label="2026-10-10" description="Engine capability list matches what a key can call; discovery refreshes every 30 minutes, paced across the day" tags={["Capabilities", "MCP", "Discovery"]}>
  ## Four uncallable engine capabilities removed

  * `GET /v1/capabilities` (`engines.autopilot.capabilities`) and the MCP tool
    `capabilities_list` no longer list `video.edit`, `video.subtitles`,
    `audio.tts` or `text.event_kit`. Each pointed at an internal engine route
    that refuses API keys, so no integration could call it. The published
    operations (`operations`, including `POST /v1/video/edit`) are unchanged.
  * The event kit returns to the list when it has a door you can call.

  ## Discovery refreshes run every 30 minutes, paced across the day

  * Scheduled metric refreshes now have their own 30-minute pass, so a
    discovery plan's `refreshIntervalMinutes` (default 60) can run down to 30
    minutes. Before, refreshes ran only with the 6-hour discovery pass.
  * Scheduled runs are bounded per UTC day across all plans: by default 96
    refreshes (plans on the same primary theme share one) and 32 discoveries.
    The bound is spread over the day, an even share of what is left per pass
    (2 refreshes every 30 minutes, 8 discoveries every 6 hours), so it is never
    spent in the first hours. Up to 4 themes keep the 60-minute default and up
    to 24 themes are each refreshed at least every 6 hours; past that, plans
    take turns oldest first.
  * `discoveryIntervalMinutes` keeps its 6-hour floor. `POST /v1/discovery/runs`
    still runs one immediately.
</Update>

<Update label="2026-10-09" description="Project review on the API host, and Revise" tags={["Projects", "Editing", "Pagination"]}>
  ## Review a project from `api.sigmora.org`

  * Five project review operations now answer on `api.sigmora.org`; before,
    only the web host served them and the API host answered `404`:
    `GET /v1/projects/{projectId}/transcript` (the composition's transcript,
    playback media and review notes),
    `POST /v1/projects/{projectId}/transcript` (correct a word, cut words or
    restore them),
    `GET /v1/projects/{projectId}/comments` and
    `POST /v1/projects/{projectId}/comments` (review notes), and
    `POST /v1/projects/{projectId}/share` (a finished render's watch link).
  * The transcript read is paged by words: `wordLimit` (default 1000) words
    per page, `wordsNextCursor` sent back as `wordCursor`, pages merged by
    `assetId`. A cursor from before the composition changed answers
    `409 conflict` (`details.reason` `stale_cursor`); read again from the first
    page. Review notes page with `cursor` and `nextCursor`. See
    [Pagination](/pagination).

  ## Revise a rendered cut

  * `POST /v1/video/edit/approve` accepts `expectedGeneration` to re-cut an
    already rendered edit: send the revision you are re-cutting (`0` after the
    first approval) and omit it for the first approval.
  * `GET /v1/jobs/{jobId}/proposal` now also serves an approved proposal whose
    render finished, with `status: "approved"` (new enum value next to
    `awaiting_review`) and the new field `proposal.generation`. Send that
    number as `expectedGeneration`, only when `status` is `approved`.
  * A stale `expectedGeneration` (a revise that raced another approval)
    answers `409 conflict` with `details.currentGeneration`, and is not
    charged. A cancelled cut, or one whose render is not ready (still running,
    or failed), answers `400` before any charge.
</Update>

<Update label="2026-10-09" description="A paused autopilot stops manual runs too" tags={["Autopilot"]}>
  ## `enabled: false` pauses manual runs, approvals and retries

  * **Breaking:** while a Brand's autopilot is paused (`enabled: false` on
    `PUT /v1/autopilots/{brandId}`), `POST /v1/autopilot-runs` answers
    `409 conflict` instead of starting a manual run, and
    `POST /v1/autopilot-runs/{runId}/approve` and
    `POST /v1/autopilot-runs/{runId}/retry` for its runs answer `409 conflict`
    too; a waiting checkpoint keeps waiting. Before this change `enabled` paused
    only scheduled runs. An autopilot saved without `enabled` is paused
    (`false` is the default), so an integration that only starts runs itself
    now sets `{"enabled": true}` once.
  * The same three calls answer `409 conflict` while the workspace's Governance
    kill switch is on, and `503 upstream_unavailable` while its Governance
    policy cannot be read; retry the same request.
</Update>

<Update label="2026-10-09" description="Governance lock on agent settings" tags={["Autopilot", "Reddit"]}>
  ## Locked workspaces: only owners change agent settings

  * When a workspace's Governance settings lock agent configuration,
    `POST /v1/reddit-campaigns`, `PATCH /v1/reddit-campaigns/{campaignId}` and
    `PUT /v1/autopilots/{brandId}` answer `403 forbidden` for a key whose creator
    is not an owner (or an admin of the workspace's organization). Pausing or completing a campaign (`{"status":"paused"}` or
    `{"status":"completed"}`) and pausing an existing autopilot
    (`{"enabled":false}`) stay open to `editor` keys.
  * If the lock cannot be checked, these calls answer `503 upstream_unavailable`;
    retry with the same request.
</Update>

<Update label="2026-10-09" description="Remix pricing and source length" tags={["Video", "Pricing"]}>
  ## `POST /v1/video/remix` is priced by the work, and `url` sources have a length limit

  * With any `url` source, a remix is one video analysis (`video-analysis`, 150
    credits) per `url` source. From transcripts alone it is one script
    (`script`, 100 credits), or one scene plan (`scene-plan`, 50 credits) when
    `outputFormat` is `scenes`. See [Pricing & credits](/pricing).
  * **Breaking:** each `url` source is analyzed up to 180 seconds. A longer
    video is refused with an error before anything is charged; before this
    change it was accepted. Trim the video, or send its text as a `transcript`
    source, which has no length limit beyond the request size.
  * `POST /v1/agent/runs` checks `maxCredits` against each step's price for its
    planned arguments, so a remix with several `url` sources is capped before
    it runs instead of being charged past the bound.
  * `PUT /v1/autopilots/{brandId}`: an omitted `maxVideosPerDay` means 3
    and an omitted `maxPostsPerDay` means 12, for autopilots saved before this
    change too.
</Update>

<Update label="2026-10-06" description="Reference and conventions" tags={["API reference", "Pagination", "Docs"]}>
  ## A reorganized API reference

  * The [API reference](/api-reference/meta/capabilities-and-prices) is grouped
    into sections by what you are building — Projects, Assets, Jobs, Text, Video,
    UGC, Editing, 3D, Image, Audio, Publishing, Webhooks, Workflows, Agents,
    Research, Discovery and more — with short, consistent operation titles. Old
    reference URLs redirect to their new pages.
  * Core objects are published as named schemas — `Job`, `JobArtifacts`,
    `Project`, `Brand`, `Product`, `Campaign`, `Capability`, `Theme`, `Trend` and
    others — so generated clients get named types. See
    [Client libraries](/sdks#generate-a-typed-client).
  * Each operation lists only the error statuses it can return, and request
    bodies include working examples.

  ## Cursor pagination everywhere

  List endpoints now share one convention: `limit` and `cursor` in, `nextCursor`
  out (`null` on the last page). `GET /v1/assets` and variation batches accept
  `cursor`; their `after` / `nextAfter` spellings and the `offset` parameter on
  `GET /v1/video/catalog/{domain}` are deprecated and keep working. See
  [Pagination](/pagination).

  ## Fixes

  * `PATCH /v1/campaigns/{campaignId}` and `PATCH /v1/reddit-campaigns/{campaignId}`
    change only the fields you send. A partial update such as
    `{"status": "paused"}` previously also reset unsent fields — description,
    connected accounts, platforms, schedule and Reddit caps — to their creation
    defaults.
  * `POST /v1/workflow/context-snapshots` accepts a body without
    `retrievedPassages` or `exclusions`, as documented; both default to `[]`.
  * `POST /v1/video/footage` refuses a live price above `maxCredits` with the
    documented `409 conflict` code instead of an undocumented `price_changed`.
  * Error bodies document `requestId` and `timestamp`.

  ## New guides

  [Rate limits](/rate-limits), [Pagination](/pagination),
  [Versioning](/versioning), [Pricing & credits](/pricing) and this changelog. The
  [Errors](/errors) page now documents the response envelope exactly as the API
  returns it: `{"success": false, "error": "...", "code": "..."}`.
</Update>

<Update label="2026-10-05" description="Proven content" tags={["Research", "Discovery"]}>
  * **Watched accounts:** list and read the accounts you watch with their usual
    reach and proven hits, and [measure one now](/api-reference/watchlist/measure-watched-account).
  * **Channel performance:** [read your connected channels' uploads](/api-reference/performance/channel-performance)
    with a diagnosis for each, and [propose a change to a live video](/api-reference/performance/propose-live-video-edit)
    that you approve before it applies.
  * **Niche corpus:** [`GET /v1/discovery/configs/{brandId}/corpus`](/api-reference/discovery/niche-corpus)
    returns what is performing in a Brand's niche.
  * **Variation batches** of a proven format are available on `api.sigmora.org`
    under Projects.
  * Discovery adds Facebook video as the `facebook_reels` platform.
</Update>

<Update label="2026-10-02" description="UGC Studio and AI creators" tags={["UGC", "MCP"]}>
  * [Make a UGC frame](/api-reference/ugc/make-a-ugc-frame) — a vertical still of
    a presenter with your product — then [animate it](/api-reference/ugc/animate-a-ugc-frame)
    once it is approved.
  * Create AI creators: [generate candidate faces](/api-reference/ugc/generate-creator-faces),
    [save a creator](/api-reference/ugc/create-ai-creator) with an identity kit,
    and [design its voice](/api-reference/ugc/design-creator-voices).
  * These operations support quoting before you spend with the
    `x-sigmora-quote-only` and `x-sigmora-max-credits` headers. See
    [Pricing & credits](/pricing#get-a-quote-before-you-run).
  * A retried call reports only the credits it actually charged.
</Update>

<Update label="2026-09-30" description="ChatGPT, granular edits and the agent skill" tags={["Integrations", "Editing"]}>
  * [Sigmora in ChatGPT](/chatgpt): connect with OAuth — no API key — and edit,
    caption and schedule video from the chat.
  * Granular edit operations — [cut ranges](/api-reference/editing/cut-ranges),
    [remove filler words](/api-reference/editing/remove-filler-words),
    [tighten pauses](/api-reference/editing/tighten-pauses),
    [trim to length](/api-reference/editing/trim-to-length),
    [add captions](/api-reference/editing/add-captions) and
    [place B-roll](/api-reference/editing/place-b-roll) — return reviewable
    proposals you apply or revert.
  * The [agent skill](/agent-skill) lets Claude Code, Codex and Cursor work with
    Sigma using your API key.
</Update>

<Update label="2026-09-29" description="Sigma over the API" tags={["Editing"]}>
  * [`POST /v1/sigma/turns`](/api-reference/editing/send-a-turn) sends a message
    to Sigma, the co-editor, from your own code. Edits come back as signed
    proposals; [apply](/api-reference/editing/apply-a-proposed-edit) or
    [revert](/api-reference/editing/revert-edits) them.
  * Paid work Sigma proposes is approved with
    [`POST /v1/sigma/approvals`](/api-reference/editing/approve-paid-work), from
    any door, and runs once.
</Update>

<Update label="2026-09-28" description="Errors and voices" tags={["Errors", "Video"]}>
  * `upstream_error` now answers with HTTP `500` instead of `502`, so the JSON
    error body reaches your client intact. The `code` is unchanged.
  * `eleven_v4` is the ElevenLabs narration model for `ttsModel`.
</Update>

<Update label="2026-09-27" description="Audio engineering" tags={["Audio"]}>
  * [Engineer audio](/api-reference/audio/engineer-audio) in plain words inside a
    connected Audiotool project — compose, arrange, mix and bounce — and split
    audio into stems, with free undo.
</Update>

<Update label="2026-09-20" description="Topic monitoring" tags={["Discovery"]}>
  * Topic monitors watch a Brand's niche on a schedule:
    [save a monitor](/api-reference/discovery/save-topic-monitor), run it, and
    read its discoveries and source health.
</Update>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.