Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 74 additions & 1 deletion docs/.vitepress/config.mts
Original file line number Diff line number Diff line change
Expand Up @@ -762,12 +762,85 @@ export default extendConfig(
collapsed: true,
items: [
{ text: "Overview", link: "/api-reference/page/overview" },
{ text: "Page Content HTML", link: "/api-reference/page/page-content-html" },
{ text: "List Workspace Pages", link: "/api-reference/page/list-workspace-pages" },
{ text: "Add Workspace Page", link: "/api-reference/page/add-workspace-page" },
{ text: "Get Workspace Page", link: "/api-reference/page/get-workspace-page" },
{ text: "Update Workspace Page", link: "/api-reference/page/update-workspace-page" },
{ text: "Archive Workspace Page", link: "/api-reference/page/archive-workspace-page" },
{ text: "Restore Workspace Page", link: "/api-reference/page/restore-workspace-page" },
{ text: "Delete Workspace Page", link: "/api-reference/page/delete-workspace-page" },
{
text: "Get Workspace Page Attachment",
link: "/api-reference/page/get-workspace-page-attachment",
},
{
text: "Confirm Workspace Page Attachment Upload",
link: "/api-reference/page/confirm-workspace-page-attachment-upload",
},
{
text: "Download Workspace Page Attachment",
link: "/api-reference/page/download-workspace-page-attachment",
},
{
text: "Delete Workspace Page Attachment",
link: "/api-reference/page/delete-workspace-page-attachment",
},
{ text: "List Project Pages", link: "/api-reference/page/list-project-pages" },
{ text: "Add Project Page", link: "/api-reference/page/add-project-page" },
{ text: "Get Workspace Page", link: "/api-reference/page/get-workspace-page" },
{ text: "Get Project Page", link: "/api-reference/page/get-project-page" },
{ text: "Update Project Page", link: "/api-reference/page/update-project-page" },
{ text: "Archive Project Page", link: "/api-reference/page/archive-project-page" },
{ text: "Restore Project Page", link: "/api-reference/page/restore-project-page" },
{ text: "Delete Project Page", link: "/api-reference/page/delete-project-page" },
],
},
{
text: "Collections",
collapsed: true,
items: [
{ text: "Overview", link: "/api-reference/collection/overview" },
{ text: "List Collections", link: "/api-reference/collection/list-collections" },
{ text: "Create Collection", link: "/api-reference/collection/create-collection" },
{ text: "Retrieve Collection", link: "/api-reference/collection/retrieve-collection" },
{ text: "Update Collection", link: "/api-reference/collection/update-collection" },
{ text: "Delete Collection", link: "/api-reference/collection/delete-collection" },
{
text: "List Collection Members",
link: "/api-reference/collection/list-collection-members",
},
{
text: "Add Collection Member",
link: "/api-reference/collection/add-collection-member",
},
{
text: "Update Collection Member",
link: "/api-reference/collection/update-collection-member",
},
{
text: "Remove Collection Member",
link: "/api-reference/collection/remove-collection-member",
},
{
text: "List Collection Pages",
link: "/api-reference/collection/list-collection-pages",
},
{
text: "Search Collection Pages",
link: "/api-reference/collection/search-collection-pages",
},
{
text: "Add Collection Pages",
link: "/api-reference/collection/add-collection-pages",
},
{
text: "Move or Reorder Collection Page",
link: "/api-reference/collection/move-or-reorder-collection-page",
},
{
text: "Remove Collection Page",
link: "/api-reference/collection/remove-collection-page",
},
],
},
{
Expand Down
26 changes: 21 additions & 5 deletions docs/api-reference/assets/create-workspace-asset-upload.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ keywords: plane, plane api, rest api, api integration, assets, create workspace
<div class="api-two-column">
<div class="api-left">

Generate presigned URL for generic asset upload
Generate a presigned URL for a workspace asset upload. To attach a file to a workspace page, set `entity_type` to
`PAGE_DESCRIPTION` and pass the page UUID as `entity_identifier`. The page must be editable, unlocked, and active.

<div class="params-section">

Expand Down Expand Up @@ -61,6 +62,18 @@ UUID of the project to associate with the asset

</ApiParam>

<ApiParam name="entity_type" type="string" :required="false">

Asset context. Use `PAGE_DESCRIPTION` for a workspace page attachment.

</ApiParam>

<ApiParam name="entity_identifier" type="string" :required="false">

UUID of the workspace page when `entity_type` is `PAGE_DESCRIPTION`.

</ApiParam>

Comment thread
coderabbitai[bot] marked this conversation as resolved.
<ApiParam name="external_id" type="string" :required="false">

External identifier for the asset (for integration tracking)
Expand Down Expand Up @@ -101,7 +114,8 @@ curl -X POST \
"name": "Example Name",
"type": "image/jpeg",
"size": 1024000,
"project_id": "550e8400-e29b-41d4-a716-446655440000",
"entity_type": "PAGE_DESCRIPTION",
"entity_identifier": "4d2f6f7e-9b4a-4d6a-8f4a-1c3f7c0f4a10",
"external_id": "550e8400-e29b-41d4-a716-446655440000",
"external_source": "github"
}'
Expand All @@ -120,7 +134,8 @@ response = requests.post(
"name": "Example Name",
"type": "image/jpeg",
"size": 1024000,
"project_id": "550e8400-e29b-41d4-a716-446655440000",
"entity_type": "PAGE_DESCRIPTION",
"entity_identifier": "4d2f6f7e-9b4a-4d6a-8f4a-1c3f7c0f4a10",
"external_id": "550e8400-e29b-41d4-a716-446655440000",
"external_source": "github"
}
Expand All @@ -142,7 +157,8 @@ const response = await fetch("https://api.plane.so/api/v1/workspaces/my-workspac
name: "Example Name",
type: "image/jpeg",
size: 1024000,
project_id: "550e8400-e29b-41d4-a716-446655440000",
entity_type: "PAGE_DESCRIPTION",
entity_identifier: "4d2f6f7e-9b4a-4d6a-8f4a-1c3f7c0f4a10",
external_id: "550e8400-e29b-41d4-a716-446655440000",
external_source: "github",
}),
Expand All @@ -158,7 +174,7 @@ const data = await response.json();
```json
{
"asset_id": "550e8400-e29b-41d4-a716-446655440000",
"asset_url": "/api/assets/v2/workspaces/my-workspace/projects/None/issues/None/attachments/550e8400-e29b-41d4-a716-446655440000/",
"asset_url": "/api/v1/workspaces/my-workspace/pages/4d2f6f7e-9b4a-4d6a-8f4a-1c3f7c0f4a10/attachments/550e8400-e29b-41d4-a716-446655440000/",
"upload_data": {
"url": "https://uploads.example.com/plane-bucket",
"fields": {
Expand Down
76 changes: 76 additions & 0 deletions docs/api-reference/collection/add-collection-member.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
---
title: Add a collection member
description: Grant a workspace user access to a private Plane collection.
keywords: plane, plane api, rest api, collection members, add member, private collection
---

# Add a collection member

<div class="api-endpoint-badge"><span class="method post">POST</span><span class="path">/api/v1/workspaces/{workspace_slug}/collections/{collection_id}/members/</span></div>

<div class="api-two-column"><div class="api-left">

Adds an explicit member to a private collection. The caller must be able to manage the collection.

### Path Parameters

<ApiParam name="workspace_slug" type="string" :required="true">The workspace slug.</ApiParam>
<ApiParam name="collection_id" type="uuid" :required="true">The collection ID.</ApiParam>

### Body Parameters

<ApiParam name="member" type="uuid" :required="true">The workspace user's ID.</ApiParam>
<ApiParam name="access" type="integer" :required="false">`0` (view, default), `1` (comment), or `2` (edit).</ApiParam>

### OAuth scope

`write` or `wiki.pages:write`

</div><div class="api-right">
<CodePanel title="Add a collection member" :languages="['cURL', 'Python', 'JavaScript']"><template #curl>

```bash
curl -X POST "https://api.plane.so/api/v1/workspaces/my-workspace/collections/collection-uuid/members/" \
-H "X-API-Key: $PLANE_API_KEY" -H "Content-Type: application/json" \
-d '{"member":"6f356c85-bb22-47e0-b8b1-cf18aa6adad3","access":0}'
```

</template><template #python>

```python
import requests
url = "https://api.plane.so/api/v1/workspaces/my-workspace/collections/collection-uuid/members/"
response = requests.post(url, headers={"X-API-Key": "your-api-key"}, json={"member": "6f356c85-bb22-47e0-b8b1-cf18aa6adad3", "access": 0})
print(response.json())
```

</template><template #javascript>

```javascript
const url = "https://api.plane.so/api/v1/workspaces/my-workspace/collections/collection-uuid/members/";
const response = await fetch(url, {
method: "POST",
headers: { "X-API-Key": "your-api-key", "Content-Type": "application/json" },
body: JSON.stringify({ member: "6f356c85-bb22-47e0-b8b1-cf18aa6adad3", access: 0 }),
});
console.log(await response.json());
```

</template></CodePanel>
<ResponsePanel status="201">

```json
{
"id": "4edec253-26f4-4667-8f52-9488dca1c620",
"collection": "0a8a3e6a-3c32-49c7-bbb5-b7a8e32c2f10",
"member": "6f356c85-bb22-47e0-b8b1-cf18aa6adad3",
"access": 0,
"workspace": "95d1f03f-16e5-4807-a8c5-ec0c7cf0e4ab",
"created_at": "2026-08-18T10:00:00Z",
"updated_at": "2026-08-18T10:00:00Z",
"created_by": "d2f1b470-55e8-4e7a-8a61-7fc695bc1a4f",
"updated_by": "d2f1b470-55e8-4e7a-8a61-7fc695bc1a4f"
}
```

</ResponsePanel></div></div>
86 changes: 86 additions & 0 deletions docs/api-reference/collection/add-collection-pages.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
---
title: Add pages to a collection
description: Add one or more Plane workspace page trees to a collection.
keywords: plane, plane api, rest api, collection pages, add pages, page placement
---

# Add pages to a collection

<div class="api-endpoint-badge"><span class="method post">POST</span><span class="path">/api/v1/workspaces/{workspace_slug}/collections/{collection_id}/pages/</span></div>

<div class="api-two-column"><div class="api-left">

Adds each selected page and its sub-pages. Adding to a private collection makes the page tree private; adding an owned
private page to a public collection makes it public. Private collections accept only root pages.

### Path Parameters

<ApiParam name="workspace_slug" type="string" :required="true">The workspace slug.</ApiParam>
<ApiParam name="collection_id" type="uuid" :required="true">The destination collection ID.</ApiParam>

### Body Parameters

<ApiParam name="page_ids" type="uuid[]" :required="true">One or more workspace page IDs.</ApiParam>
<ApiParam name="sort_orders" type="object" :required="false">Page-ID keys mapped to numeric sort orders. Every key must occur in `page_ids`.</ApiParam>
<ApiParam name="placement" type="object" :required="false">Placement with `type`: `append`, `before`, or `after`; optional `parent_id`; and required `target_page_id` for `before` or `after`. Before/after accepts exactly one page.</ApiParam>

`placement` takes precedence over `sort_orders`. An `append` placement accepts multiple pages and preserves their order
from `page_ids`.

### OAuth scope

`write` or `wiki.pages:write`

</div><div class="api-right">
<CodePanel title="Add pages to a collection" :languages="['cURL', 'Python', 'JavaScript']"><template #curl>

```bash
curl -X POST "https://api.plane.so/api/v1/workspaces/my-workspace/collections/collection-uuid/pages/" \
-H "X-API-Key: $PLANE_API_KEY" -H "Content-Type: application/json" \
-d '{"page_ids":["ea8ccdab-1cf4-448b-8205-51e4b98d82b8"],"placement":{"type":"append","parent_id":null}}'
```

</template><template #python>

```python
import requests
url = "https://api.plane.so/api/v1/workspaces/my-workspace/collections/collection-uuid/pages/"
payload = {"page_ids": ["ea8ccdab-1cf4-448b-8205-51e4b98d82b8"], "placement": {"type": "append", "parent_id": None}}
print(requests.post(url, headers={"X-API-Key": "your-api-key"}, json=payload).json())
```

</template><template #javascript>

```javascript
const url = "https://api.plane.so/api/v1/workspaces/my-workspace/collections/collection-uuid/pages/";
const response = await fetch(url, {
method: "POST",
headers: { "X-API-Key": "your-api-key", "Content-Type": "application/json" },
body: JSON.stringify({
page_ids: ["ea8ccdab-1cf4-448b-8205-51e4b98d82b8"],
placement: { type: "append", parent_id: null },
}),
});
console.log(await response.json());
```

</template></CodePanel>
<ResponsePanel status="200">

```json
[
{
"id": "55ebf2cc-61ba-478a-b88c-88db969e29dc",
"collection": "0a8a3e6a-3c32-49c7-bbb5-b7a8e32c2f10",
"page": "ea8ccdab-1cf4-448b-8205-51e4b98d82b8",
Comment thread
iam-vipin marked this conversation as resolved.
"workspace": "95d1f03f-16e5-4807-a8c5-ec0c7cf0e4ab",
"sort_order": 65535.0,
"created_at": "2026-08-18T10:00:00Z",
"updated_at": "2026-08-18T10:00:00Z",
"created_by": "d2f1b470-55e8-4e7a-8a61-7fc695bc1a4f",
"updated_by": "d2f1b470-55e8-4e7a-8a61-7fc695bc1a4f"
}
]
```

</ResponsePanel></div></div>
Loading
Loading