Accounting API

Post and reverse journal entries and read the journal, ledger, trial balance, profit and loss and balance sheet.

Accounting keeps a double-entry ledger. This API posts journal entries, reverses them, and reads the journal, ledger, trial balance and reports. Your chart of accounts is ordinary records of the accounts type, so you create and edit accounts with the Records API.

If the Accounting app is switched off in Settings › Apps, these routes answer 404 NOT_FOUND.

Endpoints

Method Path Permission What it does
POST /orgs/{orgId}/accounting/entries accounting:post Post a journal entry
GET /orgs/{orgId}/accounting/entries accounting:read List entries
GET /orgs/{orgId}/accounting/entries/{entryId} accounting:read Get one entry
POST /orgs/{orgId}/accounting/entries/{entryId}/reverse accounting:post Post a reversing entry
GET /orgs/{orgId}/accounting/trial-balance accounting:read Totals per account
GET /orgs/{orgId}/accounting/ledger accounting:read One account's lines with a running balance
GET /orgs/{orgId}/accounting/overview accounting:read Headline figures for a period
GET /orgs/{orgId}/accounting/reports/profit-loss accounting:read Profit and loss
GET /orgs/{orgId}/accounting/reports/balance-sheet accounting:read Balance sheet

Reading the chart of accounts, invoices and payments uses records:read, not these permissions.

Rules to know

Important: A posted entry can never be edited or deleted. To correct a mistake, reverse the entry and post a new one.

  • An entry has at least 2 and at most 200 lines.
  • Each line has either a debit or a credit, never both and never zero. Amounts are not negative.
  • Total debits must equal total credits, and the total must be above zero.
  • Amounts are exact decimals. Send them as strings, such as "12500.00".
  • The largest amount per line is 9,223,372,036,854.
  • Reports and the ledger read one currency at a time.

POST /orgs/{orgId}/accounting/entries

Field Type Required Notes
date string No YYYY-MM-DD. Today (UTC) if omitted
memo string No Up to 500 characters
source_type string No Where the entry came from, for example manual (default), invoice or payment
source_id string No The id of the invoice or payment record it relates to
currency string No An ISO 4217 code. The workspace's default currency if omitted. See below
lines array Yes Each line has account_id (an accounts record id), debit or credit, and an optional memo (up to 500 characters)
curl -s -X POST https://axisiq.co/api/v1/orgs/$ORG/accounting/entries \
  -H "Authorization: Bearer $AXIS_KEY" -H "Content-Type: application/json" \
  -d '{
    "date": "2026-10-04",
    "memo": "Invoice INV-1001",
    "source_type": "invoice",
    "source_id": "0190f0aa-…",
    "lines": [
      { "account_id": "0190f001-…", "debit": "12500.00" },
      { "account_id": "0190f002-…", "credit": "12500.00" }
    ]
  }'

Response 201

{
  "data": {
    "id": "0190f200-…",
    "date": "2026-10-04",
    "memo": "Invoice INV-1001",
    "source_type": "invoice",
    "source_id": "0190f0aa-…",
    "total": "12500",
    "currency": "INR",
    "created_at": "2026-10-04T09:30:00Z",
    "lines": [
      { "id": "…", "account_id": "0190f001-…", "debit": "12500", "credit": "0", "memo": "" },
      { "id": "…", "account_id": "0190f002-…", "debit": "0", "credit": "12500", "memo": "" }
    ]
  }
}

Errors

Status Code When
400 VALIDATION_ERROR Fewer than 2 lines, unbalanced, a line with both or neither of debit and credit, bad date, bad account id. The message says which, for example entry is unbalanced: debits 100 ≠ credits 90
403 FORBIDDEN The role lacks accounting:post

Currencies. A workspace that has not been upgraded for multi-currency keeps its books in its default currency only, and posting a different currency is a 400 VALIDATION_ERROR that says so. After the upgrade (the workspace owner does this in Settings), each entry has its own currency.

GET /orgs/{orgId}/accounting/entries

Parameter Notes
from, to YYYY-MM-DD, both inclusive. Either may be left out
account Only entries that touch this account id
status active, reversed (has been reversed) or reversal (is itself a reversing entry)
currency One currency code
limit Default 50, maximum 200
offset Start position

Returns { "entries": [ … ], "total": 312 }, newest first. Entries in a list also carry reversed_by when they have been reversed.

POST /orgs/{orgId}/accounting/entries/{entryId}/reverse

Posts a new entry with every debit and credit swapped, with the original's date and currency and a memo starting "Reversal of", linked to the original through reverses. No body. Response 201 with the new entry. An entry can be reversed once: reversing it again is 400 VALIDATION_ERROR ("entry has already been reversed").

GET /orgs/{orgId}/accounting/trial-balance

Optional currency.

{
  "data": {
    "rows": [ { "account_id": "0190f001-…", "debit": "12500", "credit": "0", "balance": "12500" } ],
    "currency": "INR",
    "currencies": ["INR"]
  }
}

GET /orgs/{orgId}/accounting/ledger

account (required, an account id), optional from, to, currency.

{
  "data": {
    "rows": [ { "entry_id": "…", "date": "2026-10-04", "memo": "Invoice INV-1001", "debit": "12500", "credit": "0", "balance": "12500" } ],
    "opening": "0",
    "closing": "12500",
    "currency": "INR",
    "currencies": ["INR"]
  }
}

opening is the balance before from. balance is running.

GET /orgs/{orgId}/accounting/overview

Optional from and to (default: this month to today), cash_accounts (comma-separated account ids to count as cash) and currency. Returns revenue, expense, net, cash, unclassified, entry_count, the 10 latest entries as recent, a 12-month months series, and idle_accounts.

GET /orgs/{orgId}/accounting/reports/profit-loss

Optional from, to (default: this year to date) and currency. Returns revenue, expense and unclassified sections, each { kind, rows: [{ account_id, code, name, amount }], total }, and net.

GET /orgs/{orgId}/accounting/reports/balance-sheet

Optional as_of (default today) and currency. Returns assets, liabilities, equity and unclassified sections, earnings, and balanced (true when assets equal liabilities plus equity).