Archive a module
Set a module's archived_at to the current time and take the module out of the default module list.
This is a bodyless POST. A successful call returns 204 with an empty body. Read the module with Get a module when you need the new archived_at.
Only a module whose status is completed or cancelled can be archived. A module in any other status (backlog, planned, in-progress, or paused) returns 409 conflict and stays active.
Archiving is reversible with Unarchive a module, and it is separate from deleting. An archived module still exists and still resolves by id.
Path Parameters
slug:requiredstringThe workspace slug. It appears in your Plane URLs, for example my-team in https://app.plane.so/my-team/projects/.
project_id:requiredstring (uuid)The project the module belongs to.
pk:requiredstring (uuid)The module's UUID. A module from another project returns 404.
Body Parameters
None. The endpoint takes no request body, and anything you send is ignored.
Safe to repeat
Archiving a module that is already archived returns 204 and changes nothing. The status check does not run again, and archived_at keeps its first timestamp.
Scopes
projects.modules:write
Errors
| Status | Code | Cause |
|---|---|---|
400 | invalid_request | A malformed path parameter, for example a pk that isn't a UUID. |
401 | unauthorized | Missing or invalid credentials. |
402 | payment_required | The feature this endpoint belongs to isn't enabled on your plan, or is switched off. |
403 | forbidden | Your role or token scope can't archive modules in this project. |
404 | not_found | No such module, wrong project, or the record is outside your tenant. |
406 | not_acceptable | The Accept header asks for a representation the API can't produce. |
409 | conflict | The module's status is not completed or cancelled. |
413 | payload_too_large | The request body is over the size limit. |
415 | unsupported_media_type | The Content-Type isn't one this endpoint accepts. |
429 | rate_limited | Throttled. Honor the Retry-After header before retrying. |
curl -X POST \
"https://api.plane.so/api/v2/workspaces/my-team/projects/4af68566-94a4-4eb3-94aa-50dc9427067b/modules/7c1f3d90-2a64-4e58-9b0d-3fa1c7e28b45/archive/" \
-H "X-Api-Key: $PLANE_API_KEY"import requests
response = requests.post(
"https://api.plane.so/api/v2/workspaces/my-team/projects/4af68566-94a4-4eb3-94aa-50dc9427067b/modules/7c1f3d90-2a64-4e58-9b0d-3fa1c7e28b45/archive/",
headers={"X-Api-Key": "your-api-key"},
)
print(response.status_code) # 204const response = await fetch(
"https://api.plane.so/api/v2/workspaces/my-team/projects/4af68566-94a4-4eb3-94aa-50dc9427067b/modules/7c1f3d90-2a64-4e58-9b0d-3fa1c7e28b45/archive/",
{
method: "POST",
headers: { "X-Api-Key": "your-api-key" },
},
);
console.log(response.status); // 204No response body.
{
"type": "conflict",
"code": "conflict",
"detail": "Only completed or cancelled modules can be archived."
}What archiving changes
archived_atgoes fromnullto a timestamp. Nothing else on the module changes.status, the lead, the members, and the module's work items are untouched.- The module drops out of List modules. Pass
?is_archived=trueto list only archived modules, or?include_archived=trueto list them with the active ones. Get a module still returns it. - Plane removes the module from every user's favorites. Unarchiving does not add it back.
archived_at is read-only on the module itself, so a PATCH cannot archive it. This endpoint sets archived_at, and Unarchive a module clears it.

