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

# List composition entry items with paging and filters

> Reads one widget table with cursor paging (time then id in byte order), optional since/until on the time column, and up to five context filters plus ten column filters. Rate limit 120 requests per minute. Each read batch uses a 5 s statement timeout.



## OpenAPI

````yaml /openapi/widgetic-api-public.json get /compositions/{id}/entries/{table}/items
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/{id}/entries/{table}/items:
    get:
      tags:
        - Compositions
      summary: List composition entry items with paging and filters
      description: >-
        Reads one widget table with cursor paging (time then id in byte order),
        optional since/until on the time column, and up to five context filters
        plus ten column filters. Rate limit 120 requests per minute. Each read
        batch uses a 5 s statement timeout.
      operationId: listCompositionEntryItems
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
            format: uuid
        - in: path
          name: table
          required: true
          schema:
            type: string
            maxLength: 63
        - $ref: '#/components/parameters/CompositionEntryLimit'
        - $ref: '#/components/parameters/CompositionEntryOrder'
        - $ref: '#/components/parameters/CompositionEntrySince'
        - $ref: '#/components/parameters/CompositionEntryUntil'
        - $ref: '#/components/parameters/CompositionEntryCursor'
        - $ref: '#/components/parameters/CompositionEntryContextFilters'
        - $ref: '#/components/parameters/CompositionEntryColumnFilters'
        - $ref: '#/components/parameters/ManagedUserScopeId'
        - $ref: '#/components/parameters/ManagedUserScopeExternalId'
      responses:
        '200':
          description: A page of entry items
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CompositionEntryItemsPageSuccess'
              example:
                success: true
                data:
                  - id: 11111111-1111-4111-8111-111111111111
                    createdAt: '2026-10-01T00:00:00.000000Z'
                    values:
                      starRating: 5
                    context:
                      site: a
                meta:
                  nextCursor: >-
                    eyJ2ZXJzaW9uIjoxLCJvcmRlciI6ImRlc2MiLCJ0aW1lIjoiMjAyNi0xMC0wMVQwMDowMDowMC4wMDAwMDBaIiwiaWQiOiIxMTExMTExMS0xMTExLTQxMTEtODExMS0xMTExMTExMTExMTExIn0
                  total: 42
        '400':
          description: >-
            Invalid filters, cursor, since/until, or column
            (ENTRY_FILTER_INVALID, INVALID_CURSOR, ENTRY_COLUMN_NOT_FOUND,
            ENTRY_TABLE_HAS_NO_TIME)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Caller cannot read this composition
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Unknown table (ENTRY_TABLE_NOT_FOUND)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Rate limit exceeded
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - apiKeyAuth: []
components:
  parameters:
    CompositionEntryLimit:
      in: query
      name: limit
      schema:
        type: integer
        minimum: 1
        maximum: 100
        default: 25
    CompositionEntryOrder:
      in: query
      name: order
      description: >
        `desc` (the default) lists the newest entry first, `asc` the oldest.
        Entries are sorted by their time, then

        by their id (compared as text, byte by byte) in the same direction, so
        the order of two entries made at the

        same instant is always the same; an entry with no time counts as the
        oldest. A table with no time column is

        sorted by its id. The managed-user feed sorts by time, then by
        composition id, table and id.
      schema:
        type: string
        enum:
          - asc
          - desc
        default: desc
    CompositionEntrySince:
      in: query
      name: since
      description: >
        Only entries made at this time or later: `since` is INCLUSIVE (an entry
        made at exactly `since` is

        returned). A date and time with an offset, such as
        `2026-10-01T00:00:00Z`; anything else answers 400

        `INVALID_SINCE`. An entry with no time never matches, and a table with
        no time column answers 400

        `ENTRY_TABLE_HAS_NO_TIME`.
      schema:
        type: string
        format: date-time
    CompositionEntryUntil:
      in: query
      name: until
      description: >
        Only entries made before this time: `until` is EXCLUSIVE (an entry made
        at exactly `until` is NOT

        returned), so `since=A&until=B` followed by `since=B&until=C` counts
        every entry once. Same form and same

        refusals as `since` (400 `INVALID_UNTIL`).
      schema:
        type: string
        format: date-time
    CompositionEntryCursor:
      in: query
      name: cursor
      schema:
        type: string
    CompositionEntryContextFilters:
      in: query
      name: context
      description: >-
        Host context filters as `context[key]=value` (max 5 keys, counting
        dotted `context.key` too). Use `column.<name>=value` for columns whose
        names collide with reserved parameters.
      style: deepObject
      explode: true
      schema:
        type: object
        additionalProperties:
          type: string
    CompositionEntryColumnFilters:
      in: query
      name: filter
      description: >-
        Column filters as `filter[columnName]=value` (same meaning as bare
        `columnName=value` or `column.columnName=value`; max 10 column filters
        counting all spellings). A plain `filter=value` still filters a column
        named `filter`.
      style: deepObject
      explode: true
      schema:
        type: object
        additionalProperties:
          type: string
    ManagedUserScopeId:
      in: header
      name: X-Managed-User-Id
      required: false
      description: >-
        The id Widgetic gave the managed user (`POST /managed-users`). Makes
        this call for one of your managed users, so that a mistake in your own
        code cannot reach another customer's work. Send this header, or the
        other one, never both. Left out, the call works on your whole account,
        as it always has. With it, the call reaches only that user's
        compositions and workflows: a list shows only theirs, a composition or a
        workflow the call makes is filed under them, and one of another user, or
        one that does not exist, answers `404` (the same answer, so the call
        cannot be used to find out what another customer has). A managed user
        that is not yours answers `404` with `MANAGED_USER_NOT_FOUND`. An empty,
        repeated or malformed header is `400` with `MANAGED_USER_SCOPE_INVALID`;
        an empty header is never read as no header. A call that is about the
        whole account, such as the list of your managed users, is refused with
        `403` and `MANAGED_USER_SCOPE_ROUTE_NOT_AVAILABLE`: send it without the
        header. Only your API key can send it. The header is a limit the call
        asks for: whoever holds the key can leave it out, so for a credential
        that a customer's browser holds, use an editor session. An
        `Idempotency-Key` is kept apart for each managed user.
      schema:
        type: string
        format: uuid
        example: 3f2b8c1e-7a4d-4e0b-9c55-2d1a6b7e8f90
    ManagedUserScopeExternalId:
      in: header
      name: X-Managed-User-External-Id
      required: false
      description: >-
        Your own id for the managed user (its `externalId`), when you do not
        keep Widgetic's. Makes this call for one of your managed users, so that
        a mistake in your own code cannot reach another customer's work. Send
        this header, or the other one, never both. Left out, the call works on
        your whole account, as it always has. With it, the call reaches only
        that user's compositions and workflows: a list shows only theirs, a
        composition or a workflow the call makes is filed under them, and one of
        another user, or one that does not exist, answers `404` (the same
        answer, so the call cannot be used to find out what another customer
        has). A managed user that is not yours answers `404` with
        `MANAGED_USER_NOT_FOUND`. An empty, repeated or malformed header is
        `400` with `MANAGED_USER_SCOPE_INVALID`; an empty header is never read
        as no header. A call that is about the whole account, such as the list
        of your managed users, is refused with `403` and
        `MANAGED_USER_SCOPE_ROUTE_NOT_AVAILABLE`: send it without the header.
        Only your API key can send it. The header is a limit the call asks for:
        whoever holds the key can leave it out, so for a credential that a
        customer's browser holds, use an editor session. An `Idempotency-Key` is
        kept apart for each managed user.
      schema:
        type: string
        minLength: 1
        maxLength: 255
        example: customer-1042
  schemas:
    CompositionEntryItemsPageSuccess:
      type: object
      required:
        - success
        - data
        - meta
      properties:
        success:
          type: boolean
          example: true
        data:
          type: array
          items:
            $ref: '#/components/schemas/CompositionEntryItem'
        meta:
          $ref: '#/components/schemas/CompositionEntryItemsMeta'
      example:
        success: true
        data:
          - Example CompositionEntryItem
        meta: null
    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'
    CompositionEntryItem:
      type: object
      required:
        - id
        - values
        - context
        - createdAt
      properties:
        id:
          type: string
          nullable: true
        values:
          type: object
          additionalProperties: true
        context:
          type: object
          nullable: true
          additionalProperties: true
          description: >-
            The host context the entry was stored with: what the embedding page
            passed in, without the two keys of a signature (`widgetic_exp` and
            `widgetic_sig`), which are checked when the entry comes in and are
            never stored.
        createdAt:
          type: string
          format: date-time
          nullable: true
        truncatedColumns:
          type: array
          description: >
            The columns whose value was cut: a value longer than 20,000
            characters is cut there (a JSON value is

            cut as text, so it comes back as a string and no longer as an
            object), and its column is named here.

            Absent when nothing was cut.
          items:
            type: string
      example:
        id: Example id
        values: {}
        context: {}
        createdAt: '2026-01-15T09:30:00.000Z'
        truncatedColumns: []
    CompositionEntryItemsMeta:
      type: object
      required:
        - nextCursor
        - total
      properties:
        nextCursor:
          type: string
          nullable: true
          description: >
            Pass it as `cursor` to get the next page. `null` on the last page,
            and for a table that cannot be

            paged (see `paging`).
        total:
          type: integer
          description: >
            How many entries match the filters and the `since` / `until` window,
            over all pages and not only this

            one.
        paging:
          type: string
          enum:
            - unavailable
          description: >
            Present, as `unavailable`, when the table cannot be paged: it has a
            time column but no id column to

            tell two entries of the same instant apart, or it has no time column
            and no id column that can be

            paged on. The answer is one page only, and `nextCursor` stays `null`
            even when `total` is larger than

            the page.
      example:
        nextCursor: Example nextCursor
        total: 42
        paging: Example paging
    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.