# Leverantörsfakturor (/api/referens/supplierinvoices)

> Leverantörsreskontran – lista, registrera, uppdatera, bokföra och makulera leverantörsfakturor via /3/supplierinvoices.

Leverantörsfakturaresursen speglar Fortnox `/3/supplierinvoices`. Fakturan adresseras på Klirrs eget löpnummer (`GivenNumber`), inte på leverantörens fakturanummer (`InvoiceNumber`), som varken är unikt eller Klirrs att dela ut. `GivenNumber` kan inte ändras.

`POST` skapar ett **utkast**. Bokföringen görs i ett separat steg med `/bookkeep`.

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

## Endpoints [#endpoints]

| Metod och sökväg | Beskrivning |
|---|---|
| <Endpoint method="GET" path="/api/v1/3/supplierinvoices" /> | Lista leverantörsfakturor (reducerad listform) |
| <Endpoint method="POST" path="/api/v1/3/supplierinvoices" /> | Registrera ett utkast. Svarar `201`. |
| <Endpoint method="GET" path="/api/v1/3/supplierinvoices/{GivenNumber}" /> | Hämta en faktura (fullständig form) |
| <Endpoint method="PUT" path="/api/v1/3/supplierinvoices/{GivenNumber}" /> | Uppdatera ett utkast (partiellt) |
| <Endpoint method="PUT" path="/api/v1/3/supplierinvoices/{GivenNumber}/bookkeep" /> | Bokför fakturan |
| <Endpoint method="PUT" path="/api/v1/3/supplierinvoices/{GivenNumber}/cancel" /> | Makulera fakturan |
| <Endpoint method="PUT" path="/api/v1/3/supplierinvoices/{GivenNumber}/credit" /> | Stöds inte – svarar `400` |
| <Endpoint method="PUT" path="/api/v1/3/supplierinvoices/{GivenNumber}/approvalbookkeep" /> | Stöds inte – svarar `400` |
| <Endpoint method="PUT" path="/api/v1/3/supplierinvoices/{GivenNumber}/approvalpayment" /> | Stöds inte – svarar `400` |

Det finns ingen `DELETE`. Vägen bort är `/cancel`. Bas-URL: `https://app.klirr.ai/api/v1`. Skrivningar kuverteras i `SupplierInvoice`.

## Listparametrar [#listparametrar]

Utöver [paginering](/api/paginering) (`page`, `limit`, `offset`). Det finns ingen `sortby`. Listan sorteras alltid på `GivenNumber`, nyast först.

| Parameter | Värden | Beskrivning |
|---|---|---|
| `filter` | se nedan | Okänt värde ger `400`. |
| `suppliernumber` | text | Leverantörens nummer. Okänd leverantör ger en tom lista, inte `404`. |
| `invoicenumber` | text | Leverantörens fakturanummer. |
| `fromdate` | `YYYY-MM-DD` | Från och med datum. Ogiltigt datum ger `400`. |
| `todate` | `YYYY-MM-DD` | Till och med datum. |

| `filter` | Träffar |
|---|---|
| `unbooked` | Utkast. |
| `unpaid` | Bokförda, obetalda. |
| `unpaidoverdue` | Bokförda, obetalda och förfallna. |
| `fullypaid` | Betalda. |
| `cancelled` | Makulerade. |
| `pendingpayment`, `authorizepending` | Alltid en tom lista. Klirr har varken betalningsfil eller attestflöde. |

Fortnox-parametrarna `suppliername`, `serialnumber`, `ocr`, `costcenter`, `project`, `ourreference`, `yourreference`, `fromfinalpaydate`, `tofinalpaydate` och `lastmodified` stöds inte ännu och ger `400` i stället för ett tyst ofiltrerat svar.

## Fält [#fält]

Fullständig form (`GET /3/supplierinvoices/{GivenNumber}`, och svaret på `POST`, `PUT` och åtgärderna).

**Beloppen (`Total`, `VAT`, `Balance`, `CurrencyRate` m.fl.) är strängar även i den fullständiga formen**, till skillnad från kundfakturan. Det är så Fortnox typar just den här resursen. Det finns inget `Net`.

