Skip to content
Hoody.com

The Notes service models content as a tree of nodes inside a notebook: sections, pages, channels, databases, and records. The endpoints on this page let you list, create, read, update, and delete nodes; read, write, merge, and append document content on page-bearing nodes; export content as HTML or SVG; and record per-user open/seen interactions.

Base URL template used by all cURL examples below:

https://{projectId}-{containerId}-notes-1.{server}.containers.hoody.icu

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

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

Returns a paginated list of nodes the user has access to. Filterable by type, parentId, and rootId.

NameInTypeRequiredDescription
typequerystringNoRestrict results to a node type (for example page, section)
parentIdquerystringNoRestrict to direct children of the given node
rootIdquerystringNoRestrict to descendants of the given root node
limitqueryintegerNoMaximum number of results (default 50)
offsetqueryintegerNoNumber of results to skip (default 0)
notebookIdpathstringYesNotebook identifier
Terminal window
curl -X GET "https://proj_demo1-cont_main-notes-1.us-east-1.containers.hoody.icu/api/v1/notes/notebooks/nb_abc123/nodes?type=page&limit=25" \
-H "Authorization: Bearer <token>"
{
"nodes": [
{
"id": "node_root01",
"type": "section",
"parentId": null,
"attributes": {
"name": "Onboarding",
"alias": "onboarding"
}
},
{
"id": "node_8f3a2b",
"type": "page",
"parentId": "node_root01",
"attributes": {
"name": "Welcome",
"alias": "welcome"
}
}
],
"total": 24
}

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

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

Returns the full details of a single node by ID.

NameInTypeRequiredDescription
notebookIdpathstringYesNotebook identifier
nodeIdpathstringYesNode identifier
Terminal window
curl -X GET "https://proj_demo1-cont_main-notes-1.us-east-1.containers.hoody.icu/api/v1/notes/notebooks/nb_abc123/nodes/node_8f3a2b" \
-H "Authorization: Bearer <token>"
{
"id": "node_8f3a2b",
"type": "page",
"parentId": "node_root01",
"attributes": {
"name": "Welcome",
"alias": "welcome",
"description": "First page new collaborators see",
"icon": "wave"
},
"createdAt": "2026-01-10T08:00:00.000Z",
"createdBy": "user_abc123",
"updatedAt": "2026-01-15T11:24:00.000Z",
"updatedBy": "user_def456"
}

GET /api/v1/notes/notebooks/{notebookId}/nodes/alias/{alias}

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

Resolves a page node by its safe alias within the notebook scope.

NameInTypeRequiredDescription
notebookIdpathstringYesNotebook identifier
aliaspathstringYesSafe alias of the page node
Terminal window
curl -X GET "https://proj_demo1-cont_main-notes-1.us-east-1.containers.hoody.icu/api/v1/notes/notebooks/nb_abc123/nodes/alias/onboarding" \
-H "Authorization: Bearer <token>"
{
"id": "node_8f3a2b",
"type": "page",
"parentId": "node_root01",
"attributes": {
"name": "Welcome",
"alias": "welcome"
},
"createdAt": "2026-01-10T08:00:00.000Z",
"createdBy": "user_abc123",
"updatedAt": "2026-01-15T11:24:00.000Z",
"updatedBy": "user_def456"
}

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

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

Returns a paginated list of direct children of the specified node.

NameInTypeRequiredDescription
limitqueryintegerNoMaximum number of results (default 50)
offsetqueryintegerNoNumber of results to skip (default 0)
notebookIdpathstringYesNotebook identifier
nodeIdpathstringYesParent node identifier
Terminal window
curl -X GET "https://proj_demo1-cont_main-notes-1.us-east-1.containers.hoody.icu/api/v1/notes/notebooks/nb_abc123/nodes/node_root01/children?limit=10" \
-H "Authorization: Bearer <token>"
{
"nodes": [
{
"id": "node_p1",
"type": "page",
"parentId": "node_root01",
"attributes": { "name": "Step 1" }
},
{
"id": "node_p2",
"type": "page",
"parentId": "node_root01",
"attributes": { "name": "Step 2" }
}
],
"total": 6
}

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

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

Creates a new node (section, page, channel, message, database, or record) in the notebook.

