---
title: "Copy a failed plan to a new draft"
method: POST
path: "/workspaces/{workspace}/admin/plans/{deployment_plan}/copy"
tags: ["DeploymentPlan"]
---

# Copy a failed plan to a new draft

`POST /workspaces/{workspace}/admin/plans/{deployment_plan}/copy`

## Request

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

Copy failed plan content and stored integer budgets into a fresh draft. History stays unchanged; validate budgets and submit again with a new intent.

## Path parameters

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

## Response `201`

A new draft was created.

- PlanCopyRead
  - `plan` object, required
    - `id` string, required
    - `platform_ad_account_id` integer, required
    - `status` 'draft', required
    - `budget_amount_minor` integer, required
    - `validation_result` unknown, required
    - `validated_at` unknown, required
    - `approval_id` unknown, required

## Other responses

- `401`: Missing, invalid, revoked or expired credentials, a missing active principal, missing read scope or lost issuer authority return message. No error code is returned.
- `403`: Missing workspace, account or write access returns error.code insufficient_scope and error.message. A revoked grant returns message without a code.
- `404`: An inaccessible or missing plan returns error.code plan_not_found and error.message. A missing workspace or disabled Plan surface returns the api_route_not_found envelope with error, request and resources.
- `413`: Oversized POST data returns message "The POST data is too large." before route authorization.
- `422`: error.code plan_not_failed when the source is not failed; platform_ad_account_unavailable when its account becomes unavailable after authorization; plan_not_found if the source disappears after lookup. Each includes error.message. JSON booleans in integer workspace or account selectors return message plus field errors.
- `429`: The shared API rate limit is exceeded; message is "Too Many Attempts." Retry-After gives seconds until a retry is allowed.
- `500`: An unexpected server or provider-read fault returns message "Server Error" when debug is disabled.
- `503`: The bounded workspace transaction timed out: error.code workspace_lock_timeout and error.message "The workspace is busy. Retry the operation shortly." Retry-After is 1 second.

---

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