Accounts

Sends the accounts and answers them back. Every other kind names an account code, so this is the kind to send first and the read that says which codes exist.

Writing accounts

The endpoints

MethodPathWhat it does
POST/api/v1/organisations/{organisation}/accounts Creates, updates, or leaves unchanged
POST/api/v1/organisations/{organisation}/accounts/validate The same checks; nothing is written

Needs a bearer token, a credential issued for that company, and the credential's accounts.write scope.

The body

{
  "declarations": {
    "source_reference": "netsuite-coa",
    "mode": "merge"
  },
  "records": [
    { "code": "4000", "name": "Sales", "type": "Income", "status": "active", "external_id": "ns-4000" },
    { "code": "1100", "name": "Trade receivables", "type": "Accounts Receivable" }
  ]
}

Declarations

DeclarationRequiredValue
source_referenceyesYour own id for the accounts feed, 1–64 characters.
modenomerge (default) keeps codes the payload does not carry; replace_all retires them.
webhook_urlnoCalled once when the request finishes or fails.

Accounts carry no month and no amounts, so period, value_basis, rate_direction and base_currency do not apply and are not asked for.

The fields

FieldTypeRequiredWhat it means
codestringyesThe account code. It is the record's identity.
namestringyesThe account name, stored exactly as sent.
typestringyesA system account type by name — Bank, Accounts Receivable, Other Expense and so on. A name that is not a system account type is refused; it is never guessed from the account's name.
statusstringnoActive unless stated.
external_idstringnoYour own id for the account, up to 128 characters.

Any other field is refused as unknown_field rather than stored.

The system account types

type is one of these names, exactly as written. The class beside each one is how the reports read it; the caller states the name, not the class.

TypeClass
BANKASSET
ACCOUNTS RECEIVABLEASSET
INVENTORYASSET
CURRENT ASSETASSET
FIXED ASSETASSET
NON CURRENT ASSETASSET
ACCOUNTS PAYABLELIABILITY
CURRENT LIABILITYLIABILITY
NON CURRENT LIABILITYLIABILITY
TAXES PAYABLELIABILITY
PAYROLL PAYABLELIABILITY
EQUITYEQUITY
REVENUEREVENUE
OTHER INCOMEREVENUE
INTEREST INCOMEREVENUE
DIRECT COSTSREVENUE
EXPENSEEXPENSE
OTHER EXPENSEEXPENSE
DEPRECIATIONEXPENSE
TAXES EXPENSEEXPENSE
INTEREST EXPENSEEXPENSE
NCI ALLOCATIONNCI ALLOCATION

Names are matched without regard to case; a name outside this list is refused with invalid_value.

The status values

status is Active or Inactive, and Active when it is not stated. Anything else is refused with invalid_value. The recalculation marks an account Inactive when no loaded month uses it, so a status that disagrees with the company's own figures can change after the next load.

What it does

What it answers

{
  "id": 84, "kind": "accounts", "source_reference": "netsuite-coa",
  "status": "written", "records_received": 2,
  "counts": { "created": 1, "updated": 0, "unchanged": 1, "rejected": 0 },
  "period": null, "recalculation": null,
  "written_at": "2026-10-23T06:02:11+00:00",
  "links": { "self": "…/requests/84", "results": "…/requests/84/results" }
}

There is nothing to recalculate: accounts move no report figure. Under replace_all the answer also carries result.retired: how many accounts the payload left out and were marked Inactive. See Overview for the full answer and Request history for reading it back.

Refusals

CodeWhen
invalid_valuetype is not a system account type
leaf_entities_onlyThe company is a consolidation parent
duplicate_record_identityTwo records in the payload state the same code
unknown_fieldA field outside the five above was sent
required_field_missingcode, name or type is absent

A refused record never stops the rest: the request is written, that record is reported rejected with its own code in the results.

Reading accounts

The accounts a company holds: the codes every other read names, with the type each one is reported under.

The endpoint

MethodPathAnswers
GET/api/v1/organisations/{organisation}/accounts Every account, one row each

Needs a bearer token, a credential issued for that company, and the accounts.read scope.

The filters

ParameterWhat it does
statusActive, Inactive, or absent for both.
typeOne system account type by name, such as BANK.
codeOne code. Unknown, it answers 404 rather than an empty list.
page, per_pagePaging, as everywhere.

What it answers

{
  "data": [
    {
      "code": "4000",
      "name": "Sales Revenue",
      "class": "REVENUE",
      "type": "REVENUE",
      "status": "Active",
      "external_id": "ns-4000",
      "tags": {
        "ifrs_tag": null, "aasb_tag": null, "us_gaap_tag": null, "uk_gaap_tag": null,
        "sfrs_tag": null, "local_gaap_flag": null
      }
    }
  ],
  "page": 1, "per_page": 50, "total": 36, "has_more": false
}
FieldWhat it says
codeThe code every other read names. It is the account's identity.
nameThe name as it was loaded, answered in clear.
classThe statement class of the account's type: ASSET, LIABILITY, EQUITY, REVENUE or EXPENSE. It is read from the type rather than from a stored string, so every account answers the class its type is reported under.
typeThe system account type by name, from Account types. It is always one of them, whatever the stored label says.
statusActive or Inactive. The recalculation marks an account Inactive when no loaded month uses it.
external_idThe id the caller stated when it loaded the account, if it did.
tagsOne entry per standard's tag column - ifrs_tag, aasb_tag, us_gaap_tag, uk_gaap_tag, sfrs_tag and local_gaap_flag - carrying the tag value the account holds for that standard, or null. The value is the part after the colon in a Tags id.

Refusals

CodeWhen
not_foundThe company is not one the credential may read, or the code is not one of the accounts
invalid_valuestatus is neither Active nor Inactive
forbiddenThe credential holds no accounts.read scope

A type no account carries is not a refusal: it answers an empty list, because a filter narrows and does not assert. A code is different - a caller naming one code is asking whether it exists, so it answers 404.

Both directions name the same codes: what a read answers is what a write upserted, because the code is the identity.