heybmoDocsOpen HeyBMO

API reference

Debts

People, money lent and borrowed, paybacks and balances.

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

Operations

WritePOST /api/ops/debts.add

Record money lent or borrowed

Record up to 100 debts in one call. Each has a person (a saved name, see debts.people), a way (theyOwe: they owe me; iOwe: I owe them), an amount, a currency (default: the home currency), a day (default: today), an optional due day and note. Paybacks go through debts.payBack, never a new debt the other way. Lending is not spending: nothing is logged in expenses. If the person has no home currency yet, the first currency given becomes it; say so.

MCP tool debts_addCLI heybmo debts addLimit writeInput
debtsrequiredlist of objectUp to 100 items.Each item:
personrequiredtextA saved name, exactly. If the name given is close to saved ones but not the same, ask which person they mean instead of choosing one. Up to 60 characters.
wayrequiredtheyOwe | iOwetheyOwe: the person owes me (I lent). iOwe: I owe the person (I borrowed).
amountrequirednumberHow much, in the currency’s normal units (45.5 means 45.50), always positive.
currencytextA three-letter currency code (ISO 4217), e.g. MAD, USD, EUR, GBP. A currency named without its country is the home currency when the names match; otherwise ask which one.
daydateA day, as YYYY-MM-DD.
dueDaydateThe day it should be paid back by (an event fires that day).
notetextDefault "". Up to 500 characters.
ratenumberThe rate really used: units of the home currency per one unit of this currency. Without it, the stored rate of that day is used.
addMissingPeopletrue or falseAdd people who are not saved yet instead of refusing them. Default false.
curl https://app.heybmo.com/api/ops/debts.add \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"debts":[{"person":"Nadia","way":"theyOwe","amount":500,"note":"Concert tickets"}]}}'
200 response
{
  "output": {
    "debts": [
      {
        "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "person": "…",
        "personId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "way": "theyOwe",
        "amount": 0,
        "currency": "…",
        "paid": 0,
        "left": 0,
        "homeAmount": 0,
        "homeCurrency": "…",
        "rate": 0,
        "rateSource": "same",
        "day": "2026-11-09",
        "dueDay": "2026-11-09",
        "note": "…",
        "status": "open",
        "closedAt": "2026-11-09T09:00:00.000Z",
        "paybacks": [
          {}
        ],
        "revision": 0,
        "createdAt": "2026-11-09T09:00:00.000Z",
        "updatedAt": "2026-11-09T09:00:00.000Z"
      }
    ],
    "homeCurrency": "…",
    "homeCurrencySet": false
  }
}
WritePOST /api/ops/debts.update

Change debts

Change up to 100 debts: person, way, amount, currency, day, due day (null clears it), note, or the rate really used (null goes back to the day’s stored rate). Only what is given changes. A payback is not a change: use debts.payBack.

MCP tool debts_updateCLI heybmo debts updateLimit writeInput
debtsrequiredlist of objectUp to 100 items.Each item:
debtIdrequiredidA debt id (from debts.list or debts.add).
revisionnumberThe revision you last read. If it changed since, the change is refused so nothing is overwritten.
persontextA saved name, exactly. If the name given is close to saved ones but not the same, ask which person they mean instead of choosing one. Up to 60 characters.
waytheyOwe | iOwetheyOwe: the person owes me (I lent). iOwe: I owe the person (I borrowed).
amountnumberHow much, in the currency’s normal units (45.5 means 45.50), always positive.
currencytextA three-letter currency code (ISO 4217), e.g. MAD, USD, EUR, GBP. A currency named without its country is the home currency when the names match; otherwise ask which one.
daydateA day, as YYYY-MM-DD.
dueDaydate or null
notetextUp to 500 characters.
ratenumber or null
addMissingPeopletrue or falseAdd people who are not saved yet instead of refusing them. Default false.
curl https://app.heybmo.com/api/ops/debts.update \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"debts":[{"debtId":"01a19279-e9c3-7c73-9705-94f082fa3a65","amount":450}]}}'
200 response
{
  "output": {
    "debts": [
      {
        "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "person": "…",
        "personId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "way": "theyOwe",
        "amount": 0,
        "currency": "…",
        "paid": 0,
        "left": 0,
        "homeAmount": 0,
        "homeCurrency": "…",
        "rate": 0,
        "rateSource": "same",
        "day": "2026-11-09",
        "dueDay": "2026-11-09",
        "note": "…",
        "status": "open",
        "closedAt": "2026-11-09T09:00:00.000Z",
        "paybacks": [
          {}
        ],
        "revision": 0,
        "createdAt": "2026-11-09T09:00:00.000Z",
        "updatedAt": "2026-11-09T09:00:00.000Z"
      }
    ]
  }
}
ReadPOST /api/ops/debts.list

