Change a test plan
const url = 'https://beta-api.plune.ai/v1/plans/example';const options = { method: 'PATCH', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"kind":"manual","asManual":true}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request PATCH \ --url https://beta-api.plune.ai/v1/plans/example \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "kind": "manual", "asManual": true }'Title, description, kind, asManual or the collections — the last replaces the whole list. Runs already launched from the plan keep their own expected: a plan is resolved at launch, not linked.
Authorizations
Section titled “Authorizations ”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “Path Parameters ”Request Body required
Section titled “Request Body required ”Any of the five fields; an empty object is refused (400). collections replaces the whole list.
object
Example
{ "kind": "manual", "asManual": true}Responses
Section titled “ Responses ”The plan as it is now
A titled collection of case filters. A plan is a query, not a list of ids: what it collects is resolved when asked (GET /v1/plans/{id}/cases), and a launch turns that into a run.
object
Unique within the project.
Up to 16 384 bytes.
Who executes it and which cases it may collect: manual takes manual cases, automated automated ones, mixed both. Evals belong to no plan.
The one exception to the strict mapping: a manual plan that also takes automated cases, to be walked by a person.
Each item is a case filter in its query-string form (suiteId=…&tag=…&priority=…&priorityMin=…&type=…&state=…&q=…, ADR 0001) — AND between its dimensions, OR within one, OR between collections. Written back canonical, so two spellings of one filter are one string. An empty string is every case.
Example
{ "id": "6f1c2b3a-0000-4000-8000-0000000000f3", "projectId": "u-shop::default", "title": "Release regression", "description": "Everything under checkout, plus every critical case wherever it lives.", "kind": "manual", "asManual": true, "collections": [ "suiteId=6f1c2b3a-0000-4000-8000-0000000000a1", "priority=critical" ], "createdAt": "2026-09-16T09:12:04.151Z", "updatedAt": "2026-09-16T09:12:04.151Z"}Invalid body, or nothing to change
object
Example generated
{ "error": "example"}No / invalid token or session
No such plan in your projects
object
Example generated
{ "error": "example"}The new title is taken
object
Example generated
{ "error": "example"}Rate-limited: either the per-route throttle or a tenant quota. Retry-After carries the seconds until the window rolls over.
object
Example generated
{ "error": "example"}Headers
Section titled “Headers ”Seconds until the window rolls over