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

# Get Compositions Batch

> Retrieves multiple compositions by their IDs in a single request.
This endpoint includes domain validation for embed contexts and is used by the embed SDK.

Each composition is checked on its own. If its owner listed the websites it may appear on (the
workspace's domain list, or the `allowedDomains` of a partner the owner administers) and the request
comes from another website (the `Origin` header, or the host of `Referer` when there is no `Origin`),
that composition is left out of `compositions` and reported in `errors` as
`Domain access denied: <reason>`; the others are still returned. A request that names no website, and
an owner who listed nothing, are not restricted, and a page on the visitor's own machine (`localhost`,
`127.0.0.1` or `[::1]`, on any port) is always allowed. So is the website where a partner integrates
Widgetic, with every subdomain of it (`platformDomain` in the answer of `GET /partners/mine`), for the
compositions of that partner: a partner's list never has to name it.




## OpenAPI

````yaml /openapi/widgetic-api-public.json post /compositions/batch
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:
  /compositions/batch:
    post:
      tags:
        - Compositions
      summary: Get Compositions Batch
      description: >
        Retrieves multiple compositions by their IDs in a single request.

        This endpoint includes domain validation for embed contexts and is used
        by the embed SDK.


        Each composition is checked on its own. If its owner listed the websites
        it may appear on (the

        workspace's domain list, or the `allowedDomains` of a partner the owner
        administers) and the request

        comes from another website (the `Origin` header, or the host of
        `Referer` when there is no `Origin`),

        that composition is left out of `compositions` and reported in `errors`
        as

        `Domain access denied: <reason>`; the others are still returned. A
        request that names no website, and

        an owner who listed nothing, are not restricted, and a page on the
        visitor's own machine (`localhost`,

        `127.0.0.1` or `[::1]`, on any port) is always allowed. So is the
        website where a partner integrates

        Widgetic, with every subdomain of it (`platformDomain` in the answer of
        `GET /partners/mine`), for the

        compositions of that partner: a partner's list never has to name it.
      operationId: getCompositionsBatch
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - compositionIds
              properties:
                compositionIds:
                  type: array
                  items:
                    type: string
                    format: uuid
                  description: Array of composition IDs to retrieve
                  maxItems: 50
      responses:
        '200':
          description: Compositions retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetCompositionsBatchResponse'
        '400':
          description: Invalid request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Domain access denied
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - apiKeyAuth: []
components:
  schemas:
    GetCompositionsBatchResponse:
      type: object
      required:
        - success
        - data
      properties:
        success:
          type: boolean
          description: Always `true` on a success.
          example: true
        data:
          type: object
          properties:
            compositions:
              type: array
              items:
                $ref: '#/components/schemas/Composition'
            errors:
              type: array
              items:
                type: object
                properties:
                  id:
                    type: string
                  error:
                    type: string
        meta:
          $ref: '#/components/schemas/ResponseMeta'
    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'
    Composition:
      type: object
      properties:
        id:
          type: string
          format: uuid
          description: Unique identifier for the composition
          example: 123e4567-e89b-12d3-a456-426614174000
        creatorId:
          type: string
          format: uuid
          description: ID of the user who created the composition
          example: 123e4567-e89b-12d3-a456-426614174001
        widgetId:
          type: string
          format: uuid
          description: ID of the widget this composition is based on
          example: 123e4567-e89b-12d3-a456-426614174002
        name:
          type: string
          description: Name of the composition
          example: My Composition
        content:
          type: object
          description: Content data for the composition
          example:
            key: value
        contentVersion:
          type: integer
          description: >-
            Monotonic content version when the content_version migration is
            applied
          example: 3
        status:
          type: string
          description: Current status of the composition
          enum:
            - draft
            - published
            - archived
          example: draft
        createdAt:
          type: string
          format: date-time
          description: When the composition was created
          example: '2023-01-01T00:00:00Z'
        updatedAt:
          type: string
          format: date-time
          description: When the composition was last updated
          example: '2023-01-02T00:00:00Z'
        embedSettings:
          type: object
          description: Settings for embedding the composition
          example:
            width: 100%
            height: 500px
        design:
          type: object
          description: Design settings for the composition
          example:
            theme: light
            colors:
              primary: '#0066ff'
        databaseId:
          type: string
          format: uuid
          description: >-
            Legacy. The id of a Neon database that an earlier version made for
            this composition. A composition now keeps its tables in a schema of
            its own (named `comp_` followed by its id) in a database shared with
            other compositions, so new compositions have none.
          example: 123e4567-e89b-12d3-a456-426614174003
        projectId:
          type: string
          format: uuid
          description: ID of the project this composition belongs to
          example: 123e4567-e89b-12d3-a456-426614174004
        managedUserId:
          type: string
          format: uuid
          nullable: true
          description: >-
            The managed user the composition was made for, or null when it is
            your own. List one managed user's compositions with the
            `managedUserId` or `managedUserExternalId` query parameter of
            `getAllCompositions`.
          example: b7c8d9e0-1f2a-4b3c-8d4e-5f6a7b8c9d0e
        direct:
          type: boolean
          nullable: true
          description: >
            Whether the widget the composition is made from is drawn straight
            into the page, without a frame

            (`true`), or inside a frame (`false`). `null` when the widget has no
            published version yet. It is a

            fact about the widget's published version, so every composition of
            one widget answers the same, and it

            changes when you publish another version. It cannot be set. Only
            `getCompositionById` returns it:

            the other calls that return a composition leave it out, and so does
            that one on the rare occasion the

            answer could not be worked out just then (ask again).
          example: true
        lastEditedBy:
          type: object
          nullable: true
          description: >
            Who made the latest change to a composition a team shares (one filed
            under a project of an organization,

            or one made in a Shopify store's workspace), so that a teammate who
            opens it can be told "Anna changed

            this at 14:32" and a save that someone else got ahead of can say
            who. It is `null` when nobody can be

            named: a change made by a Widgetic service, through an editor
            session, by a partner's call made for one

            managed user, or one made before this was recorded.


            Only `getCompositionById` returns it, and only for a composition a
            team shares, and only to a person (a

            signed-in member or a key of one): a composition in a personal
            project leaves it out, and so does every

            answer given to an editor session or to a call made for one managed
            user. It is also left out on the rare

            occasion the team could not be worked out just then (ask again). The
            other calls that return a

            composition leave it out.


            It is not the same as `creatorId`, who made the composition, and the
            account behind a change is never

            part of the composition itself: this is the only place it is told.
          properties:
            id:
              type: string
              format: uuid
              description: The account that made the latest change
              example: 123e4567-e89b-12d3-a456-426614174001
            name:
              type: string
              nullable: true
              maxLength: 120
              description: >-
                The name on that account, or `null` when it has none or it could
                not be read just then. Never an email address.
              example: Anna
        lastEditedAt:
          type: string
          format: date-time
          nullable: true
          description: >-
            When that latest change was made. Present whenever `lastEditedBy`
            is.
          example: '2026-10-28T14:32:00Z'
      required:
        - id
        - creatorId
        - widgetId
        - name
        - content
        - status
        - createdAt
        - updatedAt
      example:
        id: 123e4567-e89b-12d3-a456-426614174000
        creatorId: 123e4567-e89b-12d3-a456-426614174001
        widgetId: 123e4567-e89b-12d3-a456-426614174002
        name: My Composition
        content:
          key: value
        contentVersion: 3
        status: draft
        createdAt: '2023-01-01T00:00:00Z'
        updatedAt: '2023-01-02T00:00:00Z'
        embedSettings:
          width: 100%
          height: 500px
        design:
          theme: light
          colors:
            primary: '#0066ff'
        databaseId: 123e4567-e89b-12d3-a456-426614174003
        projectId: 123e4567-e89b-12d3-a456-426614174004
        managedUserId: b7c8d9e0-1f2a-4b3c-8d4e-5f6a7b8c9d0e
        direct: true
        lastEditedBy: {}
        lastEditedAt: '2026-10-28T14:32:00Z'
    ResponseMeta:
      type: object
      description: >-
        Extra information about the answer: where a page sits in a list, the
        cursor of the next page, or warnings about a call that succeeded with a
        caveat.
      additionalProperties: true
      properties:
        page:
          type: integer
          description: The page that was read, counting from 1.
          example: 1
        size:
          type: integer
          description: How many items one page holds.
          example: 20
        total:
          type: integer
          description: How many items the whole list has.
          example: 135
        limit:
          type: integer
          description: The same as `size`.
          example: 20
        offset:
          type: integer
          description: How many items come before this page.
          example: 0
        hasNextPage:
          type: boolean
          example: true
        hasPreviousPage:
          type: boolean
          example: false
        nextCursor:
          type: string
          nullable: true
          description: >-
            Pass this as `cursor` to read the next page of a list that is read
            by cursor. `null` on the last page.
        warnings:
          type: array
          items:
            type: string
          description: >-
            Things the call did not do, though it succeeded (for example a table
            that could not be created just now).
    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'
  securitySchemes:
    apiKeyAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

````

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