---
title: "Send a booked invoice (smart delivery or a forced channel)."
method: POST
path: "/core/v1/invoices/{id}/send"
tags: ["Finance"]
---

# Send a booked invoice (smart delivery or a forced channel).

`POST /core/v1/invoices/{id}/send`

## Request

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

Sends an already-booked invoice to its recipient, synchronously, under the company resolved from the bearer JWT.<br/><br/>Omit <code>channel</code> for <strong>smart delivery</strong>: the system auto-routes through <code>EPOST</code>, <code>EBILL</code>, <code>SEND_EMAIL</code> and Print&amp;Send and only fails if none can deliver. Provide <code>channel</code> to <strong>force</strong> that exact channel: if the recipient is not eligible (e.g. no email on file, not eBill-registered, Print&amp;Send not subscribed) the call fails with 400. The invoice PDF is rendered on demand when it has not been printed yet.<br/><br/><strong>Prerequisites:</strong> the invoice must already be booked — <code>DRAFT</code> and cancelled invoices are rejected with 400. Create/book it via <code>POST /core/v1/invoices</code> (<code>status=INVOICED</code>) first.<br/><br/><strong>Not idempotent:</strong> each successful call performs a real delivery (sends an email / hands a letter to the postal channel) and overwrites the invoice's recorded post method — do not retry blindly on success.<br/><br/><code>channel</code> uses the same values as <code>Invoice.postMethod</code>, except <code>PRINT_AND_MANUAL_SEND</code>, which is not a deliverable channel and is rejected with 400. Authentication is API key + bearer JWT; the caller must hold the <code>FINANCE</code> permission on the target company.

## Path parameters

- `id` integer, required

## Query parameters

- `channel` 'A_POST' | 'B_POST' | 'SEND_EMAIL' | 'PRINT_AND_MANUAL_SEND' | 'EPOST' | 'EBILL'

## Response `200`

Invoice delivered. Returns the channel actually used, whether it was smart-routed, the OneAPI delivery id and the archived PDF's printedFileId.

- SendInvoiceResult: Result of sending a single, already-booked invoice. Reports whether the invoice was delivered, whether the channel was auto-selected (smart delivery), the channel actually used, the OneAPI delivery id and the archived PDF's printedFileId.
  - `delivered` boolean: <code>true</code> when delivery was confirmed via the channel actually used.
  - `smart` boolean: <code>true</code> when the channel was auto-selected (smart delivery, i.e. no <code>channel</code> was forced); <code>false</code> when a channel was forced.
  - `channel` object: The channel actually used to deliver the invoice. For physical post this is the resolved postage method (e.g. <code>A_POST</code>).
  - `deliveryId` string: OneAPI delivery id, when available (forced sends only; <code>null</code> for smart delivery).
  - `printedFileId` string: The printedFileId of the archived invoice PDF rendered/reused during the send.

## Other responses

- `400`: Invoice is DRAFT/cancelled, the channel is unsupported (<code>PRINT_AND_MANUAL_SEND</code>), the recipient is not eligible for the forced channel, or smart delivery found no channel.<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.
- `404`: No invoice with the given id exists for the authenticated company.<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)
