---
title: "Link Gl Journal Entry"
method: POST
path: "/bank-entries/{entry_id}/gl-journal-entries"
tags: ["reconciliation"]
---

# Link Gl Journal Entry

`POST /bank-entries/{entry_id}/gl-journal-entries`

## 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-entries/{entry_id}/gl-journal-entries`
- Auth: none declared

Link a **natively-posted GL journal entry** to a bank movement (ZET-162).

The native-ledger sibling of ``link_journal`` (whose universe is the *imported*
ERP ``journal_entry`` table): use this when the booking that accounts for the
movement was posted in the app's own GL (``create_gl_journal_entry``, manual
booking, etc.). The link is **evidence, never settlement** — nothing is posted or
allocated from it; it makes the movement count as matched/booked in the
reconciliation status, ``missing_journal`` and period completeness.

⚠️ It drains nothing, so it is not how an imported movement is booked: that movement
is usually already parked in Suspense, i.e. on the bank account. Clear it with
``manual_code_entry`` or a journal entry against the suspense account — a second bank
line books the money twice, and posting one is refused (409) since ZCT-805.

Any posted entry may be linked. Since ZCT-847 a link covers the movement (status,
``missing_journal``) only when its booking touches a bank or the suspense account: a
link to a payroll or invoice entry is kept but leaves the movement unmatched.

``allocated_amount`` defaults to the smaller of the movement's still-uncovered
remainder on this plane (covering links only) and the booking's own total — so the
1:1 case covers the movement in one call, while an aggregate booking smaller than
the movement, or a second booking on an already-covered movement, defaults to an
honest partial claim instead of double-counting. (The booking-total cap applies only when the
booking's currency matches the movement's — ``debit_total_base`` is in the
company's base currency, and a cross-currency ``min`` would strand a fully-paid
foreign movement as partially matched forever.) Pass an explicit amount to
override (it is taken verbatim, in the movement's currency; over-allocation
stays visible). Partial allocations sum, and the movement stays
``partially_matched`` until covered. The same movement may carry several links,
and one GL entry may be linked to several movements (an aggregate booking
legitimately explains many); re-linking the same pair updates the existing link
(200) instead of duplicating it — with ``allocated_amount`` omitted the
existing allocation is kept, not re-defaulted.

422 when the GL entry does not exist in this company, is not **posted** (a draft
is not yet a booking; a reversed entry no longer explains anything), or the
movement is already fully covered on this plane and no explicit
``allocated_amount`` was given.

## Path parameters

- `entry_id` string, required

## Headers

- `authorization` string, nullable

## Cookies

- `access_token` string, nullable

## Request body

- LinkGlJournalRequest: Link a **natively-posted** GL journal entry (``gl_journal_entry``) — ZET-162. ``allocated_amount`` defaults to the movement's full amount (the 1:1 case); pass a smaller amount when the booking explains only part of the movement.
  - `gl_journal_entry_id` string, required
  - `allocated_amount` union
    - number
    - string

## Response `201`

Successful Response

