Accounting reports

Get an income statement

Builds a profit-and-loss statement over a date range: revenue, expenses, and what is left. Requires the reports:read permission.

GET
https://services.magicdoor.com/accounting/company-portal/reports/income-statement

Authorization

Authorizationstringrequired
Bearer token — Send your API token in the Authorization header as Bearer <token>. Requests without a valid token are rejected with 401 Unauthorized.

Query parameters

basisenum<string>required

cash counts money when it moves; accrual counts it when it is earned or owed. The two give different numbers from the same data.

example: accrualcashaccrual
reportTypeenum<string>required

property reports on the properties' books — what the owners' money did. company reports on the management company's own books. An entry belongs to one or the other, never both.

example: propertypropertycompany
startDatestring · daterequired

First day of the period, read in the company's timezone.

example: 2026-07-01
endDatestring · daterequired

Last day of the period, read in the company's timezone.

example: 2026-07-31
portfolioIdsstring[]

Only these portfolios.

propertyIdsstring[]

Only these properties.

Response

200 · The income statement.

revenueobject

Ordinary income: rent, fees, and anything else in the 4xxxxx band.

expensesobject

Ordinary costs: repairs, management fees, and anything else in the 6xxxxx band.

otherRevenueobject

Income outside normal operations, in the 7xxxxx band.

otherExpensesobject

Costs outside normal operations, in the 8xxxxx band.

netOperatingIncomenumber

revenue.totalAmount minus expenses.totalAmount, as a decimal. Negative when the period lost money on operations.

netOtherOperatingIncomenumber

otherRevenue.totalAmount minus otherExpenses.totalAmount, as a decimal.

netIncomenumber

netOperatingIncome plus netOtherOperatingIncome — the bottom line. Negative for a loss.

400 · `basis`, `reportType`, `startDate` or `endDate` is missing or not a recognised value.

401 · The access token is missing, expired, or not for this company.

403 · The caller does not hold the `reports:read` permission.

FieldHow it is arrived at
netOperatingIncomeThe revenue section less the expenses section — the day-to-day result.
netOtherOperatingIncomeThe other-revenue section less the other-expenses section — everything that is not day-to-day.
netIncomeThe two together: what the period actually made or lost.
The report is computed on the fly

Nothing is stored. Every call rebuilds the report from the ledger as it stands right now, so two calls with the same parameters can differ if anything was posted in between. Only manual journal entries that have been posted are included.