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

# Wait For Run

> Block until the execution reaches a terminal state (`completed`, `failed`,
or `cancelled`) or the timeout expires.

This is a simpler alternative to SSE streaming for agents and HTTP clients
that cannot consume event streams. The server polls internally and returns
once the execution is done.

If the timeout expires before the execution finishes, the response includes
`timeout: true` alongside the current execution state. This is NOT an error
— the execution is still running. You can call this endpoint again or switch
to polling.

**Recommended for agents:** Use `timeout=60` (default) for typical image
workflows. Use `timeout=120` for video workflows.


Long-poll endpoint that blocks until the execution finishes or the timeout expires. Simpler alternative to SSE streaming for agents and HTTP clients that cannot consume event streams.

Use this when your agent runtime does not support `EventSource` or SSE. The server polls internally and returns once the execution reaches `completed`, `failed`, or `cancelled`.

If the timeout expires first, the response includes `timeout: true` alongside the current execution state — this is not an error.

## Recommended timeouts

* Image workflows: `timeout=60` (default)
* Video workflows: `timeout=120`

## Compared to other result delivery methods

| Method                   | When to use                                                             |
| ------------------------ | ----------------------------------------------------------------------- |
| **Wait (this endpoint)** | Agent can make HTTP calls but not consume SSE. Simplest integration.    |
| **SSE stream**           | Need real-time progress events (node completions, intermediate status). |
| **Webhook**              | Production workloads where you don't want open connections.             |
| **Polling**              | Fallback when none of the above fit. Poll every 3-5 seconds.            |


## OpenAPI

````yaml GET /v1/runs/{runId}/wait
openapi: 3.1.0
info:
  title: Lamina Apps API
  version: 1.0.0
  description: >
    Professional creative content production for AI agents. Create brand-aligned
    images, videos, and designs from natural-language briefs using 30+
    specialized AI pipelines.


    Unlike raw model APIs (DALL-E, Flux, Kling), Lamina automatically applies
    brand guidelines, selects the optimal multi-model pipeline, scores output
    quality, and delivers permanent CDN-hosted URLs with composability metadata
    for chaining.


    ## Authentication

    All endpoints require an API key passed via one of these headers:

    - `x-api-key: lma_your_key` (recommended)

    - `Authorization: Bearer lma_your_key`


    API keys are workspace-scoped. Create them in **Settings -> API Keys**.


    ## Quick Start (One-Call Path)

    `POST /v1/create` with `{ "brief": "product photo of sneakers", "sync": true
    }` — returns completed output inline with CDN URL.


    ## Quick Start (Advanced)

    1. `GET /v1/apps` -- browse 30+ specialized creative apps

    2. `GET /v1/apps/{appId}` -- inspect input parameters

    3. `POST /v1/apps/{appId}/runs?webhook=<url>` -- run with your inputs

    4. Receive results via webhook, poll `GET /v1/runs/{runId}`, or stream via
    `GET /v1/runs/{runId}/stream`


    ## Rate Limits

    All `/v1/*` endpoints are currently limited to 100 requests per minute per
    IP.

    On `429`, read the `RateLimit-*` and `Retry-After` headers before retrying.


    ## How Inputs Work

    When running an app, provide inputs as a JSON object keyed by parameter
    **name** (from the app details response).


    - **text** parameters: send a string value (e.g. a prompt or description)

    - **options** parameters: send the **label** of the option (e.g.
    `"Caucasian"`), not an internal value

    - **url** parameters: send a publicly accessible URL to an image or video


    Every parameter is returned with `required: true`. Parameters with a
    `default` can safely be omitted -- the app will use the default value.


    ## Endpoint Groups

    | Group | Purpose |

    |-------|---------|

    | **Apps** | Discover and inspect available content creation apps |

    | **Runs** | Run workflows, track progress, and retrieve results |

    | **Assets** | Browse generated images, videos, and text from past
    executions |

    | **Intelligence** | Brand context, performance prediction, recommendations,
    and trends |

    | **Publishing** | Publish content to connected social channels |

    | **Content** | One-call agent operations: create, score, brief, batch |

    | **Account** | Credit balance and rate limit visibility |

    | **Templates** | Content creation templates and strategies |

    | **Webhooks** | Webhook signature verification |
servers:
  - url: https://app.uselamina.ai
    description: Production
security:
  - apiKey: []
tags:
  - name: Create
    description: Create content from briefs, run specific apps, and use templates
  - name: Discover
    description: Find and inspect available apps and their input schemas
  - name: Track
    description: Monitor execution progress, retrieve results, and browse generated assets
  - name: Intelligence
    description: >-
      Brand context, performance prediction, content recommendations, and trend
      signals
  - name: Distribute
    description: Publish content to social channels and transfer assets to CDN
  - name: Score
    description: Evaluate content quality, brand alignment, and engagement potential
  - name: Account
    description: Credit balance, rate limits, and health checks
  - name: Webhooks
    description: Webhook signature verification for secure callback handling
