Manage collaborators, reactions, and user roles on notebooks. The collaboration surface is split across three resource families:
- Node collaborators — per-node permissions with roles
admin, editor, collaborator, or viewer.
- Node reactions — emoji reactions attached to nodes on behalf of the current user.
- Notebook users — membership in the notebook itself, with roles
owner, admin, collaborator, guest, or none.
Returns all collaborators on a node with their roles and user info.
| Name | In | Type | Required | Description |
|---|
notebookId | path | string | Yes | Identifier of the notebook |
nodeId | path | string | Yes | Identifier of the node |
https://{projectId}-{containerId}-notes-1.{server}.containers.hoody.icu/api/v1/notes/notebooks/nb_8f3a2c/nodes/node_4d1e9b/collaborators
await client.notes.collaborators.list("nb_8f3a2c", "node_4d1e9b")
"avatar": "https://cdn.hoody.icu/u/ada.png",
"createdAt": "2025-01-12T09:30:00.000Z",
"updatedAt": "2025-02-04T17:11:42.000Z"
"createdAt": "2025-01-15T12:00:00.000Z",
"message": "You do not have access to this node.",
"message": "Caller is not in the collaborator list for this node"
| Error Code | Title | Description | Resolution |
|---|
forbidden | Access denied | User does not have permission to access this node | Check collaborator list or request access from the node admin |
"message": "Node not found.",
"message": "No node with ID node_4d1e9b in notebook nb_8f3a2c"
| Error Code | Title | Description | Resolution |
|---|
not_found | Node not found | No node exists with the provided ID in this notebook | Verify node ID using listNodes or listNodeChildren |
Adds a user as a collaborator on a node with a specified role. Requires admin permission.
| Name | In | Type | Required | Description |
|---|
notebookId | path | string | Yes | Identifier of the notebook |
nodeId | path | string | Yes | Identifier of the node |
| Name | Type | Required | Description |
|---|
collaboratorId | string | Yes | ID of the notebook user to add as a collaborator |
role | string | Yes | One of admin, editor, collaborator, viewer |
https://{projectId}-{containerId}-notes-1.{server}.containers.hoody.icu/api/v1/notes/notebooks/nb_8f3a2c/nodes/node_4d1e9b/collaborators \
-H "Content-Type: application/json" \
"collaboratorId": "user_d4e5f6",
await client.notes.collaborators.add("nb_8f3a2c", "node_4d1e9b", {
collaboratorId: "user_d4e5f6",
"createdAt": "2025-03-08T14:22:11.000Z",
"message": "Node type does not support collaborators.",
"message": "Node type 'text' cannot have collaborators"
| Error Code | Title | Description | Resolution |
|---|
bad_request | Unsupported node type | This node type does not support collaborators | Collaborators can only be added to sections, pages, and databases |
"message": "You do not have permission to manage collaborators.",
"message": "Caller role 'viewer' cannot add collaborators"
| Error Code | Title | Description | Resolution |
|---|
forbidden | Not an admin | Only admins can manage collaborators on this node | Request admin access from the node owner |
"message": "Collaborator user was not found.",
"code": "user_not_found",
"path": "collaboratorId",
"message": "No notebook user with ID user_d4e5f6"
| Error Code | Title | Description | Resolution |
|---|
user_not_found | User not found | The collaborator user does not exist in this notebook | Verify user ID or create the user with createUsers first |
"message": "Idempotency key conflict.",
"path": "idempotencyKey",
"message": "Key already used for a different request"
| Error Code | Title | Description | Resolution |
|---|
bad_request | Idempotency conflict | A different request was already made with the same idempotency key | Use a new idempotency key for a different request |
"message": "An unexpected error occurred.",
| Error Code | Title | Description | Resolution |
|---|
unknown | Internal server error | An unexpected error occurred while processing the request | Retry the request; if it persists, contact support |
Changes the role of an existing collaborator. Requires admin permission.
| Name | In | Type | Required | Description |
|---|
notebookId | path | string | Yes | Identifier of the notebook |
nodeId | path | string | Yes | Identifier of the node |
collaboratorId | path | string | Yes | Identifier of the collaborator to update |
| Name | Type | Required | Description |
|---|
role | string | Yes | One of admin, editor, collaborator, viewer |
https://{projectId}-{containerId}-notes-1.{server}.containers.hoody.icu/api/v1/notes/notebooks/nb_8f3a2c/nodes/node_4d1e9b/collaborators/user_d4e5f6 \
-H "Content-Type: application/json" \
await client.notes.collaborators.update("nb_8f3a2c", "node_4d1e9b", "user_d4e5f6", {
"createdAt": "2025-03-08T14:22:11.000Z",
"updatedAt": "2025-03-09T08:01:55.000Z"
"message": "Node type does not support collaborators.",
"message": "Node type 'text' cannot have collaborators"
| Error Code | Title | Description | Resolution |
|---|
bad_request | Unsupported node type | This node type does not support collaborators | Collaborators can only be managed on sections, pages, and databases |
"message": "You do not have permission to manage collaborators.",
"message": "Caller role 'viewer' cannot change roles"
| Error Code | Title | Description | Resolution |
|---|
forbidden | Not an admin | Only admins can change collaborator roles | Request admin access from the node owner |
"message": "Collaborator not found.",
"path": "collaboratorId",
"message": "No collaborator with ID user_d4e5f6 on this node"
| Error Code | Title | Description | Resolution |
|---|
not_found | Collaborator not found | No collaborator with the given ID exists on this node | Verify collaborator ID using listCollaborators |
"message": "An unexpected error occurred.",
| Error Code | Title | Description | Resolution |
|---|
unknown | Internal server error | An unexpected error occurred while processing the request | Retry the request; if it persists, contact support |
Removes a collaborator from a node. Requires admin permission.
| Name | In | Type | Required | Description |
|---|
notebookId | path | string | Yes | Identifier of the notebook |
nodeId | path | string | Yes | Identifier of the node |
collaboratorId | path | string | Yes | Identifier of the collaborator to remove |
https://{projectId}-{containerId}-notes-1.{server}.containers.hoody.icu/api/v1/notes/notebooks/nb_8f3a2c/nodes/node_4d1e9b/collaborators/user_d4e5f6
await client.notes.collaborators.remove("nb_8f3a2c", "node_4d1e9b", "user_d4e5f6")
"message": "Node type does not support collaborators.",
"message": "Node type 'text' cannot have collaborators"
| Error Code | Title | Description | Resolution |
|---|
bad_request | Unsupported node type | This node type does not support collaborators | Collaborators can only be managed on sections, pages, and databases |
"message": "You do not have permission to manage collaborators.",
"message": "Caller role 'viewer' cannot remove collaborators"
| Error Code | Title | Description | Resolution |
|---|
forbidden | Not an admin | Only admins can remove collaborators | Request admin access from the node owner |
"message": "Collaborator not found.",
"path": "collaboratorId",
"message": "No collaborator with ID user_d4e5f6 on this node"
| Error Code | Title | Description | Resolution |
|---|
not_found | Collaborator not found | No collaborator with the given ID exists on this node | Verify collaborator ID using listCollaborators |
"message": "An unexpected error occurred.",
| Error Code | Title | Description | Resolution |
|---|
unknown | Internal server error | An unexpected error occurred while processing the request | Retry the request; if it persists, contact support |
Returns all reactions on a node with the collaborator who reacted.
| Name | In | Type | Required | Description |
|---|
notebookId | path | string | Yes | Identifier of the notebook |
nodeId | path | string | Yes | Identifier of the node |
https://{projectId}-{containerId}-notes-1.{server}.containers.hoody.icu/api/v1/notes/notebooks/nb_8f3a2c/nodes/node_4d1e9b/reactions
await client.notes.reactions.list("nb_8f3a2c", "node_4d1e9b")
"reaction": "\ud83d\udc4d",
"collaboratorId": "user_a1b2c3",
"createdAt": "2025-03-08T14:22:11.000Z",
"reaction": "\ud83c\udf89",
"collaboratorId": "user_d4e5f6",
"createdAt": "2025-03-09T10:05:00.000Z",
"message": "You do not have access to this node.",
"message": "Caller is not in the collaborator list for this node"
| Error Code | Title | Description | Resolution |
|---|
forbidden | Access denied | User does not have permission to access this node | Check collaborator list or request access from the node admin |
"message": "Node not found.",
"message": "No node with ID node_4d1e9b in notebook nb_8f3a2c"
| Error Code | Title | Description | Resolution |
|---|
not_found | Node not found | No node exists with the provided ID in this notebook | Verify node ID using listNodes or listNodeChildren |
Adds an emoji reaction to a node on behalf of the current user.
| Name | In | Type | Required | Description |
|---|
notebookId | path | string | Yes | Identifier of the notebook |
nodeId | path | string | Yes | Identifier of the node |
| Name | Type | Required | Description |
|---|
reaction | string | Yes | The reaction string (1 to 64 characters) |
https://{projectId}-{containerId}-notes-1.{server}.containers.hoody.icu/api/v1/notes/notebooks/nb_8f3a2c/nodes/node_4d1e9b/reactions \
-H "Content-Type: application/json" \
"reaction": "\ud83d\udc4d"
await client.notes.reactions.add("nb_8f3a2c", "node_4d1e9b", {
"reaction": "\ud83d\udc4d",
"collaboratorId": "user_a1b2c3",
"createdAt": "2025-03-08T14:22:11.000Z"
"message": "Invalid reaction payload.",
"message": "Field must be between 1 and 64 characters"
"message": "You do not have access to this node.",
"message": "Caller is not in the collaborator list for this node"
| Error Code | Title | Description | Resolution |
|---|
forbidden | Access denied | User does not have permission to access this node | Check collaborator list or request access from the node admin |
"message": "Node not found.",
"message": "No node with ID node_4d1e9b in notebook nb_8f3a2c"
| Error Code | Title | Description | Resolution |
|---|
not_found | Node not found | No node exists with the provided ID in this notebook | Verify node ID using listNodes or listNodeChildren |
"message": "Idempotency key conflict.",
"path": "idempotencyKey",
"message": "Key already used for a different request"
| Error Code | Title | Description | Resolution |
|---|
bad_request | Idempotency conflict | A different request was already made with the same idempotency key | Use a new idempotency key for a different request |
"message": "An unexpected error occurred.",
| Error Code | Title | Description | Resolution |
|---|
unknown | Internal server error | An unexpected error occurred while processing the request | Retry the request; if it persists, contact support |
Removes an emoji reaction from a node for the current user.
| Name | In | Type | Required | Description |
|---|
notebookId | path | string | Yes | Identifier of the notebook |
nodeId | path | string | Yes | Identifier of the node |
reaction | path | string | Yes | The reaction string to remove |
https://{projectId}-{containerId}-notes-1.{server}.containers.hoody.icu/api/v1/notes/notebooks/nb_8f3a2c/nodes/node_4d1e9b/reactions/%F0%9F%91%8D
await client.notes.reactions.remove("nb_8f3a2c", "node_4d1e9b", "\ud83d\udc4d")
"message": "You do not have access to this node.",
"message": "Caller is not in the collaborator list for this node"
| Error Code | Title | Description | Resolution |
|---|
forbidden | Access denied | User does not have permission to access this node | Check collaborator list or request access from the node admin |
"message": "Node not found.",
"message": "No node with ID node_4d1e9b in notebook nb_8f3a2c"
| Error Code | Title | Description | Resolution |
|---|
not_found | Node not found | No node exists with the provided ID in this notebook | Verify node ID using listNodes or listNodeChildren |
"message": "An unexpected error occurred.",
| Error Code | Title | Description | Resolution |
|---|
unknown | Internal server error | An unexpected error occurred while processing the request | Retry the request; if it persists, contact support |
Creates one or more users in the notebook by username. Returns created users and any per-entry errors.
| Name | In | Type | Required | Description |
|---|
notebookId | path | string | Yes | Identifier of the notebook |
| Name | Type | Required | Description |
|---|
users | array | Yes | Up to 50 user entries to invite |
Each entry in users has the following shape:
| Name | Type | Required | Description |
|---|
username | string | Yes | Username to add to the notebook |
role | string | Yes | One of owner, admin, collaborator, guest, none |
https://{projectId}-{containerId}-notes-1.{server}.containers.hoody.icu/api/v1/notes/notebooks/nb_8f3a2c/users \
-H "Content-Type: application/json" \
await client.notes.users.invite("nb_8f3a2c", {
{ username: "grace", role: "admin" },
{ username: "linus", role: "collaborator" }
"avatar": "https://cdn.hoody.icu/u/grace.png",
"createdAt": "2025-03-08T14:22:11.000Z",
"revision": "rev_01HXY2A4C8",
"name": "Linus Torvalds",
"createdAt": "2025-03-08T14:22:11.000Z",
"revision": "rev_01HXY2A4C9",
"message": "At least one user is required.",
"code": "user_input_required",
"message": "Field must contain at least one entry"
| Error Code | Title | Description | Resolution |
|---|
user_input_required | User input required | At least one user must be provided in the request body | Provide a non-empty users array with username and role |
"message": "You do not have permission to add users.",
"code": "user_invite_no_access",
"message": "Caller role 'guest' cannot invite"
| Error Code | Title | Description | Resolution |
|---|
notebook_readonly | Notebook is read-only | The notebook is in read-only mode and cannot be modified | Contact the notebook owner to restore write access |
user_invite_no_access | No permission to add users | User role does not have permission to add users to this notebook | Only owners and admins can add users |
"message": "Notebook not found.",
"message": "No notebook with ID nb_8f3a2c"
Changes the notebook role of a user. Requires owner or admin permission.
| Name | In | Type | Required | Description |
|---|
notebookId | path | string | Yes | Identifier of the notebook |
userId | path | string | Yes | Identifier of the user whose role is being changed |
| Name | Type | Required | Description |
|---|
role | string | Yes | One of owner, admin, collaborator, guest, none |
https://{projectId}-{containerId}-notes-1.{server}.containers.hoody.icu/api/v1/notes/notebooks/nb_8f3a2c/users/user_g7h8i9/role \
-H "Content-Type: application/json" \
await client.notes.users.updateRole("nb_8f3a2c", "user_g7h8i9", {
"name": "Linus Torvalds",
"createdAt": "2025-03-08T14:22:11.000Z",
"updatedAt": "2025-03-09T08:01:55.000Z",
"revision": "rev_01HXY2B7D1",
"message": "Invalid role value.",
"message": "Value must be one of owner, admin, collaborator, guest, none"
"message": "You do not have permission to update user roles.",
"code": "user_update_no_access",
"message": "Caller role 'collaborator' cannot change roles"
| Error Code | Title | Description | Resolution |
|---|
notebook_readonly | Notebook is read-only | The notebook is in read-only mode and cannot be modified | Contact the notebook owner to restore write access |
user_update_no_access | No permission to update users | User role does not have permission to change user roles | Only owners and admins can change user roles |
"message": "User not found.",
"code": "user_not_found",
"message": "No user with ID user_g7h8i9 in this notebook"
| Error Code | Title | Description | Resolution |
|---|
user_not_found | User not found | No user exists with the provided ID in this notebook | Verify user ID using the users list |