Gå til indholdet

Reference

Denne side dokumenterer fejlhåndtering, HTTP-statuskoder og rate limiting.


HTTP-statuskoder

Succeskoder

Kode Betydning Anvendelse
200 OK Succesfuld læsning eller opdatering GET, PUT
201 Created Ressource oprettet POST (oprettelse)
204 No Content Handling udført, ingen body DELETE, move, password-ændring

Klientfejl

Kode Betydning Typisk årsag
400 Bad Request Ugyldig request Manglende felt, forkert format, valideringsfejl
401 Unauthorized Manglende eller ugyldig autentificering Manglende token, udløbet token, forkert audience
403 Forbidden Adgang nægtet Target-ressource er uden for klientens scope
404 Not Found Ressource ikke fundet Ugyldigt ID eller slettet ressource
409 Conflict Konflikt med eksisterende data Duplikeret email, navnekonflikt
422 Unprocessable Entity Semantisk fejl Forretningsregel overtrædes
429 Too Many Requests Rate limit overskredet Se Rate limiting

Serverfejl

Kode Betydning Handling
500 Internal Server Error Uventet serverfejl Forsøg igen med backoff; kontakt support ved gentagne fejl
503 Service Unavailable Midlertidig utilgængelig Forsøg igen efter kort ventetid

Fejlformat — ProblemDetails

Alle fejlresponser returneres som application/problem+json i henhold til RFC 9457.

Struktur

{
  "type": "https://organisationapi.vconf-stage.dk/errors/out-of-scope",
  "title": "Forbidden",
  "status": 403,
  "detail": "Group 'grp-xyz' is not a descendant of your root group.",
  "instance": "/v1/groups/grp-xyz"
}

Felter

Felt Type Altid til stede Beskrivelse
status integer Ja HTTP-statuskode (spejler response-header)
title string Ja Kort, human-readable beskrivelse af fejlkategorien
detail string Ja Specifik forklaring af hvad der gik galt
type string (URI) Nej URI-identifikator for fejltypen
instance string (URI) Nej URI der identificerer den specifikke request

Eksempler

400 — Valideringsfejl:

{
  "status": 400,
  "title": "Bad Request",
  "detail": "Field 'email' is required and must be a valid email address."
}

401 — Udløbet token:

{
  "status": 401,
  "title": "Unauthorized",
  "detail": "Access token has expired. Obtain a new token from the token endpoint."
}

403 — Uden for scope:

{
  "type": "https://organisationapi.vconf-stage.dk/errors/out-of-scope",
  "status": 403,
  "title": "Forbidden",
  "detail": "Group 'grp-other-org' is not within your organisation's hierarchy."
}

404 — Ikke fundet:

{
  "status": 404,
  "title": "Not Found",
  "detail": "No group found with id 'grp-nonexistent'."
}

409 — Duplikeret email:

{
  "status": 409,
  "title": "Conflict",
  "detail": "A user with email 'bruger@example.dk' already exists in this organisation."
}

429 — Rate limit:

{
  "status": 429,
  "title": "Too Many Requests",
  "detail": "Rate limit exceeded. Maximum 100 requests per minute per IP."
}

Rate limiting

API'et håndhæver rate limiting for at beskytte mod misbrug og sikre fair adgang.

Grænser

Parameter Værdi
Requests pr. minut pr. IP 100
Response ved overskridelse 429 Too Many Requests

Headers

Ved 429-svar inkluderes:

Header Beskrivelse
Retry-After Antal sekunder før næste request tillades

Anbefalet strategi

flowchart TD
    A[Send request] --> B{Status 429?}
    B -->|Nej| C[Behandl response]
    B -->|Ja| D[Læs Retry-After header]
    D --> E[Vent angivet tid]
    E --> A

Best practice

  • Implementér exponential backoff ved gentagne 429-svar
  • Cache tokens og undgå unødige token-requests
  • Brug paginering med fornuftig limit-værdi (50–100) for at minimere antal requests
  • Batch logisk sammenhørende operationer i tid, fremfor at sende burst-requests

Token-levetid og refresh

Parameter Typisk værdi
Token-levetid 300 sekunder (5 minutter)
Refresh-strategi Hent nyt token før udløb (fx 30 sek. margin)

Ingen refresh tokens

Client Credentials flow udsteder ikke refresh tokens. Hent et helt nyt access token når det aktuelle udløber.


Content-type og encoding

Aspekt Værdi
Request body format application/json; charset=utf-8
Response body format application/json (success) / application/problem+json (fejl)
Encoding UTF-8