Skip to content

The five statements an owner or an accountant asks for.

5 endpoints, each with the fields it takes and the fields it gives back.

GET/reports/profit-and-loss

Returns the profit and loss statement for one business over a date range.

  • Leave entityId out only when this key can reach exactly one business. When it can reach several, a call that omits it is refused; call GET /businesses for the ids.
  • prior is the calendar month before the month periodStart falls in, whatever range you ask for.
  • An account with no activity in either period is left out.
  • Figures follow the business's own accounting basis. basis in the response says which one.

Needs the reports:read permission. A Read only key has it.

Query parameters

entityId
Typestring
RequiredOptional
Details
  • a uuid
periodStart
Typestring
RequiredRequired
Details
  • a date like 2026-09-20
periodEnd
Typestring
RequiredRequired
Details
  • a date like 2026-09-20
Request
curl "https://www.numm.io/api/v1/reports/profit-and-loss?entityId=0190a1b2-c3d4-7e5f-8a9b-0c1d2e3f1002&periodStart=2026-01-01&periodEnd=2026-01-31" \
  -H "Authorization: Bearer nmo_live_REPLACE_WITH_YOUR_KEY"
Response 200
{
  "entity": "Acme Co",
  "basis": "accrual",
  "period": {
    "start": "2026-01-01",
    "end": "2026-01-31"
  },
  "rows": [
    {
      "account": "Consulting Revenue",
      "type": "revenue",
      "depth": 1,
      "isTotal": false,
      "amount": {
        "cents": "10000",
        "formatted": "$100.00",
        "currency": "USD"
      },
      "prior": {
        "cents": "0",
        "formatted": "$0.00",
        "currency": "USD"
      }
    },
    {
      "account": "Total revenue",
      "type": "total",
      "depth": 0,
      "isTotal": true,
      "amount": {
        "cents": "10000",
        "formatted": "$100.00",
        "currency": "USD"
      },
      "prior": {
        "cents": "0",
        "formatted": "$0.00",
        "currency": "USD"
      }
    }
  ],
  "totals": {
    "revenue": {
      "cents": "10000",
      "formatted": "$100.00",
      "currency": "USD"
    },
    "expenses": {
      "cents": "0",
      "formatted": "$0.00",
      "currency": "USD"
    },
    "netIncome": {
      "cents": "10000",
      "formatted": "$100.00",
      "currency": "USD"
    }
  },
  "prior": {
    "revenue": {
      "cents": "0",
      "formatted": "$0.00",
      "currency": "USD"
    },
    "expenses": {
      "cents": "0",
      "formatted": "$0.00",
      "currency": "USD"
    },
    "netIncome": {
      "cents": "0",
      "formatted": "$0.00",
      "currency": "USD"
    }
  }
}

Response fields

entity
Typestring
PresentAlways
basis
Typestring
PresentAlways
Details
  • one of: cash, accrual
period
Typeobject
PresentAlways
period.start
Typestring
PresentAlways
Details
  • a date like 2026-09-20
period.end
Typestring
PresentAlways
Details
  • a date like 2026-09-20
rows
Typearray of object
PresentAlways
rows[].account
Typestring
PresentAlways
rows[].type
Typestring
PresentAlways
Details
  • one of: revenue, expense, total
rows[].depth
Typeinteger
PresentAlways
rows[].isTotal
Typeboolean
PresentAlways
rows[].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)
rows[].prior
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)
totals
Typeobject
PresentAlways
totals.revenue
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)
totals.expenses
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)
totals.netIncome
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)
prior
Typeobject
PresentAlways
prior.revenue
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)
prior.expenses
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)
prior.netIncome
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)

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.

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.

GET/reports/balance-sheet

Returns the balance sheet for one business as of a date.

  • Leave entityId out only when this key can reach exactly one business. When it can reach several, a call that omits it is refused; call GET /businesses for the ids.
  • asOf is required. The report is the position as of that date.
  • Figures follow the business's own accounting basis. basis in the response says which one.

Needs the reports:read permission. A Read only key has it.

Query parameters

entityId
Typestring
RequiredOptional
Details
  • a uuid
asOf
Typestring
RequiredRequired
Details
  • a date like 2026-09-20
Request
curl "https://www.numm.io/api/v1/reports/balance-sheet?entityId=0190a1b2-c3d4-7e5f-8a9b-0c1d2e3f1002&asOf=2026-01-31" \
  -H "Authorization: Bearer nmo_live_REPLACE_WITH_YOUR_KEY"
