Spring til indhold
Forta Pay

Reference

Skift

Forta Pay API v1

34 operationer

Skift (nyeste id sidst)

GET /cutovers

Parametre

cursor

query · string · valgfri

limit

query · integer · valgfri

creditor_id

query · string · valgfri

status

query · string · valgfri

Svar

200

OK · Page

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

Opret skiftet fra FarPay for én kreditor (B6) — admin

POST /cutovers

planned → staged → frozen → active (→ closed), og rolled_back (kun før active). Ét åbent skift pr. kreditor. Skiftedagen den 1.–7. → 409 cutover_date_invalid (B6).

Parametre

Idempotency-Key

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

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

Krop · CutoverCreate

creditor_id

string · påkrævet

switch_date

string (date) · påkrævet

Aldrig den 1.–7. (B6)

bs_cutoff_date

string | null (date) · valgfri

first_pay_charge_date

string | null (date) · valgfri

economic_cursor_at_switch

integer | null · valgfri

Højeste e-conomic-fakturanr. FarPay kendte; udeladt = indlæsningens markør ved frysningen

source_cursor_at_switch

string | null (date-time) · valgfri

Dinero/Uniconta: tidspunktet indlæsningen tændes fra ved aktiveringen af en kreditor uden skygge; udeladt = frysningens tidspunkt

scope

string · valgfri

PILOT-1 (G41): cohort = piloten — kun kohortens debitorer overtages. Ændres aldrig.

all · cohort

supersedes_cutover_id

string | null · valgfri

pay-pilot2 (G41 fase 4, 100 %): et HELT skift der afløser kreditorens AKTIVE pilotskift. Oprettes mens piloten kører; aktiveringen lukker piloten og fordeler spejlet efter en FRISK FarPay-import i ÉN transaktion — uden FarPay (G50 (b), previous_system regnskabssystem) efter en FRISK læsning af regnskabssystemet (startet efter frysningen). Kun scope all, og kun med pilotens previous_system.

Svar

201

Oprettet (planned) · Cutover

409

`cutover_date_invalid`, `cutover_exists`, `cutover_not_supersedable` (supersedes_cutover_id peger ikke på et AKTIVT pilotskift — eller piloten har et andet previous_system end kreditoren: G50 (b), en efterfølger uden FarPay afløser kun en pilot uden FarPay og omvendt) · Problem

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

Skiftet og portene som de står NU (ren læsning; `gates` = null når skiftet ikke er åbent)

GET /cutovers/{cutoverId}

Parametre

cutoverId

path · string · påkrævet

Svar

200

OK · Cutover

404

Findes ikke eller uden for nøglens skop · Problem

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

planned → staged — skiftet overtager kreditorens anvendte importer (admin)

POST /cutovers/{cutoverId}/stage

Parametre

cutoverId

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 · Cutover

409

`import_missing` (ingen anvendt FarPay-fakturaimport), `shadow_required` / `source_missing` (G49 (c), skift uden FarPay: kreditoren står ikke i skygge / intet regnskabssystem har læst), `cutover_state_conflict` · Problem

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

staged → frozen — attestationen af at FarPay er stoppet (admin)

POST /cutovers/{cutoverId}/attest-freeze

Forta Pay kan ikke se ind i FarPay. Attestationen skal nævne ALLE punkter (farpay_reminders_stopped, economic_to_farpay_disconnected, farpay_webhooks_stopped) med bevisreferencer; den efterprøves af den daglige afstemning. Markøren (economic_cursor_at_switch) tages her, hvis den ikke er sat. G49 (c) — et skift UDEN FarPay (previous_system = regnskabssystem): punkterne er i stedet own_reminders_stopped, own_collection_stopped og no_agreements_to_take_over (kreditorens egne rykkere og egen opkrævning stoppet; ingen aftaler at overtage). G50 — i en PILOT uden FarPay (scope cohort) desuden cohort_excluded_in_source (kreditorens egen opkrævning udelukker kohortens debitorer).

Parametre

cutoverId

path · string · påkrævet

Idempotency-Key

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

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

Krop · CutoverFreeze

attested_items

