Sponsored bySlim Tools

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:

KindURIExample
Normnorm:{quelle}:{kuerzel}:{norm_id}norm:bund:BGB:242
Statutegesetz:{quelle}:{kuerzel}gesetz:bund:BGB
Decisiondec:{quelle}:{source_id|celex}dec:eu:62019CJ0311
Conceptconcept:{scheme}:{slug}concept:eu:data-protection
Norm versionnormversion:{id}normversion:1234

quellebund (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

ValueAdds
contentFull text + html + metadata (default).
unitsAddressable 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.
versionsA norm's earlier wordings as normversion: URIs (where tracked).
childrenOn 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.
relationsCitation graph: what cites it / what it cites, instances, concepts.
authorityPageRank-style authority score within the graph.
allEverything 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:

ToolWhat it does
resolve_citationCitation string → verifiable object + pinpoint unit. The preferred entry point.
verify_citationsBatch hallucination check (≤200) — run over every drafted answer.
search_legalSemantic + full-text search → ranked canonical URIs.
get_legal_objectOne URI → object with provenance, units, versions, relations.
get_legal_objectsBatch resolve (≤100 URIs).
legal_uri_grammarURI 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.