heybmoDocsOpen HeyBMO

API reference

Lists

Lists with your own columns, items, ticking, due days and resets.

Base URL https://app.heybmo.comFor agents: llms.txt · OpenAPI

Operations

WritePOST /api/ops/lists.create

Create a list

Create a list (a checklist or to-do list) with its own columns. Every item has a text, a tick and an optional due day; columns can be text, number, date, checkbox, choice, multi-choice, link or rating. copyOf makes a new list with the columns of another one, and its items unticked when withItems is true. Add items with lists.addItems.

MCP tool lists_createCLI heybmo lists createLimit writeInput
namerequiredtextUp to 100 characters.
descriptiontextUp to 1000 characters.
fieldslist of objectThe list’s own columns, in order. Up to 30 items.Each item:
namerequiredtextThe column name, e.g. "qty" or "aisle". Up to 50 characters.
typerequiredtext | number | date | checkbox | choice | multi-choice | link | rating
optionslist of textThe choices, for choice and multi-choice columns. Up to 100 items.
copyOfidCopy another list’s columns.
withItemstrue or falseWith copyOf: also copy its items (all unticked). Default false.
pinnedtrue or false
curl https://app.heybmo.com/api/ops/lists.create \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"name":"Groceries","fields":[{"name":"qty","type":"number"},{"name":"aisle","type":"choice","options":["Produce","Dairy","Bakery"]}]}}'
200 response
{
  "output": {
    "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
    "name": "…",
    "description": "…",
    "items": 0,
    "unticked": 0,
    "pinned": false,
    "archived": false,
    "revision": 0,
    "updatedAt": "2026-11-09T09:00:00.000Z",
    "fields": [
      {
        "name": "…",
        "type": "text",
        "options": [
          "…"
        ],
        "filled": 0,
        "several": 0
      }
    ],
    "view": {
      "sort": {
        "by": "…",
        "direction": "asc"
      },
      "group": "…"
    }
  }
}
ReadPOST /api/ops/lists.get

Read a list’s columns

Read a list’s details: its columns (names, types and choices), default view and how many items are still to do. Read this before adding or changing items, to use the right column names. The items themselves come from lists.items.

MCP tool lists_getCLI heybmo lists getLimit readSafe to retryInput
listIdrequiredidThe list id (from lists.list, lists.search or lists.create).
curl https://app.heybmo.com/api/ops/lists.get \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"listId":"01a19279-e9c3-7c73-9705-94f082fa3a65"}}'
200 response
{
  "output": {
    "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
    "name": "…",
    "description": "…",
    "items": 0,
    "unticked": 0,
    "pinned": false,
    "archived": false,
    "revision": 0,
    "updatedAt": "2026-11-09T09:00:00.000Z",
    "fields": [
      {
        "name": "…",
        "type": "text",
        "options": [
          "…"
        ],
        "filled": 0,
        "several": 0
      }
    ],
    "view": {
      "sort": {
        "by": "…",
        "direction": "asc"
      },
      "group": "…"
    }
  }
}
ReadPOST /api/ops/lists.list

List all lists

List your lists, pinned first, then most recently changed, with how many items each still has to do. Archived lists are not shown unless archived is true. unfinished keeps only lists with items still to tick. query keeps the lists whose name contains it, in any case and with or without accents (lists.search also forgives typos). Pass nextCursor back as cursor for the next page.

MCP tool lists_listCLI heybmo lists listLimit readSafe to retryInput
archivedtrue or falsetrue lists the archive instead. Default false.
querytextOnly lists named like this. Up to 100 characters.
unfinishedtrue or falsetrue: only lists with items still to tick. Default false.
limitnumberDefault 100.
cursortextnextCursor from the previous page, for the page after it. Up to 300 characters.
curl https://app.heybmo.com/api/ops/lists.list \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{}}'
200 response
{
  "output": {
    "lists": [
      {
        "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "name": "…",
        "description": "…",
        "items": 0,
        "unticked": 0,
        "pinned": false,
        "archived": false,
        "revision": 0,
        "updatedAt": "2026-11-09T09:00:00.000Z"
      }
    ],
    "total": 0,
    "totalItems": 0,
    "totalUnticked": 0,
    "nextCursor": "…"
  }
}
WritePOST /api/ops/lists.update

Change a list

