CVR-opslag i Python

Med CVR-API kan du hente virksomhedsdata i Python med et enkelt HTTP-kald. Du behøver ingen API-nøgle eller SDK. Standardbiblioteket er nok.

Slå en virksomhed op på CVR-nummer

Kald /api/v1/{cvr} og læs JSON-svaret. Eksemplet bruger kun urllib fra standardbiblioteket.

python
import json
import urllib.request

def get_company(cvr):
    url = f"https://apicvr.dk/api/v1/{cvr}"
    with urllib.request.urlopen(url, timeout=15) as res:
        return json.load(res)

company = get_company(24256790)
print(company["name"], company["zipcode"], company["city"])
print(company["industrydesc"], "-", company["companydesc"])

Søg på virksomhedsnavn

Fuzzy-søgningen finder virksomheder, selv om navnet er stavet lidt forkert. Hvert hit har name, cvr_number, industrycode og industrytext.

python
import json
import urllib.parse
import urllib.request

def search(name):
    url = f"https://apicvr.dk/api/v1/search/fuzzy/" + urllib.parse.quote(name)
    with urllib.request.urlopen(url, timeout=15) as res:
        return json.load(res)

for hit in search("novo nordisk")[:5]:
    print(hit["cvr_number"], hit["name"], "-", hit["industrytext"])

Håndter fejl

API'et bruger almindelige HTTP-statuskoder, så du kan reagere på dem direkte:

StatusBetydning
200Virksomheden blev fundet. Svaret er JSON.
404Der findes ingen virksomhed med det CVR-nummer. Body: {"detail": {"error": "NOT_FOUND"}}
422CVR-nummeret er ikke et tal.
502CVR-registret svarede ikke. Prøv igen om lidt.
python
import json
import urllib.error
import urllib.request

def get_company(cvr):
    try:
        with urllib.request.urlopen(f"https://apicvr.dk/api/v1/{cvr}", timeout=15) as res:
            return json.load(res)
    except urllib.error.HTTPError as err:
        if err.code == 404:
            return None  # no company with that CVR number
        raise  # 422 = not a number, 502 = the CVR register did not answer

print(get_company(99999999))  # None

Ejere, direktion og reklamebeskyttelse

Det fulde opslag indeholder legale ejere med ejerandel i intervaller og den nuværende direktion.

python
company = get_company(24256790)

for owner in company["ejere"]:
    print(owner["name"], owner["ownership_range"])

for person in company["direktion"]:
    print(person["role"], person["name"])

if company["protected"]:
    print("Reklamebeskyttet - må ikke bruges til direkte markedsføring")
Tjek altid protected, før du bruger data til markedsføring. Er feltet true, har virksomheden frabedt sig reklamehenvendelser.

Foretrækker du requests?

python
import requests

res = requests.get("https://apicvr.dk/api/v1/24256790", timeout=15)
res.raise_for_status()
print(res.json()["name"])

Ofte stillede spørgsmål

Skal jeg bruge en API-nøgle i Python?

Nej. CVR-API kræver hverken nøgle eller konto. Et almindeligt GET-kald er nok.

Hvilken Python-version kræves?

Eksemplerne virker med Python 3.6 og nyere, fordi de kun bruger standardbiblioteket og f-strings.

Kan jeg slå mange virksomheder op på én gang?

Lav ét kald pr. CVR-nummer, og hold tempoet nede. Har du brug for vedvarende høj trafik, så skriv til [email protected].