liste af string · påkrævet

evidence_refs

liste af string · påkrævet

note

string | null · valgfri

Svar

200

OK · Cutover

409

`cutover_state_conflict` · Problem

422

`validation_failed` — et punkt mangler eller er ukendt · Problem

curl
curl -X POST https://api.fortapay.dk/v1/cutovers/{cutoverId}/attest-freeze \
  -H "Authorization: Bearer $FP_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d @- <<'JSON'
{
  "attested_items": [
    "farpay_reminders_stopped"
  ],
  "evidence_refs": [
    "…"
  ]
}
JSON

G50 — kreditorens attesterede ændringsvindue (kun et skift uden FarPay, admin)

POST /cutovers/{cutoverId}/attest-change-window

Kilden er kreditorens regnskabssystem — en ekstern database, som ingen Forta Pay-lås kan se. Kreditoren attesterer et KORT vindue (fra nu til until, højst 24 timer) uden direkte saldo- og krediteringsændringer på skiftets fakturaer; indbetalinger lægges i kø og bogføres efter aktiveringen. Porten aendringsvindue kræver vinduet åbent og åbnet FØR skyggens seneste kørsel (change_window_missing, change_window_expired, change_window_after_reconciliation). Et nyt vindue erstatter det gamle (det gamle står i earlier).

Parametre

cutoverId

path · string · påkrævet

Idempotency-Key

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

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

Krop · CutoverChangeWindow

until

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

evidence_refs

liste af string · påkrævet

note

string | null · valgfri

Svar

200

OK · Cutover

409

`cutover_state_conflict` — skiftet er ikke frosset, eller det er et FarPay-skift · Problem

422

`validation_failed` — `until` ligger ikke efter nu og højst 24 timer frem · Problem

curl
curl -X POST https://api.fortapay.dk/v1/cutovers/{cutoverId}/attest-change-window \
  -H "Authorization: Bearer $FP_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d @- <<'JSON'
{
  "until": "…",
  "evidence_refs": [
    "…"
  ]
}
JSON

Et menneskes afgørelse for ejerløse fakturaer (klasse E) — Forta Pay eller FarPay (admin, før aktiveringen)

POST /cutovers/{cutoverId}/unowned-decisions

Parametre

cutoverId

path · string · påkrævet

Idempotency-Key

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

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

Krop · CutoverUnownedDecisions

decisions

liste af object · påkrævet

Svar

200

OK · Cutover

409

`cutover_state_conflict` · Problem

curl
curl -X POST https://api.fortapay.dk/v1/cutovers/{cutoverId}/unowned-decisions \
  -H "Authorization: Bearer $FP_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d @- <<'JSON'
{
  "decisions": [
    {
      "external_ref": "…",
      "owner": "forta_pay",
      "note": "…"
    }
  ]
}
JSON

Forhåndsvisning (dry_run) eller aktivering af skiftet — admin

POST /cutovers/{cutoverId}/activate

dry_run=true (standard): portene + HELE aktiveringen i et savepoint der rulles tilbage. Effekten (opkrævninger, rykkere, leverancer, hændelser, claims-fordeling, frigivne fakturaer og mandater, collection_mode) og dens sha256 gemmes på skiftet og er gyldig i 1 time. Kræver et frosset skift; en lukket port stopper ikke forhåndsvisningen — undtagen ejerskabet (409 unowned_invoices: uden en ejer pr. faktura er der ingen effekt).

dry_run=false: alle porte åbne, preview_sha256 = den seneste forhåndsvisnings, ≤ 1 t gammel — og den faktiske effekt har samme sha256. Ellers 409 og intet skrevet. Aktiveringen er ÉN transaktion: status active og collection_mode live, skyggens claims fordelt efter FarPay-importens klasse, hold løftet, udskudte hændelser udsendt, opkrævninger og rykkere planlagt; cutover.activated.

Parametre

cutoverId

path · string · påkrævet

Idempotency-Key

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

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

Krop · CutoverActivate

dry_run

boolean · valgfri

preview_sha256

string | null · valgfri

Påkrævet når dry_run=false

Svar

200