| Fält | Typ | Skrivskyddat | Beskrivning |
|---|---|---|---|
| `@url` | string | ja | Resursens URL i Klirr. |
| `GivenNumber` | string | efter skapande | Klirrs löpnummer. Utelämnas det vid `POST` tilldelas nästa lediga. Måste vara ett positivt heltal. |
| `SupplierNumber` | string | nej | **Obligatoriskt vid `POST`.** Leverantören måste redan finnas i [/3/suppliers](/api/referens/suppliers). |
| `SupplierName` | string | ja | Leverantörens namn. |
| `InvoiceNumber` | string | nej | **Obligatoriskt.** Leverantörens eget fakturanummer. |
| `InvoiceDate` | string | nej | **Obligatoriskt.** `YYYY-MM-DD`. |
| `DueDate` | string | nej | **Obligatoriskt.** `YYYY-MM-DD`. |
| `FinalPayDate` | string | ja | Betalningsdatum, `""` om obetald. |
| `Comments` | string | nej | Anteckning. |
| `Currency` | string | nej | Standard `SEK`. |
| `CurrencyRate` | string | nej | Kurs per enhet, upp till sex decimaler. `"1"` för SEK, `"0"` för ett utkast i utländsk valuta utan fastställd kurs. |
| `CurrencyUnit` | number | nej | Läses vid skrivning (kursen delas med den). Returneras alltid som `1`. |
| `Total` | string | ja | Fakturans totalbelopp, härlett ur raderna. |
| `VAT` | string | nej | Momsbelopp. Vid skrivning används det för att härleda momssatsen (25, 12 eller 6 %). |
| `Balance` | string | ja | Utestående belopp, i fakturans valuta. |
| `VATType` | string | nej | `NORMAL` (standard), `EUINTERNAL`, `REVERSE` eller Klirrs preciseringar `REVERSECHARGEEUGOODS`, `REVERSECHARGEEUSERVICES`, `REVERSECHARGENONEUSERVICES`, `REVERSECHARGEDOMESTICGOODS`, `REVERSECHARGEDOMESTICSERVICES`, `IMPORT`. Svaret innehåller alltid det exakta värdet, så `REVERSE` läses tillbaka som `REVERSECHARGEDOMESTICSERVICES`. Okänt värde ger `400`. |
| `Booked` | boolean | ja | `true` för bokförd eller betald faktura. |
| `Cancelled` | boolean | ja | `true` för makulerad faktura. |
| `Credit` | boolean | ja | Alltid `false`. |
| `PaymentPending` | boolean | ja | Alltid `false`. |
| `CreditReference` | number | ja | Alltid `0`. |
| `AccountingMethod` | `ACCRUAL` \| `CASH` | ja | Organisationens bokföringsmetod. |
| `Vouchers` | array | ja | Verifikationer som pekar på fakturan: `{ Number, Year, Series, ReferenceType }`. `Year` är räkenskapsårets id, inte kalenderåret. |
| `Freight`, `AdministrationFee`, `RoundOffValue` | string | – | Alltid `"0"`. Ett värde skilt från noll vid skrivning ger `400`. Lägg beloppet som en egen rad. |
| `OCR`, `OurReference`, `YourReference`, `Project`, `CostCenter`, `ExternalInvoiceNumber`, `ExternalInvoiceSeries`, `SalesType`, `DisablePaymentFile` | – | nej | Bärs vidare oförändrade. `SalesType` returneras bara som `STOCK`, `SERVICE` eller `""`. |
| `SupplierInvoiceRows` | array | nej | **Minst en rad vid `POST`.** Se nedan. |

### Rader [#rader]

| Fält | Typ | Skrivskyddat | Beskrivning |
|---|---|---|---|
| `Account` | number | nej | Kostnadskonto. Utelämnat faller det tillbaka på leverantörens `PreDefinedAccount`. Kontot måste finnas i kontoplanen. |
| `ItemDescription` | string | nej | Beskrivning. Saknas den används `AccountDescription`, annars `"Rad"`. |
| `Quantity` | number | nej | Antal. Negativt antal ger `400`. |
| `Price` | number | nej | À-pris, exklusive moms. |
| `Debit` | number | nej | Radens nettobelopp i kronor. Används när `Quantity`/`Price` saknas. |
| `DebitCurrency` | number | nej | Radens nettobelopp i fakturans valuta. Vinner över `Debit`. Krävs för fakturor i utländsk valuta om du inte anger `Quantity` och `Price`. |
| `Credit`, `CreditCurrency` | number | nej | Måste vara `0`. Kreditrader ger `400`. |
| `Total` | number | ja | Radens nettobelopp. |
| `Unit` | string | ja | Enhet. |
| `Code` | string | nej | `TOT` och `VAT` ignoreras (summor räknas av Klirr). `FRT`, `AFE` och `ROV` ger `400`. Övriga koder bärs vidare. |
| `AccountDescription`, `ArticleNumber`, `CostCenter`, `Project`, `TransactionInformation` | string | nej | Bärs vidare oförändrade. |

Fortnox-raden har ingen momssats. Klirr härleder den ur fakturans `VAT` mot radernas netto: den måste landa på 25, 12 eller 6 % (med öresavrundning), annars `400`. `VAT` = 0 ger 0 %. För omvänd skattskyldighet antas 25 %. En faktura med blandade momssatser kan alltså inte registreras via det här API:t.

