---
title: "Search and page the invoices of the authenticated company."
method: GET
path: "/core/v1/invoices"
tags: ["Finance"]
---

# Search and page the invoices of the authenticated company.

`GET /core/v1/invoices`

## Request

- Base URL: `https://api.klara.ch`
- URL: `https://api.klara.ch/core/v1/invoices`
- Auth: one of:
  - API key in header `X-API-KEY`
  - HTTP bearer

Returns a page of the company's invoices, newest first, with optional free-text search (<code>search-key</code>) and status filter (<code>status</code>). Each row is an <code>InvoiceSummary</code> — a flat projection carrying the identity, amounts, dates, customer and both status fields. Retrieve the full document, including order items and attachments, with <code>GET /core/v1/invoices/{id}</code>.<br/><br/><strong>Paging.</strong> Walk the collection with <code>offset</code> and <code>limit</code>: iterate <code>offset=0,&nbsp;limit,&nbsp;2&times;limit,&nbsp;…</code> until a response returns fewer than <code>limit</code> rows. Ordering defaults to <code>sort-field=ID</code>, <code>sort-direction=DESC</code>, which is unique per row and therefore stable across pages — if you sort by a non-unique field instead (for example <code>LAST_MODIFIED</code>), rows sharing a value may shift between pages.<br/><br/><strong>The two status fields mean different things.</strong> <code>status</code> on a row is the invoice <em>document</em> status; <code>bookingStatus</code> is the accounting payment state of its open position, supplied by <code>luz_accounting</code>. A fully paid invoice reads <code>status: INVOICED</code> with <code>bookingStatus: PAID</code>.<br/><br/><strong>The <code>status</code> query parameter is the KLARA invoice-overview filter, not an equality filter on the row's <code>status</code> field.</strong> It matches on both the document status and the payment state, exactly as the KLARA invoice list does:<ul><li><code>DRAFT</code>, <code>CANCELLED</code> — document status only.</li><li><code>INVOICED</code>, <code>SENT</code> — invoiced and still open.</li><li><code>OPEN</code> — invoiced or paid, with <code>bookingStatus=OPEN</code>. Rows come back reading <code>status: INVOICED</code> or <code>PAID</code>, so do not expect the filter value to be echoed in the row.</li><li><code>PAID</code> — <code>bookingStatus</code> of <code>PAID</code> or <code>PARTLY_PAID</code>.</li><li><code>CLEARED</code> — <code>bookingStatus</code> of <code>CLEARED</code> or <code>PARTLY_CLEARED</code> (credit notes).</li></ul><strong>Use <code>booking-status</code> to filter on the payment state precisely.</strong> It matches the row's <code>bookingStatus</code> field and nothing else, accepts the full set — including <code>PARTLY_PAID</code> and <code>PARTLY_CLEARED</code>, which <code>status</code> cannot express — and combines with <code>status</code>: <code>?status=INVOICED&amp;booking-status=OPEN</code> is the exact way to ask for "invoiced and not yet paid". Invoices that carry no booking at all (<code>DRAFT</code>, cancelled) have no payment state and are excluded whenever <code>booking-status</code> is given.<br/><br/><strong>Two further behaviours worth knowing.</strong> Invoices whose order has been archived are excluded. And <code>status=OPEN</code> — only that one value — applies its payment-state check after the page is cut, so such a page can contain fewer than <code>limit</code> rows while the offsets stay stable; keep paging rather than treating a short page as the end. <code>booking-status=OPEN</code> does not behave that way: it is part of the query, so a short page really is the last page. Prefer it.<br/><br/>Read-only and idempotent. Authentication is API key + bearer JWT; the caller must hold the <code>FINANCE</code> permission on the company resolved from the JWT, otherwise the endpoint returns <code>403</code>.

## Query parameters

- `booking-status` 'OPEN' | 'PARTLY_PAID' | 'PAID' | 'PARTLY_CLEARED' | 'CLEARED'
- `limit` integer
- `offset` integer
- `search-key` string
- `sort-direction` 'ASC' | 'DESC'
- `sort-field` string
- `status` 'DRAFT' | 'INVOICED' | 'SENT' | 'PAID' | 'OPEN' | 'CLEARED' | 'CANCELLED'

