Hopp til innhold
↑ ↓ navigerEnter åpneEsc lukk

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:

  1. Peppol hvis mottakeren er registrert i ELMA. Vi lager EHF 3.0, validerer og leverer til mottakerens aksesspunkt. faktura.levert kommer når deres aksesspunkt kvitterer (vanligvis sekunder).
  2. E-post med PDF og betalingslenke hvis mottakeren har e-post. faktura.levert når e-posten er akseptert av mottakerens server.
  3. Brev via print-partner hvis du tillater det med kanal: "auto_brev" eller setter kanal: "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.

StegTypiskHva Spire gjør
Påminnelse3 dager før forfallVennlig melding via Varsling, ingen gebyr
Purring 114 dager etter forfallPurring med gebyr etter forskrift, ny frist 14 dager
Inkassovarsel14 dager etter purringInkassovarsel med 14 dagers frist, lovpålagt tekst
StoppLø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.

Sist oppdatert 14. oktober 2026 Fant du en feil? Si fra, så retter vi innen en virkedag.