> ## 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.

# Make a video

> Make a video from a prompt in one call: planned, narrated and rendered. Answers at once with one `jobId`; poll GET /v1/jobs/{jobId} through `queued`, `planning`, `awaiting_user_input` (with `review: "plan"`, answered by POST /v1/video/create/{jobId}/followups), `rendering`, then `done` with `output.downloadUrl` and `sources[]`, or `failed`. Calls beyond the render capacity wait their turn; none is refused for being busy. The render is charged only when the renderer accepts it and refunded if it fails. Quote first with X-Sigmora-Quote-Only.



## OpenAPI

````yaml /openapi.json post /v1/video/create
openapi: 3.1.0
info:
  title: Sigmora API
  version: 1.0.0
  description: >-
    The priced, versioned public API. Every call authenticates with a workspace
    API key (`Authorization: Bearer sk_live_…`), names the project it files its
    output under, and reports what it cost. `GET /v1/capabilities` answers what
    this deployment can serve right now and at what price; anything it reports
    as unavailable answers 503 `capability_unavailable` rather than 404.
servers:
  - url: https://api.sigmora.org
security:
  - bearerAuth: []
tags:
  - name: Meta
    description: What this deployment serves, what it costs, and what you have spent.
  - name: Projects
    description: The container every capability files its output under.
  - name: Sessions
    description: Durable bindings between an external harness session and one project.
  - name: Assets
    description: 'Project media: direct-to-storage uploads, imports, ingest and transcripts.'
  - name: Jobs
    description: Where every asynchronous capability is collected, whatever produced it.
  - name: Text
    description: Scripts, research, articles, translation and question sets.
  - name: Video
    description: Narrated renders, footage edits, shorts and moment selection.
  - name: UGC
    description: >-
      Creator-led vertical videos: AI creators, their faces and voices, frames
      and clips.
  - name: Editing
    description: >-
      Sigma, the editor: conversational turns, granular transcript edits,
      approvals.
  - name: 3D
    description: Animated 3D renders from a description or a photograph.
  - name: Image
    description: Thumbnails, sized for the platform they are posted to.
  - name: Audio
    description: Generated music and audio engineering in Audiotool projects.
  - name: Publishing
    description: Connected destinations and queued posts.
  - name: Webhooks
    description: Signed, at-least-once delivery of job and publishing events.
  - name: Workflows
    description: Context snapshots, versioned recipes, costed proposals and their runs.
  - name: Agents
    description: Describe an outcome and let a bounded plan of capabilities run.
  - name: Research
    description: >-
      Observed hooks, creator outliers and production briefs from saved
      analyses.
  - name: Themes
    description: The canonical content taxonomy, and the niche profiles built on it.
  - name: Signals
    description: Evidence-backed trends and scored viral content.
  - name: Discovery
    description: Compiled watch plans, their runs, and source freshness.
  - name: Watchlist
    description: 'Accounts you watch: their usual reach and the posts that beat it.'
  - name: Performance
    description: Your own channels' videos against their usual, and fixes to live videos.
  - name: Autopilot
    description: The durable trend-to-distribution workflow and its checkpoints.
  - name: Campaigns
    description: Distribution records shared by the API, the dashboard and autopilot.
  - name: Brands
    description: >-
      Cross-platform identities with their own voice, rules and publishing
      commitments.
  - name: Products
    description: What a campaign promotes.
