# Verifikationer (/api/referens/vouchers)

> Verifikationer – lista, skapa och hämta bokföringsposter via /3/vouchers.

Verifikationsresursen speglar Fortnox `/3/vouchers`. En verifikation identifieras av tre delar: serie, nummer och räkenskapsår. Serie och nummer ligger i sökvägen, räkenskapsåret i `?financialyear=`. Nummer 12 i serie `A` finns alltså en gång per räkenskapsår.

`POST` skapar en riktig verifikation i Klirrs bokföring, på samma väg som Klirrs egna bokföringar. Periodlås, balanskrav och nummerserie gäller. Det finns ingen `PUT` och ingen `DELETE`: en bokförd verifikation kan inte ändras eller tas bort, bara rättas med en ny verifikation.

**Scope:** `bookkeeping` · <Plan min="ai_pro" />

## Endpoints [#endpoints]

| Metod och sökväg | Beskrivning |
|---|---|
| <Endpoint method="GET" path="/api/v1/3/vouchers" /> | Lista verifikationer (listform, utan rader) |
| <Endpoint method="POST" path="/api/v1/3/vouchers" /> | Skapa en verifikation. Svarar `201`. |
| <Endpoint method="GET" path="/api/v1/3/vouchers/sublist/{VoucherSeries}" /> | Lista verifikationer i en serie |
| <Endpoint method="GET" path="/api/v1/3/vouchers/{VoucherSeries}/{VoucherNumber}" /> | Hämta en verifikation (fullständig form, med rader) |

Bas-URL: `https://app.klirr.ai/api/v1`. Skrivningar kuverteras i `Voucher`.

## Räkenskapsår [#räkenskapsår]

Alla anrop läser `?financialyear=`, räkenskapsårets `Id` från [`/3/financialyears`](/api/referens/financialyears), **inte** ett årtal. Utelämnat gäller det räkenskapsår som innehåller dagens datum, annars det senaste. Ett värde som inte är ett positivt heltal ger `400`, ett okänt `Id` ger `404`.

Listorna visar bara verifikationer i det valda året. Vid `POST` måste `TransactionDate` ligga i det angivna året om du skickar `financialyear`. Annars bestäms året av datumet.

## Listparametrar [#listparametrar]

Gäller både `/3/vouchers` och `/3/vouchers/sublist/{VoucherSeries}`. Utöver [paginering](/api/paginering) (`page`, `limit`, `offset`) och `sortorder` (`asc`/`desc`, även `ascending`/`descending`):

| Parameter | Värden | Beskrivning |
|---|---|---|
| `financialyear` | heltal | Se ovan. |
| `fromdate` | `ÅÅÅÅ-MM-DD` | Från och med datum. Ogiltigt datum ger `400`. |
| `todate` | `ÅÅÅÅ-MM-DD` | Till och med datum. Ogiltigt datum ger `400`. |
| `voucherseries` | text | Seriekod. Bara på `/3/vouchers`; på sublist-vägen ligger serien i sökvägen. |
| `sortby` | `vouchernumber`, `referencenumber`, `voucherseries` | Alla tre sorterar på verifikationsnummer. |

Fortnox-parametrarna `costcenter` och `lastmodified` stöds inte och ger `400`.

En okänd serie i `?voucherseries=` ger en tom lista. En okänd serie i sublist-sökvägen ger `404`.

## Fält [#fält]

Fullständig form (`GET /3/vouchers/{VoucherSeries}/{VoucherNumber}`, och svaret på `POST`).

| Fält | Typ | Skrivskyddat | Beskrivning |
|---|---|---|---|
| `@url` | string | ja | `.../3/vouchers/{VoucherSeries}/{VoucherNumber}`. |
| `VoucherNumber` | number | ja | Tilldelas i serien vid skapande. |
| `VoucherSeries` | string | efter skapande | Seriekod, t.ex. `A`. **Obligatoriskt vid `POST`.** Serien måste finnas och vara aktiv. |
| `Year` | number | ja | Räkenskapsårets `Id`, inte ett årtal. |
| `TransactionDate` | string | efter skapande | Bokföringsdatum `ÅÅÅÅ-MM-DD`. **Obligatoriskt.** |
| `Description` | string | efter skapande | Verifikationstext. **Obligatoriskt**, max 500 tecken. |
| `Comments` | string | efter skapande | Anteckning, max 5000 tecken. |
| `ReferenceNumber` | string | ja | Numret på länkad kundfaktura eller leverantörsfaktura, annars `""`. |
| `ReferenceType` | string | ja | Härleds ur verifikationens ursprung: `INVOICE`, `SUPPLIERINVOICE`, `INVOICEPAYMENT`, `SUPPLIERPAYMENT`, `RECEIPT`, `PAYROLLBOOKKEEP`, `ACCRUAL` eller `MANUAL`. Verifikationer skapade via API:t är `MANUAL`. |
| `ApprovalState` | number | ja | Alltid `0`. |
| `CostCenter` | string | efter skapande | Bärs vidare. |
| `Project` | string | efter skapande | Bärs vidare. |
| `VoucherRows` | array | efter skapande | Raderna, se nedan. Minst en rad med belopp. |

### VoucherRows [#voucherrows]

| Fält | Typ | Skrivskyddat | Beskrivning |
|---|---|---|---|
| `Account` | number | nej | Kontonummer. Kontot måste finnas och vara aktivt. |
| `Debit` | number | nej | Debetbelopp, standard `0`. |
| `Credit` | number | nej | Kreditbelopp, standard `0`. |
| `Description` | string | nej | Radtext. Utelämnad visas kontots namn. |
| `CostCenter` | string | nej | Bärs vidare. |
| `Project` | string | nej | Bärs vidare. |
| `TransactionInformation` | string | nej | Bärs vidare. |
| `Removed` | boolean | ja | `true` om verifikationen är borttagen. |

