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

# Read measured plan and bounded placements/findings

> Requires delegated reports:write consent, current native edit permission and workspace authoring availability. Data is independently authorized: composition consumes readable pinned outputs and never executes providers. A sealed stage is composed and measured in its declared fixed or responsive mode; the saved report changes only through atomic measured-plan commit. Read all finding pages and explicitly acknowledge required advisories. Creation streams at most 16 KiB; commit streams at most 32 MiB. Current-input checks and exact revision/hash guards reject moved inputs without rebasing. Identical commit retries return the original receipt after later edits or temporary-plan cleanup. Publication is separate. Workspace service keys are unsupported.

Required scopes: `reports:write`.


## OpenAPI

````yaml GET /api/v2/reports/canvas/plans/{planId}
openapi: 3.1.1
info:
  title: chatobserver public API
  version: '2026-09-09'
  description: >-
    Track AI visibility, manage prompts, inspect collected answers and
    citations, and integrate workspace data with your own tools. Visibility
    endpoints use workspace API keys. Data endpoints use scoped service-account
    keys; spreadsheet client endpoints use authorised client sessions. See the
    authentication guide for each credential type.
  contact:
    name: chatobserver support
    url: https://chatobserver.com/contact
    email: support@chatobserver.com
servers:
  - url: https://app.chatobserver.com
    description: Production API
security:
  - WorkspaceKey: []
  - BearerKey: []
tags:
  - name: Workspace
    description: Validate access and list the workspace project and available platforms.
  - name: Prompts
    description: Create, schedule, organise, activate and retrieve tracked prompts.
  - name: Answers
    description: Retrieve collected AI answers, their analysis and visibility trends.
  - name: Brands
    description: Manage brands and compare their visibility in AI answers.
  - name: Sources and citations
    description: Analyse cited domains, pages and ownership across answers.
  - name: Visitor analytics
    description: Read website visitor and crawler analytics for the workspace.
  - name: Content opportunities
    description: Retrieve content-gap findings and recommendations for tracked prompts.
  - name: Usage
    description: Read workspace consumption and allowance summaries.
  - name: Data connections
    description: Discover authorised connections, source accounts and connector catalogues.
  - name: Data queries
    description: >-
      Create versioned queries, publish definitions and inspect integration
      contracts.
  - name: Data operations
    description: >-
      Execute, validate, cancel and inspect operations and page through result
      rows.
  - name: Data delivery
    description: Manage schedules, transfers, destinations and import workflows.
  - name: Data definitions
    description: Manage reusable definitions and their immutable versions.
  - name: Data webhooks
    description: >-
      Configure event delivery, inspect deliveries, replay events and rotate
      secrets.
  - name: Client authorisation
    description: Authorise spreadsheet clients using a user-approved challenge exchange.
  - name: Spreadsheet clients
    description: >-
      Access document-bound client sessions, queries, schedules, bindings and
      write claims.
  - name: AI visibility audits
    description: Create website visibility audits and retrieve their report links.
  - name: Version 1
    description: Integrate with the version 1 visibility and analytics endpoints.
  - name: Tracked coverage
    description: >-
      Track published coverage, maintain its metadata and inspect exact-page
      citation evidence with the same workspace feature access as the dashboard.
  - name: Reports
    description: >-
      Discover accessible native reports and assess exact saved revisions using
      measured, context-specific evidence.
paths:
  /api/v2/reports/canvas/plans/{planId}:
    get:
      tags:
        - Reports
      summary: Read measured plan and bounded placements/findings
      description: >-
        Requires delegated reports:write consent, current native edit permission
        and workspace authoring availability. Data is independently authorized:
        composition consumes readable pinned outputs and never executes
        providers. A sealed stage is composed and measured in its declared fixed
        or responsive mode; the saved report changes only through atomic
        measured-plan commit. Read all finding pages and explicitly acknowledge
        required advisories. Creation streams at most 16 KiB; commit streams at
        most 32 MiB. Current-input checks and exact revision/hash guards reject
        moved inputs without rebasing. Identical commit retries return the
        original receipt after later edits or temporary-plan cleanup.
        Publication is separate. Workspace service keys are unsupported.
      operationId: getCanvasPlan
      parameters:
        - name: x-workspace-id
          in: header
          required: true
          schema:
            type: string
            pattern: ^ws_[a-f0-9]{32}$
          description: Explicit workspace selected for the delegated account.
        - name: planId
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: pageId
          in: query
          required: false
          schema:
            type: string
            maxLength: 256
        - name: cursor
          in: query
          required: false
          schema:
            type: string
            maxLength: 2048
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 50
        - name: findingsOffset
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
            default: 0
      responses:
        '200':
          description: Plan, committed receipt or identical creation retry.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ReportCompositionPlanResponseV1'
        default:
          description: >-
            Invalid request, denied access, changed inputs, semantic failure,
            expired plan or unavailable renderer. Preserve identical retry keys.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
      security:
        - McpConnection: []
