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

# Estimate the credit cost of an image generation

> Same DTO as POST /v1/images. Returns the projected credit cost and a per-line-item breakdown (`base` + optional `enhance`) without enqueuing the work. Reference images are free and do not affect price. Inputs are validated with the same rules as the create path — a private style from another team, a retired style that no longer generates (400 `style_retired`), a foreign or not-ready character subject, an over-budget subjects[] all return the same error a real POST /v1/images would — with one difference: the estimate never fetches inline https reference URLs, so a problem specific to a URL (unreachable host, non-image content) only surfaces at create. `count` multiplies the quote on every request shape — plain, `subjects[]`, and `context_images` alike: images generate in parallel and you are billed per image, with partial failures delivering fewer images and auto-refunding the difference, so estimate(count: 4) equals 4 × estimate(count: 1). The response carries the same `warnings[]` the real create would return — a retired style that generates without a style, or a parameter with no effect on the selected generation path — so you can surface them before spending credits. Isolated rate-limit bucket (`estimate_post`, 120/min) so pricing-check loops do not crowd out real generations. Reference images can be supplied via reference_image_urls (mutually exclusive with character_id) or as `reference` subjects. A `context_images` estimate fires the same 400 combination errors a real POST /v1/images would, and never fetches inline https entries (file IDs are still ownership-checked). When you pin an `action_id`, the estimate runs the identical composition-act gates as POST /v1/images — existence/visibility (an unknown or inaccessible act → 404 `resource_not_found`) and, when subjects are present, the subject-count check (an unsupported count → 400 `action_not_available`, whose message names the counts the act supports) — but never picks or signs a reference still. The same gates run when your `lora_id` is a composition-act id (it acts as the pin). Acts and styles do not change the price.



## OpenAPI

