Spring til indhold
Forta Pay

Reference

Fakturaer (fordringer)

Forta Pay API v1

19 operationer

Dokumentér at fakturaen er sendt uden for Forta Pay (R-12 «manuel rentestart»)

POST /invoices/{invoiceId}/external-dispatch

Renteloven § 3 stk. 3: rente tidligst 30 dage efter fakturaens afsendelse. Forta Pay kender kun sine egne afsendelser; en faktura sendt fra e-conomic, et tidligere opkrævningssystem eller i hånden får derfor ingen automatisk rente, før kreditor her har dokumenteret dagen og beviset. ÉN gang (409 external_dispatch_already_registered); ikke på en kladde (409 invoice_not_issued); datoen hverken i fremtiden eller før fakturadatoen (422).

Parametre

invoiceId

path · string · påkrævet

Idempotency-Key

header · string (uuid) · påkrævet

Obligatorisk på alle POST/PATCH/DELETE. Lever 24 timer.

Krop · InvoiceExternalDispatch

dispatched_on

string (date) · påkrævet

Dagen fakturaen blev sendt uden for Forta Pay (dansk kalender)

evidence

string · påkrævet

Hvad der beviser det, fx «sendt fra e-conomic 4/1, bilag 1043»

Svar

200

OK · Invoice

404

Fejl (RFC 9457) · Problem

409

Fejl (RFC 9457) · Problem

422

Fejl (RFC 9457) · Problem

curl
curl -X POST https://api.fortapay.dk/v1/invoices/{invoiceId}/external-dispatch \
  -H "Authorization: Bearer $FP_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d @- <<'JSON'
{
  "dispatched_on": "…",
  "evidence": "…"
}
JSON

Liste over fakturaer (filtre: debtor_id, status, due_before/after, reminder_level, collection_status, external_ref, fi_payment_id, updated_after)

GET /invoices

Parametre

cursor

query · string · valgfri

limit

query · integer · valgfri

creditor_id

query · string · valgfri

debtor_id

query · string · valgfri

status

query · string · valgfri

reminder_level

query · integer · valgfri

collection_status

query · string · valgfri

external_ref

query · string · valgfri

Kundens fakturanummer (fx e-conomic bookedInvoiceNumber)

fi_payment_id

query · string · valgfri

+71-betaler-id (15 cifre) — alle fakturaens id'er, ikke kun det primære. Support: «kunden har betalt på +71 …»

due_before

query · string (date) · valgfri

due_after

query · string (date) · valgfri

updated_after

query · string (date-time) · valgfri

exclude_status

query · string · valgfri

Kommasepareret liste af InvoiceStatus der UDELADES (fx draft). Ukendt værdi → 422.

shadow

query · boolean · valgfri

Filtrér på fakturaens shadow-felt (indlæst i skygge og stadig holdt — Forta Pay opkræver den ikke). false skjuler skyggefakturaer.

Svar

200

OK · Page + object

curl
curl -X GET https://api.fortapay.dk/v1/invoices \
  -H "Authorization: Bearer $FP_KEY"

Opret faktura/fordring (linjer, forfald, PDF valgfri, distributions- og opkrævningsinstruks)

POST /invoices

K15: findes external_ref allerede hos kreditoren, svares 200 med den eksisterende faktura (idempotent import). 🔴 På en live-konto sætter Forta Pay reminder_level_initial: en værdi > 0 giver 403 reminder_level_platform_only (håndhævet i databasen). Fordringer der allerede er rykket i FarPay, tages ind gennem POST /imports. Sandkassen er uændret.

Parametre

Idempotency-Key

header · string (uuid) · påkrævet

Obligatorisk på alle POST/PATCH/DELETE. Lever 24 timer.

Krop · InvoiceCreate

creditor_id

string · påkrævet

debtor_id

string · påkrævet

external_ref

string · påkrævet

Fakturanummer i kildesystemet. Unik pr. kreditor → idempotent import

issue_date

string (date) · påkrævet

due_date

string (date) · påkrævet

total

Money · påkrævet

vat_total

Money · valgfri

lines

liste af InvoiceLine · valgfri

pdf

object · valgfri

Enten upload (base64, ≤ 5 MB) eller lad Forta Pay rendere fra linjer. Upload = kreditorens EGEN faktura-PDF, gemt som fakturaens original og sendt uændret (samme vej som e-conomic-originalen, G39). Kræver at kreditoren har slået det til (debitorvej.egen_pdf) — ellers 422 own_pdf_not_enabled. Ikke på importens/skyggens vej (pay-rest-debitor)