Response 200
{
  "entity": "Acme Co",
  "basis": "accrual",
  "asOf": "2026-01-31",
  "rows": [
    {
      "account": "Total assets",
      "type": "total",
      "depth": 0,
      "isTotal": true,
      "amount": {
        "cents": "0",
        "formatted": "$0.00",
        "currency": "USD"
      }
    }
  ],
  "totals": {
    "assets": {
      "cents": "0",
      "formatted": "$0.00",
      "currency": "USD"
    },
    "liabilities": {
      "cents": "0",
      "formatted": "$0.00",
      "currency": "USD"
    },
    "equity": {
      "cents": "0",
      "formatted": "$0.00",
      "currency": "USD"
    }
  }
}

Response fields

entity
Typestring
PresentAlways
basis
Typestring
PresentAlways
Details
  • one of: cash, accrual
asOf
Typestring
PresentAlways
Details
  • a date like 2026-09-20
rows
Typearray of object
PresentAlways
rows[].account
Typestring
PresentAlways
rows[].type
Typestring
PresentAlways
Details
  • one of: asset, liability, equity, total
rows[].depth
Typeinteger
PresentAlways
rows[].isTotal
Typeboolean
PresentAlways
rows[].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)
totals
Typeobject
PresentAlways
totals.assets
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)
totals.liabilities
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)
totals.equity
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)

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.

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.

GET/reports/trial-balance

Lists every account's balance as of a date; accountants ask for this.

  • Leave entityId out only when this key can reach exactly one business. When it can reach several, a call that omits it is refused; call GET /businesses for the ids.
  • asOf is required. The report is the position as of that date.
  • Figures follow the business's own accounting basis. basis in the response says which one.

Needs the reports:read permission. A Read only key has it.

Query parameters

entityId
Typestring
RequiredOptional
Details
  • a uuid
asOf
Typestring
RequiredRequired
Details
  • a date like 2026-09-20
Request
curl "https://www.numm.io/api/v1/reports/trial-balance?entityId=0190a1b2-c3d4-7e5f-8a9b-0c1d2e3f1002&asOf=2026-01-31" \
  -H "Authorization: Bearer nmo_live_REPLACE_WITH_YOUR_KEY"
Response 200
{
  "entity": "Acme Co",
  "basis": "accrual",
  "asOf": "2026-01-31",
  "rows": [
    {
      "account": "Office Expense",
      "debit": {
        "cents": "5000",
        "formatted": "$50.00",
        "currency": "USD"
      },
      "credit": {
        "cents": "0",
        "formatted": "$0.00",
        "currency": "USD"
      }
    }
  ],
  "totals": {
    "debit": {
      "cents": "5000",
      "formatted": "$50.00",
      "currency": "USD"
    },
    "credit": {
      "cents": "5000",
      "formatted": "$50.00",
      "currency": "USD"
    }
  }
}

Response fields

entity
Typestring
PresentAlways
basis
Typestring
PresentAlways
Details
  • one of: cash, accrual
asOf
Typestring
PresentAlways
Details
  • a date like 2026-09-20
rows
Typearray of object
PresentAlways
rows[].account
Typestring
PresentAlways
rows[].debit
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)
rows[].credit
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)
totals
Typeobject
PresentAlways
totals.debit
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)
totals.credit
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)

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.

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.

GET/reports/ar-aging

Returns unpaid customer invoices bucketed by how overdue they are.

  • Leave entityId out only when this key can reach exactly one business. When it can reach several, a call that omits it is refused; call GET /businesses for the ids.
  • asOf defaults to the current date in UTC.
  • buckets and grandTotal cover every unpaid invoice. items lists only the 25 largest by balance.
  • current means not yet overdue, and daysOverdue is negative for something not yet due. The other buckets are 1 to 30, 31 to 60, 61 to 90, and more than 90 days past due.

Needs the reports:read permission. A Read only key has it.

Query parameters

entityId
Typestring
RequiredOptional
Details
  • a uuid
asOf
Typestring
RequiredOptional
Details
  • a date like 2026-09-20
Request
curl "https://www.numm.io/api/v1/reports/ar-aging?entityId=0190a1b2-c3d4-7e5f-8a9b-0c1d2e3f1002" \
  -H "Authorization: Bearer nmo_live_REPLACE_WITH_YOUR_KEY"
