# Fortnox-kompatibilitet (/api/fortnox-kompatibilitet)

> Kuvert, partiella uppdateringar, nollvärden, arkivering vid DELETE, taltyper och skillnaderna mot Fortnox.

Klirrs API är byggt för att en Fortnox v3-integration ska fungera genom att byta bas-URL från Fortnox till `https://app.klirr.ai/api/v1`. Resurssökvägar, fältnamn (PascalCase), kuvert och felform är Fortnox egna.

## Kuvertet [#kuvertet]

Skrivningar lindas in i resursnamnet i singular. Svar på en enskild resurs har samma kuvert; listor har pluralnamnet plus `MetaInformation`.

```jsonc
// POST /api/v1/3/customers
{ "Customer": { "Name": "Lindqvist Måleri AB" } }
```

```jsonc
// GET /api/v1/3/customers
{ "Customers": [ ... ], "MetaInformation": { "@TotalResources": 1, "@TotalPages": 1, "@CurrentPage": 1 } }
```

Saknas kuvertet, eller är innehållet inte ett objekt (en sträng eller en array), svarar API:t `400`. Åtgärds-endpoints som `PUT /3/invoices/{n}/bookkeep` tar ingen kropp.

## PUT är partiell [#put-är-partiell]

`PUT` ändrar **bara de fält du skickar**. Utelämnade fält behålls. Det gör att Fortnox-klienter som utelämnar tomma fält (`omitempty`) inte råkar nolla eller återaktivera något.

För att uttryckligen **tömma** ett fält skickar du strängen `"API_BLANK"` (exakt versaler). Fält som inte får vara tomma (t.ex. kundens `Name`) avvisas med `400` om du försöker.

```json
{ "Customer": { "Comments": "API_BLANK" } }
```

## Okända fält bevaras [#okända-fält-bevaras]

Fält Klirr inte modellerar (till exempel kundens `GLN` eller `DeliveryAddress1`) sparas och returneras oförändrade. Du kan läsa en resurs, ändra den och skriva tillbaka den utan att tappa data.

## `""` och `0` i stället för `null` [#-och-0-i-stället-för-null]

Tomma värden returneras som `""` (text) eller `0` (tal), aldrig `null`, precis som hos Fortnox. Testa på tom sträng, inte på `null`.

## Tal eller sträng [#tal-eller-sträng]

| Form | Tal skickas som |
|---|---|
| Enskild resurs (`GET /3/invoices/1`) | JSON-tal: `"Total": 1250` |
| Listrad (`GET /3/invoices`) | Sträng: `"Total": "1250"` |

Belopp avrundas till två decimaler. När du skriver accepteras både tal och sträng.

## DELETE arkiverar [#delete-arkiverar]

Bokföringslagen tillåter inte att bokförd information ändras i efterhand, så Klirr raderar inte register som bokförda poster pekar på.

| Resurs | `DELETE` gör |
|---|---|
| Kunder, artiklar, leverantörer | Inaktiverar. Svarar `204`; resursen finns kvar med `Active: false`. |
| Fakturabetalningar | Se [Fakturabetalningar](/api/referens/invoicepayments). |
| Konton | Se [Kontoplan](/api/referens/accounts). |

Hämtar du en resurs direkt efter `DELETE` får du alltså `200` med `Active: false`, inte `404`. Den försvinner ur listor med `filter=active`.

## Övriga skillnader mot Fortnox [#övriga-skillnader-mot-fortnox]

| | Fortnox | Klirr |
|---|---|---|
| Bas-URL | `https://api.fortnox.se` | `https://app.klirr.ai/api/v1` |
| OAuth | `apps.fortnox.se/oauth-v1/...` | `app.klirr.ai/api/v1/oauth-v1/...` |
| Token-livslängd | 1 h / 45 dagar | Samma |
| PKCE | Finns inte | Valfritt, bara `S256` |
| Felkoder | Fortnox egna nummer | Eget intervall `9000xxx` |
| Rate limit | Fortnox egen | 25 anrop / 5 s per klient och organisation |
| Ostödda sökparametrar | – | Avvisas med `400` i stället för att ignoreras |
| `DELETE` på register | Raderar | Inaktiverar |
| Plan | – | Kräver <Plan min="ai_pro" /> |
| Resurser | Hela Fortnox v3 | De [tolv resurserna](/api) i referensen |
