> ## 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 what Visitors Did in a Workflow

> Counts per block and per connection over a range of UTC days (the last 30 days when not given, up to 366), for one
version or for all of them. Only counts: how many visitors reached a block, took a connection, or could not be
moved on, and, where the visitor's browser said why a block could not be shown, how many of those failures had each
reason (`failedReasons`: a timeout, an error of the widget, a build that failed, or another reason). No visitor and
no value a visitor typed is ever stored.
For personal workspace, use 'personal' as workspaceId.
For organization workspace, use the organization UUID as workspaceId. Any active member can read.




## OpenAPI

````yaml /openapi/widgetic-api-public.json get /workspaces/{workspaceId}/workflows/{workflowId}/stats
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:
  /workspaces/{workspaceId}/workflows/{workflowId}/stats:
    get:
      tags:
        - Workflows
      summary: Get what Visitors Did in a Workflow
      description: >
        Counts per block and per connection over a range of UTC days (the last
        30 days when not given, up to 366), for one

        version or for all of them. Only counts: how many visitors reached a
        block, took a connection, or could not be

        moved on, and, where the visitor's browser said why a block could not be
        shown, how many of those failures had each

        reason (`failedReasons`: a timeout, an error of the widget, a build that
        failed, or another reason). No visitor and

        no value a visitor typed is ever stored.

        For personal workspace, use 'personal' as workspaceId.

        For organization workspace, use the organization UUID as workspaceId.
        Any active member can read.
      operationId: getWorkspaceWorkflowStats
      parameters:
        - $ref: '#/components/parameters/WorkflowWorkspaceId'
        - $ref: '#/components/parameters/WorkflowId'
        - name: versionId
          in: query
          required: false
          description: Count one version only
          schema:
            type: string
            format: uuid
        - name: from
          in: query
          required: false
          description: First UTC day (YYYY-MM-DD)
          schema:
            type: string
            example: '2026-10-01'
        - name: to
          in: query
          required: false
          description: Last UTC day (YYYY-MM-DD)
          schema:
            type: string
            example: '2026-10-27'
        - $ref: '#/components/parameters/ManagedUserScopeId'
        - $ref: '#/components/parameters/ManagedUserScopeExternalId'
      responses:
        '200':
          description: The counts
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  data:
                    $ref: '#/components/schemas/WorkflowStats'
                  meta:
                    $ref: '#/components/schemas/ResponseMeta'
                required:
                  - success
                  - data
        '400':
          description: >-
            A day is not YYYY-MM-DD, the range is backwards or longer than 366
            days, or the version is not this workflow's
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: >-
            Forbidden - Not a member of this organization, the plan does not
            include workflows (`AUTHZ_PLAN_RESTRICTION`), or the call is made
            for one managed user (`X-Managed-User-Id`) in a workspace other than
            `personal` (`MANAGED_USER_SCOPE_ROUTE_NOT_AVAILABLE`)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: No such workflow in this workspace
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: Workflows cannot be used on this server right now
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - apiKeyAuth: []
components:
  parameters:
    WorkflowWorkspaceId:
      name: workspaceId
      in: path
      required: true
      description: >
        The workspace: 'personal' for your own workspace, or the UUID of an
        organization. A call made for one of your

        managed users (`X-Managed-User-Id`) always uses 'personal': a managed
        user has no other workspace, and a call

        that names an organization is refused with 403.
      schema:
        type: string
      example: personal
    WorkflowId:
      name: workflowId
      in: path
      required: true
      description: The workflow's id
      schema:
        type: string
        format: uuid
    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:
    WorkflowStats:
      type: object
      description: >
        What visitors did in a range of days. Only counts: how many reached a
        block, took a connection, or failed to be

        moved on. No visitor and no value a visitor typed is ever stored.
      required:
        - workflowId
        - from
        - to
        - nodes
        - edges
        - failed
      properties:
        workflowId:
          type: string
          format: uuid
        versionId:
          type: string
          format: uuid
          nullable: true
          description: The version counted, or null when all versions are.
        from:
          type: string
          description: First UTC day counted (YYYY-MM-DD).
        to:
          type: string
          description: Last UTC day counted (YYYY-MM-DD).
        started:
          type: integer
          nullable: true
          description: >-
            Visitors who started the workflow in the range; null when all
            versions are counted.
        nodes:
          type: array
          description: Visitors who reached each block.
          items:
            $ref: '#/components/schemas/WorkflowCounter'
        edges:
          type: array
          description: Visitors who took each connection.
          items:
            $ref: '#/components/schemas/WorkflowCounter'
        failed:
          type: array
          description: >
            Times moving on to a block failed and the visitor stayed, whatever
            the reason: every failure is counted here,

            including the ones whose browser did not say why. A try is counted,
            not a visitor: a step is tried once more

            after 30 seconds, so one visitor can count twice.
          items:
            $ref: '#/components/schemas/WorkflowCounter'
        failedReasons:
          type: array
          description: >
            Why those failed, where the visitor's browser said why: one entry
            for each block and reason that has a count. The

            reasons of a block add up to at most its `failed` total, never more:
            a failure reported by an embed that does not

            say why (an older one) is in `failed` and in none of these, so a
            block whose reasons add up to less has some of

            unknown reason. Empty when no failure in the range had a reason.
            Sent by gateways that keep reasons; a client

            that reads a gateway without them treats a missing list as empty.
          items:
            $ref: '#/components/schemas/WorkflowFailureReasonCounter'
      example:
        workflowId: 3fa85f64-5717-4562-b3fc-2c963f66afa6
        versionId: 3fa85f64-5717-4562-b3fc-2c963f66afa6
        from: Example from
        to: Example to
        started: 42
        nodes:
          - Example WorkflowCounter
        edges:
          - Example WorkflowCounter
        failed:
          - Example WorkflowCounter
        failedReasons:
          - Example WorkflowFailureReasonCounter
    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).
    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'
    WorkflowCounter:
      type: object
      required:
        - id
        - total
      properties:
        id:
          type: string
          description: The block or connection counted.
        total:
          type: integer
      example:
        id: Example id
        total: 42
    WorkflowFailureReasonCounter:
      type: object
      required:
        - id
        - reason
        - total
      properties:
        id:
          type: string
          description: The block (a composition) that could not be shown.
        reason:
          $ref: '#/components/schemas/WorkflowFailureReason'
        total:
          type: integer
          description: How many tries failed for this reason.
      example:
        id: Example id
        reason: null
        total: 42
    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'
    WorkflowFailureReason:
      type: string
      enum:
        - timeout
        - widget_error
        - build
        - other
      description: >
        Why a composition could not be shown to a visitor. `timeout`: it did not
        appear in time (the embed waits eight

        seconds). `widget_error`: the widget in it reported an error. `build`:
        the embed could not build it at all. `other`:

        another step was already on its way, or the page was going away. A
        closed list: never a message and never a code a

        widget chose.
  securitySchemes:
    apiKeyAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

````

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