kvasir.legal
Ground your legal AI on verifiable German, Austrian, Swiss & EU law — resolve, search and verify citations with provenance and pinpoint deeplinks. 440k+ statutes, interactive apps in Claude & ChatGPT.
Documentation
Grounding API
Verifiable German & EU law
for your AI.
One canonical object per legal entity — norms, statutes, court decisions — withprovenance, addressable sub-units, ready-made citations and the citation graph. Model-agnostic: call it over REST, or plug it into any agent as anMCP tool. You bring the reasoning; we bring the ground truth.
Base URL https://kvasir.legal · questions? [email protected] · new to grounding? Why legal AI needs a grounding layer →
Getting access. The API is in invite-only beta. Already have a kvasir account? Create a key in your dashboard →
Request access
Connect in 60 seconds
One endpoint — https://kvasir.legal/mcp — plugs kvasir into the AI you already work with. Your assistant then searches, resolves and verifies citations against the live corpus instead of answering from memory.
ChatGPT. Settings → Connectors → Advanced → Developer mode → add MCP server https://kvasir.legal/mcp with header X-API-Key → enable it in your chat's tools.
Claude — no key needed. Settings → Connectors → Add custom connector → paste https://kvasir.legal/mcp → sign in with your kvasir account → done. All six tools appear in every chat.
Microsoft 365 Copilot. Available firm-wide via Copilot Studio: your IT admin adds https://kvasir.legal/mcp once as a custom MCP action (API key asX-API-Key) — every lawyer in the tenant can then use it in Copilot chats.
Perplexity. On plans with connector support: Settings → Connectors → add an MCP connector with URL https://kvasir.legal/mcp and yourX-API-Key.
Le Chat (Mistral). Settings → Connectors → add MCP connector → URL https://kvasir.legal/mcp + X-API-Key.
Developer tools & agents. Claude Desktop (claude_desktop_config.json via mcp-remote), GitHub Copilot in VS Code (.vscode/mcp.json, OAuth automatic), Cursor and any MCP-capable agent: streamable-HTTP, URL https://kvasir.legal/mcp, header X-API-Key: kvk_… — or plain REST (interactive reference).
Authentication
Try it without a key: resolve, search andobject work keyless in sandbox mode — 20 requests per day, no signup. Just call them:
curl "https://kvasir.legal/api/v1/resolve?cite=§ 242 Abs. 1 BGB"
For real use, send an API key as a header (either form works):
X-API-Key: kvk_your_key
Authorization: Bearer kvk_your_key
Unauthenticated requests get 401. The machine-readable contract is public at/api/v1/schema (no key needed).
Connecting from Claude or another MCP client? Just addhttps://kvasir.legal/mcp as a connector — you'll be walked through anOAuth sign-in with your kvasir account instead of pasting a key. Keys and OAuth work side by side; both count against the same tier.
Quickstart
No key, no signup — this works right now (sandbox, 20/day):
With a key, fetch the full object:
curl -H "X-API-Key: kvk_…" \
"https://kvasir.legal/api/v1/object/norm:bund:BGB:242?include=all"
{
"uri": "norm:bund:BGB:242",
"canonical_uri": "norm:bund:BGB:242",
"kind": "norm",
"exists": true,
"identity": { "title": "§ 242 BGB", "subtitle": "Bundesrecht", "href": "/bgb/242" },
"provenance": { "quelle": "bund", "source": "gesetze-im-internet.de", "derived": false, "version": "" },
"content": { "label": "§ 242", "plain_text": "Der Schuldner ist verpflichtet …", "html": "…" },
"units": [
{ "path": "a1", "unit": "abs", "label": "1",
"text": "…", "citation": "§ 242 Abs. 1 BGB", "deeplink": "/bgb/242#a1" }
],
"relations": { "in": [ … cited-by … ], "out": [ … cites … ] }
}
Object URIs
Every legal object is addressed by a stable URI:
| Kind | URI | Example |
|---|---|---|
| Norm | norm:{quelle}:{kuerzel}:{norm_id} | norm:bund:BGB:242 |
| Statute | gesetz:{quelle}:{kuerzel} | gesetz:bund:BGB |
| Decision | dec:{quelle}:{source_id|celex} | dec:eu:62019CJ0311 |
| Concept | concept:{scheme}:{slug} | concept:eu:data-protection |
| Norm version | normversion:{id} | normversion:1234 |
quelle ∈ bund (federal), by (Bavaria), eu. Norm URIs are tolerant: norm:bund:BGB:242 resolves the same object as the raw slug; the response's canonical_uri gives the clean form.
Endpoints
Prefer clicking around? Try the interactive API reference. Building with an LLM? Point it at /llms.txt.
GET/api/v1/resolve?cite=§ 242 Abs. 1 BGB
Citation in, object out. Parses free-text citations (Art. 6 Abs. 1 lit. f DSGVO,C-311/18) — no URI grammar needed. Returns the pinpoint sub-unit and did-you-mean suggestions when something doesn't resolve.
POST/api/v1/verify — { "citations": [ … ≤200 ] } or { "text": "…" }
The hallucination check. Verify every citation in a drafted answer in one call: per-citation verified/unresolved status, canonical URI, source and pinpoint unit.
GET/api/v1/object/<uri>?include=…
One object. include is comma-separated; see below.
POST/api/v1/objects — { "uris": [ … ≤100 ], "include": "content" }
Batch-resolve many URIs in one call — e.g. to ground every citation in a draft at once.
GET/api/v1/search?q=…&kinds=norm,decision&quellen=bund,by,eu&limit=20&offset=0
Free-text search → ranked hits [{uri, kind, title, snippet, score}]. Filter by type (kinds: statutes vs case law) and jurisdiction (quellen) so every result slot counts. Paginates via offset.
GET/api/v1/schema — the contract, machine-readable (public).
GET/api/v1/openapi.json — full OpenAPI 3.1 spec (public). Import into Postman or generate a client SDK.
The include parameter
| Value | Adds |
|---|---|
| content | Full text + html + metadata (default). |
| units | Addressable sub-units with exact text, citation & deeplink — norm = paragraph/number/letter (a1.ba), decision = Randnummer (r17). Fidelity-validated: only sub-units whose text verifies against the full text are returned; units_confidence reports the pass rate. |
| versions | A norm's earlier wordings as normversion: URIs (where tracked). |
| children | On a statute (gesetz:): the full table of contents — every norm as [{uri, label, section_path}] in order. Ask "which sections does the BDSG have?" in one call. |
| relations | Citation graph: what cites it / what it cites, instances, concepts. |
| authority | PageRank-style authority score within the graph. |
| all | Everything above. |
Use it as an MCP tool
Any MCP client calls the layer natively — endpoint https://kvasir.legal/mcp (OAuth or X-API-Key). Six tools:
| Tool | What it does |
|---|---|
| resolve_citation | Citation string → verifiable object + pinpoint unit. The preferred entry point. |
| verify_citations | Batch hallucination check (≤200) — run over every drafted answer. |
| search_legal | Semantic + full-text search → ranked canonical URIs. |
| get_legal_object | One URI → object with provenance, units, versions, relations. |
| get_legal_objects | Batch resolve (≤100 URIs). |
| legal_uri_grammar | URI scheme reference for constructing URIs. |
Rate limits & errors
Errors are JSON: { "error": "…" }.401 = missing/invalid key · 429 = rate limit or monthly quota exceeded ·exists:false means the URI matched nothing (not a server error). Per-key limits are set when your key is issued.