List or search debts

Debts with their paybacks, newest first (or oldest first), filtered by person, way, status (open by default), due days, currency, words in the note or ids. For who owes what in total use debts.balances instead of adding up pages.

MCP tool debts_listCLI heybmo debts listLimit readSafe to retryInput
persontextOnly this person (a saved name). Up to 60 characters.
personIdidOnly this person, by id.
waytheyOwe | iOwetheyOwe: the person owes me (I lent). iOwe: I owe the person (I borrowed).
statusopen | closed | allopen (default), closed or all. Default "open".
dueAfterdateOnly debts due on or after this day.
dueBeforedateOnly debts due on or before this day.
currencytextOnly debts in this currency.
querytextWords in the note. Up to 200 characters.
debtIdslist of idOnly these debts, by id (with status all to find closed ones too). Up to 100 items.
ordernewest | oldestnewest first (default) or oldest first, by day. Default "newest".
limitnumberDefault 50.
cursortextnextCursor from the previous page.
curl https://app.heybmo.com/api/ops/debts.list \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"person":"Nadia"}}'
200 response
{
  "output": {
    "debts": [
      {
        "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "person": "…",
        "personId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "way": "theyOwe",
        "amount": 0,
        "currency": "…",
        "paid": 0,
        "left": 0,
        "homeAmount": 0,
        "homeCurrency": "…",
        "rate": 0,
        "rateSource": "same",
        "day": "2026-11-09",
        "dueDay": "2026-11-09",
        "note": "…",
        "status": "open",
        "closedAt": "2026-11-09T09:00:00.000Z",
        "paybacks": [
          {}
        ],
        "revision": 0,
        "createdAt": "2026-11-09T09:00:00.000Z",
        "updatedAt": "2026-11-09T09:00:00.000Z"
      }
    ],
    "total": 0,
    "nextCursor": "…",
    "homeCurrency": "…",
    "waitingForRates": 0
  }
}
ReadPOST /api/ops/debts.balances

Who owes what

What each person still owes me and what I still owe them, and the difference, over open debts, in the home currency (each debt at the rate of its day), plus the totals. One call answers how much one person owes, or who still owes money.

MCP tool debts_balancesCLI heybmo debts balancesLimit readSafe to retryInput
persontextOnly this person (a saved name). Up to 60 characters.
curl https://app.heybmo.com/api/ops/debts.balances \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{}}'
200 response
{
  "output": {
    "theyOwe": 0,
    "iOwe": 0,
    "net": 0,
    "openDebts": 0,
    "currency": "…",
    "people": [
      {
        "theyOwe": 0,
        "iOwe": 0,
        "net": 0,
        "openDebts": 0,
        "person": "…",
        "personId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "nextDueDay": "2026-11-09"
      }
    ],
    "waitingForRates": 0
  }
}
ReadPOST /api/ops/debts.balanceHistory

Who owed what on past days

Where things stood at the end of past days: what was still owed to me, what I still owed, and the difference. Give up to 12 days, such as month ends; amounts are in the home currency, each debt at the rate of its day, and a closed debt counts until the day it closed. For today use debts.balances.

