The Notes Collaboration APIs control who can access a notebook, what role they hold, and how users interact with content. Use these endpoints to invite users to a notebook and assign notebook-wide roles, attach per-node collaborators with finer-grained roles on sections, pages, and databases, and add or remove emoji reactions on individual nodes.
Note
There are two distinct role enums in this service. The notebook-wide role field (used by POST /api/v1/notes/notebooks/{notebookId}/users and PATCH /api/v1/notes/notebooks/{notebookId}/users/{userId}/role) accepts exactly owner, admin, collaborator, guest, or none. The value editor is only valid as a node-scoped collaborator role and returns HTTP 400 if supplied as a notebook role.
Manage per-node collaborator membership and roles. Each collaborator has a role scoped to a single node (section, page, or database). The valid node-scoped roles are admin, editor, collaborator, and viewer. Only node admins may add, update, or remove collaborators.
Returns all collaborators on a node with their roles and user info.
Name In Type Required Description notebookIdpath string Yes The notebook identifier nodeIdpath string Yes The node identifier
curl -X GET " https://{projectId}-{containerId}-notes-1.{server}.containers.hoody.com/api/v1/notes/notebooks/{notebookId}/nodes/{nodeId}/collaborators " \
-H " Authorization: Bearer <token> "
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://{projectId}-{containerId}-notes-1.{server}.containers.hoody.com ' , token : process . env . HOODY_TOKEN });
const collaborators = await client . notes . collaborators . list ( ' notebookId ' , ' nodeId ' );
" userId " : " a1b2c3d4e5f678901234abcd " ,
" avatar " : " https://avatars.example.com/ada.png " ,
" createdAt " : " 2026-01-15T10:30:00.000Z " ,
" updatedAt " : " 2026-02-01T08:12:00.000Z "
" userId " : " b2c3d4e5f678901234abcd0 " ,
" createdAt " : " 2026-01-16T14:05:00.000Z " ,
" message " : " You do not have access to this node. "
Error Code Title Description Resolution forbiddenAccess denied User does not have permission to access this node Check collaborator list or request access from the node admin
" message " : " Node not found. "
Error Code Title Description Resolution not_foundNode 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 notebookIdpath string Yes The notebook identifier nodeIdpath string Yes The node identifier
Field Type Required Description collaboratorIdstring Yes The user ID of the collaborator to add rolestring Yes Node-scoped role. One of: admin, editor, collaborator, viewer
curl -X POST " https://{projectId}-{containerId}-notes-1.{server}.containers.hoody.com/api/v1/notes/notebooks/{notebookId}/nodes/{nodeId}/collaborators " \
-H " Authorization: Bearer <token> " \
-H " Content-Type: application/json " \
"collaboratorId": "a1b2c3d4e5f678901234abcd",
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://{projectId}-{containerId}-notes-1.{server}.containers.hoody.com ' , token : process . env . HOODY_TOKEN });
const result = await client . notes . collaborators . add ( ' notebookId ' , ' nodeId ' , {
collaboratorId : ' a1b2c3d4e5f678901234abcd ' ,
" userId " : " a1b2c3d4e5f678901234abcd " ,
" createdAt " : " 2026-01-15T10:30:00.000Z " ,
" updatedAt " : " 2026-01-15T10:30:00.000Z "
" message " : " Node type does not support collaborators. "
Error Code Title Description Resolution bad_requestUnsupported 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. "
Error Code Title Description Resolution forbiddenNot an admin Only admins can manage collaborators on this node Request admin access from the node owner
" code " : " user_not_found " ,
" message " : " Collaborator user was not found. "
Error Code Title Description Resolution user_not_foundUser 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. "
Error Code Title Description Resolution bad_requestIdempotency 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 unknownInternal 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 notebookIdpath string Yes The notebook identifier nodeIdpath string Yes The node identifier collaboratorIdpath string Yes The collaborator user identifier
Field Type Required Description rolestring Yes The new node-scoped role. One of: admin, editor, collaborator, viewer
curl -X PATCH " https://{projectId}-{containerId}-notes-1.{server}.containers.hoody.com/api/v1/notes/notebooks/{notebookId}/nodes/{nodeId}/collaborators/{collaboratorId} " \
-H " Authorization: Bearer <token> " \
-H " Content-Type: application/json " \
-d ' { "role": "editor" } '
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://{projectId}-{containerId}-notes-1.{server}.containers.hoody.com ' , token : process . env . HOODY_TOKEN });
const updated = await client . notes . collaborators . update ( ' notebookId ' , ' nodeId ' , ' collaboratorId ' , {
" userId " : " a1b2c3d4e5f678901234abcd " ,
" createdAt " : " 2026-01-15T10:30:00.000Z " ,
" updatedAt " : " 2026-02-02T09:00:00.000Z "
" message " : " Node type does not support collaborators. "
Error Code Title Description Resolution bad_requestUnsupported 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. "
Error Code Title Description Resolution forbiddenNot an admin Only admins can change collaborator roles Request admin access from the node owner
" message " : " Collaborator not found. "
Error Code Title Description Resolution not_foundCollaborator 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 unknownInternal 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 notebookIdpath string Yes The notebook identifier nodeIdpath string Yes The node identifier collaboratorIdpath string Yes The collaborator user identifier
curl -X DELETE " https://{projectId}-{containerId}-notes-1.{server}.containers.hoody.com/api/v1/notes/notebooks/{notebookId}/nodes/{nodeId}/collaborators/{collaboratorId} " \
-H " Authorization: Bearer <token> "
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://{projectId}-{containerId}-notes-1.{server}.containers.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . notes . collaborators . remove ( ' notebookId ' , ' nodeId ' , ' collaboratorId ' );
" message " : " Node type does not support collaborators. "
Error Code Title Description Resolution bad_requestUnsupported 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. "
Error Code Title Description Resolution forbiddenNot an admin Only admins can remove collaborators Request admin access from the node owner
" message " : " Collaborator not found. "
Error Code Title Description Resolution not_foundCollaborator 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 unknownInternal server error An unexpected error occurred while processing the request Retry the request; if it persists, contact support
Add or remove emoji reactions on individual notebook nodes. Reactions are scoped to a single node and attributed to the collaborator who reacted.
Returns all reactions on a node with the collaborator who reacted.
Name In Type Required Description notebookIdpath string Yes The notebook identifier nodeIdpath string Yes The node identifier
curl -X GET " https://{projectId}-{containerId}-notes-1.{server}.containers.hoody.com/api/v1/notes/notebooks/{notebookId}/nodes/{nodeId}/reactions " \
-H " Authorization: Bearer <token> "
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://{projectId}-{containerId}-notes-1.{server}.containers.hoody.com ' , token : process . env . HOODY_TOKEN });
const reactions = await client . notes . reactions . list ( ' notebookId ' , ' nodeId ' );
" reaction " : " \uD83D\uDE00 " ,
" collaboratorId " : " a1b2c3d4e5f678901234abcd " ,
" createdAt " : " 2026-01-15T10:30:00.000Z " ,
" reaction " : " \uD83C\uDF89 " ,
" collaboratorId " : " b2c3d4e5f678901234abcd0 " ,
" createdAt " : " 2026-01-16T11:42:00.000Z " ,
" message " : " You do not have access to this node. "
Error Code Title Description Resolution forbiddenAccess denied User does not have permission to access this node Check collaborator list or request access from the node admin
" message " : " Node not found. "
Error Code Title Description Resolution not_foundNode 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 notebookIdpath string Yes The notebook identifier nodeIdpath string Yes The node identifier
Field Type Required Description reactionstring Yes The reaction string, between 1 and 64 characters
curl -X POST " https://{projectId}-{containerId}-notes-1.{server}.containers.hoody.com/api/v1/notes/notebooks/{notebookId}/nodes/{nodeId}/reactions " \
-H " Authorization: Bearer <token> " \
-H " Content-Type: application/json " \
-d ' { "reaction": "\uD83D\uDE00" } '
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://{projectId}-{containerId}-notes-1.{server}.containers.hoody.com ' , token : process . env . HOODY_TOKEN });
const result = await client . notes . reactions . add ( ' notebookId ' , ' nodeId ' , {
" reaction " : " \uD83D\uDE00 " ,
" collaboratorId " : " a1b2c3d4e5f678901234abcd " ,
" createdAt " : " 2026-01-15T10:30:00.000Z "
" message " : " <error-message> " ,
" message " : " You do not have access to this node. "
Error Code Title Description Resolution forbiddenAccess denied User does not have permission to access this node Check collaborator list or request access from the node admin
" message " : " Node not found. "
Error Code Title Description Resolution not_foundNode not found No node exists with the provided ID in this notebook Verify node ID using listNodes or listNodeChildren
" message " : " Idempotency key conflict. "
Error Code Title Description Resolution bad_requestIdempotency 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 unknownInternal 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 notebookIdpath string Yes The notebook identifier nodeIdpath string Yes The node identifier reactionpath string Yes The reaction string to remove (URL-encoded)
curl -X DELETE " https://{projectId}-{containerId}-notes-1.{server}.containers.hoody.com/api/v1/notes/notebooks/{notebookId}/nodes/{nodeId}/reactions/%F0%9F%98%80 " \
-H " Authorization: Bearer <token> "
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://{projectId}-{containerId}-notes-1.{server}.containers.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . notes . reactions . remove ( ' notebookId ' , ' nodeId ' , ' \uD83D\uDE00 ' );
" message " : " You do not have access to this node. "
Error Code Title Description Resolution forbiddenAccess denied User does not have permission to access this node Check collaborator list or request access from the node admin
" message " : " Node not found. "
Error Code Title Description Resolution not_foundNode 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 unknownInternal server error An unexpected error occurred while processing the request Retry the request; if it persists, contact support
Invite users to a notebook and manage their notebook-wide role. These endpoints operate on the notebook as a whole and are distinct from the per-node collaborator endpoints above.
Creates one or more users in the notebook by username. Returns the created users along with any per-user errors. Up to 50 users may be invited per request.
Name In Type Required Description notebookIdpath string Yes The notebook identifier
Field Type Required Description usersarray Yes List of users to invite, maximum 50 entries
Each entry in users has the following fields:
Field Type Required Description usernamestring Yes The username to invite rolestring Yes Notebook-wide role. One of: owner, admin, collaborator, guest, none
curl -X POST " https://{projectId}-{containerId}-notes-1.{server}.containers.hoody.com/api/v1/notes/notebooks/{notebookId}/users " \
-H " Authorization: Bearer <token> " \
-H " Content-Type: application/json " \
{ "username": "ada", "role": "collaborator" },
{ "username": "grace", "role": "admin" }
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://{projectId}-{containerId}-notes-1.{server}.containers.hoody.com ' , token : process . env . HOODY_TOKEN });
const result = await client . notes . users . invite ( ' notebookId ' , {
{ username : ' ada ' , role : ' collaborator ' },
{ username : ' grace ' , role : ' admin ' }
" id " : " a1b2c3d4e5f678901234abcd " ,
" createdAt " : " 2026-01-15T10:30:00.000Z " ,
" revision " : " 01HABCDEFGHIJKLMNOPQRST " ,
" id " : " b2c3d4e5f678901234abcd0 " ,
" createdAt " : " 2026-01-15T10:31:00.000Z " ,
" revision " : " 01HABCDEFGHIJKLMNOPQRST " ,
" code " : " user_input_required " ,
" message " : " At least one user is required. "
Error Code Title Description Resolution user_input_requiredUser input required At least one user must be provided in the request body Provide a non-empty users array with username and role
" code " : " user_invite_no_access " ,
" message " : " You do not have permission to add users. "
Error Code Title Description Resolution notebook_readonlyNotebook 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_accessNo permission to add users User role does not have permission to add users to this notebook Only owners and admins can add users
" message " : " <error-message> " ,
Changes the notebook-wide role of a user. Requires owner or admin permission.
Name In Type Required Description notebookIdpath string Yes The notebook identifier userIdpath string Yes The user identifier
Field Type Required Description rolestring Yes The new notebook-wide role. One of: owner, admin, collaborator, guest, none
curl -X PATCH " https://{projectId}-{containerId}-notes-1.{server}.containers.hoody.com/api/v1/notes/notebooks/{notebookId}/users/{userId}/role " \
-H " Authorization: Bearer <token> " \
-H " Content-Type: application/json " \
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://{projectId}-{containerId}-notes-1.{server}.containers.hoody.com ' , token : process . env . HOODY_TOKEN });
const updated = await client . notes . users . updateRole ( ' notebookId ' , ' userId ' , {
" id " : " a1b2c3d4e5f678901234abcd " ,
" createdAt " : " 2026-01-15T10:30:00.000Z " ,
" updatedAt " : " 2026-01-16T08:00:00.000Z " ,
" revision " : " 01HABCDEFGHIJKLMNOPQRST " ,
" message " : " <error-message> " ,
" code " : " user_update_no_access " ,
" message " : " You do not have permission to update user roles. "
Error Code Title Description Resolution notebook_readonlyNotebook 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_accessNo permission to update users User role does not have permission to change user roles Only owners and admins can change user roles
" code " : " user_not_found " ,
" message " : " User not found. "
Error Code Title Description Resolution user_not_foundUser not found No user exists with the provided ID in this notebook Verify user ID using the users list