heybmoDocsOpen HeyBMO

API reference

Reminders

One-off and repeating reminders, snoozing, history and the agenda.

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

Operations

WritePOST /api/ops/reminders.add

Set reminders

Set up to 50 reminders in one call. Each has a short text, when it fires (once at a day and time, or a repeating rule) in the person's time zone, how it reaches the person (their settings unless asked otherwise), and the record it is about (a note, list, list item, expense entry or debt): when the person mentions something already in HeyBMO, find it and link it, so the reminder shows it. It reaches the person in their HeyBMO inbox when due. The answer includes the current time, for times the person gives from now.

MCP tool reminders_addCLI heybmo reminders addLimit writeInput
remindersrequiredlist of objectUp to 50 items.Each item:
textrequiredtextWhat to be reminded of, short ("Call mum"). Up to 300 characters.
whenrequiredobjectWhen it fires, in its time zone. Once: { repeat: "never", date, time }. Repeating: daily, weekly (weekdays 1 = Monday), monthly (day, or "last"), yearly; every N; until a day or a number of times.
timeZonetextA fixed time zone such as America/New_York, only when the person names one ("9am New York time"). Default: their own, following them when they move. Up to 64 characters.
delivery"default" or list of email | push | desktop or inbox | email | pushHow this one reaches the person besides the inbox: default follows their notification settings; or its own channels, several at once, which replace the settings for this reminder: email, push (a pop-up), desktop (the HeyBMO app on their computer); [] is the inbox only. To add to their usual channels ("my usual plus email"), read the reminders group in inbox.settings and list its channels too. Quiet hours still apply. Only set it when asked. Default "default".
linkobjectThe record this reminder is about, when the person mentions one that exists (it is shown with the reminder, never changed).
unlinkedtruetrue when the words name a record HeyBMO keeps but this reminder is not about it (otherwise HeyBMO links that record).
curl https://app.heybmo.com/api/ops/reminders.add \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"reminders":[{"text":"Call mum","when":{"repeat":"never","date":"2026-11-02","time":"18:00"}}]}}'
200 response
{
  "output": {
    "reminders": [
      {
        "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "text": "…",
        "when": {
          "repeat": "never",
          "date": "2026-11-09",
          "time": "…"
        },
        "timeZone": "…",
        "followsPerson": false,
        "next": {
          "date": "2026-11-09",
          "time": "…"
        },
        "nextAt": "2026-11-09T09:00:00.000Z",
        "delivery": "default",
        "link": {
          "kind": "…",
          "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
          "state": "live",
          "title": "…",
          "path": "…",
          "facts": {}
        },
        "paused": false,
        "notDone": 0,
        "revision": 0,
        "createdAt": "2026-11-09T09:00:00.000Z",
        "coming": [
          {}
        ]
      }
    ],
    "now": {
      "date": "2026-11-09",
      "time": "…",
      "timeZone": "…"
    },
    "notes": [
      "…"
    ]
  }
}
WritePOST /api/ops/reminders.update

Change reminders

Change up to 50 reminders: text, time, time zone, delivery, link, or paused. A new when replaces the old time or rule; timeZone null follows the person again; link null removes it; paused true stops it firing until set back to false. Only what is given changes. To mark one done or snooze it, use reminders.done or reminders.snooze.

MCP tool reminders_updateCLI heybmo reminders updateLimit writeInput
remindersrequiredlist of objectUp to 50 items.Each item:
reminderIdrequiredidA reminder id (from reminders.list or reminders.add).
revisionnumberThe revision you last read. If it changed since, the change is refused so nothing is overwritten.
texttextWhat to be reminded of, short ("Call mum"). Up to 300 characters.
whenobjectWhen it fires, in its time zone. Once: { repeat: "never", date, time }. Repeating: daily, weekly (weekdays 1 = Monday), monthly (day, or "last"), yearly; every N; until a day or a number of times.
timeZonetext or null
delivery"default" or list of email | push | desktop or inbox | email | pushHow this one reaches the person besides the inbox: default follows their notification settings; or its own channels, several at once, which replace the settings for this reminder: email, push (a pop-up), desktop (the HeyBMO app on their computer); [] is the inbox only. To add to their usual channels ("my usual plus email"), read the reminders group in inbox.settings and list its channels too. Quiet hours still apply. Only set it when asked.
linkobject or null
pausedtrue or false
curl https://app.heybmo.com/api/ops/reminders.update \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"reminders":[{"reminderId":"01a19279-e9c3-7c73-9705-94f082fa3a65","when":{"repeat":"never","date":"2026-11-05","time":"10:00"}}]}}'
200 response
{
  "output": {
    "reminders": [
      {
        "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "text": "…",
        "when": {
          "repeat": "never",
          "date": "2026-11-09",
          "time": "…"
        },
        "timeZone": "…",
        "followsPerson": false,
        "next": {
          "date": "2026-11-09",
          "time": "…"
        },
        "nextAt": "2026-11-09T09:00:00.000Z",
        "delivery": "default",
        "link": {
          "kind": "…",
          "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
          "state": "live",
          "title": "…",
          "path": "…",
          "facts": {}
        },
        "paused": false,
        "notDone": 0,
        "revision": 0,
        "createdAt": "2026-11-09T09:00:00.000Z",
        "coming": [
          {}
        ]
      }
    ],
    "now": {
      "date": "2026-11-09",
      "time": "…",
      "timeZone": "…"
    }
  }
}
ReadPOST /api/ops/reminders.list