attachments

liste af object · valgfri

PDF-bilag der sendes BAG fakturaen i samme PDF (e-mail, brev og debitorens «Hent faktura»). Kun PDF uden aktivt indhold (ingen JavaScript, automatiske handlinger, formularer eller indlejrede filer), ikke krypteret, ≤ 5 MB hver og ≤ 10 MB i alt — ellers 422 invalid_attachment med hvad der blev fundet. Kræver at kreditoren har slået bilag til (Indstillinger › Forsendelse) — ellers 422 attachments_not_enabled. Ikke på importens/skyggens vej

distribution

object · valgfri

collection_instruction

object · valgfri

Hvordan skal den opkræves

dunning_plan_id

string | null · valgfri

Default = kreditors standardplan; null = ingen rykkere

reminder_level_initial

integer · valgfri

Ved migration af allerede rykkede fordringer (FarPay-import). 🔴 På en live-konto sættes det kun af Forta Pay eller gennem importen: > 0 på POST /invoices giver 403 reminder_level_platform_only

interest_applies

boolean · valgfri

reference_text

string · valgfri

Adviseringstekst (BS betalingsoversigt, max linjer/tegn valideres pr. rør)

metadata

object · valgfri

fi_payment_id

string · valgfri

Kildesystemets egen trykte +71-linje (15 cifre, mod10 sidst). Bliver fakturaens primære FI-id, og Forta Pay udsteder ikke et nyt. Ugyldigt → 422 invalid_fi_payment_id; brugt på en anden faktura hos kreditoren → 409 fi_payment_id_taken; i Forta Pays navnerum (når kreditoren udsteder) → 422

reminder_history

liste af ReminderHistoryEntry · valgfri

Gebyrhistorikken bag reminder_level_initial fra det TIDLIGERE system (SKIFT-4). Hel eller udeladt: præcis ét trin pr. niveau 1..reminder_level_initial, sent_on stigende med niveauet, ingen før due_date og ingen i fremtiden — ellers 422. Med historik regnes H2 (højst 3 gebyrbelagte) fra trinene med fee > 0 og H3 (10 dage) fra det seneste af dem. Udeladt: hvert importeret niveau tæller som gebyrbelagt, og gebyrdatoen er oprettelsesdagen (tidslinjen siger det i en note). Gebyrerne indgår ALDRIG i saldoen (de tilfalder det tidligere system)

Svar

201

OK · Invoice

200

OK · Invoice

403

Fejl (RFC 9457) · Problem

409

Fejl (RFC 9457) · Problem

422

Fejl (RFC 9457) · Problem

curl
curl -X POST https://api.fortapay.dk/v1/invoices \
  -H "Authorization: Bearer $FP_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d @- <<'JSON'
{
  "creditor_id": "…",
  "debtor_id": "…",
  "external_ref": "…",
  "issue_date": "…",
  "due_date": "…",
  "total": {
    "amount": 0
  }
}
JSON

Hent faktura — bærer ALTID reminder_level, collection_status, payment_method, saldo, næste planlagte handling

GET /invoices/{invoiceId}

Parametre

invoiceId

path · string · påkrævet

Svar

200

OK · Invoice

curl
curl -X GET https://api.fortapay.dk/v1/invoices/{invoiceId} \
  -H "Authorization: Bearer $FP_KEY"

Ret forfaldsdato, distribution, opkrævningsinstruks, rykkerplan, metadata (ikke beløb — brug kreditnota)

PATCH /invoices/{invoiceId}

Hvad der må rettes afhænger af fakturaens tilstand (stykke PATCH-1, K30). ✅ = tilladt, ellers 409 med koden.

| Tilstand | due_date | distribution | collection_instruction | dunning_plan_id | metadata | |---|---|---|---|---|---| | draft | ✅ (≥ issue_date) | ✅ | ✅ | ✅ | ✅ | | open | ✅ (≥ i dag og ≥ issue_date) | ✅ (kun fremtidige udsendelser) | ✅ | ✅ | ✅ | | overdue, dunning | due_date_locked — brug dunning/pause | ✅ | ✅ | ✅ (planen regnes om) | ✅ | | ready_for_collection, in_collection | invoice_in_collection | ← | ← | ← | ✅ | | paid, credited, cancelled, written_off | invoice_closed | ← | ← | ← | ✅ | | importhold (importeret, skiftet ikke aktiveret) | invoice_import_hold | ← | ← | ← | ✅ | | opkrævning med ukendt udfald | charge_outcome_unknown | ← | ← | ← | ✅ |

