Accounting dashboard

Get returns and disputes

Returns the tenant payments from the last 30 days that came back — bank-returned ACH payments and card chargebacks — with the unit and property behind each one.

GET
https://services.magicdoor.com/accounting/company-portal/dashboard/returns-and-disputes

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

skipCacheboolean

Set true to recompute instead of reading the cached figure. The fresh result is still written back to the cache, which holds for an hour.

default: false

Response

200 · The two groups, each newest first. The numeric ids are left out of this example — the code block above shows how they appear on the wire.

returnsobject

ACH payments the bank sent back.

disputesobject

Card payments under or past a chargeback. Same shape as returns, with paymentMethod of creditCard or debitCard and status of disputing or disputed.

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

403 · The access token is not for a property manager.

GroupWhat lands in it
returnsIncoming ACH payments in the last 30 days whose status is returned — the bank rejected the transfer.
disputesIncoming card payments, credit or debit, in the last 30 days whose status is disputing or disputed — a chargeback in progress or already settled.
A plain JSON.parse will corrupt these ids

transactionId, linkedTransactionId, leaseId, unitId and propertyId are serialised as numbers here, unlike every other endpoint in this API where ids are decimal strings. They are 19-digit Snowflakes, which is more precision than a JavaScript number holds, so JSON.parse silently rounds them and hands you an id that does not exist. Read this response with a big-integer-aware parser, or match the rows up by amount and date and take the ids from another endpoint.

One item, on the wire
{
  "transactionId": 1830472847398412103,
  "amount": 1850.00,
  "transactionDate": "2026-08-12T00:00:00+00:00",
  "status": "returned",
  "paymentMethod": "ach",
  "linkedTransactionId": 1830472847398412047,
  "leaseId": 1830472847398404503,
  "unitId": 1830472847398404502,
  "unitName": "4B",
  "propertyId": 1830472847398404501,
  "propertyName": "Sunset Apartments"
}

The response example below leaves the numeric ids out, because writing them into this page's own JSON would round them exactly the way your parser will. The block above shows them as the server actually sends them.

Cached

The answer is cached per company for an hour, so it can lag activity by that much. Pass skipCache=true to force a recompute.