components:
  schemas:
    ReportCompositionPlanResponseV1:
      type: object
      properties:
        data:
          type: object
          properties:
            version:
              type: number
              const: 1
            id:
              type: string
              format: uuid
            reportId:
              type: string
              format: uuid
            changeSetId:
              type: string
              format: uuid
            planHash:
              type: string
              pattern: ^[0-9a-f]{64}$
            documentHash: c432fa78-3340-41af-8c2b-641c3a3546ad
            dependencyHash: 2788f201-4bdb-4e79-b768-8ef63c896ef4
            base:
              type: object
              properties:
                revision:
                  type: integer
                  minimum: 0
                documentHash: 1e31a0f0-1a0a-4daf-b984-d9d2c634377d
              required:
                - revision
                - documentHash
              additionalProperties: false
            targetMode:
              type: string
              enum:
                - fixed
                - responsive
            expiresAt:
              type: string
              format: date-time
            currentInputsMatch:
              type: boolean
            requiredContexts:
              type: array
              items:
                type: object
                properties:
                  id:
                    type: string
                    minLength: 1
                    maxLength: 256
                  surface:
                    type: string
                    enum:
                      - private_view
                      - shared_projection
                      - shared_artifact
                      - print
                  layoutMode:
                    type: string
                    enum:
                      - fixed
                      - responsive
                  canvasWidth:
                    type: number
                    exclusiveMinimum: 0
                    maximum: 10000
                  viewport:
                    type: object
                    properties:
                      width:
                        type: integer
                        exclusiveMinimum: 0
                        maximum: 10000
                      height:
                        type: integer
                        exclusiveMinimum: 0
                        maximum: 20000
                    required:
                      - width
                      - height
                    additionalProperties: false
                  scale:
                    type: number
                    exclusiveMinimum: 0
                    maximum: 10
                  locale:
                    type: string
                    minLength: 2
                    maxLength: 64
                  timezone:
                    type: string
                    minLength: 1
                    maxLength: 128
                  scenarioId: 86ff7862-8246-4980-8e8a-606c1926496f
                required:
                  - id
                  - surface
                  - layoutMode
                  - canvasWidth
                  - viewport
                  - scale
                  - locale
                  - timezone
                  - scenarioId
                additionalProperties: false
              maxItems: 256
            assessment:
              type: object
              properties:
                version:
                  type: number
                  const: 1
                assessmentId: d642c106-aec2-4f37-9350-09e6d6147314
                documentHash: d47295ce-65b7-43a2-b5e9-cb70d34cfc51
                profile:
                  type: object
                  properties:
                    id: 54aeea2b-076f-4f59-8f9f-cb140ee9c7a5
                    version:
                      type: number
                      const: 1
                  required:
                    - id
                    - version
                  additionalProperties: false
                coverage:
                  type: object
                  properties:
                    requiredPageContexts:
                      type: integer
                      minimum: 0
                    completedPageContexts:
                      type: integer
                      minimum: 0
                    unverifiedPageContexts:
                      type: integer
                      minimum: 0
                    complete:
                      type: boolean
                  required:
                    - requiredPageContexts
                    - completedPageContexts
                    - unverifiedPageContexts
                    - complete
                  additionalProperties: false
                structure:
                  type: object
                  properties:
                    status:
                      type: string
                      enum:
                        - valid
                        - invalid
                        - unverified
                  required:
                    - status
                  additionalProperties: false
                render:
                  type: object
                  properties:
                    status:
                      type: string
                      enum:
                        - valid
                        - invalid
                        - unverified
                  required:
                    - status
                  additionalProperties: false
                design:
                  type: object
                  properties:
                    status:
                      type: string
                      enum:
                        - assessed
                        - unverified
                    advisoryCount:
                      type: integer
                      minimum: 0
                    coverageGaps:
                      type: array
                      items: be55b27e-0ebd-43f2-b345-8b7862a00b90
                      maxItems: 64
                  required:
                    - status
                    - advisoryCount
                    - coverageGaps
                  additionalProperties: false
                data:
                  type: object
                  properties:
                    status:
                      type: string
                      enum:
                        - ready
                        - partial
                        - missing
                        - failed
                        - unverified
                    issueCodes:
                      type: array
                      items: d5377a1e-5e5a-4196-8ac4-6d0c5b6c3343
                      maxItems: 256
                  required:
                    - status
                    - issueCodes
                  additionalProperties: false
                publication:
                  type: object
                  properties:
                    status:
                      type: string
                      enum:
                        - not_published
                        - current
                        - stale
                        - failed
                        - unverified
                  required:
                    - status
                  additionalProperties: false
                safeToCommit:
                  type: boolean
                findingCount: 33b5b153-9700-481b-985b-612fa24df84a
              required:
                - version
                - assessmentId
                - documentHash
                - profile
                - coverage
                - structure
                - render
                - design
                - data
                - publication
                - safeToCommit
                - findingCount
              additionalProperties: false
            requiredAdvisoryAcknowledgmentCount: 5a834a94-9f2f-4591-9ed2-3e8dc8b4e3b0
            pages:
              type: array
              items:
                type: object
                properties:
                  id:
                    type: string
                    maxLength: 256
                  position: c2d77a8a-7afb-4031-b8d6-a7e50fd2e5ed
                  title:
                    type: string
                    maxLength: 4096
                  elementCount: de8149b7-fd53-4c02-a271-0b92035b7b33
                required:
                  - id
                  - position
                  - title
                  - elementCount
                additionalProperties: false
              maxItems: 500
          required:
            - version
            - id
            - reportId
            - changeSetId
            - planHash
            - documentHash
            - dependencyHash
            - base
            - targetMode
            - expiresAt
            - currentInputsMatch
            - requiredContexts
            - assessment
            - requiredAdvisoryAcknowledgmentCount
            - pages
          additionalProperties: false
        placements:
          type: object
          properties:
            pageId:
              anyOf:
                - type: string
                  maxLength: 256
                - type: 'null'
            data:
              type: array
              items:
                type: object
                properties:
                  id:
                    type: string
                    minLength: 1
                    maxLength: 256
                  type: 28afad00-487b-412e-b236-5d00062031a1
                  pageId: 78f7a143-17b7-40c3-b813-93e53aff2eb8
                  parentId:
                    anyOf:
                      - a6d69ee5-5ef0-45a1-9ab1-5b1381b7b9a7
                      - type: 'null'
                  hidden:
                    type: boolean
                  fixedPlacement:
                    type: object
                    properties:
                      x:
                        type: number
                      'y': d8a701a2-648f-4090-9e34-179180fff06a
                      width:
                        type: number
                        exclusiveMinimum: 0
                        maximum: 10000
                      height:
                        type: number
                        exclusiveMinimum: 0
                        maximum: 20000
                      z:
                        type: integer
                        minimum: -100000
                        maximum: 100000
                      rotation:
                        type: number
                        minimum: -360
                        maximum: 360
                      flipX:
                        type: boolean
                      flipY:
                        type: boolean
                      anchor:
                        type: string
                        enum:
                          - page
                          - content
                      aspectLock:
                        type: boolean
                    required:
                      - x
                      - 'y'
                      - width
                      - height
                      - z
                      - rotation
                      - flipX
                      - flipY
                      - anchor
                      - aspectLock
                    additionalProperties: false
                  responsivePlacement:
                    type: object
                    properties:
                      containerLayout:
                        anyOf:
                          - type: string
                            enum:
                              - stack
                              - grid
                              - wrap
                              - overlay
                          - type: 'null'
                      containerDirection:
                        type: string
                        enum:
                          - row
                          - column
                        default: column
                      containerColumns:
                        type: integer
                        minimum: 1
                        maximum: 12
                        default: 12
                      equalHeight:
                        type: boolean
                        default: false
                      columnStart:
                        type: integer
                        minimum: 1
                        maximum: 12
                      columnSpan:
                        type: integer
                        minimum: 1
                        maximum: 12
                      row:
                        anyOf:
                          - type: integer
                            minimum: 1
                            maximum: 10000
                          - type: 'null'
                      order:
                        type: integer
                        minimum: -10000
                        maximum: 10000
                      align:
                        type: string
                        enum:
                          - start
                          - center
                          - end
                          - stretch
                      justify:
                        type: string
                        enum:
                          - start
                          - center
                          - end
                          - stretch
                      minWidth:
                        anyOf:
                          - type: number
                            minimum: 0
                          - type: 'null'
                      maxWidth:
                        anyOf:
                          - b96740ab-6563-472f-91c0-8e5d04bac6c9
                          - type: 'null'
                      minHeight:
                        anyOf:
                          - b96740ab-6563-472f-91c0-8e5d04bac6c9
                          - type: 'null'
                      maxHeight:
                        anyOf:
                          - b96740ab-6563-472f-91c0-8e5d04bac6c9
                          - type: 'null'
                      aspectRatio:
                        anyOf:
                          - type: number
                            exclusiveMinimum: 0
                          - type: 'null'
                      padding:
                        type: number
                        minimum: 0
                        maximum: 320
                      gap:
                        type: number
                        minimum: 0
                        maximum: 320
                      keepTogether:
                        type: boolean
                        default: true
                      pageBreakBefore:
                        type: boolean
                        default: false
                      hidden:
                        type: boolean
                      breakpointOverrides:
                        type: object
                        properties:
                          desktop:
                            type: object
                            properties:
                              containerLayout:
                                anyOf:
                                  - type: string
                                    enum:
                                      - stack
                                      - grid
                                      - wrap
                                      - overlay
                                  - type: 'null'
                              containerDirection:
                                type: string
                                enum:
                                  - row
                                  - column
                              containerColumns:
                                type: integer
                                minimum: 1
                                maximum: 12
                              equalHeight:
                                type: boolean
                              columnStart:
                                type: integer
                                minimum: 1
                                maximum: 12
                              columnSpan:
                                type: integer
                                minimum: 1
                                maximum: 12
                              row:
                                type: integer
                                minimum: 1
                                maximum: 10000
                              order:
                                type: integer
                                minimum: -10000
                                maximum: 10000
                              align:
                                type: string
                                enum:
                                  - start
                                  - center
                                  - end
                                  - stretch
                              justify:
                                type: string
                                enum:
                                  - start
                                  - center
                                  - end
                                  - stretch
                              minWidth:
                                anyOf:
                                  - b96740ab-6563-472f-91c0-8e5d04bac6c9
                                  - type: 'null'
                              maxWidth:
                                anyOf:
                                  - b96740ab-6563-472f-91c0-8e5d04bac6c9
                                  - type: 'null'
                              minHeight:
                                anyOf:
                                  - b96740ab-6563-472f-91c0-8e5d04bac6c9
                                  - type: 'null'
                              maxHeight:
                                anyOf:
                                  - b96740ab-6563-472f-91c0-8e5d04bac6c9
                                  - type: 'null'
                              aspectRatio:
                                anyOf:
                                  - 5c272cfa-0ab3-47ff-9a30-c28df84b854e
                                  - type: 'null'
                              padding:
                                type: number
                                minimum: 0
                                maximum: 320
                              gap:
                                type: number
                                minimum: 0
                                maximum: 320
                              hidden:
                                type: boolean
                              paddingInsets:
                                anyOf:
                                  - type: object
                                    properties:
                                      top:
                                        type: number
                                        minimum: 0
                                        maximum: 320
                                      right:
                                        type: number
                                        minimum: 0
                                        maximum: 320
                                      bottom:
                                        type: number
                                        minimum: 0
                                        maximum: 320
                                      left:
                                        type: number
                                        minimum: 0
                                        maximum: 320
                                    required:
                                      - top
                                      - right
                                      - bottom
                                      - left
                                    additionalProperties: false
                                  - type: 'null'
                              containerColumnWeights:
                                anyOf:
                                  - type: array
                                    items:
                                      type: number
                                      exclusiveMinimum: 0
                                      maximum: 1000
                                    minItems: 1
                                    maxItems: 12
                                  - type: 'null'
                            additionalProperties: false
                          tablet: 14e5576d-d3da-4269-ba32-b7c63fc617b8
                          mobile: c6af19c5-fb4c-4d30-89c6-d3b37a161e84
                        additionalProperties: false
                      paddingInsets:
                        anyOf:
                          - 6d5d417d-6fc5-438e-9fd0-1b1c9e289222
                          - type: 'null'
                      containerColumnWeights: ebf5f6c2-7f5c-4cad-824a-6db703d4a53d
                    required:
                      - containerLayout
                      - columnStart
                      - columnSpan
                      - row
                      - order
                      - align
                      - justify
                      - minWidth
                      - maxWidth
                      - minHeight
                      - maxHeight
                      - aspectRatio
                      - padding
                      - gap
                      - breakpointOverrides
                    additionalProperties: false
                required:
                  - id
                  - type
                  - pageId
                  - parentId
                  - hidden
                additionalProperties: false
              maxItems: 100
            pageInfo:
              type: object
              properties:
                nextCursor:
                  type:
                    - string
                    - 'null'
                total: 2d8f35b1-475e-4d6e-8f0d-94c3316b7c0f
              required:
                - nextCursor
                - total
              additionalProperties: false
          required:
            - pageId
            - data
            - pageInfo
          additionalProperties: false
        findings:
          type: object
          properties:
            data:
              type: array
              items:
                type: object
                properties:
                  id: c3be0761-8f08-4206-94f3-69a60f080e4d
                  ruleId: 2678a6cf-e90f-469f-a70a-d17169e8fcd8
                  ruleVersion:
                    type: number
                    const: 1
                  relationId: ba404db7-5c3e-42d7-85a6-19c0624310fa
                  severity:
                    type: string
                    enum:
                      - required
                      - advisory
                      - informational
                  evidenceStatus:
                    type: string
                    enum:
                      - verified
                      - unverified
                  validity:
                    type: string
                    enum:
                      - valid
                      - invalid
                      - unverified
                  pageId: e8138b16-8de3-4fbf-8e5d-46212f6f74dc
                  entityIds:
                    type: array
                    items: a870a7f2-3d8c-43b8-9559-bbc4f6161e85
                    maxItems: 250
                  contextId: 774d4d01-f5a7-41b6-991b-30286015f775
                  issueCode: 559a46eb-4699-411b-80ca-386ddd11aafc
                  observed:
                    anyOf:
                      - type: number
                      - type: 'null'
                  expected:
                    anyOf:
                      - 956e703e-5d10-4ee4-b274-7a6808bc93de
                      - type: 'null'
                  unit:
                    anyOf:
                      - type: string
                        enum:
                          - css_px
                          - ratio
                          - count
                      - type: 'null'
                  recommendedAction:
                    type: object
                    properties:
                      kind:
                        type: string
                        enum:
                          - increase_region_height
                          - increase_region_width
                          - resolve_overlapping_regions
                          - revise_layout_relationships
                          - resolve_data_output
                          - provide_font
                          - provide_asset
                          - provide_probe
                          - complete_coverage
                          - declare_scroll_policy
                          - allow_table_pagination
                          - use_readable_type
                          - increase_contrast
                          - review_hierarchy
                          - review_branding
                    required:
                      - kind
                    additionalProperties: false
                required:
                  - id
                  - ruleId
                  - ruleVersion
                  - severity
                  - evidenceStatus
                  - validity
                  - pageId
                  - entityIds
                  - contextId
                  - issueCode
                  - observed
                  - expected
                  - unit
                  - recommendedAction
                additionalProperties: false
              maxItems: 100
            requiredAdvisoryAcknowledgmentIds:
              type: array
              items:
                type: string
                minLength: 1
                maxLength: 256
              maxItems: 100
            pageInfo:
              type: object
              properties:
                offset: 11d18598-d7d7-4a66-afd5-787a75ef5125
                nextOffset:
                  anyOf:
                    - 3102818d-6a4e-410e-a212-1ff9429242ac
                    - type: 'null'
                total: 7f7fc2a2-5846-45ae-9051-f5707716be68
              required:
                - offset
                - nextOffset
                - total
              additionalProperties: false
          required:
            - data
            - requiredAdvisoryAcknowledgmentIds
            - pageInfo
          additionalProperties: false
      required:
        - data
        - placements
        - findings
      additionalProperties: false
    ApiError:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
            message:
              type: string
            details: {}
          required:
            - code
            - message
        requestId:
          type: string
      required:
        - error
        - requestId
  securitySchemes:
    WorkspaceKey:
      type: apiKey
      in: header
      name: x-chatobserver-key
      description: >-
        A workspace API key. Data endpoints require a service-account key with
        the specified scopes.
    BearerKey:
      type: http
      scheme: bearer
      description: The workspace or service-account API key as a bearer token.
    McpConnection:
      type: http
      scheme: bearer
      description: >-
        Delegated application credential issued after Chatobserver account
        consent. Restricted to selected workspaces and explicitly supported MCP
        operations. The MCP server access token is a separate credential and
        cannot be used here.

````

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