Collections
Organize bookmarks into nested collections
Collections are folders for organizing bookmarks. They support nesting via parent-child relationships.
List Collections
GET /collectionsScope: collections:read
Returns a flat list of all collections. Use the parentId field to build a tree client-side.
{
"data": [
{
"id": "col_abc",
"name": "Development",
"icon": "code",
"color": "blue",
"parentId": null,
"depth": 0,
"order": 0,
"bookmarkCount": 24,
"notes": "",
"branding": null,
"shareSlug": null,
"isShared": false,
"createdAt": "2026-01-10T08:00:00Z"
},
{
"id": "col_def",
"name": "Frontend",
"icon": "layout",
"color": "green",
"parentId": "col_abc",
"depth": 1,
"order": 0,
"bookmarkCount": 15,
"notes": "Frontend resources",
"branding": null,
"shareSlug": "frontend-resources",
"isShared": true,
"createdAt": "2026-01-12T09:00:00Z"
}
]
}Get Collection
GET /collections/:idScope: collections:read
Create Collection
POST /collectionsScope: collections:write
Body:
{
"name": "My Collection",
"icon": "folder",
"color": "blue",
"parentId": "col_abc"
}| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Collection name |
icon | string | No | Lucide icon name or emoji |
color | string | No | Color identifier |
parentId | string | No | Parent collection ID for nesting |
Update Collection
PATCH /collections/:idScope: collections:write
Body:
{
"name": "Renamed Collection",
"icon": "star",
"color": "yellow",
"notes": "Collection notes"
}Delete Collection (Soft)
DELETE /collections/:idScope: collections:write
Moves the collection to trash. Child collections and bookmarks are cascaded.
One request can move at most 1,000 rows: the collection, its child collections, and every bookmark in them. Bookmarks already in the trash still count until they are permanently deleted. A larger collection is rejected with 422 COLLECTION_TOO_LARGE and nothing is changed. Trash its child collections first, or move its bookmarks to another collection (see bulk operations), or trash them and delete them permanently (DELETE /bookmarks/:id/permanent), then retry.
Restore Collection
POST /collections/:id/restoreScope: collections:write
The same 1,000-row limit applies. A larger restore is rejected with 422 COLLECTION_TOO_LARGE and nothing is changed. Restore some of its bookmarks first with POST /bookmarks/:id/restore: while the collection is in the trash they come back unsorted and stop counting toward it. Then retry, and move them back with POST /bookmarks/bulk/move. Do not empty the trash (DELETE /bookmarks/trash): that permanently deletes the bookmarks you want back.
List Trashed Collections
GET /collections/trashedScope: collections:read
List Bookmarks in Collection
GET /collections/:id/bookmarksScope: bookmarks:read
Returns bookmarks assigned to this collection with cursor-based pagination.
Query Parameters:
| Parameter | Type | Description |
|---|---|---|
limit | number | Max results to return (default: 50, max: 100) |
cursor | string | Pagination cursor from previous response |
Response:
{
"data": {
"bookmarks": [ ... ],
"continueCursor": "eyJ..."
},
"meta": {
"requestId": "req_abc123"
}
}continueCursor is null when there are no more results.
Get Share Status
GET /collections/:id/shareScope: collections:read
{
"data": {
"shared": true,
"publicUrl": "/shared/my-collection-slug"
}
}