Change a list’s name, description, pinned or archived state, or its default view (sort and grouping, e.g. group by an aisle column to show sections). Columns change with lists.addField, lists.updateField and lists.removeField.

MCP tool lists_updateCLI heybmo lists updateLimit writeInput
listIdrequiredidThe list id (from lists.list, lists.search or lists.create).
revisionnumberThe revision you last read. If it changed since, the change is refused so nothing is overwritten.
nametextUp to 100 characters.
descriptiontextUp to 1000 characters.
pinnedtrue or false
archivedtrue or falseArchived lists leave the normal overview.
viewobjectHow the list shows by default. sort.by: position (your order), text, ticked, due, created or a column; group: ticked, due, or a choice, checkbox, rating or date column (null stops grouping).
curl https://app.heybmo.com/api/ops/lists.update \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"listId":"01a19279-e9c3-7c73-9705-94f082fa3a65","name":"Weekly shop","revision":2}}'
200 response
{
  "output": {
    "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
    "name": "…",
    "description": "…",
    "items": 0,
    "unticked": 0,
    "pinned": false,
    "archived": false,
    "revision": 0,
    "updatedAt": "2026-11-09T09:00:00.000Z",
    "fields": [
      {
        "name": "…",
        "type": "text",
        "options": [
          "…"
        ],
        "filled": 0,
        "several": 0
      }
    ],
    "view": {
      "sort": {
        "by": "…",
        "direction": "asc"
      },
      "group": "…"
    }
  }
}
WritePOST /api/ops/lists.addField

Add a column to a list

Add a column to a list (up to 30). Types: text, number, date, checkbox, choice and multi-choice (with options), link, rating (1 to 5). It is empty on existing items.

MCP tool lists_addFieldCLI heybmo lists addFieldLimit writeInput
namerequiredtextThe column name, e.g. "qty" or "aisle". Up to 50 characters.
typerequiredtext | number | date | checkbox | choice | multi-choice | link | rating
optionslist of textThe choices, for choice and multi-choice columns. Up to 100 items.
listIdrequiredidThe list id (from lists.list, lists.search or lists.create).
revisionnumberThe revision you last read. If it changed since, the change is refused so nothing is overwritten.
beforetextPut it before this column (default: at the end). Up to 50 characters.
curl https://app.heybmo.com/api/ops/lists.addField \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"listId":"01a19279-e9c3-7c73-9705-94f082fa3a65","name":"price","type":"number"}}'
200 response
{
  "output": {
    "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
    "name": "…",
    "description": "…",
    "items": 0,
    "unticked": 0,
    "pinned": false,
    "archived": false,
    "revision": 0,
    "updatedAt": "2026-11-09T09:00:00.000Z",
    "fields": [
      {
        "name": "…",
        "type": "text",
        "options": [
          "…"
        ],
        "filled": 0,
        "several": 0
      }
    ],
    "view": {
      "sort": {
        "by": "…",
        "direction": "asc"
      },
      "group": "…"
    }
  }
}
WritePOST /api/ops/lists.updateField

Change a column

Change a column: rename it (items keep their values), replace its options, move it before another column, or change its type when no value is lost (e.g. number to text, choice to multi-choice, multi-choice to choice when no item has more than one picked, text to choice, which turns its values into options). Removing an option that items use is refused.

MCP tool lists_updateFieldCLI heybmo lists updateFieldLimit writeInput
listIdrequiredidThe list id (from lists.list, lists.search or lists.create).
revisionnumberThe revision you last read. If it changed since, the change is refused so nothing is overwritten.
columnrequiredtextThe column’s current name. Up to 50 characters.
nametextA new name. Up to 50 characters.
typetext | number | date | checkbox | choice | multi-choice | link | rating
optionslist of textThe full new set of options. Up to 100 items.
beforetextMove it before this column. Up to 50 characters.
curl https://app.heybmo.com/api/ops/lists.updateField \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"listId":"01a19279-e9c3-7c73-9705-94f082fa3a65","column":"qty","name":"quantity"}}'
200 response
{
  "output": {
    "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
    "name": "…",
    "description": "…",
    "items": 0,
    "unticked": 0,
    "pinned": false,
    "archived": false,
    "revision": 0,
    "updatedAt": "2026-11-09T09:00:00.000Z",
    "fields": [
      {
        "name": "…",
        "type": "text",
        "options": [
          "…"
        ],
        "filled": 0,
        "several": 0
      }
    ],
    "view": {
      "sort": {
        "by": "…",
        "direction": "asc"
      },
      "group": "…"
    }
  }
}
DeletePOST /api/ops/lists.removeField

