---
title: "Bank Journal Render"
method: POST
path: "/companies/{company_id}/journal-entry-files/render"
tags: ["journal-export"]
---

# Bank Journal Render

`POST /companies/{company_id}/journal-entry-files/render`

## 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}/journal-entry-files/render`
- Auth: none declared

Render the edited bank journal export to a file — **and auto-post it to the GL**.

⚠️ **This docstring used to say "(CompanyMember). Stateless." and that was false**
(corrected ZCT-257, 2026-08-31). The body below calls
``autopost_normalized_entries`` — "the GL is now the system of record; the file render
below is an export *of* the GL". So this writes the customer's books, and the word
"Stateless" was load-bearing in the wrong direction: it is exactly the sentence that
got this route classified as a POST-shaped read and permanently waived from the role
sweep, until review caught it. Accountant/owner, like its ``/post`` sibling.

The submitted ``entry_id``s ARE the source selection identity. They are re-resolved
(no accountant call); if any is no longer exportable (e.g. journal-linked since
preview) or the resolved set differs from the submitted set → **409** drift. The
edited document is run through the fixed render pipeline + validation (→ **422** on a
broken/unbalanced/cross-FY/out-of-chart document) → ``format`` renderer → file bytes.

**ZENO-236:** a movement or document the ledger already holds — including one an
earlier render posted — is refused with **409** ``conflict.selectionChangedSincePreview``
rather than rendered into a second file (a second bexio import). The file is built
BEFORE the post, so a render failure posts nothing and the request can simply be
retried.

## Path parameters

- `company_id` string, required

## Headers

- `authorization` string, nullable

## Cookies

- `access_token` string, nullable

## Request body

- JournalRenderRequest: The narrow inbound render contract (plan §5.1). ``format`` is a renderer id (``csv``/``generic_json``/``bexio_json``/``abacus_xml``).
  - `entries` RenderEntry[]
    - `entry_id` string, required
    - `lines` RenderLine[]
      - `line_id` string, required
      - `side` string, required
      - `account` string, required
      - `amount` string, required
      - `currency` string, required
      - `vat_code` string, nullable
      - `vat_amount` string, nullable
      - `text` string, nullable
      - `line_header_overrides` object
    - `header_field_overrides` object
    - `posting_date` string, nullable
    - `document_date` string, nullable
    - `reference` string, nullable
    - `description` string, nullable
  - `format` string, required

## Response `200`

Successful Response

- unknown

## 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)
