Reports

Rent roll report

Lists every unit with the lease on it, the tenants living there, the rent and any subsidy. One row is one unit, grouped under its property and portfolio, and a unit with no lease shows as vacant.

GET
https://api.portal.magicdoor.com/company-app/reports/rent-roll

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

portfolioIdsstring[]

Narrow the report to these portfolios. Repeat the parameter once per id. An id that does not exist returns 404.

propertyIdsstring[]

Narrow the report to these properties. Repeat the parameter once per id. An id that does not exist returns 404.

ownerIdsstring[]

Narrow the report to properties these owners have a stake in. Repeat the parameter once per id. An id that does not exist returns 404.

includeEmptyUnitsboolean

Whether to list units that have no lease on them.

default: true
includeEmptyPropertiesboolean

Whether to list properties that have no units to show.

default: false
includeDeactivatedUnitsboolean

Whether to list units that have been deactivated.

default: false

Response

200 · The rent roll, grouped by property.

groupsobject[]

One group per property.

metadataobject

Totals across every row in the report.

customFieldsobject[]

The custom field definitions the rows' values belong to. Read options.type here to know which value property to read on each row.

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

404 · A portfolio, property or owner id in the query does not exist in the caller's company.

How scoping works

portfolioIds, propertyIds and ownerIds are all resolved down to one set of properties, and they narrow each other rather than adding up. Sending a portfolio and a property that is not in it returns nothing. Sending none of the three covers every property in the company.

Custom field values have no fixed type

customFieldValues on a row carries whatever the company defined. Look the value's customFieldId up in the report's own customFields array, read options.type there, and then read stringValue, numberValue, booleanValue, dateTimeValue or referenceValue off the value accordingly.

occupancyRate is a fraction, not a percentage: 0.92 means 92 per cent.