Forhåndsvisningen (dry_run) eller det aktiverede skift med `effect` · object

409

En port er lukket (`freeze_not_attested`, `cutover_date_invalid`, `import_missing`, `mandate_count_mismatch`, `unowned_invoices`, `reconciliation_missing`, `reconciliation_stale`, `reconciliation_unexplained`, `reconciliation_not_clean`, `cohort_invalid`, `import_stale` og `cutover_pilot_not_ready` (efterfølgeren: FarPay-importen er fra før efterfølgeren / piloten er ikke aktiv eller har en uafgjort tilbagevej); for et skift uden FarPay (G49 (c)) desuden `shadow_required`, `source_missing` og `source_changed_after_freeze` (skyggens afstemning efter frysningen viser en restsaldo i regnskabssystemet, Forta Pay ikke har set), og fra G50 `source_generation_missing`/`source_generation_incomplete` (kildefladen forseglet ved frysningen, S0, er ikke dækket af kildefladen ved aktiveringen) og `change_window_missing`/`change_window_expired`/`change_window_after_reconciliation` (ændringsvinduet), og for en efterfølger uden FarPay (G50 (b)) `cutover_pilot_not_ready` og `source_read_stale` (regnskabssystemets seneste gennemførte læsning startede ikke efter efterfølgerens frysning), og fra G45 `mobilepay_partner_switch_not_ready` (kreditoren har valgt «MobilePay via partnerskift», men Forta Pay har ikke en aktiv Vipps-forbindelse på samme MSN med overtagne aftaler, eller Vipps Recurring er slukket) — `gates` i svaret), `preview_stale`, `cutover_state_conflict` · Problem

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

Tilbagerulning FØR aktiveringen — det skiftets importer skrev, slettes; skyggens berigelse lægges tilbage (admin)

POST /cutovers/{cutoverId}/rollback

Parametre

cutoverId

path · string · påkrævet

Idempotency-Key

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

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

Svar

200

rolled_back med `rollback_result` (tal pr. slettet slags) · Cutover

409