List or search reminders

Reminders, soonest first, with when each fires next, its rule and link, a page at a time with how many match in all. Status: upcoming (default: still to fire, not paused), repeating (not paused), paused, notDone (went off and not marked done) or all (finished one-offs too). Filter by words in the text, the kind of record (linked), the record it is about, or the days its next time falls on (nextFrom, nextTo). comingDays adds each one’s times in the next days (repeats included, snoozed ones at the time they come back), to snooze or mark done one of them ahead with its dueAt. For what went off and was missed, reminders.missed lists each time.

MCP tool reminders_listCLI heybmo reminders listLimit readSafe to retryInput
statusupcoming | repeating | paused | notDone | allDefault "upcoming".
querytextWords in the text. Up to 200 characters.
linkedtextOnly reminders about a record of this feature (notes, lists, debts, expenses), or plain: about nothing.
aboutobjectOnly reminders about this record.
nextFromdateOnly those whose next time is on or after this day.
nextTodateOnly those whose next time is on or before this day.
limitnumberDefault 50.
cursortextnextCursor from the previous page.
comingDaysnumberAlso list each reminder’s times in this many days ahead (coming). Default 0.
curl https://app.heybmo.com/api/ops/reminders.list \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{}}'
200 response
{
  "output": {
    "reminders": [
      {
        "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "text": "…",
        "when": {
          "repeat": "never",
          "date": "2026-11-09",
          "time": "…"
        },
        "timeZone": "…",
        "followsPerson": false,
        "next": {
          "date": "2026-11-09",
          "time": "…"
        },
        "nextAt": "2026-11-09T09:00:00.000Z",
        "delivery": "default",
        "link": {
          "kind": "…",
          "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
          "state": "live",
          "title": "…",
          "path": "…",
          "facts": {}
        },
        "paused": false,
        "notDone": 0,
        "revision": 0,
        "createdAt": "2026-11-09T09:00:00.000Z",
        "coming": [
          {}
        ]
      }
    ],
    "nextCursor": "…",
    "total": 0,
    "now": {
      "date": "2026-11-09",
      "time": "…",
      "timeZone": "…"
    }
  }
}
ReadPOST /api/ops/reminders.agenda

What is coming up, day by day

Every time reminders go off between two days, soonest first, each with its reminder, a page at a time, with how many there are in all. Repeating ones count each time, snoozed ones at the time they come back; past 62 days ahead only each reminder's next time shows. from defaults to today, no to means no end. byDay adds how many go off each day. Snooze or mark done one of them with its dueAt; reminders.list lists the reminders themselves.

MCP tool reminders_agendaCLI heybmo reminders agendaLimit readSafe to retryInput
fromdateFirst day (default: today, the person’s).
todateLast day, included (default: no end).
querytextWords in the text. Up to 200 characters.
linkedtextOnly reminders about a record of this feature (notes, lists, debts, expenses), or plain: about nothing.
aboutobjectOnly reminders about this record.
limitnumberDefault 50.
cursortextnextCursor from the previous page.
byDaytrue or falseAlso count the times on each day. Default false.
curl https://app.heybmo.com/api/ops/reminders.agenda \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{}}'
200 response
{
  "output": {
    "times": [
      {
        "at": "2026-11-09T09:00:00.000Z",
        "date": "…",
        "time": "…",
        "dueAt": "2026-11-09T09:00:00.000Z",
        "snoozed": false,
        "firingId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "reminder": {
          "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
          "text": "…",
          "when": {},
          "timeZone": "…",
          "followsPerson": false,
          "next": {},
          "nextAt": "2026-11-09T09:00:00.000Z",
          "delivery": "default",
          "link": {},
          "paused": false,
          "notDone": 0,
          "revision": 0,
          "createdAt": "2026-11-09T09:00:00.000Z",
          "coming": []
        }
      }
    ],
    "nextCursor": "…",
    "total": 0,
    "days": [
      {
        "date": "2026-11-09",
        "count": 0,
        "kinds": [
          "…"
        ]
      }
    ],
    "now": {
      "date": "2026-11-09",
      "time": "…",
      "timeZone": "…"
    }
  }
}
ReadPOST /api/ops/reminders.counts

