{"meta":{"dataset_id":"praxikon:sys:registry:dataset:ai-act-implementation-graph","dataset_version":"2.2.0","schema_version":"1.5.0","openapi_version":"1.12.0","documentation":"https://www.praxikon.com/api/v1/openapi"},"data":{"usage_measurement":{"measured":true,"measurement":"Requests to /api/v1 are counted so we can tell adoption from our own testing. The count is anonymous by construction: no IP address is stored, no e-mail address, no raw user agent and no query string. What is kept is a category, a route, a status class, a duration and a date.","measures":["the route that was called, as the registered path and never as the requested URL, so a question in a query string cannot travel into a row","the HTTP method and the class of the status code","the class of the caller derived from the user agent: browser, AI agent, SDK, script or unknown","the referring host, without path or query, and only when it is a public domain name","the dataset version that served the answer","whether the request carried an accepted API key, and for which organisation, so a known caller sees its own usage"],"never_stored":["the IP address, in any form: it is hashed with a secret salt and the calendar date and then dropped","the e-mail address or the name of any person","the raw user agent string","the query string, the request body or the response body","the API key that was presented","a value that links one caller across two days"],"identifier":"Within one calendar day the same caller counts as one caller, through a salted hash that is truncated to sixteen hexadecimal characters. The salt lives only in the server environment and the date is part of the input, so the value cannot be recomputed from the data and two days cannot be linked, by anyone, including us.","retention":"The daily counts are kept for 400 days and then deleted. They hold no personal data, so this is a hygiene rule and not a legal retention period.","affects_responses":"Nothing. The measurement runs after the response has been produced, it is bounded in time, and a failure of the measurement is a failed measurement and never a failed request."},"release":{"dataset_id":"praxikon:sys:registry:dataset:ai-act-implementation-graph","dataset_version":"2.2.0","schema_version":"1.5.0","openapi_version":"1.12.0","known_at":"2026-09-06T00:00:00.000Z","effective_at":"2026-08-08T00:00:00.000Z","last_reviewed_at":"2026-08-08T00:00:00.000Z","append_only":true,"licence":"https://www.praxikon.com/nl/legal/terms","graph_fingerprint_sha256":"c47c4e5bb10fb0f57edf310eb3897285e0d7f38f7663545b9898b4678f161d79","fingerprint_basis":"sha256 over the canonical JSON of the whole dataset, including its metadata. It identifies the release as a whole and is not a citation anchor: for a citation, use the payload_hash_sha256 of the object version."},"objects":{"entities":573,"entity_versions":579,"sources":14,"by_type":{"action":66,"actor":11,"change":26,"control":57,"definition":72,"evidence":63,"example":121,"guidance":38,"obligation":54,"standard":12,"template":53},"counted_over":"Every entity in the published dataset and every version of it, independent of a temporal pin. A query with an effective_at and a known_at returns at most one version per object and therefore fewer objects than this count."},"release_guards":{"status":"passed","command":"npm run lint:content","recorded_at":"2026-09-07T17:11:22.910Z","guard_count":82,"dataset_version":"2.2.0","schema_version":"1.5.0","basis":"The recorded run covers this exact dataset: the fingerprint written when the guard chain completed equals the fingerprint of the dataset served here. The chain runs before the application is built and a failing guard fails the build, so a release that is served has passed it.","covers":["the shape and the invariants of the implementation graph, including the closed set of obligations and the pinned calendar anchors","the recomputation of every payload hash and every source record hash","the review status of every version, which fails the build when an open version passes its due date","the correction register, the release snapshots and the published changelog","the language rules of the published data: bilingual, no dash characters, no liability framing"],"does_not_cover":"Whether an external source has changed since we last checked it. That is what the review status on each version and GET /api/v1/changes are for."},"service_level":{"committed":false,"uptime_measured":false,"latency_measured":false,"detail":"This is a free public beta with no service level: no uptime figure, no latency figure and no support commitment. This endpoint answers what the published dataset is and whether it passed its own release guards. It does not report availability, because we publish no measurement of it and a number nobody measures is worse than an honest absence. What is guaranteed is in the stability contract: stable identifiers, an append only dataset, and the temporal semantics.","contract":"https://www.praxikon.com/api/v1/openapi"},"rate_limit":{"committed_limit":false,"detail":"There is no committed rate limit on this API and no quota to apply for. Two endpoints carry a request cap that is genuinely enforced; everything else is uncapped today. An uncapped endpoint is not a promise that it stays uncapped: a limit may be introduced, and it will be announced in the OpenAPI document before it takes effect.","enforced":[{"path":"/api/v1/answer","max_requests":60,"window_seconds":60,"scope":"client_ip_per_server_instance","storage":"in_process_memory","shared_across_instances":false,"survives_restart":false,"limitation":"The counter lives in the memory of one server process. It is not shared between instances and it resets when the process restarts, so it throttles a runaway client rather than granting or guaranteeing a quota."},{"path":"/api/v1/enforcement","max_requests":60,"window_seconds":60,"scope":"client_ip_per_server_instance","storage":"in_process_memory","shared_across_instances":false,"survives_restart":false,"limitation":"The counter lives in the memory of one server process. It is not shared between instances and it resets when the process restarts, so it throttles a runaway client rather than granting or guaranteeing a quota."},{"path":"/api/v1/naleving-index","max_requests":60,"window_seconds":60,"scope":"client_ip_per_server_instance","storage":"in_process_memory","shared_across_instances":false,"survives_restart":false,"limitation":"The counter lives in the memory of one server process. It is not shared between instances and it resets when the process restarts, so it throttles a runaway client rather than granting or guaranteeing a quota."}],"unlimited":[{"path":"/api/v1/obligations","enforced":false},{"path":"/api/v1/changes","enforced":false},{"path":"/api/v1/entities","enforced":false},{"path":"/api/v1/search","enforced":false},{"path":"/api/v1/corrections","enforced":false},{"path":"/api/v1/diff","enforced":false},{"path":"/api/v1/dataset","enforced":false},{"path":"/api/v1/openapi","enforced":false},{"path":"/api/v1/status","enforced":false},{"path":"/api/v1/implementation-map","enforced":false},{"path":"/api/v1/manifest","enforced":false},{"path":"/api/v1/manifest/validate","enforced":false},{"path":"/api/v1/impact","enforced":false}],"when_limited":{"status":429,"body":"The standard error object, with code rate_limited.","header":"Retry-After, in seconds."},"if_a_limit_is_introduced":["it is announced in the OpenAPI document before it takes effect, under the notice rule in VERSIONING.md section 4.1;","it is returned as 429 with the standard error object and a Retry-After header, the same shape as the two enforced caps use today;","no number is committed here in advance, because a number nobody enforces is worse than an honest absence."]},"registers":{"corrections":{"register_id":"praxikon:sys:registry:register:corrections","started_at":"2026-08-08T00:00:00.000Z","recorded":0,"complete_from_start_date":true,"url":"https://www.praxikon.com/api/v1/corrections"},"graph_snapshots":{"register_id":"praxikon:sys:registry:register:graph-snapshots","started_at":"2026-08-13T00:00:00.000Z","recorded_dataset_versions":["1.1.0","2.0.0","2.1.0","2.2.0"],"url":"https://www.praxikon.com/api/v1/diff"},"changelog":{"register_id":"praxikon:sys:registry:register:dataset-releases","started_at":"2026-08-08","url":"https://www.praxikon.com/changelog.json","human_page":"https://www.praxikon.com/en/releases"}}},"links":{"self":"https://www.praxikon.com/api/v1/status","changelog":"https://www.praxikon.com/changelog.json","dataset":"https://www.praxikon.com/api/v1/dataset","documentation":"https://www.praxikon.com/api/v1/openapi","corrections":"https://www.praxikon.com/api/v1/corrections","diff":"https://www.praxikon.com/api/v1/diff","methodology":"https://www.praxikon.com/en/methodologie","licence":"https://www.praxikon.com/nl/legal/terms"}}