paths:
  /v1/video/create:
    post:
      tags:
        - Video
      summary: Make a video
      description: >-
        Make a video from a prompt in one call: planned, narrated and rendered.
        Answers at once with one `jobId`; poll GET /v1/jobs/{jobId} through
        `queued`, `planning`, `awaiting_user_input` (with `review: "plan"`,
        answered by POST /v1/video/create/{jobId}/followups), `rendering`, then
        `done` with `output.downloadUrl` and `sources[]`, or `failed`. Calls
        beyond the render capacity wait their turn; none is refused for being
        busy. The render is charged only when the renderer accepts it and
        refunded if it fails. Quote first with X-Sigmora-Quote-Only.
      operationId: video.create
      parameters:
        - name: idempotency-key
          in: header
          required: true
          description: >-
            Required durable retry key. Reuse only for the identical logical
            request; a different payload returns conflict.
          schema:
            type: string
            minLength: 1
            maxLength: 255
            description: >-
              Required durable retry key. Reuse only for the identical logical
              request; a different payload returns conflict.
        - name: x-sigmora-quote-only
          in: header
          required: false
          description: Send 1 to get the price and balance without running anything.
          schema:
            description: Send 1 to get the price and balance without running anything.
            type: string
            const: '1'
        - name: x-sigmora-max-credits
          in: header
          required: false
          description: >-
            The approved price; a call that would cost more is refused and
            nothing is charged.
          schema:
            description: >-
              The approved price; a call that would cost more is refused and
              nothing is charged.
            type: string
            pattern: ^\d+$
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                prompt:
                  type: string
                  minLength: 1
                  maxLength: 12000
                  description: >-
                    What the video is: the brief, the script, or notes. Up to
                    12,000 characters.
                projectId:
                  description: >-
                    The project to make it in. Omitted: a new project is created
                    and its id returned.
                  type: string
                  minLength: 1
                  maxLength: 200
                aspect:
                  type: string
                  enum:
                    - '9:16'
                    - '16:9'
                    - '1:1'
                    - '4:5'
                    - '21:9'
                  description: 'The delivered frame: 9:16 (default), 16:9, 1:1, 4:5 or 21:9.'
                duration:
                  anyOf:
                    - type: string
                      enum:
                        - <10s
                        - 10-30s
                        - 30s-1min
                        - 1-5min
                    - type: integer
                      minimum: 3
                      maximum: 600
                  description: >-
                    About how long: a bucket (`<10s`, `10-30s`, `30s-1min`,
                    `1-5min`) or whole seconds from 3 to 600. Omitted: the
                    planner fits the brief (or the style reference).
                templateId:
                  type: string
                  enum:
                    - editorial-signal
                    - night-interface
                    - evidence-ledger
                    - footage-journal
                    - presenter-focus
                    - founder-editorial
                    - kinetic-impact
                  description: >-
                    A house video template to lock the look to (see
                    `video.options`). Omitted: the brand kit default, else the
                    planner picks.
                brandKitId:
                  description: >-
                    A brand (`GET /v1/brands`) whose kit (voice, look, words)
                    the video uses. Omitted: the project brand, else the
                    workspace brand.
                  type: string
                  minLength: 1
                  maxLength: 200
                styleReferenceUrl:
                  description: >-
                    A video to borrow the structure and feel of (hook, pacing,
                    shots, captions, music): one TikTok, Instagram, YouTube or X
                    post, or a link to a video file. It is broken down once
                    (priced as a video analysis) and nothing of it is copied.
                  type: string
                  minLength: 1
                  maxLength: 2048
                attachments:
                  maxItems: 100
                  type: array
                  items:
                    type: object
                    properties:
                      url:
                        type: string
                        minLength: 1
                        maxLength: 2048
                        description: >-
                          A public HTTPS URL Sigmora can fetch. A picture or
                          clip is imported into the project and may be placed in
                          the video; an audio file becomes its music bed; a page
                          or document is read for facts; a GitHub pull request
                          becomes the brief.
                      name:
                        description: >-
                          What it is, in a few words. The planner reads it when
                          placing the file.
                        type: string
                        minLength: 1
                        maxLength: 200
                      type:
                        description: 'Omitted: inferred from contentType or the URL.'
                        type: string
                        enum:
                          - image
                          - video
                          - audio
                          - file
                      contentType:
                        description: >-
                          Its MIME type, when the URL does not say (for example
                          `image/png`).
                        type: string
                        minLength: 1
                        maxLength: 120
                    required:
                      - url
                    additionalProperties: {}
                  description: >-
                    Up to 100 files or pages to use. Attaching a file confirms
                    you may use it in this video.
                remixOf:
                  description: >-
                    A past projectId to make another like: its frame, length,
                    captions, template, visuals, voice and Brand carry over; its
                    footage and words do not.
                  type: string
                  minLength: 1
                  maxLength: 200
                designMd:
                  anyOf:
                    - type: string
                      minLength: 1
                      maxLength: 40000
                    - type: object
                      properties:
                        content:
                          description: The DESIGN.md as Markdown.
                          type: string
                          minLength: 1
                          maxLength: 40000
                        jsonContent:
                          description: >-
                            Design tokens as JSON (a DESIGN.json or tokens
                            file). Send this or content.
                        fileName:
                          description: Its file name, for the record.
                          type: string
                          minLength: 1
                          maxLength: 200
                        sourceUrl:
                          description: Where it was published, for the record.
                          type: string
                          minLength: 1
                          maxLength: 2048
                      additionalProperties: {}
                  description: >-
                    A DESIGN.md for this video only: its palette leads the
                    render, its type, corners and motion rules steer the scenes,
                    and its tone joins the voice. Markdown text, or { content,
                    jsonContent, fileName, sourceUrl }. No Brand is changed.
                review:
                  type: string
                  enum:
                    - auto
                    - plan
                  description: >-
                    `auto` (default): plan, then render at the quoted price.
                    `plan`: stop at `awaiting_user_input` with the plan; approve
                    or revise it with `video_followup`.
              required:
                - prompt
              additionalProperties: {}
            example:
              prompt: >-
                A 30-second launch video for PocketLedger: snap a receipt, and
                the budget updates before you leave the shop. End on the free
                trial.
              aspect: '9:16'
              duration: 30s-1min
              brandKitId: brd_4b81
              attachments:
                - url: https://cdn.example.com/products/pocketledger-phone.png
                  name: The app on a phone
                  type: image
              review: plan
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    const: true
                  quote:
                    type: object
                    properties:
                      capability:
                        type: string
                      credits:
                        type: number
                      balance:
                        type: number
                      sufficient:
                        type: boolean
                      budgetCapped:
                        type: boolean
                    required:
                      - capability
                      - credits
                      - balance
                      - sufficient
                      - budgetCapped
                    additionalProperties: {}
                required:
                  - success
                  - quote
                additionalProperties: {}
        '202':
          description: Success.
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    const: true
                  jobId:
                    type: string
                    description: The job to poll at GET /v1/jobs/{jobId}.
                  projectId:
                    type: string
                    description: >-
                      The project the video is filed in (created when none was
                      named).
                  projectUrl:
                    type: string
                    description: Where the person opens and edits the plan in Sigmora.
                  status:
                    type: string
                    enum:
                      - queued
                      - planning
                      - awaiting_user_input
                      - rendering
                      - done
                      - failed
                    description: Where the job is now.
                  quotedCredits:
                    type: number
                    description: >-
                      What the call was quoted at; each part is charged only
                      when delivered.
                  job:
                    $ref: '#/components/schemas/Job'
                    description: >-
                      An asynchronous unit of work and, once it is done, where
                      its output files are.
                required:
                  - success
                  - jobId
                  - projectId
                  - projectUrl
                  - status
                  - quotedCredits
                  - job
                additionalProperties: {}
        '400':
          description: 'Failure. `code` is one of: invalid_request.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: 'Failure. `code` is one of: unauthorized.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '402':
          description: 'Failure. `code` is one of: insufficient_credits, budget_capped.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: >-
            Failure. `code` is one of: forbidden, origin_not_allowed,
            account_locked_chargeback.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: 'Failure. `code` is one of: not_found.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '409':
          description: 'Failure. `code` is one of: conflict.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '413':
          description: 'Failure. `code` is one of: payload_too_large.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: 'Failure. `code` is one of: rate_limited.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: 'Failure. `code` is one of: upstream_error, internal_error.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: >-
            Failure. `code` is one of: capability_unavailable,
            upstream_unavailable.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    Job:
      type: object
      properties:
        id:
          type: string
          description: The job id you polled.
          examples:
            - job_4k1b7d
        kind:
          type: string
          enum:
            - video.render
            - video.create
            - asset.animate
            - video.edit
            - media.analysis
          description: What produced this job, which decides what `artifacts` carries.
        workflow:
          description: >-
            Optional product workflow identity, such as the outcome-level UGC
            flow.
          anyOf:
            - type: string
              enum:
                - ugc
                - studio-sound
            - type: 'null'
        status:
          type: string
          enum:
            - queued
            - planning
            - awaiting_user_input
            - rendering
            - awaiting_review
            - done
            - cancelled
            - failed
            - qa_failed
          description: >-
            A closed set, safe to branch on. `done`, `cancelled`, `failed` and
            `qa_failed` are terminal; `done` is the only success.
            `awaiting_review` is reachable only for review-mode footage edits
            and will not advance by polling: read the proposal at `GET
            /v1/jobs/{jobId}/proposal` and approve it with `POST
            /v1/video/edit/approve`. `planning` and `awaiting_user_input` are
            `video.create` only: the plan is being made, or it waits for `POST
            /v1/video/create/{jobId}/followups` (see `pendingUserInput`) and
            polling will not advance it.
        projectUrl:
          description: >-
            `video.create`: where the person opens and edits the plan in
            Sigmora.
          type: string
        pendingUserInput:
          description: '`video.create`: set while `status` is `awaiting_user_input`.'
          anyOf:
            - type: object
              properties:
                kind:
                  type: string
                  enum:
                    - plan_review
                  description: What waits on the person.
                message:
                  type: string
                  description: What to show them, and how to answer it.
              required:
                - kind
                - message
              additionalProperties: {}
            - type: 'null'
        plan:
          description: >-
            `video.create`: the reviewed plan: title, scenes (narration and what
            is on screen), estimated seconds, `renderCredits`, and the
            production `checks` it must pass before it renders.
          anyOf:
            - type: object
              propertyNames:
                type: string
              additionalProperties: {}
            - type: 'null'
        output:
          description: '`video.create`: the finished file.'
          type: object
          properties:
            status:
              type: string
              enum:
                - pending
                - rendering
                - ready
                - failed
              description: Where the file is.
            downloadUrl:
              description: The finished MP4, once `status` is `done`.
              type:
                - string
                - 'null'
            playbackUrl:
              description: A streaming URL for a player.
              type:
                - string
                - 'null'
            thumbnailUrl:
              description: The cover image.
              type:
                - string
                - 'null'
            expiresAt:
              description: 'Null: the link does not expire.'
              type:
                - string
                - 'null'
            videoJobId:
              description: The render job, also readable here.
              type:
                - string
                - 'null'
          required:
            - status
            - downloadUrl
            - playbackUrl
            - thumbnailUrl
            - expiresAt
            - videoJobId
          additionalProperties: {}
        sources:
          description: >-
            Every outside piece the video uses: Library and attached files, the
            music bed, the voice, and the pages its claims cite. Present on
            `video.create` jobs and on a `video.render` made from a reviewed
            Quick Video plan.
          type: array
          items:
            type: object
            properties:
              sourceKind:
                type: string
                enum:
                  - licensed_library
                  - article
                  - web_search
                  - web
                  - connector
                  - upload
                  - generated
                description: Where it came from.
              provider:
                description: >-
                  Who supplied it: `attachment`, `sigmora_library`, a voice
                  provider.
                type:
                  - string
                  - 'null'
              providerAssetId:
                description: The supplier's own id for it, when it has one.
                type:
                  - string
                  - 'null'
              sourceUrl:
                description: Where it can be seen at its source.
                type:
                  - string
                  - 'null'
              mediaType:
                type: string
                enum:
                  - image
                  - video
                  - audio
                  - text
                description: What kind of media it is.
              title:
                type: string
                description: What it is called.
              credit:
                description: The credit line its owner or license asks for.
                type:
                  - string
                  - 'null'
              rightsStatus:
                type: string
                enum:
                  - licensed
                  - public
                  - restricted
                  - user_provided
                  - generated
                  - unknown
                description: On what terms the video uses it.
              usages:
                type: array
                items:
                  type: object
                  properties:
                    scene:
                      type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                      description: The 1-based scene it plays in.
                    sceneId:
                      description: The plan's own id for that scene.
                      type: string
                    startSeconds:
                      type: number
                      description: When it starts in the video.
                    endSeconds:
                      type: number
                      description: When it ends in the video.
                  required:
                    - scene
                    - startSeconds
                    - endSeconds
                  additionalProperties: {}
                description: Where it plays.
            required:
              - sourceKind
              - provider
              - providerAssetId
              - sourceUrl
              - mediaType
              - title
              - credit
              - rightsStatus
              - usages
            additionalProperties: {}
        sourcesTiming:
          description: >-
            `estimated` from the plan narration, or `measured` (scaled to the
            finished file).
          anyOf:
            - type: string
              enum:
                - estimated
                - measured
            - type: 'null'
        phase:
          description: >-
            The pipeline's own stage word. Useful to show someone, NOT stable
            across releases — branch on `status` instead.
          type:
            - string
            - 'null'
        artifacts:
          $ref: '#/components/schemas/JobArtifacts'
          description: >-
            The outputs. Which fields are present depends on `kind`; use
            `playback` for a player and `download` (or legacy `video`) for file
            bytes.
        qualityEvidence:
          description: >-
            Versioned QA, caption, source, render, capability and artifact
            release proof.
          anyOf:
            - type: object
              properties:
                schemaVersion:
                  type: string
                  const: video-quality-evidence.v1
                engine:
                  type: string
                  minLength: 1
                  maxLength: 120
                runId:
                  type: string
                  minLength: 1
                  maxLength: 500
                recordedAt:
                  type: string
                  format: date-time
                  pattern: >-
                    ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
                quality:
                  anyOf:
                    - type: string
                      minLength: 1
                      maxLength: 80
                    - type: 'null'
                duration:
                  type: object
                  properties:
                    actualSeconds:
                      anyOf:
                        - type: number
                          minimum: 0
                        - type: 'null'
                    targetSeconds:
                      anyOf:
                        - type: number
                          exclusiveMinimum: 0
                        - type: 'null'
                    toleranceSeconds:
                      anyOf:
                        - type: number
                          minimum: 0
                        - type: 'null'
                    withinTarget:
                      type:
                        - boolean
                        - 'null'
                  required:
                    - actualSeconds
                    - targetSeconds
                  additionalProperties: false
                qa:
                  type: object
                  properties:
                    passed:
                      type: boolean
                    failed:
                      maxItems: 500
                      type: array
                      items:
                        type: string
                        minLength: 1
                        maxLength: 500
                    publishBlocking:
                      maxItems: 500
                      type: array
                      items:
                        type: string
                        minLength: 1
                        maxLength: 4000
                    checks:
                      maxItems: 500
                      type: array
                      items:
                        type: object
                        properties:
                          name:
                            type: string
                            minLength: 1
                            maxLength: 160
                          passed:
                            type: boolean
                          message:
                            type: string
                            maxLength: 4000
                          blocking:
                            type: boolean
                          metric: {}
                        required:
                          - name
                          - passed
                          - message
                          - blocking
                        additionalProperties: false
                    reportDigest:
                      anyOf:
                        - type: string
                          pattern: ^[a-f0-9]{64}$
                        - type: 'null'
                  required:
                    - passed
                    - failed
                    - publishBlocking
                    - checks
                  additionalProperties: false
                captionDelivery:
                  anyOf:
                    - type: object
                      properties:
                        enabled:
                          type: boolean
                        mode:
                          type: string
                          minLength: 1
                          maxLength: 80
                        style:
                          anyOf:
                            - type: string
                              minLength: 1
                              maxLength: 120
                            - type: 'null'
                        srt:
                          anyOf:
                            - type: string
                              minLength: 1
                              maxLength: 500
                            - type: 'null'
                        vtt:
                          anyOf:
                            - type: string
                              minLength: 1
                              maxLength: 500
                            - type: 'null'
                        softTrack:
                          type: boolean
                        burnProvenance:
                          anyOf:
                            - type: string
                              minLength: 1
                              maxLength: 500
                            - type: 'null'
                        evidence:
                          anyOf:
                            - type: object
                              propertyNames:
                                type: string
                              additionalProperties: {}
                            - type: 'null'
                      required:
                        - enabled
                        - mode
                        - srt
                        - vtt
                        - softTrack
                        - burnProvenance
                      additionalProperties: false
                    - type: 'null'
                renderAudit:
                  anyOf:
                    - type: object
                      propertyNames:
                        type: string
                      additionalProperties: {}
                    - type: 'null'
                sourceEvidence:
                  type: object
                  properties:
                    check:
                      anyOf:
                        - type: object
                          propertyNames:
                            type: string
                          additionalProperties: {}
                        - type: 'null'
                    citations:
                      maxItems: 500
                      type: array
                      items:
                        type: object
                        properties:
                          url:
                            type: string
                            format: uri
                          title:
                            default: ''
                            type: string
                            maxLength: 500
                          claimIds:
                            maxItems: 500
                            type: array
                            items:
                              type: string
                              minLength: 1
                              maxLength: 160
                          sha256:
                            anyOf:
                              - type: string
                                pattern: ^[a-f0-9]{64}$
                              - type: 'null'
                        required:
                          - url
                        additionalProperties: false
                    rights:
                      maxItems: 500
                      type: array
                      items:
                        type: object
                        properties:
                          assetId:
                            anyOf:
                              - type: string
                                minLength: 1
                                maxLength: 500
                              - type: 'null'
                          sourceUrl:
                            anyOf:
                              - type: string
                                format: uri
                              - type: 'null'
                          status:
                            type: string
                            minLength: 1
                            maxLength: 80
                          confirmed:
                            type: boolean
                          owner:
                            anyOf:
                              - type: string
                                maxLength: 500
                              - type: 'null'
                          license:
                            anyOf:
                              - type: string
                                maxLength: 500
                              - type: 'null'
                          attribution:
                            anyOf:
                              - type: string
                                maxLength: 2000
                              - type: 'null'
                          confirmedBy:
                            anyOf:
                              - type: string
                                maxLength: 500
                              - type: 'null'
                          confirmedAt:
                            anyOf:
                              - type: string
                                format: date-time
                                pattern: >-
                                  ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
                              - type: 'null'
                        required:
                          - status
                          - confirmed
                        additionalProperties: false
                    ledger:
                      anyOf:
                        - type: object
                          propertyNames:
                            type: string
                          additionalProperties: {}
                        - type: 'null'
                  required:
                    - check
                    - citations
                    - rights
                  additionalProperties: false
                capability:
                  type: object
                  properties:
                    service:
                      type: string
                      minLength: 1
                      maxLength: 120
                    schemaRevision:
                      type: string
                      minLength: 1
                      maxLength: 200
                    schemaDigest:
                      type: string
                      pattern: ^[a-f0-9]{64}$
                    snapshot:
                      anyOf:
                        - type: object
                          propertyNames:
                            type: string
                          additionalProperties: {}
                        - type: 'null'
                  required:
                    - service
                    - schemaRevision
                    - schemaDigest
                  additionalProperties: false
                artifacts:
                  maxItems: 500
                  type: array
                  items:
                    type: object
                    properties:
                      kind:
                        type: string
                        minLength: 1
                        maxLength: 80
                      name:
                        default: null
                        anyOf:
                          - type: string
                            minLength: 1
                            maxLength: 500
                          - type: 'null'
                      sha256:
                        type: string
                        pattern: ^[a-f0-9]{64}$
                      bytes:
                        type: integer
                        minimum: 0
                        maximum: 9007199254740991
                      mime:
                        type: string
                        minLength: 1
                        maxLength: 200
                      url:
                        anyOf:
                          - anyOf:
                              - type: string
                                format: uri
                              - type: string
                                pattern: >-
                                  ^content-engine:\/\/[A-Za-z0-9][A-Za-z0-9_.-]{0,499}$
                          - type: 'null'
                      expiresAt:
                        anyOf:
                          - type: string
                            format: date-time
                            pattern: >-
                              ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
                          - type: 'null'
                      durable:
                        type: boolean
                    required:
                      - kind
                      - sha256
                      - bytes
                      - mime
                      - url
                      - expiresAt
                      - durable
                    additionalProperties: false
                release:
                  type: object
                  properties:
                    draft:
                      type: boolean
                    durable:
                      type: boolean
                    eligible:
                      type: boolean
                    publishState:
                      anyOf:
                        - type: string
                          minLength: 1
                          maxLength: 120
                        - type: 'null'
                  required:
                    - draft
                    - durable
                    - eligible
                    - publishState
                  additionalProperties: false
                productionProfile:
                  anyOf:
                    - type: object
                      propertyNames:
                        type: string
                      additionalProperties: {}
                    - type: 'null'
                productionAttestation:
                  anyOf:
                    - type: object
                      propertyNames:
                        type: string
                      additionalProperties: {}
                    - type: 'null'
                productionEvidenceContentId:
                  anyOf:
                    - type: string
                      minLength: 1
                      maxLength: 500
                    - type: 'null'
              required:
                - schemaVersion
                - engine
                - runId
                - recordedAt
                - quality
                - duration
                - qa
                - captionDelivery
                - renderAudit
                - sourceEvidence
                - capability
                - artifacts
                - release
              additionalProperties: false
            - type: 'null'
        productionEvidenceContentId:
          description: >-
            Durable Content Engine sidecar containing the complete production
            evidence.
          type:
            - string
            - 'null'
        contentEngineContentId:
          description: Durable Content Engine row containing the primary MP4.
          type:
            - string
            - 'null'
        releaseIdentity:
          description: Explicit producer identity binding for a final curriculum release.
          anyOf:
            - type: object
              properties:
                callbackJobId:
                  type: string
                evidenceRunId:
                  type: string
                videoContentJobId:
                  type:
                    - string
                    - 'null'
                productionEvidenceJobId:
                  type: string
              required:
                - callbackJobId
                - evidenceRunId
                - videoContentJobId
                - productionEvidenceJobId
            - type: 'null'
        wholeCutReview:
          description: >-
            The finished video reviewed end to end before delivery: black,
            frozen and silent runs, loudness and true peak, voice over music,
            text overlap and cut-off, and a vision pass over contact sheets.
            `findings` are warnings with timestamps (they never block); `fixed`
            is what the one automatic fix pass changed.
          type: object
          properties:
            schemaVersion:
              type: string
              const: whole-cut-review.v1
            durationSec:
              type: number
              minimum: 0
            framesSampled:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            sheets:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            visionModel:
              anyOf:
                - type: string
                  maxLength: 200
                - type: 'null'
            visionSkipped:
              type: string
              maxLength: 200
            findings:
              maxItems: 60
              type: array
              items:
                type: object
                properties:
                  kind:
                    type: string
                    enum:
                      - black
                      - frozen
                      - silence
                      - loudness_off_target
                      - true_peak_clipping
                      - music_over_voice
                      - text_overlap
                      - text_cut_off
                      - visual
                  atSec:
                    type: number
                    minimum: 0
                  endSec:
                    type: number
                    minimum: 0
                  severity:
                    type: string
                    enum:
                      - low
                      - medium
                      - high
                  fixable:
                    type: boolean
                  fix:
                    anyOf:
                      - type: string
                        enum:
                          - loudness_normalize
                          - trim_head
                          - trim_tail
                          - caption_safe_zone
                      - type: 'null'
                  message:
                    type: string
                    minLength: 1
                    maxLength: 400
                  params:
                    type: object
                    propertyNames:
                      type: string
                      maxLength: 40
                    additionalProperties:
                      anyOf:
                        - type: string
                          maxLength: 200
                        - type: number
                required:
                  - kind
                  - atSec
                  - severity
                  - fixable
                  - fix
                  - message
                additionalProperties: false
            fixed:
              maxItems: 10
              type: array
              items:
                type: object
                properties:
                  fix:
                    type: string
                    enum:
                      - loudness_normalize
                      - trim_head
                      - trim_tail
                      - caption_safe_zone
                  atSec:
                    type: number
                    minimum: 0
                  removedSec:
                    type: number
                    minimum: 0
                  message:
                    type: string
                    minLength: 1
                    maxLength: 400
                required:
                  - fix
                  - atSec
                  - message
                additionalProperties: false
          required:
            - schemaVersion
            - durationSec
            - framesSampled
            - sheets
            - visionModel
            - findings
            - fixed
          additionalProperties: false
        package:
          description: Present only when the render was asked for a package.
          type: object
          properties:
            status:
              type: string
              enum:
                - pending
                - ready
                - failed
                - skipped
              description: >-
                The extras you asked for. `pending` means come back — they are
                cut once the video is done; `ready` means read `clips`;
                `skipped` means you asked for none.
            shorts:
              type: number
              description: How many were requested per platform.
            clips:
              description: >-
                Short-form SCRIPTS, present once `status` is `ready`. Not
                rendered files.
              type: array
              items:
                type: object
                propertyNames:
                  type: string
                additionalProperties: {}
            error:
              description: Why they could not be produced.
              type: string
          required:
            - status
            - shorts
          additionalProperties: {}
        error:
          description: Why it failed. Present only when `status` is `failed`.
          type:
            - string
            - 'null'
        errorCode:
          description: >-
            Stable `stage.reason` failure code for footage edits, for example
            `transcription.rate_limited`, `delivery.output_invalid` or
            `storage.full`. Branch on this, not on the `error` text.
          type:
            - string
            - 'null'
        errorHint:
          description: What to do next about the failure, when known.
          type:
            - string
            - 'null'
      required:
        - id
        - kind
        - status
      additionalProperties: {}
      description: >-
        An asynchronous unit of work and, once it is done, where its output
        files are.
    Error:
      type: object
      required:
        - success
        - error
        - code
      properties:
        success:
          const: false
        error:
          type: string
          description: >-
            Human-readable. Copy may change between releases — do not match on
            it.
        code:
          type: string
          enum:
            - invalid_request
            - unauthorized
            - forbidden
            - origin_not_allowed
            - not_found
            - conflict
            - payload_too_large
            - account_locked_chargeback
            - insufficient_credits
            - budget_capped
            - content_not_cleared
            - rate_limited
            - capability_unavailable
            - upstream_unavailable
            - upstream_error
            - internal_error
          description: Stable machine-readable cause. Branch on this.
        details:
          description: Optional structured context, e.g. the credits shortfall.
        requestId:
          type: string
          description: >-
            Identifies this request in our logs. Include it when you contact
            support.
        timestamp:
          type: string
          format: date-time
          description: When the failure was produced.
    JobArtifacts:
      type: object
      properties:
        assetId:
          description: The analyzed asset id. Present for `media.analysis` jobs.
          type: string
        video:
          description: >-
            THE FINISHED VIDEO — backwards-compatible alias for `download`.
            Fetch it directly: it points at the origin holding the bytes, not
            back through this API, which is why a multi-gigabyte render
            downloads at the origin's speed rather than a gateway's. Null until
            `status` is `done`.
          examples:
            - >-
              https://api.sigmora.org/render/job_4k1b7d/download/video?exp=1785700000&sig=9f2c&ws=ws_acme
          type:
            - string
            - 'null'
        playback:
          description: >-
            Use this URL in a preview/player. It may be an adaptive streaming
            manifest such as HLS; it is separate from the direct downloadable
            file so browser playback does not have to follow a download-oriented
            URL.
          type:
            - string
            - 'null'
        download:
          description: >-
            Use this URL when you need the finished file bytes. Fetch it
            directly from the origin; it is the same value exposed as the
            backwards-compatible `video` field.
          type:
            - string
            - 'null'
        thumbnail:
          description: >-
            Poster image. Render and 3D jobs; on a footage edit, the cover image
            publishing uses: a long cut's automatic still of the speaker with
            its thumbnail words, or one someone chose.
          type:
            - string
            - 'null'
        srt:
          description: >-
            Captions as SubRip. Render and 3D jobs, and a footage edit's long
            cut (signed fresh on every read, so fetch it soon after polling).
          type:
            - string
            - 'null'
        vtt:
          description: Captions as WebVTT. Render and 3D jobs.
          type:
            - string
            - 'null'
        youtube:
          description: >-
            THE POSTING BLOCK — title, timestamped chapters, tags and the full
            transcript, as plain text ready to paste into a description field.
            Produced by every render.
          type:
            - string
            - 'null'
        metadata:
          description: >-
            The same posting data as JSON: title, tags, chapters with start/end
            seconds, cues and transcript. Use this one if you are publishing
            programmatically.
          type:
            - string
            - 'null'
        scriptReview:
          description: >-
            Source-grounded pre-TTS release decision. It remains available when
            the script quality gate rejects a job, so callers can inspect the
            blocking evidence before retrying.
          type:
            - string
            - 'null'
        runJson:
          description: >-
            Signed run manifest containing the renderer-native evidence and
            timings.
          type:
            - string
            - 'null'
        descriptors:
          description: >-
            Byte-level SHA-256, size, MIME, expiry and durability evidence per
            artifact.
          type: array
          items:
            type: object
            properties:
              kind:
                type: string
                minLength: 1
                maxLength: 80
              name:
                default: null
                anyOf:
                  - type: string
                    minLength: 1
                    maxLength: 500
                  - type: 'null'
              sha256:
                type: string
                pattern: ^[a-f0-9]{64}$
              bytes:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              mime:
                type: string
                minLength: 1
                maxLength: 200
              url:
                anyOf:
                  - anyOf:
                      - type: string
                        format: uri
                      - type: string
                        pattern: ^content-engine:\/\/[A-Za-z0-9][A-Za-z0-9_.-]{0,499}$
                  - type: 'null'
              expiresAt:
                anyOf:
                  - type: string
                    format: date-time
                    pattern: >-
                      ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
                  - type: 'null'
              durable:
                type: boolean
            required:
              - kind
              - sha256
              - bytes
              - mime
              - url
              - expiresAt
              - durable
            additionalProperties: false
        outputKind:
          description: >-
            `long` or `short` on a footage-edit deliverable; null on the parent
            shoot.
          type:
            - string
            - 'null'
        parentJobId:
          description: The shoot a footage-edit deliverable belongs to.
          type:
            - string
            - 'null'
        summary:
          description: 'What the editor did: durations, layers, QC result. Footage edits.'
          anyOf:
            - type: object
              propertyNames:
                type: string
              additionalProperties: {}
            - type: 'null'
        packaging:
          description: >-
            Titles, description with chapters, tags and thumbnail words for a
            footage edit, in the Brand's voice when one was named, else the
            brief's and the workspace's.
          anyOf:
            - type: object
              propertyNames:
                type: string
              additionalProperties: {}
            - type: 'null'
        review:
          description: >-
            The SIZE of the decision waiting on a person — proposed cut count
            and durations, not the cuts themselves. Present only while `status`
            is `awaiting_review`.
          anyOf:
            - type: object
              propertyNames:
                type: string
              additionalProperties: {}
            - type: 'null'
      additionalProperties: {}
      description: >-
        The outputs. Which fields are present depends on `kind`; use `playback`
        for a player and `download` (or legacy `video`) for file bytes.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: A workspace API key.

````

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