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

# Quote a video

> The price of a video with these settings (the same body as `POST /v1/videos`), without making it. Videos are priced at the cost of the providers that make them (presenter renders, generated shots and pictures, narration, rendering) plus a small markup, and charged once, when released to render; retries are free. With your own `script` the quote is exact. Without one it is an estimate from `target_duration_seconds` (`estimated: true`), and the charge at approval is for what was actually written. Free.



## OpenAPI

````yaml /openapi.json post /v1/videos/quote
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/quote:
    post:
      tags:
        - Videos
      summary: Quote a video
      description: >-
        The price of a video with these settings (the same body as `POST
        /v1/videos`), without making it. Videos are priced at the cost of the
        providers that make them (presenter renders, generated shots and
        pictures, narration, rendering) plus a small markup, and charged once,
        when released to render; retries are free. With your own `script` the
        quote is exact. Without one it is an estimate from
        `target_duration_seconds` (`estimated: true`), and the charge at
        approval is for what was actually written. Free.
      operationId: v1_videos_quote_post
      parameters:
        - 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:
                template:
                  default: talking_avatar
                  description: >-
                    Which recipe makes the video: `talking_avatar` (a presenter
                    over your site), `remotion` (motion graphics with a
                    narrator), `freeform_ai` (one generated clip per scene),
                    `meme_hook` (a viral clip into your presenter), `interview`
                    (2 to 4 avatars in a split screen), `phone_mockup` (your
                    video, site or photos on a phone in a hand), `slideshow`
                    (captioned still slides) or `real_footage` (a real stock
                    clip with a caption).
                  type: string
                  enum:
                    - talking_avatar
                    - remotion
                    - freeform_ai
                    - meme_hook
                    - interview
                    - phone_mockup
                    - slideshow
                    - real_footage
                preset:
                  description: >-
                    A style of that template, e.g. `imessage` for `remotion`.
                    Omit for the template's default.
                  type: string
                format:
                  default: vertical
                  description: '`vertical` (9:16) or `horizontal` (16:9)'
                  type: string
                  enum:
                    - vertical
                    - horizontal
                target_duration_seconds:
                  default: 30
                  description: >-
                    Roughly how long a written script runs. Ignored when you
                    send `script`. Each template supports its own subset.
                  type: number
                  enum:
                    - 10
                    - 15
                    - 20
                    - 30
                    - 45
                    - 60
                    - 120
                    - 180
                    - 300
                source_url:
                  description: The website the video is about
                  type: string
                  format: uri
                source_text:
                  description: >-
                    A description of the business, product or offer, in your
                    words
                  type: string
                  minLength: 1
                  maxLength: 5000
                source_image_urls:
                  description: >-
                    Images already uploaded to LumisReach, in the order the
                    video shows them
                  maxItems: 10
                  type: array
                  items:
                    type: string
                    format: uri
                source_video_urls:
                  description: Videos already uploaded to LumisReach, in order
                  maxItems: 5
                  type: array
                  items:
                    type: string
                    format: uri
                script:
                  description: >-
                    Your own script, spoken word for word. Only for templates
                    that read a script (`talking_avatar`, `meme_hook`,
                    `phone_mockup`, `real_footage`). The video skips script
                    review and is charged when it is created.
                  type: string
                  minLength: 1
                  maxLength: 60000
                avatar_provider:
                  description: >-
                    Who renders the presenter. Defaults to `heygen` for an
                    interview and `tavus` otherwise (Tavus without `replica_id`
                    or `avatar_id` uses the account's default presenter).
                  type: string
                  enum:
                    - heygen
                    - tavus
                    - elevenlabs
                avatar_layout:
                  default: center
                  description: >-
                    Where the presenter sits. `audio_only` is for an automated
                    demo only.
                  type: string
                  enum:
                    - center
                    - bubble_bottom_left
                    - bubble_bottom_right
                    - audio_only
                avatar_id:
                  description: One of your saved avatars (required for ElevenLabs)
                  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)$
                replica_id:
                  description: 'A pre-made presenter: a Tavus face or a HeyGen look'
                  type: string
                  minLength: 1
                  maxLength: 100
                heygen_engine:
                  description: >-
                    HeyGen only. Omit for the most advanced engine the look
                    supports.
                  type: string
                  enum:
                    - avatar_iii
                    - avatar_iv
                    - avatar_v
                voice_id:
                  description: >-
                    An ElevenLabs avatar's voice, or the narrator of a narrated
                    template
                  type: string
                  minLength: 1
                  maxLength: 100
                interview_cast:
                  description: >-
                    `interview` only: who is in each window, in order. A null
                    window is cast for you.
                  maxItems: 4
                  type: array
                  items:
                    anyOf:
                      - type: object
                        properties:
                          replica_id:
                            description: A pre-made presenter id
                            type: string
                            minLength: 1
                            maxLength: 100
                          avatar_id:
                            description: One of your own saved avatars
                            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)$
                        additionalProperties: false
                      - type: 'null'
                background_mode:
                  default: static
                  description: >-
                    What the presenter stands in front of: `static` (a still of
                    the site), `scrolling` (scrolls the site or several images),
                    `footage` (your uploaded video), `automated_demo` (an agent
                    clicks through your product), `original` (the presenter's
                    own set) or `image` (a photo).
                  type: string
                  enum:
                    - static
                    - scrolling
                    - footage
                    - automated_demo
                    - original
                    - image
                background_image:
                  description: >-
                    `image` background: a built-in photo's slug, or
                    `upload:<index>` for one of your images
                  anyOf:
                    - type: string
                      enum:
                        - modern-office
                        - classical-hall
                        - library
                        - city-skyline
                        - city-street
                        - mountains
                        - park
                        - beach
                        - cafe
                        - loft
                    - type: string
                      pattern: ^upload:(\d{1,2})$
                b_roll:
                  description: >-
                    `talking_avatar` only: cut away to stock clips while the
                    presenter talks
                  type: boolean
                subtitle_style:
                  description: Burned-in subtitles. Default `none`.
                  type: string
                  enum:
                    - none
                    - classic
                    - boxed
                    - bold_words
                subtitle_position:
                  description: Null keeps the style's own place
                  anyOf:
                    - type: string
                      enum:
                        - top
                        - middle
                        - bottom
                    - type: 'null'
                subtitle_size:
                  type: string
                  enum:
                    - small
                    - medium
                    - large
                video_model:
                  description: >-
                    `freeform_ai` only: `<model>@<tier>`, e.g.
                    `seedance-2.5@720p`. Omit for the default.
                  type: string
                slide_count:
                  description: '`slideshow` only'
                  type: integer
                  minimum: 3
                  maximum: 10
                slide_source:
                  description: >-
                    `slideshow` only: where the pictures come from. Default
                    `ai`.
                  type: string
                  enum:
                    - uploaded
                    - website
                    - ai
                image_model:
                  description: >-
                    `slideshow` with AI pictures: the image model. Omit for the
                    default.
                  type: string
                stock_footage:
                  description: '`real_footage` only: the clip, by slug'
                  type: string
                  enum:
                    - young-woman-braids-portrait
                    - stylish-senior-woman-hat
                    - man-coffee-fedora
                    - woman-curly-hair-turns
                    - taxi-driver-by-cab
                    - bald-man-smiling
                    - asian-woman-laughing
                    - nurse-in-corridor
                    - woman-hijab-smiling
                    - man-dimple-smile
                    - grandmother-on-sofa
                    - man-coat-field
                    - older-man-plants
                    - young-man-glasses-curls
                    - construction-worker-hard-hat
                    - shop-owner-packing-box
                    - barista-iced-coffee
                    - man-making-pancakes
                    - senior-woman-reading
                    - man-driving-car
                    - florist-arranging-bouquet
                    - woman-cooking-spices
                    - woman-laptop-phone-breakfast
                    - woman-morning-coffee
                    - older-man-tea
                    - grandma-baking-with-granddaughter
                    - man-typing-laptop
                    - barista-pouring-milk
                    - builder-hammering-wall
                    - woman-treadmill-gym
                on_screen_caption:
                  description: >-
                    `real_footage` only: the caption over the clip. Omit to have
                    one written.
                  type: string
                  maxLength: 150
                footage_narrated:
                  description: >-
                    `real_footage` only: whether a narrator reads the script.
                    Default true.
                  type: boolean
                meme_clip_id:
                  description: '`meme_hook`: a clip from your library...'
                  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)$
                stock_meme_clip:
                  description: ...or a built-in clip, by slug
                  type: string
                  enum:
                    - dramatic-chipmunk
                    - sneezing-panda
                    - keyboard-cat
                    - vibing-cat
                    - screaming-goat
                    - coffin-dance
                    - epic-sax-guy
                    - rick-roll
                    - office-rage
                    - surprised-kitty
                phone_screen:
                  description: >-
                    `phone_mockup` only: what plays on the phone. Omit to pick
                    video, then website, then photos.
                  type: string
                  enum:
                    - video
                    - website
                    - photos
                demo_focus:
                  description: 'Site demos: the features to show, in your words'
                  type: string
                  maxLength: 1000
                demo_login:
                  description: >-
                    Site demos: sign in first to show the product behind the
                    login
                  type: object
                  properties:
                    login_url:
                      description: The sign-in page, if not the site's own
                      type: string
                      maxLength: 2000
                      format: uri
                    email:
                      type: string
                      minLength: 1
                      maxLength: 320
                    password:
                      type: string
                      minLength: 1
                      maxLength: 500
                      description: Stored encrypted; never returned
                  required:
                    - email
                    - password
                  additionalProperties: false
              required:
                - template
                - format
                - target_duration_seconds
                - avatar_layout
                - background_mode
              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:
                      price_cents:
                        type: integer
                        minimum: -9007199254740991
                        maximum: 9007199254740991
                        description: What the video will be charged, in cents
                      price_usd:
                        type: string
                        description: The same, formatted, e.g. "$1.23"
                      estimated:
                        type: boolean
                        description: >-
                          True when the words or shots are not known yet (no
                          `script`): the price assumes
                          `target_duration_seconds`, and the charge at approval
                          is for what was actually written.
                      seconds:
                        type: number
                        description: How long the quote assumes the video runs
                      line_items:
                        type: array
                        items:
                          type: object
                          properties:
                            label:
                              type: string
                            cents:
                              type: integer
                              minimum: -9007199254740991
                              maximum: 9007199254740991
                          required:
                            - label
                            - cents
                          additionalProperties: false
                        description: >-
                          What the price is made of. They add up to
                          `price_cents`.
                    required:
                      - price_cents
                      - price_usd
                      - estimated
                      - seconds
                      - line_items
                    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

````