---
type: definition
title: Henvendelse
description: Protokollen for en begrundet henvendelse, dens svarkanal og svar.
---
En henvendelse er et almindeligt OKF-dokument med `type: request`, `title`, `description`, `okf.graph.fields` og Markdown-prosa. Prosaen er et konkret forslag, begrundelse og konsekvens. Et almindeligt link binder henvendelsestypens præcise revision. Parametrene er beslutningens data, aldrig layout eller adfærd.

Felterne er:

| Felt | Betydning |
|---|---|
| `requestId` | Afsenderens entydige id. Samme id og indhold er idempotent; andet indhold er en konflikt. |
| `sender` | `{id, organization: {id, title}}`. Organisationens titel vises som afsender. |
| `recipients` | 1–20 verificerede e-mailadresser. Første gyldige svar afgør; et menneske holder aldrig afsenderens arbejde. |
| `parameters`, `parametersSchema`, `answer` | Beslutningens data og de frosne JSON Schema 2020-12-skemaer for parametre og resultat. Ingen fjerne referencer. |
| `typeTitle` | Typens titel ved afsendelsen. Henvendelsen kan læses uden adgang til typens rum. |
| `verbatim` | Højst otte blokke med `{title, body}`, der vises og bekræftes ordret. |
| `respondBy` | Krævet frist som RFC 3339-tidspunkt. Ved fristen afslutter indbakken de åbne modtagere med none/expired. |
| `dataHandling` | `ordinary` eller `protected`. Beskyttede parametre og resultater udleveres kun til modtagerne og afsenderen. |
| `correlationId` | Uigennemsigtigt tråd-id, højst 256 tegn. Det returneres uændret og giver ingen adgang til afsenderens system. |
| `replyTo` | Valgfri HTTPS-adresse til det signerede svar. Uden den hentes svar i afsenderens strøm. |
| `workplaceUrl` | Valgfrit HTTPS-link til afsenderens klient i notifikationen; ellers bruges indbakkens origin. |
| `viewHints` | Valgfri ordnet liste af `{format, ref, digest?}`. Brug første forståede og betroede hint, ellers teksten. |
| `assurance` | Valgfrit `{level: session}` (standard), `{level: recent, maxAge: <sekunder>}` eller `{level: per-answer}`. I1 understøtter session og recent; per-answer afvises med `assurance_unsupported` indtil I2. |
| `inPerson` | Valgfrit krav om personens eget svar; et agentsvar opfylder det ikke. |

Titel er højst 200 tegn, resumé 1000 tegn og prosa 16 KiB. Parametre og resultat er højst 32 KiB JSON, hvert skema højst 16 KiB. En ordret blok har højst 200 tegn i titlen og 4000 i teksten. Budgetterne håndhæves i modtagerens database.

`platform.realization` peger på et Finch-view i afsenderorganisationen. `inbox.view` peger på en ren visning og har altid digest. `inbox.native` betegner et modul mod den native klients faste komponentkatalog. Indbakken gemmer hints uden at fortolke dem; ukendte formater ignoreres. Et fast bekræftelseslag uden for visningen gentager struktureret svar, fritekst, begrundelse og ordrette blokke, før svaret afgives.

## Afsender-API

| Kald | Svar |
|---|---|
| `POST /v1/requests` med `text/markdown` | 201 ved oprettelse, 200 ved gentagelse, 409 ved andet indhold under samme id, 422 ved ugyldigt dokument, skema, parametre eller budget. |
| `POST /v1/requests/{requestId}/withdraw` med `{reason}` | Trækker tilbage og lukker åbne modtagerrækker. |
| `POST /v1/requests/{requestId}/respond-by` med `{respondBy}` | Flytter fristen mens åben. |
| `GET /v1/requests/{requestId}` | Henvendelsens tilstand og dens svar. |
| `GET /v1/requests?answeredAfter=<markør>` | Side af afsenderens svar og næste markør; markøren behandles uigennemsigtigt. |

Afsenderkald signeres med HTTP Message Signatures (RFC 9421), Content-Digest (RFC 9530) og Ed25519. Profilen dækker `@method`, `@target-uri` og `content-digest`, i den rækkefølge, med parametrene `created`, `keyid` og `alg="ed25519"`. Signaturfelter bruger RFC 8941. Nøgle-idet identificerer afsenderen. Afsender- og klientkald bærer `organization` som URL-parameter, dækket af `@target-uri`. Der accepteres fem minutters urforskel; en genlevering signeres på ny. Modtageren stoler kun på en optaget nøgle, aldrig på en nøgle-URL fra kaldet.

## Svar og svarkanal

Kuverten har `answerId`, `requestId`, `recipient` (den svarende adresse), `actingVia` (`person`, `agent` eller `inbox`), `outcome` (`answered`, `cannot` eller `none`), `result?`, `text?`, `reason?`, `shownView`, `requestState`, `correlationId` og `answeredAt` samt `assurance: {level, acr, verifiedAt}`.

Et `answered`-resultat valideres mod `answer`. Ved tekstvisning kan personen i stedet svare med `text`. Fritekst kan altid tilføjes, højst 4000 tegn. `cannot` kræver en begrundelse på højst 1000 tegn og har intet resultat; det lukker kun egen modtagerrække. Indbakken afslutter selv med `none`, `actingVia: inbox` og årsagen `expired`, `withdrawn`, `rejected` eller `unreachable`. Når ingen åben modtager er tilbage, er henvendelsen `declined`, hvis nogen svarede `cannot`, og ellers `unanswered`. `none` bærer intet `assurance`. Første `answered` gør den `answered` og lukker de øvrige åbne modtagere. `requestState` fastholder tilstanden efter netop dette svar, også ved genlevering. `shownView` er det sete hint eller null ved tekst.

Indbakken sender kuverten som `POST application/json` til `replyTo` (valgfri), mindst én gang og i rækkefølge pr. henvendelse. 2xx kvitterer; ellers prøves igen med stigende ventetid. Modtagelsen er idempotent på `answerId`. Svaret bruger samme RFC 9421-profil. Indbakkens offentlige Ed25519-nøgler publiceres som JWKS på `/.well-known/inbox-keys.json`. Afsenderen kontrollerer den på forhånd bundne indbakkeorigins nøgle før fortolkning og append.

En modtager ser kun egen modtagerrække og egne svar, aldrig andre modtagere. Indbakken har kontoen på personens identitet på tværs af organisationer. En klient med både personens adgangstoken og en organisations afsendersignatur ser kun personens henvendelser fra den organisation.

## Verifikation

`session` og `recent` kortlægges til OpenID `acr: "0"`; tidskravet bruger `auth_time` og OpenID `max_age`. `recent.maxAge` er 1–43200 sekunder. Den opnåede styrke er obligatorisk i personens svar og kommer fra IdP-verifikationens faktiske tidspunkt, aldrig tokenets udstedelse eller klientens input. Et `answered` må ikke være svagere end krævet. Personen kan altid svare `cannot` under sin verificerede session, også når nylighedskravet ikke er opfyldt; svaret angiver da `session`. I1 accepterer sessioner højst 12 timer fra verifikation. Klienten beder om nyt login med `max_age`, når indbakken genåbnes efter inaktivitet, eller API svarer `verification_required`. `per-answer` med signatur over svar og visningens aftryk kommer i I2.

Signerede GET-svar dækker `@status`, `content-digest`, `"@method";req` og `"@target-uri";req` efter RFC 9421 §2.4, så svaret er bundet til den præcise forespørgsel.