Remove a column

Remove a column from a list and delete its values from every item, for good (it cannot be undone). Ask the person first.

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 lists_removeFieldCLI heybmo lists removeFieldLimit deleteSafe to retryInput
listIdrequiredidThe list id (from lists.list, lists.search or lists.create).
revisionnumberThe revision you last read. If it changed since, the change is refused so nothing is overwritten.
columnrequiredtextThe column’s current name. Up to 50 characters.
confirmtrue or falseSet to true once the person agreed. Without it nothing is deleted and you get a description of what would be.
curl https://app.heybmo.com/api/ops/lists.removeField \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"listId":"01a19279-e9c3-7c73-9705-94f082fa3a65","column":"price"}}'
200 response
{
  "output": {
    "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
    "name": "…",
    "description": "…",
    "items": 0,
    "unticked": 0,
    "pinned": false,
    "archived": false,
    "revision": 0,
    "updatedAt": "2026-11-09T09:00:00.000Z",
    "fields": [
      {
        "name": "…",
        "type": "text",
        "options": [
          "…"
        ],
        "filled": 0,
        "several": 0
      }
    ],
    "view": {
      "sort": {
        "by": "…",
        "direction": "asc"
      },
      "group": "…"
    }
  }
}
ReadPOST /api/ops/lists.items

Read a list’s items

Read a list’s items with their values by column name. By default in the list’s own order (or its saved view), ticked items last. Filter by the tick, by text, due day or any column (tests: is, isNot, contains, lessThan, atMost, greaterThan, atLeast, isEmpty, isNotEmpty); sort and group by a column. query finds items by words in their text or any text or link column (any case, with or without accents; every word must appear). For a long list, filter or search rather than reading every page.

MCP tool lists_itemsCLI heybmo lists itemsLimit readSafe to retryInput
listIdrequiredidThe list id (from lists.list, lists.search or lists.create).
tickedtrue or falseOnly ticked (true) or only unticked (false) items.
filterslist of objectDefault []. Up to 10 items.Each item:
columnrequiredtextA column name, or text or due. Up to 50 characters.
testrequiredis | isNot | contains | lessThan | atMost | greaterThan | atLeast | isEmpty | isNotEmpty
valueanyWhat to compare with (not for isEmpty / isNotEmpty).
querytextOnly items with these words in their text or a text or link column (any case, accents ignored). Up to 200 characters.
sortobjectposition, text, ticked, due, created or a column (default: the list’s view).
grouptextGroup by ticked, due or a column. Up to 50 characters.
itemIdslist of idOnly these items, e.g. to read one again. Up to 100 items.
limitnumberDefault 100.
cursortextnextCursor from the previous page.
curl https://app.heybmo.com/api/ops/lists.items \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"listId":"01a19279-e9c3-7c73-9705-94f082fa3a65"}}'
200 response
{
  "output": {
    "list": {
      "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
      "name": "…"
    },
    "items": [
      {
        "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "listId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "text": "…",
        "ticked": false,
        "due": "2026-11-09",
        "values": {},
        "revision": 0,
        "createdAt": "2026-11-09T09:00:00.000Z",
        "updatedAt": "2026-11-09T09:00:00.000Z"
      }
    ],
    "groups": [
      {
        "value": null,
        "count": 0,
        "unticked": 0
      }
    ],
    "total": 0,
    "nextCursor": "…"
  }
}
WritePOST /api/ops/lists.addItems

Add items to a list

Add one or more items (up to 100) to a list in one call, at the end or before another item. Each item has a text, an optional due day and values for the list’s columns by name (read the columns with lists.get first). Add several at once rather than one call each.