paths:
  /v1/runs/{runId}/wait:
    get:
      tags:
        - Track
      summary: Wait For Run
      description: >
        Block until the execution reaches a terminal state (`completed`,
        `failed`,

        or `cancelled`) or the timeout expires.


        This is a simpler alternative to SSE streaming for agents and HTTP
        clients

        that cannot consume event streams. The server polls internally and
        returns

        once the execution is done.


        If the timeout expires before the execution finishes, the response
        includes

        `timeout: true` alongside the current execution state. This is NOT an
        error

        — the execution is still running. You can call this endpoint again or
        switch

        to polling.


        **Recommended for agents:** Use `timeout=60` (default) for typical image

        workflows. Use `timeout=120` for video workflows.
      operationId: waitForRun
      parameters:
        - $ref: '#/components/parameters/runId'
        - name: timeout
          in: query
          required: false
          schema:
            type: integer
            default: 60
            minimum: 1
            maximum: 120
          description: Maximum seconds to wait before returning (default 60, max 120)
      responses:
        '200':
          description: |
            Execution status. If `timeout` is `true`, the execution has not yet
            reached a terminal state — poll again or wait longer.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/ExecutionStatus'
                  timeout:
                    type: boolean
                    description: '`true` if the wait timed out before the execution finished'
              examples:
                completed:
                  summary: Run completed within timeout
                  value:
                    data:
                      runId: fc32ae7d-6840-4be3-8fb1-539a60e33fc3
                      workflowId: 80d4d454-8844-489f-b903-2ad65a414482
                      status: completed
                      outputs:
                        - id: aiDesignerNode-1773051929782
                          label: AI Designer
                          type: image
                          value: https://storage.example.com/output.png
                          status: completed
                          error: null
                      completedAt: '2026-04-18T14:32:15.000Z'
                timed_out:
                  summary: Timeout reached — run still running
                  value:
                    data:
                      runId: fc32ae7d-6840-4be3-8fb1-539a60e33fc3
                      workflowId: 80d4d454-8844-489f-b903-2ad65a414482
                      status: running
                      outputs: []
                    timeout: true
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/TooManyRequests'
components:
  parameters:
    runId:
      name: runId
      in: path
      required: true
      schema:
        type: string
        format: uuid
      description: The run ID returned from the Run App or Content Create endpoint
  schemas:
    ExecutionStatus:
      type: object
      description: Poll until `status` is `completed` or `failed`.
      required:
        - runId
        - workflowId
        - status
        - createdAt
      properties:
        runId:
          type: string
          format: uuid
        workflowId:
          type: string
          format: uuid
        status:
          type: string
          enum:
            - queued
            - running
            - completed
            - failed
            - cancelled
          description: |
            `queued` -- waiting to start
            `running` -- processing nodes
            `completed` -- all outputs ready, read `value` fields
            `failed` -- check `errorMessage` and output `error` fields
            `cancelled` -- execution was cancelled
        outputs:
          type: array
          items:
            $ref: '#/components/schemas/Output'
        errorMessage:
          type: string
          nullable: true
          description: Set when execution fails. Null on success.
        startedAt:
          type: string
          format: date-time
          nullable: true
        completedAt:
          type: string
          format: date-time
          nullable: true
        createdAt:
          type: string
          format: date-time
    Output:
      type: object
      description: A single output from a processing node.
      required:
        - id
        - label
        - type
        - status
      properties:
        id:
          type: string
          description: Node identifier (matches workflow node `id`)
        label:
          type: string
          description: Human-readable name
        type:
          type: string
          description: |
            `pending` -- not yet produced (still processing)
            `image` -- `value` is a URL to a generated image
            `video` -- `value` is a URL to a generated video
            `text` -- `value` is generated text content
        value:
          description: The output content. Null while `status` is `pending`.
          nullable: true
        status:
          type: string
          enum:
            - pending
            - completed
            - error
          description: |
            `pending` -- still processing
            `completed` -- result ready in `value`
            `error` -- failed, check `error` field
        error:
          type: string
          nullable: true
          description: Error message if this output failed. Null on success.
  responses:
    Unauthorized:
      description: Missing or invalid API key
      content:
        application/json:
          schema:
            type: object
            properties:
              error:
                type: string
          example:
            error: Invalid API key
    NotFound:
      description: Resource not found
      content:
        application/json:
          schema:
            type: object
            properties:
              error:
                type: string
          example:
            error: App not found
    TooManyRequests:
      description: >-
        Rate limit exceeded. All `/v1/*` endpoints are currently limited to 100
        requests per minute per IP.
      headers:
        RateLimit-Policy:
          description: Active rate limit policy.
          schema:
            type: string
            example: 100;w=60
        RateLimit-Limit:
          description: Max requests allowed in the current window.
          schema:
            type: integer
            example: 100
        RateLimit-Remaining:
          description: Requests remaining in the current window.
          schema:
            type: integer
            example: 0
        RateLimit-Reset:
          description: Seconds until the current window resets.
          schema:
            type: integer
            example: 60
        Retry-After:
          description: Seconds to wait before retrying.
          schema:
            type: integer
            example: 60
      content:
        text/plain:
          schema:
            type: string
          example: Too many requests from this IP, please try again in a minute
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: x-api-key
      description: 'Workspace API key. Prefix: `lma_`. Example: `lma_abc123...`'

````