NameInTypeRequiredDescription
notebookIdpathstringYesNotebook identifier
FieldTypeRequiredDescription
idstringNoOptional client-supplied node ID
typestringYesNode type (for example page, section, channel, database)
parentIdstringNoParent node ID; omit to create a top-level node
attributesobjectYesFree-form attributes object (name, alias, icon, description, etc.)
Terminal window
curl -X POST "https://proj_demo1-cont_main-notes-1.us-east-1.containers.hoody.icu/api/v1/notes/notebooks/nb_abc123/nodes" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"type": "page",
"parentId": "node_root01",
"attributes": {
"name": "Onboarding Checklist",
"alias": "onboarding",
"icon": "check"
}
}'
{
"id": "node_8f3a2b",
"type": "page",
"parentId": "node_root01",
"attributes": {
"name": "Onboarding Checklist",
"alias": "onboarding",
"icon": "check"
},
"createdAt": "2026-01-15T10:30:00.000Z",
"createdBy": "user_abc123"
}

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

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

Updates node attributes (name, description, etc.). type and parentId cannot be changed.

NameInTypeRequiredDescription
notebookIdpathstringYesNotebook identifier
nodeIdpathstringYesNode identifier
FieldTypeRequiredDescription
attributesobjectYesFree-form attributes object containing the fields to update
Terminal window
curl -X PATCH "https://proj_demo1-cont_main-notes-1.us-east-1.containers.hoody.icu/api/v1/notes/notebooks/nb_abc123/nodes/node_8f3a2b" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"attributes": {
"name": "Welcome (renamed)",
"description": "Updated onboarding landing page"
}
}'
{
"id": "node_8f3a2b",
"type": "page",
"parentId": "node_root01",
"attributes": {
"name": "Welcome (renamed)",
"alias": "welcome",
"description": "Updated onboarding landing page"
},
"updatedAt": "2026-01-16T14:22:11.000Z",
"updatedBy": "user_def456"
}

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

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

Permanently deletes a node and its associated data (documents, files, reactions).

NameInTypeRequiredDescription
notebookIdpathstringYesNotebook identifier
nodeIdpathstringYesNode identifier
Terminal window
curl -X DELETE "https://proj_demo1-cont_main-notes-1.us-east-1.containers.hoody.icu/api/v1/notes/notebooks/nb_abc123/nodes/node_8f3a2b" \
-H "Authorization: Bearer <token>"
{
"success": true
}

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

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

Retrieves document content for a node. Supports block filtering via blockIds and line range queries via lines.

NameInTypeRequiredDescription
blockIdsquerystringNoComma-separated list of block IDs to include
linesquerystringNoLine range expression (for example 1-10)
outputquerystringNoOutput format; one of json, md, html
includeCommentsquerystringNonone (default) or appendix
ticketquerystringNoExport ticket required for output=html
notebookIdpathstringYesNotebook identifier
nodeIdpathstringYesNode identifier
Terminal window
curl -X GET "https://proj_demo1-cont_main-notes-1.us-east-1.containers.hoody.icu/api/v1/notes/notebooks/nb_abc123/nodes/node_8f3a2b/document?output=md&includeComments=none" \
-H "Authorization: Bearer <token>"
{
"id": "doc_8f3a2b1c9d",
"content": {
"type": "doc",
"content": [
{
"type": "heading",
"attrs": { "level": 1 },
"content": [
{ "type": "text", "text": "Onboarding" }
]
},
{
"type": "paragraph",
"content": [
{ "type": "text", "text": "Welcome to the team." }
]
}
]
},
"createdAt": "2026-01-10T08:00:00.000Z",
"createdBy": "user_abc123",
"updatedAt": "2026-01-16T14:22:11.000Z",
"updatedBy": "user_def456"
}

PUT /api/v1/notes/notebooks/{notebookId}/nodes/{nodeId}/document

Section titled “PUT /api/v1/notes/notebooks/{notebookId}/nodes/{nodeId}/document”

Creates a new document or fully replaces an existing document for a node.

NameInTypeRequiredDescription
notebookIdpathstringYesNotebook identifier
nodeIdpathstringYesNode identifier
FieldTypeRequiredDescription
contentobjectYesFull ProseMirror-style document tree (replaces the existing content)
Terminal window
curl -X PUT "https://proj_demo1-cont_main-notes-1.us-east-1.containers.hoody.icu/api/v1/notes/notebooks/nb_abc123/nodes/node_8f3a2b/document" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"content": {
"type": "doc",
"content": [
{
"type": "heading",
"attrs": { "level": 1 },
"content": [{ "type": "text", "text": "Welcome" }]
},
{
"type": "paragraph",
"content": [{ "type": "text", "text": "Hello, team." }]
}
]
}
}'
{
"id": "doc_8f3a2b1c9d",
"content": {
"type": "doc",
"content": [
{
"type": "heading",
"attrs": { "level": 1 },
"content": [{ "type": "text", "text": "Welcome" }]
},
{
"type": "paragraph",
"content": [{ "type": "text", "text": "Hello, team." }]
}
]
},
"createdAt": "2026-01-10T08:00:00.000Z",
"createdBy": "user_abc123",
"updatedAt": "2026-01-16T14:22:11.000Z",
"updatedBy": "user_def456"
}

