---
title: "Read a deployment plan"
method: GET
path: "/workspaces/{workspace}/admin/plans/{deployment_plan}"
tags: ["DeploymentPlan"]
---

# Read a deployment plan

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

## Request

- Base URL: `https://plainrouter.com/api/v1`
- URL: `https://plainrouter.com/api/v1/workspaces/{workspace}/admin/plans/{deployment_plan}`
- 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
- `deployment_plan` string, required

## Query parameters

- `cursor` integer
- `limit` 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
  - `plan` DeploymentPlanRead, required: Complete projection rows are paged within 80,000 JSON bytes, accounting for both MCP representations. Defaults are bounded. Follow next_cursor with the same scope and filters. One oversized row is explicitly refused; fields are never silently clipped.
    - `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

## 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)