### Listform [#listform]

`GET /3/supplierinvoices` returnerar en reducerad rad med fälten `@url`, `AuthorizerName` (alltid `""`), `Balance`, `Booked`, `Cancel`, `CostCenter`, `Credit`, `Currency`, `CurrencyRate`, `CurrencyUnit`, `DisablePaymentFile`, `DueDate`, `ExternalInvoiceNumber`, `ExternalInvoiceSeries`, `FinalPayDate`, `GivenNumber`, `InvoiceDate`, `InvoiceNumber`, `Project`, `SupplierName`, `SupplierNumber`, `Total` och `Vouchers`. Observera att makuleringsflaggan heter `Cancel` i listan men `Cancelled` i den fullständiga formen, precis som hos Fortnox.

## Registrera en leverantörsfaktura [#registrera-en-leverantörsfaktura]

<Tabs groupId="lang" persist items={['curl','TypeScript']}>
<Tab value="curl">
```bash
curl -X POST https://app.klirr.ai/api/v1/3/supplierinvoices \
  -H "Authorization: Bearer <access_token>" \
  -H "Content-Type: application/json" \
  -d '{"SupplierInvoice":{"SupplierNumber":"1","InvoiceNumber":"F-2026-118","InvoiceDate":"2026-10-01","DueDate":"2026-10-31","VAT":250,"SupplierInvoiceRows":[{"Account":4010,"ItemDescription":"Byggmaterial","Quantity":1,"Price":1000}]}}'
```
</Tab>
<Tab value="TypeScript">
```ts
const res = await fetch('https://app.klirr.ai/api/v1/3/supplierinvoices', {
  method: 'POST',
  headers: {
    Authorization: 'Bearer <access_token>',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    SupplierInvoice: {
      SupplierNumber: '1',
      InvoiceNumber: 'F-2026-118',
      InvoiceDate: '2026-10-01',
      DueDate: '2026-10-31',
      VAT: 250,
      SupplierInvoiceRows: [
        { Account: 4010, ItemDescription: 'Byggmaterial', Quantity: 1, Price: 1000 },
      ],
    },
  }),
});
const { SupplierInvoice } = await res.json(); // 201 Created
```
</Tab>
</Tabs>

Svar (`201`), förkortat:

```json
{
  "SupplierInvoice": {
    "@url": "https://app.klirr.ai/api/v1/3/supplierinvoices/42",
    "GivenNumber": "42",
    "SupplierNumber": "1",
    "SupplierName": "Lindqvist Grossist AB",
    "InvoiceNumber": "F-2026-118",
    "InvoiceDate": "2026-10-01",
    "DueDate": "2026-10-31",
    "FinalPayDate": "",
    "Currency": "SEK",
    "CurrencyRate": "1",
    "CurrencyUnit": 1,
    "Total": "1250",
    "VAT": "250",
    "Balance": "0",
    "VATType": "NORMAL",
    "Booked": false,
    "Cancelled": false,
    "Credit": false,
    "PaymentPending": false,
    "AccountingMethod": "ACCRUAL",
    "Vouchers": [],
    "SupplierInvoiceRows": [
      {
        "Account": 4010,
        "ItemDescription": "Byggmaterial",
        "Quantity": 1,
        "Price": 1000,
        "Debit": 1000,
        "DebitCurrency": 1000,
        "Credit": 0,
        "CreditCurrency": 0,
        "Total": 1000,
        "Unit": "",
        "Code": ""
      }
    ]
  }
}
```

## Lista leverantörsfakturor [#lista-leverantörsfakturor]

<Tabs groupId="lang" persist items={['curl','TypeScript']}>
<Tab value="curl">
```bash
curl "https://app.klirr.ai/api/v1/3/supplierinvoices?filter=unpaid&suppliernumber=1" \
  -H "Authorization: Bearer <access_token>"
```
</Tab>
<Tab value="TypeScript">
```ts
const res = await fetch(
  'https://app.klirr.ai/api/v1/3/supplierinvoices?filter=unpaid&suppliernumber=1',
  { headers: { Authorization: 'Bearer <access_token>' } },
);
const { SupplierInvoices, MetaInformation } = await res.json();
```
</Tab>
</Tabs>