PATCH /api/v1/notes/notebooks/{notebookId}/nodes/{nodeId}/document

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

Merges content into an existing document at the top level. Existing blocks are preserved unless overwritten.

NameInTypeRequiredDescription
notebookIdpathstringYesNotebook identifier
nodeIdpathstringYesNode identifier
FieldTypeRequiredDescription
contentobjectYesPartial ProseMirror-style document tree to merge at the top level
Terminal window
curl -X PATCH "https://proj_demo1-cont_main-notes-1.us-east-1.containers.hoody.icu/api/v1/notes/notebooks/nb_abc123/nodes/node_8f3a2b/document" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"content": {
"type": "doc",
"content": [
{
"type": "paragraph",
"attrs": { "id": "block_a1b2c3" },
"content": [{ "type": "text", "text": "Updated paragraph." }]
}
]
}
}'
{
"id": "doc_8f3a2b1c9d",
"content": {
"type": "doc",
"content": [
{
"type": "paragraph",
"attrs": { "id": "block_a1b2c3" },
"content": [{ "type": "text", "text": "Updated paragraph." }]
}
]
},
"createdAt": "2026-01-10T08:00:00.000Z",
"createdBy": "user_abc123",
"updatedAt": "2026-01-16T14:22:11.000Z",
"updatedBy": "user_def456"
}

POST /api/v1/notes/notebooks/{notebookId}/nodes/{nodeId}/document/append

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

Appends one or more blocks to the END of a node’s rich-text document. The server assigns each block id, parentId, and index — any client-supplied id, parentId, or index (including attrs.id) is rejected. Provide either text (a single block from plain text; newlines are NOT split — the text is stored as one literal block) OR blocks (flat root blocks), never both. If the document does not exist yet it is created. Pass X-Idempotency-Key to make retries safe (a repeated key plus identical body replays the original response; a different body with the same key returns 409). Appendable block types: paragraph, heading1, heading2, heading3, codeBlock, horizontalRule.

NameInTypeRequiredDescription
notebookIdpathstringYesNotebook identifier
nodeIdpathstringYesNode identifier
X-Idempotency-KeyheaderstringNoOptional idempotency key (max 256 chars). Reusing the same key with an identical request body and node replays the original response; reusing it with a different body or node returns 409.

The body is one of two shapes (never both).

Shape A — plain text (single block):

FieldTypeRequiredDescription
textstringYesPlain text content (newlines are not split, the text becomes one literal block)
typestringNoBlock type; one of paragraph, heading1, heading2, heading3, codeBlock (default paragraph)
attrsobject | nullNoOptional block attributes

Shape B — explicit blocks (flat root blocks):

FieldTypeRequiredDescription
blocksarrayYesArray of 1 to 100 root blocks to append
blocks[].typestringNoOne of paragraph, heading1, heading2, heading3, codeBlock, horizontalRule (default paragraph)
blocks[].contentarrayNoInline content nodes; each node has type: "text", text, and optional marks
blocks[].attrsobject | nullNoOptional block attributes
Terminal window
curl -X POST "https://proj_demo1-cont_main-notes-1.us-east-1.containers.hoody.icu/api/v1/notes/notebooks/nb_abc123/nodes/node_8f3a2b/document/append" \
-H "Authorization: Bearer <token>" \
-H "X-Idempotency-Key: key_123" \
-H "Content-Type: application/json" \
-d '{
"text": "Second section begins here.",
"type": "heading1"
}'
{
"id": "doc_8f3a2b1c9d",
"content": {
"type": "doc",
"content": [
{
"type": "paragraph",
"attrs": { "id": "block_a1b2c3" },
"content": [{ "type": "text", "text": "Hello world." }]
},
{
"type": "horizontalRule",
"attrs": { "id": "block_d4e5f6" }
}
]
},
"createdAt": "2026-01-10T08:00:00.000Z",
"createdBy": "user_abc123",
"updatedAt": "2026-01-16T14:22:11.000Z",
"updatedBy": "user_def456",
"appendedBlockIds": ["block_a1b2c3", "block_d4e5f6"]
}

