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

# Approve a video's script

> Approve the script of a video in `script_review`, with any edits, and release it to render. Send `{}` to approve it as written. Approving is what charges the video, at the price of the approved script: the video's `price_cents` when approved as written. Set `max_price_cents` to refuse the approval, with 400, if your edits would take it above that. A workspace that cannot pay for it (included video credits, then the prepaid balance) gets 400 and the video stays in review.



## OpenAPI

````yaml /openapi.json post /v1/videos/{id}/approve
openapi: 3.1.0
info:
  title: LumisReach v1 API
  version: 1.0.0
  description: >-
    Programmatic access to the LumisReach voice platform — calls, numbers,
    caller trust, and brands.
  contact:
    name: LumisReach
    email: founders@lumisreach.com
servers:
  - url: https://api.lumisreach.com/api
security:
  - bearerAuth: []
tags:
  - name: Phone Numbers
  - name: Caller IDs
  - name: Enterprise Registration
  - name: Branded Calling
  - name: Calls
  - name: SMS
  - name: WebRTC
  - name: Reputation
  - name: Usage
  - name: Account
  - name: Billing
  - name: Conversation History
  - name: Documents
  - name: Lincoln AI
  - name: Quick Agent Actions
  - name: Sub-entities
  - name: Video schedules
  - name: Videos
