> ## Documentation Index
> Fetch the complete documentation index at: https://cubed3-pavel-claude-elegant-dirac-88avqw.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# List the Cube placements in an external spreadsheet

Every block of Cube-written cells in the external document `externalWorkbookId` — a Google Drive file id, or the custom property the Excel add-in writes — across the whole tenant.

Unlike `GET /api/v1/deployments/{deploymentId}/reports?externalWorkbookId=`, which lists only the reports the caller can read, this endpoint also reports the placements they **cannot**: each entry carries `access`, which is `GRANTED` when the caller may open the exploration and `DENIED` when they may not. It is how a recipient of a shared workbook learns that a block they are looking at is backed by an exploration nobody has shared with them, and who to ask.

A `DENIED` entry carries only the placement's address (`resultLocation`/`sheetId`/`sheetName`/`anchorCell`/`endResultCell`/`host`), its opaque `reportId`/`placementId`, the owning `deploymentId`, the placement's `placedAt`/`refreshedAt` timestamps, and the exploration's `owner` — including their email address, so the recipient can ask for access. `owner` is `null` for an embed-partition exploration whose owning user record no longer exists — embed report ownership carries no foreign key, so the row can outlive its owner; a main-workspace exploration's owner always exists, since deleting the owner cascades to delete the report. `reportName` is `null` on a denied entry — the name is withheld along with the exploration — and reading the report itself still answers `403`.

Results are returned in pages using cursor-based pagination: pass `first` to set the page size and `after` (the previous response's `pageInfo.endCursor`) to fetch the next page. Omitting `first` returns every placement in the document.

A document holding more than 500 placed explorations, or more than 2000 placements in total, is answered with `422` rather than a truncated page — an inventory that looks complete but is not would hide the very placement a recipient needs to see.


## OpenAPI

````yaml /api-reference/api.yaml get /api/v1/external-documents/{externalWorkbookId}/placements
openapi: 3.1.0
info:
  title: Cube Platform API
  version: 1.0.0
  description: >-
    Programmatically manage Cube: deployments and everything scoped to them

    (environments, folders, reports, workbooks, notifications, workspace, and
    agents),

    plus account-level users, groups, policies, embedding, and AI settings.
    Data-model

    authoring, dev mode, branches, and uploads live under /build/api/v1 — same
    host and

    token, routed to the build pods.
servers:
  - url: https://{tenant}.cubecloud.dev
    description: Your tenant host. Replace the whole host if you use a custom domain.
    variables:
      tenant:
        default: your-tenant
        description: Your Cube tenant subdomain
security:
  - bearerAuth: []
tags:
  - name: Deployments
  - name: Deployment Creation
  - name: Environments
  - name: Env Variables
  - name: Regions
  - name: Data Model
  - name: Data Model Uploads
  - name: GitHub
  - name: GitHub Connection
  - name: dbt Sync
  - name: Databricks Metric View Publication
  - name: Databricks Metric View Integration
  - name: Folders
  - name: Reports
  - name: External Documents
  - name: Workbooks
  - name: Workbook Promotions
  - name: Dashboard Exports
  - name: Notifications
  - name: Workspace
  - name: Users
  - name: Users Admin
  - name: Roles
  - name: User Attributes
  - name: User Attribute Values
  - name: Tenant Settings
  - name: OAuth Integrations
  - name: User OAuth Tokens
  - name: OIDC Token Configs
  - name: App Theme
  - name: Embed
  - name: Embed Tenants
  - name: Dashboard Embed Access
  - name: Usage Analytics
  - name: OpenAPI Spec
paths:
  /api/v1/external-documents/{externalWorkbookId}/placements:
    get:
      tags:
        - External Documents
      summary: List the Cube placements in an external spreadsheet
      operationId: listExternalDocumentPlacements
      parameters:
        - in: path
          name: externalWorkbookId
          required: true
          schema:
            type: string
        - in: query
          name: after
          schema:
            oneOf:
              - type: string
              - type: 'null'
        - in: query
          name: first
          schema:
            oneOf:
              - minimum: 1
                type: integer
              - type: 'null'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExternalDocumentPlacementsListResponse'
          description: ''
        '422':
          description: >-
            The document holds more placements than this endpoint will report
            on. A state, not a malformed request: the answer is deliberately an
            error rather than a page that silently omits placements no cursor
            can reach.
components:
  schemas:
    ExternalDocumentPlacementsListResponse:
      properties:
        items:
          items:
            $ref: '#/components/schemas/ExternalDocumentPlacementResponse'
          type: array
        pageInfo:
          oneOf:
            - $ref: '#/components/schemas/PageInfo'
            - type: 'null'
      required:
        - items
      type: object
    ExternalDocumentPlacementResponse:
      properties:
        access:
          $ref: '#/components/schemas/ExternalDocumentPlacementResponseAccess'
        anchorCell:
          oneOf:
            - type: string
            - type: 'null'
        deploymentId:
          type: integer
        endResultCell:
          oneOf:
            - type: string
            - type: 'null'
        host:
          oneOf:
            - $ref: '#/components/schemas/ExternalDocumentPlacementResponseHost'
            - type: 'null'
        owner:
          oneOf:
            - $ref: '#/components/schemas/ResourceOwner'
            - type: 'null'
        placedAt:
          oneOf:
            - type: string
            - type: 'null'
        placementId:
          oneOf:
            - type: string
            - type: 'null'
        refreshedAt:
          oneOf:
            - type: string
            - type: 'null'
        reportId:
          type: integer
        reportName:
          oneOf:
            - type: string
            - type: 'null'
        resultLocation:
          type: string
        sheetId:
          oneOf:
            - type: string
            - type: 'null'
        sheetName:
          oneOf:
            - type: string
            - type: 'null'
      required:
        - access
        - reportId
        - deploymentId
        - resultLocation
      type: object
    PageInfo:
      properties:
        endCursor:
          oneOf:
            - type: string
            - type: 'null'
        hasNextPage:
          type: boolean
        hasPreviousPage:
          type: boolean
        startCursor:
          oneOf:
            - type: string
            - type: 'null'
      required:
        - hasNextPage
        - hasPreviousPage
      type: object
    ExternalDocumentPlacementResponseAccess:
      enum:
        - GRANTED
        - DENIED
      type: string
    ExternalDocumentPlacementResponseHost:
      enum:
        - GOOGLE_SHEETS
        - EXCEL
      type: string
    ResourceOwner:
      properties:
        email:
          type: string
        firstName:
          oneOf:
            - type: string
            - type: 'null'
        id:
          type: integer
        picture:
          oneOf:
            - type: string
            - type: 'null'
      required:
        - id
        - email
      type: object
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: 'Token authentication. Send `Authorization: Bearer <YOUR_TOKEN>`.'

````