Skip to content

Get a published page ​

GET/api/v2/workspaces/{slug}/published-pages/{anchor}/

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:requiredstring

The 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:requiredstring

The 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:optionalstring

Comma-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:optionalstring

Comma-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.

Scopes ​

projects.pages:read

The scope is the same for a published wiki page.

Errors ​

StatusCodeCause
401unauthorizedMissing or invalid credentials, or an API key bound to a different workspace.
402payment_requiredThe feature this endpoint belongs to isn't enabled on your plan, or is switched off.
403forbiddenYour OAuth token lacks the scope, or its app isn't installed in this workspace.
404not_foundUnknown anchor, an anchor from another workspace, an anchor for something other than a page, or the page was unpublished, archived, or deleted.
406not_acceptableThe Accept header asks for a representation the API can't produce.
429rate_limitedThrottled. Honor the Retry-After header before retrying.
Get a published page
bash
curl -X GET \
  "https://api.plane.so/api/v2/workspaces/my-team/published-pages/3f9c2a7b8e1d4c6f9a0b5e2d7c4f1a83/" \
  -H "X-Api-Key: $PLANE_API_KEY"
Response200
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"
}
Response404
json
{
  "type": "not_found",
  "code": "not_found",
  "detail": "The requested resource was not found."
}