MCP tool lists_addItemsCLI heybmo lists addItemsLimit writeInput
listIdrequiredidThe list id (from lists.list, lists.search or lists.create).
itemsrequiredlist of objectUp to 100 items.Each item:
textrequiredtextUp to 500 characters.
duedateA day, as YYYY-MM-DD.
valuesobjectValues by column name, e.g. {"qty": 2, "aisle": "Dairy"}; null clears one. Read the list first (lists.get) to see its columns.
beforeidPut them before this item (default: at the end).
addMissingOptionstrue or falseAdd choice options that do not exist yet instead of refusing them. Default false.
curl https://app.heybmo.com/api/ops/lists.addItems \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"listId":"01a19279-e9c3-7c73-9705-94f082fa3a65","items":[{"text":"Eggs"},{"text":"Flour","values":{"qty":2,"aisle":"Bakery"}}]}}'
200 response
{
  "output": {
    "items": [
      {
        "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "listId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "text": "…",
        "ticked": false,
        "due": "2026-11-09",
        "values": {},
        "revision": 0,
        "createdAt": "2026-11-09T09:00:00.000Z",
        "updatedAt": "2026-11-09T09:00:00.000Z"
      }
    ],
    "listId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
    "unticked": 0
  }
}
WritePOST /api/ops/lists.updateItems

Change items

Change up to 100 items of one list: text, due day (null removes it) and column values by name (only the values given change; null clears one). To tick items use lists.tick; to move them, lists.moveItems.

MCP tool lists_updateItemsCLI heybmo lists updateItemsLimit writeInput
itemsrequiredlist of objectUp to 100 items.Each item:
itemIdrequiredidAn item id (from lists.items or lists.search).
revisionnumberThe revision you last read. If it changed since, the change is refused so nothing is overwritten.
texttextUp to 500 characters.
duedate or null
valuesobjectValues by column name, e.g. {"qty": 2, "aisle": "Dairy"}; null clears one. Read the list first (lists.get) to see its columns.
addMissingOptionstrue or falseAdd choice options that do not exist yet instead of refusing them. Default false.
curl https://app.heybmo.com/api/ops/lists.updateItems \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"items":[{"itemId":"01a19279-eb99-775d-bebf-12c59f611dfb","text":"Oat milk","values":{"qty":3}}]}}'
200 response
{
  "output": {
    "items": [
      {
        "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "listId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "text": "…",
        "ticked": false,
        "due": "2026-11-09",
        "values": {},
        "revision": 0,
        "createdAt": "2026-11-09T09:00:00.000Z",
        "updatedAt": "2026-11-09T09:00:00.000Z"
      }
    ],
    "listId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
    "unticked": 0
  }
}
WritePOST /api/ops/lists.tick

Tick or untick items

Tick items as done (or untick them with ticked: false), up to 100 of one list at a time. The answer says how many are still to do and whether the list is now complete. To untick a whole list for reuse, lists.reset is simpler.

MCP tool lists_tickCLI heybmo lists tickLimit writeSafe to retryInput
itemIdsrequiredlist of idUp to 100 items.
tickedtrue or falseDefault true.
curl https://app.heybmo.com/api/ops/lists.tick \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"itemIds":["01a19279-eb99-775d-bebf-12c59f611dfb"]}}'
200 response
{
  "output": {
    "items": [
      {
        "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "listId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "text": "…",
        "ticked": false,
        "due": "2026-11-09",
        "values": {},
        "revision": 0,
        "createdAt": "2026-11-09T09:00:00.000Z",
        "updatedAt": "2026-11-09T09:00:00.000Z"
      }
    ],
    "listId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
    "unticked": 0,
    "completed": false
  }
}
WritePOST /api/ops/lists.tickMatching

Tick every matching item

Tick (or untick, with to: unticked) every item of a list that matches the filters and query, however many: e.g. every item in the Dairy aisle. For a few known items, lists.tick is simpler.

MCP tool lists_tickMatchingCLI heybmo lists tickMatchingLimit writeSafe to retryInput
listIdrequiredidThe list id (from lists.list, lists.search or lists.create).
tickedtrue or falseOnly ticked (true) or only unticked (false) items.
filterslist of objectThe same filters as lists.items; none: every item. Default []. Up to 10 items.Each item:
columnrequiredtextA column name, or text or due. Up to 50 characters.
testrequiredis | isNot | contains | lessThan | atMost | greaterThan | atLeast | isEmpty | isNotEmpty
valueanyWhat to compare with (not for isEmpty / isNotEmpty).
querytextThe same words as lists.items query: only items holding every word. Up to 200 characters.
toticked | untickedDefault "ticked".
curl https://app.heybmo.com/api/ops/lists.tickMatching \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"listId":"01a19279-e9c3-7c73-9705-94f082fa3a65","filters":[]}}'
200 response
{
  "output": {
    "listId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
    "count": 0,
    "unticked": 0,
    "completed": false
  }
}
WritePOST /api/ops/lists.moveItems

