---
title: "Create account"
method: POST
path: "/v1/platform/businesses/{business_id}/general-ledger/chart-of-accounts/"
tags: ["General Ledger"]
---

# Create account

`POST /v1/platform/businesses/{business_id}/general-ledger/chart-of-accounts/`

## Request

- Base URL: `https://docs.thredfi.com` (the document declares no server; this is the origin it was published from)
- URL: `https://docs.thredfi.com/v1/platform/businesses/{business_id}/general-ledger/chart-of-accounts/`
- Auth: one of:
  - HTTP bearer
  - HTTP bearer
  - HTTP basic
  - HTTP bearer
  - HTTP bearer

Create a new account in the chart of accounts.

        **Idempotency:** If external_id is provided and matches an existing account,
        returns the existing account with 200 OK.

        **Parent account:** Can be specified by UUID, code, or external_id.

        **Accounting validations:**
        - is_non_cash_expense can only be set on expense accounts
        - balance_behavior must be 'debit_positive', 'credit_positive', or blank

## Path parameters

- `business_id` string, required

## Request body

- AccountCreateAPIRequest: Serializer for creating accounts via the Chart of Accounts API. Supports flexible parent identification (UUID, code, or external_id). Implements idempotency via external_id field.
  - `code` string, required: Unique account code within business (e.g., '1000', 'REV-SALES')
  - `name` string: Account display name. Maps to custom_name field.
  - `account_type` 'asset' | 'liability' | 'equity' | 'revenue' | 'expense' | '': Account type: asset, liability, equity, revenue, expense * `asset` - Asset * `liability` - Liability * `equity` - Equity * `revenue` - Revenue * `expense` - Expense
  - `account_subtype` 'current_assets' | 'non_current_assets' | 'current_liabilities' | 'non_current_liabilities' | 'share_capital' | 'share_premium' | 'reserves' | 'retained_earnings' | 'revenue' | 'other_operating_income' | 'finance_income' | 'direct_costs' | 'operating_expenses' | 'finance_costs' | 'income_tax' | '': Account subtype for granular categorization * `current_assets` - Current Assets * `non_current_assets` - Non-current Assets * `current_liabilities` - Current Liabilities * `non_current_liabilities` - Non-current Liabilities * `share_capital` - Share Capital * `share_premium` - Share Premium * `reserves` - Reserves * `retained_earnings` - Retained Earnings * `revenue` - Revenue * `other_operating_income` - Other Operating Income * `finance_income` - Finance Income * `direct_costs` - Direct Costs * `operating_expenses` - Operating Expenses * `finance_costs` - Finance Costs * `income_tax` - Income Tax
  - `parent_id` string, nullable: Parent account identifier - accepts UUID, code, or external_id
  - `description` string: Human-readable description of account purpose
  - `external_id` string: External system identifier. Enables idempotent creation.
  - `institution_name` string: Financial institution name (e.g., 'Barclays Bank PLC')
  - `iban` string: International Bank Account Number (EU/UK format)
  - `sort_code` string: UK sort code (flexible format: XX-XX-XX or XXXXXX)
  - `account_number_mask` string: Masked account number for display (e.g., '****4300')
  - `balance_behavior` '' | 'debit_positive' | 'credit_positive': Override balance calculation behavior. Leave blank for standard accounting rules. * `` - Auto-detect * `debit_positive` - Debit Positive * `credit_positive` - Credit Positive
  - `is_cash_account` boolean: Mark as cash or cash equivalent for cash flow purposes
  - `is_non_cash_expense` boolean: Mark as non-cash expense (depreciation, amortization). Only valid for expense accounts.
  - `custom_fields` unknown

## Response `200`