`cutover_active` (efter aktiveringen gælder B6's vej tilbage), `cutover_state_conflict` · Problem

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

Pilotens kohorte (PILOT-1, G41) — aktive og udtagne medlemmer

GET /cutovers/{cutoverId}/cohort

Parametre

cutoverId

path · string · påkrævet

Svar

200

OK · Cohort

409

`cutover_not_cohort` (skiftet omfatter hele kreditoren) · Problem

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

Optag debitorer i pilotens kohorte — også på et aktivt skift (udvidelse, fase 3) (admin)

POST /cutovers/{cutoverId}/cohort

Kun debitorer UDEN BS/FI (kort, MobilePay, betalingslink) — BS og FI skifter samlet på MPS-dagen (G41). Alt eller intet: kan én debitor ikke optages, svares 409 cohort_debtor_rejected med rejected (debitor + grund), og intet skrives. Grundene: bs_aftale, fi_aftale, farpay_betalingsmaade_bs, farpay_betalingsmaade_fi, bs_betaling, fi_betaling, debitor_spaerret, debitor_ukendt, allerede_medlem. Databasen håndhæver det samme (P0S03). Fakturaer dateret fra effective_from ejes af Forta Pay (udeladt: skiftedagen før aktiveringen, ellers i dag; en udvidelse kan ikke gælde bagud).

Parametre

cutoverId

path · string · påkrævet

Idempotency-Key

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

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

Krop · CohortAdd

debtor_ids

liste af string · valgfri

effective_from

string | null (date) · valgfri

note

string | null · valgfri

all_eligible

boolean · valgfri

pay-pilot2: optag alle kreditorens debitorer uden BS/FI der ikke er medlemmer

max_share_pct

integer | null · valgfri

pay-pilot2: loftet på kohortens andel EFTER optagelsen — aktive debitorer OG åbent beløb (det loft der rammes først); overskredet → 409 cohort_share_exceeded

Svar

201

Optaget · object

409

`cohort_debtor_rejected` (også `tilbagevej_aaben`: udtaget, og tilbagevejen er ikke afgjort), `cohort_share_exceeded` (`share_after` i svaret), `cutover_not_cohort`, `cutover_state_conflict` · Problem

422

`validation_failed` (fx `effective_from` bagud på et aktivt skift) · Problem

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

Tag en debitor ud af kohorten (admin)

POST /cutovers/{cutoverId}/cohort/{debtorId}/remove

Sætter udtagningen. Derefter afviser databasen enhver ny UDGÅENDE handling for debitoren (opkrævning, rykker, udsendelse, sag — P0S02 debtor_not_in_cohort), mens indgående betalinger på Pay-fakturaer stadig registreres; nye fakturaer bliver det tidligere systems. open_forta_pay_invoices er det der skal gives tilbage. På et AKTIVT skift starter debitorens tilbagevej i samme transaktion (pay-pilot2): planlagte opkrævninger og rykkere på debitorens fakturaer trækkes tilbage, og svaret bærer tilbagevej med inventory; resten går ad …/cohort/{debtorId}/return. Mens den står stopped, kan debitoren kun komme tilbage ad …/cohort/{debtorId}/resume; efter returned kan den optages igen som en ny række.

Parametre

cutoverId

path · string · påkrævet

debtorId

path · string · påkrævet

Idempotency-Key

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

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

Krop · CohortRemove

reason

string · påkrævet

Svar

200

Medlemskabet (udtaget) + `open_forta_pay_invoices` + på et aktivt skift `tilbagevej` · CohortMember

404

Debitoren er ikke aktivt medlem af skiftets kohorte · Problem

curl
curl -X POST https://api.fortapay.dk/v1/cutovers/{cutoverId}/cohort/{debtorId}/remove \
  -H "Authorization: Bearer $FP_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d @- <<'JSON'
{
  "reason": "…"
}
JSON

Kohortens andel af porteføljen — aktive debitorer og åbent beløb (pay-pilot2, udvidelsens loft)

GET /cutovers/{cutoverId}/cohort/share

Parametre

cutoverId

path · string · påkrævet

Svar

200

OK · CohortShare

409

`cutover_not_cohort` · Problem

curl
curl -X GET https://api.fortapay.dk/v1/cutovers/{cutoverId}/cohort/share \
  -H "Authorization: Bearer $FP_KEY"

Den udtagne debitors tilbagevej og afklaring (pay-pilot2) — som `/cutovers/{id}/return`, afgrænset til debitoren

GET /cutovers/{cutoverId}/cohort/{debtorId}/return

Parametre

cutoverId

path · string · påkrævet

debtorId

path · string · påkrævet

Svar

200

OK · object

404

Debitoren er ikke taget ud af et aktivt skift · Problem

curl
curl -X GET https://api.fortapay.dk/v1/cutovers/{cutoverId}/cohort/{debtorId}/return \
  -H "Authorization: Bearer $FP_KEY"

Forhåndsvisning (dry_run) eller tilbagegivelse af debitorens Pay-fakturaer (admin, pay-pilot2)

POST /cutovers/{cutoverId}/cohort/{debtorId}/return

Som /cutovers/{id}/return, afgrænset til debitoren: fakturaer → cancelled, claim → previous_system/D/tilbagevej. e-conomic-indlæsningen slukkes IKKE — piloten kører videre for kohorten.

Parametre

cutoverId

path · string · påkrævet

debtorId

path · string · påkrævet

Idempotency-Key

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

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

Krop · CutoverReturn

dry_run

boolean · valgfri

preview_sha256

string | null · valgfri

Påkrævet når dry_run=false

Svar

200

Forhåndsvisningen eller tilbagevejen (`returned`) med `effect` · object

409

`tilbagevej_not_clarified`, `preview_stale`, `tilbagevej_state_conflict` · Problem

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

Et menneskes afgørelse pr. faktura på den udtagne debitor (admin, pay-pilot2)

POST /cutovers/{cutoverId}/cohort/{debtorId}/return/decisions

Parametre

cutoverId

path · string · påkrævet

debtorId

path · string · påkrævet

Idempotency-Key

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

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

Krop · CutoverReturnDecisions

decisions

liste af ReturnDecision · påkrævet

Svar

200

OK · object

409

`tilbagevej_state_conflict` · Problem

422

`validation_failed` — fakturaen hører ikke til debitoren · Problem

curl
curl -X POST https://api.fortapay.dk/v1/cutovers/{cutoverId}/cohort/{debtorId}/return/decisions \
  -H "Authorization: Bearer $FP_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d @- <<'JSON'
{
  "decisions": [
    {
      "invoice_id": "…",
      "decision": "return"
    }
  ]
}
JSON

Tjeklisten for den udtagne debitor (pay-pilot2) — trin 5 er at flytte debitoren ud af pilotgruppen i e-conomic

GET /cutovers/{cutoverId}/cohort/{debtorId}/return/checklist

Parametre

cutoverId

path · string · påkrævet

debtorId

path · string · påkrævet

Svar

200

OK · object

404

Debitoren er ikke taget ud af et aktivt skift · Problem

curl
curl -X GET https://api.fortapay.dk/v1/cutovers/{cutoverId}/cohort/{debtorId}/return/checklist \
  -H "Authorization: Bearer $FP_KEY"

Fortryd udtagningen — debitoren optages igen (ny række) og dens fakturaer genplanlægges (admin, pay-pilot2)

POST /cutovers/{cutoverId}/cohort/{debtorId}/resume

Parametre

cutoverId

path · string · påkrævet

debtorId

path · string · påkrævet

Idempotency-Key

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

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

Krop · CutoverResume

note

string · påkrævet

Svar

200

Tilbagevejen (`resumed`) · object

409

`tilbagevej_state_conflict`, `cohort_debtor_rejected` (fx fået et BS-mandat i mellemtiden) · Problem

curl
curl -X POST https://api.fortapay.dk/v1/cutovers/{cutoverId}/cohort/{debtorId}/resume \
  -H "Authorization: Bearer $FP_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d @- <<'JSON'
{
  "note": "…"
}
JSON

Nødstop efter et aktiveret skift — Forta Pay skaber ingen opkrævning, 0601, rykker, inkassooverdragelse eller udsendelse for kreditoren (admin)

POST /cutovers/{cutoverId}/emergency-stop

Licensgaten afviser fra dette kald (tilbagevej_noedstop) — alle veje, fordi gaten sidder dér rækken skabes. Samme transaktion annullerer planlagte opkrævninger, tager uafsendte BS-poster ud af den åbne leverance og aflyser planlagte rykkere (stop_result). Stop af betaling og afmelding (0605/0253) er undtaget; indgående behandles og bogføres. cutover.emergency_stopped.

Parametre

cutoverId

path · string · påkrævet

Idempotency-Key

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

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

Krop · CutoverEmergencyStop

reason

string · påkrævet

Svar

200

Tilbagevejen (`stopped`) med `inventory` · object

409

`cutover_not_active` (før active gælder tilbagerulningen), `tilbagevej_exists` · Problem

curl
curl -X POST https://api.fortapay.dk/v1/cutovers/{cutoverId}/emergency-stop \
  -H "Authorization: Bearer $FP_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d @- <<'JSON'
{
  "reason": "…"
}
JSON

Tilbagevejen og afklaringen som den står NU — pr. faktura og operation (ikke_sendt/undervejs/ukendt), og det uigenkaldelige

GET /cutovers/{cutoverId}/return

Parametre

cutoverId

path · string · påkrævet

Svar

200

OK · object

404

Intet nødstop på skiftet · Problem

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

Forhåndsvisning (dry_run) eller tilbagegivelse af kravene til det tidligere system (admin)

POST /cutovers/{cutoverId}/return

Kræver en færdig afklaring: ingen operation undervejs/ukendt, ingen faktura i inkasso eller delbetalt uden et menneskes afgørelse. dry_run=true: hele tilbagegivelsen i et savepoint der rulles tilbage; effekt + sha256 gemmes (1 time). dry_run=false: samme sha256, ellers 409 og intet skrevet. ÉN transaktion: fakturaer → cancelled (returned_to_previous_system), claim → previous_system/D/tilbagevej, e-conomic-indlæsningen slukkes, status returned; cutover.returned. Stoppet gælder fortsat.

Parametre

cutoverId

path · string · påkrævet

Idempotency-Key

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

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

Krop · CutoverReturn

dry_run

boolean · valgfri

preview_sha256

string | null · valgfri

Påkrævet når dry_run=false

Svar

200

Forhåndsvisningen eller tilbagevejen (`returned`) med `effect` · object

409

`tilbagevej_not_clarified` (`blocking` i svaret), `preview_stale`, `tilbagevej_state_conflict` · Problem

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

Et menneskes afgørelse pr. faktura — `return` (FarPay opkræver resten) eller `keep_in_pay` (admin)

POST /cutovers/{cutoverId}/return/decisions

Parametre

cutoverId

path · string · påkrævet

Idempotency-Key

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

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

Krop · CutoverReturnDecisions

decisions

liste af ReturnDecision · påkrævet

Svar

200

OK · object

409

`tilbagevej_state_conflict` · Problem

422

`validation_failed` — fakturaen hører ikke til skiftets kreditor · Problem

curl
curl -X POST https://api.fortapay.dk/v1/cutovers/{cutoverId}/return/decisions \
  -H "Authorization: Bearer $FP_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d @- <<'JSON'
{
  "decisions": [
    {
      "invoice_id": "…",
      "decision": "return"
    }
  ]
}
JSON

Tjeklisten til genaktivering i FarPay — trin med status, fakturaer til FarPay (med rest), fakturaer FarPay IKKE må røre, det uigenkaldelige

GET /cutovers/{cutoverId}/return/checklist

Parametre

cutoverId

path · string · påkrævet

Svar

200

OK · object

404

Intet nødstop på skiftet · Problem

curl
curl -X GET https://api.fortapay.dk/v1/cutovers/{cutoverId}/return/checklist \
  -H "Authorization: Bearer $FP_KEY"

Ophæv nødstoppet UDEN tilbagegivelse — Pay opkræver igen; det aflyste genplanlægges (admin)

POST /cutovers/{cutoverId}/resume

Parametre

cutoverId

path · string · påkrævet

Idempotency-Key

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

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

Krop · CutoverResume

note

string · påkrævet

Svar

200

Tilbagevejen (`resumed`) · object

409

`tilbagevej_state_conflict` (kun et gældende nødstop kan genoptages) · Problem

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

Afstemningskørsler (uden rækker), nyeste id sidst

GET /reconciliations

Parametre

cursor

query · string · valgfri

limit

query · integer · valgfri

creditor_id

query · string · valgfri

verdict

query · string · valgfri

kind

query · string · valgfri

cutover = skiftets afstemning (SKIFT-5) · shadow = skyggens daglige (ECO-5) · provider_settlement = udbyderafregningerne (pay-udbetaling)

Svar

200

OK · Page

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

Kør afstemningen FarPay ↔ e-conomic ↔ Forta Pay nu (skiftet fra et tidligere system, B6)

POST /reconciliations

Tre kilder, fordi to ikke er nok: FarPay-kilden er de angivne FarPay-importer (profile=farpay, kind invoices og evt. debtors) — det kildemateriale de blev forseglet med (input_sha256), klassificeret PÅ NY; importplanen genlæses ikke. e-conomic-kilden er kildefladen (hvad Forta Pay har set i kreditors e-conomic, med restsaldo). Forta Pay-kilden er ejerskabet (claims), fakturaerne, gebyrhistorikken, mandaterne og de fremmede kvitteringer.

Hver fakturanr., hvert FarPay-kundenr. og hver åben fremmed kvittering disponeres én gang. En række der ikke er ok, får en kode fra et LUKKET katalog, med alvor forventet (forklaret, fordi Forta Pay har efterprøvet grunden mod kilderne — fx klasse D) eller defekt. En defekt kan ikke forklares væk med en kommentar. verdict=ren ⇔ 0 defekte. Kørslen gemmes (append-only) med sha256 over de sorterede rækker og udsender reconciliation.completed.

Skiftets aktivering (SKIFT-6) kræver at den seneste kørsel er ren og højst 24 timer gammel (409 reconciliation_missing / reconciliation_stale / reconciliation_unexplained).

Parametre

Idempotency-Key

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

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

Krop · ReconciliationCreate

creditor_id

string · påkrævet

farpay_import_ids

liste af string · påkrævet

FarPay-importerne (profile=farpay) der ER FarPay-kilden — mindst én af fakturaer; kunder giver mandatblokken

Svar

201

Kørt og gemt · Reconciliation

404

Kreditoren eller en import findes ikke eller er uden for nøglens skop · Problem

422

`validation_failed` — en import er ikke kreditorens, ikke en FarPay-import, ikke valideret/anvendt, eller ingen er af fakturaer · Problem

curl
curl -X POST https://api.fortapay.dk/v1/reconciliations \
  -H "Authorization: Bearer $FP_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d @- <<'JSON'
{
  "creditor_id": "…",
  "farpay_import_ids": [
    "…"
  ]
}
JSON

Én kørsel med alle ikke-ok rækker (kode, alvor, de tre kilders syn)

GET /reconciliations/{reconciliationId}

Parametre

reconciliationId

path · string · påkrævet

Svar

200

OK · Reconciliation

404

Findes ikke eller uden for nøglens skop · Problem

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

Rapporten som fil — CSV (UTF-8 med BOM, `;`, beløb i øre; første linje er kontrollinjen med verdict og sha256) eller JSON

GET /reconciliations/{reconciliationId}/export

Parametre

reconciliationId

path · string · påkrævet

format

query · string · valgfri

Svar

200

Fil (Content-Disposition attachment; filename=afstemning-<dato>-<id>.<format>) · string

404

Fejl (RFC 9457) · Problem

422

Fejl (RFC 9457) · Problem

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

Kvitteringen for dagens billede (antal rækker, sha256, modtaget) — ikke rækkerne

GET /reconciliation/consumer-snapshots/{snapshotDate}

Parametre

snapshotDate

path · string (date) · påkrævet

Dagen billedet gælder (dansk kalender). Skyggeafstemningen for dagen D bruger billedet for D

creditor_id

query · string · påkrævet

Svar

200

OK · ConsumerSnapshot

404

Intet billede for dagen, eller kreditoren er uden for nøglens skop · Problem

curl
curl -X GET https://api.fortapay.dk/v1/reconciliation/consumer-snapshots/{snapshotDate} \
  -H "Authorization: Bearer $FP_KEY"

Forbrugerens (CRM's) daglige øjebliksbillede af kreditors e-conomic-fakturaer — kilde C i skyggeafstemningen

PUT /reconciliation/consumer-snapshots/{snapshotDate}

Forbrugeren SKUBBER; Forta Pay kalder aldrig forbrugeren. Én række pr. e-conomic-faktura med fakturadato ≥ skyggens start: forbrugerens EGEN spejling af e-conomic (customer_number, gross_oere, due_date, eco_remainder_oere, eco_seen_at) og dens projektion af Forta Pay (pay_status, pay_balance_oere, pay_ownership_shadow). Alle felter skal sendes; null betyder «ved det ikke». Beløb i øre. changes_seq = den højeste /v1/changes-sekvens forbrugeren havde behandlet, da billedet blev dannet.

Idempotent pr. dato: samme dato igen ERSTATTER billedet (200) — indtil dagens skyggeafstemning har brugt det (409 snapshot_already_reconciled; kørslen bærer billedets sha256 i sources.crm). Rækkerne returneres aldrig og slettes efter 30 dage.

Parametre

snapshotDate

path · string (date) · påkrævet

Dagen billedet gælder (dansk kalender). Skyggeafstemningen for dagen D bruger billedet for D

creditor_id

query · string · påkrævet

Idempotency-Key

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

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

Krop · ConsumerSnapshotPut

consumer

string · valgfri

forta_crm

changes_seq

integer · påkrævet

Højeste /v1/changes-sekvens forbrugeren havde behandlet (crm_bagud hvis den er under Pays sekvens en time før skæringen)

rows

liste af ConsumerSnapshotRow · påkrævet

Svar

201

Modtaget (første billede for dagen) · ConsumerSnapshot

200

Erstattet (dagens billede fandtes) · ConsumerSnapshot

404

Kreditoren findes ikke eller er uden for nøglens skop · Problem

409

`snapshot_already_reconciled` — dagens skyggeafstemning har brugt billedet; `consumer_not_registered` — kreditoren er attesteret UDEN forbruger (G48: to-bens-afstemning) · Problem

422

`validation_failed` — dato i fremtiden, samme fakturanummer to gange, eller et felt mangler · Problem

curl
curl -X PUT https://api.fortapay.dk/v1/reconciliation/consumer-snapshots/{snapshotDate} \
  -H "Authorization: Bearer $FP_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d @- <<'JSON'
{
  "changes_seq": 0,
  "rows": [
    {
      "economic_invoice_number": 0,
      "customer_number": 0,
      "gross_oere": 0,
      "due_date": "…",
      "eco_remainder_oere": 0,
      "eco_seen_at": "…",
      "pay_status": "…",
      "pay_balance_oere": 0,
      "pay_ownership_shadow": false
    }
  ]
}
JSON

Skyggens 14-dages-tæller — rene dage i træk, dagene bag tallet og seneste kørsel

GET /creditors/{creditorId}/shadow-reconciliation

Fase 5 er bestået efter 14 SAMMENHÆNGENDE dage med skyggeafstemningens dom ren. En dag uden kørsel er mangler og nulstiller tælleren som en defekt. Tællingen slutter i dag, hvis dagens kørsel findes, ellers i går (dagens kører fra kl. 03:00 dansk tid). Kørslerne selv hentes med GET /reconciliations?kind=shadow.

Parametre

creditorId

path · string · påkrævet

Svar

200

OK · ShadowReconciliation

404

Findes ikke eller uden for nøglens skop · Problem

curl
curl -X GET https://api.fortapay.dk/v1/creditors/{creditorId}/shadow-reconciliation \
  -H "Authorization: Bearer $FP_KEY"

Fremmede kvitteringer — 0602-poster på fordringer det tidligere system ejer (arbejdslisten «registrér i FarPay»)

GET /foreign-receipts

En FI-indbetaling (0297/0299) på en fordring med claim previous_system, eller en BS-post (0211) på et mandat overtaget fra 0603 uden en Forta Pay-opkrævning den betalingsdag. Kun når præcis ÉN fordring/ét mandat passer — ellers går posten den almindelige vej (umatchet med en grund). Posten bliver ALDRIG en Forta Pay-betaling og ændrer ingen saldo. Idempotent pr. (kreditor, fil-sha256:linje).

Parametre

cursor

query · string · valgfri

limit

query · integer · valgfri

creditor_id

query · string · valgfri

status

query · string · valgfri

Svar

200

OK · Page

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

Én fremmed kvittering

GET /foreign-receipts/{foreignReceiptId}

Parametre

foreignReceiptId

path · string · påkrævet

Svar

200

OK · ForeignReceipt

404

Findes ikke eller uden for nøglens skop · Problem

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

Et menneskes afgørelse — registreret i FarPay, bogført, eller afvist med grund. Udsender `foreign_receipt.resolved` (scope admin — som i kreditorfladen; pay-sikkerhed2 T6-10)

POST /foreign-receipts/{foreignReceiptId}/resolve

Parametre

foreignReceiptId

path · string · påkrævet

Idempotency-Key

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

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

Krop · ForeignReceiptResolve

status

string · påkrævet

registered_in_previous · booked · dismissed

note

string | null · valgfri

Påkrævet ved dismissed

Svar

200

Afgjort · ForeignReceipt

404

Findes ikke eller uden for nøglens skop · Problem

409

`foreign_receipt_resolved` — allerede afgjort · Problem

422

`validation_failed` — en afvisning uden grund · Problem

curl
curl -X POST https://api.fortapay.dk/v1/foreign-receipts/{foreignReceiptId}/resolve \
  -H "Authorization: Bearer $FP_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d @- <<'JSON'
{
  "status": "registered_in_previous"
}
JSON