---
title: "List deployment plans"
method: GET
path: "/workspaces/{workspace}/admin/plans"
tags: ["DeploymentPlan"]
---

# List deployment plans

`GET /workspaces/{workspace}/admin/plans`

## Request

- Base URL: `https://plainrouter.com/api/v1`
- URL: `https://plainrouter.com/api/v1/workspaces/{workspace}/admin/plans`
- Auth: HTTP bearer

Read plans for the approved ad account with their current review_version. Pass the version from the plan you reviewed when executing.

## Path parameters

- `workspace` integer, required

## Query parameters

- `cursor` integer
- `per_page` integer
- `page` integer

## Response `200`

Plans with their current review version. Result projections share the 80,000-byte MCP JSON budget; defaults are bounded, next_cursor continues complete rows, and oversized single rows are explicitly refused. Plan creative continuation uses the read endpoint; proposal continuation uses the batch read endpoint.

- object
  - `plans` object, required
    - `data` DeploymentPlanRead[], required
      - `name` string, nullable
      - `id` string, required
      - `platform_ad_account_id` integer, required
      - `review_version` string, required: Current review version. Pass this value when executing the plan you reviewed.
      - `copy` object, nullable
        - `primary_text` string, required
        - `headline` string, required
        - `description` string, required
        - `cta` 'learn_more' | 'shop_now' | 'sign_up', required
      - `landing_page` string
      - `creatives` object[]
        - `id` string, required
        - `position` integer, required
        - `copy` object, nullable, required: Optional complete per-ad copy override; null uses the plan copy.
          - `primary_text` string, required
          - `headline` string, required
          - `description` string, required
          - `cta` 'learn_more' | 'shop_now' | 'sign_up', required
        - `landing_page` string, nullable, required: Optional per-ad HTTPS landing URL override; null uses the plan landing URL.
        - `resolved_copy` object, nullable, required
          - `primary_text` string, required
          - `headline` string, required
          - `description` string, required
          - `cta` 'learn_more' | 'shop_now' | 'sign_up', required
        - `resolved_landing_page` string, required
        - `copy_differs` boolean, required
        - `landing_page_differs` boolean, required
      - `next_cursor` integer, nullable
      - `truncated` boolean
      - `continuation` string
      - `creative_count` integer
    - `current_page` integer, required
    - `per_page` integer, required
    - `total` integer, required
    - `last_page` integer, required
    - `next_cursor` integer, nullable, required: Always present. The next row offset, or null when the list is complete.
    - `truncated` boolean, required
    - `next_page_arguments` union, required: Always present. Page and per_page for aligned offsets, cursor and per_page after a byte-limited page, or null when complete.
      - object
        - `page` integer, required
        - `per_page` integer, required
      - object
        - `cursor` integer, required
        - `per_page` integer, required
    - `continuation` string, required

## Other responses

- `401`: An active principal is required.
- `403`: The principal lacks read access to this account.
- `404`: Workspace or plan not found.
- `422`: JSON booleans in integer inputs, including workspace selectors, return message plus errors mapping field names to arrays of messages. Numeric strings retain their existing validation and coercion.

---

[API](https://skmtc.dev/plainrouter/apis/plainrouter-conversion-api.md) · [All operations](https://skmtc.dev/plainrouter/apis/plainrouter-conversion-api/llms.txt) · [OpenAPI document](https://skmtc.dev/plainrouter/apis/plainrouter-conversion-api/revisions/d071d4f4f05c?raw)