Ændres due_date eller collection_instruction mens en opkrævning er submitted/accepted: 409 charge_in_flight (med charge_id). Er den scheduled, annulleres den og planlægges igen efter de nye værdier i samme transaktion.

metadata er JSON Merge Patch (RFC 7396): en nøgle med null fjerner nøglen. De øvrige felter erstattes helt; udeladt felt = uændret. Ukendt felt → 422. Hele kaldet er atomisk. En rettelse til samme værdier (no-op) giver 200 og INGEN hændelse. Ellers udsendes præcis én invoice.updated med previous = de ændrede felter. warnings indeholder distribution_future_only når distributionen rettes på en faktura der allerede er sendt.

Parametre

invoiceId

path · string · påkrævet

Idempotency-Key

header · string (uuid) · påkrævet

Obligatorisk på alle POST/PATCH/DELETE. Lever 24 timer.

Krop · InvoiceUpdate

due_date

string (date) · valgfri

distribution

object | null · valgfri

Erstattes helt; null = ingen distribution

collection_instruction

object · valgfri

Erstattes helt

dunning_plan_id

string | null · valgfri

null = ingen rykkere fremover

metadata

object · valgfri

JSON Merge Patch (RFC 7396): null fjerner nøglen

Svar

200

Den rettede faktura + advarsler · Invoice + object

404

Fejl (RFC 9457) · Problem

409

Fejl (RFC 9457) · Problem

422

Fejl (RFC 9457) · Problem

curl
curl -X PATCH https://api.fortapay.dk/v1/invoices/{invoiceId} \
  -H "Authorization: Bearer $FP_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d @- <<'JSON'
{}
JSON

Hent PDF. SIKKER — sender aldrig noget, ændrer aldrig tilstand

GET /invoices/{invoiceId}/pdf

Parametre

invoiceId

path · string · påkrævet

Svar

200

PDF · string (binary)

curl
curl -X GET https://api.fortapay.dk/v1/invoices/{invoiceId}/pdf \
  -H "Authorization: Bearer $FP_KEY"

Hent fakturaen som OIOUBL 2.1 (EAN/NemHandel). SIKKER — danner, sender aldrig, ændrer intet

GET /invoices/{invoiceId}/oioubl

TILFØJET af pay-rest-udbydere 28-09-2026 (b14). Kræver at OIOUBL er slået til for kreditoren (creditor_oioubl_settings.enabled, standard fra). Generatoren gætter intet: EAN med gyldigt tjekciffer, personreference, struktureret adresse, linjer der summerer til total og en betalingsmåde (42 bank / 93 FIK) skal findes — ellers 422 med feltet og OIOUBL-reglens id. Dokumentets UUID er deterministisk pr. faktura. Forta Pay sender ikke filen videre (ingen VANS/adgangspunkt er forbundet).

Parametre

invoiceId

path · string · påkrævet

Svar

200

OIOUBL 2.1-faktura · string (binary)

404

Fejl (RFC 9457) · Problem

409

`oioubl_not_enabled` (slået fra for kreditoren) eller `invoice_not_issued` (kladde/annulleret — intet bilag) · Problem

422

`oioubl_invalid` — `errors[]` med felt og OIOUBL-regel-id · Problem

curl
curl -X GET https://api.fortapay.dk/v1/invoices/{invoiceId}/oioubl \
  -H "Authorization: Bearer $FP_KEY"

Rykkerbevis: hele rykkerforløbet med leveringsbevis og hjemmel pr. gebyr/rente. SIKKER — læser, danner, gemmer intet

GET /invoices/{invoiceId}/reminder-evidence

