Write POST /api/ops/notes.create Copy for AICreate a note Create a note: a title and a Markdown body, optionally in a folder, with tags and a colour.
MCP tool notes_create CLI heybmo notes create Limit write Input titlerequired text Up to 200 characters.
bodytext Markdown, up to 100 KB. Default "".
folderIdid A folder id (from notes.folders).
tagslist of text Labels, e.g. ["work", "home"]. Stored lower-case. Up to 50 items.
pinnedtrue or false Keep it at the top of lists.
colorlavender | sky | apricot | lime A colour that makes the note stand out on the board.
curl JavaScript Python CLI Copycurl https://app.heybmo.com/api/ops/notes.create \
-H "Authorization: Bearer $HEYBMO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input":{"title":"Groceries","body":"- milk\n- eggs","tags":["shopping"]}}'200 response Copy{
"output": {
"id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"title": "…",
"folderId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"tags": [
"…"
],
"pinned": false,
"archived": false,
"color": "lavender",
"revision": 0,
"createdAt": "2026-11-09T09:00:00.000Z",
"updatedAt": "2026-11-09T09:00:00.000Z",
"body": "…",
"attachments": [
{
"id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"name": "…",
"contentType": "…",
"size": 0,
"status": "pending",
"searchable": "pending",
"url": "…"
}
]
}
}Read POST /api/ops/notes.get Copy for AIRead a note Read one note in full: body (Markdown), tags, folder, revision, attachments (with short-lived links to view them).
MCP tool notes_get CLI heybmo notes get Limit read Safe to retry Input noteIdrequired id The note id (from notes.list, notes.search or notes.create).
curl JavaScript Python CLI Copycurl https://app.heybmo.com/api/ops/notes.get \
-H "Authorization: Bearer $HEYBMO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input":{"noteId":"01a19279-eb99-775d-bebf-12c59f611dfb"}}'200 response Copy{
"output": {
"id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"title": "…",
"folderId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"tags": [
"…"
],
"pinned": false,
"archived": false,
"color": "lavender",
"revision": 0,
"createdAt": "2026-11-09T09:00:00.000Z",
"updatedAt": "2026-11-09T09:00:00.000Z",
"body": "…",
"attachments": [
{
"id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"name": "…",
"contentType": "…",
"size": 0,
"status": "pending",
"searchable": "pending",
"url": "…"
}
]
}
}Read POST /api/ops/notes.list Copy for AIList notes List notes, pinned first, then most recently changed (order changed: most recently changed first, pinned or not), with a short preview of each and how many match. Filter by folder, tag, pinned or archived. Archived notes are left out unless archived is true. Pass nextCursor back as cursor for the next page.
MCP tool notes_list CLI heybmo notes list Limit read Safe to retry Input folderIdid or null Only notes in this folder; null for notes at the top level.
tagtext Only notes with this tag. Up to 100 characters.
pinnedtrue or false Only pinned (true) or only unpinned (false) notes.
archivedtrue or false true lists the archive instead. Default false.
orderpinnedFirst | changed pinnedFirst (default), or changed: most recently changed first. Default "pinnedFirst".
limitnumber Default 30.
cursortext Up to 300 characters.
curl JavaScript Python CLI Copycurl https://app.heybmo.com/api/ops/notes.list \
-H "Authorization: Bearer $HEYBMO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input":{"tag":"shopping","limit":10}}'200 response Copy{
"output": {
"notes": [
{
"id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"title": "…",
"excerpt": "…",
"folderId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"tags": [
"…"
],
"pinned": false,
"archived": false,
"color": "lavender",
"revision": 0,
"createdAt": "2026-11-09T09:00:00.000Z",
"updatedAt": "2026-11-09T09:00:00.000Z",
"attached": {
"count": 0,
"pictures": 0,
"cover": {},
"file": {}
}
}
],
"total": 0,
"nextCursor": "…"
}
}Read POST /api/ops/notes.search Copy for AISearch notes Search notes by words in their title, body and attachments (text in PDFs and in pictures, read automatically). Typos in titles are forgiven. Supports "exact phrases", -excluded words and OR. Best matches first.
MCP tool notes_search CLI heybmo notes search Limit read Safe to retry Input queryrequired text Up to 200 characters.
folderIdid or null Only notes in this folder; null for notes at the top level.
tagtext Only notes with this tag. Up to 100 characters.
includeArchivedtrue or false Default true.
limitnumber Default 20.
curl JavaScript Python CLI Copycurl https://app.heybmo.com/api/ops/notes.search \
-H "Authorization: Bearer $HEYBMO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input":{"query":"electricity bill"}}'200 response Copy{
"output": {
"results": [
{
"id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"title": "…",
"excerpt": "…",
"folderId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"tags": [
"…"
],
"pinned": false,
"archived": false,
"color": "lavender",
"revision": 0,
"createdAt": "2026-11-09T09:00:00.000Z",
"updatedAt": "2026-11-09T09:00:00.000Z",
"attached": {
"count": 0,
"pictures": 0,
"cover": {},
"file": {}
},
"foundIn": [
"…"
]
}
]
}
}Write POST /api/ops/notes.update Copy for AIChange a note Change one or more fields of a note: title, whole body, folder (null for the top level), tags (replaces them), pinned, archived or colour (null for none). To add text or fix one passage, notes.append and notes.replaceText are safer than rewriting the body.
MCP tool notes_update CLI heybmo notes update Limit write Input noteIdrequired id The note id (from notes.list, notes.search or notes.create).
revisionnumber The revision you last read. If the note changed since, the edit is refused so nothing is overwritten. Recommended for AI apps.
titletext Up to 200 characters.
bodytext The whole new body (Markdown).
folderIdid or null
tagslist of text Labels, e.g. ["work", "home"]. Stored lower-case. Up to 50 items.
pinnedtrue or false
archivedtrue or false Archived notes leave the normal list but stay searchable.
colorlavender | sky | apricot | lime or null
curl JavaScript Python CLI Copycurl https://app.heybmo.com/api/ops/notes.update \
-H "Authorization: Bearer $HEYBMO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input":{"noteId":"01a19279-eb99-775d-bebf-12c59f611dfb","title":"Groceries for Saturday","revision":3}}'200 response Copy{
"output": {
"id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"title": "…",
"folderId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"tags": [
"…"
],
"pinned": false,
"archived": false,
"color": "lavender",
"revision": 0,
"createdAt": "2026-11-09T09:00:00.000Z",
"updatedAt": "2026-11-09T09:00:00.000Z",
"body": "…",
"attachments": [
{
"id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"name": "…",
"contentType": "…",
"size": 0,
"status": "pending",
"searchable": "pending",
"url": "…"
}
]
}
}Write POST /api/ops/notes.append Copy for AIAdd text to a note Add text at the end of a note (on a new line). Safer than rewriting the whole body.
MCP tool notes_append CLI heybmo notes append Limit write Input noteIdrequired id The note id (from notes.list, notes.search or notes.create).
textrequired text Markdown to add.
revisionnumber The revision you last read. If the note changed since, the edit is refused so nothing is overwritten. Recommended for AI apps.
curl JavaScript Python CLI Copycurl https://app.heybmo.com/api/ops/notes.append \
-H "Authorization: Bearer $HEYBMO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input":{"noteId":"01a19279-eb99-775d-bebf-12c59f611dfb","text":"- oat milk"}}'200 response Copy{
"output": {
"id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"title": "…",
"folderId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"tags": [
"…"
],
"pinned": false,
"archived": false,
"color": "lavender",
"revision": 0,
"createdAt": "2026-11-09T09:00:00.000Z",
"updatedAt": "2026-11-09T09:00:00.000Z",
"body": "…",
"attachments": [
{
"id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"name": "…",
"contentType": "…",
"size": 0,
"status": "pending",
"searchable": "pending",
"url": "…"
}
]
}
}Write POST /api/ops/notes.replaceText Copy for AIReplace text in a note Replace one exact passage of a note with new text (empty to remove it). The passage must appear exactly once: copy it from the note, with enough surrounding text to be unique.
MCP tool notes_replaceText CLI heybmo notes replaceText Limit write Input noteIdrequired id The note id (from notes.list, notes.search or notes.create).
findrequired text The exact text to replace.
replacerequired text The new text.
revisionnumber The revision you last read. If the note changed since, the edit is refused so nothing is overwritten. Recommended for AI apps.
curl JavaScript Python CLI Copycurl https://app.heybmo.com/api/ops/notes.replaceText \
-H "Authorization: Bearer $HEYBMO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input":{"noteId":"01a19279-eb99-775d-bebf-12c59f611dfb","find":"- eggs","replace":"- 12 eggs"}}'200 response Copy{
"output": {
"id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"title": "…",
"folderId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"tags": [
"…"
],
"pinned": false,
"archived": false,
"color": "lavender",
"revision": 0,
"createdAt": "2026-11-09T09:00:00.000Z",
"updatedAt": "2026-11-09T09:00:00.000Z",
"body": "…",
"attachments": [
{
"id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"name": "…",
"contentType": "…",
"size": 0,
"status": "pending",
"searchable": "pending",
"url": "…"
}
]
}
}Delete POST /api/ops/notes.delete Copy for AIMove a note to the trash Move a note to the trash. It can be restored with notes.restore for 30 days, then it is deleted for good with its attachments.
Goes to the trash: it can be restored for 30 days.
MCP tool notes_delete CLI heybmo notes delete Limit delete Safe to retry Input noteIdrequired id The note id (from notes.list, notes.search or notes.create).
revisionnumber The revision you last read. If the note changed since, the edit is refused so nothing is overwritten. Recommended for AI apps.
curl JavaScript Python CLI Copycurl https://app.heybmo.com/api/ops/notes.delete \
-H "Authorization: Bearer $HEYBMO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input":{"noteId":"01a19279-eb99-775d-bebf-12c59f611dfb"}}'200 response Copy{
"output": {
"id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"deletedAt": "2026-11-09T09:00:00.000Z",
"restoreUntil": "2026-11-09T09:00:00.000Z"
}
}Write POST /api/ops/notes.restore Copy for AIRestore a note from the trash Bring a note back from the trash, with its attachments.
MCP tool notes_restore CLI heybmo notes restore Limit write Input noteIdrequired id The note id (from notes.list, notes.search or notes.create).
curl JavaScript Python CLI Copycurl https://app.heybmo.com/api/ops/notes.restore \
-H "Authorization: Bearer $HEYBMO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input":{"noteId":"01a19279-eb99-775d-bebf-12c59f611dfb"}}'200 response Copy{
"output": {
"id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"title": "…",
"folderId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"tags": [
"…"
],
"pinned": false,
"archived": false,
"color": "lavender",
"revision": 0,
"createdAt": "2026-11-09T09:00:00.000Z",
"updatedAt": "2026-11-09T09:00:00.000Z",
"body": "…",
"attachments": [
{
"id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"name": "…",
"contentType": "…",
"size": 0,
"status": "pending",
"searchable": "pending",
"url": "…"
}
]
}
}Read POST /api/ops/notes.trash Copy for AIList notes in the trash List notes in the trash (most recently deleted first), until when each can be restored, and how many are in it in all. Pass nextCursor back as cursor for the next page.
MCP tool notes_trash CLI heybmo notes trash Limit read Safe to retry Input limitnumber Default 50.
cursortext nextCursor from the previous page.
curl JavaScript Python CLI Copycurl https://app.heybmo.com/api/ops/notes.trash \
-H "Authorization: Bearer $HEYBMO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input":{"limit":20}}'200 response Copy{
"output": {
"notes": [
{
"id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"title": "…",
"deletedAt": "2026-11-09T09:00:00.000Z",
"restoreUntil": "2026-11-09T09:00:00.000Z"
}
],
"total": 0,
"nextCursor": "…"
}
}Delete POST /api/ops/notes.deleteForever Copy for AIDelete notes in the trash for good Delete notes that are in the trash for good, with their pictures and files: the ones named (noteIds), or the whole trash (all: true). It cannot be undone, so ask the person first. Notes not in the trash are refused: notes.delete moves a note there.
Deletes for good. The first call changes nothing and answers CONFIRMATION_REQUIRED with what would be deleted; call again with confirm: true once the person agrees.
MCP tool notes_deleteForever CLI heybmo notes deleteForever Limit delete Safe to retry Input noteIdslist of id Notes in the trash to delete for good (from notes.trash). Up to 100 items.
alltrue or false true: empty the whole trash instead.
confirmtrue or false Set to true once the person agreed. Without it nothing is deleted and you get a description of what would be.
curl JavaScript Python CLI Copycurl https://app.heybmo.com/api/ops/notes.deleteForever \
-H "Authorization: Bearer $HEYBMO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input":{"noteIds":["01a19279-e9c3-7c73-9705-94f082fa3a65"]}}'200 response Copy{
"output": {
"notes": 0,
"files": 0
}
}Write POST /api/ops/notes.attach Copy for AIAttach a file to a note Attach a picture or file (PDF, document, audio...) to a note. Chat apps send small files (up to 5 MB) inline as base64 in data. Otherwise give size and sha256 (the CLI fills them from --file <path>): the answer has an upload link to PUT the bytes to, then call notes.finishAttach. Show a picture in the body with  on a line of its own. To set how it shows, add a title: : width is a percent of the text width (10 to 100; left out, the picture keeps its own size), align is left, center or right, and crop is the part kept as x,y,width,height fractions of the picture. Text in pictures and PDFs becomes searchable.
MCP tool notes_attach CLI heybmo notes attach Limit upload Input noteIdrequired id The note id (from notes.list, notes.search or notes.create).
namerequired text File name, e.g. receipt.jpg. Up to 255 characters.
contentTyperequired text e.g. image/jpeg or application/pdf. Up to 200 characters.
datatext The whole file as base64 (up to 5 MB): stored in one step. Up to 6990508 characters.
sizenumber Bytes, when uploading with the link instead.
sha256text Hex SHA-256 of the bytes, when uploading.
curl JavaScript Python CLI Copycurl https://app.heybmo.com/api/ops/notes.attach \
-H "Authorization: Bearer $HEYBMO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input":{"noteId":"01a19279-eb99-775d-bebf-12c59f611dfb","name":"receipt.jpg","contentType":"image/jpeg","data":"/9j/4AAQSkZJRg=="}}'200 response Copy{
"output": {
"attachment": {
"id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"name": "…",
"contentType": "…",
"size": 0,
"status": "pending",
"searchable": "pending",
"url": "…"
},
"upload": {
"url": "…",
"method": "PUT",
"headers": {},
"expiresAt": "2026-11-09T09:00:00.000Z"
},
"finish": {
"operation": "…",
"input": {}
}
}
}Write POST /api/ops/notes.finishAttach Copy for AIFinish attaching a file Confirm an attachment after its bytes were uploaded with the link from notes.attach.
MCP tool notes_finishAttach CLI heybmo notes finishAttach Limit write Safe to retry Input noteIdrequired id The note id (from notes.list, notes.search or notes.create).
attachmentIdrequired id The attachment id (from notes.get or notes.attach).
curl JavaScript Python CLI Copycurl https://app.heybmo.com/api/ops/notes.finishAttach \
-H "Authorization: Bearer $HEYBMO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input":{"noteId":"01a19279-eb99-775d-bebf-12c59f611dfb","attachmentId":"01a1927a-1071-7a71-994f-4180839c9a39"}}'200 response Copy{
"output": {
"attachment": {
"id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"name": "…",
"contentType": "…",
"size": 0,
"status": "pending",
"searchable": "pending",
"url": "…"
}
}
}Delete POST /api/ops/notes.detach Copy for AIDelete an attachment Remove an attachment from a note and delete the file. This cannot be undone. Remove any  from the body too.
Deletes for good. The first call changes nothing and answers CONFIRMATION_REQUIRED with what would be deleted; call again with confirm: true once the person agrees.
MCP tool notes_detach CLI heybmo notes detach Limit delete Safe to retry Input noteIdrequired id The note id (from notes.list, notes.search or notes.create).
attachmentIdrequired id The attachment id (from notes.get or notes.attach).
confirmtrue or false Set to true once the person agreed. Without it nothing is deleted and you get a description of what would be.
curl JavaScript Python CLI Copycurl https://app.heybmo.com/api/ops/notes.detach \
-H "Authorization: Bearer $HEYBMO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input":{"noteId":"01a19279-eb99-775d-bebf-12c59f611dfb","attachmentId":"01a1927a-1071-7a71-994f-4180839c9a39"}}'200 response Copy{
"output": {
"id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"deleted": false
}
}Read POST /api/ops/notes.folders Copy for AIList note folders List all note folders (a tree: each has its parentId, null at the top level) with how many notes are directly in each.
MCP tool notes_folders CLI heybmo notes folders Limit read Safe to retry Input No input: send an empty object.
curl JavaScript Python CLI Copycurl https://app.heybmo.com/api/ops/notes.folders \
-H "Authorization: Bearer $HEYBMO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input":{}}'200 response Copy{
"output": {
"folders": [
{
"id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"name": "…",
"parentId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"notes": 0
}
]
}
}Write POST /api/ops/notes.createFolder Copy for AICreate a folder Create a folder for notes, at the top level or inside another folder (5 levels at most).
MCP tool notes_createFolder CLI heybmo notes createFolder Limit write Input namerequired text Up to 100 characters.
parentIdid Put it inside this folder.
curl JavaScript Python CLI Copycurl https://app.heybmo.com/api/ops/notes.createFolder \
-H "Authorization: Bearer $HEYBMO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input":{"name":"Garden"}}'200 response Copy{
"output": {
"id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"name": "…",
"parentId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"notes": 0
}
}Write POST /api/ops/notes.updateFolder Copy for AIRename or move a folder Rename a folder or move it into another folder (parentId null moves it to the top level). Its notes and subfolders move with it.
MCP tool notes_updateFolder CLI heybmo notes updateFolder Limit write Safe to retry Input folderIdrequired id A folder id (from notes.folders).
nametext Up to 100 characters.
parentIdid or null
curl JavaScript Python CLI Copycurl https://app.heybmo.com/api/ops/notes.updateFolder \
-H "Authorization: Bearer $HEYBMO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input":{"folderId":"01a19279-e9c3-7c73-9705-94f082fa3a65","name":"Cooking"}}'200 response Copy{
"output": {
"id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"name": "…",
"parentId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"notes": 0
}
}Delete POST /api/ops/notes.deleteFolder Copy for AIDelete a folder Delete a folder. It must be empty, unless moveContentsUp is true: then its notes and subfolders move to the folder above (or the top level). Notes are never deleted by this.
Deletes for good. The first call changes nothing and answers CONFIRMATION_REQUIRED with what would be deleted; call again with confirm: true once the person agrees.
MCP tool notes_deleteFolder CLI heybmo notes deleteFolder Limit delete Safe to retry Input folderIdrequired id A folder id (from notes.folders).
moveContentsUptrue or false Move what is inside to the parent folder instead of refusing. Default false.
confirmtrue or false Set to true once the person agreed. Without it nothing is deleted and you get a description of what would be.
curl JavaScript Python CLI Copycurl https://app.heybmo.com/api/ops/notes.deleteFolder \
-H "Authorization: Bearer $HEYBMO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input":{"folderId":"01a19279-e9c3-7c73-9705-94f082fa3a65"}}'200 response Copy{
"output": {
"id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
"movedNotes": 0,
"movedFolders": 0
}
}Read POST /api/ops/notes.tags Copy for AIList tags List every tag used on notes (not counting the trash), most used first.
MCP tool notes_tags CLI heybmo notes tags Limit read Safe to retry Input No input: send an empty object.
curl JavaScript Python CLI Copycurl https://app.heybmo.com/api/ops/notes.tags \
-H "Authorization: Bearer $HEYBMO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input":{}}'200 response Copy{
"output": {
"tags": [
{
"tag": "…",
"notes": 0
}
]
}
}Write POST /api/ops/notes.renameTag Copy for AIRename a tag everywhere Rename a tag on every note that has it (merging into the new tag if a note already has both).
MCP tool notes_renameTag CLI heybmo notes renameTag Limit write Safe to retry Input fromrequired text Up to 100 characters.
torequired text Up to 100 characters.
curl JavaScript Python CLI Copycurl https://app.heybmo.com/api/ops/notes.renameTag \
-H "Authorization: Bearer $HEYBMO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input":{"from":"job","to":"work"}}'200 response Copy{
"output": {
"notesChanged": 0
}
}Delete POST /api/ops/notes.removeTag Copy for AIRemove a tag everywhere Remove a tag from every note that has it. The notes themselves stay.
Deletes for good. The first call changes nothing and answers CONFIRMATION_REQUIRED with what would be deleted; call again with confirm: true once the person agrees.
MCP tool notes_removeTag CLI heybmo notes removeTag Limit delete Safe to retry Input tagrequired text Up to 100 characters.
confirmtrue or false Set to true once the person agreed. Without it nothing is deleted and you get a description of what would be.
curl JavaScript Python CLI Copycurl https://app.heybmo.com/api/ops/notes.removeTag \
-H "Authorization: Bearer $HEYBMO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input":{"tag":"old"}}'200 response Copy{
"output": {
"notesChanged": 0
}
}