Unarchive a project page
Restore an archived project page. The call sets the page's archived_at back to null and restores its nested pages with it. After this, Delete a project page refuses the page again until you re-archive it.
This is a bodyless POST. Send no JSON. A successful call returns 204 with no body.
The call is idempotent. Unarchiving a page that isn't archived returns 204 and changes nothing.
A nested page can't come back while its parent is still archived. In that case, the call returns 400 invalid_request with detail The parent page should be restored first. Unarchive the parent instead, and the nested page comes back with it.
Path Parameters
slug:requiredstringThe workspace slug. It appears in your Plane URLs. In https://app.plane.so/my-team/projects/, the slug is my-team.
project_id:requiredstringThe project the page belongs to. Accepts the project UUID or its bare identifier, for example ENG.
pk:requiredstring (uuid)The id of the page to restore.
Body Parameters
None. The endpoint takes no request body.
Scopes
projects.pages:write
Errors
| Status | Code | Cause |
|---|---|---|
400 | invalid_request | The page's parent is still archived. |
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 restore this page. |
404 | not_found | No such page in this project, or you can't see it. |
406 | not_acceptable | The Accept header asks for a representation the API can't produce. |
409 | conflict | All write endpoints declare this status. This endpoint has no conflict case of its own. |
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/pages/9c1f0b3d-6d2e-4c9a-8b41-2f7e5a0d6c88/unarchive/" \
-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"
"/pages/9c1f0b3d-6d2e-4c9a-8b41-2f7e5a0d6c88/unarchive/",
headers={"X-Api-Key": "your-api-key"},
)
print(response.status_code)const response = await fetch(
"https://api.plane.so/api/v2/workspaces/my-team/projects/4af68566-94a4-4eb3-94aa-50dc9427067b" +
"/pages/9c1f0b3d-6d2e-4c9a-8b41-2f7e5a0d6c88/unarchive/",
{
method: "POST",
headers: { "X-Api-Key": "your-api-key" },
},
);
console.log(response.status);No response body.
{
"type": "invalid_request",
"code": "invalid_request",
"detail": "The parent page should be restored first."
}What unarchiving changes
archived_aton the page goes back tonull.- Every nested page under it is restored too, including nested pages that were archived on their own before the parent was. The nested pages are updated in the background, so for a moment after the
204they can still read as archived.
Unarchiving doesn't undo the other effects of archiving:
- The page stays unpublished. If you need its public link back, publish it again in the Plane app.
- Favorites that archiving removed stay removed.

