Axsync API v2

Notes

Notes are the core object. Each note belongs to one notebook, has Markdown content, and keeps a numbered version history.

The note object

FieldTypeDescription
idstringUnique identifier, prefixed with nt_.
notebook_id requiredstringNotebook that contains the note.
title requiredstringPlain-text title, up to 200 characters.
bodystringMarkdown content, up to 1 MB.
tagsstring[]Tag names attached to the note.
pinnedbooleanPinned notes appear first in listings.
archivedbooleanArchived notes are hidden from default listings.
versionintegerCurrent version number; increments on every change.
word_countintegerWords in body, computed by the server.
created_attimestampCreation time, RFC 3339 in UTC.
updated_attimestampLast 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.

Required scope: notes:read

Query parameters

FieldTypeDescription
limitintegerPage size, 1–100. Default 25.
cursorstringCursor from the previous page.
sortstringField to sort by, prefix - for descending.
filterstringFilter 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.

Required scope: notes:write

Body parameters

FieldTypeDescription
notebook_id requiredstringNotebook that contains the note.
title requiredstringPlain-text title, up to 200 characters.
bodystringMarkdown content, up to 1 MB.
tagsstring[]Tag names attached to the note.
pinnedbooleanPinned notes appear first in listings.
archivedbooleanArchived 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.

Required scope: notes:read

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.

Required scope: notes:write

Body parameters

FieldTypeDescription
notebook_id requiredstringNotebook that contains the note.
title requiredstringPlain-text title, up to 200 characters.
bodystringMarkdown content, up to 1 MB.
tagsstring[]Tag names attached to the note.
pinnedbooleanPinned notes appear first in listings.
archivedbooleanArchived 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.

Required scope: notes:write

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.

Required scope: notes:write

Body parameters

FieldTypeDescription
notebook_id requiredstringNotebook that contains the note.
title requiredstringPlain-text title, up to 200 characters.
bodystringMarkdown content, up to 1 MB.
tagsstring[]Tag names attached to the note.
pinnedbooleanPinned notes appear first in listings.
archivedbooleanArchived 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.

Required scope: notes:write

Body parameters

FieldTypeDescription
notebook_id requiredstringNotebook that contains the note.
title requiredstringPlain-text title, up to 200 characters.
bodystringMarkdown content, up to 1 MB.
tagsstring[]Tag names attached to the note.
pinnedbooleanPinned notes appear first in listings.
archivedbooleanArchived 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).

Required scope: notes:write

Body parameters

FieldTypeDescription
notebook_id requiredstringNotebook that contains the note.
title requiredstringPlain-text title, up to 200 characters.
bodystringMarkdown content, up to 1 MB.
tagsstring[]Tag names attached to the note.
pinnedbooleanPinned notes appear first in listings.
archivedbooleanArchived 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.

Required scope: notes:read

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.

Required scope: notes:write

Body parameters

FieldTypeDescription
notebook_id requiredstringNotebook that contains the note.
title requiredstringPlain-text title, up to 200 characters.
bodystringMarkdown content, up to 1 MB.
tagsstring[]Tag names attached to the note.
pinnedbooleanPinned notes appear first in listings.
archivedbooleanArchived 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"
}