## Response `200`

A page of invoices. Empty array when nothing matches.

- InvoiceSummary[]
  - `id` integer: Numeric primary key. Pass this to <code>GET /core/v1/invoices/{id}</code> to retrieve the full document.
  - `invoiceCode` string: Human-readable invoice code, unique per company.
  - `invoiceNumber` integer: Sequential invoice number.
  - `orderNumber` integer: Order number of the invoice's order.
  - `subject` string: Invoice subject / title.
  - `status` string: Invoice <strong>document</strong> status. One of <code>DRAFT</code>, <code>INVOICED</code>, <code>PAID</code>, <code>CANCELLED</code>. Note that <code>SENT</code> is reported as <code>INVOICED</code> for non-negative amounts, and that the <code>status</code> query parameter additionally accepts the payment-state values <code>OPEN</code>, <code>PAID</code> and <code>CLEARED</code>, which are matched against <code>bookingStatus</code> rather than against this field.
  - `bookingStatus` string: Accounting payment state of the invoice's open position, from luz_accounting: <code>OPEN</code>, <code>PARTLY_PAID</code>, <code>PAID</code>, <code>PARTLY_CLEARED</code> or <code>CLEARED</code>. Absent for invoices that carry no booking (<code>DRAFT</code>, cancelled).
  - `invoiceType` string: Invoice type: <code>MANUAL</code> or <code>RECURRING</code>.
  - `amount` number: Invoice total, on the same basis as <code>Invoice.amount</code>.
  - `documentDate` string, date: Invoice document date (ISO 8601).
  - `paymentDate` string, date: Payment due date (ISO 8601).
  - `bookingDueDate` string, date: Booking due date returned by accounting.
  - `customerId` integer: Id of the customer the invoice was issued to.
  - `customerName` string: Display name of the customer — the company name for a <code>COMPANY</code> customer, first and last name for a <code>PERSON</code>.
  - `customerType` string: Customer type: <code>COMPANY</code> or <code>PERSON</code>.
  - `bookingNumbers` string: Accounting booking numbers created for this invoice, comma-separated. Empty while the invoice is not booked.
  - `lastModified` string, date-time: Last modification timestamp.

## Other responses

- `400`: Invalid filter or paging parameter — an unknown <code>status</code>, an unknown <code>sort-field</code>, a <code>sort-direction</code> other than <code>ASC</code>/<code>DESC</code>, a negative <code>offset</code>, or a <code>limit</code> outside 1–100.<br/><br/>Failures detected by a downstream service carry that service's own <code>code</code>, which this reference does not enumerate, so the <code>code</code> field may hold a value not documented here. Treat an unrecognised code as a generic failure of the status it arrives with, and do not branch on a code this reference does not list.
- `401`: No Authorization header found or invalid token<br/><br/>Failures detected by a downstream service carry that service's own <code>code</code>, which this reference does not enumerate, so the <code>code</code> field may hold a value not documented here. Treat an unrecognised code as a generic failure of the status it arrives with, and do not branch on a code this reference does not list.
- `403`: The current user is not allowed to access this company data<br/><br/>Failures detected by a downstream service carry that service's own <code>code</code>, which this reference does not enumerate, so the <code>code</code> field may hold a value not documented here. Treat an unrecognised code as a generic failure of the status it arrives with, and do not branch on a code this reference does not list.
- `429`: API rate limit exceeded<br/><br/>Failures detected by a downstream service carry that service's own <code>code</code>, which this reference does not enumerate, so the <code>code</code> field may hold a value not documented here. Treat an unrecognised code as a generic failure of the status it arrives with, and do not branch on a code this reference does not list.
- `500`: Something went wrong on our side while processing the request. Please kindly contact our support.<br/><br/>Failures detected by a downstream service carry that service's own <code>code</code>, which this reference does not enumerate, so the <code>code</code> field may hold a value not documented here. Treat an unrecognised code as a generic failure of the status it arrives with, and do not branch on a code this reference does not list.

---

[API](https://skmtc.dev/klara/apis/klara-public-api.md) · [All operations](https://skmtc.dev/klara/apis/klara-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/klara/apis/klara-public-api/revisions/490b1a879fc2?raw)