POST /api/v1/notes/notebooks/{notebookId}/nodes/{nodeId}/export-ticket

Section titled “POST /api/v1/notes/notebooks/{notebookId}/nodes/{nodeId}/export-ticket”

Creates a short-lived export ticket for static HTML document delivery. The ticket is required to fetch output=html from getDocument.

NameInTypeRequiredDescription
notebookIdpathstringYesNotebook identifier
nodeIdpathstringYesNode identifier
FieldTypeRequiredDefaultDescription
outputstringNo"html"Output format; only "html" is supported
includeCommentsstringNo"none"none or appendix
includeBackgroundbooleanNotrueInclude the page background in the export
themeModestringNo"dark"light or dark
themeIdstring | nullNoOptional theme identifier (max 64 chars)
themeVariablesobjectNoMap of theme variable name to string value
fileNamestringNoSuggested file name for the export (max 128 chars)
Terminal window
curl -X POST "https://proj_demo1-cont_main-notes-1.us-east-1.containers.hoody.icu/api/v1/notes/notebooks/nb_abc123/nodes/node_8f3a2b/export-ticket" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"output": "html",
"includeComments": "appendix",
"themeMode": "light",
"fileName": "Onboarding.html"
}'
{
"ticket": "tkt_4f1a2b3c8d9e",
"expiresAt": "2026-01-15T11:00:00.000Z",
"usesRemaining": 5
}

GET /api/v1/notes/notebooks/{notebookId}/nodes/{nodeId}/blocks/{blockId}/svg

Section titled “GET /api/v1/notes/notebooks/{notebookId}/nodes/{nodeId}/blocks/{blockId}/svg”

Renders a drawing block as an SVG image. Supports an optional background color and scale factor. The response is a raw image/svg+xml payload.

NameInTypeRequiredDescription
bgquerystringNoBackground color (for example "transparent", "#ffffff")
scalequerynumberNoRender scale factor
notebookIdpathstringYesNotebook identifier
nodeIdpathstringYesNode identifier
blockIdpathstringYesDrawing block identifier
Terminal window
curl -X GET "https://proj_demo1-cont_main-notes-1.us-east-1.containers.hoody.icu/api/v1/notes/notebooks/nb_abc123/nodes/node_8f3a2b/blocks/block_d12/svg?bg=transparent&scale=2" \
-H "Authorization: Bearer <token>"
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 300">
<rect width="100%" height="100%" fill="transparent" />
<path d="M10 80 Q 95 10 180 80 T 390 80" stroke="#222" fill="none" stroke-width="2" />
</svg>

POST /api/v1/notes/notebooks/{notebookId}/nodes/{nodeId}/interactions/opened

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

Records that the current user has opened the node. Tracks first and last opened timestamps.

NameInTypeRequiredDescription
notebookIdpathstringYesNotebook identifier
nodeIdpathstringYesNode identifier
FieldTypeRequiredDescription
openedAtstringNoOptional ISO 8601 timestamp; defaults to the current server time
Terminal window
curl -X POST "https://proj_demo1-cont_main-notes-1.us-east-1.containers.hoody.icu/api/v1/notes/notebooks/nb_abc123/nodes/node_8f3a2b/interactions/opened" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{}'
{
"nodeId": "node_8f3a2b",
"collaboratorId": "user_abc123",
"firstSeenAt": null,
"lastSeenAt": null,
"firstOpenedAt": "2026-01-15T10:30:00.000Z",
"lastOpenedAt": "2026-01-15T10:30:00.000Z"
}

POST /api/v1/notes/notebooks/{notebookId}/nodes/{nodeId}/interactions/seen

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

Records that the current user has seen the node. Tracks first and last seen timestamps.

NameInTypeRequiredDescription
notebookIdpathstringYesNotebook identifier
nodeIdpathstringYesNode identifier
FieldTypeRequiredDescription
seenAtstringNoOptional ISO 8601 timestamp; defaults to the current server time
Terminal window
curl -X POST "https://proj_demo1-cont_main-notes-1.us-east-1.containers.hoody.icu/api/v1/notes/notebooks/nb_abc123/nodes/node_8f3a2b/interactions/seen" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{}'
{
"nodeId": "node_8f3a2b",
"collaboratorId": "user_abc123",
"firstSeenAt": "2026-01-15T10:29:55.000Z",
"lastSeenAt": "2026-01-15T10:29:55.000Z",
"firstOpenedAt": null,
"lastOpenedAt": null
}