name: nav-behandlingskatalog description: > Oppretter og oppdaterer behandlinger (B-nummer), informasjonstyper, policies, legalBases, retention, dpia-felter og databehandlere i Navs Behandlingskatalog (https://behandlingskatalog.ansatt.nav.no). Brukes når nav-etterlevelse eller nav-pvk avdekker gap i Behandlingskatalogen (manglende rettsgrunnlag, feil lagringstid, manglende risikoeier, feil registrerte informasjonstyper o.l.), eller når et team skal opprette en ny behandling.
NAV Behandlingskatalog
Behandlingskatalogen er Navs autoritative register over behandlinger av personopplysninger. Den er Navs «kilde til sannhet» for:
- Hvilke formål en behandling har
- Hvilke rettsgrunnlag (GDPR + nasjonal lov) som benyttes
- Hvilke informasjonstyper som behandles og om hvem (subjektkategorier)
- Lagringstid (BKP — bevarings- og kassasjonsplan)
- Databehandlere
- Risikoeier og PVK-behov
nav-etterlevelse og nav-pvk LESER fra Behandlingskatalogen, men ENDRINGER skal
gjøres med denne skillen.
Når brukes skillen
- Etterlevelse/PVK-vurdering har avdekket gap (tomme felter, feil hjemmel, feil subjektkategori, manglende risikoeier)
- Et team skal opprette en helt ny behandling
- Endring av eksisterende behandling (utvidet formål, nye informasjonstyper, ny databehandler, oppdatert lagringstid)
- Behandling skal endelig settes til COMPLETED etter at PVK er godkjent
Språk
Følg samme språkprinsipper som nav-etterlevelse/nav-pvk: bruk æ/ø/å, klart språk,
fokuser på hva behandlingen faktisk gjør heller enn tekniske detaljer.
Faglig integritet og objektivitet
Behandlingskatalogen er Navs autoritative register over behandlinger av personopplysninger. Registreringene har rettslig betydning — feil klassifisering av hjemmel, informasjonstype eller subjektkategori er ikke et redaksjonelt valg, men en faktafeil. Agenten skal opptre som en uavhengig fagrevisor og ikke speile brukerens ønske om hva som bør registreres.
Ikke speile brukerens sentiment
❌ «Du har helt rett — det er ikke nødvendig å registrere det.»
❌ «Godt poeng — vi kan nok klassifisere det som alminnelig.»
Klassifiseringen følger av GDPR, nasjonal lov og Datatilsynets veiledning — ikke av hva som er mest praktisk eller minst byrdefullt. Enighet uttrykkes ved å sitere kilden:
✅ «Diagnosekoder er helseopplysninger etter GDPR art. 9 nr. 1 bokstav h og skal
registreres med sensitivity: POL og eget rettsgrunnlag etter art. 9 nr. 2.»
✅ «nav-ansatt-id alene er ikke en personopplysning om bruker — den identifiserer
saksbehandleren, ikke den registrerte. Den trenger ikke registreres under denne behandlingen.»
Korriger feilaktige premisser om klassifisering, også når bruker virker sikker
❌ Bruker: «Stillingsprosent er vel ikke sensitivt — det er bare et tall?»
❌ Agent: «Det er en rimelig vurdering, men [...]» ← myker opp et faktaspørsmål
✅ Agent: «Stillingsprosent kombinert med fnr avslører arbeidssituasjonen og kan indirekte si noe om helse eller nedsatt funksjonsevne. Datatilsynet regner slike opplysninger som personopplysninger etter GDPR art. 4(1). Klassifiser som alminnelig personopplysning med dokumentert nødvendighetsvurdering.»
Brukerens oppfatning av hva som er sensitivt er ikke en kilde. Kildene er: GDPR-tekst, Datatilsynets veiledning, Navs behandlingskatalog-vokabular og domene-konteksten. Agenten skal ikke forhandle om klassifisering.
Relaterte skills
- nav-etterlevelse: LESER fra Behandlingskatalogen (B-nummer, legalBases, retention, dpia) for å vurdere kravbesvarelser (K102, K107, K114, K190, K191 m.fl.)
- nav-pvk: LESER fra Behandlingskatalogen for PVK-konteksten og oppretter
PVK-dokument (
dpia.refToDpiapeker inn dit)
Autentisering
- Les (GET):
https://behandlingskatalog-backend.intern.nav.no/api/— ingen auth (krever naisdevice) - Skriv (POST/PUT):
https://behandlingskatalog-backend.intern.nav.no/api/— SSO-cookies påkrevd
behandlingskatalog.ansatt.nav.no er internett-eksponert og beskyttet av forwardauth.
Bruk alltid behandlingskatalog-backend.intern.nav.no for API-kall fra skillen.
Test at skrivesesjonen er gyldig (etter innlogging):
curl -s -o /dev/null -w "%{http_code}\n" \
'https://behandlingskatalog-backend.intern.nav.no/api/process/{behandling-id}' \
-H "Cookie: etterlevsession=...; sso-nav.no=..."
200 = OK, 302 = sesjonen har utløpt.
Base URL og swagger
Base URL: https://behandlingskatalog-backend.intern.nav.no/api
Swagger: https://behandlingskatalog-backend.intern.nav.no/api/swagger-ui/index.html
OpenAPI: https://behandlingskatalog-backend.intern.nav.no/api/v3/api-docs
OpenAPI-spec'en er den autoritative kilden for feltnavn og typer.
Datamodell
Process (Behandling) <-- B-nummer (f.eks. B975)
|
+-- legalBases[] <-- Rettsgrunnlag (GDPR + nasjonal lov + fritekst)
+-- retention <-- Lagringstid og BKP
+-- dpia <-- PVK-behov + risikoeier + lenke til PVK
+-- dataProcessing.processors[] <-- IDer til Processor-entiteter
+-- affiliation <-- Avdeling, team, system, NOM-tilknytning
+-- aiUsageDescription <-- KI-bruk
+-- automaticProcessing (bool) <-- Er behandlingen automatisert?
+-- profiling (bool) <-- Skjer det profilering?
+-- usesAllInformationTypes (bool)
Policy <-- Kobling mellom Process og InformationType
| (én policy per kombinasjon process × informasjonstype)
+-- process { id, number, name }
+-- informationType { id, name, sensitivity, ... }
+-- subjectCategories[] <-- BRUKER / ANSATTE / ARBEIDSGIVERE / m.fl.
+-- legalBasesInherited (bool) <-- Arver fra Process eller har egne grunnlag?
+-- legalBases[] <-- Egne grunnlag (hvis ikke arvet)
+-- start / end <-- Gyldighet i tid
InformationType <-- Personopplysningstype (f.eks. «Fødselsnummer»)
+-- name, sensitivity, ... <-- Sentralt forvaltet, ikke per behandling
Processor (Databehandler)
+-- name, country, outsideEU, transferGrounds
Viktig: Subjektkategori (BRUKER, ANSATTE, ARBEIDSGIVERE, m.fl.) settes per policy (informasjonstype-kobling), ikke per behandling. Samme informasjonstype kan derfor brukes om både brukere og ansatte hvis det er reelt.
Codelists
Mange felter er strenger som må matche koder i en codelist (dropdown). Hent listen:
GET /api/codelist # Alle codelists
GET /api/codelist/{LIST_NAME} # Én liste
GET /api/codelist/{LIST_NAME}/{CODE} # Verifiser én kode
Vanlige codelists:
| Liste | Brukes i | Eksempler |
|---|---|---|
PURPOSE |
process.purposes |
OPPFOLGING_MOT_ARBEID, FORVALTNING_REGISTRE |
GDPR_ARTICLE |
legalBases.gdpr |
ART61E, ART61C, ART91B |
NATIONAL_LAW |
legalBases.nationalLaw |
NAV_LOVEN, FVL, PERSONOPPLYSNINGSLOVEN, ARBEIDSMARKEDSLOVEN |
DEPARTMENT |
affiliation.department |
ATA, YTA, DIR |
SUB_DEPARTMENT |
affiliation.subDepartments |
Avdelingsavhengig |
SYSTEM |
affiliation.products |
MODIA_ARB_OPPFOLGING |
SUBJECT_CATEGORY |
policy.subjectCategories |
BRUKER, ANSATTE, ARBEIDSGIVERE |
THIRD_PARTY |
process.commonExternalProcessResponsible |
Felles behandlingsansvarlig |
Process-API
GET /api/process # List (pagination)
GET /api/process/{id} # Hent én
GET /api/process/search/{Bxxx} # Søk på B-nummer eller tekst
POST /api/process # Opprett (ProcessRequest)
PUT /api/process/{id} # Oppdater (ProcessRequest)
DELETE /api/process/{id} # Slett
⛔ KRITISK: ProcessRequest vs Process-respons
GET-responsen er rik — codelist-verdier er nestede objekter ({code, list, shortName, description}).
PUT krever derimot kun strenger for alle codelist-felter. Du må flate ut.
Hjelpere:
def code(o): return o.get('code') if isinstance(o, dict) else o
def codes(l): return [code(x) for x in (l or [])]
ProcessRequest-skjelett (alle codelist-felter som strenger):
{
"id": "<uuid>",
"name": "...",
"description": "...", # fritekst (formål med behandlingen)
"additionalDescription": "...", # fritekst, valgfri
"purposes": ["OPPFOLGING_MOT_ARBEID"], # kode-strenger
"commonExternalProcessResponsible": None, # kode eller None
"affiliation": {
"department": "ATA",
"nomDepartmentId": "...",
"nomDepartmentName": "...",
"seksjoner": [{"nomSeksjonId": "...", "nomSeksjonName": "..."}],
"fylker": [], "navKontorer": [],
"subDepartments": [],
"productTeams": ["<team-uuid>"],
"products": ["MODIA_ARB_OPPFOLGING"],
"disclosureDispatchers": []
},
"start": "0001-01-01", "end": "9999-12-31",
"legalBases": [{"gdpr": "ART61E", "nationalLaw": "NAV_LOVEN", "description": "§14a"}],
"usesAllInformationTypes": False,
"automaticProcessing": True,
"profiling": False,
"aiUsageDescription": {"aiUsage": False, "description": None,
"reusingPersonalInformation": False,
"startDate": None, "endDate": None, "registryNumber": None},
"dataProcessing": {"dataProcessor": True, "processors": ["<processor-uuid>"]},
"retention": {"retentionPlan": True, "retentionMonths": 120,
"retentionStart": "Ved avslutning av oppfølgingsperiode",
"retentionDescription": "..."},
"dpia": {"needForDpia": True, "refToDpia": "<URL til PVK>",
"grounds": None, "noDpiaReasons": [],
"processImplemented": False,
"riskOwner": "K114452",
"riskOwnerFunction": "Avdelingsleder, Seksjon for arbeidsoppfølging"},
"status": "IN_PROGRESS" # IN_PROGRESS | NEEDS_REVISION | COMPLETED
}
Vanlige feilkilder
| Symptom | Årsak | Løsning |
|---|---|---|
| 400 «Cannot deserialize ... String from Object» | Sendte codelist-objekt der streng forventes | Flat ut med code()-hjelperen |
| 400 om ukjent kode | Codelist-kode finnes ikke | Sjekk /api/codelist/{LIST} for gyldige verdier |
| 200 men ingen endring | Du sendte tilbake GET-data uten å endre | Verifiser request-body før PUT |
legalBases — hva som kan endres
gdprognationalLawer codelist-verdier (dropdown) — kun fra disse listenedescriptioner fritekst og kan endres fritt (f.eks. paragrafhenvisning)- For å fjerne en hjemmel: utelat den fra
legalBases-arrayen i PUT - For å legge til: legg til ny
{gdpr, nationalLaw, description}-entry
retention — semantikk
retentionMonths: antall måneder (int). 10 år = 120retentionStart: når perioden begynner å løpe (fritekst, f.eks. «Ved avslutning av oppfølgingsperiode»). IKKE selve varigheten — det er en vanlig feilretentionDescription: fritekst med begrunnelse + lenker til BKP/Confluence
dpia — felter
needForDpia: bool — om behandlingen krever PVKrefToDpia: URL til PVK i etterlevelsesløsningennoDpiaReasons[]: kodeliste over begrunnelser for å ikke utføre PVK (f.eks.NO_SPECIAL_CATEGORY_PI,SMALL_SCALE,NO_NEW_TECH)processImplemented: bool — settestruenår PVK er godkjent og behandlingen iverksattriskOwner: NAV-ident (f.eks.K114452)riskOwnerFunction: fritekst (f.eks. «Avdelingsleder, Seksjon for arbeidsoppfølging»)
Statusflyt
IN_PROGRESS --> NEEDS_REVISION --> IN_PROGRESS --> COMPLETED
Sett COMPLETED først når:
- Alle obligatoriske felter er fylt ut
- PVK (hvis krevd) er godkjent av risikoeier
- Risikoeier + funksjon er satt
processImplemented = true
Policy-API
Policy kobler en behandling (Process) til en informasjonstype (InformationType) med subjektkategori og evt. egne rettsgrunnlag.
GET /api/policy?processId={pid}&pageSize=50 # Listning per behandling
GET /api/policy?informationTypeId={itid} # Listning per informasjonstype
GET /api/policy/{id} # Hent en
POST /api/policy # Opprett — body er ARRAY av PolicyRequest
PUT /api/policy/{id} # Oppdater én
PUT /api/policy # Oppdater flere (array)
DELETE /api/policy/{id} # Slett én
DELETE /api/policy/process/{processId} # Slett alle for en behandling
PolicyRequest
{
"id": "<uuid>", # kun ved PUT
"processId": "<uuid>", # behandlingen som eier policyen
"informationTypeId": "<uuid>", # informasjonstypen som behandles
"purposes": ["OPPFOLGING_MOT_ARBEID"], # codelist PURPOSE, ofte arvet fra process
"subjectCategories": ["BRUKER"], # codelist SUBJECT_CATEGORY (kan være flere)
"legalBasesUse": "INHERITED_FROM_PROCESS", # se under
"legalBasesInherited": True, # arver fra process eller har egne?
"legalBases": [], # egne grunnlag hvis legalBasesUse=DEDICATED_LEGAL_BASES
"documentIds": []
}
legalBasesUse-verdier:
INHERITED_FROM_PROCESS— bruker process'ens legalBases (vanligst)DEDICATED_LEGAL_BASES— egne legalBases på policyenEXCESS_INFO— overskuddsinformasjonUNRESOLVED— ikke avklart
Typiske oppgaver
Rett feil subjektkategori:
PUT /api/policy/{policyId}
body: {...existing fields, "subjectCategories": ["BRUKER"]}
Legg til ny subjektkategori for samme informasjonstype: To tilnærminger:
- Utvid eksisterende policy: PUT med
subjectCategories: ["ANSATTE", "BRUKER"](én policy med flere kategorier) - Opprett ny policy: POST en helt ny policy med samme
informationTypeIdmen annen subjektkategori. (Bruk denne hvis kategoriene representerer reelt ulike behandlingsspor.)
NB: Behandlingskatalog-modellen tillater én policy per (process, informationType)-kombinasjon. Praktisk vil tilnærming 1 (utvide subjectCategories på eksisterende policy) være riktig i de fleste tilfeller.
Legg til ny informasjonstype:
- Finn ID via
GET /api/informationtype/search?name=<søk> - POST en ny policy med
processId,informationTypeId,subjectCategories - La
legalBasesUse: INHERITED_FROM_PROCESSmed mindre du har gode grunner til noe annet
Fjern feilregistrert informasjonstype:
DELETE /api/policy/{policyId}
⚠️ POST tar et ARRAY
POST /api/policy forventer en array av PolicyRequest, ikke et enkelt objekt.
Også når du oppretter én policy må du wrappe i [...]. Returnerer HTTP 201
ved suksess.
InformationType-API
GET /api/informationtype?pageSize=... # List
GET /api/informationtype/{id} # Hent en
GET /api/informationtype/search?name={søk} # Søk på navn (query param!)
GET /api/informationtype/short # Kort listing
GET /api/informationtype/count # Antall
POST /api/informationtype # Opprett (sjelden)
PUT /api/informationtype/{id} # Oppdater (sjelden)
DELETE /api/informationtype/{id} # Slett (sjelden)
Informasjonstyper er sentralt forvaltet. Som regel skal man finne eksisterende informasjonstype og bruke den i en policy, ikke opprette ny. Eksempler på relevante typer for arbeidsrettet oppfølging:
| ID | Navn | Bruk |
|---|---|---|
dfee7781 |
Fødsels- og personnummer | Bruker-ID |
02260f22 |
Folkeregisteridentifikator | Bruker-ID (FREG-versjon) |
de7a09df |
NAVs personidentifikator | Som regel ansatt-ident |
Søk med query param: ?name=<søk> (ikke path segment).
Processor-API (Databehandler)
GET /api/processor # List
GET /api/processor/{id} # Hent en
GET /api/processor/search/{søkeord} # Søk
POST /api/processor # Opprett
PUT /api/processor/{id} # Oppdater
Standard databehandlere som GCP, Aiven og Microsoft (Entra ID) er allerede registrert
sentralt. Bruk dem ved dataProcessing.processors = [<uuid1>, <uuid2>].
Andre nyttige endepunkter
GET /api/codelist # Alle codelists
GET /api/codelist/{LIST} # Én liste
GET /api/process/search/{søkeord} # Søk behandlinger
GET /api/process/number/{number} # Hent på B-nummer (hvis støttet)
Sandkassemiljø (cplt)
Hvis skillen kjøres via cplt, må arbeidsmappen ha en
.cplt.toml som tillater tilgang til interne NAV-ingresser.
Sjekk om filen finnes — hvis ikke, opprett den:
test -f .cplt.toml || cat > .cplt.toml << 'EOF'
[propose.proxy]
allow_private_domains = ["intern.nav.no"]
[propose.allow]
localhost = [9876]
EOF
Filen finnes også ferdig utfylt i
tools/etterlevelse-broker/.cplt.toml i navikt/dab-copilot-config.
Arbeidsflyt for typiske oppgaver
Oppgave A: Rett feil i eksisterende behandling
- Hent
/api/process/{id} - Flat ut codelist-objekter til kodestrenger
- Endre kun de feltene som skal endres
- PUT tilbake
- Verifiser respons
Oppgave B: Legg til ny rettsgrunnlag
- Hent codelist-koder hvis usikker (
GET /api/codelist/NATIONAL_LAW) - Hent behandlingen, flat ut
- Legg ny entry til
legalBases:{"gdpr": "ART61E", "nationalLaw": "<KODE>", "description": "<paragraf>"} - PUT
Oppgave C: Rett feil subjektkategori eller legg til ny
- List policies for behandlingen:
GET /api/policy?processId={pid}(verifiser path og parametre under utforskning) - Finn relevant policy (informasjonstype-kobling)
- Enten oppdater eksisterende policy (PUT), eller opprett ny policy for samme informasjonstype med annen subjektkategori (POST)
- Verifiser ved å hente behandlingen på nytt og se på
policies-listen
Oppgave D: Sett behandling til COMPLETED
- Verifiser at PVK er godkjent
- Hent behandlingen, sett
dpia.processImplemented = trueogstatus = "COMPLETED" - PUT
⛔ Regler
- Endrer aldri uten brukerens godkjenning. Behandlingskatalogen er Navs autoritative personvern-register. Foreslå endringen først, vis diff, og oppdater først etter klarsignal.
- Tar ikke initiativ til å slette behandlinger. Bare brukeren kan be om det.
- Setter ikke
status = COMPLETEDuten at PVK er godkjent og risikoeier er satt. - Oppretter ikke nye InformationTypes uten samråd med personvernombud.
TBD / Videre utforskning
- DpProcess-API (
/api/dpprocess) — databehandler-prosesser - Disclosure-API (
/api/disclosure) — utleveringer - Document-API (
/api/document) — dokumentkatalog - System-API — systemer (codelist SYSTEM)
- Codelist-administrasjon — hvis koder mangler