Move items

Move items within their list (before another item, or to the end) or to another list. Moving to another list keeps the values of columns it has with the same name and type; others are dropped, and the answer says which.

MCP tool lists_moveItemsCLI heybmo lists moveItemsLimit writeInput
itemIdsrequiredlist of idUp to 100 items.
toListIdidAnother list (default: the same one).
beforeidPut them before this item (default: at the end).
curl https://app.heybmo.com/api/ops/lists.moveItems \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"itemIds":["01a19279-eb99-775d-bebf-12c59f611dfb"],"before":"01a19279-ec12-7a31-8f02-3a1b2c3d4e5f"}}'
200 response
{
  "output": {
    "items": [
      {
        "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "listId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "text": "…",
        "ticked": false,
        "due": "2026-11-09",
        "values": {},
        "revision": 0,
        "createdAt": "2026-11-09T09:00:00.000Z",
        "updatedAt": "2026-11-09T09:00:00.000Z"
      }
    ],
    "listId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
    "unticked": 0,
    "droppedColumns": [
      "…"
    ]
  }
}
WritePOST /api/ops/lists.moveMatching

Move every matching item to another list

Move every item of a list that matches the filters and query to the end of another list, however many. Values of columns the other list has with the same name and type are kept; others are dropped, and the answer says which. For a few known items, lists.moveItems is simpler.

MCP tool lists_moveMatchingCLI heybmo lists moveMatchingLimit writeInput
listIdrequiredidThe list id (from lists.list, lists.search or lists.create).
tickedtrue or falseOnly ticked (true) or only unticked (false) items.
filterslist of objectThe same filters as lists.items; none: every item. Default []. Up to 10 items.Each item:
columnrequiredtextA column name, or text or due. Up to 50 characters.
testrequiredis | isNot | contains | lessThan | atMost | greaterThan | atLeast | isEmpty | isNotEmpty
valueanyWhat to compare with (not for isEmpty / isNotEmpty).
querytextThe same words as lists.items query: only items holding every word. Up to 200 characters.
toListIdrequiredidThe list to move them to.
curl https://app.heybmo.com/api/ops/lists.moveMatching \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"listId":"01a19279-e9c3-7c73-9705-94f082fa3a65","ticked":false,"filters":[],"toListId":"01a19279-ec12-7a31-8f02-3a1b2c3d4e5f"}}'
200 response
{
  "output": {
    "listId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
    "count": 0,
    "unticked": 0,
    "droppedColumns": [
      "…"
    ]
  }
}
WritePOST /api/ops/lists.reset

Untick a whole list

Untick every item of a list, to use it again (a weekly shop, a packing list). Items and values stay as they are.

MCP tool lists_resetCLI heybmo lists resetLimit writeSafe to retryInput
listIdrequiredidThe list id (from lists.list, lists.search or lists.create).
curl https://app.heybmo.com/api/ops/lists.reset \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"listId":"01a19279-e9c3-7c73-9705-94f082fa3a65"}}'
200 response
{
  "output": {
    "listId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
    "count": 0,
    "unticked": 0
  }
}
ReadPOST /api/ops/lists.due

Items due across lists

Unticked items with a due day, across every list, soonest first: e.g. what is due this week (until the last day) or overdue (until yesterday). Archived lists are included.

MCP tool lists_dueCLI heybmo lists dueLimit readSafe to retryInput
untilrequireddateThe last day to include, YYYY-MM-DD.
fromdateThe first day (default: no limit, so overdue items too).
limitnumberDefault 100.
curl https://app.heybmo.com/api/ops/lists.due \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"until":"2026-11-07"}}'
200 response
{
  "output": {
    "items": [
      {
        "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "listId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "text": "…",
        "ticked": false,
        "due": "2026-11-09",
        "values": {},
        "revision": 0,
        "createdAt": "2026-11-09T09:00:00.000Z",
        "updatedAt": "2026-11-09T09:00:00.000Z",
        "listName": "…"
      }
    ]
  }
}
ReadPOST /api/ops/lists.search

Search lists and items

