kvasir.legal

Ancrez votre IA juridique sur le droit allemand, autrichien, suisse et européen vérifiable — résolvez, recherchez et vérifiez les citations avec provenance et liens profonds précis. Plus de 440 000 lois, applications interactives dans Claude et ChatGPT.

Documentation

Grounding API

Verifiable law

for your AI.

German, Austrian, Swiss and EU law as one canonical object per legal entity — norms, statutes, court decisions — with provenance, sub-units addressable down to the sentence, 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 down to the individual sentence and half-sentence (a1.ba, a2.s1, a2.n3.h2), 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.