Skip to content
Hoody.com

Manage collaborators, emoji reactions, and notebook-wide user roles. The service exposes three resource groups: node-scoped collaborators (sections, pages, databases) with roles admin, editor, collaborator, or viewer; node-scoped reactions; and notebook-wide users with roles owner, admin, collaborator, guest, or none. The string editor is valid only on node-scoped collaborator endpoints and is not a valid notebook-wide user role.

GET /api/v1/notes/notebooks/{notebookId}/nodes/{nodeId}/collaborators

Section titled “GET /api/v1/notes/notebooks/{notebookId}/nodes/{nodeId}/collaborators”

Returns all collaborators on a node with their roles and user info.

NameInTypeRequiredDescription
notebookIdpathstringYesNotebook identifier
nodeIdpathstringYesNode identifier
{
"collaborators": [
{
"userId": "u_8d3f1a7c9b2e4f5a",
"role": "admin",
"name": "Ada Lovelace",
"username": "ada",
"avatar": "https://cdn.hoody.com/avatars/ada.png",
"createdAt": "2025-01-15T09:12:44.000Z",
"updatedAt": "2025-02-04T17:30:02.000Z"
},
{
"userId": "u_2c4b9e1a8d3f7b0c",
"role": "editor",
"name": "Grace Hopper",
"username": "grace",
"avatar": null,
"createdAt": "2025-01-18T14:05:11.000Z",
"updatedAt": null
}
]
}
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.list(notebookId, nodeId);

POST /api/v1/notes/notebooks/{notebookId}/nodes/{nodeId}/collaborators

Section titled “POST /api/v1/notes/notebooks/{notebookId}/nodes/{nodeId}/collaborators”

Adds a user as a collaborator on a node with a specified role. Requires admin permission.

NameInTypeRequiredDescription
notebookIdpathstringYesNotebook identifier
nodeIdpathstringYesNode identifier
FieldTypeRequiredDescription
collaboratorIdstringYesIdentifier of the user to add as a collaborator
rolestringYesNode-scoped collaborator role. One of admin, editor, collaborator, viewer
{
"collaboratorId": "u_2c4b9e1a8d3f7b0c",
"role": "collaborator"
}
{
"userId": "u_2c4b9e1a8d3f7b0c",
"role": "collaborator",
"createdAt": "2025-03-02T11:48:19.000Z",
"updatedAt": null
}
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.add(notebookId, nodeId, {
collaboratorId: 'u_2c4b9e1a8d3f7b0c',
role: 'collaborator'
});

PATCH /api/v1/notes/notebooks/{notebookId}/nodes/{nodeId}/collaborators/{collaboratorId}

Section titled “PATCH /api/v1/notes/notebooks/{notebookId}/nodes/{nodeId}/collaborators/{collaboratorId}”

Changes the role of an existing collaborator. Requires admin permission.

NameInTypeRequiredDescription
notebookIdpathstringYesNotebook identifier
nodeIdpathstringYesNode identifier
collaboratorIdpathstringYesCollaborator identifier to update
FieldTypeRequiredDescription
rolestringYesNew node-scoped collaborator role. One of admin, editor, collaborator, viewer
{
"role": "editor"
}
{
"userId": "u_2c4b9e1a8d3f7b0c",
"role": "editor",
"createdAt": "2025-01-18T14:05:11.000Z",
"updatedAt": "2025-03-04T10:22:01.000Z"
}
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.setRole(notebookId, nodeId, collaboratorId, {
role: 'editor'
});

DELETE /api/v1/notes/notebooks/{notebookId}/nodes/{nodeId}/collaborators/{collaboratorId}

Section titled “DELETE /api/v1/notes/notebooks/{notebookId}/nodes/{nodeId}/collaborators/{collaboratorId}”

Removes a collaborator from a node. Requires admin permission.

NameInTypeRequiredDescription
notebookIdpathstringYesNotebook identifier
nodeIdpathstringYesNode identifier
collaboratorIdpathstringYesCollaborator identifier to remove
{
"success": true
}
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);

GET /api/v1/notes/notebooks/{notebookId}/nodes/{nodeId}/reactions

Section titled “GET /api/v1/notes/notebooks/{notebookId}/nodes/{nodeId}/reactions”

Returns all reactions on a node with the collaborator who reacted.

NameInTypeRequiredDescription
notebookIdpathstringYesNotebook identifier
nodeIdpathstringYesNode identifier
{
"reactions": [
{
"reaction": "\uD83D\uDC4D",
"collaboratorId": "u_8d3f1a7c9b2e4f5a",
"createdAt": "2025-03-04T10:01:22.000Z",
"name": "Ada Lovelace",
"username": "ada"
},
{
"reaction": "\uD83D\uDD25",
"collaboratorId": "u_2c4b9e1a8d3f7b0c",
"createdAt": "2025-03-04T10:05:49.000Z",
"name": "Grace Hopper",
"username": "grace"
}
]
}
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.list(notebookId, nodeId);