MCP tool debts_balanceHistoryCLI heybmo debts balanceHistoryLimit readSafe to retryInput
daysrequiredlist of dateThe days to answer for, oldest first or in any order. Up to 12 items.
curl https://app.heybmo.com/api/ops/debts.balanceHistory \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"days":["2026-09-30","2026-10-31"]}}'
200 response
{
  "output": {
    "currency": "…",
    "points": [
      {
        "day": "2026-11-09",
        "theyOwe": 0,
        "iOwe": 0,
        "net": 0
      }
    ],
    "waitingForRates": 0
  }
}
ReadPOST /api/ops/debts.history

What happened with a person

Everything that happened on the debts with one person, newest first: money lent or borrowed, each payback, and what was forgiven. Debts in the trash are left out.

MCP tool debts_historyCLI heybmo debts historyLimit readSafe to retryInput
personIdrequiredidA person id (from debts.people).
limitnumberDefault 50.
cursortextnextCursor from the previous page.
curl https://app.heybmo.com/api/ops/debts.history \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"personId":"01a19279-e9c3-7c73-9705-94f082fa3a65"}}'
200 response
{
  "output": {
    "events": [
      {
        "day": "2026-11-09",
        "kind": "lent",
        "debtId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "paybackId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "note": "…",
        "amount": 0,
        "currency": "…",
        "homeAmount": 0,
        "homeCurrency": "…"
      }
    ],
    "total": 0,
    "nextCursor": "…"
  }
}
WritePOST /api/ops/debts.payBack

Record a payback

Record money paid back, in part or in full, by them or by me. Name the debt (debtId) or the person; with a person, it goes to their oldest open debts first (the answer says which), the way given (theyOwe: they paid me; iOwe: I paid them; needed only when debts go both ways). The amount is in the debt’s currency and can never be more than what is left (refused with what is left). A debt closes by itself when nothing is left.

MCP tool debts_payBackCLI heybmo debts payBackLimit writeInput
paybacksrequiredlist of objectUp to 100 items.Each item:
debtIdidA debt id (from debts.list or debts.add).
persontextA saved name, exactly. If the name given is close to saved ones but not the same, ask which person they mean instead of choosing one. Up to 60 characters.
waytheyOwe | iOwetheyOwe: the person owes me (I lent). iOwe: I owe the person (I borrowed).
amountrequirednumberHow much, in the currency’s normal units (45.5 means 45.50), always positive.
currencytextThe debt’s currency (default: that of the oldest open debt).
daydateA day, as YYYY-MM-DD.
notetextDefault "". Up to 500 characters.
curl https://app.heybmo.com/api/ops/debts.payBack \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"paybacks":[{"person":"Nadia","amount":200}]}}'
200 response
{
  "output": {
    "recorded": [
      {
        "paybackId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "debtId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "amount": 0,
        "currency": "…"
      }
    ],
    "debts": [
      {
        "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "person": "…",
        "personId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "way": "theyOwe",
        "amount": 0,
        "currency": "…",
        "paid": 0,
        "left": 0,
        "homeAmount": 0,
        "homeCurrency": "…",
        "rate": 0,
        "rateSource": "same",
        "day": "2026-11-09",
        "dueDay": "2026-11-09",
        "note": "…",
        "status": "open",
        "closedAt": "2026-11-09T09:00:00.000Z",
        "paybacks": [
          {}
        ],
        "revision": 0,
        "createdAt": "2026-11-09T09:00:00.000Z",
        "updatedAt": "2026-11-09T09:00:00.000Z"
      }
    ]
  }
}
DeletePOST /api/ops/debts.removePayback

Remove a payback

Remove a payback recorded by mistake, for good. Its debt owes that amount again, and reopens if it had closed as paid.

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 debts_removePaybackCLI heybmo debts removePaybackLimit deleteSafe to retryInput
paybackIdrequiredidA payback id (from a debt’s paybacks).
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/debts.removePayback \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"paybackId":"01a1927a-1071-7a71-994f-4180839c9a39"}}'
200 response
{
  "output": {
    "debt": {
      "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
      "person": "…",
      "personId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
      "way": "theyOwe",
      "amount": 0,
      "currency": "…",
      "paid": 0,
      "left": 0,
      "homeAmount": 0,
      "homeCurrency": "…",
      "rate": 0,
      "rateSource": "same",
      "day": "2026-11-09",
      "dueDay": "2026-11-09",
      "note": "…",
      "status": "open",
      "closedAt": "2026-11-09T09:00:00.000Z",
      "paybacks": [
        {
          "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
          "amount": 0,
          "day": "2026-11-09",
          "note": "…"
        }
      ],
      "revision": 0,
      "createdAt": "2026-11-09T09:00:00.000Z",
      "updatedAt": "2026-11-09T09:00:00.000Z"
    }
  }
}
WritePOST /api/ops/debts.forgive