Find items by their text and text values across every list (or one), and lists by name, best matches first. Typos are forgiven. Use it to find an item or a list the person names without knowing ids.

MCP tool lists_searchCLI heybmo lists searchLimit readSafe to retryInput
queryrequiredtextUp to 200 characters.
listIdidOnly items of this list.
includeTickedtrue or falseDefault true.
limitnumberDefault 20.
curl https://app.heybmo.com/api/ops/lists.search \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"query":"batteries"}}'
200 response
{
  "output": {
    "lists": [
      {
        "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "name": "…",
        "unticked": 0,
        "archived": false
      }
    ],
    "items": [
      {
        "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "listId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "text": "…",
        "ticked": false,
        "due": "2026-11-09",
        "values": {},
        "revision": 0,
        "createdAt": "2026-11-09T09:00:00.000Z",
        "updatedAt": "2026-11-09T09:00:00.000Z",
        "listName": "…"
      }
    ]
  }
}
DeletePOST /api/ops/lists.delete

Move a list to the trash

Move a list, with its items, to the trash. It can be restored with lists.restore for 30 days, then it is deleted for good.

Goes to the trash: it can be restored for 30 days.

MCP tool lists_deleteCLI heybmo lists deleteLimit deleteSafe to retryInput
listIdrequiredidThe list id (from lists.list, lists.search or lists.create).
revisionnumberThe revision you last read. If it changed since, the change is refused so nothing is overwritten.
curl https://app.heybmo.com/api/ops/lists.delete \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"listId":"01a19279-e9c3-7c73-9705-94f082fa3a65"}}'
200 response
{
  "output": {
    "deletedAt": "2026-11-09T09:00:00.000Z",
    "restoreUntil": "2026-11-09T09:00:00.000Z",
    "id": "01a19279-e9c3-7c73-9705-94f082fa3a65"
  }
}
WritePOST /api/ops/lists.restore

Restore a list from the trash

Bring a list back from the trash, with its items.

MCP tool lists_restoreCLI heybmo lists restoreLimit writeSafe to retryInput
listIdrequiredidThe list id (from lists.list, lists.search or lists.create).
curl https://app.heybmo.com/api/ops/lists.restore \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"listId":"01a19279-e9c3-7c73-9705-94f082fa3a65"}}'
200 response
{
  "output": {
    "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
    "name": "…",
    "description": "…",
    "items": 0,
    "unticked": 0,
    "pinned": false,
    "archived": false,
    "revision": 0,
    "updatedAt": "2026-11-09T09:00:00.000Z",
    "fields": [
      {
        "name": "…",
        "type": "text",
        "options": [
          "…"
        ],
        "filled": 0,
        "several": 0
      }
    ],
    "view": {
      "sort": {
        "by": "…",
        "direction": "asc"
      },
      "group": "…"
    }
  }
}
ReadPOST /api/ops/lists.trash

List the trash

What is in the trash and until when it can be restored: deleted lists, or the deleted items of one list when listId is given (most recent first). Pass nextCursor back as cursor for the next page.

MCP tool lists_trashCLI heybmo lists trashLimit readSafe to retryInput
listIdidShow this list’s deleted items instead.
limitnumberDefault 50.
cursortextnextCursor from the previous page, for the page after it. Up to 300 characters.
curl https://app.heybmo.com/api/ops/lists.trash \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{}}'
200 response
{
  "output": {
    "lists": [
      {
        "deletedAt": "2026-11-09T09:00:00.000Z",
        "restoreUntil": "2026-11-09T09:00:00.000Z",
        "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "name": "…",
        "items": 0
      }
    ],
    "items": [
      {
        "deletedAt": "2026-11-09T09:00:00.000Z",
        "restoreUntil": "2026-11-09T09:00:00.000Z",
        "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "text": "…"
      }
    ],
    "total": 0,
    "totalItems": 0,
    "nextCursor": "…"
  }
}
DeletePOST /api/ops/lists.deleteItems

Move items to the trash

Move items of one list to the trash (up to 100). They can be restored with lists.restoreItems for 30 days. To remove every ticked item, lists.clearTicked is simpler.

Goes to the trash: it can be restored for 30 days.