paths:
  /v1/videos/{id}/approve:
    post:
      tags:
        - Videos
      summary: Approve a video's script
      description: >-
        Approve the script of a video in `script_review`, with any edits, and
        release it to render. Send `{}` to approve it as written. Approving is
        what charges the video, at the price of the approved script: the video's
        `price_cents` when approved as written. Set `max_price_cents` to refuse
        the approval, with 400, if your edits would take it above that. A
        workspace that cannot pay for it (included video credits, then the
        prepaid balance) gets 400 and the video stays in review.
      operationId: v1_videos_id_approve_post
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Idempotency-Key
          in: header
          required: false
          description: >-
            A UUID. When present, deduplicates repeat submissions. See
            /api-reference/idempotency.
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $schema: http://json-schema.org/draft-07/schema#
              type: object
              properties:
                script:
                  description: >-
                    The edited script, for a script-based video. Omit to approve
                    it as written.
                  type: string
                  maxLength: 6000
                sections:
                  description: 'A scrolling background: one text per section, in order'
                  minItems: 1
                  maxItems: 10
                  type: array
                  items:
                    type: string
                    maxLength: 1500
                on_screen_caption:
                  description: '`real_footage`: the caption over the clip'
                  type: string
                  minLength: 1
                  maxLength: 150
                scenes:
                  description: >-
                    Scene templates: edits by scene id. Scenes you leave out
                    keep what was planned.
                  minItems: 1
                  maxItems: 10
                  type: array
                  items:
                    type: object
                    properties:
                      id:
                        type: string
                        minLength: 1
                        maxLength: 64
                      voiceover:
                        type: string
                        maxLength: 1500
                      caption:
                        anyOf:
                          - type: string
                            maxLength: 90
                          - type: 'null'
                      prompt:
                        type: string
                        maxLength: 1200
                      duration_seconds:
                        type: number
                        minimum: 2
                        maximum: 12
                    required:
                      - id
                    additionalProperties: false
                slides:
                  description: '`slideshow`: edits by slide id'
                  minItems: 1
                  maxItems: 10
                  type: array
                  items:
                    type: object
                    properties:
                      id:
                        type: string
                        minLength: 1
                        maxLength: 32
                      headline:
                        type: string
                        maxLength: 90
                      body:
                        anyOf:
                          - type: string
                            maxLength: 180
                          - type: 'null'
                      position:
                        type: string
                        enum:
                          - top
                          - center
                          - bottom
                      prompt:
                        type: string
                        maxLength: 800
                    required:
                      - id
                    additionalProperties: false
                interview_turns:
                  description: '`interview`: line edits by turn id'
                  maxItems: 16
                  type: array
                  items:
                    type: object
                    properties:
                      id:
                        type: string
                        minLength: 1
                        maxLength: 16
                      text:
                        type: string
                        maxLength: 400
                    required:
                      - id
                      - text
                    additionalProperties: false
                max_price_cents:
                  description: >-
                    A spending cap: above it the script is not approved and the
                    request fails with 400
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
              additionalProperties: false
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $schema: http://json-schema.org/draft-07/schema#
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      id:
                        type: string
                        format: uuid
                        pattern: >-
                          ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                      title:
                        type: string
                      status:
                        type: string
                        enum:
                          - unsubmitted
                          - queued
                          - researching
                          - script_review
                          - rendering
                          - compositing
                          - ready
                          - failed
                        description: >-
                          `queued` → `researching` → `script_review` (waiting
                          for approval) → `rendering` → `compositing` → `ready`,
                          or `failed`. `unsubmitted` is a draft saved in the
                          dashboard.
                      template:
                        type: string
                        enum:
                          - talking_avatar
                          - remotion
                          - freeform_ai
                          - meme_hook
                          - interview
                          - phone_mockup
                          - slideshow
                          - real_footage
                      preset:
                        type:
                          - string
                          - 'null'
                      format:
                        type: string
                        enum:
                          - vertical
                          - horizontal
                      duration_seconds:
                        type:
                          - number
                          - 'null'
                      video_url:
                        anyOf:
                          - type: string
                            format: uri
                          - type: 'null'
                        description: >-
                          The finished MP4, once `ready`. A signed link that
                          needs no API key, safe to hand to other services.
                      thumbnail_url:
                        anyOf:
                          - type: string
                            format: uri
                          - type: 'null'
                      billed_cents:
                        anyOf:
                          - type: integer
                            minimum: -9007199254740991
                            maximum: 9007199254740991
                          - type: 'null'
                        description: >-
                          What the video was charged, once, when it was released
                          to render. Null until then.
                      error:
                        description: >-
                          Why it failed, or (in `script_review`) why an
                          automatic approval was held back
                        type:
                          - string
                          - 'null'
                      created_at:
                        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))$
                      updated_at:
                        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))$
                      posts:
                        type: array
                        items:
                          type: object
                          properties:
                            id:
                              type: string
                              format: uuid
                              pattern: >-
                                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                            provider:
                              type: string
                              enum:
                                - tiktok
                                - instagram
                                - facebook
                                - x
                                - linkedin
                            status:
                              type: string
                              enum:
                                - scheduled
                                - pending
                                - publishing
                                - published
                                - failed
                                - canceled
                            media_type:
                              type: string
                              enum:
                                - video
                                - carousel
                            permalink:
                              type:
                                - string
                                - 'null'
                            scheduled_for:
                              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))$
                                - type: 'null'
                            published_at:
                              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))$
                                - type: 'null'
                            error:
                              type:
                                - string
                                - 'null'
                          required:
                            - id
                            - provider
                            - status
                            - media_type
                            - permalink
                            - scheduled_for
                            - published_at
                            - error
                          additionalProperties: false
                      price_cents:
                        type: integer
                        minimum: -9007199254740991
                        maximum: 9007199254740991
                        description: >-
                          What the video costs: the amount charged once
                          released, otherwise the quote for the script (or,
                          before it is written, the estimate).
                      price_estimated:
                        type: boolean
                        description: >-
                          True while the price is an estimate from the length
                          asked for
                      script_approved:
                        type: boolean
                      user_script:
                        type: boolean
                        description: True when you supplied the script
                      script:
                        description: The spoken words, once written
                        type:
                          - string
                          - 'null'
                      script_sections:
                        anyOf:
                          - type: array
                            items:
                              type: object
                              properties:
                                label:
                                  type: string
                                text:
                                  type: string
                              required:
                                - label
                                - text
                              additionalProperties: false
                          - type: 'null'
                        description: A scrolling background's script, one part per section
                      scenes:
                        anyOf:
                          - type: array
                            items:
                              type: object
                              properties:
                                id:
                                  type: string
                                label:
                                  type: string
                                duration_seconds:
                                  type: number
                                voiceover:
                                  type: string
                                caption:
                                  type:
                                    - string
                                    - 'null'
                                prompt:
                                  type:
                                    - string
                                    - 'null'
                              required:
                                - id
                                - label
                                - duration_seconds
                                - voiceover
                                - caption
                                - prompt
                              additionalProperties: false
                          - type: 'null'
                        description: A scene template's shot list, once planned
                      slides:
                        anyOf:
                          - type: array
                            items:
                              type: object
                              properties:
                                id:
                                  type: string
                                role:
                                  type: string
                                headline:
                                  type: string
                                body:
                                  type:
                                    - string
                                    - 'null'
                                position:
                                  type: string
                                prompt:
                                  type:
                                    - string
                                    - 'null'
                                image_url:
                                  anyOf:
                                    - type: string
                                      format: uri
                                    - type: 'null'
                              required:
                                - id
                                - role
                                - headline
                                - body
                                - position
                                - prompt
                                - image_url
                              additionalProperties: false
                          - type: 'null'
                        description: >-
                          A slideshow's slides, once planned; `image_url` once
                          rendered
                      interview:
                        anyOf:
                          - type: object
                            properties:
                              speakers:
                                type: array
                                items:
                                  type: object
                                  properties:
                                    id:
                                      type: string
                                    role:
                                      type: string
                                    face_name:
                                      type: string
                                  required:
                                    - id
                                    - role
                                    - face_name
                                  additionalProperties: false
                              turns:
                                type: array
                                items:
                                  type: object
                                  properties:
                                    id:
                                      type: string
                                    speaker_id:
                                      type: string
                                    text:
                                      type: string
                                  required:
                                    - id
                                    - speaker_id
                                    - text
                                  additionalProperties: false
                            required:
                              - speakers
                              - turns
                            additionalProperties: false
                          - type: 'null'
                      caption:
                        type:
                          - string
                          - 'null'
                      hashtags:
                        type: array
                        items:
                          type: string
                      post_caption:
                        description: >-
                          The caption with its hashtags, as it is posted by
                          default
                        type:
                          - string
                          - 'null'
                      music:
                        anyOf:
                          - type: object
                            properties:
                              library:
                                type: string
                                enum:
                                  - lumisreach
                                  - epidemic
                              track_id:
                                type: string
                              title:
                                type: string
                              volume:
                                type: integer
                                minimum: -9007199254740991
                                maximum: 9007199254740991
                              status:
                                type: string
                                enum:
                                  - pending
                                  - mixing
                                  - applied
                                  - failed
                            required:
                              - library
                              - track_id
                              - title
                              - volume
                              - status
                            additionalProperties: false
                          - type: 'null'
                      source_url:
                        type:
                          - string
                          - 'null'
                      target_duration_seconds:
                        type: integer
                        minimum: -9007199254740991
                        maximum: 9007199254740991
                      avatar_provider:
                        type: string
                        enum:
                          - heygen
                          - tavus
                          - elevenlabs
                      avatar_layout:
                        type: string
                        enum:
                          - center
                          - bubble_bottom_left
                          - bubble_bottom_right
                          - audio_only
                      background_mode:
                        type: string
                        enum:
                          - static
                          - scrolling
                          - footage
                          - automated_demo
                          - original
                          - image
                      subtitle_style:
                        type: string
                        enum:
                          - none
                          - classic
                          - boxed
                          - bold_words
                      video_model:
                        type:
                          - string
                          - 'null'
                      dashboard_url:
                        type: string
                        format: uri
                    required:
                      - id
                      - title
                      - status
                      - template
                      - preset
                      - format
                      - duration_seconds
                      - video_url
                      - thumbnail_url
                      - billed_cents
                      - error
                      - created_at
                      - updated_at
                      - posts
                      - price_cents
                      - price_estimated
                      - script_approved
                      - user_script
                      - script
                      - script_sections
                      - scenes
                      - slides
                      - interview
                      - caption
                      - hashtags
                      - post_caption
                      - music
                      - source_url
                      - target_duration_seconds
                      - avatar_provider
                      - avatar_layout
                      - background_mode
                      - subtitle_style
                      - video_model
                      - dashboard_url
                    additionalProperties: false
                required:
                  - data
                additionalProperties: false
        '400':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '404':
          description: Not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '409':
          description: Conflict (incl. idempotency conflicts)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limited
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
components:
  schemas:
    ErrorEnvelope:
      type: object
      properties:
        error:
          type: object
          required:
            - code
            - message
          properties:
            code:
              type: string
            message:
              type: string
            fields:
              type: object
              additionalProperties:
                type: string
            doc_url:
              type: string
              format: uri
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer

````