Forgive debts

Close open debts without full payback; they stay listed as forgiven with their paybacks. undo: true reopens forgiven ones.

MCP tool debts_forgiveCLI heybmo debts forgiveLimit writeSafe to retryInput
debtIdsrequiredlist of idUp to 100 items.
undotrue or falseDefault false.
curl https://app.heybmo.com/api/ops/debts.forgive \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"debtIds":["01a19279-e9c3-7c73-9705-94f082fa3a65"]}}'
200 response
{
  "output": {
    "debts": [
      {
        "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "person": "…",
        "personId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "way": "theyOwe",
        "amount": 0,
        "currency": "…",
        "paid": 0,
        "left": 0,
        "homeAmount": 0,
        "homeCurrency": "…",
        "rate": 0,
        "rateSource": "same",
        "day": "2026-11-09",
        "dueDay": "2026-11-09",
        "note": "…",
        "status": "open",
        "closedAt": "2026-11-09T09:00:00.000Z",
        "paybacks": [
          {}
        ],
        "revision": 0,
        "createdAt": "2026-11-09T09:00:00.000Z",
        "updatedAt": "2026-11-09T09:00:00.000Z"
      }
    ]
  }
}
ReadPOST /api/ops/debts.people

List people

The people debts are with (names only, never HeyBMO accounts), with where you stand with each in the home currency: people with open debts first, the biggest difference first, then by name. Each has the earliest due day of their open debts. Search by name with query; open keeps only people with open debts. Archived people are left out unless archived is include or only. Use these names when recording debts and paybacks.

MCP tool debts_peopleCLI heybmo debts peopleLimit readSafe to retryInput
querytextLetters in the name. Up to 60 characters.
archivedhide | include | onlyhide archived people (default), include them, or only them. Default "hide".
personIdidOnly this person.
opentrue or falsetrue: only people with open debts. Default false.
limitnumberDefault 50.
cursortextnextCursor from the previous page.
curl https://app.heybmo.com/api/ops/debts.people \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{}}'
200 response
{
  "output": {
    "people": [
      {
        "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "name": "…",
        "archived": false,
        "theyOwe": 0,
        "iOwe": 0,
        "net": 0,
        "openDebts": 0,
        "nextDueDay": "2026-11-09"
      }
    ],
    "total": 0,
    "archived": 0,
    "currency": "…",
    "nextCursor": "…",
    "waitingForRates": 0
  }
}
WritePOST /api/ops/debts.addPerson

Add a person

Save someone debts can be with. debts.add can also add people as it records (addMissingPeople).

MCP tool debts_addPersonCLI heybmo debts addPersonLimit writeInput
namerequiredtextUp to 60 characters.
curl https://app.heybmo.com/api/ops/debts.addPerson \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"name":"Lina"}}'
200 response
{
  "output": {
    "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
    "name": "…",
    "archived": false
  }
}
WritePOST /api/ops/debts.updatePerson

Rename or archive a person

Rename a person (their debts follow) or archive them: no longer offered, their debts kept. archived: false brings them back. Two names for the same person: debts.mergePeople.

MCP tool debts_updatePersonCLI heybmo debts updatePersonLimit writeSafe to retryInput
personIdrequiredidA person id (from debts.people).
nametextUp to 60 characters.
archivedtrue or false
curl https://app.heybmo.com/api/ops/debts.updatePerson \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"personId":"01a19279-e9c3-7c73-9705-94f082fa3a65","name":"Nadia"}}'
200 response
{
  "output": {
    "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
    "name": "…",
    "archived": false
  }
}
WritePOST /api/ops/debts.mergePeople

