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

# Finalize a draft render

> Finalize a draft render: the same video at full quality. Renders a `draft: true` job again at full quality from the body the draft was submitted with (cached script and narration are reused where possible) and answers with the NEW job to poll at GET /v1/jobs/{jobId}. Charged as one `video.render`; the draft keeps its own charge. A job that is not a draft answers `conflict`; a job that is not yours, or `projectId` other than the draft’s project, answers `not_found`. The same Idempotency-Key returns the same final job and is never charged twice.



## OpenAPI

````yaml /openapi.json post /v1/jobs/{jobId}/finalize
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/jobs/{jobId}/finalize:
    post:
      tags:
        - Jobs
      summary: Finalize a draft render
      description: >-
        Finalize a draft render: the same video at full quality. Renders a
        `draft: true` job again at full quality from the body the draft was
        submitted with (cached script and narration are reused where possible)
        and answers with the NEW job to poll at GET /v1/jobs/{jobId}. Charged as
        one `video.render`; the draft keeps its own charge. A job that is not a
        draft answers `conflict`; a job that is not yours, or `projectId` other
        than the draft’s project, answers `not_found`. The same Idempotency-Key
        returns the same final job and is never charged twice.
      operationId: postJobsByJobIdFinalize
      parameters:
        - name: jobId
          in: path
          required: true
          description: 'The draft render job id: the `jobId` of a `draft: true` render.'
          schema:
            type: string
            minLength: 1
            maxLength: 200
            description: 'The draft render job id: the `jobId` of a `draft: true` render.'
            examples:
              - job_4k1b7d
        - name: idempotency-key
          in: header
          required: false
          description: >-
            Stable retry key for this logical paid call. Reuse it after a
            timeout to receive the original result without duplicate work or
            spend.
          schema:
            description: >-
              Stable retry key for this logical paid call. Reuse it after a
              timeout to receive the original result without duplicate work or
              spend.
            type: string
            minLength: 1
            maxLength: 255
        - name: x-sigmora-quote-only
          in: header
          required: false
          description: >-
            Send 1 to get the price, balance and budget verdict without running
            anything.
          schema:
            description: >-
              Send 1 to get the price, balance and budget verdict 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:
                projectId:
                  type: string
                  minLength: 1
                  maxLength: 200
                  description: >-
                    The existing project to file this work under. Create it with
                    POST /v1/projects, then reuse its id across related calls. A
                    project this workspace does not own answers not_found; the
                    work is never silently filed somewhere else.
              required:
                - projectId
              additionalProperties: false
            example:
              projectId: prj_9x2a4c
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                anyOf:
                  - type: object
                    properties:
                      success:
                        type: boolean
                        const: true
                      projectId:
                        description: >-
                          The existing project this work was filed under. It
                          matches the projectId supplied by the caller after
                          workspace ownership was verified.
                        examples:
                          - prj_9x2a4c
                        type: string
                      credits:
                        type: number
                        description: >-
                          What this call actually cost, which is not always what
                          was quoted.
                        examples:
                          - 300
                      creditBalance:
                        description: >-
                          Your balance after the charge. Absent when billing is
                          disabled for the workspace.
                        examples:
                          - 3900
                        type: number
                      jobId:
                        type: string
                        description: >-
                          Poll `GET /v1/jobs/{jobId}`. When that job reports
                          `status: "done"`, the finished file is
                          `job.artifacts.download`. Video renders expose an
                          origin URL; private 3D artifacts expose an
                          authenticated API handoff that redirects to a
                          short-lived origin URL.
                        examples:
                          - job_4k1b7d
                      status:
                        type: string
                        const: queued
                        description: >-
                          Acceptance, not completion. The work has not started
                          when this returns.
                      draftJobId:
                        type: string
                        description: The draft this render finalizes.
                    required:
                      - success
                      - credits
                      - jobId
                      - status
                      - draftJobId
                    additionalProperties: {}
                  - type: object
                    properties:
                      success:
                        type: boolean
                        const: true
                      quote:
                        type: object
                        properties:
                          capability:
                            type: string
                          credits:
                            type: number
                          unitCredits:
                            type: number
                          units:
                            type: number
                          balance:
                            type: number
                          sufficient:
                            type: boolean
                          budgetCapped:
                            type: boolean
                        required:
                          - capability
                          - credits
                          - unitCredits
                          - units
                          - balance
                          - sufficient
                          - budgetCapped
                        additionalProperties: {}
                    required:
                      - success
                      - quote
                    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.'
          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:
    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
            - 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.
  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.