How many reminders of each sort

How many reminders there are of each sort, for the words or record kind asked. missed: times that went off in the last 365 days, not done. today: times going off today. upcoming: reminders with a time still to come. repeating, paused. done: times marked done. trash. kinds: live reminders by what they are about, for the words only. To list them, use reminders.agenda, reminders.list, reminders.missed or reminders.history.

MCP tool reminders_countsCLI heybmo reminders countsLimit readSafe to retryInput
querytextWords in the text. Up to 200 characters.
linkedtextOnly reminders about a record of this feature (notes, lists, debts, expenses), or plain: about nothing.
curl https://app.heybmo.com/api/ops/reminders.counts \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{}}'
200 response
{
  "output": {
    "missed": 0,
    "today": 0,
    "upcoming": 0,
    "repeating": 0,
    "paused": 0,
    "done": 0,
    "trash": 0,
    "kinds": {},
    "now": {
      "date": "2026-11-09",
      "time": "…",
      "timeZone": "…"
    }
  }
}
ReadPOST /api/ops/reminders.missed

What did I miss

Each time a reminder went off and was not marked done, newest first: the last 30 days by default. Snoozed ones are left out until they go off again. Mark them done with reminders.done.

MCP tool reminders_missedCLI heybmo reminders missedLimit readSafe to retryInput
daysnumberHow far back, in days (1: since this time yesterday). Default 30.
dueFromdateOnly times due on or after this day, in the person’s time zone.
limitnumberDefault 100.
cursortextnextCursor from the previous page.
querytextWords in the text. Up to 200 characters.
linkedtextOnly reminders about a record of this feature (notes, lists, debts, expenses), or plain: about nothing.
aboutobjectOnly reminders about this record.
curl https://app.heybmo.com/api/ops/reminders.missed \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{}}'
200 response
{
  "output": {
    "firings": [
      {
        "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "reminderId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "text": "…",
        "due": {
          "date": "2026-11-09",
          "time": "…"
        },
        "dueAt": "2026-11-09T09:00:00.000Z",
        "firedAt": "2026-11-09T09:00:00.000Z",
        "done": false,
        "snoozedUntil": "2026-11-09T09:00:00.000Z",
        "link": {
          "kind": "…",
          "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
          "state": "live",
          "title": "…",
          "path": "…",
          "facts": {}
        }
      }
    ],
    "more": false,
    "nextCursor": "…",
    "total": 0,
    "now": {
      "date": "2026-11-09",
      "time": "…",
      "timeZone": "…"
    }
  }
}
ReadPOST /api/ops/reminders.history

Reminders marked done

Each time a reminder went off and was marked done, the most recently done first, a page at a time, with how many there are in all. Undo one with reminders.done (undo: true).

MCP tool reminders_historyCLI heybmo reminders historyLimit readSafe to retryInput
limitnumberDefault 50.
cursortextnextCursor from the previous page.
querytextWords in the text. Up to 200 characters.
linkedtextOnly reminders about a record of this feature (notes, lists, debts, expenses), or plain: about nothing.
aboutobjectOnly reminders about this record.
curl https://app.heybmo.com/api/ops/reminders.history \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{}}'
200 response
{
  "output": {
    "firings": [
      {
        "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "reminderId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "text": "…",
        "due": {
          "date": "2026-11-09",
          "time": "…"
        },
        "dueAt": "2026-11-09T09:00:00.000Z",
        "firedAt": "2026-11-09T09:00:00.000Z",
        "done": false,
        "snoozedUntil": "2026-11-09T09:00:00.000Z",
        "link": {
          "kind": "…",
          "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
          "state": "live",
          "title": "…",
          "path": "…",
          "facts": {}
        }
      }
    ],
    "nextCursor": "…",
    "total": 0
  }
}
WritePOST /api/ops/reminders.done

Mark reminders done

Mark reminders done. With firingIds: those times they went off (from reminders.missed). With reminderIds: every time each went off and is not done; if none, its next time ahead, so it stays quiet then (a repeating one still fires after that). With upcoming: those exact times ahead (dueAt from reminders.list comingDays), so a repeating one skips just that time. undo: true (firingIds only) makes them not done again: a time that went off is missed again, a time marked done ahead goes off as planned. Stopping a reminder for good is reminders.delete.

