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 created 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. Fields you don't request are left out of the response instead of coming back as null, so a missing key means you didn't ask for it and null means the value is null. id is always included, whether or not you name it.
Pass all to get every requestable field. An unknown field name returns 400 with the list of valid names and the closest match, so a typo is caught instead of being silently ignored.
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).
Expanded objects get their own 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 returns 400.
?fields= and ?expand= take separate sets of names. Relation names aren't valid in ?fields=, field names aren't valid in ?expand=, and field filtering never removes an expanded object. 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."
}