````yaml /api-reference/openapi.json post /v1/images/estimate
openapi: 3.0.0
info:
  title: Aurous Labs API
  description: >-
    Generate AI images with custom LoRA styles.


    ## Authentication

    All requests require an API key passed in the `X-Api-Key` header.

    Create API keys in your
    [dashboard](https://app.aurous-labs.com/dashboard/api-keys).


    ## Closed-beta access gate

    API keys are scoped to a user. If that user's account is not approved for
    the closed beta, every request returns `403` with one of these `error.code`
    values:


    - `account_pending` — awaiting review

    - `account_rejected` — declined post-signup

    - `account_suspended` — was approved, then suspended


    There is no retry — contact support to be approved. The same codes are
    emitted by the WebSocket gateway via 4001 close.


    ## Common headers

    Every response carries `Aurous-Request-Id` (a server-minted `req_<ULID>` for
    support tracing) and `Aurous-Version` (the API version applied to the
    response). Optionally pin a version on the request with `Aurous-Version:
    YYYY-MM-DD` — defaults to your team's pinned version.


    ## Quick Start

    ```bash

    curl -X POST https://api.aurous-labs.com/v1/images \
      -H "X-Api-Key: al_live_your_key" \
      -H "Content-Type: application/json" \
      -d '{"prompt": "A golden sunset over mountains", "lora_id": "your-lora-id", "size": "2k_1_1"}'
    ```
  version: 1.0.0
  contact: {}
servers:
  - url: https://api.aurous-labs.com
    description: Production
  - url: https://api.preprod.aurous-labs.com
    description: Preprod (staging)
security: []
tags:
  - name: Seedance (raw)
    description: >-
      Drop-in raw passthrough for Seedance video generation. Point the official
      Seedance provider SDK at this API's base URL and authenticate with your
      Aurous API key in the `X-Api-Key` header — request bodies are forwarded to
      the provider verbatim and responses come back shape-identical, so you keep
      the provider's exact request/response shapes. Task ids are Aurous-native
      `vid_…` ids. Billing rides response headers, not the body:
      `Aurous-Credits-Held` on the create response and `Aurous-Credits-Charged`
      on a settled, succeeded task read — the body itself stays provider-shaped.
paths:
  /v1/images/estimate:
    post:
      tags:
        - Public API (v1)
      summary: Estimate the credit cost of an image generation
      description: >-
        Same DTO as POST /v1/images. Returns the projected credit cost and a
        per-line-item breakdown (`base` + optional `enhance`) without enqueuing
        the work. Reference images are free and do not affect price. Inputs are
        validated with the same rules as the create path — a private style from
        another team, a retired style that no longer generates (400
        `style_retired`), a foreign or not-ready character subject, an
        over-budget subjects[] all return the same error a real POST /v1/images
        would — with one difference: the estimate never fetches inline https
        reference URLs, so a problem specific to a URL (unreachable host,
        non-image content) only surfaces at create. `count` multiplies the quote
        on every request shape — plain, `subjects[]`, and `context_images`
        alike: images generate in parallel and you are billed per image, with
        partial failures delivering fewer images and auto-refunding the
        difference, so estimate(count: 4) equals 4 × estimate(count: 1). The
        response carries the same `warnings[]` the real create would return — a
        retired style that generates without a style, or a parameter with no
        effect on the selected generation path — so you can surface them before
        spending credits. Isolated rate-limit bucket (`estimate_post`, 120/min)
        so pricing-check loops do not crowd out real generations. Reference
        images can be supplied via reference_image_urls (mutually exclusive with
        character_id) or as `reference` subjects. A `context_images` estimate
        fires the same 400 combination errors a real POST /v1/images would, and
        never fetches inline https entries (file IDs are still
        ownership-checked). When you pin an `action_id`, the estimate runs the
        identical composition-act gates as POST /v1/images —
        existence/visibility (an unknown or inaccessible act → 404
        `resource_not_found`) and, when subjects are present, the subject-count
        check (an unsupported count → 400 `action_not_available`, whose message
        names the counts the act supports) — but never picks or signs a
        reference still. The same gates run when your `lora_id` is a
        composition-act id (it acts as the pin). Acts and styles do not change
        the price.
      operationId: V1EstimateController_estimateImage
      parameters:
        - name: Aurous-Version
          in: header
          required: false
          description: >-
            Optional API version pin (YYYY-MM-DD). Defaults to your team's
            pinned version, or the system default `2026-07-16` for
            unauthenticated requests.
          schema:
            type: string
            example: '2026-07-16'
            pattern: ^\d{4}-\d{2}-\d{2}$
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateGenerationDto'
      responses:
        '200':
          description: Cost estimate
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EstimateResponse'
          headers:
            Aurous-Request-Id:
              description: Server-minted request id. Quote this in support tickets.
              schema:
                type: string
                example: req_01HXMQ7Z3K8Y2NABCDEFGHJKMP
            Aurous-Version:
              description: API version pin applied to this response (YYYY-MM-DD).
              schema:
                type: string
                example: '2026-07-16'
            X-RateLimit-Limit:
              description: Bucket capacity (max tokens) for this endpoint class.
              schema:
                type: integer
                example: 120
            X-RateLimit-Remaining:
              description: Tokens remaining after this request.
              schema:
                type: integer
                example: 119
            X-RateLimit-Reset:
              description: >-
                Epoch seconds when the bucket would be full again, assuming no
                further requests.
              schema:
                type: integer
                example: 1700000060
            Deprecation:
              description: >-
                Present (always the literal string `true`) on a 2xx response to
                POST /v1/images, /v1/images/estimate, /v1/videos or
                /v1/videos/estimate when the request body used the legacy
                `character_id` or `reference_image_urls` field instead of
                `subjects[]`. Absent otherwise. No removal date is set — see the
                linked guide.
              schema:
                type: string
                enum:
                  - 'true'
                example: 'true'
            Link:
              description: >-
                Paired with `Deprecation` — an RFC 8288 link to the subjects[]
                migration guide (`rel="deprecation"`). Same presence rule as
                `Deprecation`.
              schema:
                type: string
                example: >-
                  <https://docs.aurous-labs.com/guides/subjects>;
                  rel="deprecation"; type="text/html"
        '400':
          description: >-
            Validation failed, a retired style was pinned (code:
            `style_retired`), an invalid parameter combination (e.g.
            `context_images` with `lora_id`, or a composition-act `lora_id` with
            a different `action_id`), or a pinned composition act that does not
            support the subject count (code: `action_not_available`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            Aurous-Request-Id:
              description: Server-minted request id. Quote this in support tickets.
              schema:
                type: string
                example: req_01HXMQ7Z3K8Y2NABCDEFGHJKMP
            Aurous-Version:
              description: API version pin applied to this response (YYYY-MM-DD).
              schema:
                type: string
                example: '2026-07-16'
            X-RateLimit-Limit:
              description: Bucket capacity (max tokens) for this endpoint class.
              schema:
                type: integer
                example: 120
            X-RateLimit-Remaining:
              description: Tokens remaining after this request.
              schema:
                type: integer
                example: 119
            X-RateLimit-Reset:
              description: >-
                Epoch seconds when the bucket would be full again, assuming no
                further requests.
              schema:
                type: integer
                example: 1700000060
        '401':
          description: Unauthorized — missing or invalid API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            Aurous-Request-Id:
              description: Server-minted request id. Quote this in support tickets.
              schema:
                type: string
                example: req_01HXMQ7Z3K8Y2NABCDEFGHJKMP
            Aurous-Version:
              description: API version pin applied to this response (YYYY-MM-DD).
              schema:
                type: string
                example: '2026-07-16'
            X-RateLimit-Limit:
              description: Bucket capacity (max tokens) for this endpoint class.
              schema:
                type: integer
                example: 120
            X-RateLimit-Remaining:
              description: Tokens remaining after this request.
              schema:
                type: integer
                example: 119
            X-RateLimit-Reset:
              description: >-
                Epoch seconds when the bucket would be full again, assuming no
                further requests.
              schema:
                type: integer
                example: 1700000060
        '403':
          description: >-
            Account not approved for closed beta. error.code is one of
            `account_pending`, `account_rejected`, `account_suspended`. There is
            no retry — contact support to be approved.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            Aurous-Request-Id:
              description: Server-minted request id. Quote this in support tickets.
              schema:
                type: string
                example: req_01HXMQ7Z3K8Y2NABCDEFGHJKMP
            Aurous-Version:
              description: API version pin applied to this response (YYYY-MM-DD).
              schema:
                type: string
                example: '2026-07-16'
            X-RateLimit-Limit:
              description: Bucket capacity (max tokens) for this endpoint class.
              schema:
                type: integer
                example: 120
            X-RateLimit-Remaining:
              description: Tokens remaining after this request.
              schema:
                type: integer
                example: 119
            X-RateLimit-Reset:
              description: >-
                Epoch seconds when the bucket would be full again, assuming no
                further requests.
              schema:
                type: integer
                example: 1700000060
        '404':
          description: Style, character, or composition act not found / inaccessible
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            Aurous-Request-Id:
              description: Server-minted request id. Quote this in support tickets.
              schema:
                type: string
                example: req_01HXMQ7Z3K8Y2NABCDEFGHJKMP
            Aurous-Version:
              description: API version pin applied to this response (YYYY-MM-DD).
              schema:
                type: string
                example: '2026-07-16'
            X-RateLimit-Limit:
              description: Bucket capacity (max tokens) for this endpoint class.
              schema:
                type: integer
                example: 120
            X-RateLimit-Remaining:
              description: Tokens remaining after this request.
              schema:
                type: integer
                example: 119
            X-RateLimit-Reset:
              description: >-
                Epoch seconds when the bucket would be full again, assuming no
                further requests.
              schema:
                type: integer
                example: 1700000060
        '429':
          description: Rate limit exceeded
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            Aurous-Request-Id:
              description: Server-minted request id. Quote this in support tickets.
              schema:
                type: string
                example: req_01HXMQ7Z3K8Y2NABCDEFGHJKMP
            Aurous-Version:
              description: API version pin applied to this response (YYYY-MM-DD).
              schema:
                type: string
                example: '2026-07-16'
            X-RateLimit-Limit:
              description: Bucket capacity (max tokens) for this endpoint class.
              schema:
                type: integer
                example: 120
            X-RateLimit-Remaining:
              description: Tokens remaining after this request.
              schema:
                type: integer
                example: 119
            X-RateLimit-Reset:
              description: >-
                Epoch seconds when the bucket would be full again, assuming no
                further requests.
              schema:
                type: integer
                example: 1700000060
            Retry-After:
              description: >-
                Seconds to wait before retrying. Present on 429 (rate limit) and
                on 503 provider_unavailable. Prefer this over computing
                X-RateLimit-Reset − now.
              schema:
                type: integer
                example: 12
        '503':
          description: >-
            Character generation is temporarily unavailable, or the platform
            could not verify your account/billing state or prepare the request
            (for example, reference images) before dispatch — error.code is
            `provider_unavailable` in every case. Retry after the number of
            seconds in the `Retry-After` header.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            Aurous-Request-Id:
              description: Server-minted request id. Quote this in support tickets.
              schema:
                type: string
                example: req_01HXMQ7Z3K8Y2NABCDEFGHJKMP
            Aurous-Version:
              description: API version pin applied to this response (YYYY-MM-DD).
              schema:
                type: string
                example: '2026-07-16'
            X-RateLimit-Limit:
              description: Bucket capacity (max tokens) for this endpoint class.
              schema:
                type: integer
                example: 120
            X-RateLimit-Remaining:
              description: Tokens remaining after this request.
              schema:
                type: integer
                example: 119
            X-RateLimit-Reset:
              description: >-
                Epoch seconds when the bucket would be full again, assuming no
                further requests.
              schema:
                type: integer
                example: 1700000060
            Retry-After:
              description: >-
                Seconds to wait before retrying. Present on 429 (rate limit) and
                on 503 provider_unavailable. Prefer this over computing
                X-RateLimit-Reset − now.
              schema:
                type: integer
                example: 12
      security:
        - api-key: []
components:
  schemas:
    CreateGenerationDto:
      type: object
      properties:
        prompt:
          type: string
          description: >-
            The text prompt describing the image to generate. 1-4000 characters;
            whitespace-only is rejected.
          example: A golden sunset over mountains, cinematic lighting, 8k resolution
          minLength: 1
          maxLength: 4000
        lora_id:
          type: string
          nullable: true
          example: lora_01HXMQ7Z3K8Y2VNABCDEFGHJKM
          description: >-
            Optional. Style identifier (lora_*) or slug, from GET /v1/loras.
            Tri-state: omit and matching runs automatically when your prompt
            names a look; send null to disable style matching for this request;
            send an id to pin that style. Styles now compose with `action_id`
            and `subjects` — a composition-act id in this field cannot be
            combined with a different `action_id`. Retired style ids keep
            working: aliased ids apply their successor style (echoed in
            `response.style`); other retired ids generate without a style and
            add a `warnings[]` entry.
        character_id:
          type: string
          description: >-
            Optional character ID (`char_<ulid>` from POST /v1/characters; UUID
            also accepted for legacy back-compat). When set, the character's
            reference images are sent to the model as visual anchors for
            identity consistency. The character must be in `status: ready` —
            referencing a `synthesizing` / `reviewing` / `failed` character
            returns 400 `character_not_ready`. Cross-team character_ids return
            404 (existence is never leaked). Mutually exclusive with
            `reference_image_urls`: sending both returns 400
            `mutually_exclusive_input`. The output follows your prompt.
            Superseded by `subjects[]`; fully supported — successful responses
            carry an advisory `Deprecation: true` header when this field is
            used.
          example: char_01HXMQ7Z3K8Y2VNABCDEFGHJKM
          deprecated: true
        width:
          type: number
          description: >-
            Custom output image width in pixels. Use with `height` OR use `size`
            (preset), not both. Range [1024, 4096]; snapped server-side to the
            nearest multiple of 32. Sending both `size` and custom dimensions
            returns 400 with code `parameter_invalid_combination`. Sending only
            one of `width`/`height` returns 400 with code `missing_field`.
          example: 2048
          minimum: 1024
          maximum: 4096
        height:
          type: number
          description: >-
            Custom output image height in pixels. Use with `width` OR use `size`
            (preset), not both. Range [1024, 4096]; snapped server-side to the
            nearest multiple of 32. Sending both `size` and custom dimensions
            returns 400 with code `parameter_invalid_combination`. Sending only
            one of `width`/`height` returns 400 with code `missing_field`.
          example: 2048
          minimum: 1024
          maximum: 4096
        size:
          type: string
          description: >-
            Image size as a named preset. Use this OR custom `width`/`height`,
            not both. Format is `<tier>_<ratio>` where tier is `2k` or `4k` and
            ratio matches the supported aspect-ratio set. Sending both `size`
            and custom dimensions returns 400 with code
            `parameter_invalid_combination`.
          example: 2k_1_1
          enum:
            - 2k_1_1
            - 2k_3_2
            - 2k_2_3
            - 2k_4_3
            - 2k_3_4
            - 2k_16_9
            - 2k_9_16
            - 2k_21_9
            - 4k_1_1
            - 4k_3_2
            - 4k_2_3
            - 4k_4_3
            - 4k_3_4
            - 4k_16_9
            - 4k_9_16
            - 4k_21_9
        count:
          type: number
          description: >-
            Number of images to generate in this request (1-4, whole number).
            Images generate in parallel and you are billed per image; if some
            images in the batch fail, you receive the ones that succeeded and
            the difference is refunded automatically — the response
            `image_count` reflects the number actually delivered.
          example: 1
          minimum: 1
          maximum: 4
        enhance_prompt:
          type: boolean
          description: >-
            When true, an LLM rewrites your prompt before generation to a more
            detailed, model-friendly form; the rewritten prompt is what reaches
            the model. This is the only customer-facing prompt-shaping toggle in
            the public API, and the only one that changes the price: enhanced
            generations cost a configurable multiplier of the base rate. Styled
            generations (a pinned or auto-matched style) always shape the prompt
            around the style — that built-in pass is not the enhancer, never
            fails a request, and never bills the enhancer multiplier unless you
            set this flag yourself.
          example: false
        reference_image_urls:
          description: >-
            Up to 6 reference images. Each entry can be either:
             - an opaque file ID `file_<ulid>` returned by `POST /v1/files`, or
             - an `https://` URL pointing at a public host (max 2048 chars).
            URLs are server-side fetched through an SSRF-pinned client (rejects
            private IPs / loopback / link-local / cloud metadata) and
            materialized as a 24h-TTL file under your team. Image files only — a
            `file_<ulid>` uploaded with purpose
            `reference_video`/`reference_audio` is rejected (400
            `invalid_format`). Pricing matches the reference-image rate (see
            Pricing). Empty array or omitted is treated as "no references".
            Mutually exclusive with `character_id` — sending both returns 400
            `mutually_exclusive_input`. Superseded by `subjects[]`; fully
            supported — successful responses carry an advisory `Deprecation:
            true` header when this field is used.
          example:
            - file_01HXMQ7Z3K8Y2NABCDEFGHJKMN
            - https://example.com/ref2.jpg
          minItems: 0
          maxItems: 6
          deprecated: true
          type: array
          items:
            type: string
        subjects:
          maxItems: 10
          description: >-
            Ordered subjects composed into one image (Image 1, Image 2, …). Max
            10 subjects and 10 input images total. Mutually exclusive with
            character_id/reference_image_urls (both → 400
            mutually_exclusive_input). Composes with `lora_id` when it names a
            style; the few styles that pick their own model still return 400
            parameter_invalid_combination. Omit or [] for text-to-image/style.
          type: array
          items:
            $ref: '#/components/schemas/SubjectDto'
        context_images:
          minItems: 0
          maxItems: 10
          example:
            - file_01HXMQ7Z3K8Y2NABCDEFGHJKMN
            - https://example.com/outfit.jpg
          description: >-
            Up to 10 loose reference images for multi-image composition,
            interpreted from your prompt — no identity grouping or per-subject
            framing is applied, and no identity consistency is guaranteed.
            Positions follow array order and can be addressed in the prompt as
            "Image 1" … "Image 10" (e.g. "the outfit in Image 3"). Each entry is
            a `file_<ulid>` ID from POST /v1/files or an https URL to a public
            host (max 2048 chars). Empty array or omitted is treated as "no
            context images". Mutually exclusive with `subjects`, `character_id`,
            and `reference_image_urls` (400 `mutually_exclusive_input`) and with
            `lora_id` (400 `parameter_invalid_combination` — multi-image
            composition picks its own model; styles cannot be stacked). The
            response echoes only a count (`context_images: { image_count }`),
            never the image URLs.
          type: array
          items:
            type: string
        action_id:
          type: string
          nullable: true
          example: 3f2b6c1e-8a4d-4e2b-9c7a-1d5e8f0a2b3c
          description: >-
            Pin a composition act from `GET /v1/actions`. Treat the id as opaque
            — it comes from the catalog and nowhere else. With subjects, the act
            must support your subject count (see `supported_character_counts`) —
            an unsupported count returns 400 `action_not_available`. Without
            subjects, the act renders with a new person described by your
            prompt. Omit to let act detection run automatically; send `null` to
            disable detection for this request. Combinable with `lora_id` when
            that id names a prompt style (the act and the style compose); a
            composition-act id sent in `lora_id` already acts as the pin, so it
            cannot be combined with a DIFFERENT `action_id` (400
            `parameter_invalid_combination`). Mutually exclusive with
            `context_images` (400 `mutually_exclusive_input`). An id that is
            unknown or not visible to your team returns 404 `resource_not_found`
            — the same uniform 404 as `GET /v1/actions/{id}`.
        output_format:
          type: string
          enum:
            - jpeg
            - png
          example: jpeg
          description: >-
            Output format. `png` yields a transparent background where the
            composition supports it. Default `jpeg`.
      required:
        - prompt
    EstimateResponse:
      type: object
      properties:
        object:
          type: string
          description: Discriminator
          example: estimate
          enum:
            - estimate
        estimated_cost:
          description: Cost breakdown for this would-be generation.
          allOf:
            - $ref: '#/components/schemas/EstimatedCost'
        currency:
          type: string
          description: Currency unit. All amounts in this response are in `credit`.
          example: credit
          enum:
            - credit
        warnings:
          description: >-
            Non-fatal request adjustments the real create would also report
            (e.g. a retired style pin that generates without a style, or a
            parameter with no effect on this generation path). Same shape and
            codes as the `warnings` on the `POST /v1/images` 201 body — the
            estimate warns exactly when the create would. Omitted when empty.
            Codes are an OPEN set: ignore unknown codes.
          example:
            - code: parameter_ignored
              param: seed
              message: '`seed` has no effect on this generation and was ignored.'
          type: array
          items:
            $ref: '#/components/schemas/WarningEntry'
      required:
        - object
        - estimated_cost
        - currency
    ErrorResponse:
      type: object
      properties:
        error:
          description: Error payload
          allOf:
            - $ref: '#/components/schemas/ErrorPayload'
      required:
        - error
    SubjectDto:
      type: object
      properties:
        type:
          type: string
          enum:
            - character
            - reference
          example: character
          description: Subject kind.
        character_id:
          type: string
          example: char_01HXMQ7Z3K8Y2VNABCDEFGHJKM
          description: >-
            Required for `character` subjects. `char_<ulid>` or legacy UUID;
            must be a ready character your team owns.
        image_urls:
          minItems: 1
          maxItems: 10
          example:
            - file_01HXMQ7Z3K8Y2NABCDEFGHJKMN
          description: Required for `reference` subjects. 1–10 `file_<ulid>` or https URLs.
          type: array
          items:
            type: string
      required:
        - type
    EstimatedCost:
      type: object
      properties:
        amount:
          type: number
          description: >-
            Total credit cost. For images this equals the sum of the `breakdown`
            line items. For videos the price is token-based (per-model rate
            table): `breakdown` carries the token input (`tokens_max`, plus
            optional `enhance_flat_credits`/`discount_factor`), NOT additive
            line items — do not sum it, trust `amount`. For an adaptive video
            (`adaptive: true`) this equals `amount_max` — the ceiling reserved
            up front; you are billed for the delivered length and refunded the
            difference. In all cases trust `amount` as the authoritative figure
            held/charged — it matches the live hold to 4 decimals.
          example: 2
        adaptive:
          type: boolean
          description: >-
            True only for an adaptive (variable-length) video estimate
            (`duration: -1`, the default — see POST /v1/videos). When true the
            price is a range: render `amount_min`–`amount_max`. When false
            (every image estimate, and any video estimate with a fixed
            duration), `amount` is exact.
          example: false
        amount_min:
          type: number
          description: >-
            Adaptive video estimates only: the minimum charge (shortest
            supported length, currently 4 s).
          example: 10
        amount_max:
          type: number
          description: >-
            Adaptive video estimates only: the maximum charge (longest supported
            length, currently 15 s) — equals `amount`.
          example: 37.5
        breakdown:
          type: object
          description: >-
            Cost inputs, keyed by source. Image estimates use `base` (always)
            and `enhance` (only when `enhance_prompt: true`); refs are free and
            do not add line items. When the team has a negotiated discount, an
            additional `discount_factor` line is present — it is a multiplier
            (e.g. `0.9` for 10% off), not a credit amount; `amount` is the
            post-discount total. Video estimates carry token-model inputs:
            `tokens_max` (the ceiling token count used for pricing), plus
            optional `enhance_flat_credits` and `discount_factor` lines. Video
            estimate breakdowns are NOT additive — `amount` is the authoritative
            figure. For adaptive video estimates (`duration: -1`), also check
            the top-level `amount_min`/`amount_max` range. Example image
            breakdown: `{ "base": 1.0, "enhance": 1.0 }`; example video estimate
            breakdown: `{ "tokens_max": 108000, "enhance_flat_credits": 0.5 }`.
            Values are typed `number | string | boolean`: the estimate itself
            returns numeric keys only, but the field set is OPEN and shares its
            contract with the settled generation `cost.breakdown`, which carries
            string/boolean metadata (e.g. `resolution`, `video_input`) — so read
            by name and tolerate non-numeric values on unknown keys.
          example:
            tokens_max: 108000
            enhance_flat_credits: 0.5
      required:
        - amount
        - breakdown
    WarningEntry:
      type: object
      properties:
        code:
          type: string
          description: >-
            Machine-readable warning code. Current values: `parameter_ignored`
            (a parameter you sent has no effect on this generation path and was
            ignored) and `style_retired_plain` (the pinned `lora_id` is retired
            — the generation proceeded without a style). This is an OPEN set:
            new codes may be added without a version bump, so ignore unknown
            codes rather than failing on them.
          example: style_retired_plain
        param:
          type: string
          description: >-
            Machine-readable name of the request field the warning is about
            (e.g. `lora_id`, `seed`).
          example: lora_id
        message:
          type: string
          description: >-
            Human-readable explanation. Wording may change; branch on
            `code`/`param`, not on this text.
          example: >-
            Style lora_06AAAAAAAAAAAAAAAAAAAAAAAA is retired and no longer
            applies a style — this request generates without one.
      required:
        - code
        - param
        - message
    ErrorPayload:
      type: object
      properties:
        type:
          type: string
          description: Broad error category
          example: invalid_request
          enum:
            - invalid_request
            - authentication
            - not_found
            - rate_limit
            - server_error
        code:
          type: string
          description: >-
            Stable error code (programmatic discriminator). Closed-beta gate
            emits one of `account_pending`, `account_rejected`,
            `account_suspended` on 403.
          example: balance_too_low
          enum:
            - invalid_request
            - missing_field
            - invalid_format
            - value_out_of_range
            - unsupported_lora_for_mode
            - generation_not_cancellable
            - prompt_blocked
            - reference_blocked
            - output_moderation_rejected
            - unknown_version
            - mutually_exclusive_input
            - character_not_ready
            - parameter_invalid_combination
            - style_retired
            - parameter_invalid
            - too_many_reference_images
            - action_not_available
            - upload_invalid
            - balance_too_low
            - idempotency_key_in_use
            - api_key_not_found
            - payload_too_large
            - missing_api_key
            - invalid_api_key
            - revoked_api_key
            - resource_not_found
            - forbidden_resource
            - account_pending
            - account_rejected
            - account_suspended
            - already_approved
            - already_rejected
            - already_suspended
            - invalid_reinstate_target
            - invalid_suspend_target
            - cannot_moderate_admin
            - too_many_requests
            - concurrency_limit_exceeded
            - tpm_rate_limit_exceeded
            - internal_error
            - provider_unavailable
            - provider_timeout
            - provider_not_configured
            - invalid_time_range
            - invalid_bucket_width
            - too_many_buckets
            - too_many_group_by
            - invalid_filter
            - invalid_page_token
            - export_too_large
            - user_already_exists
            - self_invite_forbidden
            - invite_link_failed
            - invite_rate_limited
            - model_not_found
            - model_disabled
            - model_wrong_kind
            - max_tokens_exceeds_hard_cap
            - chat_model_misconfigured
            - embeddings_input_too_large
            - embeddings_unsupported_dimensions
            - pricing_frozen
            - provider_rate_limited
            - chat_provider_request_invalid
            - chat_provider_auth_failed
            - chat_provider_unavailable
            - max_input_tokens_exceeded
            - chat_provider_unknown_error
            - embeddings_provider_unknown_error
            - embeddings_batch_not_supported
            - embeddings_input_too_many_items
            - embeddings_video_unsupported
            - encoding_format_unsupported
            - missing_max_tokens_no_model_default
            - chat_cancel_target_not_found
            - chat_completion_not_found
            - chat_cancel_target_already_terminal
            - chat_cancel_target_not_cancellable
            - tool_choice_required_unsupported
            - response_format_too_large
            - response_format_too_deep
            - invalid_cursor
            - invalid_cursor_for_endpoint
            - model_slug_exists
            - output_expired
            - output_not_available
            - content_filtered
            - image_generation_failed
            - reference_media_invalid
            - reference_media_cap_reached
            - reference_fetch_failed
            - unsupported_auth_method
            - insufficient_scope
            - uploads_expired
            - provider_unknown_error
            - first_frame_too_small
        message:
          type: string
          description: Human-readable message
          example: Team available balance is 1.5 credits, generation requires 2.0.
        param:
          type: object
          description: Field name when the error is parameter-scoped
          example: prompt
          nullable: true
        doc_url:
          type: string
          description: Documentation link for this error code
          example: https://docs.aurous-labs.com/errors#balance_too_low
        request_id:
          type: string
          description: Echoes Aurous-Request-Id — quote in support tickets
          example: req_01HXMQ7Z3K8Y2VNABCDEFGHJKM
      required:
        - type
        - code
        - message
        - doc_url
        - request_id
  securitySchemes:
    api-key:
      type: apiKey
      in: header
      name: X-Api-Key
      description: Your team API key (starts with `al_live_`).

````