- BankEntryMsgResponse
  - `msg` string, required
  - `bank_entry` BankEntryDetail, required
    - `id` string, required
    - `company_id` string, required
    - `bank_account_id` string, required
    - `bank_statement_id` string, required
    - `entry_index` integer, required
    - `amount` string, required
    - `currency` string, required
    - `credit_debit` 'credit' | 'debit', required
    - `booking_date` string, date, nullable
    - `value_date` string, date, nullable
    - `account_servicer_ref` string, nullable
    - `end_to_end_id` string, nullable
    - `reference` string, nullable
    - `reference_type` string, nullable
    - `remittance_info` string, nullable
    - `additional_entry_info` string, nullable
    - `counterparty_name` string, nullable
    - `counterparty_iban` string, nullable
    - `counterparty_id` string, nullable
    - `reconciliation_status` 'unmatched' | 'partially_matched' | 'matched' | 'ignored', required
    - `settlement_status` 'unsettled' | 'settled' | 'partially_settled' | 'suspense': Clean-bank settlement state of a bank entry (distinct from ``reconciliation_status``, which the matcher owns). Set by ``settle_bank_entry``.
    - `matched_amount` string, required
    - `possible_duplicate` boolean, required
    - `is_own_payment` boolean
    - `created_at` string, date-time, required
    - `has_invoice` boolean
    - `has_journal` boolean
    - `has_ledger_match` boolean
    - `needs_review` boolean
    - `journal_exportable` boolean
    - `journal_export_blocked_reason` string, nullable
    - `journal_export_soft_warning` string, nullable
    - `counterparty_hint` InvoiageCoreAccountingReconciliationSchemasReconciliationCounterpartyBrief
      - `id` string, required
      - `kind` string, required
      - `name` string, required
      - `normalized_name` string, required
      - `vat_number` string, nullable
    - `counterparty` InvoiageCoreAccountingReconciliationSchemasReconciliationCounterpartyBrief
      - `id` string, required
      - `kind` string, required
      - `name` string, required
      - `normalized_name` string, required
      - `vat_number` string, nullable
    - `match_quality` 'full' | 'strong' | 'partial' | 'weak' | 'manual' | 'imported': Graded bank-entry ↔ invoice match quality (match-quality feature, 2026-06-09). Auto bands (from how many matchable fields line up, see ``services.reconciliation``): ``full`` > ``strong`` > ``partial`` > ``weak``. ``manual`` (user-created/confirmed) and ``imported`` (asserted by a source export) are provenance values that win over any auto band.
    - `links` BankEntryLinks
      - `items` LinkedItem[]
        - `link_id` string, required
        - `item_id` string, required
        - `allocated_amount` string, required
        - `match_quality` 'full' | 'strong' | 'partial' | 'weak' | 'manual' | 'imported', required: Graded bank-entry ↔ invoice match quality (match-quality feature, 2026-06-09). Auto bands (from how many matchable fields line up, see ``services.reconciliation``): ``full`` > ``strong`` > ``partial`` > ``weak``. ``manual`` (user-created/confirmed) and ``imported`` (asserted by a source export) are provenance values that win over any auto band.
        - `match_signals` object, nullable
        - `confidence` string, nullable
        - `filename` string, nullable
        - `direction` string, nullable
      - `journal_entries` LinkedJournalEntry[]
        - `link_id` string, required
        - `journal_entry_id` string, required
        - `allocated_amount` string, required
        - `match_quality` 'full' | 'strong' | 'partial' | 'weak' | 'manual' | 'imported', required: Graded bank-entry ↔ invoice match quality (match-quality feature, 2026-06-09). Auto bands (from how many matchable fields line up, see ``services.reconciliation``): ``full`` > ``strong`` > ``partial`` > ``weak``. ``manual`` (user-created/confirmed) and ``imported`` (asserted by a source export) are provenance values that win over any auto band.
        - `match_signals` object, nullable
        - `confidence` string, nullable
        - `document_number` string, nullable
        - `description` string, nullable
      - `accounting_invoices` LinkedAccountingInvoice[]
        - `link_id` string, required
        - `accounting_invoice_id` string, required
        - `allocated_amount` string, required
        - `released_amount_currency` string, nullable
        - `match_quality` 'full' | 'strong' | 'partial' | 'weak' | 'manual' | 'imported', required: Graded bank-entry ↔ invoice match quality (match-quality feature, 2026-06-09). Auto bands (from how many matchable fields line up, see ``services.reconciliation``): ``full`` > ``strong`` > ``partial`` > ``weak``. ``manual`` (user-created/confirmed) and ``imported`` (asserted by a source export) are provenance values that win over any auto band.
        - `match_signals` object, nullable
        - `confidence` string, nullable
        - `invoice_number` string, nullable
        - `counterparty_name` string, nullable
        - `direction` 'payable' | 'receivable'
        - `currency` string, nullable
        - `open_amount` string, nullable
        - `needs_discharge` boolean
        - `published_rate` string, nullable
        - `booking_rate` string, nullable
      - `gl_open_items` LinkedGlOpenItem[]
        - `link_id` string, required
        - `gl_open_item_id` string, required
        - `allocated_amount` string, required
        - `released_amount_currency` string, nullable
        - `match_quality` 'full' | 'strong' | 'partial' | 'weak' | 'manual' | 'imported', required: Graded bank-entry ↔ invoice match quality (match-quality feature, 2026-06-09). Auto bands (from how many matchable fields line up, see ``services.reconciliation``): ``full`` > ``strong`` > ``partial`` > ``weak``. ``manual`` (user-created/confirmed) and ``imported`` (asserted by a source export) are provenance values that win over any auto band.
        - `match_signals` object, nullable
        - `confidence` string, nullable
        - `document_no` string, nullable
        - `counterparty_name` string, nullable
        - `direction` 'payable' | 'receivable'
        - `open_amount` string, nullable
        - `currency` string, nullable
        - `due_date` string, date, nullable
        - `is_credit_note` boolean
        - `needs_discharge` boolean
        - `published_rate` string, nullable
        - `booking_rate` string, nullable
      - `gl_journal_entries` LinkedGlJournalEntry[]
        - `link_id` string, required
        - `gl_journal_entry_id` string, required
        - `allocated_amount` string, required
        - `match_quality` 'full' | 'strong' | 'partial' | 'weak' | 'manual' | 'imported', required: Graded bank-entry ↔ invoice match quality (match-quality feature, 2026-06-09). Auto bands (from how many matchable fields line up, see ``services.reconciliation``): ``full`` > ``strong`` > ``partial`` > ``weak``. ``manual`` (user-created/confirmed) and ``imported`` (asserted by a source export) are provenance values that win over any auto band.
        - `match_signals` object, nullable
        - `confidence` string, nullable
        - `entry_no` integer, nullable
        - `posting_date` string, date, nullable
        - `description` string, nullable
        - `status` 'draft' | 'posted' | 'reversed'
        - `transfer_bank_entry_id` string, nullable
    - `settlement_blocker` string, nullable
    - `pays_card_bill` boolean
    - `card_clearing_account_code` string, 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)
