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

# List Charts

> Retrieve all charts attached to a specific dashboard board. Returns chart IDs, types, SQL queries, and visualization configurations.



## OpenAPI

````yaml GET /v0/boards/{boardId}/charts
openapi: 3.1.0
info:
  title: Formo Public API
  description: >-
    REST API for managing Formo projects, analytics, alerts, boards, charts,
    contracts, segments, and AI chat.


    **Auth.** All endpoints require a workspace API key with the appropriate
    scopes (see `x-api-scopes`).


    **Response shape.** Successful responses return the resource directly (or `{
    data: [...], total, page, size, has_more }` for paginated lists). HTTP
    status carries success/failure; there is no envelope wrapping success
    bodies.


    **Errors.** Every non-2xx response uses the `Error` envelope: `{ error: {
    code, message, doc_url, param?, details? } }`. Branch on the
    machine-readable `code` (see `ErrorCode` enum) and follow `doc_url` to the
    matching section of the [errors
    reference](https://docs.formo.so/api/errors).


    **Idempotency.** Pass an `Idempotency-Key` header on POST/PUT/PATCH/DELETE
    to make retries safe; the response is cached for 24 h and replayed on
    duplicate keys.
  version: 0.1.0
  contact:
    name: Formo
    url: https://formo.so
servers:
  - url: https://api.formo.so
    description: API Server (boards, alerts, contracts, segments, profiles, query, import)
  - url: https://events.formo.so
    description: Events Server (event ingestion)
security:
  - WorkspaceApiKey: []
tags:
  - name: Alerts
    description: Manage project alerts and notifications
  - name: Boards
    description: Manage dashboard boards
  - name: Charts
    description: Manage charts within boards
  - name: Contracts
    description: Manage blockchain contract monitoring
  - name: Segments
    description: Manage user segments
  - name: Profiles
    description: Wallet profiles and import
  - name: Query
    description: >-
      Execute SQL queries and call pre-built analytics endpoints (KPIs, top
      pages, lifecycle, retention, revenue). Requires the query:read scope.
  - name: Events
    description: Event ingestion API (events.formo.so)
paths:
  /v0/boards/{boardId}/charts:
    get:
      tags:
        - Charts
      summary: List charts for a board
      description: >-
        List charts in a board with their executed query results. Paginated.
        Includes the parent `board` for caller convenience and an optional
        `warnings` sidecar carrying per-chart query failures (the failing charts
        are excluded from `data` so the page renders cleanly).
      operationId: listCharts
      parameters:
        - name: boardId
          in: path
          required: true
          schema:
            type: string
        - $ref: '#/components/parameters/Page'
        - $ref: '#/components/parameters/Size'
      responses:
        '200':
          description: Paginated charts plus parent board and any partial-failure warnings
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/PaginatedListMeta'
                  - type: object
                    required:
                      - data
                      - board
                    properties:
                      data:
                        type: array
                        items:
                          $ref: '#/components/schemas/Chart'
                      board:
                        $ref: '#/components/schemas/Board'
                      warnings:
                        type: object
                        description: >-
                          Present only if some charts failed to execute.
                          Failures are excluded from `data`.
                        properties:
                          failedCharts:
                            type: integer
                          errors:
                            type: array
                            items:
                              type: object
                              properties:
                                chartId:
                                  type: string
                                error:
                                  type: string
              example:
                data:
                  - id: cht_x1y2z3a4b5c6
                    project_id: proj_abc123
                    board_id: brd_a1b2c3d4e5f6
                    chart_type: line
                    title: Daily revenue (last 30 days)
                    description: null
                    query: >-
                      SELECT toDate(timestamp) AS day, sum(revenue) AS revenue
                      FROM events WHERE event = 'transaction' AND timestamp >=
                      now() - INTERVAL 30 DAY GROUP BY day ORDER BY day
                    x_axis: day
                    y_axis:
                      - revenue
                    group_by: null
                    steps: null
                    settings: null
                page: 1
                size: 100
                total: 1
                has_more: false
                board:
                  id: brd_a1b2c3d4e5f6
                  project_id: proj_abc123
                  title: Revenue Dashboard
                  description: Weekly revenue, conversion, and retention metrics.
                  enabled: false
components:
  parameters:
    Page:
      name: page
      in: query
      required: false
      schema:
        type: integer
        minimum: 1
        default: 1
      description: 1-indexed page number. Defaults to 1.
    Size:
      name: size
      in: query
      required: false
      schema:
        type: integer
        minimum: 1
        maximum: 200
        default: 100
      description: Page size. Defaults to 100, capped at 200.
  schemas:
    PaginatedListMeta:
      type: object
      description: >-
        Pagination cursor returned alongside `data` on every paginated list
        endpoint. Use these to walk pages: `has_more` is true while `page * size
        < total`. Combine with the matching `Page` and `Size` query parameters
        to request the next page.
      required:
        - page
        - size
        - total
        - has_more
      properties:
        page:
          type: integer
          description: 1-indexed page number echoed from the request.
        size:
          type: integer
          description: Page size echoed from the request.
        total:
          type: integer
          description: Total row count across all pages.
        has_more:
          type: boolean
          description: True when more pages remain (`page * size < total`).
    Chart:
      type: object
      description: A saved chart attached to a board.
      properties:
        id:
          type: string
        chart_type:
          type: string
          enum:
            - table
            - number
            - funnel
            - bar
            - line
            - pie
            - stacked
            - user_paths
            - retention
          description: Visualization type.
        title:
          type: string
        description:
          type: string
          nullable: true
        query:
          type: string
          description: >-
            SQL query powering the chart. For `funnel` and `retention` charts
            this is a system-managed placeholder.
        project_id:
          type: string
        board_id:
          type: string
        x_axis:
          type: string
          nullable: true
          description: Column used as the X axis.
        y_axis:
          type: array
          items:
            type: string
          nullable: true
          description: Column(s) used as Y axis metric(s).
        group_by:
          type: string
          nullable: true
          description: Column used to group/stack series.
        steps:
          type: array
          items:
            $ref: '#/components/schemas/FunnelStep'
          nullable: true
          description: >-
            Ordered list of funnel steps. Only present when `chart_type` is
            `funnel`.
        settings:
          oneOf:
            - $ref: '#/components/schemas/ChartSettings'
            - type: 'null'
          description: Type-specific configuration. See `ChartSettings` for all fields.
      required:
        - id
        - chart_type
        - title
        - query
        - project_id
        - board_id
    Board:
      type: object
      properties:
        id:
          type: string
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
          nullable: true
        project_id:
          type: string
        enabled:
          type: boolean
          description: Whether the board is publicly accessible
        title:
          type: string
        description:
          type: string
          nullable: true
      required:
        - id
        - project_id
        - enabled
    FunnelStep:
      type: object
      description: >-
        A single step in a funnel or user-path flow.


        `type` and `event` are required. Any additional property key becomes a
        filter condition using the `StepFilterCondition` schema (e.g. `"rdns": {
        "op": "equals", "value": "io.metamask" }`).


        Standard filterable columns: `origin`, `device`, `browser`, `os`,
        `location`, `referrer`, `ref`, `utm_source`, `utm_medium`,
        `utm_campaign`, `utm_content`, `utm_term`. Any other key is treated as a
        JSON event property and extracted via `JSONExtractString(properties,
        '<key>')`.
      properties:
        type:
          type: string
          enum:
            - event
            - track
            - decoded_log
          description: >-
            `event`: built-in page/connect/transaction events; `track`: custom
            tracked events; `decoded_log`: decoded smart-contract events.
        event:
          type: string
          minLength: 1
          description: >-
            Event name (e.g. `page`, `connect`, `transaction`, or a custom track
            event name).
      required:
        - type
        - event
      additionalProperties:
        $ref: '#/components/schemas/StepFilterCondition'
    ChartSettings:
      type: object
      description: >-
        Chart-type-specific configuration. The fields that apply depend on
        `chart_type`:


        - **funnel**: `funnelType`, `conversionWindow`, `breakdown`

        - **user_paths**: `startStep`, `endStep`, `maxSteps`, `nodesPerStep`,
        `conversionWindow`, `filters`

        - **retention**: `retentionFilter`, `retentionUserFilters`


        All fields are optional at the schema level; see per-type validation
        rules for which are functionally required.
      properties:
        funnelType:
          type: string
          enum:
            - closed
            - open
          default: closed
          description: >-
            **Funnel only.** `closed`: users must complete steps in strict order
            with no intervening events. `open`: users may complete steps in
            order but other events may occur between steps.
        conversionWindow:
          $ref: '#/components/schemas/ConversionWindow'
          description: >-
            **Funnel & user_paths.** Maximum time from Step 1 for a user to
            complete all steps.
        breakdown:
          type: string
          enum:
            - device
            - browser
            - os
            - referrer
            - ref
            - utm_source
            - utm_medium
            - utm_campaign
            - utm_term
            - utm_content
          description: >-
            **Funnel only.** Split each funnel bar by this dimension. The top
            categories are shown individually; the rest are collapsed into
            'Others'.
        startStep:
          $ref: '#/components/schemas/FunnelStep'
          description: '**user_paths (required).** The event where the user flow begins.'
        endStep:
          oneOf:
            - $ref: '#/components/schemas/FunnelStep'
            - type: 'null'
          description: >-
            **user_paths (optional).** The event where the user flow ends. If
            `null` the flow is open-ended.
        maxSteps:
          type: integer
          minimum: 2
          maximum: 10
          default: 3
          description: >-
            **user_paths.** Maximum number of steps to show in the flow (2–10).
            Values above 10 are clamped to 10.
        nodesPerStep:
          type: integer
          minimum: 2
          maximum: 10
          default: 5
          description: >-
            **user_paths.** Maximum number of unique event nodes visible per
            step (2–10). Values above 10 are clamped to 10.
        filters:
          type: string
          description: >-
            **user_paths.** JSON-encoded string of additional filters applied to
            the path query.
        retentionFilter:
          oneOf:
            - $ref: '#/components/schemas/FunnelStep'
            - type: 'null'
          description: >-
            **retention.** Event that qualifies a returning visit as 'retained'.
            If `null`, any event counts as a return.
        retentionUserFilters:
          type: array
          items:
            $ref: '#/components/schemas/RetentionUserFilter'
          description: >-
            **retention.** Zero or more user-segment filters that narrow the
            cohort (e.g. only desktop users, only users from a specific UTM
            source).
    StepFilterCondition:
      type: object
      description: >-
        A filter condition for an event property on a funnel step. The `op`
        field specifies the comparison operator and `value` is the value to
        compare against. For `in` and `notIn` operators the value is a
        pipe-delimited string (e.g. `"metamask|rainbow|coinbase"`).
      properties:
        op:
          type: string
          enum:
            - equals
            - notEquals
            - in
            - notIn
            - gt
            - gte
            - lt
            - lte
            - startsWith
            - endsWith
            - includes
          description: >-
            Comparison operator. Use `in` / `notIn` for multi-value matching
            (pipe-delimited value string).
        value:
          oneOf:
            - type: string
            - type: number
          description: >-
            The comparison value. For `in` / `notIn`, use a pipe-delimited
            string: `"metamask|rainbow|coinbase"`.
      required:
        - op
        - value
    ConversionWindow:
      type: object
      description: >-
        Time window within which a user must complete all funnel steps (measured
        from Step 1). Defaults to 1 day if omitted.
      properties:
        value:
          type: integer
          minimum: 1
          description: Number of time units.
        unit:
          type: string
          enum:
            - minute
            - hour
            - day
            - week
            - month
          description: Time unit. `month` = 30 days, `week` = 7 days.
      required:
        - value
        - unit
    RetentionUserFilter:
      type: object
      description: A user-level segment filter applied to the retention chart cohort.
      properties:
        field:
          type: string
          description: >-
            The user property to filter on (e.g. `device`, `browser`, `os`,
            `location`, `utm_source`, `utm_medium`, `utm_campaign`).
        op:
          type: string
          enum:
            - equals
            - notEquals
            - in
            - notIn
            - gt
            - gte
            - lt
            - lte
            - startsWith
            - endsWith
            - includes
          description: Comparison operator.
        value:
          oneOf:
            - type: string
            - type: number
          description: The value to compare against.
      required:
        - field
        - op
        - value
  securitySchemes:
    WorkspaceApiKey:
      type: http
      scheme: bearer
      description: >-
        Workspace API key (e.g. `formo_xxx`). Create one in the Formo dashboard
        under Team Settings > API Keys.

````