MCP tool lists_deleteItemsCLI heybmo lists deleteItemsLimit deleteSafe to retryInput
itemIdsrequiredlist of idUp to 100 items.
curl https://app.heybmo.com/api/ops/lists.deleteItems \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"itemIds":["01a19279-eb99-775d-bebf-12c59f611dfb"]}}'
200 response
{
  "output": {
    "listId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
    "count": 0,
    "unticked": 0,
    "deletedAt": "2026-11-09T09:00:00.000Z",
    "restoreUntil": "2026-11-09T09:00:00.000Z"
  }
}
DeletePOST /api/ops/lists.deleteMatching

Move every matching item to the trash

Move every item of a list that matches the filters and query to the trash, however many (restorable for 30 days with lists.restoreItems). For a few known items, lists.deleteItems is simpler; for the ticked ones, lists.clearTicked.

Goes to the trash: it can be restored for 30 days.

MCP tool lists_deleteMatchingCLI heybmo lists deleteMatchingLimit deleteSafe to retryInput
listIdrequiredidThe list id (from lists.list, lists.search or lists.create).
tickedtrue or falseOnly ticked (true) or only unticked (false) items.
filterslist of objectThe same filters as lists.items; none: every item. Default []. Up to 10 items.Each item:
columnrequiredtextA column name, or text or due. Up to 50 characters.
testrequiredis | isNot | contains | lessThan | atMost | greaterThan | atLeast | isEmpty | isNotEmpty
valueanyWhat to compare with (not for isEmpty / isNotEmpty).
querytextThe same words as lists.items query: only items holding every word. Up to 200 characters.
curl https://app.heybmo.com/api/ops/lists.deleteMatching \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"listId":"01a19279-e9c3-7c73-9705-94f082fa3a65","filters":[{"column":"due","test":"lessThan","value":"2026-11-01"}]}}'
200 response
{
  "output": {
    "listId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
    "count": 0,
    "unticked": 0,
    "deletedAt": "2026-11-09T09:00:00.000Z",
    "restoreUntil": "2026-11-09T09:00:00.000Z"
  }
}
WritePOST /api/ops/lists.restoreItems

Restore items from the trash

Bring items back from the trash, at the end of their list. Name them (itemIds, found with lists.trash and a listId), or give the listId and deletedAt of a lists.deleteItems or lists.deleteMatching answer to bring back all it moved.

MCP tool lists_restoreItemsCLI heybmo lists restoreItemsLimit writeInput
itemIdslist of idUp to 100 items.
listIdidWith deletedAt: the list the items were deleted from.
deletedAtdate and timeThe deletedAt of a delete answer: brings back all it moved.
curl https://app.heybmo.com/api/ops/lists.restoreItems \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"itemIds":["01a19279-eb99-775d-bebf-12c59f611dfb"]}}'
200 response
{
  "output": {
    "listId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
    "count": 0,
    "unticked": 0
  }
}
DeletePOST /api/ops/lists.clearTicked

Clear ticked items

Move every ticked item of a list to the trash (restorable for 30 days with lists.restoreItems). To keep the items and only untick them, use lists.reset.

Goes to the trash: it can be restored for 30 days.

MCP tool lists_clearTickedCLI heybmo lists clearTickedLimit deleteSafe to retryInput
listIdrequiredidThe list id (from lists.list, lists.search or lists.create).
curl https://app.heybmo.com/api/ops/lists.clearTicked \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"listId":"01a19279-e9c3-7c73-9705-94f082fa3a65"}}'
200 response
{
  "output": {
    "listId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
    "count": 0,
    "unticked": 0
  }
}
DeletePOST /api/ops/lists.deleteForever

Delete lists in the trash for good

Delete lists that are in the trash for good, with their items: the ones named (listIds), or the whole trash (all: true). It cannot be undone, so ask the person first. Lists not in the trash are refused: lists.delete moves a list 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 lists_deleteForeverCLI heybmo lists deleteForeverLimit deleteSafe to retryInput
listIdslist of idLists in the trash to delete for good (from lists.trash). Up to 100 items.
alltrue or falsetrue: empty the whole trash instead.
confirmtrue or falseSet to true once the person agreed. Without it nothing is deleted and you get a description of what would be.
curl https://app.heybmo.com/api/ops/lists.deleteForever \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"listIds":["01a19279-e9c3-7c73-9705-94f082fa3a65"]}}'
200 response
{
  "output": {
    "lists": 0,
    "items": 0
  }
}