Recept
Ärendepaketet till inkasso
Programmet äger formatet ett överlämnat ärende paketeras i. Du äger partnern, avtalet och överlämningen. Vill du automatisera vägen till just din partners intag är kontraktet nedan allt en koppling behöver träffa.
Vad programmet gör, och vad det aldrig gör
Programmet paketerar. Det driver aldrig in en fordran, tar aldrig emot en betalning för din räkning och är aldrig part i ditt partneravtal. Gränsen är inkassolagen (1974:182) 2 §: inkassoverksamhet som avser indrivning av fordringar för annans räkning, eller av fordringar som övertagits för indrivning, kräver tillstånd. Att kräva in sina egna fordringar — egeninkasso — är tillståndsfritt, och det du gör med det här paketet är ett steg innan ens det.
Tillsyn och tillstånd enligt inkassolagen ligger sedan den 1 januari 2024 hos Finansinspektionen, inte hos IMY, och Datainspektionens allmänna råd är ersatta av FFFS 2025:2. Det är en annan myndighet än den som håller i kreditupplysningarna, och de två ska inte blandas ihop.
Varför ingen partner är driftad
Husets regel: vi driftar bara det vi kan pröva mot leverantörens eget schema eller egetexempelsvar. Marknadsföringstext som säger "vi har API" är inte dokumentation. Genomsökt 2026-09-06 klarade ingen svensk inkassopartner den ribban för ärendeintag:
- Intrum — Digital inkassotjänst Portal med BankID — Ingen driftad koppling — Intrum publicerar ingen intagsspecifikation. Vägen in är deras egen självbetjäningstjänst, där firmatecknaren legitimerar sig med BankID och ärendet registreras i webbformuläret. Programmet skapar underlaget; du för över det. Kontrollera villkoren hos Intrum innan du lämnar över: uppgifterna nedan är lästa på deras publika sidor 2026-09-06 och är inte ett avtal.
- Lowell — Lowell Easy Portal — Ingen driftad koppling — Lowell publicerar ingen intagsspecifikation. Vägen in är Lowell Easy: du registrerar bolaget med organisationsnummer och skickar in fakturan per ärende. Uppgifterna är lästa på Lowells publika sidor 2026-09-06.
- Sergel — Företagsinkasso Säljkontakt — Ingen driftad koppling. Sergel publicerar ett JSON/REST-API, men det är deras SMS-plattform Sergel Connect och inte ett ärendeintag — vi kopplar inte ihop de två bara för att båda står på sergel.se. Inkassointaget är en avtalsprodukt och specifikationen följer med avtalet. Läst 2026-09-06.
- Svea — Inkasso Säljkontakt — Ingen driftad koppling. Svea nämner en filösning för ärendeintag men publicerar inte formatet, och deras publika tekniska dokumentation gäller betallösningar och inte inkasso. Vägen in går genom avtal och deras webbaserade inkassosystem. Läst 2026-09-06.
- Visma Amili Filväg — Ingen driftad koppling. Amili marknadsför ett API men dokumentationen ligger bakom kontakt, och deras färdiga integrationer är byggda inifrån Vismas egna produkter — inte som ett öppet intag utifrån. Däremot är filvägen uttalad: underlag och betalfil utbyts över SFTP. Läst 2026-09-06.
- Kredinor Säljkontakt — Ingen driftad koppling. Kredinor publicerar ingenting tekniskt om ärendeintag alls — varken API, filformat eller schema. Vägen in är avtal och deras portal. Läst 2026-09-06.
- Inkassogram Portal — Ingen driftad koppling — men den här raden är den som ligger närmast, och skälet är värt att veta. Inkassogram publicerar XML-dokumentation med schema, och deras autentisering klarar husets regel om EN hemlighet: kundnummer och ip-adress är identifierare, och nyckeln är den enda hemligheten. Det publicerade materialet beskriver däremot fakturaskapande och kreditering — inte överlämning av en förfallen egen fordran. En adapter mot ett intag vi aldrig sett dokumenterat vore en gissning, och det bygger vi inte. Får vi specifikationen blir den här raden driftad utan att kontraktet ändras. Läst 2026-09-06.
Därför en exportväg som fungerar med alla, i stället för en adapter mot en av dem. Det är samma val som gav kreditupplysningarna ett öppet kontrakt: en adapter mot ett intag vi aldrig sett dokumenterat är en gissning med kod runt omkring — och en gissning i ett betalningskrav landar hos en gäldenär.
Hämta paketet
Tre format ur samma underlag, på samma adress. De kan inte säga olika saker om samma faktura, för de byggs ur ett och samma objekt.
GET /fakturor/{fakturaId}/inkasso?format=pdf # handlingen att bifoga
GET /fakturor/{fakturaId}/inkasso?format=json # kontraktet nedan
GET /fakturor/{fakturaId}/inkasso?format=csv # Excel-vynAdressen ligger under den inloggade appen och inte under /api/v1, och det är avsiktligt: riktningen i hela ramen är ut ur installationen på ditt eget initiativ. En API-nyckel når aldrig ärendetabellerna — en integratör som kan läsa dem läser gäldenärsuppgifter hos någon annans kunder.
Kontraktet
Fem beslut i formen nedan är avsiktliga och värda att läsa innan du skriver din koppling.
type CollectionCase = {
schema: "debet-kredit/inkasso-arende"
schemaVersion: 1
preparedAt: string // när paketet skapades (ISO 8601)
creditor: { // borgenären — ur dina egna inställningar
name: string
orgNumber: string | null
address: string | null; postalCode: string | null; city: string | null
email: string | null; phone: string | null
bankgiro: string | null; plusgiro: string | null; iban: string | null
/** ditt borgenärsnummer hos partnern, när partnern gett ett */
partnerAccount: string | null
}
debtor: { // gäldenären — ur fakturans FRYSTA snapshot
name: string
orgNumber: string | null; vatNumber: string | null
address: string | null; postalCode: string | null; city: string | null
country: string | null
email: string | null; phone: string | null
yourReference: string | null
}
invoice: {
invoiceNo: number; ocr: string | null
invoiceDate: string; dueDate: string; currency: string
netAmount: number; vatAmount: number; rounding: number; totalAmount: number
notes: string | null // det som stod PÅ fakturan. Aldrig internal_notes.
lines: {
rowNo: number; description: string
quantity: number; unit: string; unitPrice: number
discountPct: number; vatRatePct: number
lineAmount: number // exkl. moms, efter rabatt
}[]
}
/** DATUMET ÄR OBLIGATORISKT — utan det går räntan inte att räkna. */
payments: { date: string; amount: number }[]
reminders: { reminderNo: number; sentDate: string; fee: number }[]
interest: {
amount: number; days: number
fromDate: string; toDate: string
rateSource: "avtalad" | "rantelagen"
agreedRatePct: number | null
/** en delperiod per räntesats och per betalningsdag */
segments: {
from: string; to: string; days: number
ratePct: number; balance: number; amount: number
}[]
/** sant = ett halvårs referensränta saknas. amount är då INTE fullständig. */
incomplete: boolean
missingPeriods: { from: string; to: string }[]
}
claim: { // delarna ska gå att summera till total för hand
principal: { amount: number; currency: string }
interest: { amount: number; currency: string }
reminderFees: { amount: number; currency: string }
total: { amount: number; currency: string }
}
/** borgenären har själv bedömt fordran som tvistig. Varning, inte spärr. */
disputed: boolean
}1. Räntan lämnas segment för segment, aldrig som en siffra
Räntelagen (1975:635) 6 §: räntefoten är den vid varje tid gällande referensräntan med ett tillägg av åtta procentenheter, och referensräntan fastställs för varje kalenderhalvår (9 §). Ett dröjsmål över ett halvårsskifte har alltså mer än en räntesats, och en delbetalning sänker underlaget från sin dag. En gäldenär som bestrider ska kunna räkna efter varje delperiod — en totalsumma utan segment är ett påstående, inte ett underlag.
2. incomplete: true är ett riktigt tillstånd
Saknas ett halvårs referensränta i regeltabellen går räntan inte att belägga. Kontraktet säger då att den är ofullständig i stället för att skriva ut ett belopp som ser färdigt ut. Din adapter ska avbryta på den flaggan, inte fylla i något själv: en gissad räntesats i ett betalningskrav är värre än ingen ränta.
3. Ingen inkassoavgift räknas med
Lagstadgad ersättning för inkassokrav [lag (1981:739) om ersättning för inkassokostnader m.m. 4 §] hör till det krav din partner skickar i sitt eget namn. Att räkna med den i paketet vore att kräva ersättning för en åtgärd som ännu inte vidtagits. reminderFees är de påminnelseavgifter du faktiskt tagit ut, ur din egen påminnelsehistorik.
4. Gäldenären kommer ur fakturans frysta snapshot
Fakturan är en juridisk handling, och uppgifterna frystes när den bokfördes: kravet avser adressen på fakturan. Ett fält som saknas i snapshotet fylls från kundregistret, fält för fält — men står ett värde i snapshotet är det det som gäller.
5. Inget raw-fält, och inga interna anteckningar
Paketet bär det partnern behöver för att kräva, inte hela kundkortet. internal_notes på fakturan och notes på kunden följer aldrig med — de är skrivna för husets eget bruk och kan innehålla vad som helst om en namngiven person. Det är dataminimering enligt dataskyddsförordningen art. 5.1 c.
En egen koppling
Har din partner ett intag du fått specifikationen till: skriv funktionen, kör den när du vill, och markera ärendet som överlämnat i programmet efteråt. Kopplingen är din, utan avgift per ärende.
// En adapter är en funktion. Ingenting mer.
//
// Hämta paketet ur din egen installation och översätt till partnerns format.
// Vad du INTE ska göra: räkna om räntan. Segmenten nedan är redan uppdelade
// per kalenderhalvår och per betalningsdag enligt räntelagen (1975:635)
// 6 och 9 §§, och en andra uträkning glider isär med den första.
const arende: CollectionCase = await fetch(
`${MIN_INSTALLATION}/fakturor/${fakturaId}/inkasso?format=json`,
{ headers: { cookie: minSession } },
).then((r) => r.json());
if (arende.interest.incomplete) {
// Referensräntan saknas för en delperiod. Skicka INTE — ett gissat
// räntebelopp i ett betalningskrav är värre än ingen ränta.
throw new Error(`Ofullständig ränta: ${JSON.stringify(arende.interest.missingPeriods)}`);
}
await minPartner.skapaArende({
creditorNumber: arende.creditor.partnerAccount,
debtor: {
name: arende.debtor.name,
regNo: arende.debtor.orgNumber,
street: arende.debtor.address,
zip: arende.debtor.postalCode,
city: arende.debtor.city,
},
invoiceNumber: String(arende.invoice.invoiceNo),
invoiceDate: arende.invoice.invoiceDate,
dueDate: arende.invoice.dueDate,
capital: arende.claim.principal.amount,
interest: arende.claim.interest.amount,
fees: arende.claim.reminderFees.amount,
reminders: arende.reminders.map((r) => ({ date: r.sentDate, fee: r.fee })),
disputed: arende.disputed,
});Har du fått en partners intagsspecifikation och vill att vi driftar den — hör av dig. Då blir raden en driftad koppling utan att kontraktet ovan ändras, och det är hela poängen med att skriva ramen först.