Læs både HTTP-status og fejlkode
HTTP-status angiver fejltypen. Den stabile kode forklarer den konkrete afvisning. En menneskelig besked hjælper ved fejlsøgning, men må ikke bruges som en maskinel kontrakt; teksten kan blive forbedret uden at ændre kodebetydningen.
Gatewayen returnerer et request-ID i svarheaderen. Gem dette sammen med tidspunkt, operation og din egen korrelationsreference. Gem ikke Authorization-headeren, client secret eller et helt bilag i en log, blot for at kunne slå requesten op senere. Blind genafsendelse med en ny nøgle er ikke en sikker fejlstrategi.
De vigtigste statusgrupper
| Status | Typisk betydning | Korrekt næste handling |
|---|---|---|
400 | Ugyldigt input, ukendte felter eller parametre. | Ret input; gentag ikke uændret i en løkke. |
401 | Manglende, ugyldigt, udløbet eller forkert miljøtoken. | Kontrollér credentialklassen og autorisationen. |
403 | Aktuel identitet mangler scope, mandat, rolle eller aktiv adgang. | Stop og afklar rettigheden med kunden eller udgiveren. |
404 | Operationen findes ikke, eller en ressource er ikke tilgængelig i konteksten. | Kontrollér den dokumenterede sti; brug ikke anden dataflade. |
409 | Konflikt, eksempelvis idempotency_conflict eller revision_conflict. | Afklar den oprindelige operation eller genopret relevant flow. |
413 | payload_too_large: body overskrider 256 KiB. | Reducér requesten; filupload er ikke dette endpoint. |
415 | unsupported_media_type: forkert Content-Type. | Brug JSON til domænet og formularformat til tokenkald. |
422 | Domænet afviser handlingen: invalid_amount, journal_unbalanced, reference_not_allowed eller domain_rejected. | Undersøg referencer, periode eller regnskabsinput. |
429 | rate_limited: den relevante requestgrænse er ramt. | Vent til næste minut, og brug en begrænset kø. |
503 | Konfiguration, identitet eller backend kunne ikke verificeres. | Stop afhængig aktivitet; gentag kun kontrolleret. |
Fejlkoder
Den fulde liste over stabile koder:
| Kode | Betydning |
|---|---|
invalid_input | Ugyldigt input. |
unknown_field | Ukendt felt i bodyen. |
unknown_query_parameter | Ukendt eller gentaget queryparameter. |
payload_too_large | Bodyen overskrider 256 KiB. |
unsupported_media_type | Forkert Content-Type. |
invalid_token | Manglende, ugyldigt eller udløbet token. |
token_environment_mismatch | Tokenet hører til et andet miljø end ruten. |
insufficient_scope | Tokenet mangler det nødvendige scope. |
permission_denied | Aktuel identitet har ikke adgang. |
step_up_required | Handlingen kræver en stærkere bekræftet session (tofaktor). |
grant_unavailable | Kundens grant er ikke tilgængelig, for eksempel tilbagekaldt eller udløbet. |
invalid_grant | Engangskode, refresh-token eller grant er ugyldigt. |
operation_not_published | Operationen findes ikke i den publicerede kontrakt. |
not_found | Ressourcen findes ikke i konteksten. |
revision_conflict | Den forventede revision er ikke længere aktuel. |
resource_conflict | Ressourcen findes allerede, eller er i konflikt med en eksisterende. |
idempotency_key_required | Skriveoperationen mangler Idempotency-Key. |
idempotency_conflict | Samme nøgle er brugt med anden payload. |
idempotency_grant_changed | Nøglen blev brugt under et andet grant. |
invalid_amount | Beløbet er ugyldigt eller over grænsen på 99 999 999 999 999 øre pr. linje. |
journal_unbalanced | Debet og kredit er ikke lige store. |
reference_not_allowed | En reference er ukendt eller ikke tilladt for grantet. |
domain_rejected | Regnskabskernen afviste handlingen, for eksempel i et lukket regnskabsår. |
append_only | Handlingen ville ændre en uforanderlig post. |
environment_not_ready | Miljøet er ikke klargjort. |
sandbox_unavailable | Sandboxen er ikke tilgængelig. |
rate_limited | Grænsen på 120 API-kald pr. minut er nået. |
Nogle fejl opstår før databasen, andre i den autoritative domæneoperation. Et fejlsvar er derfor ikke i sig selv bevis for, at alle efterfølgende trin blev forsøgt. Eksempelvis afvises en bankroute, før en normal domæneskrivning bliver udført.
Inputfejl, som ofte bliver overset
Ukendte felter afvises i stedet for at blive ignoreret. Det gælder eksempelvis customer_id, source, status og providerfelter i en partnerpayload. En kopieret intern payload er derfor ikke nødvendigvis et gyldigt eksternt input.
Beløb skal være tal og hele øre. En streng med cifre accepteres ikke som en praktisk genvej. Datoer skal være gyldige kalenderdatoer. Parametre må ikke gentages i query eller formular for at teste, om serveren vælger den første eller sidste værdi.
På fakturakladder er mængde, pris og rabat forskellige størrelser. En rabat på 100 procent accepteres ikke. En mængde med mere end tre decimaler afrundes ikke lydløst, hvis det ændrer beløbsgrundlaget.
Autorisationsfejl
Et gyldigt client secret beviser ikke, at kunden har givet adgang. Et token kan ligeledes være korrekt formateret, men knyttet til en udløbet eller tilbagekaldt grant. Kontrollér den aktive apprevision, grantens organisation og scopes, før du begynder at rotere credentials tilfældigt.
Et hsk_-token hører til sandbox. Et hat_-token hører til produktionsprofilen. At ændre URL'en er ikke en måde at konvertere det ene til det andet. Refresh-token-replay kan tilbagekalde hele tokenfamilien; et parallelt refresh-design i klienten skal derfor undgås.
Regnskabsfejl
En postering kan være balanceret og alligevel blive afvist af en lukket periode, en afregnet momsperiode eller en ugyldig reference. Ret ikke automatisk dato, konto eller moms for at få et grønt svar. En sådan ændring er en ny faglig beslutning.
Input, der afvises før regnskabskernen (alle 400-svar samt invalid_amount, journal_unbalanced og reference_not_allowed), gemmer ingen kvittering, så samme idempotensnøgle kan genbruges med rettet input. En afvisning fra kernen (domain_rejected, for eksempel et lukket regnskabsår) gemmes og afspilles igen ved samme nøgle og samme input. Samme nøgle med anden payload giver 409 idempotency_conflict. Idempotensguiden beskriver forskellen mellem et sikkert retry og en ny operation.
Ukendt udfald
Et netværkstimeout fortæller, at klienten ikke fik et rettidigt svar. Det fortæller ikke, om databasen committede. Gem derfor den samme nøgle og payload, og gentag efter den beskrevne strategi. Et senere identisk svar kan være et replay af den første succes, ikke en ny bogføring.
Et timeout under tokenudstedelse er et andet problem: et engangssecret eller en rotationsværdi kan være skabt, men ikke nå klienten. Den værdi kan ikke læses ud af sin digest bagefter. Følg credential- eller reautoriseringsflowet i stedet for at antage, at serveren kan vise den igen.
Hvad en god supportsag indeholder
Angiv miljø, app-ID, den berørte revision, metode og relativ sti, HTTP-status, stabil fejlkode, request-ID og omtrentligt tidspunkt. Beskriv, om requesten var første forsøg eller et retry med samme nøgle. Del kun et minimeret, syntetisk eksempel på input.
Serverens interne databasefejl sendes ikke til partneren. Gatewayen mapper kendte fejl og skjuler ukendte interne detaljer. En lækket SQL-fejl er ikke mere brugbar dokumentation; den kan afsløre tabeller, relationer eller andre kunders eksistens.