Notes
Notes are the core object. Each note belongs to one notebook, has Markdown content, and keeps a numbered version history.
The note object
| Field | Type | Description |
|---|---|---|
id | string | Unique identifier, prefixed with nt_. |
notebook_id required | string | Notebook that contains the note. |
title required | string | Plain-text title, up to 200 characters. |
body | string | Markdown content, up to 1 MB. |
tags | string[] | Tag names attached to the note. |
pinned | boolean | Pinned notes appear first in listings. |
archived | boolean | Archived notes are hidden from default listings. |
version | integer | Current version number; increments on every change. |
word_count | integer | Words in body, computed by the server. |
created_at | timestamp | Creation time, RFC 3339 in UTC. |
updated_at | timestamp | Last modification time, RFC 3339 in UTC. |
Example
{
"id": "nt_8f3k2Q9xLm",
"notebook_id": "nb_2Lq9TgWz4A",
"title": "Weekly planning",
"body": "## Goals\n- Ship the sync beta",
"tags": [
"planning",
"weekly"
],
"pinned": false,
"archived": false,
"version": 14,
"word_count": 212,
"created_at": "2026-09-14T08:21:07Z",
"updated_at": "2026-10-02T17:40:55Z"
}GET /notes
List notes. Returns a paginated list of notes.
Query parameters
| Field | Type | Description |
|---|---|---|
limit | integer | Page size, 1–100. Default 25. |
cursor | string | Cursor from the previous page. |
sort | string | Field to sort by, prefix - for descending. |
filter | string | Filter expression, see Filtering and sorting. |
Request
curl -X GET "https://api.axnode.net/v2/notes" \
-H "Authorization: Bearer $AXSYNC_TOKEN"const res = await fetch('https://api.axnode.net/v2/notes', {
method: 'GET',
headers: { Authorization: `Bearer ${token}` }
});
const data = await res.json();import requests
res = requests.get(
'https://api.axnode.net/v2/notes',
headers={'Authorization': f'Bearer {token}'},
)
data = res.json()Response 200
{
"data": [
{
"id": "nt_8f3k2Q9xLm",
"notebook_id": "nb_2Lq9TgWz4A",
"title": "Weekly planning",
"body": "## Goals\n- Ship the sync beta",
"tags": [
"planning",
"weekly"
],
"pinned": false,
"archived": false,
"version": 14,
"word_count": 212,
"created_at": "2026-09-14T08:21:07Z",
"updated_at": "2026-10-02T17:40:55Z"
}
],
"has_more": false,
"next_cursor": null
}POST /notes
Create a note. Creates a note.
Body parameters
| Field | Type | Description |
|---|---|---|
notebook_id required | string | Notebook that contains the note. |
title required | string | Plain-text title, up to 200 characters. |
body | string | Markdown content, up to 1 MB. |
tags | string[] | Tag names attached to the note. |
pinned | boolean | Pinned notes appear first in listings. |
archived | boolean | Archived notes are hidden from default listings. |
Request
curl -X POST "https://api.axnode.net/v2/notes" \
-H "Authorization: Bearer $AXSYNC_TOKEN" \
-H "Content-Type: application/json" \
-d '{"notebook_id": "nb_2Lq9TgWz4A", "title": "Weekly planning"}'const res = await fetch('https://api.axnode.net/v2/notes', {
method: 'POST',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({"notebook_id": "nb_2Lq9TgWz4A", "title": "Weekly planning"})
});
const data = await res.json();import requests
res = requests.post(
'https://api.axnode.net/v2/notes',
headers={'Authorization': f'Bearer {token}'}, json={"notebook_id": "nb_2Lq9TgWz4A", "title": "Weekly planning"},
)
data = res.json()Response 201
{
"id": "nt_8f3k2Q9xLm",
"notebook_id": "nb_2Lq9TgWz4A",
"title": "Weekly planning",
"body": "## Goals\n- Ship the sync beta",
"tags": [
"planning",
"weekly"
],
"pinned": false,
"archived": false,
"version": 14,
"word_count": 212,
"created_at": "2026-09-14T08:21:07Z",
"updated_at": "2026-10-02T17:40:55Z"
}GET /notes/{id}
Retrieve a note. Retrieves a note by its identifier.
Request
curl -X GET "https://api.axnode.net/v2/notes/nt_8f3k2Q9xLm" \
-H "Authorization: Bearer $AXSYNC_TOKEN"const res = await fetch('https://api.axnode.net/v2/notes/nt_8f3k2Q9xLm', {
method: 'GET',
headers: { Authorization: `Bearer ${token}` }
});
const data = await res.json();import requests
res = requests.get(
'https://api.axnode.net/v2/notes/nt_8f3k2Q9xLm',
headers={'Authorization': f'Bearer {token}'},
)
data = res.json()Response 200
{
"id": "nt_8f3k2Q9xLm",
"notebook_id": "nb_2Lq9TgWz4A",
"title": "Weekly planning",
"body": "## Goals\n- Ship the sync beta",
"tags": [
"planning",
"weekly"
],
"pinned": false,
"archived": false,
"version": 14,
"word_count": 212,
"created_at": "2026-09-14T08:21:07Z",
"updated_at": "2026-10-02T17:40:55Z"
}PATCH /notes/{id}
Update a note. Updates fields of a note. Only supplied fields change.
Body parameters
| Field | Type | Description |
|---|---|---|
notebook_id required | string | Notebook that contains the note. |
title required | string | Plain-text title, up to 200 characters. |
body | string | Markdown content, up to 1 MB. |
tags | string[] | Tag names attached to the note. |
pinned | boolean | Pinned notes appear first in listings. |
archived | boolean | Archived notes are hidden from default listings. |
Request
curl -X PATCH "https://api.axnode.net/v2/notes/nt_8f3k2Q9xLm" \
-H "Authorization: Bearer $AXSYNC_TOKEN" \
-H "Content-Type: application/json" \
-d '{"notebook_id": "nb_2Lq9TgWz4A", "title": "Weekly planning"}'const res = await fetch('https://api.axnode.net/v2/notes/nt_8f3k2Q9xLm', {
method: 'PATCH',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({"notebook_id": "nb_2Lq9TgWz4A", "title": "Weekly planning"})
});
const data = await res.json();import requests
res = requests.patch(
'https://api.axnode.net/v2/notes/nt_8f3k2Q9xLm',
headers={'Authorization': f'Bearer {token}'}, json={"notebook_id": "nb_2Lq9TgWz4A", "title": "Weekly planning"},
)
data = res.json()Response 200
{
"id": "nt_8f3k2Q9xLm",
"notebook_id": "nb_2Lq9TgWz4A",
"title": "Weekly planning",
"body": "## Goals\n- Ship the sync beta",
"tags": [
"planning",
"weekly"
],
"pinned": false,
"archived": false,
"version": 14,
"word_count": 212,
"created_at": "2026-09-14T08:21:07Z",
"updated_at": "2026-10-02T17:40:55Z"
}DELETE /notes/{id}
Delete a note. Permanently deletes a note. This cannot be undone.
Request
curl -X DELETE "https://api.axnode.net/v2/notes/nt_8f3k2Q9xLm" \
-H "Authorization: Bearer $AXSYNC_TOKEN"const res = await fetch('https://api.axnode.net/v2/notes/nt_8f3k2Q9xLm', {
method: 'DELETE',
headers: { Authorization: `Bearer ${token}` }
});
const data = await res.json();import requests
res = requests.delete(
'https://api.axnode.net/v2/notes/nt_8f3k2Q9xLm',
headers={'Authorization': f'Bearer {token}'},
)
data = res.json()Response 200
{
"deleted": true,
"id": "nt_8f3k2Q9xLm"
}POST /notes/{id}/duplicate
Duplicate a note. Creates a copy with `(copy)` appended to the title.
Body parameters
| Field | Type | Description |
|---|---|---|
notebook_id required | string | Notebook that contains the note. |
title required | string | Plain-text title, up to 200 characters. |
body | string | Markdown content, up to 1 MB. |
tags | string[] | Tag names attached to the note. |
pinned | boolean | Pinned notes appear first in listings. |
archived | boolean | Archived notes are hidden from default listings. |
Request
curl -X POST "https://api.axnode.net/v2/notes/nt_8f3k2Q9xLm/duplicate" \
-H "Authorization: Bearer $AXSYNC_TOKEN" \
-H "Content-Type: application/json" \
-d '{"notebook_id": "nb_2Lq9TgWz4A", "title": "Weekly planning"}'const res = await fetch('https://api.axnode.net/v2/notes/nt_8f3k2Q9xLm/duplicate', {
method: 'POST',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({"notebook_id": "nb_2Lq9TgWz4A", "title": "Weekly planning"})
});
const data = await res.json();import requests
res = requests.post(
'https://api.axnode.net/v2/notes/nt_8f3k2Q9xLm/duplicate',
headers={'Authorization': f'Bearer {token}'}, json={"notebook_id": "nb_2Lq9TgWz4A", "title": "Weekly planning"},
)
data = res.json()Response 200
{
"id": "nt_8f3k2Q9xLm",
"notebook_id": "nb_2Lq9TgWz4A",
"title": "Weekly planning",
"body": "## Goals\n- Ship the sync beta",
"tags": [
"planning",
"weekly"
],
"pinned": false,
"archived": false,
"version": 14,
"word_count": 212,
"created_at": "2026-09-14T08:21:07Z",
"updated_at": "2026-10-02T17:40:55Z"
}POST /notes/{id}/archive
Archive a note. Moves the note out of default listings without deleting it.
Body parameters
| Field | Type | Description |
|---|---|---|
notebook_id required | string | Notebook that contains the note. |
title required | string | Plain-text title, up to 200 characters. |
body | string | Markdown content, up to 1 MB. |
tags | string[] | Tag names attached to the note. |
pinned | boolean | Pinned notes appear first in listings. |
archived | boolean | Archived notes are hidden from default listings. |
Request
curl -X POST "https://api.axnode.net/v2/notes/nt_8f3k2Q9xLm/archive" \
-H "Authorization: Bearer $AXSYNC_TOKEN" \
-H "Content-Type: application/json" \
-d '{"notebook_id": "nb_2Lq9TgWz4A", "title": "Weekly planning"}'const res = await fetch('https://api.axnode.net/v2/notes/nt_8f3k2Q9xLm/archive', {
method: 'POST',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({"notebook_id": "nb_2Lq9TgWz4A", "title": "Weekly planning"})
});
const data = await res.json();import requests
res = requests.post(
'https://api.axnode.net/v2/notes/nt_8f3k2Q9xLm/archive',
headers={'Authorization': f'Bearer {token}'}, json={"notebook_id": "nb_2Lq9TgWz4A", "title": "Weekly planning"},
)
data = res.json()Response 200
{
"id": "nt_8f3k2Q9xLm",
"notebook_id": "nb_2Lq9TgWz4A",
"title": "Weekly planning",
"body": "## Goals\n- Ship the sync beta",
"tags": [
"planning",
"weekly"
],
"pinned": false,
"archived": false,
"version": 14,
"word_count": 212,
"created_at": "2026-09-14T08:21:07Z",
"updated_at": "2026-10-02T17:40:55Z"
}POST /notes/{id}/restore
Restore a note. Restores an archived or recently deleted note (within 30 days).
Body parameters
| Field | Type | Description |
|---|---|---|
notebook_id required | string | Notebook that contains the note. |
title required | string | Plain-text title, up to 200 characters. |
body | string | Markdown content, up to 1 MB. |
tags | string[] | Tag names attached to the note. |
pinned | boolean | Pinned notes appear first in listings. |
archived | boolean | Archived notes are hidden from default listings. |
Request
curl -X POST "https://api.axnode.net/v2/notes/nt_8f3k2Q9xLm/restore" \
-H "Authorization: Bearer $AXSYNC_TOKEN" \
-H "Content-Type: application/json" \
-d '{"notebook_id": "nb_2Lq9TgWz4A", "title": "Weekly planning"}'const res = await fetch('https://api.axnode.net/v2/notes/nt_8f3k2Q9xLm/restore', {
method: 'POST',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({"notebook_id": "nb_2Lq9TgWz4A", "title": "Weekly planning"})
});
const data = await res.json();import requests
res = requests.post(
'https://api.axnode.net/v2/notes/nt_8f3k2Q9xLm/restore',
headers={'Authorization': f'Bearer {token}'}, json={"notebook_id": "nb_2Lq9TgWz4A", "title": "Weekly planning"},
)
data = res.json()Response 200
{
"id": "nt_8f3k2Q9xLm",
"notebook_id": "nb_2Lq9TgWz4A",
"title": "Weekly planning",
"body": "## Goals\n- Ship the sync beta",
"tags": [
"planning",
"weekly"
],
"pinned": false,
"archived": false,
"version": 14,
"word_count": 212,
"created_at": "2026-09-14T08:21:07Z",
"updated_at": "2026-10-02T17:40:55Z"
}GET /notes/{id}/versions
List note versions. Returns the version history, newest first.
Request
curl -X GET "https://api.axnode.net/v2/notes/nt_8f3k2Q9xLm/versions" \
-H "Authorization: Bearer $AXSYNC_TOKEN"const res = await fetch('https://api.axnode.net/v2/notes/nt_8f3k2Q9xLm/versions', {
method: 'GET',
headers: { Authorization: `Bearer ${token}` }
});
const data = await res.json();import requests
res = requests.get(
'https://api.axnode.net/v2/notes/nt_8f3k2Q9xLm/versions',
headers={'Authorization': f'Bearer {token}'},
)
data = res.json()Response 200
{
"id": "nt_8f3k2Q9xLm",
"notebook_id": "nb_2Lq9TgWz4A",
"title": "Weekly planning",
"body": "## Goals\n- Ship the sync beta",
"tags": [
"planning",
"weekly"
],
"pinned": false,
"archived": false,
"version": 14,
"word_count": 212,
"created_at": "2026-09-14T08:21:07Z",
"updated_at": "2026-10-02T17:40:55Z"
}POST /notes/{id}/versions/{version}/restore
Restore a version. Makes an earlier version current by creating a new version with its content.
Body parameters
| Field | Type | Description |
|---|---|---|
notebook_id required | string | Notebook that contains the note. |
title required | string | Plain-text title, up to 200 characters. |
body | string | Markdown content, up to 1 MB. |
tags | string[] | Tag names attached to the note. |
pinned | boolean | Pinned notes appear first in listings. |
archived | boolean | Archived notes are hidden from default listings. |
Request
curl -X POST "https://api.axnode.net/v2/notes/nt_8f3k2Q9xLm/versions/version/restore" \
-H "Authorization: Bearer $AXSYNC_TOKEN" \
-H "Content-Type: application/json" \
-d '{"notebook_id": "nb_2Lq9TgWz4A", "title": "Weekly planning"}'const res = await fetch('https://api.axnode.net/v2/notes/nt_8f3k2Q9xLm/versions/version/restore', {
method: 'POST',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({"notebook_id": "nb_2Lq9TgWz4A", "title": "Weekly planning"})
});
const data = await res.json();import requests
res = requests.post(
'https://api.axnode.net/v2/notes/nt_8f3k2Q9xLm/versions/version/restore',
headers={'Authorization': f'Bearer {token}'}, json={"notebook_id": "nb_2Lq9TgWz4A", "title": "Weekly planning"},
)
data = res.json()Response 200
{
"id": "nt_8f3k2Q9xLm",
"notebook_id": "nb_2Lq9TgWz4A",
"title": "Weekly planning",
"body": "## Goals\n- Ship the sync beta",
"tags": [
"planning",
"weekly"
],
"pinned": false,
"archived": false,
"version": 14,
"word_count": 212,
"created_at": "2026-09-14T08:21:07Z",
"updated_at": "2026-10-02T17:40:55Z"
}