CVR-data til AI-agenter og LLM'er

Sprogmodeller kender ikke det aktuelle CVR-register. Giv dem i stedet to værktøjer: ét til at søge på navn og ét til at slå op på CVR-nummer. Fordi CVR-API ikke kræver nøgle, er der ingen hemmeligheder at holde styr på i din agent.

Tool-definitioner

Definitionerne bruger JSON Schema, som de fleste modeller og agent-frameworks forstår. Nogle kalder feltet parameters i stedet for input_schema. Indholdet er det samme.

json
[
  {
    "name": "cvr_lookup",
    "description": "Look up a Danish company by its 8-digit CVR number. Returns name, address, industry, status, owners and management.",
    "input_schema": {
      "type": "object",
      "properties": {
        "cvr": {"type": "string", "description": "8-digit CVR number, e.g. 24256790"}
      },
      "required": ["cvr"]
    }
  },
  {
    "name": "cvr_search",
    "description": "Find Danish companies by name. Tolerates typos. Returns name, cvr_number and industry for each hit.",
    "input_schema": {
      "type": "object",
      "properties": {
        "name": {"type": "string", "description": "Company name or part of it"}
      },
      "required": ["name"]
    }
  }
]

Handler i Python

Når modellen kalder et værktøj, kører du funktionen og sender resultatet tilbage som tekst. P-enhederne fjernes, fordi store virksomheder kan have hundredvis, og de fylder meget i modellens kontekst.

python
import json
import urllib.error
import urllib.parse
import urllib.request

BASE = "https://apicvr.dk/api/v1"

def _get(url):
    try:
        with urllib.request.urlopen(url, timeout=15) as res:
            return json.load(res)
    except urllib.error.HTTPError as err:
        return {"error": err.code}

def run_tool(name, args):
    if name == "cvr_lookup":
        company = _get(f"{BASE}/{args['cvr']}")
        company.pop("p_units", None)  # keep the context small
        return json.dumps(company, ensure_ascii=False)
    if name == "cvr_search":
        hits = _get(f"{BASE}/search/fuzzy/" + urllib.parse.quote(args["name"]) + "?limit=5")
        return json.dumps(hits, ensure_ascii=False)
    return json.dumps({"error": "unknown tool"})

Systemprompt

text
Du har adgang til CVR-API (https://apicvr.dk), et gratis JSON API til
det danske CVR-register uden API-nøgle. Brug cvr_search til at finde
CVR-nummeret ud fra et navn, og cvr_lookup til at hente detaljer.
Hvis feltet "protected" er true, må virksomheden ikke kontaktes med
markedsføring.

llms.txt

Bruger du en agent, der selv læser dokumentation, så peg den på https://apicvr.dk/llms.txt. Filen beskriver alle endpoints kort i Markdown. llms-full.txt indeholder også alle svarfelter og fejlkoder.

Gode råd

Ofte stillede spørgsmål

Virker det med alle sprogmodeller?

Ja, med alle modeller og frameworks, der understøtter tool calling eller function calling. Selve API'et er bare HTTP og JSON.

Skal agenten have en API-nøgle?

Nej. CVR-API kræver ingen nøgle, så der er intet at gemme eller rotere.

Kan agenten få regnskabstal?

Nej, regnskaber er ikke en del af CVR-API. Agenten får stamdata, ejere, direktion og P-enheder.