- Dokumentasjon
- Produkter
Faktura i praksis
Opprett, send og følg opp fakturaer. EHF og Peppol, KID og betalingsmatching, purreløp, kreditnota og mottak av inngående fakturaer.
Faktura tar et JSON-objekt og gjør det til en faktura som kommer frem, blir betalt og blir purret hvis den ikke gjør det. Denne guiden går gjennom hele livsløpet.
Livsløpet
utkast → sendt → levert → betalt
↘ avvist ↘ forfalt → purret → inkassovarslet
Hver overgang gir en webhook (faktura.sendt, faktura.levert, …). Du kan alltid hente gjeldende tilstand med GET /v1/fakturaer/{id}.
Opprett
const f = await spire.fakturaer.opprett({
mottaker: { orgnr: '923456789' },
forfall: '2026-12-01',
referanse: 'Prosjekt 44', // kundens referanse, vises på fakturaen
linjer: [
{ tekst: 'Konsulenttimer oktober', antall: 40, enhet: 'time', pris: 1250, mva: 25 },
{ tekst: 'Reise', antall: 1, pris: 1840, mva: 12 },
],
metadata: { ordre_id: '10422' }, // kommer tilbake i webhooks
}, { idempotencyKey: 'ordre-10422' });
Fakturaen er nå et utkast uten nummer. Du kan endre den med PATCH eller slette den. Når du sender, tildeles neste fakturanummer i serien, og den blir uforanderlig.
Mottaker kan være et organisasjonsnummer (vi henter navn og adresse fra Oppslag) eller en privatperson med navn, epost og adresse. For privatpersoner gjelder forbrukerregler: minst 14 dagers forfall og begrensninger på purregebyr.
Beløp oppgis eks. mva per linje. Vi regner ut mva, avrunder etter norske regler og returnerer netto, mva, brutto. Mva-satsene er 0, 12, 15 og 25. Fritak oppgis som mva: 0 med mva_fritak: "utenfor" eller "fritatt".
Send
const sendt = await spire.fakturaer.send(f.id);
console.log(sendt.nummer, sendt.kanal, sendt.kid);
Kanalen velges automatisk:
- Peppol hvis mottakeren er registrert i ELMA. Vi lager EHF 3.0, validerer og leverer til mottakerens aksesspunkt.
faktura.levertkommer når deres aksesspunkt kvitterer (vanligvis sekunder). - E-post med PDF og betalingslenke hvis mottakeren har e-post.
faktura.levertnår e-posten er akseptert av mottakerens server. - Brev via print-partner hvis du tillater det med
kanal: "auto_brev"eller setterkanal: "brev".
Du kan tvinge en kanal med kanal. Tvinger du Peppol til en mottaker som ikke finnes der, får du 409 konflikt med forklaring før noe sendes.
KID og betaling
Alle fakturaer i NOK får KID. Standard er MOD10 med fakturanummeret innbakt; lengde og algoritme settes per konto i dashbordet. KID-en står i kid og på fakturaen.
Betalinger matches automatisk hvis du kobler en bankkonto i dashbordet (OCR-fil eller åpen bank). Fakturaen går til betalt og du får faktura.betalt. Delbetalinger reduserer belop.rest og gir faktura.delvis_betalt.
Uten kobling registrerer du betalinger selv:
curl -X POST https://api.spireapi.com/v1/innbetalinger \
-d '{"faktura_id":"fak_…","belop":62500,"dato":"2026-11-28","kilde":"manuell"}'
Purreløp
Et purreløp er en liste over hva som skjer etter forfall. Definer det i dashbordet og referer med purreløp på fakturaen, eller sett et standardløp for kontoen.
| Steg | Typisk | Hva Spire gjør |
|---|---|---|
| Påminnelse | 3 dager før forfall | Vennlig melding via Varsling, ingen gebyr |
| Purring 1 | 14 dager etter forfall | Purring med gebyr etter forskrift, ny frist 14 dager |
| Inkassovarsel | 14 dager etter purring | Inkassovarsel med 14 dagers frist, lovpålagt tekst |
| Stopp | Løpet stopper når fakturaen betales eller krediteres |
Du kan pause og gjenoppta løpet per faktura (POST /v1/fakturaer/{id}/purring/pause). Purregebyr og renter beregnes etter gjeldende satser og legges til belop.rest. Spire sender ikke til inkasso; etter inkassovarsel får du faktura.klar_for_inkasso og tar det videre selv eller via en partner.
Kreditnota
await spire.fakturaer.kreditnota(f.id, { aarsak: 'Feil antall timer', linjer: [{ tekst: 'Konsulenttimer oktober', antall: 4, pris: 1250, mva: 25 }] });
Uten linjer krediteres hele fakturaen. Kreditnotaen får eget nummer, sendes i samme kanal, og belop.rest på fakturaen reduseres. Fakturaer kan ikke slettes etter sending; kreditnota er den eneste veien tilbake.
Mottak (Innboks)
Aktiver Innboks i dashbordet for å motta EHF. Vi registrerer organisasjonen din i ELMA, og inngående fakturaer dukker opp under GET /v1/innboks som JSON med linjer, beløp og vedlegg, pluss webhooken innboks.ny.
for f in spire.innboks.list(status="ny"):
print(f.avsender.navn, f.belop.brutto, f.forfall)
spire.innboks.marker(f.id, status="behandlet")
Flere avsendere
Fakturerer du på vegne av flere selskaper (byrå, plattform), bruk underkontoer. Hver underkonto har eget organisasjonsnummer, egen nummerserie, egen KID-oppsett og egen Peppol-registrering. Se SaaS-løsningen.
Testing
Sandkassen simulerer hele flyten. Testselskap 999900006 avviser alt, 999900007 betaler etter ett minutt, 999900008 betaler aldri. Med hodet Spire-Sandkasse-Tid: hurtig blir dager til minutter, så et helt purreløp kan testes på en halvtime. Se sandkassen.