```json
{
  "SupplierInvoices": [
    {
      "@url": "https://app.klirr.ai/api/v1/3/supplierinvoices/42",
      "AuthorizerName": "",
      "Balance": "1250",
      "Booked": true,
      "Cancel": false,
      "CostCenter": "",
      "Credit": false,
      "Currency": "SEK",
      "CurrencyRate": "1",
      "CurrencyUnit": 1,
      "DisablePaymentFile": false,
      "DueDate": "2026-10-31",
      "ExternalInvoiceNumber": "",
      "ExternalInvoiceSeries": "",
      "FinalPayDate": "",
      "GivenNumber": "42",
      "InvoiceDate": "2026-10-01",
      "InvoiceNumber": "F-2026-118",
      "Project": "",
      "SupplierName": "Lindqvist Grossist AB",
      "SupplierNumber": "1",
      "Total": "1250",
      "Vouchers": [{ "Number": 12, "Year": 1, "Series": "L", "ReferenceType": "SUPPLIERINVOICE" }]
    }
  ],
  "MetaInformation": { "@TotalResources": 1, "@TotalPages": 1, "@CurrentPage": 1 }
}
```

## Uppdatera ett utkast [#uppdatera-ett-utkast]

`PUT` ändrar bara de fält du skickar och fungerar bara på utkast. En bokförd eller makulerad faktura ger `409`, eftersom bokförd räkenskapsinformation inte får ändras. Skickar du `SupplierInvoiceRows` ersätts raderna. Se [Fortnox-kompatibilitet](/api/fortnox-kompatibilitet).

<Tabs groupId="lang" persist items={['curl','TypeScript']}>
<Tab value="curl">
```bash
curl -X PUT https://app.klirr.ai/api/v1/3/supplierinvoices/42 \
  -H "Authorization: Bearer <access_token>" \
  -H "Content-Type: application/json" \
  -d '{"SupplierInvoice":{"DueDate":"2026-11-15"}}'
```
</Tab>
<Tab value="TypeScript">
```ts
await fetch('https://app.klirr.ai/api/v1/3/supplierinvoices/42', {
  method: 'PUT',
  headers: {
    Authorization: 'Bearer <access_token>',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ SupplierInvoice: { DueDate: '2026-11-15' } }),
});
```
</Tab>
</Tabs>

## Åtgärder [#åtgärder]

Alla åtgärder är `PUT` utan kropp och kräver scope `supplierinvoice`. Ett okänt `GivenNumber` ger `404` före allt annat.

### Bokför (`/bookkeep`) [#bokför-bookkeep]

Bokför fakturan med en verifikation i serie `L`: debet kostnadskonto per rad, ingående moms på 2640 och kredit 2440 leverantörsskuld. Svaret är `200` med fakturan som den ser ut efteråt (`Booked: true`, `Balance` och `Vouchers` ifyllda).

Anropet är idempotent: en redan bokförd eller betald faktura svarar `200` med resursen. En makulerad faktura ger `409`, liksom ett stängt räkenskapsår eller en låst period. Kroppen ignoreras, så uppdatera med `PUT` först och bokför sedan.

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

### Makulera (`/cancel`) [#makulera-cancel]

Vad som händer beror på fakturans läge:

| Läge | Resultat |
|---|---|
| Utkast | Utkastet raderas. Svaret är `200` med fakturans sista kända form och `Cancelled: true`. |
| Bokförd | Bokföringen återförs med ett rättelseverifikat i serie `M`. Svaret är `200` med `Cancelled: true`. |
| Redan makulerad | `200` med resursen oförändrad. |
| Betald | `409`. Betalningen måste ångras först. |

### Kreditera (`/credit`) [#kreditera-credit]

Stöds inte och svarar alltid `400`. Klirr har inget kreditflöde och inga negativa rader på leverantörssidan. Vill du backa bokföringen använder du `/cancel`.

### Attest (`/approvalbookkeep`, `/approvalpayment`) [#attest-approvalbookkeep-approvalpayment]

Stöds inte och svarar alltid `400`. Klirr har inget attestflöde: en leverantörsfaktura går direkt från utkast till bokförd med `/bookkeep`. `/approvalpayment` registrerar ingen betalning, och det externa API:et har ingen betalningsresurs för leverantörsfakturor.

## Fel [#fel]

| Status | `Code` | När |
|---|---|---|
| 400 | 9000400 | Obligatoriskt fält saknas, inga rader, okänd leverantör eller okänt konto, rad utan konto när leverantören saknar `PreDefinedAccount`, okänt `filter` eller `VATType`, ostödd sökparameter, ogiltigt datum, `Freight`/`AdministrationFee`/`RoundOffValue` skilt från noll, kreditrad eller negativt antal, moms som inte motsvarar 25/12/6 %, `/credit`, `/approvalbookkeep`, `/approvalpayment`. |
| 404 | 9000404 | `Kan inte hitta leverantörsfakturan`. Även för ett `GivenNumber` som inte är ett positivt heltal. |
| 409 | 9000409 | `GivenNumber` är upptaget, samma fakturanummer finns redan på leverantören för räkenskapsåret, `PUT` på en icke-utkastfaktura, bokföring av en makulerad faktura eller i ett stängt räkenskapsår, makulering av en betald faktura. |

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