Get a published page
Read a published page by its anchor. The response is the full page object, the same shape a page detail read returns, with the body in description_html.
The anchor grants access. The endpoint doesn't check your workspace or project membership, or the page's access level. Any authenticated caller whose credentials are valid for this workspace can read the page. See Who can read a published page.
This works for published project pages and published wiki pages alike. collection_id is always null on this read.
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. The anchor must belong to this workspace.
anchor:requiredstringThe public anchor Plane minted when the page was published, a 32-character hex string. It isn't the page id. A page id here returns 404.
Response shaping
fields:optionalstringComma-separated list of fields to return. Unrequested keys are omitted from the response, not returned as null, so absent means "not requested" and null means "actually null". id always comes back whether or not you name it.
Pass all for every requestable field. An unknown name is a 400 that lists the valid set and suggests the closest match, so a typo can't silently cost you the saving.
Requestable here: access, archived_at, collection_id, color, created_at, created_by_id, description_html, description_stripped, external_id, external_source, id, is_global, is_locked, logo_props, name, owned_by_id, parent_id, project_ids, sort_order, updated_at, updated_by_id, view_props.
See Sparse fields.
expand:optionalstringComma-separated relations to embed alongside the ids: owned_by (the page's owner), parent (its parent page).
Expansion is separate-key: ?expand=parent keeps parent_id and adds a parent object next to it, so an id is never replaced by an object. An unknown value is a 400.
?fields= and ?expand= are independent namespaces. Relation names are not valid ?fields= tokens (and vice versa), and an expanded object survives field filtering. For example, ?fields=id,name&expand=owned_by returns id, name, and owned_by. See Expanding relations.
Errors
| Status | Code | Cause |
|---|---|---|
401 | unauthorized | Missing or invalid credentials, or an API key bound to a different workspace. |
402 | payment_required | The feature this endpoint belongs to isn't enabled on your plan, or is switched off. |
403 | forbidden | Your OAuth token lacks the scope, or its app isn't installed in this workspace. |
404 | not_found | Unknown anchor, an anchor from another workspace, an anchor for something other than a page, or the page was unpublished, archived, or deleted. |
406 | not_acceptable | The Accept header asks for a representation the API can't produce. |
429 | rate_limited | Throttled. Honor the Retry-After header before retrying. |
curl -X GET \
"https://api.plane.so/api/v2/workspaces/my-team/published-pages/3f9c2a7b8e1d4c6f9a0b5e2d7c4f1a83/" \
-H "X-Api-Key: $PLANE_API_KEY"import requests
response = requests.get(
"https://api.plane.so/api/v2/workspaces/my-team/published-pages/3f9c2a7b8e1d4c6f9a0b5e2d7c4f1a83/",
headers={"X-Api-Key": "your-api-key"},
)
print(response.json()["description_html"])const response = await fetch(
"https://api.plane.so/api/v2/workspaces/my-team/published-pages/3f9c2a7b8e1d4c6f9a0b5e2d7c4f1a83/",
{
headers: {
"X-Api-Key": "your-api-key",
},
},
);
const data = await response.json();{
"id": "9c1f0b3d-6d2e-4c9a-8b41-2f7e5a0d6c88",
"name": "Q3 release notes",
"access": 0,
"color": "",
"is_locked": false,
"archived_at": null,
"logo_props": {},
"view_props": {
"full_width": false
},
"description_html": "<h2>Q3 release notes</h2><p>Faster boards and a new API.</p>",
"description_stripped": "Q3 release notes Faster boards and a new API.",
"parent_id": null,
"owned_by_id": "16c61a3a-512a-48ac-b0be-b6b46fe6f430",
"collection_id": null,
"project_ids": ["4af68566-94a4-4eb3-94aa-50dc9427067b"],
"is_global": false,
"sort_order": 65535.0,
"external_id": null,
"external_source": null,
"created_at": "2026-01-14T09:22:41.478363Z",
"updated_at": "2026-01-20T15:08:12.330914Z",
"created_by_id": "16c61a3a-512a-48ac-b0be-b6b46fe6f430",
"updated_by_id": "16c61a3a-512a-48ac-b0be-b6b46fe6f430"
}{
"type": "not_found",
"code": "not_found",
"detail": "The requested resource was not found."
}
