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

# Show a published Workflow in a page of its own

> A page that runs a published workflow, for a place that can only be given an address or an iframe: a chat messenger, a link page, a site builder, a blog that follows oEmbed. No API key, no SDK to add. The page holds the Embed SDK and the same tag a website carries (`<widgetic workflow-id composition-id>`), so a visitor moves from one composition to the next in place, by the same rules, exactly as on a website. A paused workflow shows its first composition alone, as its embeds do.
**What the frame can count.** Only what happens inside it: entries, a widget's goals and actions, and waits. The page events a website can send to a workflow (`widgetic:workflow-event`) are events of the page around the embed, and they do not cross an iframe, so a connection that waits for one never fires from a frame.
A workflow that is a draft, is archived, or does not exist, and one whose owner is not being served, answers 404 with a short page that gives no reason. If the owner of the workflow's first composition listed the websites it may appear on, the page is sent with `Content-Security-Policy: frame-ancestors` naming those websites (and Widgetic's own, and the website where the partner the owner administers integrates Widgetic, with its subdomains), so a browser refuses to show it inside any other website. Opening the address directly still works. An owner who listed nothing is not restricted.
The page links its oEmbed card, so a site that follows oEmbed turns the address of the frame into an embed.
**Address.** `https://api.widgetic.com/embed/workflows/{workflowId}/frame`: the root of the API host, NOT under `/v1`. A client generated from this description for `https://api.widgetic.com/v1` must be given the base address `https://api.widgetic.com` for the calls of the `Public Embed` tag.



## OpenAPI

````yaml /openapi/widgetic-api-public.json get /embed/workflows/{workflowId}/frame
openapi: 3.0.0
info:
  title: Widgetic API Gateway
  version: 1.0.0
  description: API documentation for the Widgetic API Gateway
  license:
    name: Widgetic Integration License
    url: https://docs.widgetic.com/resources/license
servers:
  - url: https://api.widgetic.com/v1
    description: Production server
    variables:
      env:
        default: production
        description: Environment
      apiUrl:
        default: https://api.widgetic.com
        description: API URL
      apiVersion:
        default: /v1
        description: API Version path prefix
security: []
tags: []
paths:
  /embed/workflows/{workflowId}/frame:
    servers:
      - url: https://api.widgetic.com
        description: >-
          The public embed routes are served at the root of the API host, not
          under /v1.
    get:
      tags:
        - Public Embed
      summary: Show a published Workflow in a page of its own
      description: >-
        A page that runs a published workflow, for a place that can only be
        given an address or an iframe: a chat messenger, a link page, a site
        builder, a blog that follows oEmbed. No API key, no SDK to add. The page
        holds the Embed SDK and the same tag a website carries (`<widgetic
        workflow-id composition-id>`), so a visitor moves from one composition
        to the next in place, by the same rules, exactly as on a website. A
        paused workflow shows its first composition alone, as its embeds do.

        **What the frame can count.** Only what happens inside it: entries, a
        widget's goals and actions, and waits. The page events a website can
        send to a workflow (`widgetic:workflow-event`) are events of the page
        around the embed, and they do not cross an iframe, so a connection that
        waits for one never fires from a frame.

        A workflow that is a draft, is archived, or does not exist, and one
        whose owner is not being served, answers 404 with a short page that
        gives no reason. If the owner of the workflow's first composition listed
        the websites it may appear on, the page is sent with
        `Content-Security-Policy: frame-ancestors` naming those websites (and
        Widgetic's own, and the website where the partner the owner administers
        integrates Widgetic, with its subdomains), so a browser refuses to show
        it inside any other website. Opening the address directly still works.
        An owner who listed nothing is not restricted.

        The page links its oEmbed card, so a site that follows oEmbed turns the
        address of the frame into an embed.

        **Address.**
        `https://api.widgetic.com/embed/workflows/{workflowId}/frame`: the root
        of the API host, NOT under `/v1`. A client generated from this
        description for `https://api.widgetic.com/v1` must be given the base
        address `https://api.widgetic.com` for the calls of the `Public Embed`
        tag.
      operationId: getPublicWorkflowFrame
      parameters:
        - in: path
          name: workflowId
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: The page that runs the workflow
          content:
            text/html:
              schema:
                type: string
        '400':
          description: Invalid workflow UUID (standard validation response)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: >-
            The workflow is not available (a short page that gives no reason):
            not published, unknown, or its owner is not being served
          content:
            text/html:
              schema:
                type: string
        '429':
          description: Rate limited (`RATE_LIMITED`), always with `Retry-After`
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: Workflows cannot be read right now (a short page)
          content:
            text/html:
              schema:
                type: string
components:
  schemas:
    ErrorResponse:
      type: object
      required:
        - success
        - message
        - error
      additionalProperties: true
      properties:
        success:
          type: boolean
          description: Always `false` on a failure.
          example: false
        message:
          type: string
          description: The same text as `error.message`, for a caller that reads one line.
        error:
          $ref: '#/components/schemas/ErrorDetail'
    ErrorDetail:
      type: object
      required:
        - code
        - message
        - timestamp
      properties:
        code:
          type: string
          description: Machine-readable error code.
          example: RESOURCE_NOT_FOUND
        message:
          type: string
          description: Human-readable explanation.
          example: Composition not found
        param:
          type: string
          description: The field that caused the error, when one did.
          example: name
        docUrl:
          type: string
          description: Where this error is explained.
        suggestedAction:
          type: string
          description: What to do about it.
        retryAfter:
          type: integer
          description: >-
            Seconds to wait before trying again (rate limits). The same number
            is in the `Retry-After` header.
          example: 60
        details:
          type: object
          additionalProperties: true
          description: >-
            More about the error: the fields that failed, a limit that was
            reached.
        correlationId:
          type: string
          description: Quote this when you ask support about the call.
          example: req_123e4567-e89b-12d3-a456-426614174000
        timestamp:
          type: string
          format: date-time
          example: '2026-10-15T10:00:00.000Z'

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.