Skip to content

Standards & Compliance

This page maps standards onto what the code does. It is not a certification: nothing here has been audited against these standards, and where the code falls short of a standard's expectation, the gap is stated.


Dutch government standards

Standard What the code does
BIO (Baseline Informatiebeveiliging Overheid) Access management through Keycloak realm roles and tenant checks on every process instance and task; an audit record of every authenticated request, stored in PostgreSQL; HTTP Strict Transport Security on every response.
NEN 7510 Listed by the service's root banner among its compliance claims. No control in the code is specific to it.
AVG / GDPR Case access is limited to the owning organisation and the case's own applicant, and every authenticated request is audited. Two gaps: the BRP person lookup logs the citizen service number (BSN) in plaintext at info level (open issue #241), and its audit entry stores the BSN; and no retention period is applied โ€” nothing purges audit records.
DigiD Norm Assurance levels from the token's loa claim gate two operations: basis for evaluating a decision, midden for starting a process. The realm export defines a DigiD SAML broker, disabled, with placeholder endpoints.
NCSC Beveiligingsrichtlijnen Supply-chain practice in the pipeline: GitHub Actions pinned to commit digests, a blocking audit gate on every pull request, a daily dependency audit of acc and main, a fourteen-day cooldown on new dependency versions, Semgrep scanning, and an SBOM committed for every release.

The root banner's security.compliance list (BIO, NEN 7510, AVG/GDPR, eIDAS) is a fixed string in the code; nothing checks it.


API design rules

The NL API Design Rules are applied as a Spectral lint of the published description /v1/openapi.json, against a vendored copy of the 2.2.1 ruleset, in both backend workflows. Every rule gates except the recorded deviations: nlgov:semver is off because releases are CalVer, and the three problem-details rules are off because errors use the API's own { success, error } envelope rather than application/problem+json. See API Design โ€” Published description.

Rule Applied in RONL
API-05: Use nouns for resource names /process, /decision, /task, /health; actions on a resource are verb sub-paths (/start, /claim, /complete, /evaluate)
API-20: Major version in URI /v1/*; the OpenAPI servers entry carries /v1
API-48: No trailing slashes No documented path ends in a slash, which Spectral checks. Express's default routing still answers a request with a trailing slash
API-51 (/core/publish-openapi): Publish an OpenAPI description GET /v1/openapi.json โ€” OpenAPI 3.1, open to every origin, advertised as documentation in the root banner
API-53: Hide implementation details Operaton's REST API is not exposed directly; the backend serves its own smaller surface. Process instance, definition and task ids are Operaton's own, and a failed process start reports Operaton's error message and the engine URL
API-54: Plural/singular naming Not uniform. The execution core is singular (/v1/process, /v1/task, /v1/decision); other mounts use plural collections (/v1/edocs/documents, /v1/pa/dossiers, /v1/public/processen)
API-57: Version header in responses API-Version on every response, carrying the CalVer release (e.g. 2026.09.12)

Reference: Nederlandse API Strategie


Authentication & identity standards

Standard Implementation
OpenID Connect 1.0 OIDC Authorization Code Flow via Keycloak and keycloak-js. The frontend does not configure PKCE
OAuth 2.0 (RFC 6749) Bearer access tokens; audience validation against ronl-business-api
JWT (RFC 7519) RS256 signed access tokens; the backend accepts no other algorithm
JWKS (RFC 7517) Public key distribution for JWT validation, cached by the backend
SAML 2.0 The realm export defines DigiD and eIDAS as SAML identity providers for Keycloak brokering, both disabled; it defines no eHerkenning provider

Licences

Component Licence
RONL Business API EUPL-1.2
Keycloak Apache 2.0
Operaton Apache 2.0
Node.js MIT
Express MIT
React MIT
PostgreSQL PostgreSQL Licence
Redis BSD 3-Clause
Caddy Apache 2.0

The API's own dependencies use government-compatible open source licences. The running service also relies on proprietary services: the backend does not boot without an Anthropic API key, and it is hosted on Azure App Service.


External references