Kvittia API – koppla Kvittia till era system
Hämta kvitton, leverantörsfakturor, kundfakturor och banktransaktioner, ladda upp kvitton och markera dem som bokförda – direkt från ert affärssystem, ert BI-verktyg eller egen kod.
https://kvittia.se/api/v1Översikt
Kvittia API ger ert bolag programmatisk åtkomst till samma uppgifter som finns i Kvittia. Vanliga användningsområden:
- Bokföring: hämta kvitton och leverantörsfakturor med belopp, moms och BAS-konto till ert ekonomi- eller affärssystem – och markera dem som bokförda.
- Uppladdning: skicka kvitton från egna appar, skannrar eller kortleverantörer. Kvittia läser av dem automatiskt.
- Rapporter och BI: läs kvitton, fakturor och banktransaktioner till Power BI, Excel eller egen analys.
- Avstämning: se vilka banktransaktioner som saknar underlag.
API:et följer REST: resurser har egna adresser, du använder GET för att läsa, POST för att skapa och PATCH för att ändra. Alla svar är JSON.
Kom igång
- Logga in i Kvittia som admin i bolaget ni vill koppla.
- Gå till Inställningar → API och klicka Skapa nyckel. Välj Läsa eller Läsa och skriva.
- Kopiera nyckeln – den visas bara en gång. Den börjar med
kv_live_. - Gör ert första anrop:
curl https://kvittia.se/api/v1/bolag \
-H "Authorization: Bearer kv_live_DIN_NYCKEL"Svaret innehåller bolagets namn, abonnemang och vilken nyckel som användes.
Autentisering
Skicka nyckeln i headern Authorization i varje anrop:
GET /api/v1/kvitton HTTP/1.1
Host: kvittia.se
Authorization: Bearer kv_live_DIN_NYCKEL
Accept: application/json- Varje nyckel hör till ett bolag. Har ni flera bolag skapar ni en nyckel i varje.
- Behörighet:
Läsager tillgång till allaGET-anrop.Läsa och skrivager ävenPOSTochPATCH. - Nyckeln gäller så länge personen som skapade den är admin i bolaget. Ni kan när som helst återkalla en nyckel under Inställningar → API.
- Använd alltid HTTPS och lägg aldrig nyckeln i kod som körs i en webbläsare eller app hos slutanvändare.
Format
| Typ | Format | Exempel |
|---|---|---|
| Datum | ÅÅÅÅ-MM-DD | 2026-10-05 |
| Tidpunkt | ISO 8601 med tidszon | 2026-10-05T12:41:09+02:00 |
| Belopp | Decimaltal med punkt, inklusive moms | 1249.50 |
| Id | Kvitton och fakturor: UUID. Leverantörer och transaktioner: heltal. | 9b2f6c1e-… |
| Tomt värde | null |
Skicka data som application/json eller, när du laddar upp filer, som multipart/form-data.
Paginering
Listor returneras sida för sida. Använd sida (från 1) och per_sida (1–100, standard 50).
{
"data": [ … ],
"meta": { "sida": 1, "per_sida": 50, "totalt": 213, "sidor": 5 }
}Synka ändringar
För att bara hämta det som ändrats sedan förra körningen: spara tidpunkten när du startar en synk och skicka den som uppdaterad_efter nästa gång. Fungerar för kvitton, leverantörsfakturor och kundfakturor.
curl "https://kvittia.se/api/v1/kvitton?uppdaterad_efter=2026-10-05T06:00:00%2B02:00&per_sida=100" \
-H "Authorization: Bearer kv_live_DIN_NYCKEL"Felkoder
Fel returneras med en HTTP-statuskod och ett JSON-objekt:
{
"fel": {
"kod": "valideringsfel",
"meddelande": "Uppgifterna kunde inte valideras.",
"falt": { "datum": ["Datumet måste ha formatet ÅÅÅÅ-MM-DD."] }
}
}| Status | Kod | Betydelse |
|---|---|---|
| 401 | saknar_nyckel, ogiltig_nyckel | Nyckeln saknas, är felstavad eller återkallad. |
| 402 | abonnemang_sparrat | Bolagets abonnemang är spärrat. |
| 403 | endast_lasning | Nyckeln får bara läsa. |
| 403 | tjansten_ingar_inte | Tjänsten (t.ex. leverantörsfakturor) ingår inte i abonnemanget. |
| 403 | agaren_saknar_behorighet, bolaget_inaktivt | Personen som skapade nyckeln är inte längre admin, eller bolaget är inaktiverat. |
| 404 | hittades_inte, okand_adress | Posten eller adressen finns inte. |
| 409 | dubblett | Kvittot finns redan. Svaret innehåller befintligt_id. |
| 422 | valideringsfel, inte_ett_kvitto | Uppgifterna är felaktiga, eller filen var inte ett kvitto. |
| 423 | perioden_last | Månaden är låst efter månadsavslut. |
| 429 | for_manga_anrop | För många anrop – vänta enligt Retry-After. |
Begränsningar
Varje nyckel får göra 120 anrop per minut. Svaren innehåller X-RateLimit-Limit och X-RateLimit-Remaining. Vid 429 anger Retry-After hur många sekunder du ska vänta. Filer får vara högst 10 MB.
GET/bolag
Bolaget som nyckeln hör till, dess abonnemang och vilka tjänster som ingår.
{
"data": {
"id": 12,
"namn": "Företaget AB",
"orgnr": "556677-8899",
"abonnemang": {
"paket": "Företag",
"tjanster": [
"kvitton",
"leverantorsfakturor",
"avstamning",
"kundfakturor",
"revisorspaket",
"sok_foretag"
]
},
"nyckel": {
"namn": "Affärssystemet",
"behorighet": "skriv",
"prefix": "kv_live_Ab12Cd"
}
}
}GET/referens
Tillåtna värden för kategorier, momssatser, betalsätt och statusar. Använd dem när du laddar upp eller ändrar kvitton.
GET/kvitton
Lista bolagets kvitton, nyast först.
| Parameter | Typ | Beskrivning |
|---|---|---|
fran | datum | Kvitton med datum från och med. |
till | datum | Kvitton med datum till och med. |
status | text | ny, bokford eller avvisad. |
kategori | text | Exakt kategori, se /referens. |
uppdaterad_efter | tidpunkt | Bara kvitton som ändrats efter tidpunkten. |
sok | text | Söker i butik och kvittonummer. |
sida, per_sida | heltal | Se Paginering. |
curl "https://kvittia.se/api/v1/kvitton?fran=2026-10-01&status=ny" \
-H "Authorization: Bearer kv_live_DIN_NYCKEL"GET/kvitton/{id}
Ett kvitto. Svaret innehåller kvittoobjektet:
{
"data": {
"id": "9b2f6c1e-4a8d-4f3b-9a51-2f0c7e6d1a44",
"butik": "Restaurang Exempel",
"orgnr": "556677-8899",
"datum": "2026-10-05",
"belopp": 330,
"moms": 35.36,
"netto": 294.64,
"momssats": "12",
"valuta": "SEK",
"belopp_valuta": null,
"kurs": null,
"kategori": "Restaurang & lunch",
"konto": "6071",
"betalsatt": "Företagskort",
"kvittonr": "10442",
"notering": null,
"status": "ny",
"status_kommentar": null,
"bokford_at": null,
"avlases": false,
"kalla": "app",
"filtyp": "bild",
"matchad_transaktion": 5512,
"anvandare": {
"namn": "Anna Andersson",
"epost": "anna@foretaget.se"
},
"skapad": "2026-10-05T12:41:09+02:00",
"uppdaterad": "2026-10-05T12:41:15+02:00",
"fil_url": "https://kvittia.se/api/v1/kvitton/9b2f6c1e-4a8d-4f3b-9a51-2f0c7e6d1a44/fil"
}
}GET/kvitton/{id}/fil
Själva underlaget – bild, PDF eller sparat mejl – som filnedladdning.
curl -o kvitto.jpg https://kvittia.se/api/v1/kvitton/9b2f6c1e-…/fil \
-H "Authorization: Bearer kv_live_DIN_NYCKEL"POST/kvitton
Ladda upp ett kvitto som multipart/form-data. Kräver nyckel med skrivbehörighet. Skickar du bara filen läser Kvittia av butik, datum, belopp, moms och kategori automatiskt.
| Fält | Typ | Beskrivning |
|---|---|---|
fil * | fil | JPG, PNG, WebP eller PDF, högst 10 MB. |
las_av | true/false | Läs av kvittot automatiskt. Standard: true om belopp saknas. |
butik, datum, belopp | text, datum, tal | Krävs om las_av=false. |
moms, momssats | tal, text | Momsbelopp och momssats (25, 12, 6, 0, blandad). |
kategori, betalsatt | text | Se /referens. |
orgnr, kvittonr, notering | text | Valfritt. |
tillat_dubblett | true/false | Spara även om kvittot verkar finnas redan. |
# Låt Kvittia läsa av kvittot
curl -X POST https://kvittia.se/api/v1/kvitton \
-H "Authorization: Bearer kv_live_DIN_NYCKEL" \
-F "fil=@kvitto.jpg"
# Eller skicka uppgifterna själv
curl -X POST https://kvittia.se/api/v1/kvitton \
-H "Authorization: Bearer kv_live_DIN_NYCKEL" \
-F "fil=@kvitto.pdf" -F "las_av=false" \
-F "butik=Restaurang Exempel" -F "datum=2026-10-05" \
-F "belopp=330.00" -F "moms=35.36" -F "momssats=12" \
-F "kategori=Restaurang & lunch"Svar 201 Created med kvittoobjektet. Om avläsningen tar längre tid är avlases true – hämta kvittot igen om en stund. Finns kvittot redan svarar API:et 409 med befintligt_id.
PATCH/kvitton/{id}
Ändra kategori, konto, betalsätt, notering eller status – t.ex. markera kvittot som bokfört när det har förts över till ert ekonomisystem. Kräver skrivbehörighet.
| Fält | Typ | Beskrivning |
|---|---|---|
status | text | ny, bokford eller avvisad. |
status_kommentar | text | Orsak vid avvisad. |
kategori, betalsatt | text | Se /referens. |
konto | text | BAS-konto med fyra siffror. |
notering | text | Fritext, högst 1000 tecken. |
curl -X PATCH https://kvittia.se/api/v1/kvitton/9b2f6c1e-… \
-H "Authorization: Bearer kv_live_DIN_NYCKEL" \
-H "Content-Type: application/json" \
-d '{"status": "bokford"}'GET/leverantorsfakturor
Leverantörsfakturor med attest- och betalstatus. Kräver tjänsten Leverantörsfakturor. Även /leverantorsfakturor/{id} och /leverantorsfakturor/{id}/fil.
| Parameter | Typ | Beskrivning |
|---|---|---|
fran, till | datum | Fakturadatum. |
status | text | granska, godkand eller betald. |
leverantor_id | heltal | Bara en leverantör. |
uppdaterad_efter, sida, per_sida | Som för kvitton. |
{
"data": {
"id": "c41d0f7a-0b6e-4d1e-8f2a-7b9c3e5d2f10",
"typ": "leverantor",
"leverantor": "Kontorsvaror AB",
"orgnr": "556123-4567",
"leverantor_id": 87,
"fakturanr": "2026-1182",
"ocr": "4711082",
"fakturadatum": "2026-10-05",
"forfallodatum": "2026-11-04",
"betaldatum": null,
"belopp": 1249,
"moms": 249.8,
"momssats": "25",
"valuta": "SEK",
"belopp_sek": 1249,
"bankgiro": "5050-1055",
"plusgiro": null,
"iban": null,
"kategori": "Kontorsmaterial",
"status": "godkand",
"bokforing": "ny",
"notering": null,
"matchad_transaktion": null,
"skapad": "2026-10-05T08:02:11+02:00",
"uppdaterad": "2026-10-05T09:15:40+02:00",
"fil_url": "https://kvittia.se/api/v1/leverantorsfakturor/c41d0f7a-0b6e-4d1e-8f2a-7b9c3e5d2f10/fil"
}
}GET/kundfakturor
Kundfakturor och om de är betalda (matchade mot en insättning). Kräver tjänsten Kundfakturor. Parametrar: fran, till, status (betald/obetald), uppdaterad_efter. Även /kundfakturor/{id} och /kundfakturor/{id}/fil.
GET/leverantorer
Leverantörsregistret med org.nr och betalningsuppgifter. Parameter: sok (namn eller org.nr).
GET/transaktioner
Rader från uppladdade kontoutdrag och vilket kvitto eller vilken faktura de är matchade mot. Kräver tjänsten Bankavstämning. Parametrar: fran, till och matchad (true/false) – matchad=false ger transaktioner som saknar underlag.
{
"data": [
{
"id": 5512,
"datum": "2026-10-05",
"text": "RESTAURANG EXEMPEL",
"belopp": -330,
"saldo": 48211.5,
"referens": null,
"kvitto_id": "9b2f6c1e-4a8d-4f3b-9a51-2f0c7e6d1a44",
"faktura_id": null
}
],
"meta": {
"sida": 1,
"per_sida": 50,
"totalt": 1,
"sidor": 1
}
}Objekt
Kvitto
| Fält | Beskrivning |
|---|---|
id | Kvittots id (UUID). |
butik, orgnr, datum, kvittonr | Säljare, säljarens org.nr, köpdatum och kvittonummer. |
belopp, moms, netto, momssats | Belopp inklusive moms, momsbelopp, belopp utan moms och momssats. |
valuta, belopp_valuta, kurs | För kvitton i utländsk valuta: ursprungligt belopp och växelkurs. belopp är alltid i SEK. |
kategori, konto, betalsatt | Kategori, BAS-konto och hur kvittot betalades. |
status, status_kommentar, bokford_at | Bokföringsstatus. |
avlases | true medan Kvittia läser av kvittot. |
kalla, filtyp | Hur kvittot kom in (app, email, api) och om underlaget är bild, PDF eller mejl. |
matchad_transaktion | Id för banktransaktionen kvittot är matchat mot. |
anvandare | Personen som laddade upp kvittot. |
fil_url | Adress för att hämta underlaget. |
Faktura
| Fält | Beskrivning |
|---|---|
id, typ | Fakturans id (UUID) och leverantor eller kund. |
leverantor / kund, orgnr, leverantor_id | Motpart och, för leverantörsfakturor, id i leverantörsregistret. |
fakturanr, ocr, fakturadatum, forfallodatum, betaldatum | Fakturauppgifter. |
belopp, moms, momssats, valuta, belopp_sek | Belopp i fakturans valuta och omräknat till SEK. |
bankgiro, plusgiro, iban | Betalningsmottagare. |
status | Leverantörsfaktura: granska, godkand, betald. Kundfaktura: obetald, betald. |
bokforing | ny, bokford eller avvisad. |
Kodexempel
const BAS = 'https://kvittia.se/api/v1';
const NYCKEL = process.env.KVITTIA_NYCKEL;
// Hämta alla nya kvitton, sida för sida
async function hamtaKvitton() {
let sida = 1, alla = [];
while (true) {
const r = await fetch(`${BAS}/kvitton?status=ny&per_sida=100&sida=${sida}`, {
headers: { Authorization: `Bearer ${NYCKEL}` }
});
if (!r.ok) throw new Error((await r.json()).fel.meddelande);
const { data, meta } = await r.json();
alla.push(...data);
if (sida >= meta.sidor) return alla;
sida++;
}
}
// Markera ett kvitto som bokfört
await fetch(`${BAS}/kvitton/${id}`, {
method: 'PATCH',
headers: { Authorization: `Bearer ${NYCKEL}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ status: 'bokford' })
});<?php
$bas = 'https://kvittia.se/api/v1';
$nyckel = getenv('KVITTIA_NYCKEL');
// Ladda upp ett kvitto och låt Kvittia läsa av det
$ch = curl_init("$bas/kvitton");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Authorization: Bearer $nyckel"],
CURLOPT_POSTFIELDS => ['fil' => new CURLFile('kvitto.jpg')],
]);
$svar = json_decode(curl_exec($ch), true);
if (curl_getinfo($ch, CURLINFO_HTTP_CODE) === 201) {
echo $svar['data']['butik'].' '.$svar['data']['belopp']." kr\n";
} else {
echo 'Fel: '.$svar['fel']['meddelande']."\n";
}import os, requests
BAS = 'https://kvittia.se/api/v1'
H = {'Authorization': f"Bearer {os.environ['KVITTIA_NYCKEL']}"}
# Banktransaktioner som saknar underlag
r = requests.get(f'{BAS}/transaktioner', headers=H, params={'matchad': 'false', 'per_sida': 100})
r.raise_for_status()
for t in r.json()['data']:
print(t['datum'], t['text'], t['belopp'])
# Ladda upp ett kvitto
with open('kvitto.pdf', 'rb') as f:
svar = requests.post(f'{BAS}/kvitton', headers=H, files={'fil': f})
print(svar.status_code, svar.json())using System.Net.Http.Headers;
var http = new HttpClient { BaseAddress = new Uri("https://kvittia.se/api/v1/") };
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("KVITTIA_NYCKEL"));
// Leverantörsfakturor som är godkända men inte betalda
var json = await http.GetStringAsync("leverantorsfakturor?status=godkand&per_sida=100");
Console.WriteLine(json);Ändringslogg
| v1 · 2026-10-08 | Första versionen: bolag, referensdata, kvitton (läsa, ladda upp, ändra), leverantörsfakturor, kundfakturor, leverantörer och banktransaktioner. |
Vi gör aldrig ändringar som bryter befintliga integrationer i v1 – nya fält kan tillkomma i svaren, så ignorera fält ni inte känner igen.
Behöver ni hjälp med integrationen?
Vi hjälper gärna till att koppla Kvittia till ert system.