{"openapi":"3.1.0","info":{"title":"LovAPI","description":"LovAPI gives programmatic lookup and search access to Danish law, as published on [Retsinformation](https://retsinformation.dk).\n\nDocument endpoints identify and describe documents. Search returns matched passages of text with their document's metadata. The Corpus section explains what the documents are and what each part of the API covers.\n\nLovAPI is operated by [Alkvantor Intelligence ApS](https://alkvantor.com) (CVR 45021467). Rate limits, quotas and pricing are described on https://lovapi.dk.\n\nNeed help? We're happy to help you out and improve the service too. Write to support@lovapi.dk.\n\n## Stability\n\nWe are committed to keeping `/v1` stable. Changes are only ever additions, such as new endpoints, parameters, response fields or error codes, so an integration that works today keeps working. Write your client to ignore fields and values it does not recognize.\n\nBreaking changes, if they come, will be released as a new API version, and this version will stay available.\n\n## Documentation\n\nThis reference is available in three forms:\n\n- https://api.lovapi.dk/v1/redoc: one readable page.\n- https://api.lovapi.dk/v1/docs: interactive. Authorize with your key and send requests from the page. These are real requests and count against your limits.\n- https://api.lovapi.dk/v1/openapi.json: the machine-readable OpenAPI schema, for client generators, AI agents and tools such as Postman.\n\n## Quickstart\n\nThe base URL is `https://api.lovapi.dk/v1`; every path on this page is relative to it. Check your key first; a 200 confirms it:\n\n```\ncurl -H \"Authorization: Bearer $LOVAPI_KEY\" \"https://api.lovapi.dk/v1/account\"\n```\n\nThen a first search:\n\n```\ncurl -H \"Authorization: Bearer $LOVAPI_KEY\" \\\n  \"https://api.lovapi.dk/v1/search/lexical?query=hastighedsgr%C3%A6nse%20motorvej&limit=3\"\n```\n\nA typical integration:\n\n1. Find documents by name and get their accession numbers: `GET /documents/discover?title=lejeloven`.\n2. Read a document's metadata and relations: `GET /documents/metadata/{accession_number}`.\n3. Search the text, optionally scoped to your documents: `GET /search/lexical` or `GET /search/semantic`.\n4. Keep your document list current: `GET /documents/changes/{date}`, once per day.\n\n## Corpus\n\nThe corpus is the documents published on Retsinformation: laws, statutory orders, circulars, guidance, decisions and more. Each document has its own accession number, which is a letter followed by 11 digits, e.g. `A20250903516`. The leading letter is the document's class, which can be used as a lookup and search filter.\n\n| Class | Documents |\n|---|---|\n| A | Laws (love) |\n| B | Statutory orders (bekendtgørelser) |\n| C | Guidance documents (circulærer, vejledninger) |\n| L | Statutory orders promulgating international agreements |\n| O | Ombudsman case reports, inspections and follow-ups |\n| U | Court decisions |\n| W | Decisions of boards and tribunals (kendelser) |\n| X | Binding tax-law answers (bindende svar) |\n| Y | Statements of opinion (udtalelser) |\n\nThe publishing of legal data follows the conventions of print: once published, a document is generally not changed. Instead, a change is made by publishing a new document, an amending document, whose content is instructions for changing other documents, such as \"in § 5, stk. 2, 'X' is replaced by 'Y'\". A law is amended by a new law passed by parliament, and a statutory order by a new statutory order. Amending documents therefore sit in the same classes as the documents they change.\n\nLater, a consolidated document may be published, combining the original with its amendments under a new accession number, and the older document is marked historical.\n\nA document is marked historical (`is_historical`) for one of two main reasons: a newer document has replaced it, or it has been repealed. Its `related_documents` usually points to the replacing or repealing document, as a `consolidated_by` or `changed_by` relation entry. Be aware that the historical flag is a publication status, not a statement about legal effect. A historical document may still apply, and a current one may not have taken effect yet.\n\n- **Search** covers current documents only, meaning those not marked historical, in an index refreshed daily. A hit is not a whole document but one meaningful unit of its text, returned in full: a paragraph (§) of a law or statutory order, a named section of a guidance document, or an appendix. Documents without such structure are returned as one unit, their whole text or their resumé. What amending documents did to the text appears as `change_annotations`, never merged into the text itself.\n- **Documents** endpoints cover all documents, historical and amending documents included.\n\n## Errors\n\n| `code` | Status | Meaning | Retry |\n|---|---|---|---|\n| `unauthorized` | 401 | Key missing, unknown, expired, or not a Bearer token | No |\n| `validation_failed` | 422 | A parameter is invalid; `errors` names it | No |\n| `not_found` | 404 | No such document | No |\n| `method_not_allowed` | 405 | Only `GET` is served | No |\n| `burst` | 429 | Per-minute limit reached | After `Retry-After` |\n| `daily_quota` | 429 | Daily limit reached | After midnight UTC |\n| `internal_error` | 500 | Unexpected server error | Yes, with backoff |\n| `upstream_failure` | 502 | A backing service is unavailable | Yes, with backoff |\n\n## Authentication\n\nSend `Authorization: Bearer <key>` with every request. Keys are issued by LovAPI and belong to your account.\n\n## Limits\n\nYour account has a per-minute and a daily limit, shared by all your keys. Responses carry `RateLimit-*` headers with your remaining requests, so you can throttle before you hit a 429. The Account section has the details.","version":"1.0.0"},"paths":{"/account":{"get":{"tags":["Account"],"summary":"Get account limits","description":"Get your account's limits and usage.\n\nA 200 confirms that your key works; the request does not depend\non search or the document registry. It counts against your limits\nlike any other request.","operationId":"getAccount","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Account"}}},"headers":{"RateLimit-Limit":{"description":"The binding window's limit (see Limits in the introduction).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests still available in that window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until that window resets.","schema":{"type":"integer"}}}},"401":{"description":"The key is missing, unknown, expired, or not sent as a Bearer token. Not counted against your limits.","headers":{"WWW-Authenticate":{"description":"Always `Bearer`.","schema":{"type":"string","example":"Bearer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Unauthorized","status":401,"detail":"Credentials are required: send \"Authorization: Bearer <key>\".","code":"unauthorized"}}}},"422":{"description":"A parameter is malformed or out of range, or the query string carries an unknown parameter or repeats a single-value one. `errors` names each rejected parameter. Counts against your limits.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Unprocessable Entity","status":422,"detail":"Request validation failed.","code":"validation_failed","errors":[{"field":"query","message":"String should have at least 1 character"}]}}},"headers":{"RateLimit-Limit":{"description":"The binding window's limit (see Limits in the introduction).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests still available in that window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until that window resets.","schema":{"type":"integer"}}}},"429":{"description":"A limit is exhausted. `code` names the window:\n\n- `burst`: the per-minute limit; wait for the calendar minute to end.\n- `daily_quota`: the daily limit; it resets at midnight UTC.\n\n`Retry-After` gives the seconds to wait. A rejected request is not counted.","headers":{"Retry-After":{"description":"Seconds until the exhausted window's boundary (the minute's end for burst, midnight UTC for daily_quota); equals RateLimit-Reset.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"The exhausted window's limit (a per-minute or per-day number; the RateLimit-* headers together describe one window, the binding one).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Exactly 0 on a rejection.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds to the same boundary as Retry-After.","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"burst":{"summary":"Burst limit exhausted, headers: Retry-After: 37, RateLimit-Limit: 10, RateLimit-Remaining: 0, RateLimit-Reset: 37","description":"Response headers for this example: `Retry-After: 37`, `RateLimit-Limit: 10`, `RateLimit-Remaining: 0`, `RateLimit-Reset: 37` (37 s to the minute's end). The numbers are illustrative; each response's own RateLimit-* headers state your actual limits.","value":{"type":"about:blank","title":"Too Many Requests","status":429,"detail":"Request rate limit exceeded. Retry after the indicated interval.","code":"burst"}},"daily_quota":{"summary":"Daily quota exhausted, headers: Retry-After: 49324, RateLimit-Limit: 1000, RateLimit-Remaining: 0, RateLimit-Reset: 49324","description":"Response headers for this example: `Retry-After: 49324`, `RateLimit-Limit: 1000`, `RateLimit-Remaining: 0`, `RateLimit-Reset: 49324` (49,324 s to midnight UTC). The numbers are illustrative; each response's own RateLimit-* headers state your actual limits.","value":{"type":"about:blank","title":"Too Many Requests","status":429,"detail":"Daily request quota exhausted. The quota resets at midnight UTC.","code":"daily_quota"}}}}}},"500":{"description":"An unexpected server error. Retrying may succeed. Not counted against your limits.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Internal Server Error","status":500,"detail":"Internal server error.","code":"internal_error"}}}}},"security":[{"HTTPBearer":[]}]}},"/search/lexical":{"get":{"tags":["Search"],"summary":"Lexical search","description":"Search the corpus by keyword matching.\n\nA hit is one passage of a document, usually a paragraph or a\nsection. A document without such structure is returned whole, or\nas its resumé. On those hits, `chapter_name`, `section_name` and\n`paragraph` are null.\n\nThe scope filters combine: a hit must satisfy\n`accession_number`, `accession_class` and\n`exclude_accession_number` together. An in-scope document with\nno matching text contributes no hits. Exclusion is applied\ninside the query, so excluded documents never leave gaps in a\npage.\n\nEach hit's `change_annotations` lists what later amending\ndocuments did to the matched text. The changes are never merged\ninto the text itself.\n\nIf the document registry is unavailable, the search still\nanswers 200, with `title`, `popular_title` and `short_title`\nnull on every hit.\n\n`score` orders the hits, highest first. It is a raw relevance\nvalue, not comparable across queries.","operationId":"searchLexical","security":[{"HTTPBearer":[]}],"parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":512,"description":"The search text: 1 to 512 characters after trimming whitespace.","title":"Query"},"description":"The search text: 1 to 512 characters after trimming whitespace.","example":"hastighedsgrænse motorvej"},{"name":"accession_number","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"maxItems":100,"description":"Restrict the scope to these documents. Repeatable, up to 100 values. Each value is an accession number (a letter followed by 11 digits, any casing); another shape is a 422. An unknown accession number is not an error: it matches nothing.","title":"Accession Number"},"description":"Restrict the scope to these documents. Repeatable, up to 100 values. Each value is an accession number (a letter followed by 11 digits, any casing); another shape is a 422. An unknown accession number is not an error: it matches nothing."},{"name":"accession_class","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"maxItems":26,"description":"Restrict the scope to these series classes, the leading letter of the accession number. Repeatable, up to 26 values, any casing. A value that is not a single letter is a 422; a letter with no documents matches nothing.\n\nThe series classes the corpus carries today:\n\n| Class | Documents |\n|---|---|\n| A | Laws (love) |\n| B | Statutory orders (bekendtgørelser) |\n| C | Guidance documents (circulærer, vejledninger) |\n| L | Statutory orders promulgating international agreements |\n| O | Ombudsman case reports, inspections and follow-ups |\n| U | Court decisions |\n| W | Decisions of boards and tribunals (kendelser) |\n| X | Binding tax-law answers (bindende svar) |\n| Y | Statements of opinion (udtalelser) |","title":"Accession Class"},"description":"Restrict the scope to these series classes, the leading letter of the accession number. Repeatable, up to 26 values, any casing. A value that is not a single letter is a 422; a letter with no documents matches nothing.\n\nThe series classes the corpus carries today:\n\n| Class | Documents |\n|---|---|\n| A | Laws (love) |\n| B | Statutory orders (bekendtgørelser) |\n| C | Guidance documents (circulærer, vejledninger) |\n| L | Statutory orders promulgating international agreements |\n| O | Ombudsman case reports, inspections and follow-ups |\n| U | Court decisions |\n| W | Decisions of boards and tribunals (kendelser) |\n| X | Binding tax-law answers (bindende svar) |\n| Y | Statements of opinion (udtalelser) |"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum number of hits, 1 to 100.","default":10,"title":"Limit"},"description":"Maximum number of hits, 1 to 100."},{"name":"exclude_accession_number","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"maxItems":100,"description":"Remove these documents from the scope. Repeatable, up to 100 values, in the same format as `accession_number`; an unknown accession number removes nothing. Works on its own (search everything except these documents). A number given in both `accession_number` and `exclude_accession_number` is a 422.","title":"Exclude Accession Number"},"description":"Remove these documents from the scope. Repeatable, up to 100 values, in the same format as `accession_number`; an unknown accession number removes nothing. Works on its own (search everything except these documents). A number given in both `accession_number` and `exclude_accession_number` is a 422."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}},"headers":{"RateLimit-Limit":{"description":"The binding window's limit (see Limits in the introduction).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests still available in that window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until that window resets.","schema":{"type":"integer"}}}},"401":{"description":"The key is missing, unknown, expired, or not sent as a Bearer token. Not counted against your limits.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Unauthorized","status":401,"detail":"Credentials are required: send \"Authorization: Bearer <key>\".","code":"unauthorized"}}},"headers":{"WWW-Authenticate":{"description":"Always `Bearer`.","schema":{"type":"string","example":"Bearer"}}}},"422":{"description":"A parameter is malformed or out of range, or the query string carries an unknown parameter or repeats a single-value one. `errors` names each rejected parameter. Counts against your limits.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Unprocessable Entity","status":422,"detail":"Request validation failed.","code":"validation_failed","errors":[{"field":"query","message":"String should have at least 1 character"}]}}},"headers":{"RateLimit-Limit":{"description":"The binding window's limit (see Limits in the introduction).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests still available in that window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until that window resets.","schema":{"type":"integer"}}}},"429":{"description":"A limit is exhausted. `code` names the window:\n\n- `burst`: the per-minute limit; wait for the calendar minute to end.\n- `daily_quota`: the daily limit; it resets at midnight UTC.\n\n`Retry-After` gives the seconds to wait. A rejected request is not counted.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"burst":{"summary":"Burst limit exhausted, headers: Retry-After: 37, RateLimit-Limit: 10, RateLimit-Remaining: 0, RateLimit-Reset: 37","description":"Response headers for this example: `Retry-After: 37`, `RateLimit-Limit: 10`, `RateLimit-Remaining: 0`, `RateLimit-Reset: 37` (37 s to the minute's end). The numbers are illustrative; each response's own RateLimit-* headers state your actual limits.","value":{"type":"about:blank","title":"Too Many Requests","status":429,"detail":"Request rate limit exceeded. Retry after the indicated interval.","code":"burst"}},"daily_quota":{"summary":"Daily quota exhausted, headers: Retry-After: 49324, RateLimit-Limit: 1000, RateLimit-Remaining: 0, RateLimit-Reset: 49324","description":"Response headers for this example: `Retry-After: 49324`, `RateLimit-Limit: 1000`, `RateLimit-Remaining: 0`, `RateLimit-Reset: 49324` (49,324 s to midnight UTC). The numbers are illustrative; each response's own RateLimit-* headers state your actual limits.","value":{"type":"about:blank","title":"Too Many Requests","status":429,"detail":"Daily request quota exhausted. The quota resets at midnight UTC.","code":"daily_quota"}}}}},"headers":{"Retry-After":{"description":"Seconds until the exhausted window's boundary (the minute's end for burst, midnight UTC for daily_quota); equals RateLimit-Reset.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"The exhausted window's limit (a per-minute or per-day number; the RateLimit-* headers together describe one window, the binding one).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Exactly 0 on a rejection.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds to the same boundary as Retry-After.","schema":{"type":"integer"}}}},"500":{"description":"An unexpected server error. Retrying may succeed. Not counted against your limits.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Internal Server Error","status":500,"detail":"Internal server error.","code":"internal_error"}}}},"502":{"description":"The search index is unavailable. Retry later. Not counted against your limits.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Bad Gateway","status":502,"detail":"Search backend is unavailable. Try again later.","code":"upstream_failure"}}}}}}},"/search/semantic":{"get":{"tags":["Search"],"summary":"Semantic search","description":"Search the corpus by meaning.\n\nThe query is embedded as a vector and passages are ranked by\ncosine similarity to it, so hits can match synonyms and\nparaphrases, not only the literal terms.\n\nA hit is one passage of a document, usually a paragraph or a\nsection. A document without such structure is returned whole, or\nas its resumé. On those hits, `chapter_name`, `section_name` and\n`paragraph` are null.\n\nThe scope filters combine: a hit must satisfy\n`accession_number`, `accession_class` and\n`exclude_accession_number` together. Filters apply before\nranking, so a scoped request returns the closest passages within\nthe scope, even for an off-topic query, and one document can\nfill the page.\n\nEach hit's `change_annotations` lists what later amending\ndocuments did to the matched text. The changes are never merged\ninto the text itself.\n\nIf the document registry is unavailable, the search still\nanswers 200, with `title`, `popular_title` and `short_title`\nnull on every hit.\n\n`score` is (1 + cosine) / 2: between 0 and 1, higher is closer.\n1.0 is an identical vector and 0.5 is unrelated (orthogonal)\ntext; real text typically scores well above 0.5. It is not\ncomparable across queries or with lexical scores.","operationId":"searchSemantic","security":[{"HTTPBearer":[]}],"parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":512,"description":"The search text: 1 to 512 characters after trimming whitespace.","title":"Query"},"description":"The search text: 1 to 512 characters after trimming whitespace.","example":"hvor hurtigt må man køre på motorvejen?"},{"name":"accession_number","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"maxItems":100,"description":"Restrict the scope to these documents. Repeatable, up to 100 values. Each value is an accession number (a letter followed by 11 digits, any casing); another shape is a 422. An unknown accession number is not an error: it matches nothing.","title":"Accession Number"},"description":"Restrict the scope to these documents. Repeatable, up to 100 values. Each value is an accession number (a letter followed by 11 digits, any casing); another shape is a 422. An unknown accession number is not an error: it matches nothing."},{"name":"accession_class","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"maxItems":26,"description":"Restrict the scope to these series classes, the leading letter of the accession number. Repeatable, up to 26 values, any casing. A value that is not a single letter is a 422; a letter with no documents matches nothing.\n\nThe series classes the corpus carries today:\n\n| Class | Documents |\n|---|---|\n| A | Laws (love) |\n| B | Statutory orders (bekendtgørelser) |\n| C | Guidance documents (circulærer, vejledninger) |\n| L | Statutory orders promulgating international agreements |\n| O | Ombudsman case reports, inspections and follow-ups |\n| U | Court decisions |\n| W | Decisions of boards and tribunals (kendelser) |\n| X | Binding tax-law answers (bindende svar) |\n| Y | Statements of opinion (udtalelser) |","title":"Accession Class"},"description":"Restrict the scope to these series classes, the leading letter of the accession number. Repeatable, up to 26 values, any casing. A value that is not a single letter is a 422; a letter with no documents matches nothing.\n\nThe series classes the corpus carries today:\n\n| Class | Documents |\n|---|---|\n| A | Laws (love) |\n| B | Statutory orders (bekendtgørelser) |\n| C | Guidance documents (circulærer, vejledninger) |\n| L | Statutory orders promulgating international agreements |\n| O | Ombudsman case reports, inspections and follow-ups |\n| U | Court decisions |\n| W | Decisions of boards and tribunals (kendelser) |\n| X | Binding tax-law answers (bindende svar) |\n| Y | Statements of opinion (udtalelser) |"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum number of hits, 1 to 100.","default":10,"title":"Limit"},"description":"Maximum number of hits, 1 to 100."},{"name":"exclude_accession_number","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"maxItems":100,"description":"Remove these documents from the scope. Repeatable, up to 100 values, in the same format as `accession_number`; an unknown accession number removes nothing. Works on its own (search everything except these documents). A number given in both `accession_number` and `exclude_accession_number` is a 422.","title":"Exclude Accession Number"},"description":"Remove these documents from the scope. Repeatable, up to 100 values, in the same format as `accession_number`; an unknown accession number removes nothing. Works on its own (search everything except these documents). A number given in both `accession_number` and `exclude_accession_number` is a 422."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"},"examples":{"semantic_search_example":{"summary":"A semantic search hit","value":{"query":"hvor hurtigt må man køre på motorvejen?","count":3,"hits":[{"accession_number":"A20260011829","title":"Bekendtgørelse af færdselsloven","popular_title":"Færdselsloven","short_title":"LBK nr 118 af 12/01/2026","chapter_name":"Kapitel 6","section_name":"Motorvej","paragraph":"44","content":["Færdsel på motorvej samt på tilkørsels- og frakørselsvej til en sådan vej må kun ske med motorkøretøjer, som på vandret vej kan og må fremføres med en hastighed af mindst 50 km i timen.\n  Stk. 2. Uanset stk. 1 kan politiet tillade kørsel med blokvogn, hvis en transport ikke med rimelighed kan gennemføres på anden måde.\n  Stk. 3. Uanset stk. 1 kan politiet tillade kørsel som led i erhvervsudøvelse fra nærmeste tilkørsel til nærmeste frakørsel på motorveje over faste forbindelser (broer og tunneler) med andre motordrevne køretøjer end de i stk. 1 og 2 nævnte, hvis kørslen ikke med rimelighed kan gennemføres på anden måde. Der kan ikke gives tilladelse til kørsel med knallert på de nævnte vejstrækninger.\n  Stk. 4. Transportministeren kan fastsætte regler om kørsel med motordrevne køretøjer på motorvej efter stk. 3. Transportministeren kan efter forhandling med justitsministeren fastsætte bestemmelser om betaling for politimæssig assistance, der efter politiets skøn er påkrævet ved gennemførelse af sådan kørsel."],"change_annotations":[],"score":0.9537002},{"accession_number":"A20260011829","title":"Bekendtgørelse af færdselsloven","popular_title":"Færdselsloven","short_title":"LBK nr 118 af 12/01/2026","chapter_name":"Kapitel 5","section_name":"Generelle hastighedsbegrænsninger","paragraph":"42","content":["På andre veje end motorveje og motortrafikveje må køretøjers hastighed ikke overstige følgende grænser:\n    1) i tættere bebygget område: 50 km i timen,\n    2) uden for tættere bebygget område: 80 km i timen.\n  Stk. 2. På motorveje må hastigheden ikke overstige 130 km i timen.\n  Stk. 3. På motortrafikveje må hastigheden ikke overstige 80 km i timen.\n  Stk. 4. For en vejstrækning kan der fastsættes en højere hastighedsgrænse end den generelle hastighedsgrænse, såfremt omstændighederne, herunder trafikafviklingen, tilsiger det, og afgørende færdselssikkerhedsmæssige hensyn ikke taler derimod. På motortrafikveje og motorveje må hastigheden dog ikke overstige henholdsvis 100 km i timen og 130 km i timen.\n  Stk. 5. For en vejstrækning, hvor det ikke vil være forsvarligt eller ønskeligt at tillade kørsel med hastigheder svarende til den generelle hastighedsgrænse eller en særlig hastighedsbegrænsning fastsat i medfør af § 43, kan der fastsættes en lavere grænse. I tættere bebygget område kan der på tilsvarende måde fastsættes en lavere hastighedsgrænse for et nærmere afgrænset område. Tilsvarende gælder uden for tættere bebygget område, hvor der for et nærmere afgrænset område kan fastsættes en lavere hastighedsgrænse, når området særlig egner sig hertil."],"change_annotations":[],"score":0.95056796},{"accession_number":"B20180020105","title":"Bekendtgørelse om betingelser for Tempo 100-kørsel med campingbil","popular_title":null,"short_title":"BEK nr 201 af 12/03/2018","chapter_name":null,"section_name":"Tempo 100-kørsel","paragraph":"2","content":["Campingbiler, der opfylder betingelserne i denne bekendtgørelse, må køre med op til 100 km i timen på motorvej og op til 80 km i timen på andre veje end motorveje."],"change_annotations":[],"score":0.9481128}]}}}}},"headers":{"RateLimit-Limit":{"description":"The binding window's limit (see Limits in the introduction).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests still available in that window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until that window resets.","schema":{"type":"integer"}}}},"401":{"description":"The key is missing, unknown, expired, or not sent as a Bearer token. Not counted against your limits.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Unauthorized","status":401,"detail":"Credentials are required: send \"Authorization: Bearer <key>\".","code":"unauthorized"}}},"headers":{"WWW-Authenticate":{"description":"Always `Bearer`.","schema":{"type":"string","example":"Bearer"}}}},"422":{"description":"A parameter is malformed or out of range, or the query string carries an unknown parameter or repeats a single-value one. `errors` names each rejected parameter. Counts against your limits.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Unprocessable Entity","status":422,"detail":"Request validation failed.","code":"validation_failed","errors":[{"field":"query","message":"String should have at least 1 character"}]}}},"headers":{"RateLimit-Limit":{"description":"The binding window's limit (see Limits in the introduction).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests still available in that window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until that window resets.","schema":{"type":"integer"}}}},"429":{"description":"A limit is exhausted. `code` names the window:\n\n- `burst`: the per-minute limit; wait for the calendar minute to end.\n- `daily_quota`: the daily limit; it resets at midnight UTC.\n\n`Retry-After` gives the seconds to wait. A rejected request is not counted.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"burst":{"summary":"Burst limit exhausted, headers: Retry-After: 37, RateLimit-Limit: 10, RateLimit-Remaining: 0, RateLimit-Reset: 37","description":"Response headers for this example: `Retry-After: 37`, `RateLimit-Limit: 10`, `RateLimit-Remaining: 0`, `RateLimit-Reset: 37` (37 s to the minute's end). The numbers are illustrative; each response's own RateLimit-* headers state your actual limits.","value":{"type":"about:blank","title":"Too Many Requests","status":429,"detail":"Request rate limit exceeded. Retry after the indicated interval.","code":"burst"}},"daily_quota":{"summary":"Daily quota exhausted, headers: Retry-After: 49324, RateLimit-Limit: 1000, RateLimit-Remaining: 0, RateLimit-Reset: 49324","description":"Response headers for this example: `Retry-After: 49324`, `RateLimit-Limit: 1000`, `RateLimit-Remaining: 0`, `RateLimit-Reset: 49324` (49,324 s to midnight UTC). The numbers are illustrative; each response's own RateLimit-* headers state your actual limits.","value":{"type":"about:blank","title":"Too Many Requests","status":429,"detail":"Daily request quota exhausted. The quota resets at midnight UTC.","code":"daily_quota"}}}}},"headers":{"Retry-After":{"description":"Seconds until the exhausted window's boundary (the minute's end for burst, midnight UTC for daily_quota); equals RateLimit-Reset.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"The exhausted window's limit (a per-minute or per-day number; the RateLimit-* headers together describe one window, the binding one).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Exactly 0 on a rejection.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds to the same boundary as Retry-After.","schema":{"type":"integer"}}}},"500":{"description":"An unexpected server error. Retrying may succeed. Not counted against your limits.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Internal Server Error","status":500,"detail":"Internal server error.","code":"internal_error"}}}},"502":{"description":"The search index, or the service that embeds the query, is unavailable. Retry later. Not counted against your limits.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Bad Gateway","status":502,"detail":"Search backend is unavailable. Try again later.","code":"upstream_failure"}}}}}}},"/documents/metadata/{accession_number}":{"get":{"tags":["Documents"],"summary":"Get document metadata","description":"Get one document's metadata and relations.\n\nThe document is identified by its accession number; names are\nnot identifiers. To find a document's accession number by name,\nuse `/documents/discover`.\n\n`related_documents` lists every relation, uncapped (the largest\ndocuments carry thousands), in a stable order: relation name,\nthen publication date, then accession number.","operationId":"getDocumentMetadata","security":[{"HTTPBearer":[]}],"parameters":[{"name":"accession_number","in":"path","required":true,"schema":{"type":"string","description":"The document's accession number (a letter followed by 11 digits), any casing.","title":"Accession Number"},"description":"The document's accession number (a letter followed by 11 digits), any casing.","examples":{"revisorloven":{"summary":"Revisorloven","value":"A20250020629"}}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentMetadata"}}},"headers":{"RateLimit-Limit":{"description":"The binding window's limit (see Limits in the introduction).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests still available in that window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until that window resets.","schema":{"type":"integer"}}}},"401":{"description":"The key is missing, unknown, expired, or not sent as a Bearer token. Not counted against your limits.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Unauthorized","status":401,"detail":"Credentials are required: send \"Authorization: Bearer <key>\".","code":"unauthorized"}}},"headers":{"WWW-Authenticate":{"description":"Always `Bearer`.","schema":{"type":"string","example":"Bearer"}}}},"422":{"description":"A parameter is malformed or out of range, or the query string carries an unknown parameter or repeats a single-value one. `errors` names each rejected parameter. Counts against your limits.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Unprocessable Entity","status":422,"detail":"Request validation failed.","code":"validation_failed","errors":[{"field":"query","message":"String should have at least 1 character"}]}}},"headers":{"RateLimit-Limit":{"description":"The binding window's limit (see Limits in the introduction).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests still available in that window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until that window resets.","schema":{"type":"integer"}}}},"429":{"description":"A limit is exhausted. `code` names the window:\n\n- `burst`: the per-minute limit; wait for the calendar minute to end.\n- `daily_quota`: the daily limit; it resets at midnight UTC.\n\n`Retry-After` gives the seconds to wait. A rejected request is not counted.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"burst":{"summary":"Burst limit exhausted, headers: Retry-After: 37, RateLimit-Limit: 10, RateLimit-Remaining: 0, RateLimit-Reset: 37","description":"Response headers for this example: `Retry-After: 37`, `RateLimit-Limit: 10`, `RateLimit-Remaining: 0`, `RateLimit-Reset: 37` (37 s to the minute's end). The numbers are illustrative; each response's own RateLimit-* headers state your actual limits.","value":{"type":"about:blank","title":"Too Many Requests","status":429,"detail":"Request rate limit exceeded. Retry after the indicated interval.","code":"burst"}},"daily_quota":{"summary":"Daily quota exhausted, headers: Retry-After: 49324, RateLimit-Limit: 1000, RateLimit-Remaining: 0, RateLimit-Reset: 49324","description":"Response headers for this example: `Retry-After: 49324`, `RateLimit-Limit: 1000`, `RateLimit-Remaining: 0`, `RateLimit-Reset: 49324` (49,324 s to midnight UTC). The numbers are illustrative; each response's own RateLimit-* headers state your actual limits.","value":{"type":"about:blank","title":"Too Many Requests","status":429,"detail":"Daily request quota exhausted. The quota resets at midnight UTC.","code":"daily_quota"}}}}},"headers":{"Retry-After":{"description":"Seconds until the exhausted window's boundary (the minute's end for burst, midnight UTC for daily_quota); equals RateLimit-Reset.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"The exhausted window's limit (a per-minute or per-day number; the RateLimit-* headers together describe one window, the binding one).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Exactly 0 on a rejection.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds to the same boundary as Retry-After.","schema":{"type":"integer"}}}},"500":{"description":"An unexpected server error. Retrying may succeed. Not counted against your limits.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Internal Server Error","status":500,"detail":"Internal server error.","code":"internal_error"}}}},"502":{"description":"The document registry is unavailable. Retry later. Not counted against your limits.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Bad Gateway","status":502,"detail":"Document registry is unavailable. Try again later.","code":"upstream_failure"}}}},"404":{"description":"No document with that accession number. Counts against your limits.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Not Found","status":404,"detail":"No document with that identifier.","code":"not_found"}}},"headers":{"RateLimit-Limit":{"description":"The binding window's limit (see Limits in the introduction).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests still available in that window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until that window resets.","schema":{"type":"integer"}}}}}}},"/documents/discover":{"get":{"tags":["Documents"],"summary":"Discover documents by name and attributes","description":"Find documents by name and attributes.\n\nGive a name guess (a title, citation or nickname, from your own\ncatalog or a user's input) and get back the candidate documents\nwith their accession numbers. Matching is substring matching\nafter normalization, never fuzzy, so the same request always\nreturns the same page for the same registry. When one of a\ncandidate's names equals `title` exactly, its `exact_match` is\ntrue.\n\nAll filters combine. With no filter, the request lists the whole\nregistry. Historical documents are included; to get only the\ncurrent consolidation of a law, add `is_historical=false` and\n`accession_class=A`.\n\nOrdering with `title`: exact matches first, then shorter\nmatching names before longer ones (`lejeloven` ranks\n`Lejeloven` and `Almenlejeloven` ahead of long titles containing\nthe word), then newest first. The ranking after the exact\nmatches may be improved. Without `title`, newest first.\n\nResults are paged with `limit`, `offset` and `total_count`. An\nempty `matches` list is a normal answer, not an error. To\nresolve a list of names, call once per name.","operationId":"discoverDocuments","security":[{"HTTPBearer":[]}],"parameters":[{"name":"title","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":512},{"type":"null"}],"description":"A name or name fragment, matched as a substring of the document's title, official citation or popular title. Both sides are normalized first (trim, collapse whitespace, casefold, NFC). 1 to 512 characters.","title":"Title"},"description":"A name or name fragment, matched as a substring of the document's title, official citation or popular title. Both sides are normalized first (trim, collapse whitespace, casefold, NFC). 1 to 512 characters.","example":"lejeloven"},{"name":"exclude","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"maxItems":26,"description":"Drop documents where any of their names (title, official citation or popular title) contains any of these fragments, matched like `title`. For example, `exclude=lov om ændring` drops amending laws. Repeatable, up to 26 values, each 1 to 512 characters. A missing name never matches, so it never causes an exclusion.","title":"Exclude"},"description":"Drop documents where any of their names (title, official citation or popular title) contains any of these fragments, matched like `title`. For example, `exclude=lov om ændring` drops amending laws. Repeatable, up to 26 values, each 1 to 512 characters. A missing name never matches, so it never causes an exclusion."},{"name":"ministry","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":512},{"type":"null"}],"description":"A ministry name or fragment, matched like `title` against the registry's ministry names, historical and renamed variants included. Documents of every matching ministry are in scope; the names that matched are returned in `matched_ministries`. 1 to 512 characters.","title":"Ministry"},"description":"A ministry name or fragment, matched like `title` against the registry's ministry names, historical and renamed variants included. Documents of every matching ministry are in scope; the names that matched are returned in `matched_ministries`. 1 to 512 characters."},{"name":"is_historical","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"`true`: only historical documents. `false`: only current documents. Omit for both. Historical is a publication status, not a statement about legal effect, so `false` can exclude documents that still apply. Values are `true` and `false`, case-insensitive.","title":"Is Historical"},"description":"`true`: only historical documents. `false`: only current documents. Omit for both. Historical is a publication status, not a statement about legal effect, so `false` can exclude documents that still apply. Values are `true` and `false`, case-insensitive."},{"name":"accession_class","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"maxItems":26,"description":"Restrict the scope to these series classes, the leading letter of the accession number. Repeatable, up to 26 values, any casing. A value that is not a single letter is a 422; a letter with no documents matches nothing.\n\nThe series classes the corpus carries today:\n\n| Class | Documents |\n|---|---|\n| A | Laws (love) |\n| B | Statutory orders (bekendtgørelser) |\n| C | Guidance documents (circulærer, vejledninger) |\n| L | Statutory orders promulgating international agreements |\n| O | Ombudsman case reports, inspections and follow-ups |\n| U | Court decisions |\n| W | Decisions of boards and tribunals (kendelser) |\n| X | Binding tax-law answers (bindende svar) |\n| Y | Statements of opinion (udtalelser) |","title":"Accession Class"},"description":"Restrict the scope to these series classes, the leading letter of the accession number. Repeatable, up to 26 values, any casing. A value that is not a single letter is a 422; a letter with no documents matches nothing.\n\nThe series classes the corpus carries today:\n\n| Class | Documents |\n|---|---|\n| A | Laws (love) |\n| B | Statutory orders (bekendtgørelser) |\n| C | Guidance documents (circulærer, vejledninger) |\n| L | Statutory orders promulgating international agreements |\n| O | Ombudsman case reports, inspections and follow-ups |\n| U | Court decisions |\n| W | Decisions of boards and tribunals (kendelser) |\n| X | Binding tax-law answers (bindende svar) |\n| Y | Statements of opinion (udtalelser) |"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Page size: maximum number of matches, 1 to 500.","default":100,"title":"Limit"},"description":"Page size: maximum number of matches, 1 to 500."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of matches to skip. Page through results with `offset` and `total_count`.","default":0,"title":"Offset"},"description":"Number of matches to skip. Page through results with `offset` and `total_count`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscoverResponse"}}},"headers":{"RateLimit-Limit":{"description":"The binding window's limit (see Limits in the introduction).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests still available in that window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until that window resets.","schema":{"type":"integer"}}}},"401":{"description":"The key is missing, unknown, expired, or not sent as a Bearer token. Not counted against your limits.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Unauthorized","status":401,"detail":"Credentials are required: send \"Authorization: Bearer <key>\".","code":"unauthorized"}}},"headers":{"WWW-Authenticate":{"description":"Always `Bearer`.","schema":{"type":"string","example":"Bearer"}}}},"422":{"description":"A parameter is malformed or out of range, or the query string carries an unknown parameter or repeats a single-value one. `errors` names each rejected parameter. Counts against your limits.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Unprocessable Entity","status":422,"detail":"Request validation failed.","code":"validation_failed","errors":[{"field":"query","message":"String should have at least 1 character"}]}}},"headers":{"RateLimit-Limit":{"description":"The binding window's limit (see Limits in the introduction).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests still available in that window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until that window resets.","schema":{"type":"integer"}}}},"429":{"description":"A limit is exhausted. `code` names the window:\n\n- `burst`: the per-minute limit; wait for the calendar minute to end.\n- `daily_quota`: the daily limit; it resets at midnight UTC.\n\n`Retry-After` gives the seconds to wait. A rejected request is not counted.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"burst":{"summary":"Burst limit exhausted, headers: Retry-After: 37, RateLimit-Limit: 10, RateLimit-Remaining: 0, RateLimit-Reset: 37","description":"Response headers for this example: `Retry-After: 37`, `RateLimit-Limit: 10`, `RateLimit-Remaining: 0`, `RateLimit-Reset: 37` (37 s to the minute's end). The numbers are illustrative; each response's own RateLimit-* headers state your actual limits.","value":{"type":"about:blank","title":"Too Many Requests","status":429,"detail":"Request rate limit exceeded. Retry after the indicated interval.","code":"burst"}},"daily_quota":{"summary":"Daily quota exhausted, headers: Retry-After: 49324, RateLimit-Limit: 1000, RateLimit-Remaining: 0, RateLimit-Reset: 49324","description":"Response headers for this example: `Retry-After: 49324`, `RateLimit-Limit: 1000`, `RateLimit-Remaining: 0`, `RateLimit-Reset: 49324` (49,324 s to midnight UTC). The numbers are illustrative; each response's own RateLimit-* headers state your actual limits.","value":{"type":"about:blank","title":"Too Many Requests","status":429,"detail":"Daily request quota exhausted. The quota resets at midnight UTC.","code":"daily_quota"}}}}},"headers":{"Retry-After":{"description":"Seconds until the exhausted window's boundary (the minute's end for burst, midnight UTC for daily_quota); equals RateLimit-Reset.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"The exhausted window's limit (a per-minute or per-day number; the RateLimit-* headers together describe one window, the binding one).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Exactly 0 on a rejection.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds to the same boundary as Retry-After.","schema":{"type":"integer"}}}},"500":{"description":"An unexpected server error. Retrying may succeed. Not counted against your limits.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Internal Server Error","status":500,"detail":"Internal server error.","code":"internal_error"}}}},"502":{"description":"The document registry is unavailable. Retry later. Not counted against your limits.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Bad Gateway","status":502,"detail":"Document registry is unavailable. Try again later.","code":"upstream_failure"}}}}}}},"/documents/changes/{date}":{"get":{"tags":["Documents"],"summary":"Get daily document changes","description":"Get the documents that changed on one day.\n\nEach record names a document, why it changed (`reason`), and its\nregistry data as it stood when the changes were published. Check\nthe records against the accession numbers you track.\n\nThe changes for a date are published once, during that day's\nrefresh, and are immutable afterwards. Until that refresh has\nrun, the date answers 404. To stay current, keep the last date\nyou processed and fetch each date after it, up to today; a 404\nfor today means the refresh has not run yet, so try again later.\nA 200 with an empty `changes` list means the source reported no\nchanges that day.\n\n`RemovedDocument` records carry only the accession number,\n`reason` and `change_date`: the document has left the registry.\nLook up what was removed in your own records or an earlier day's\nfeed.","operationId":"getDocumentChanges","security":[{"HTTPBearer":[]}],"parameters":[{"name":"date","in":"path","required":true,"schema":{"type":"string","format":"date","description":"The day, as `YYYY-MM-DD`.","title":"Date"},"description":"The day, as `YYYY-MM-DD`.","examples":{"day":{"summary":"A past day","value":"2026-01-24"}}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentChangesFeed"}}},"headers":{"ETag":{"description":"Identifies the date's changes. Conditional requests are not supported: `If-None-Match` never yields a 304.","schema":{"type":"string"}},"Cache-Control":{"description":"`private, max-age=86400`. Shared caches must not store the response; your own client may.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"The binding window's limit (see Limits in the introduction).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests still available in that window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until that window resets.","schema":{"type":"integer"}}}},"401":{"description":"The key is missing, unknown, expired, or not sent as a Bearer token. Not counted against your limits.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Unauthorized","status":401,"detail":"Credentials are required: send \"Authorization: Bearer <key>\".","code":"unauthorized"}}},"headers":{"WWW-Authenticate":{"description":"Always `Bearer`.","schema":{"type":"string","example":"Bearer"}}}},"422":{"description":"A parameter is malformed or out of range, or the query string carries an unknown parameter or repeats a single-value one. `errors` names each rejected parameter. Counts against your limits.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Unprocessable Entity","status":422,"detail":"Request validation failed.","code":"validation_failed","errors":[{"field":"query","message":"String should have at least 1 character"}]}}},"headers":{"RateLimit-Limit":{"description":"The binding window's limit (see Limits in the introduction).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests still available in that window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until that window resets.","schema":{"type":"integer"}}}},"429":{"description":"A limit is exhausted. `code` names the window:\n\n- `burst`: the per-minute limit; wait for the calendar minute to end.\n- `daily_quota`: the daily limit; it resets at midnight UTC.\n\n`Retry-After` gives the seconds to wait. A rejected request is not counted.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"burst":{"summary":"Burst limit exhausted, headers: Retry-After: 37, RateLimit-Limit: 10, RateLimit-Remaining: 0, RateLimit-Reset: 37","description":"Response headers for this example: `Retry-After: 37`, `RateLimit-Limit: 10`, `RateLimit-Remaining: 0`, `RateLimit-Reset: 37` (37 s to the minute's end). The numbers are illustrative; each response's own RateLimit-* headers state your actual limits.","value":{"type":"about:blank","title":"Too Many Requests","status":429,"detail":"Request rate limit exceeded. Retry after the indicated interval.","code":"burst"}},"daily_quota":{"summary":"Daily quota exhausted, headers: Retry-After: 49324, RateLimit-Limit: 1000, RateLimit-Remaining: 0, RateLimit-Reset: 49324","description":"Response headers for this example: `Retry-After: 49324`, `RateLimit-Limit: 1000`, `RateLimit-Remaining: 0`, `RateLimit-Reset: 49324` (49,324 s to midnight UTC). The numbers are illustrative; each response's own RateLimit-* headers state your actual limits.","value":{"type":"about:blank","title":"Too Many Requests","status":429,"detail":"Daily request quota exhausted. The quota resets at midnight UTC.","code":"daily_quota"}}}}},"headers":{"Retry-After":{"description":"Seconds until the exhausted window's boundary (the minute's end for burst, midnight UTC for daily_quota); equals RateLimit-Reset.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"The exhausted window's limit (a per-minute or per-day number; the RateLimit-* headers together describe one window, the binding one).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Exactly 0 on a rejection.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds to the same boundary as Retry-After.","schema":{"type":"integer"}}}},"500":{"description":"An unexpected server error. Retrying may succeed. Not counted against your limits.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Internal Server Error","status":500,"detail":"Internal server error.","code":"internal_error"}}}},"404":{"description":"No file for that date: a day before the feed's coverage began, a missed day, or a day whose refresh has not run yet. Counts against your limits.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Not Found","status":404,"detail":"No changes file for that date.","code":"not_found"}}},"headers":{"RateLimit-Limit":{"description":"The binding window's limit (see Limits in the introduction).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests still available in that window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until that window resets.","schema":{"type":"integer"}}}}}}}},"components":{"schemas":{"Account":{"properties":{"limits":{"$ref":"#/components/schemas/AccountLimits","description":"The account's limits, shared by all its keys."}},"type":"object","required":["limits"],"title":"Account","examples":[{"limits":{"per_day":{"limit":1000,"remaining":812,"reset":49310},"per_minute":{"limit":10,"remaining":9,"reset":50}}}]},"AccountLimits":{"properties":{"per_minute":{"anyOf":[{"$ref":"#/components/schemas/LimitWindow"},{"type":"null"}],"description":"The per-minute window, counted over the calendar minute. `null` when not enforced."},"per_day":{"anyOf":[{"$ref":"#/components/schemas/LimitWindow"},{"type":"null"}],"description":"The daily window, counted over the calendar day (UTC). `null` when not enforced."}},"type":"object","required":["per_minute","per_day"],"title":"AccountLimits"},"ChangeAnnotation":{"properties":{"accession_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accession Number","description":"The amending document's accession number ([A-Z]\\d{11}, e.g. `A20250903516`); `null` on some older annotations."},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"The amending document's formal title, as the annotation carries it; `null` when not populated."},"short_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Title","description":"The amending document's official citation; `null` when not populated."},"publication_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publication Date","description":"ISO 8601 date of the amending document's publication; `null` when not populated."},"text":{"type":"string","title":"Text","description":"The rendered annotation: what the amending document does to the matched piece of the text, in the annotation's own wording. The action space is wide (new content, reordering, removal, repeal of full chapters, paragraphs or parts, entry into force), so entry lengths and granularity vary."}},"type":"object","required":["text"],"title":"ChangeAnnotation","description":"What one amending document (the document that made the change)\ndid to the matched text, as the corpus's annotation records it."},"DiscoverMatch":{"properties":{"accession_number":{"type":"string","title":"Accession Number","description":"The document's accession number ([A-Z]\\d{11}, e.g. `A20250903516`)."},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"The document's formal title."},"short_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Title","description":"The official citation of the current version, e.g. `\"LBK nr 418 af 18/04/2013\"`; `null` when not populated. Together with `accession_number`, the basis on which consumers determine what kind of document they are looking at."},"popular_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Popular Title","description":"The consumer-facing nickname, e.g. `\"Barselsorlovsloven\"`, when populated; `null` otherwise. There is no computed display-title field: coalesce client-side (`popular_title` when non-null, else `title`), so `title` means the same thing everywhere."},"ministry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ministry","description":"The ministry responsible for the document, as the registry stores it; `null` when not populated. Names follow the source's ministry vocabulary, which includes historical and renamed variants (`Skatteministeriet` and `Skatte- og Vækstministeriet` are two eras of the same administration), so values are registry-verbatim, not normalized against a ministry list."},"publication_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publication Date","description":"ISO 8601 date of publication; `null` when not populated."},"signature_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signature Date","description":"ISO 8601 date of signature; `null` when not populated."},"is_historical":{"type":"boolean","title":"Is Historical","description":"Whether the document is marked historical (Retsinformation's `historisk`): a newer document has replaced it, or it has been repealed. This is a publication status, not a statement about legal effect. A historical document may still apply, and a current one may not have taken effect yet."},"historical_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Historical Date","description":"ISO 8601 date on which the document became historical, as the source records it. Set on almost every historical document and almost never on a current one; use `is_historical`, not this date, for the document's status."},"exact_match":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Exact Match","description":"Whether one of the document's names (formal title, official citation or popular title) equals the `title` filter exactly after normalization (trim, collapse whitespace, casefold, NFC). Computed by the server, so no client-side normalization is needed. `null` when the request has no `title` filter."}},"type":"object","required":["accession_number","is_historical"],"title":"DiscoverMatch","description":"One candidate document."},"DiscoverResponse":{"properties":{"total_count":{"type":"integer","title":"Total Count","description":"The number of documents the filters match in total, independent of the page's size or offset."},"offset":{"type":"integer","title":"Offset","description":"The requested page offset, echoed."},"limit":{"type":"integer","title":"Limit","description":"The requested page size, echoed."},"matched_ministries":{"items":{"type":"string"},"type":"array","title":"Matched Ministries","description":"When the request filters by `ministry`: the distinct ministry names the fragment matched (a fragment can match several, including historical or renamed variants), sorted. Empty when the request has no `ministry` filter."},"matches":{"items":{"$ref":"#/components/schemas/DiscoverMatch"},"type":"array","title":"Matches","description":"The page of matched documents, ordered deterministically by exactness (`exact_match` true first), match priority, publication date (descending, nulls last) and accession number. Empty when nothing matches."}},"type":"object","required":["total_count","offset","limit","matched_ministries","matches"],"title":"DiscoverResponse","examples":[{"limit":100,"matched_ministries":["Justitsministeriet"],"matches":[{"accession_number":"A20250129429","exact_match":true,"historical_date":null,"is_historical":false,"ministry":"Justitsministeriet","popular_title":"Straffeloven","publication_date":"2025-11-14","short_title":"LBK nr 1294 af 07/11/2025","signature_date":"2025-11-07","title":"Bekendtgørelse af straffeloven"}],"offset":0,"total_count":1}]},"DocumentChange":{"properties":{"accession_number":{"type":"string","title":"Accession Number","description":"The document's accession number ([A-Z]\\d{11}, e.g. `A20250903516`)."},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"Why the source flags the change, in the source's own vocabulary, shipped verbatim (the values known today: `NewDocument`, `DocumentContentChanged`, `DocumentMetadataChanged`, `DocumentMetadataChangedAndDocumentContentChanged`, `RemovedDocument`). Unknown values may arrive additively if the source adds one."},"change_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Change Date","description":"The source's own change date for this document, ISO 8601; it can be one day before the response's `date`."},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"The document's formal title, from the registry as it stood when the file was written; `null` when not populated. On a `RemovedDocument` record always `null`: the document is already out of the registry."},"short_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Title","description":"The official citation of the current version, e.g. `\"LBK nr 418 af 18/04/2013\"`; `null` when not populated. Together with `accession_number`, the basis on which consumers determine what kind of document they are looking at."},"popular_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Popular Title","description":"The consumer-facing nickname, e.g. `\"Barselsorlovsloven\"`, when populated; `null` otherwise. There is no computed display-title field: coalesce client-side (`popular_title` when non-null, else `title`), so `title` means the same thing everywhere."},"publication_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publication Date","description":"ISO 8601 date of publication; `null` when not populated."},"is_historical":{"type":"boolean","title":"Is Historical","description":"Whether the document was marked historical when the day's changes were published: a newer document has replaced it, or it has been repealed. This is a publication status, not a statement about legal effect. Always `false` on a `RemovedDocument` record, since the document is no longer in the corpus and has no status."},"historical_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Historical Date","description":"ISO 8601 date on which the document became historical, as the source records it. Set on almost every historical document and almost never on a current one; use `is_historical`, not this date, for the document's status."}},"type":"object","required":["accession_number","reason","change_date","is_historical"],"title":"DocumentChange","description":"One document's change, with its registry data as it stood when\nthe changes were published."},"DocumentChangesFeed":{"properties":{"date":{"type":"string","title":"Date","description":"The requested day, echoed."},"count":{"type":"integer","title":"Count","description":"The number of records in `changes` in this response."},"changes":{"items":{"$ref":"#/components/schemas/DocumentChange"},"type":"array","title":"Changes","description":"The source's full change list for the day, unfiltered, in the order the source reported it. Typical days carry tens to a few hundred records; no pagination."}},"type":"object","required":["date","count","changes"],"title":"DocumentChangesFeed","examples":[{"changes":[{"accession_number":"C20251032809","change_date":"2026-03-31","historical_date":null,"is_historical":false,"popular_title":null,"publication_date":null,"reason":"RemovedDocument","short_title":null,"title":null},{"accession_number":"C20221045509","change_date":"2026-04-01","historical_date":"2026-03-31","is_historical":true,"popular_title":null,"publication_date":"2023-02-17","reason":"DocumentMetadataChanged","short_title":"CIR1H nr 10455 af 01/01/2022","title":"Rigsadvokatmeddelelsen, afsnittet: Tilhold, opholdsforbud og bortvisning"},{"accession_number":"C20240983109","change_date":"2026-04-01","historical_date":"2026-03-31","is_historical":true,"popular_title":null,"publication_date":"2024-10-04","reason":"DocumentMetadataChanged","short_title":"CIR1H nr 9831 af 01/07/2023","title":"Rigsadvokatmeddelelsen, afsnittet: Seksualforbrydelser"},{"accession_number":"C20180914560","change_date":"2026-04-01","historical_date":"2026-03-31","is_historical":true,"popular_title":null,"publication_date":"2018-03-17","reason":"DocumentMetadataChanged","short_title":"VEJ nr 9145 af 12/03/2018","title":"Vejledning om erstatning og godtgørelse til indsatte i kriminalforsorgens institutioner og til dømte og prøveløsladte under udførelse af samfundstjeneste for følger af ulykkestilfælde m.v."},{"accession_number":"C20221026809","change_date":"2026-04-01","historical_date":"2026-03-31","is_historical":true,"popular_title":null,"publication_date":"2022-11-26","reason":"DocumentMetadataChanged","short_title":"CIR1H nr 10268 af 25/11/2022","title":"Rigsadvokatmeddelelsen, afsnittet: Kvalitet og legalitet i straffesagsbehandlingen"},{"accession_number":"C20180916309","change_date":"2026-04-01","historical_date":"2026-03-31","is_historical":true,"popular_title":null,"publication_date":"2018-03-21","reason":"DocumentMetadataChanged","short_title":"CIR1H nr 9163 af 01/01/2018","title":"Rigsadvokatmeddelelsen, afsnittet: Taxikørsel"},{"accession_number":"C20241033609","change_date":"2026-04-01","historical_date":"2026-03-31","is_historical":true,"popular_title":null,"publication_date":"2025-08-19","reason":"DocumentMetadataChanged","short_title":"CIR1H nr 10336 af 01/07/2024","title":"Rigsadvokatmeddelelsen, afsnittet: Sanktionspåstande i våbensager"},{"accession_number":"C20251033509","change_date":"2026-04-01","historical_date":null,"is_historical":false,"popular_title":null,"publication_date":"2026-04-01","reason":"NewDocument","short_title":"CIR1H nr 10335 af 18/12/2025","title":"Rigsadvokatmeddelelsen, afsnittet: Taxikørsel"},{"accession_number":"C20251033309","change_date":"2026-04-01","historical_date":null,"is_historical":false,"popular_title":null,"publication_date":"2026-04-01","reason":"NewDocument","short_title":"CIR1H nr 10333 af 16/12/2025","title":"Rigsadvokatmeddelelsen, afsnittet: Grundlovsforhør og varetægtsfængsling"},{"accession_number":"C20251033009","change_date":"2026-04-01","historical_date":null,"is_historical":false,"popular_title":null,"publication_date":"2026-04-01","reason":"NewDocument","short_title":"CIR1H nr 10330 af 01/12/2025","title":"Rigsadvokatmeddelelsen, afsnittet: Formueforbrydelser - de almindelige berigelsesforbrydelser"},{"accession_number":"C20251032909","change_date":"2026-04-01","historical_date":null,"is_historical":false,"popular_title":null,"publication_date":"2026-04-01","reason":"NewDocument","short_title":"CIR1H nr 10329 af 01/12/2025","title":"Rigsadvokatmeddelelsen, afsnittet: Tilhold, opholdsforbud og bortvisning"},{"accession_number":"C20251033109","change_date":"2026-04-01","historical_date":null,"is_historical":false,"popular_title":null,"publication_date":"2026-04-01","reason":"NewDocument","short_title":"CIR1H nr 10331 af 01/12/2025","title":"Rigsadvokatmeddelelsen, afsnittet: Seksualforbrydelser"},{"accession_number":"C20251033409","change_date":"2026-04-01","historical_date":null,"is_historical":false,"popular_title":null,"publication_date":"2026-04-01","reason":"NewDocument","short_title":"CIR1H nr 10334 af 19/12/2025","title":"Rigsadvokatmeddelelsen, afsnittet: Kvalitet og legalitet i straffesagsbehandlingen"},{"accession_number":"C20251033209","change_date":"2026-04-01","historical_date":null,"is_historical":false,"popular_title":null,"publication_date":"2026-04-01","reason":"NewDocument","short_title":"CIR1H nr 10332 af 05/12/2025","title":"Rigsadvokatmeddelelsen, afsnittet: Vejledning af forurettede mv."},{"accession_number":"C20260935909","change_date":"2026-04-01","historical_date":null,"is_historical":false,"popular_title":null,"publication_date":"2026-04-01","reason":"NewDocument","short_title":"CIR1H nr 9359 af 26/03/2026","title":"Rigsadvokatmeddelelsen, afsnittet: Psykisk afvigende kriminelle"},{"accession_number":"C20260936009","change_date":"2026-04-01","historical_date":null,"is_historical":false,"popular_title":null,"publication_date":"2026-04-01","reason":"NewDocument","short_title":"CIR1H nr 9360 af 01/01/2026","title":"Rigsadvokatmeddelelsen, afsnittet: Føreforbud for visse udlændinge"},{"accession_number":"C20260936109","change_date":"2026-04-01","historical_date":null,"is_historical":false,"popular_title":null,"publication_date":"2026-04-01","reason":"NewDocument","short_title":"CIR1H nr 9361 af 01/01/2026","title":"Rigsadvokatmeddelelsen, afsnittet: Sanktionspåstande i våbensager"},{"accession_number":"B20250133205","change_date":"2026-04-01","historical_date":null,"is_historical":false,"popular_title":null,"publication_date":"2025-11-22","reason":"DocumentMetadataChanged","short_title":"BEK nr 1332 af 20/11/2025","title":"Bekendtgørelse om normalhandelsværdier for heste og kreaturer mv."},{"accession_number":"C20250940609","change_date":"2026-04-01","historical_date":"2026-03-31","is_historical":true,"popular_title":null,"publication_date":"2025-05-14","reason":"DocumentMetadataChanged","short_title":"CIR1H nr 9406 af 29/04/2025","title":"Rigsadvokatmeddelelsen, afsnittet: Færdsel - Generelle retningslinjer for sanktionspåstande i færdselssager"},{"accession_number":"C20250941109","change_date":"2026-04-01","historical_date":"2026-03-31","is_historical":true,"popular_title":null,"publication_date":"2025-05-14","reason":"DocumentMetadataChanged","short_title":"CIR1H nr 9411 af 22/04/2025","title":"Rigsadvokatmeddelelsen, afsnittet: Vejledning af forurettede mv."},{"accession_number":"C20250905309","change_date":"2026-04-01","historical_date":"2026-03-31","is_historical":true,"popular_title":null,"publication_date":"2025-02-04","reason":"DocumentMetadataChanged","short_title":"CIR1H nr 9053 af 01/02/2025","title":"Rigsadvokatmeddelelsen, afsnittet: Formueforbrydelser - de almindelige berigelsesforbrydelser"},{"accession_number":"B20250157105","change_date":"2026-04-01","historical_date":null,"is_historical":false,"popular_title":null,"publication_date":"2025-12-10","reason":"DocumentMetadataChanged","short_title":"BEK nr 1571 af 04/12/2025","title":"Bekendtgørelse om regulering af fiskeriet"},{"accession_number":"C20251007509","change_date":"2026-04-01","historical_date":"2026-03-31","is_historical":true,"popular_title":null,"publication_date":"2025-11-11","reason":"DocumentMetadataChanged","short_title":"CIR1H nr 10075 af 01/04/2025","title":"Rigsadvokatmeddelelsen, afsnittet: Psykisk afvigende kriminelle"},{"accession_number":"B20260020005","change_date":"2026-04-01","historical_date":null,"is_historical":false,"popular_title":null,"publication_date":"2026-01-30","reason":"DocumentMetadataChanged","short_title":"BEK nr 200 af 29/01/2026","title":"Bekendtgørelse om erstatning og godtgørelse til indsatte i institutioner under Danmarks Fængsler og til dømte og prøveløsladte under udførelse af samfundstjeneste for følger af ulykkestilfælde m.v."},{"accession_number":"B20260036905","change_date":"2026-04-01","historical_date":null,"is_historical":false,"popular_title":null,"publication_date":"2026-03-07","reason":"DocumentMetadataChanged","short_title":"BEK nr 369 af 07/03/2026","title":"Bekendtgørelse om fund af højpatogen aviær influenza ved Otterup i Nordfyns Kommune"},{"accession_number":"B20260041105","change_date":"2026-04-01","historical_date":null,"is_historical":false,"popular_title":null,"publication_date":"2026-04-01","reason":"NewDocument","short_title":"BEK nr 411 af 31/03/2026","title":"Bekendtgørelse om ændring af bekendtgørelse om fund af højpatogen aviær influenza ved Otterup i Nordfyns Kommune"},{"accession_number":"B20260935605","change_date":"2026-04-01","historical_date":null,"is_historical":false,"popular_title":null,"publication_date":"2026-04-01","reason":"NewDocument","short_title":"BEK nr 9356 af 27/03/2026","title":"Straksregulering nr. 16 - 2026 Om vilkår gældende for tobisfiskeri i Nordsøen, Skagerrak og Kattegat fra den 1. april 2026"},{"accession_number":"B20260041005","change_date":"2026-04-01","historical_date":null,"is_historical":false,"popular_title":null,"publication_date":"2026-04-01","reason":"NewDocument","short_title":"BEK nr 410 af 26/03/2026","title":"Bekendtgørelse om ændring af bekendtgørelse om normalhandelsværdier for heste og kreaturer mv."},{"accession_number":"C20260935709","change_date":"2026-04-01","historical_date":null,"is_historical":false,"popular_title":null,"publication_date":"2026-04-01","reason":"NewDocument","short_title":"CIR1H nr 9357 af 01/01/2026","title":"Rigsadvokatmeddelelsen, afsnittet: Færdsel - Generelle retningslinjer for sanktionspåstande i færdselssager"},{"accession_number":"C20260935860","change_date":"2026-04-01","historical_date":null,"is_historical":false,"popular_title":null,"publication_date":"2026-04-01","reason":"NewDocument","short_title":"VEJ nr 9358 af 31/03/2026","title":"Vejledning om erstatning og godtgørelse til indsatte i institutioner under Danmarks Fængsler og til dømte og prøveløsladte under udførelse af samfundstjeneste for følger af ulykkestilfælde m.v."}],"count":30,"date":"2026-04-01"}]},"DocumentMetadata":{"properties":{"accession_number":{"type":"string","title":"Accession Number","description":"The document's accession number ([A-Z]\\d{11}, e.g. `A20250903516`). Any casing is accepted on lookup; the canonical form is uppercase."},"title":{"type":"string","title":"Title","description":"The document's formal title."},"popular_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Popular Title","description":"The consumer-facing nickname, e.g. `\"Barselsorlovsloven\"`, when populated; `null` otherwise. There is no computed display-title field: coalesce client-side (`popular_title` when non-null, else `title`), so `title` means the same thing everywhere."},"short_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Title","description":"The official citation of the current version, e.g. `\"LBK nr 418 af 18/04/2013\"`; `null` when not populated. Together with `accession_number`, the basis on which consumers determine what kind of document they are looking at."},"ministry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ministry","description":"The ministry responsible for the document, as the registry stores it; `null` when not populated. Names follow the source's ministry vocabulary, which includes historical and renamed variants (`Skatteministeriet` and `Skatte- og Vækstministeriet` are two eras of the same administration), so values are registry-verbatim, not normalized against a ministry list."},"publication_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publication Date","description":"ISO 8601 date of publication; `null` when not populated."},"signature_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signature Date","description":"ISO 8601 date of signature; `null` when not populated."},"historical_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Historical Date","description":"ISO 8601 date on which the document became historical, as the source records it. Set on almost every historical document and almost never on a current one; use `is_historical`, not this date, for the document's status."},"is_historical":{"type":"boolean","title":"Is Historical","description":"Whether the document is marked historical (Retsinformation's `historisk`): a newer document has replaced it, or it has been repealed. This is a publication status, not a statement about legal effect. A historical document may still apply, and a current one may not have taken effect yet."},"related_documents":{"items":{"$ref":"#/components/schemas/RelatedDocument"},"type":"array","title":"Related Documents","description":"The document's relations, all of them (uncapped), ordered deterministically by relation name, then publication date, then accession number, so the order is stable between requests. Not paginated; the largest documents carry thousands of entries."}},"type":"object","required":["accession_number","title","is_historical","related_documents"],"title":"DocumentMetadata","examples":[{"accession_number":"A20250020629","historical_date":null,"is_historical":false,"ministry":"Erhvervsministeriet","popular_title":"Revisorloven","publication_date":"2025-02-27","related_documents":[{"accession_number":"A20240048030","publication_date":"2024-05-23","relation":"changed_by","short_title":"LOV nr 480 af 22/05/2024 § 2","title":"Lov om ændring af årsregnskabsloven, revisorloven og forskellige andre love (Gennemførelse af EU-direktiv om virksomheders bæredygtighedsrapportering og EU-direktiv om forhøjelse af størrelsesgrænser i regnskabsdirektivet m.v.)"},{"accession_number":"A20260072930","publication_date":"2026-09-02","relation":"changed_by","short_title":"LOV nr 729 af 01/09/2026 § 3","title":"Lov om ændring af lov om erhvervsdrivende fonde, årsregnskabsloven og forskellige andre love (Ophævelse af visse krav m.v. for erhvervsdrivende fonde, nægtelse af godkendelse som ejendomsmægler som følge af strafbare forhold, nedlæggelse af Revisorrådet og offentliggørelse af oplysninger om konkurskarantæner i CVR)"},{"accession_number":"A20220121929","publication_date":"2022-09-01","relation":"consolidates","short_title":"LBK nr 1219 af 31/08/2022 ","title":"Bekendtgørelse af lov om godkendte revisorer og revisionsvirksomheder (revisorloven)"},{"accession_number":"A20230071830","publication_date":"2023-06-14","relation":"consolidates","short_title":"LOV nr 718 af 13/06/2023 ","title":"Lov om forsikringsvirksomhed i tværgående pensionskasser, livsforsikringsselskaber og skadesforsikringsselskaber m.v. (lov om forsikringsvirksomhed)"},{"accession_number":"A20240048030","publication_date":"2024-05-23","relation":"consolidates","short_title":"LOV nr 480 af 22/05/2024 ","title":"Lov om ændring af årsregnskabsloven, revisorloven og forskellige andre love (Gennemførelse af EU-direktiv om virksomheders bæredygtighedsrapportering og EU-direktiv om forhøjelse af størrelsesgrænser i regnskabsdirektivet m.v.)"},{"accession_number":"A20250005230","publication_date":"2025-01-29","relation":"consolidates","short_title":"LOV nr 52 af 28/01/2025 ","title":"Lov om uafhængige erklæringsudbydere vedrørende bæredygtighedsrapportering"},{"accession_number":"B20090006505","publication_date":"2009-02-03","relation":"subject_of","short_title":"BEK nr 65 af 21/01/2009","title":"Bekendtgørelse om ophævelse af bekendtgørelse om revisoreksamen og kvalifikationseksamen for henholdsvis statsautoriserede og registrerede revisorer"},{"accession_number":"B20100018605","publication_date":"2010-02-26","relation":"subject_of","short_title":"BEK nr 186 af 24/02/2010","title":"Bekendtgørelse om delvis ikrafttræden af lov om ændring af årsregnskabsloven, lov om finansiel virksomhed og forskellige andre love"},{"accession_number":"B20150153605","publication_date":"2015-12-15","relation":"subject_of","short_title":"BEK nr 1536 af 09/12/2015","title":"Bekendtgørelse om godkendte revisorers garantistillelse og ansvarsforsikring"},{"accession_number":"B20160096205","publication_date":"2016-06-30","relation":"subject_of","short_title":"BEK nr 962 af 28/06/2016","title":"Bekendtgørelse om revisionsvirksomhed"},{"accession_number":"B20160096605","publication_date":"2016-06-30","relation":"subject_of","short_title":"BEK nr 966 af 28/06/2016","title":"Bekendtgørelse om revisorers udøvelse af tjenesteydelser i et andet land end etableringslandet"},{"accession_number":"B20190031105","publication_date":"2019-03-29","relation":"subject_of","short_title":"BEK nr 311 af 27/03/2019","title":"Bekendtgørelse om kommunal og regional revision"},{"accession_number":"B20240051205","publication_date":"2024-05-28","relation":"subject_of","short_title":"BEK nr 512 af 24/05/2024","title":"Bekendtgørelse om godkendte revisionsvirksomheders interne organisation"},{"accession_number":"B20240051805","publication_date":"2024-05-29","relation":"subject_of","short_title":"BEK nr 518 af 24/05/2024","title":"Bekendtgørelse om godkendte revisorers erklæringer"},{"accession_number":"B20240051905","publication_date":"2024-05-29","relation":"subject_of","short_title":"BEK nr 519 af 24/05/2024","title":"Bekendtgørelse om godkendte revisorers og revisionsvirksomheders tilrettelæggelse af arbejdet"},{"accession_number":"B20240052005","publication_date":"2024-05-29","relation":"subject_of","short_title":"BEK nr 520 af 24/05/2024","title":"Bekendtgørelse om godkendte revisorers og revisionsvirksomheders uafhængighed"},{"accession_number":"B20240052305","publication_date":"2024-05-29","relation":"subject_of","short_title":"BEK nr 523 af 24/05/2024","title":"Bekendtgørelse om register over godkendte revisorer og revisionsvirksomheder"},{"accession_number":"B20250126405","publication_date":"2025-11-04","relation":"subject_of","short_title":"BEK nr 1264 af 27/10/2025","title":"Bekendtgørelse om Revisornævnet"},{"accession_number":"B20250126605","publication_date":"2025-11-04","relation":"subject_of","short_title":"BEK nr 1266 af 27/10/2025","title":"Bekendtgørelse om Revisornævnets behandling af sager om midlertidig frakendelse af en revisors og verifikators godkendelse"},{"accession_number":"B20250131305","publication_date":"2025-11-20","relation":"subject_of","short_title":"BEK nr 1313 af 15/11/2025","title":"Bekendtgørelse om finansiering af driften af kvalitetskontrol, undersøgelser, Revisornævnet samt hvidvasktilsyn med revisorer og revisionsvirksomheder"},{"accession_number":"B20250146405","publication_date":"2025-12-04","relation":"subject_of","short_title":"BEK nr 1464 af 27/11/2025","title":"Bekendtgørelse om kvalitetskontrol af revisionsvirksomheder"},{"accession_number":"B20260044905","publication_date":"2026-05-08","relation":"subject_of","short_title":"BEK nr 449 af 30/04/2026","title":"Bekendtgørelse om registrering af revisorer og revisionsvirksomheder, der ikke har hjemsted her i landet, i et andet EU-land eller i et EØS-land"},{"accession_number":"B20260075205","publication_date":"2026-09-08","relation":"subject_of","short_title":"BEK nr 752 af 02/09/2026","title":"Bekendtgørelse om obligatorisk efteruddannelse af godkendte revisorer"},{"accession_number":"B20260075305","publication_date":"2026-09-08","relation":"subject_of","short_title":"BEK nr 753 af 02/09/2026","title":"Bekendtgørelse om prøver vedrørende udførelse af erklæringsopgaver om bæredygtighedsrapportering"},{"accession_number":"B20260075505","publication_date":"2026-09-08","relation":"subject_of","short_title":"BEK nr 755 af 02/09/2026","title":"Bekendtgørelse om eksamener m.v. for godkendte revisorer"},{"accession_number":"B20260075605","publication_date":"2026-09-08","relation":"subject_of","short_title":"BEK nr 756 af 02/09/2026","title":"Bekendtgørelse om Eksamensudvalget"}],"short_title":"LBK nr 206 af 20/02/2025","signature_date":"2025-02-20","title":"Bekendtgørelse af lov om godkendte revisorer og revisionsvirksomheder (revisorloven)"}]},"LimitWindow":{"properties":{"limit":{"type":"integer","title":"Limit","description":"The window's request limit."},"remaining":{"type":"integer","title":"Remaining","description":"Requests left in the window after this one."},"reset":{"type":"integer","title":"Reset","description":"Seconds until the window resets."}},"type":"object","required":["limit","remaining","reset"],"title":"LimitWindow"},"RelatedDocument":{"properties":{"relation":{"type":"string","enum":["changed_by","changes","concerns","consolidated_by","consolidates","enacted_by","subject_of"],"title":"Relation","description":"The relation between the document you looked up and the related one; the name is relative to the LOOKED-UP document. Closed vocabulary (all values listed in the schema):\n\n- `changed_by` / `changes`: the related document changed this one / this one changed the related document.\n- `consolidated_by` / `consolidates`: the related document consolidated this one (the related one is the newer consolidation) / this document consolidates the related one (the related one is the older document).\n- `concerns` / `subject_of`: this document concerns the related one / this document is subject of the related one.\n- `enacted_by`: the related document enacted this one."},"accession_number":{"type":"string","title":"Accession Number","description":"The related document's accession number."},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"The related document's formal title; `null` when the relation record carries none."},"short_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Title","description":"The related document's official citation; `null` when the relation record carries none."},"publication_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publication Date","description":"ISO 8601 date of the related document's publication; `null` when not populated."}},"type":"object","required":["relation","accession_number"],"title":"RelatedDocument"},"SearchHit":{"properties":{"accession_number":{"type":"string","title":"Accession Number","description":"The document's accession number ([A-Z]\\d{11}, e.g. `A20250903516`)."},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"The document's formal title. `null` when the registry has no record of the document or is unavailable."},"popular_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Popular Title","description":"The consumer-facing nickname, e.g. `\"Barselsorlovsloven\"`, when populated; `null` otherwise. There is no computed display-title field: coalesce client-side (`popular_title` when non-null, else `title`), so `title` means the same thing everywhere."},"short_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Title","description":"The official citation of the current version, e.g. `\"LBK nr 418 af 18/04/2013\"`; `null` when not populated. Together with `accession_number`, the basis on which consumers determine what kind of document they are looking at."},"chapter_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Name","description":"The heading of the chapter the passage sits in (`\"Bilag\"` for an appendix); `null` when the document has no chapters, and always `null` when the passage is a whole document or a resumé."},"section_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Section Name","description":"The heading directly above the passage; `null` when there is none, and always `null` when the passage is a whole document or a resumé."},"paragraph":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paragraph","description":"The passage's designation: a paragraph's number without the § sign (`\"2\"` for § 2), or an appendix's title; `null` otherwise, and always `null` when the passage is a whole document or a resumé."},"content":{"items":{"type":"string"},"type":"array","title":"Content","description":"The passage's full text (never an excerpt), as text pieces in document order. Usually one paragraph or section; for a document without such structure, its whole text or its resumé."},"change_annotations":{"items":{"$ref":"#/components/schemas/ChangeAnnotation"},"type":"array","title":"Change Annotations","description":"What later amending documents did to the matched text: one entry per recorded change, in corpus order. `[]` (never `null`) when there are none."},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score","description":"The relevance score the hits are ordered by, highest first. Its scale depends on the search mode, and it is not comparable across queries."}},"type":"object","required":["accession_number","content"],"title":"SearchHit"},"SearchResponse":{"properties":{"query":{"type":"string","title":"Query","description":"The query as received and used."},"count":{"type":"integer","title":"Count","description":"The number of hits in this response, at most `limit`."},"hits":{"items":{"$ref":"#/components/schemas/SearchHit"},"type":"array","title":"Hits","description":"The matched passages, best first by relevance score."}},"type":"object","required":["query","count","hits"],"title":"SearchResponse","examples":[{"count":3,"hits":[{"accession_number":"B20220000305","change_annotations":[],"chapter_name":null,"content":["På motortrafikveje og på motorveje kan en lavere hastighedsgrænse end den generelle i særlige tilfælde fastsættes ned til 30 km i timen. Dette kan ske ved motorvejens eller motortrafikvejens tilslutning til det almindelige vejnet, eller hvis særlige trafiksikkerhedsmæssige hensyn taler herfor.\n  Stk. 2. På motortrafikveje og motorveje gennem tættere bymæssig bebyggelse og andre støjfølsomme områder kan en lavere hastighedsgrænse end den generelle i særlige tilfælde fastsættes ned til 60 km i timen alene af hensyn til at nedbringe støjniveauet."],"paragraph":"9","popular_title":"Hastighedsbekendtgørelsen","score":11.829118,"section_name":"Lavere hastighedsgrænse","short_title":"BEK nr 3 af 03/01/2022","title":"Bekendtgørelse om lokale hastighedsgrænser"},{"accession_number":"A20260011829","change_annotations":[],"chapter_name":"Kapitel 5","content":["På andre veje end motorveje og motortrafikveje må køretøjers hastighed ikke overstige følgende grænser:\n    1) i tættere bebygget område: 50 km i timen,\n    2) uden for tættere bebygget område: 80 km i timen.\n  Stk. 2. På motorveje må hastigheden ikke overstige 130 km i timen.\n  Stk. 3. På motortrafikveje må hastigheden ikke overstige 80 km i timen.\n  Stk. 4. For en vejstrækning kan der fastsættes en højere hastighedsgrænse end den generelle hastighedsgrænse, såfremt omstændighederne, herunder trafikafviklingen, tilsiger det, og afgørende færdselssikkerhedsmæssige hensyn ikke taler derimod. På motortrafikveje og motorveje må hastigheden dog ikke overstige henholdsvis 100 km i timen og 130 km i timen.\n  Stk. 5. For en vejstrækning, hvor det ikke vil være forsvarligt eller ønskeligt at tillade kørsel med hastigheder svarende til den generelle hastighedsgrænse eller en særlig hastighedsbegrænsning fastsat i medfør af § 43, kan der fastsættes en lavere grænse. I tættere bebygget område kan der på tilsvarende måde fastsættes en lavere hastighedsgrænse for et nærmere afgrænset område. Tilsvarende gælder uden for tættere bebygget område, hvor der for et nærmere afgrænset område kan fastsættes en lavere hastighedsgrænse, når området særlig egner sig hertil."],"paragraph":"42","popular_title":"Færdselsloven","score":11.278454,"section_name":"Generelle hastighedsbegrænsninger","short_title":"LBK nr 118 af 12/01/2026","title":"Bekendtgørelse af færdselsloven"},{"accession_number":"B20220000305","change_annotations":[],"chapter_name":null,"content":["På motorveje kan der ikke fastsættes en højere hastighedsgrænse end den generelle."],"paragraph":"5","popular_title":"Hastighedsbekendtgørelsen","score":11.27007,"section_name":"Højere hastighedsgrænse","short_title":"BEK nr 3 af 03/01/2022","title":"Bekendtgørelse om lokale hastighedsgrænser"}],"query":"hastighedsgrænse motorvej"}]},"Problem":{"title":"Problem","type":"object","required":["type","title","status","detail","code"],"properties":{"type":{"type":"string","description":"Always `about:blank`: the status and `code` carry the meaning."},"title":{"type":"string","description":"The HTTP status phrase."},"status":{"type":"integer","description":"The HTTP status code, repeated."},"detail":{"type":"string","description":"A human-readable explanation. Not stable: never parse it."},"code":{"type":"string","description":"The machine-readable error class to branch on. Values: `unauthorized`, `validation_failed`, `not_found`, `method_not_allowed`, `burst`, `daily_quota`, `internal_error`, `upstream_failure`. New values may be added; treat an unknown value by its HTTP status."},"errors":{"type":"array","description":"On a 422 only: one entry per rejected parameter.","items":{"type":"object","required":["field","message"],"properties":{"field":{"type":"string","description":"The query or path parameter's name."},"message":{"type":"string","description":"Why the value was rejected."}}}}}}},"securitySchemes":{"HTTPBearer":{"type":"http","description":"Your API key, sent as `Authorization: Bearer <key>`.","scheme":"bearer"}}},"tags":[{"name":"Account","description":"Your account is what your keys belong to. Its per-minute and daily limits are shared by all your keys. Plans and pricing are described on https://lovapi.dk.\n\nEvery request with a valid key counts, including those that return 404 or 422. Requests rejected for a missing or invalid key (401), requests over the limit (429) and server errors (5xx) do not count, so retrying after a server error costs nothing.\n\nEvery response that counts tells you where you stand:\n\n- `RateLimit-Limit`: your limit.\n- `RateLimit-Remaining`: requests left.\n- `RateLimit-Reset`: seconds until the limit resets, at the end of the minute or at midnight UTC.\n\nThe headers describe whichever limit you are closer to reaching. A 429 also carries `Retry-After`, the number of seconds to wait before retrying. To see both limits at once, call `GET /account`."},{"name":"Search","description":"Search the text of current documents, those not marked historical. Each hit is one passage, such as a paragraph or a section, returned in full. Lexical search matches keywords. Semantic search matches meaning, so you can search with a plain-language question."},{"name":"Documents","description":"Find and describe documents, historical and amending documents included. These endpoints return no document text. Discover finds documents by name, metadata describes one document and its relations, and the daily change feed lists the documents that changed on a given day."}],"servers":[{"url":"/v1"}]}