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

# Update a deployment plan

`PATCH /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

Create or edit a draft deployment plan for the authorized advertising account. Review and validate the plan before submitting any provider writes.

## Path parameters

- `workspace` integer, required
- `deployment_plan` string, required

## Request body

- UpdateDeploymentPlanRequest
  - `name` string, nullable
  - `platform_ad_account_id` integer
  - `platform` 'google' | 'meta' | 'microsoft'
  - `campaign_ref` string, nullable
  - `campaign_spec` string[], nullable
  - `ad_set_ref` string, nullable
  - `ad_set_spec` object, nullable: Budget fields use positive whole Meta minor units. JSON booleans return 422 with field errors; digit-only strings retain their existing normalization.
    - `daily_budget` integer
    - `bid_amount` integer
    - `lifetime_budget` integer, nullable
  - `budget_type` 'daily' | 'lifetime'
  - `budget_amount_minor` integer
  - `currency` string
  - `copy` object
    - `primary_text` string, required
    - `headline` string, required
    - `description` string, required
    - `cta` 'learn_more' | 'shop_now' | 'sign_up', required
  - `landing_page` string, uri
  - `utm_policy_name` string, nullable
  - `naming_policy_name` string, nullable
  - `creative_ids` string[]
  - `creative_overrides` object[]
    - `creative_id` string, required
    - `copy` object, required
      - `primary_text` string, required
      - `headline` string, required
      - `description` string, required
      - `cta` 'learn_more' | 'shop_now' | 'sign_up', required
    - `landing_page` string, uri, nullable, required

## Response `200`

- object
  - `plan` unknown[], required
    - unknown

## Other responses

- `401`: Invalid or missing Server secret.
- `404`: A missing workspace returns the api_route_not_found envelope.
- `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)