Regler för raderna: belopp får inte vara negativa, en rad kan inte ha både `Debit` och `Credit`, högst 1000 rader, och summan av `Debit` måste vara exakt lika med summan av `Credit` (på öret).

### Listform [#listform]

Listorna returnerar samma fält som den fullständiga formen utom `VoucherRows`, `CostCenter` och `Project`.

## Skapa en verifikation [#skapa-en-verifikation]

<Tabs groupId="lang" persist items={['curl','TypeScript']}>
<Tab value="curl">
```bash
curl -X POST https://app.klirr.ai/api/v1/3/vouchers \
  -H "Authorization: Bearer <access_token>" \
  -H "Content-Type: application/json" \
  -d '{"Voucher":{"VoucherSeries":"A","TransactionDate":"2026-03-15","Description":"Kontorsmaterial","VoucherRows":[{"Account":6110,"Debit":800},{"Account":2641,"Debit":200},{"Account":1930,"Credit":1000}]}}'
```
</Tab>
<Tab value="TypeScript">
```ts
const res = await fetch('https://app.klirr.ai/api/v1/3/vouchers', {
  method: 'POST',
  headers: {
    Authorization: 'Bearer <access_token>',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    Voucher: {
      VoucherSeries: 'A',
      TransactionDate: '2026-03-15',
      Description: 'Kontorsmaterial',
      VoucherRows: [
        { Account: 6110, Debit: 800 },
        { Account: 2641, Debit: 200 },
        { Account: 1930, Credit: 1000 },
      ],
    },
  }),
});
const { Voucher } = await res.json(); // 201 Created
```
</Tab>
</Tabs>

Svar (`201`):

```json
{
  "Voucher": {
    "@url": "https://app.klirr.ai/api/v1/3/vouchers/A/42",
    "VoucherNumber": 42,
    "VoucherSeries": "A",
    "Year": 3,
    "TransactionDate": "2026-03-15",
    "Description": "Kontorsmaterial",
    "Comments": "",
    "ReferenceNumber": "",
    "ReferenceType": "MANUAL",
    "ApprovalState": 0,
    "CostCenter": "",
    "Project": "",
    "VoucherRows": [
      { "Account": 6110, "Debit": 800, "Credit": 0, "Description": "Förbrukningsmaterial", "CostCenter": "", "Project": "", "TransactionInformation": "", "Removed": false },
      { "Account": 2641, "Debit": 200, "Credit": 0, "Description": "Debiterad ingående moms", "CostCenter": "", "Project": "", "TransactionInformation": "", "Removed": false },
      { "Account": 1930, "Debit": 0, "Credit": 1000, "Description": "Företagskonto", "CostCenter": "", "Project": "", "TransactionInformation": "", "Removed": false }
    ]
  }
}
```

## Lista verifikationer [#lista-verifikationer]

<Tabs groupId="lang" persist items={['curl','TypeScript']}>
<Tab value="curl">
```bash
curl "https://app.klirr.ai/api/v1/3/vouchers/sublist/A?financialyear=3&fromdate=2026-03-01&todate=2026-03-31" \
  -H "Authorization: Bearer <access_token>"
```
</Tab>
<Tab value="TypeScript">
```ts
const res = await fetch(
  'https://app.klirr.ai/api/v1/3/vouchers/sublist/A?financialyear=3&fromdate=2026-03-01&todate=2026-03-31',
  { headers: { Authorization: 'Bearer <access_token>' } },
);
const { Vouchers, MetaInformation } = await res.json();
```
</Tab>
</Tabs>

```json
{
  "Vouchers": [
    {
      "@url": "https://app.klirr.ai/api/v1/3/vouchers/A/42",
      "VoucherNumber": 42,
      "VoucherSeries": "A",
      "Year": 3,
      "TransactionDate": "2026-03-15",
      "Description": "Kontorsmaterial",
      "Comments": "",
      "ReferenceNumber": "",
      "ReferenceType": "MANUAL",
      "ApprovalState": 0
    }
  ],
  "MetaInformation": { "@TotalResources": 1, "@TotalPages": 1, "@CurrentPage": 1 }
}
```

## Hämta en verifikation [#hämta-en-verifikation]

<Tabs groupId="lang" persist items={['curl','TypeScript']}>
<Tab value="curl">
```bash
curl "https://app.klirr.ai/api/v1/3/vouchers/A/42?financialyear=3" \
  -H "Authorization: Bearer <access_token>"
```
</Tab>
<Tab value="TypeScript">
```ts
const res = await fetch('https://app.klirr.ai/api/v1/3/vouchers/A/42?financialyear=3', {
  headers: { Authorization: 'Bearer <access_token>' },
});
const { Voucher } = await res.json();
```
</Tab>
</Tabs>

## Fel [#fel]

| Status | `Code` | När |
|---|---|---|
| 400 | 9000400 | `VoucherSeries`, `TransactionDate` eller `Description` saknas eller är ogiltigt, serien finns inte eller är inaktiverad, datumet ligger utanför varje räkenskapsår, datumet ligger inte i angivet `financialyear`, obalanserad verifikation, ogiltig rad eller konto som inte finns/är inaktivt, ostödd sökparameter. |
| 404 | 9000404 | `Kan inte hitta verifikationen`, `Kan inte hitta verifikationsserien`, eller okänt räkenskapsår. |
| 409 | 9000409 | `TransactionDate` ligger i en låst period (serier som får kringgå periodlåset, som bokslutsserien `Å`, undantas), eller i ett stängt räkenskapsår. Se [låst period](/api/referens/settings-lockedperiod). |

Allmänna fel (401, 403, 429) beskrivs under [Felkoder](/api/felkoder).