- ChartOfAccountDetail: Detailed serializer for account with additional information.
  - `id` string, uuid, required: Unique account identifier
  - `code` string, required: Account code from chart of accounts (e.g., '1000', '4000')
  - `name` string, required: Account name from chart of accounts
  - `currency` string, required: Account currency from business base currency (GBP, EUR, USD)
  - `account_type` 'asset' | 'liability' | 'equity' | 'revenue' | 'expense', required: Account type code (asset, liability, equity, revenue, expense) * `asset` - Asset * `liability` - Liability * `equity` - Equity * `revenue` - Revenue * `expense` - Expense
  - `account_type_display` string, nullable, required: Human-readable account type (e.g., 'Current Asset', 'Revenue')
  - `account_subtype` 'current_assets' | 'non_current_assets' | 'current_liabilities' | 'non_current_liabilities' | 'share_capital' | 'share_premium' | 'reserves' | 'retained_earnings' | 'revenue' | 'other_operating_income' | 'finance_income' | 'direct_costs' | 'operating_expenses' | 'finance_costs' | 'income_tax', required: Account subtype code for more granular classification (bank, cash, etc.) * `current_assets` - Current Assets * `non_current_assets` - Non-current Assets * `current_liabilities` - Current Liabilities * `non_current_liabilities` - Non-current Liabilities * `share_capital` - Share Capital * `share_premium` - Share Premium * `reserves` - Reserves * `retained_earnings` - Retained Earnings * `revenue` - Revenue * `other_operating_income` - Other Operating Income * `finance_income` - Finance Income * `direct_costs` - Direct Costs * `operating_expenses` - Operating Expenses * `finance_costs` - Finance Costs * `income_tax` - Income Tax
  - `account_subtype_display` string, nullable, required: Account subtype for more granular classification
  - `parent_account_code` string, nullable, required: Parent account code if this is a sub-account (null for top-level accounts)
  - `current_balance` integer, required: Current balance in cents
  - `current_balance_formatted` string, required: Formatted balance with currency symbol (e.g., '£12,500.50')
  - `debit_balance` integer, required: Debit balance in cents
  - `credit_balance` integer, required: Credit balance in cents
  - `period_balance` integer, required: Period balance in cents (null if no period filter applied)
  - `period_balance_formatted` string, nullable, required: Formatted period balance with currency symbol (null if no period filter)
  - `has_children` boolean, required: Whether this account has sub-accounts (nested hierarchy)
  - `hierarchy_level` integer, required: Depth in account hierarchy (0 for root accounts)
  - `is_active` boolean, required: Whether this account is active and accepting transactions
  - `description` string, required: Detailed account description
  - `institution_name` string, nullable, required: Bank institution name (for bank accounts only)
  - `iban` string, nullable, required: International Bank Account Number (for bank accounts)
  - `sort_code` string, nullable, required: UK bank sort code (for UK bank accounts, format: XX-XX-XX)
  - `account_number_mask` string, nullable, required: Masked account number showing last 4 digits (e.g., '****5555')
  - `total_debits` integer, required: Total number of debit transactions (count, not amount)
  - `total_credits` integer, required: Total number of credit transactions (count, not amount)
  - `last_entry_date` string, date-time, nullable, required: Date of most recent journal entry
  - `last_entry_reference` string, required: Reference of most recent journal entry
  - `sub_accounts` object[], required: List of sub-accounts if this is a parent account (empty array if no children)

## Other responses

- `201`
- `400`: Validation errors in request data
- `401`: Authentication required - missing or invalid API key
- `403`: Permission denied - insufficient privileges
- `404`: Resource not found
- `409`: Conflict - resource already exists or invalid state transition
- `422`: Unprocessable entity - business logic validation failed
- `500`: Internal server error

---

[API](https://skmtc.dev/thredfi/apis/thredfi-accounting-platform-api.md) - [All operations](https://skmtc.dev/thredfi/apis/thredfi-accounting-platform-api/llms.txt) - [OpenAPI document](https://skmtc.dev/thredfi/apis/thredfi-accounting-platform-api/revisions/0c1918254db3?raw)
