Money you have spent, and how each one was recorded in the books.
2 endpoints, each with the fields it takes and the fields it gives back.
GET/transactions
Lists expenses and bank-feed transactions for one business, newest first.
- Leave
entityIdout only when this key can reach exactly one business. When it can reach several, a call that omits it is refused; callGET /businessesfor the ids. dateFromanddateTomatch the transaction date and include both ends.textmatches the vendor's name only, not the memo or the account.%and_are wildcards in it, because the match runs as a SQLilike.- To read the next page, pass the previous response's
nextCursor. Anullthere means you already have everything.
Needs the transactions:read permission. A Read only key has it.
Query parameters
entityId
Typestring
RequiredOptional
Details
- a uuid
dateFrom
Typestring
RequiredOptional
Details
- a date like 2026-09-20
dateTo
Typestring
RequiredOptional
Details
- a date like 2026-09-20
vendorId
Typestring
RequiredOptional
Details
- a uuid
accountId
Typestring
RequiredOptional
Details
- a uuid
text
Typestring
RequiredOptional
Details
- up to 200 characters
status
Typestring
RequiredOptional
Details
- one of: pending, accepted, edited, uncategorized
minCents
Typestring
RequiredOptional
Details
- digits only, whole cents
maxCents
Typestring
RequiredOptional
Details
- digits only, whole cents
cursor
Typestring
RequiredOptional
Details
- an opaque value from a previous response
limit
Typeinteger
RequiredOptional
Details
- 1 to 100, default 50
| Field | Type | Required | Details |
|---|---|---|---|
| entityId | string | Optional |
|
| dateFrom | string | Optional |
|
| dateTo | string | Optional |
|
| vendorId | string | Optional |
|
| accountId | string | Optional |
|
| text | string | Optional |
|
| status | string | Optional |
|
| minCents | string | Optional |
|
| maxCents | string | Optional |
|
| cursor | string | Optional |
|
| limit | integer | Optional |
|
Request
curl "https://www.numm.io/api/v1/transactions?entityId=0190a1b2-c3d4-7e5f-8a9b-0c1d2e3f1002&dateFrom=2026-01-01&dateTo=2026-01-31&limit=25" \
-H "Authorization: Bearer nmo_live_REPLACE_WITH_YOUR_KEY"Response 200
{
"transactions": [
{
"id": "0190a1b2-c3d4-7e5f-9a9b-0c1d2e3f1006",
"date": "2026-01-10",
"amount": {
"cents": "5000",
"formatted": "$50.00",
"currency": "USD"
},
"vendor": "Office Depot",
"account": "Office Expense",
"status": "accepted",
"source": "email"
}
],
"nextCursor": null
}Response fields
transactions
Typearray of object
PresentAlways
transactions[].id
Typestring
PresentAlways
Details
- a uuid
transactions[].date
Typestring
PresentAlways
Details
- a date like 2026-09-20
transactions[].amount
Typemoney
PresentAlways
Details
- an object:
cents(whole cents as a digit string, in the currency beside it),formatted(a display string, not something to parse),currency(a three-letter code)
transactions[].vendor
Typestring or null
PresentAlways
transactions[].account
Typestring or null
PresentAlways
transactions[].status
Typestring
PresentAlways
Details
- one of: pending, accepted, edited, uncategorized
transactions[].source
Typestring
PresentAlways
Details
- one of: manual, csv, email, ios, reconciliation, financial_connections
nextCursor
Typestring or null
PresentAlways
Details
- an opaque value from a previous response
| Field | Type | Present | Details |
|---|---|---|---|
| transactions | array of object | Always | |
| transactions[].id | string | Always |
|
| transactions[].date | string | Always |
|
| transactions[].amount | money | Always |
|
| transactions[].vendor | string or null | Always | |
| transactions[].account | string or null | Always | |
| transactions[].status | string | Always |
|
| transactions[].source | string | Always |
|
| nextCursor | string or null | Always |
|
Errors
entity_not_allowed
Status403
MeaningYour key is limited to certain businesses, and this is not one of them.
not_found
Status404
MeaningThere is no such record, or none your key can reach.
| Status | Code | Meaning |
|---|---|---|
| 403 | entity_not_allowed | Your key is limited to certain businesses, and this is not one of them. |
| 404 | not_found | There is no such record, or none your key can reach. |
Every endpoint can also return:
invalid_key
Status401
MeaningYour key is missing, malformed, revoked, or expired.
insufficient_scope
Status403
MeaningYour key does not carry the scope this endpoint needs.
rate_limited
Status429
MeaningYou've made too many requests for this key. The retry-after header says how long to wait.
validation_failed
Status422
MeaningSomething in the path, the query, or the body did not pass validation.
internal_error
Status500
MeaningSomething went wrong on our side. Try again.
| Status | Code | Meaning |
|---|---|---|
| 401 | invalid_key | Your key is missing, malformed, revoked, or expired. |
| 403 | insufficient_scope | Your key does not carry the scope this endpoint needs. |
| 429 | rate_limited | You've made too many requests for this key. The retry-after header says how long to wait. |
| 422 | validation_failed | Something in the path, the query, or the body did not pass validation. |
| 500 | internal_error | Something went wrong on our side. Try again. |
GET/transactions/{id}
Returns full detail for one transaction, including how it was recorded in the books.
Needs the transactions:read permission. A Read only key has it.
Path parameters
id
Typestring
RequiredRequired
Details
- a uuid
| Field | Type | Required | Details |
|---|---|---|---|
| id | string | Required |
|
Request
curl "https://www.numm.io/api/v1/transactions/0190a1b2-c3d4-7e5f-9a9b-0c1d2e3f1006" \
-H "Authorization: Bearer nmo_live_REPLACE_WITH_YOUR_KEY"Response 200
{
"id": "0190a1b2-c3d4-7e5f-9a9b-0c1d2e3f1006",
"date": "2026-01-10",
"amount": {
"cents": "5000",
"formatted": "$50.00",
"currency": "USD"
},
"description": "Office supplies",
"vendor": "Office Depot",
"account": "Office Expense",
"status": "accepted",
"source": "email",
"rationale": "Matches prior Office Depot purchases categorized as Office Expense.",
"lines": [
{
"account": "Office Expense",
"debit": {
"cents": "5000",
"formatted": "$50.00",
"currency": "USD"
},
"credit": null
},
{
"account": "Accounts Payable",
"debit": null,
"credit": {
"cents": "5000",
"formatted": "$50.00",
"currency": "USD"
}
}
]
}Response fields
id
Typestring
PresentAlways
Details
- a uuid
date
Typestring
PresentAlways
Details
- a date like 2026-09-20
amount
Typemoney
PresentAlways
Details
- an object:
cents(whole cents as a digit string, in the currency beside it),formatted(a display string, not something to parse),currency(a three-letter code)
description
Typestring or null
PresentAlways
vendor
Typestring or null
PresentAlways
account
Typestring or null
PresentAlways
status
Typestring
PresentAlways
Details
- one of: pending, accepted, edited, uncategorized
source
Typestring
PresentAlways
Details
- one of: manual, csv, email, ios, reconciliation, financial_connections
rationale
Typestring or null
PresentAlways
lines
Typearray of object
PresentAlways
lines[].account
Typestring
PresentAlways
lines[].debit
Typemoney or null
PresentAlways
Details
- an object:
cents(whole cents as a digit string, in the currency beside it),formatted(a display string, not something to parse),currency(a three-letter code)
lines[].credit
Typemoney or null
PresentAlways
Details
- an object:
cents(whole cents as a digit string, in the currency beside it),formatted(a display string, not something to parse),currency(a three-letter code)
| Field | Type | Present | Details |
|---|---|---|---|
| id | string | Always |
|
| date | string | Always |
|
| amount | money | Always |
|
| description | string or null | Always | |
| vendor | string or null | Always | |
| account | string or null | Always | |
| status | string | Always |
|
| source | string | Always |
|
| rationale | string or null | Always | |
| lines | array of object | Always | |
| lines[].account | string | Always | |
| lines[].debit | money or null | Always |
|
| lines[].credit | money or null | Always |
|
Errors
not_found
Status404
MeaningThere is no such record, or none your key can reach.
| Status | Code | Meaning |
|---|---|---|
| 404 | not_found | There is no such record, or none your key can reach. |
Every endpoint can also return:
invalid_key
Status401
MeaningYour key is missing, malformed, revoked, or expired.
insufficient_scope
Status403
MeaningYour key does not carry the scope this endpoint needs.
rate_limited
Status429
MeaningYou've made too many requests for this key. The retry-after header says how long to wait.
validation_failed
Status422
MeaningSomething in the path, the query, or the body did not pass validation.
internal_error
Status500
MeaningSomething went wrong on our side. Try again.
| Status | Code | Meaning |
|---|---|---|
| 401 | invalid_key | Your key is missing, malformed, revoked, or expired. |
| 403 | insufficient_scope | Your key does not carry the scope this endpoint needs. |
| 429 | rate_limited | You've made too many requests for this key. The retry-after header says how long to wait. |
| 422 | validation_failed | Something in the path, the query, or the body did not pass validation. |
| 500 | internal_error | Something went wrong on our side. Try again. |