# Registrera en leverantörsfaktura (/api/guider/leverantorsfaktura)

> Från leverantör till bokförd leverantörsfaktura – skapa leverantör, registrera utkast, rätta och bokför.

Den här guiden registrerar en inkommande faktura från en leverantör och bokför den i leverantörsreskontran. Alla namn, nummer och belopp är påhittade exempel.

Du behöver en access token med scopes `supplier` och `supplierinvoice`.

<Callout title="Två adresser för samma faktura">
En leverantörsfaktura adresseras på Klirrs löpnummer `GivenNumber`, inte på leverantörens eget fakturanummer `InvoiceNumber`. Spara `GivenNumber` från svaret på `POST`.
</Callout>

<Steps>
<Step>
### Skapa leverantören [#skapa-leverantören]

Leverantören måste finnas innan fakturan registreras. Enda obligatoriska fältet är `Name`. Hoppa över steget om leverantören redan finns. Sök med `GET /3/suppliers?suppliernumber=...`.

<Tabs groupId="lang" persist items={['curl','TypeScript']}>
<Tab value="curl">
```bash
curl -X POST https://app.klirr.ai/api/v1/3/suppliers \
  -H "Authorization: Bearer <access_token>" \
  -H "Content-Type: application/json" \
  -d '{"Supplier":{"Name":"Norrlands Trävaror AB","OrganisationNumber":"556000-0003","BG":"000-0001","TermsOfPayment":"30"}}'
```
</Tab>
<Tab value="TypeScript">
```ts
const BASE = 'https://app.klirr.ai/api/v1';
const headers = {
  Authorization: 'Bearer <access_token>',
  'Content-Type': 'application/json',
};

const res = await fetch(`${BASE}/3/suppliers`, {
  method: 'POST',
  headers,
  body: JSON.stringify({
    Supplier: {
      Name: 'Norrlands Trävaror AB',
      OrganisationNumber: '556000-0003',
      BG: '000-0001',
      TermsOfPayment: '30',
    },
  }),
});
const { Supplier } = await res.json(); // 201 Created
const supplierNumber = Supplier.SupplierNumber; // t.ex. "7"
```
</Tab>
</Tabs>
</Step>

<Step>
### Registrera fakturan som utkast [#registrera-fakturan-som-utkast]

`POST` skapar alltid ett **utkast**. `SupplierNumber`, `InvoiceNumber`, `InvoiceDate`, `DueDate` och minst en rad är obligatoriska. Raderna har ingen momssats. Klirr härleder den ur `VAT` mot radernas netto, och den måste landa på 25, 12 eller 6 %.

<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":"7","InvoiceNumber":"NT-40921","InvoiceDate":"2026-10-12","DueDate":"2026-11-11","OCR":"409210","VAT":1600,"SupplierInvoiceRows":[{"Account":4010,"ItemDescription":"Konstruktionsvirke 45x95","Quantity":40,"Price":160}]}}'
```
</Tab>
<Tab value="TypeScript">
```ts
const create = await fetch(`${BASE}/3/supplierinvoices`, {
  method: 'POST',
  headers,
  body: JSON.stringify({
    SupplierInvoice: {
      SupplierNumber: supplierNumber,
      InvoiceNumber: 'NT-40921',
      InvoiceDate: '2026-10-12',
      DueDate: '2026-11-11',
      OCR: '409210',
      VAT: 1600,
      SupplierInvoiceRows: [
        { Account: 4010, ItemDescription: 'Konstruktionsvirke 45x95', Quantity: 40, Price: 160 },
      ],
    },
  }),
});
if (create.status !== 201) throw new Error(`Kunde inte registrera: ${create.status}`);
const { SupplierInvoice } = await create.json();
const givenNumber = SupplierInvoice.GivenNumber; // t.ex. "88"
```
</Tab>
</Tabs>

Svar (`201`, förkortat). Beloppen är **strängar** även i den fullständiga formen:

```json
{
  "SupplierInvoice": {
    "@url": "https://app.klirr.ai/api/v1/3/supplierinvoices/88",
    "GivenNumber": "88",
    "SupplierNumber": "7",
    "SupplierName": "Norrlands Trävaror AB",
    "InvoiceNumber": "NT-40921",
    "InvoiceDate": "2026-10-12",
    "DueDate": "2026-11-11",
    "Total": "8000",
    "VAT": "1600",
    "VATType": "NORMAL",
    "Booked": false,
    "Cancelled": false,
    "Vouchers": []
  }
}
```

Samma fakturanummer hos samma leverantör i samma räkenskapsår ger `409`. Det skyddar mot dubbelregistrering.
</Step>

<Step>
### Rätta utkastet (valfritt) [#rätta-utkastet-valfritt]

`PUT` ändrar bara de fält du skickar och fungerar bara på utkast. Skickar du `SupplierInvoiceRows` ersätts raderna.

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

<Step>
### Bokför fakturan [#bokför-fakturan]

`PUT /3/supplierinvoices/{GivenNumber}/bookkeep` bokför fakturan med en verifikation i serie `L`: debet kostnadskonto per rad, ingående moms på 2640 och kredit 2440 leverantörsskuld. Anropet tar ingen kropp och är idempotent.

<Tabs groupId="lang" persist items={['curl','TypeScript']}>
<Tab value="curl">
```bash
curl -X PUT https://app.klirr.ai/api/v1/3/supplierinvoices/88/bookkeep \
  -H "Authorization: Bearer <access_token>"
```
</Tab>
<Tab value="TypeScript">
```ts
const booked = await fetch(`${BASE}/3/supplierinvoices/${givenNumber}/bookkeep`, {
  method: 'PUT',
  headers,
});
const { SupplierInvoice: after } = await booked.json();
console.log(after.Booked, after.Balance, after.Vouchers);
// true "8000" [{ Number: 23, Year: 3, Series: "L", ReferenceType: "SUPPLIERINVOICE" }]
```
</Tab>
</Tabs>

Ett stängt räkenskapsår eller en låst period ger `409`.
</Step>
</Steps>

## Om något blev fel [#om-något-blev-fel]

`PUT /3/supplierinvoices/{GivenNumber}/cancel` makulerar fakturan:

| Läge | Resultat |
|---|---|
| Utkast | Utkastet raderas. |
| Bokförd | Bokföringen återförs med ett rättelseverifikat i serie `M`. |
| Betald | `409`. Betalningen måste ångras först. |

`/credit`, `/approvalbookkeep` och `/approvalpayment` stöds inte och svarar alltid `400`. Det externa API:t har ingen betalningsresurs för leverantörsfakturor, så betalningen registreras i Klirr.

Se [Leverantörsfakturor](/api/referens/supplierinvoices) och [Leverantörer](/api/referens/suppliers) för alla fält.