TILFØJET af pay-rykkerbevis 15-10-2026 (D8). Ét bevis pr. faktura til kreditor, revisor og CRM: hver skrivelse (hvad, hvornår, frist, dokumentets sha256), hver leverance (kanal, modtager, status, leverandørens kvitteringer og post-/mailjournalens række) og hjemlen pr. gebyr og rente, ordret som den blev skrevet på hændelsen da beløbet blev bogført (rule_source: event) — ellers koden regel (rule). Afsendelse er H9's bevis, fremkomst R-18's (kun e-Boks' leveringskvittering eller brevets omdeling; en e-mail beviser aldrig fremkomst). reference er de første 64 bit af evidence_sha256 = sha256 af beviset (sorterede nøgler, uden mellemrum, uden reference/evidence_sha256). Samme journal giver samme reference, JSON og PDF-bytes; as_of er seneste post i journalerne, ikke uret. Sker der noget nyt på fakturaen, er det et nyt bevis med en ny reference. ?reference= efterprøver en reference man har: 409 evidence_changed med den gældende, hvis den ikke er den.

Parametre

invoiceId

path · string · påkrævet

format

query · string · valgfri

reference

query · string · valgfri

Efterprøv en reference (RB-XXXX-XXXX-XXXX-XXXX)

Svar

200

Beviset som JSON — eller som PDF med samme reference (`format=pdf`) · ReminderEvidence

404

Fejl (RFC 9457) · Problem

409

`evidence_changed` — referencen er ikke den gældende; `reference` og `as_of` i svaret er de gældende · Problem

curl
curl -X GET https://api.fortapay.dk/v1/invoices/{invoiceId}/reminder-evidence \
  -H "Authorization: Bearer $FP_KEY"

Distribuér (email/sms/eboks/letter/ean) nu eller planlagt; gensend

POST /invoices/{invoiceId}/send

Parametre

invoiceId

path · string · påkrævet

Idempotency-Key

header · string (uuid) · påkrævet

Obligatorisk på alle POST/PATCH/DELETE. Lever 24 timer.

Krop · SendRequest

channels

liste af string · valgfri

send_at

string | null (date-time) · valgfri

include_payment_link

boolean · valgfri

Svar

202

OK · Invoice

curl
curl -X POST https://api.fortapay.dk/v1/invoices/{invoiceId}/send \
  -H "Authorization: Bearer $FP_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d @- <<'JSON'
{}
JSON

Annullér ubetalt faktura (stopper opkrævning og rykkere)

POST /invoices/{invoiceId}/cancel

Fire øjne: har kreditoren slået fire øjne til, svarer kaldet 202 med en ApprovalRequest (status: pending) i stedet for at annullere. En ANDEN person på kreditoren godkender den i kreditorfladen; først da annulleres fakturaen. Kaldet prøves først: et kald der ville fejle nu, får samme fejl som uden fire øjne. Slået fra (standarden) er svaret uændret.

Parametre

invoiceId

path · string · påkrævet

Idempotency-Key

header · string (uuid) · påkrævet

Obligatorisk på alle POST/PATCH/DELETE. Lever 24 timer.

Svar

200

OK · Invoice

202

Fire øjne: anmodningen (202 = oprettet, intet udført endnu) · ApprovalRequest

409

Fejl (RFC 9457) · Problem

curl
curl -X POST https://api.fortapay.dk/v1/invoices/{invoiceId}/cancel \
  -H "Authorization: Bearer $FP_KEY" \
  -H "Idempotency-Key: $(uuidgen)"

Kreditering af restbeløbet UDEN dokument (hel/delvis). Refunderer IKKE penge — se /payments/{id}/refund. Kreditnota som dokument (nummer, PDF, udsendelse, bogføring) — se /invoices/{id}/credit-notes

POST /invoices/{invoiceId}/credit

Fire øjne: har kreditoren slået fire øjne til, svarer kaldet 202 med en ApprovalRequest (status: pending) i stedet for at kreditere. En ANDEN person på kreditoren godkender den i kreditorfladen; først da udstedes kreditnotaen. Kaldet prøves først: et kald der ville fejle nu, får samme fejl som uden fire øjne. Slået fra (standarden) er svaret uændret. Bogføring: krediteringen UDEN dokument skrives ALDRIG i kreditorens regnskabssystem (e-conomic, Dinero m.fl.), heller ikke når Forta Pay bogfører kreditorens indbetalinger. Kaldet SPEJLER en kreditnota der er udstedt og bogført i regnskabssystemet (fx af jeres eget system) — Forta Pay læser ikke kreditnotaer ind derfra. Skrev Forta Pay den også, stod krediteringen to gange. Skal Forta Pay udstede OG bogføre kreditnotaen, brug /invoices/{id}/credit-notes. Spejling med external_ref (spor pay-refusion-f0, bag FORTA_PAY_REFUSIONSORDRER): kildens kreditnota-id gemmes; samme external_ref + samme beløb igen = 200 uden ny kreditering (også under fire øjne); samme ref med et andet beløb eller på en anden faktura = 409 external_ref_conflict. En betalt faktura kan spejles: saldoen bliver negativ (kundens tilgodehavende), status urørt, loft = hovedstolen (422 credit_exceeds_invoice). Det er trin 1 før POST /creditors/{creditorId}/refund-orders. Slukket: uændret. Skygge: tilladt for en kreditor i skygge (collection_mode: shadow) — kaldet spejler kun og sender, bogfører og opkræver intet. Har fakturaen en planlagt opkrævning, aflyses den; i skygge planlægges der ikke en ny på restbeløbet (det tidligere system opkræver). TILFØJET af pay-credit-skygge 18-10-2026: før svarede en DELVIS kreditering af en faktura med planlagt opkrævning 409 creditor_in_shadow.

Parametre

invoiceId

path · string · påkrævet

Idempotency-Key

header · string (uuid) · påkrævet

Obligatorisk på alle POST/PATCH/DELETE. Lever 24 timer.

Krop · object

amount

Money · påkrævet

reason

string · valgfri

external_ref

string · valgfri

Svar

200

OK · Invoice

202

Fire øjne: anmodningen (202 = oprettet, intet udført endnu) · ApprovalRequest

curl
curl -X POST https://api.fortapay.dk/v1/invoices/{invoiceId}/credit \
  -H "Authorization: Bearer $FP_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d @- <<'JSON'
{
  "amount": {
    "amount": 0
  }
}
JSON

Fakturaens kreditnotaer (nummerorden) med deres leverancer

GET /invoices/{invoiceId}/credit-notes

Parametre

invoiceId

path · string · påkrævet

Svar

200

OK · object

404

Fejl (RFC 9457) · Problem

curl
curl -X GET https://api.fortapay.dk/v1/invoices/{invoiceId}/credit-notes \
  -H "Authorization: Bearer $FP_KEY"

Udsted en kreditnota som DOKUMENT — pr. linje eller beløb, eget nummer, PDF, sendt på fakturaens kanal, bogført

POST /invoices/{invoiceId}/credit-notes

TILFØJET af pay-kreditnota 15-10-2026 (C2). Præcis én af lines (fakturalinjens indeks + antal; aldrig mere end der er tilbage på linjen) og amount (inkl. moms; momssatsen er fakturaens når den er entydig, ellers vat_rate). Alle kreditnotaer på fakturaen tilsammen ≤ fakturaens total (credit_note_exceeds_invoice). settlement er PÅKRÆVET, uden standard: · credit_balance («tilgodehavende»): lagt på fakturaens restbeløb (som /credit, med dens værn — en indleveret opkrævning giver 409 charge_in_flight). Det der overstiger restbeløbet, står som unapplied_amount: et tilgodehavende hos kreditor. Det modregnes IKKE automatisk i en senere faktura. · refund («pengene tilbage»): den eksisterende refund-vej (/payments/{id}/refund, invoice_effect: credit) på payment_id (udeladt = fakturaens eneste refunderbare betaling, ellers 422 payment_required). Kort/MobilePay betalt gennem Forta Pay sendes tilbage af PSP'en (refund_mode: psp); alt andet er en registrering af at kreditor selv betaler tilbage (external, B1). reversal_id er refundens id. Nummeret tages i kreditorens nummerserie i samme transaktion (fortløbende, intet hul). send: true (standard) sender kreditnotaen på de kanaler FAKTURAEN nåede debitor på; er fakturaen ikke sendt af Forta Pay, sendes intet (deliveries: []). Udsendelsen kan ikke vælte kreditnotaen. Kreditor i skygge → 409 creditor_in_shadow. Hændelse: credit_note.created (saldoen følger stadig invoice.credited). Fire øjne: som /credit — har kreditoren slået fire øjne til, svarer kaldet 202 med en ApprovalRequest (action: api-credit-note, status: pending); kreditnotaen udstedes (og sendes) først når en ANDEN person har godkendt den i kreditorfladen. Kaldet prøves først (uden at sende): et kald der ville fejle nu, får samme fejl.

Parametre

invoiceId

path · string · påkrævet

Idempotency-Key

header · string (uuid) · påkrævet

Obligatorisk på alle POST/PATCH/DELETE. Lever 24 timer.

Krop · CreditNoteCreate

lines

liste af CreditNoteLineIn · valgfri

amount

Money · valgfri

vat_rate

number · valgfri

Kun med amount, og kun når fakturaens momssats ikke er entydig (vat_rate_required)

settlement

string · påkrævet

Påkrævet, ingen standard. credit_balance = «tilgodehavende» (lagt på restbeløbet; resten står som tilgodehavende hos kreditor) · refund = «pengene tilbage» (refund-vejen, invoice_effect=credit)

credit_balance · refund

payment_id

string · valgfri

Kun refund: betalingen pengene sendes tilbage fra. Udeladt = fakturaens eneste refunderbare betaling

refund_mode

string · valgfri

Kun refund. Udeladt = psp for kort/MobilePay betalt gennem Forta Pay, ellers external (kreditor betaler selv)

psp · external

reason

string · påkrævet

Står på kreditnotaen — debitor ser den

send

boolean · valgfri

Send på fakturaens kanal(er). Er fakturaen ikke sendt af Forta Pay, sendes intet

Svar

201

Udstedt · CreditNote

202

Fire øjne: anmodningen (202 = oprettet, intet udført endnu) · ApprovalRequest

404

Fejl (RFC 9457) · Problem

409

`invoice_not_issued` (kladde/annulleret) · `charge_in_flight` · `creditor_in_shadow` · `refund_in_progress` · Problem

422

`credit_note_exceeds_invoice` · `credit_note_exceeds_line` · `credit_note_lines_unavailable` · `vat_rate_required` · `payment_required` · `refund_exceeds_payment` · `currency_mismatch` · `validation_failed` · Problem

curl
curl -X POST https://api.fortapay.dk/v1/invoices/{invoiceId}/credit-notes \
  -H "Authorization: Bearer $FP_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d @- <<'JSON'
{
  "settlement": "credit_balance",
  "reason": "…"
}
JSON

Hent en kreditnota

GET /credit-notes/{creditNoteId}

Parametre

creditNoteId

path · string · påkrævet

Svar

200

OK · CreditNote

404

Fejl (RFC 9457) · Problem

curl
curl -X GET https://api.fortapay.dk/v1/credit-notes/{creditNoteId} \
  -H "Authorization: Bearer $FP_KEY"

Kreditnotaen som PDF — det GEMTE dokument (samme sha256 som leverancens bevis). SIKKER

GET /credit-notes/{creditNoteId}/pdf

Parametre

creditNoteId

path · string · påkrævet

Svar

200

PDF · string (binary)

404

Fejl (RFC 9457) · Problem

curl
curl -X GET https://api.fortapay.dk/v1/credit-notes/{creditNoteId}/pdf \
  -H "Authorization: Bearer $FP_KEY"

Kreditnotaen som OIOUBL 2.1 CreditNote (EAN/NemHandel). SIKKER — danner, sender aldrig, ændrer intet

GET /credit-notes/{creditNoteId}/oioubl

TILFØJET af pay-kreditnota 15-10-2026. Samme regler som /invoices/{id}/oioubl (OIOUBL slået til for kreditoren, EAN, personreference, struktureret adresse; ingen gæt). BillingReference peger på fakturaen. Valideret mod den officielle pakke (schematron 1.17.2) — se rapporter/pay-kreditnota-maalinger/oioubl.md.

Parametre

creditNoteId

path · string · påkrævet

Svar

200

OIOUBL 2.1-kreditnota · string (binary)

404

Fejl (RFC 9457) · Problem

409

`oioubl_not_enabled` · Problem

422

`oioubl_invalid` — `errors[]` med felt og OIOUBL-regel-id · Problem

curl
curl -X GET https://api.fortapay.dk/v1/credit-notes/{creditNoteId}/oioubl \
  -H "Authorization: Bearer $FP_KEY"

Registrér betaling modtaget UDEN om Forta Pay (butik, bankoverførsel). Opretter payment med source=external

POST /invoices/{invoiceId}/mark-paid

Ejerskab afgør IKKE om betalingen tages imod (H2, bevidst). Også på en faktura som det tidligere system stadig ejer efter et skifte (shadow: true, fx klasse D hos FarPay), registreres betalingen, og fakturaen går til paid. Så holdes Forta Pays billede af fakturaen ajour. Forta Pay opkræver, rykker og sender stadig ikke på den, og claim, hold og shadow flyttes ikke af betalingen. Kun en aktiv pilots kohorteværn (K3) kan afvise.

Fire øjne (pay-sikkerhed2 T6-7): har kreditoren slået fire øjne til, og er beløbet mindst kreditorens grænse ELLER hele fakturaens restbeløb, svarer kaldet 202 med en ApprovalRequest (action: api-mark-paid, status: pending) i stedet for at registrere. En ANDEN person på kreditoren godkender den i kreditorfladen; først da registreres betalingen (result_id = fakturaen). Kaldet prøves først: et kald der ville fejle nu, får samme fejl som uden fire øjne. Under grænsen og for en del af saldoen, og med fire øjne slået fra (standarden), er svaret uændret.

external_ref er unik pr. faktura (TILFØJET, pay-markpaid-dedup). Er en registrering med samme external_ref allerede på fakturaen (source: external, ikke tilbagetrukket), er kaldet en gensendelse: samme beløb → 200 med fakturaen som den står, intet nyt registreres, ingen hændelse — også med en NY Idempotency-Key, også når den første registrering lukkede fakturaen, og også under fire øjne (ingen ny anmodning). Andet beløb → 409 external_ref_conflict med payment_id og registered_amount. Uden external_ref deduplikeres intet: to kald er to betalinger. En tilbagetrukket registrering (withdraw-registration) tæller ikke, så samme reference kan registreres igen med det rigtige beløb.

Parametre

invoiceId

path · string · påkrævet

Idempotency-Key

header · string (uuid) · påkrævet

Obligatorisk på alle POST/PATCH/DELETE. Lever 24 timer.

Krop · ExternalPaymentCreate

amount

Money · påkrævet

paid_at

string (date-time) · påkrævet

payment_method

PaymentMethod · påkrævet

ÉT entydigt objekt for «hvordan blev/bliver der betalt» — afløser CRMs sammenstykkede etiket

external_ref

string · valgfri

Fx POS-transaktions-id, bankpostering

note

string · valgfri

initiated_by

string · valgfri

Spor pay-crmstatus-v1 (B-1). user = et menneske trykkede «markér betalt» → med fire øjne slået til ALTID 202 + approval_request, uanset beløb. system (standard) = automatisk kassemelding → dagens tærskelregel uændret. Feltet kan kun stramme, aldrig lempe

user · system

actor_ref

string · valgfri

Kalderens PSEUDONYME bruger-id — kun til anmodningens audit, aldrig i en hændelse. Ingen navne eller e-mail

Svar

200

OK · Invoice

202

Fire øjne: anmodningen (202 = oprettet, intet udført endnu) · ApprovalRequest

409

`invoice_not_payable` · `charge_in_flight` · `external_ref_conflict` (samme `external_ref`, andet beløb) · Problem

curl
curl -X POST https://api.fortapay.dk/v1/invoices/{invoiceId}/mark-paid \
  -H "Authorization: Bearer $FP_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d @- <<'JSON'
{
  "amount": {
    "amount": 0
  },
  "paid_at": "…",
  "payment_method": {
    "rail": "bs",
    "source": "forta_pay"
  }
}
JSON

Opret opkrævning nu (instant på kort-/MP-mandat) eller på given dato (BS/LS næste mulige kørsel)

POST /invoices/{invoiceId}/charge

Parametre

invoiceId

path · string · påkrævet

Idempotency-Key

header · string (uuid) · påkrævet

Obligatorisk på alle POST/PATCH/DELETE. Lever 24 timer.

Krop · object

mandate_id

string · valgfri

charge_date

string (date) · valgfri

mode

string · valgfri

instant · scheduled

Svar

201

OK · Charge

409

Fejl (RFC 9457) · Problem

curl
curl -X POST https://api.fortapay.dk/v1/invoices/{invoiceId}/charge \
  -H "Authorization: Bearer $FP_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d @- <<'JSON'
{}
JSON

Revisionsspor — alle hændelser på fordringen i rækkefølge (beløb, betalt, tilbageført, renter, gebyrer, åben saldo med kilde-id)

GET /invoices/{invoiceId}/timeline

Parametre

invoiceId

path · string · påkrævet

cursor

query · string · valgfri

limit

query · integer · valgfri

Svar

200

OK · Page

curl
curl -X GET https://api.fortapay.dk/v1/invoices/{invoiceId}/timeline \
  -H "Authorization: Bearer $FP_KEY"