PageSpace resolves page access on every request, against the authoritative database — there is no permission cache between you and the answer. The model is open within a drive, private by exception: members of a drive see its pages by default, and you lock individual pages down when you need to.
Every drive has exactly one owner, with unconditional view, edit, share, and delete on every page — including private ones. Ownership cannot be overridden by any other record.
Members with the admin role get the same full access as the owner once they accept their invitation: every page, including private ones, plus the ability to manage members and roles.
A plain member sees every page in the drive that isn't marked private — no per-page grant required. On channels, members can post by default. Members don't get edit, share, or delete on other pages unless a grant or a role gives it to them, and they can't see pages marked private unless they're explicitly added.
AI agents and connected apps (MCP tokens) are drive members too, each with its own role on the drive — member, admin, or a custom role. Their access follows that role the same way a person's does: a member-level agent or app sees the drive's non-private pages and nothing marked private unless it's been granted. Give an agent or app a narrower role to limit what it can reach.
Someone granted access to specific pages without being added to the drive. They reach exactly those pages and nothing else — a keyhole into the drive, not a key to the building.
No inheritance for explicit grants. A direct grant on a folder does not cascade to the pages inside it — each page is resolved on its own. (The member baseline is the opposite: members see every non-private page without any grant at all.)
When a user requests a page, the server resolves access in this order:
Drive A is owned by Alice. It contains Folder X, which contains Document Y.
POST /api/pages/{pageId}/permissions
{
"userId": "user_...",
"canView": true,
"canEdit": true,
"canShare": false,
"canDelete": false,
"expiresAt": "2026-06-01T00:00:00.000Z" // optional
}
Requires drive ownership, drive admin membership, or share capability on the target page.
DELETE /api/pages/{pageId}/permissions
{ "userId": "user_..." }
GET /api/pages/{pageId}/permissions/check
// → { canView, canEdit, canShare, canDelete } for the current user
GET /api/drives/{driveId}/permissions-tree?userId=user_...
// → per-page permission status for the named user across the whole drive
Requires drive ownership or admin membership.
POST /api/permissions/batch
// Apply multiple page-permission changes in one request
| Method | Route | Description |
|---|---|---|
| GET | /api/pages/{id}/permissions | List grants on a page (for users who can share) |
| POST | /api/pages/{id}/permissions | Grant or update a user's permissions on a page |
| DELETE | /api/pages/{id}/permissions | Revoke a user's permissions on a page |
| GET | /api/pages/{id}/permissions/check | Current user's flags on a page |
| GET | /api/drives/{id}/permissions-tree | Per-page status across a drive |
| POST | /api/permissions/batch | Apply multiple page-permission changes atomically |
Search docs, blog posts, and more.