---
title: "Confirm Bank Account Ownership"
method: POST
path: "/bank-accounts/{account_id}/confirm-ownership"
tags: ["reconciliation"]
---

# Confirm Bank Account Ownership

`POST /bank-accounts/{account_id}/confirm-ownership`

## 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/bank-accounts/{account_id}/confirm-ownership`
- Auth: none declared

Confirm a ``pending`` (statement-created, undeclared) account as ours.

Releases the account's held entries: the matcher runs over them and, per the
company's autonomy policy, they are best-effort GL-settled. On a grandfathered
account (``needs_ownership_review``) it only stamps ``ownership_reviewed_at`` —
its entries were already matched/settled at import. Idempotent on ``declared``
and reviewed-``confirmed`` accounts. Accountant/owner (ZCT-257): confirming releases
the account's held entries to the matcher and, per the autonomy policy, to GL
settlement — a booking act, not a preference.

The row is resolved here rather than only inside the service because the gate needs a
``company_id`` before anything runs; the scoped load keeps the same 404-missing /
403-out-of-scope split the sibling routes have.

## Path parameters

- `account_id` string, required

## Headers

- `authorization` string, nullable

## Cookies

- `access_token` string, nullable

## Response `200`

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)