Response 200
{
  "buckets": {
    "current": {
      "cents": "10000",
      "formatted": "$100.00",
      "currency": "USD"
    },
    "d1_30": {
      "cents": "0",
      "formatted": "$0.00",
      "currency": "USD"
    },
    "d31_60": {
      "cents": "0",
      "formatted": "$0.00",
      "currency": "USD"
    },
    "d61_90": {
      "cents": "0",
      "formatted": "$0.00",
      "currency": "USD"
    },
    "d90plus": {
      "cents": "0",
      "formatted": "$0.00",
      "currency": "USD"
    }
  },
  "grandTotal": {
    "cents": "10000",
    "formatted": "$100.00",
    "currency": "USD"
  },
  "items": [
    {
      "id": "0190a1b2-c3d4-7e5f-9a9b-0c1d2e3f1007",
      "customerOrVendor": "Acme Co",
      "number": 1,
      "dueDate": "2026-06-15",
      "daysOverdue": -10,
      "balance": {
        "cents": "10000",
        "formatted": "$100.00",
        "currency": "USD"
      }
    }
  ]
}

Response fields

buckets
Typeobject
PresentAlways
buckets.current
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)
buckets.d1_30
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)
buckets.d31_60
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)
buckets.d61_90
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)
buckets.d90plus
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)
grandTotal
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)
items
Typearray of object
PresentAlways
items[].id
Typestring
PresentAlways
Details
  • a uuid
items[].customerOrVendor
Typestring
PresentAlways
items[].dueDate
Typestring
PresentAlways
Details
  • a date like 2026-09-20
items[].daysOverdue
Typeinteger
PresentAlways
items[].balance
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)
items[].number
Typeinteger
PresentAlways

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.

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.

GET/reports/ap-aging

Returns what one business owes, bucketed by how long it has been outstanding.

  • Leave entityId out only when this key can reach exactly one business. When it can reach several, a call that omits it is refused; call GET /businesses for the ids.
  • This counts reimbursements that have been approved and not yet paid, and accepted expenses that are not reimbursable and did not come from a bank feed.
  • asOf defaults to the current date in UTC.
  • buckets and grandTotal cover everything owed. items lists only the 25 largest by balance.
  • daysOverdue here counts days since the expense's date or the reimbursement's approval, not days past a due date, and dueDate carries that same date. current covers anything dated on or after asOf. The other buckets are 1 to 30, 31 to 60, 61 to 90, and more than 90 days outstanding.

Needs the reports:read permission. A Read only key has it.

Query parameters

entityId
Typestring
RequiredOptional
Details
  • a uuid
asOf
Typestring
RequiredOptional
Details
  • a date like 2026-09-20
Request
curl "https://www.numm.io/api/v1/reports/ap-aging?entityId=0190a1b2-c3d4-7e5f-8a9b-0c1d2e3f1002" \
  -H "Authorization: Bearer nmo_live_REPLACE_WITH_YOUR_KEY"
Response 200
{
  "buckets": {
    "current": {
      "cents": "0",
      "formatted": "$0.00",
      "currency": "USD"
    },
    "d1_30": {
      "cents": "5000",
      "formatted": "$50.00",
      "currency": "USD"
    },
    "d31_60": {
      "cents": "0",
      "formatted": "$0.00",
      "currency": "USD"
    },
    "d61_90": {
      "cents": "0",
      "formatted": "$0.00",
      "currency": "USD"
    },
    "d90plus": {
      "cents": "0",
      "formatted": "$0.00",
      "currency": "USD"
    }
  },
  "grandTotal": {
    "cents": "5000",
    "formatted": "$50.00",
    "currency": "USD"
  },
  "items": [
    {
      "id": "0190a1b2-c3d4-7e5f-9a9b-0c1d2e3f1008",
      "customerOrVendor": "Office Depot",
      "number": null,
      "dueDate": "2026-02-05",
      "daysOverdue": 5,
      "balance": {
        "cents": "5000",
        "formatted": "$50.00",
        "currency": "USD"
      }
    }
  ]
}

Response fields

buckets
Typeobject
PresentAlways
buckets.current
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)
buckets.d1_30
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)
buckets.d31_60
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)
buckets.d61_90
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)
buckets.d90plus
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)
grandTotal
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)
items
Typearray of object
PresentAlways
items[].id
Typestring
PresentAlways
Details
  • a uuid
items[].customerOrVendor
Typestring
PresentAlways
items[].dueDate
Typestring
PresentAlways
Details
  • a date like 2026-09-20
items[].daysOverdue
Typeinteger
PresentAlways
items[].balance
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)
items[].number
Typenull
PresentAlways
Details
  • always null

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.

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.
Reports — Nummio API