Merge two names for one person

When two saved names turn out to be the same person: every debt of personId moves to intoPersonId, then personId is removed. Check with the person first: names that only look alike are often different people.

MCP tool debts_mergePeopleCLI heybmo debts mergePeopleLimit writeInput
personIdrequiredidThe name to remove (its debts move).
intoPersonIdrequiredidThe name to keep.
curl https://app.heybmo.com/api/ops/debts.mergePeople \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"personId":"01a19279-e9c3-7c73-9705-94f082fa3a65","intoPersonId":"01a1927a-1071-7a71-994f-4180839c9a39"}}'
200 response
{
  "output": {
    "person": {
      "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
      "name": "…",
      "archived": false
    },
    "debtsMoved": 0
  }
}
DeletePOST /api/ops/debts.delete

Move debts to the trash

Move debts (with their paybacks) to the trash. They no longer count in balances, and can be restored with debts.restore for 30 days, then they are deleted for good. To close a debt without payback, use debts.forgive instead.

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

MCP tool debts_deleteCLI heybmo debts deleteLimit deleteSafe to retryInput
debtIdsrequiredlist of idUp to 100 items.
curl https://app.heybmo.com/api/ops/debts.delete \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"debtIds":["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"
  }
}
WritePOST /api/ops/debts.restore

Restore debts from the trash

Bring debts back from the trash; they count in balances again.

MCP tool debts_restoreCLI heybmo debts restoreLimit writeSafe to retryInput
debtIdsrequiredlist of idUp to 100 items.
curl https://app.heybmo.com/api/ops/debts.restore \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"debtIds":["01a19279-e9c3-7c73-9705-94f082fa3a65"]}}'
200 response
{
  "output": {
    "debts": [
      {
        "id": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "person": "…",
        "personId": "01a19279-e9c3-7c73-9705-94f082fa3a65",
        "way": "theyOwe",
        "amount": 0,
        "currency": "…",
        "paid": 0,
        "left": 0,
        "homeAmount": 0,
        "homeCurrency": "…",
        "rate": 0,
        "rateSource": "same",
        "day": "2026-11-09",
        "dueDay": "2026-11-09",
        "note": "…",
        "status": "open",
        "closedAt": "2026-11-09T09:00:00.000Z",
        "paybacks": [
          {}
        ],
        "revision": 0,
        "createdAt": "2026-11-09T09:00:00.000Z",
        "updatedAt": "2026-11-09T09:00:00.000Z"
      }
    ]
  }
}
ReadPOST /api/ops/debts.trash

List the trash

Debts in the trash, most recently deleted first, with until when each can be restored. Pass nextCursor back as cursor for the next page.

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

Delete debts in the trash for good

Delete debts that are in the trash for good, with their paybacks: the ones named (debtIds), or the whole trash (all: true). It cannot be undone, so ask the person first. Debts not in the trash are refused: debts.delete moves a debt 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 debts_deleteForeverCLI heybmo debts deleteForeverLimit deleteSafe to retryInput
debtIdslist of idDebts in the trash to delete for good (from debts.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/debts.deleteForever \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"debtIds":["01a19279-e9c3-7c73-9705-94f082fa3a65"]}}'
200 response
{
  "output": {
    "debts": 0
  }
}
DeletePOST /api/ops/debts.deletePerson

Delete a person for good

Delete a person for good, with any of their debts that are in the trash. Refused while they still have debts outside the trash. It cannot be undone, so ask the person first; to just hide someone, archive them with debts.updatePerson.

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 debts_deletePersonCLI heybmo debts deletePersonLimit deleteSafe to retryInput
personIdrequiredidA person id (from debts.people).
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/debts.deletePerson \
  -H "Authorization: Bearer $HEYBMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"personId":"01a19279-e9c3-7c73-9705-94f082fa3a65"}}'
200 response
{
  "output": {
    "debts": 0
  }
}