---
title: "Create Bank Account"
method: POST
path: "/companies/{company_id}/bank-accounts"
tags: ["reconciliation"]
---

# Create Bank Account

`POST /companies/{company_id}/bank-accounts`

## Request

- Base URL: `https://app.zeno-works.ch` (the document declares no server; this is the origin it was published from)
- URL: `https://app.zeno-works.ch/companies/{company_id}/bank-accounts`
- Auth: none declared

Declare a bank account for an existing company — accountant (or admin).

Until now only onboarding and the statement importer could create one, so an
established tenant had no way to gain a bank account over the API. Same
get-or-create-by-IBAN seam as both: ownership lands ``declared`` (never the
``pending`` matching-hold), a duplicate IBAN reuses + enriches the row, and a
given ``ledger_account_number`` marks the chart code ``bank`` + creates the
``gl_bank_account`` bridge at once.

## Path parameters

- `company_id` string, required

## Headers

- `authorization` string, nullable

## Cookies

- `access_token` string, nullable

## Request body

- BankAccountCreate: User-declared bank account for an existing company (the onboarding twin). ``ledger_account_number`` links the account to a chart code; when given, the code is marked ``control_type=bank`` and bridged (``gl_bank_account``) in every fiscal year whose chart carries it, so payments can fund from it at once.
  - `iban` string, required
  - `label` string, nullable
  - `currency` string, nullable
  - `holder_name` string, nullable
  - `bic` string, nullable
  - `bank_name` string, nullable
  - `ledger_account_number` string, nullable

## Response `201`

Successful Response

- BankAccountResponse
  - `bank_account` BankAccountOut, required
    - `id` string, required
    - `company_id` string, required
    - `iban` string, required
    - `currency` string, nullable
    - `label` string, nullable
    - `holder_name` string, nullable
    - `bic` string, nullable
    - `bank_name` string, nullable
    - `ledger_account_number` string, nullable
    - `auto_created` boolean, required
    - `ownership_status` 'declared' | 'confirmed' | 'pending', required: Ownership state of a ``BankAccount`` (gap #8, D3 — foreign-statement hold). ``declared`` = the user declared the IBAN as the company's own (onboarding); ``confirmed`` = a human confirmed a statement-created account as ours (or the account predates the check and was grandfathered by migration 0032); ``pending`` = created by a statement import for an IBAN the company never declared — its entries are held (no matching, no GL settlement) until a human confirms or rejects the account. Server default is ``pending`` (fail-closed).
    - `ownership_reviewed_at` string, date-time, nullable
    - `needs_ownership_review` boolean
    - `created_at` string, date-time, required
    - `statement_count` integer, nullable
    - `entry_count` integer, nullable

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/zeno-works/apis/zeno-api.md) · [All operations](https://skmtc.dev/zeno-works/apis/zeno-api/llms.txt) · [OpenAPI document](https://skmtc.dev/zeno-works/apis/zeno-api/revisions/1eb93dde146c?raw)
