Chart of accounts

Create a chart of account

Adds an account to the company's chart of accounts and returns it. Leave number out and the next free number in the band for type is assigned. Requires the chart_of_accounts:write permission.

POST
https://services.magicdoor.com/accounting/company-portal/chart-of-accounts

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.

Body

application/json

The combination of name, type and parentId must be unique within the company, comparing names case-insensitively.

typeenum<string>required

Which side of the books the account sits on. It cannot be changed afterwards.

example: expenseassetequityliabilityrevenueexpenseotherRevenueotherExpense
namestringrequired

Display name, 1 to 200 characters.

example: Landscaping
numberinteger

The account number to use, between 100000 and 899999. Must not already be taken by a company account or a built-in one. Omit it and MagicDoor picks the next free number in the band for type.

descriptionstring

Free-text note, up to 500 characters.

parentIdstring

Id of the account this one rolls up into. It must be visible to the company and have the same type.

Response

200 · The account that was created.

idstring

Identifier of the account. Accounts the company created have a Snowflake id; MagicDoor's built-in accounts have the six-digit account number as their id, so "110000" is both the id and the number of the built-in Cash account.

parentIdstring

The account this one rolls up into. Absent for a top-level account. A parent always has the same type.

numberinteger

The account number. The leading digit places it in a band: 1xxxxx asset, 2xxxxx liability, 3xxxxx equity, 4xxxxx revenue, 6xxxxx expense, 7xxxxx other revenue, 8xxxxx other expense.

typeenum<string>

Which side of the books the account sits on. Fixed at creation — no endpoint changes it.

assetequityliabilityrevenueexpenseotherRevenueotherExpense
namestring

What property managers see in account pickers, for example "Landscaping".

descriptionstring

Free-text note. Absent when none was set.

createdstring · date-time

When the account was created, as a wall clock in the company's timezone. This field carries a UTC offset suffix; the offset is an artefact of how the value is serialised, so read the wall clock and ignore it.

updatedstring · date-time

When the account was last changed, with the same wall-clock-plus-artefact-offset shape as created.

creatorobject

Who last touched the account. MagicDoor's built-in accounts always report system. Deprecated mirrors of id — propertyManagerId, tenantId, vendorId, ownerId — are also present, whichever matches type.

400 · A field failed validation — the name length, the description length, or a `number` outside 100000–899999.

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

403 · The caller does not hold the `chart_of_accounts:write` permission.

404 · The `parentId` names no account visible to this company.

409 · Another account already has this `name`, `type` and `parentId`, or the `number` is already taken.

422 · The parent account has a different `type` than the account being created.