POST /api/v1/notes/notebooks/{notebookId}/nodes/{nodeId}/reactions

Section titled “POST /api/v1/notes/notebooks/{notebookId}/nodes/{nodeId}/reactions”

Adds an emoji reaction to a node on behalf of the current user.

NameInTypeRequiredDescription
notebookIdpathstringYesNotebook identifier
nodeIdpathstringYesNode identifier
FieldTypeRequiredDescription
reactionstringYesEmoji reaction to add. Between 1 and 64 characters
{
"reaction": "\uD83D\uDC4D"
}
{
"reaction": "\uD83D\uDC4D",
"collaboratorId": "u_8d3f1a7c9b2e4f5a",
"createdAt": "2025-03-04T10:01:22.000Z"
}
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.add(notebookId, nodeId, {
reaction: '\uD83D\uDC4D'
});

DELETE /api/v1/notes/notebooks/{notebookId}/nodes/{nodeId}/reactions/{reaction}

Section titled “DELETE /api/v1/notes/notebooks/{notebookId}/nodes/{nodeId}/reactions/{reaction}”

Removes an emoji reaction from a node for the current user.

NameInTypeRequiredDescription
notebookIdpathstringYesNotebook identifier
nodeIdpathstringYesNode identifier
reactionpathstringYesEmoji reaction to remove. Pass the same string that was used to add it
{
"success": true
}
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\uDC4D');

POST /api/v1/notes/notebooks/{notebookId}/users

Section titled “POST /api/v1/notes/notebooks/{notebookId}/users”

Creates one or more users in the notebook by username. Returns created users and any errors.

NameInTypeRequiredDescription
notebookIdpathstringYesNotebook identifier
FieldTypeRequiredDescription
usersarrayYesUsers to invite. Maximum 50 entries. Each entry requires username and role
users[].usernamestringYesUsername to invite
users[].rolestringYesNotebook-wide role. One of owner, admin, collaborator, guest, none. Only an owner can invite a new user as owner; when an admin does, that entry is skipped and listed in errors (the other entries are still created). Inviting a username that is already a member never changes their role: the existing member is returned unchanged
{
"users": [
{ "username": "ada", "role": "admin" },
{ "username": "grace", "role": "collaborator" }
]
}
{
"users": [
{
"id": "u_8d3f1a7c9b2e4f5a",
"name": "Ada Lovelace",
"avatar": "https://cdn.hoody.com/avatars/ada.png",
"role": "admin",
"customName": null,
"customAvatar": null,
"createdAt": "2025-03-10T12:00:00.000Z",
"updatedAt": null,
"revision": "r_01HK9EXAMPLE0000000000000000",
"status": 1
},
{
"id": "u_2c4b9e1a8d3f7b0c",
"name": "Grace Hopper",
"avatar": null,
"role": "collaborator",
"customName": null,
"customAvatar": null,
"createdAt": "2025-03-10T12:00:00.000Z",
"updatedAt": null,
"revision": "r_01HK9EXAMPLE0000000000000001",
"status": 1
}
],
"errors": []
}
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.members.invite(notebookId, {
users: [
{ username: 'ada', role: 'admin' },
{ username: 'grace', role: 'collaborator' }
]
});

PATCH /api/v1/notes/notebooks/{notebookId}/users/{userId}/role

Section titled “PATCH /api/v1/notes/notebooks/{notebookId}/users/{userId}/role”

Changes the notebook role of a user. Requires owner or admin permission. The owner role belongs to owners: only an owner can make someone an owner or change the role of an owner, so an admin can change roles only between admin, collaborator, guest and none, and only for users who are not owners. A notebook always keeps at least one owner: the last owner cannot be demoted until someone else is made owner.

NameInTypeRequiredDescription
notebookIdpathstringYesNotebook identifier
userIdpathstringYesUser identifier in the notebook
FieldTypeRequiredDescription
rolestringYesNew notebook-wide role. One of owner, admin, collaborator, guest, none
{
"role": "admin"
}
{
"id": "u_2c4b9e1a8d3f7b0c",
"name": "Grace Hopper",
"avatar": null,
"role": "admin",
"customName": null,
"customAvatar": null,
"createdAt": "2025-03-10T12:00:00.000Z",
"updatedAt": "2025-03-11T09:42:11.000Z",
"revision": "r_01HK9EXAMPLE0000000000000002",
"status": 1
}
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.members.setRole(notebookId, userId, {
role: 'admin'
});