Skip to content

Published pages overview ​

Publishing a page gives it a public web link. Plane mints an anchor for the page at that moment, a 32-character hex string that identifies the published copy. This resource reads the page behind an anchor. It's read-only. The API has no operation that publishes or unpublishes a page.

Both project pages and workspace (wiki) pages can be published, and both resolve here. The path is workspace-scoped, with no project segment, because an anchor is unique across the workspace and a wiki page has no project at all.

Learn more about publishing pages

Who can read a published page ​

The anchor grants access. The endpoint checks that you're authenticated and that your token is allowed to call it. It doesn't check workspace membership, project membership, or the page's own access level, so any authenticated caller who holds the anchor can read a private page that was published.

  • An API key works if it isn't bound to a different workspace. A key bound to another workspace returns 401.
  • An OAuth token works if its app is installed in the workspace and the token carries projects.pages:read (or the global read scope). Otherwise the call returns 403.
  • An unauthenticated request returns 401. For anonymous readers, use the page's public web link.

What returns 404 ​

The lookup is limited to the workspace in the path. Each of these returns 404 not_found:

  • An anchor that doesn't exist.
  • A real anchor that belongs to another workspace.
  • An anchor that publishes something other than a page, such as a published project.
  • An anchor whose page has been deleted.
  • An anchor whose page was unpublished or archived. Archiving a page unpublishes it, and unarchiving doesn't publish it again.

The page object ​

A published page reads as the same page object that Get a project page and Get a workspace page return, with every field, including description_html, description_stripped, and project_ids. See the Project pages overview for the attributes.

One value differs from the page routes. collection_id is always null here, even for a wiki page in a collection. Read the page through Get a workspace page to get its collection.

project_ids is the same as on the page routes. It lists the projects a project page belongs to, and it is empty for a wiki page.

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"
}

Endpoints ​

MethodPathDescription
GET/api/v2/workspaces/{slug}/published-pages/{anchor}/Get a published page

Response shaping ​

The read accepts ?fields= for sparse responses and ?expand=owned_by,parent to embed the owner and the parent page. See Sparse fields and Expanding relations. Errors follow the shared problem+json contract.

Changed from v1 ​

  • v1 serves this read at /api/v1/workspaces/{slug}/projects/{project_id}/pages/published/{anchor}/ but never uses project_id. v2 drops the project segment, so the path also fits a published wiki page, which has no project.
  • v1 resolves an anchor from any workspace's URL. v2 limits the lookup to the workspace in the path and returns 404 for an anchor that belongs to another workspace.
  • The access rule is unchanged. Like v1, v2 requires authentication and the pages read scope, and doesn't check membership.

See Migrating from v1 for the full list.