MCP tool reminders_doneCLI heybmo reminders doneLimit writeSafe to retryInput
firingIdslist of idUp to 50 items.
reminderIdslist of idUp to 50 items.
upcominglist of objectTimes still ahead to mark done now, so they stay quiet. Up to 50 items.Each item:
reminderIdrequiredidA reminder id (from reminders.list or reminders.add).
atrequireddate and timeOne of its times still to come: a dueAt from reminders.list with comingDays.
undotrue or falseNot done again (with firingIds). Default false.
curl https://app.heybmo.com/api/ops/reminders.done \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"firingIds":["01a19279-e9c3-7c73-9705-94f082fa3a65"]}}'
200 response
{
  "output": {
    "firings": [
      {
        "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "reminderId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "text": "…",
        "due": {
          "date": "2026-11-09",
          "time": "…"
        },
        "dueAt": "2026-11-09T09:00:00.000Z",
        "firedAt": "2026-11-09T09:00:00.000Z",
        "done": false,
        "snoozedUntil": "2026-11-09T09:00:00.000Z",
        "link": {
          "kind": "…",
          "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
          "state": "live",
          "title": "…",
          "path": "…",
          "facts": {}
        }
      }
    ],
    "nothingToMark": [
      "01a19279-e9c3-7c73-9705-94f082fa3a65"
    ]
  }
}
WritePOST /api/ops/reminders.snooze

Snooze a reminder

Make a reminder come back later: for 10m, 1h, evening (18:00), tomorrow (08:00 the next day), or until a given day and time, in the person’s time zone. Name the time it went off (firingId), or the reminder: its latest time not done, else its next time ahead. With reminderId and at (a dueAt from reminders.list comingDays), that time ahead is pushed back. Presets count from now, or from the time it would come when that is later (1h on a 15:00 reminder: 16:00). A repeating reminder keeps its rule: only that one time moves. A done one cannot be snoozed. To push back several at once, give targets (each a firingId, or a reminderId with an optional at) instead of firingId/reminderId; they all move the same way, together or not at all.

MCP tool reminders_snoozeCLI heybmo reminders snoozeLimit writeInput
firingIdidA firing id: one time a reminder went off (from reminders.missed or reminders.list).
reminderIdidA reminder id (from reminders.list or reminders.add).
atdate and timeWith reminderId: the time ahead to push back.
targetslist of objectSeveral to push back the same way, instead of firingId or reminderId. Up to 50 items.Each item:
firingIdidA firing id: one time a reminder went off (from reminders.missed or reminders.list).
reminderIdidA reminder id (from reminders.list or reminders.add).
atdate and timeWith reminderId: the time ahead to push back.
for10m | 1h | evening | tomorrow10m, 1h, evening (18:00) or tomorrow (08:00).
untilobjectA given day and time instead of a preset.
curl https://app.heybmo.com/api/ops/reminders.snooze \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"reminderId":"01a19279-e9c3-7c73-9705-94f082fa3a65","for":"1h"}}'
200 response
{
  "output": {
    "firing": {
      "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
      "reminderId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
      "text": "…",
      "due": {
        "date": "2026-11-09",
        "time": "…"
      },
      "dueAt": "2026-11-09T09:00:00.000Z",
      "firedAt": "2026-11-09T09:00:00.000Z",
      "done": false,
      "snoozedUntil": "2026-11-09T09:00:00.000Z",
      "link": {
        "kind": "…",
        "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "state": "live",
        "title": "…",
        "path": "…",
        "facts": {
          "kind": "progress",
          "left": 0,
          "total": 0
        }
      }
    },
    "firings": [
      {
        "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "reminderId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "text": "…",
        "due": {
          "date": "2026-11-09",
          "time": "…"
        },
        "dueAt": "2026-11-09T09:00:00.000Z",
        "firedAt": "2026-11-09T09:00:00.000Z",
        "done": false,
        "snoozedUntil": "2026-11-09T09:00:00.000Z",
        "link": {
          "kind": "…",
          "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
          "state": "live",
          "title": "…",
          "path": "…",
          "facts": {}
        }
      }
    ],
    "now": {
      "date": "2026-11-09",
      "time": "…",
      "timeZone": "…"
    }
  }
}
WritePOST /api/ops/reminders.bulk

Act on every reminder that matches

Mark done, snooze, pause, resume or restore every reminder or time in a section that matches the filter, up to 200 per call: while next is not null, call again with after: next for the rest. done and snooze act on times (missed, today, upcoming) or on repeating reminders' next time; pause on reminders with times or repeating ones; resume on paused ones; restore on the trash. For a few named ones, use reminders.done, reminders.snooze or reminders.update; to move all that match to the trash, reminders.delete with matching.

MCP tool reminders_bulkCLI heybmo reminders bulkLimit writeInput
matchingrequiredobjectEvery reminder or time in a section that matches the filter.
dorequireddone | snooze | pause | resume | restore
for10m | 1h | evening | tomorrowsnooze: 10m, 1h, evening or tomorrow.
untilobjectsnooze: a given day and time instead.
aftertextnext from the previous call. Up to 100 characters.
curl https://app.heybmo.com/api/ops/reminders.bulk \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"matching":{"section":"missed"},"do":"done"}}'
200 response
{
  "output": {
    "changed": 0,
    "next": "…"
  }
}
DeletePOST /api/ops/reminders.delete

Move reminders to the trash

Move reminders to the trash: they stop firing, and can be restored with reminders.restore for 30 days, then they are deleted for good. Name them (reminderIds), or give matching for every reminder in a section that matches (a batch per call: while next is not null, call again with after: next). To stop one for a while, pause it with reminders.update instead.

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

MCP tool reminders_deleteCLI heybmo reminders deleteLimit deleteSafe to retryInput
reminderIdslist of idUp to 50 items.
matchingobjectInstead of reminderIds: every reminder in a section that matches, up to 200 per call.
aftertextWith matching: next from the previous call. Up to 100 characters.
curl https://app.heybmo.com/api/ops/reminders.delete \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"reminderIds":["01a19279-e9c3-7c73-9705-94f082fa3a65"]}}'
200 response
{
  "output": {
    "deleted": [
      "01a19279-e9c3-7c73-9705-94f082fa3a65"
    ],
    "deletedAt": "2026-11-09T09:00:00.000Z",
    "restoreUntil": "2026-11-09T09:00:00.000Z",
    "next": "…"
  }
}
WritePOST /api/ops/reminders.restore

Restore reminders from the trash

Bring reminders back from the trash; they fire again from their next time (times missed while in the trash are not sent).

MCP tool reminders_restoreCLI heybmo reminders restoreLimit writeSafe to retryInput
reminderIdsrequiredlist of idUp to 50 items.
curl https://app.heybmo.com/api/ops/reminders.restore \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"reminderIds":["01a19279-e9c3-7c73-9705-94f082fa3a65"]}}'
200 response
{
  "output": {
    "reminders": [
      {
        "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "text": "…",
        "when": {
          "repeat": "never",
          "date": "2026-11-09",
          "time": "…"
        },
        "timeZone": "…",
        "followsPerson": false,
        "next": {
          "date": "2026-11-09",
          "time": "…"
        },
        "nextAt": "2026-11-09T09:00:00.000Z",
        "delivery": "default",
        "link": {
          "kind": "…",
          "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
          "state": "live",
          "title": "…",
          "path": "…",
          "facts": {}
        },
        "paused": false,
        "notDone": 0,
        "revision": 0,
        "createdAt": "2026-11-09T09:00:00.000Z",
        "coming": [
          {}
        ]
      }
    ]
  }
}
ReadPOST /api/ops/reminders.trash

List the trash

Reminders in the trash, most recently deleted first, with until when each can be restored, a page at a time with how many there are in all.

MCP tool reminders_trashCLI heybmo reminders trashLimit readSafe to retryInput
limitnumberDefault 50.
cursortextnextCursor from the previous page.
curl https://app.heybmo.com/api/ops/reminders.trash \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{}}'
200 response
{
  "output": {
    "reminders": [
      {
        "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "text": "…",
        "deletedAt": "2026-11-09T09:00:00.000Z",
        "restoreUntil": "2026-11-09T09:00:00.000Z"
      }
    ],
    "nextCursor": "…",
    "total": 0
  }
}
DeletePOST /api/ops/reminders.deleteForever

Delete reminders in the trash for good

Delete reminders that are in the trash for good, with their schedule and the record of when they went off: the ones named (reminderIds), or the whole trash (all: true). It cannot be undone, so ask the person first. Reminders not in the trash are refused: reminders.delete moves a reminder 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 reminders_deleteForeverCLI heybmo reminders deleteForeverLimit deleteSafe to retryInput
reminderIdslist of idReminders in the trash to delete for good (from reminders.trash). Up to 100 items.
alltrue or falsetrue: empty the trash instead, up to 200 per call (call again while left is above 0).
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/reminders.deleteForever \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"reminderIds":["01a19279-e9c3-7c73-9705-94f082fa3a65"]}}'
200 response
{
  "output": {
    "reminders": 0,
    "firings": 0,
    "left": 0
  }
}