Gå til hovedindhold
FirmaAPIFirmaAPI

Regnskaber

Regnskabsdata API til danske virksomheder

Hent offentliggjorte årsregnskaber som struktureret JSON: omsætning, resultat, egenkapital og nøgletal. Du slipper for at åbne årsrapporter og skrive tal af i hånden.

Hvad er regnskabsdata via API?

Danske virksomheder indberetter deres årsrapporter til Erhvervsstyrelsen, og mange af dem som XBRL-filer. FirmaAPI læser de indberettede regnskaber, trækker de vigtigste poster ud og leverer dem som felter med faste navne. Det giver dig tal, du kan lægge i en database, sammenligne på tværs af år og bruge i dine egne modeller.

Regnskaberne hentes med parameteren include=finance på det almindelige CVR-opslag. Du skal derfor ikke lære et nyt endpoint, og du kan kombinere regnskaber med fx historik i samme kald.

Det første kald

curl "https://firmaapi.dk/api/v1/company/24256790?include=finance" \
  -H "Authorization: Bearer cvr_live_din_api_nøgle"

Svaret indeholder en liste financials med ét objekt pr. regnskabsperiode. Eksemplet nedenfor er opdigtet for at vise strukturen og viser ikke en rigtig virksomhed.

Svar (illustrativt eksempel)

{
  "cvr": "12345678",
  "name": "Eksempel Drift ApS",
  "has_financials": true,
  "financials_pending": false,
  "financials": [
    {
      "year": 2024,
      "period_start": "2024-01-01",
      "period_end": "2024-12-31",
      "report_type": "annual",
      "revenue": 42000000,
      "gross_profit": 18500000,
      "net_profit": 3100000,
      "equity": 9800000,
      "total_assets": 21500000,
      "currency": "DKK",
      "report_url": "https://...",
      "ratios": { "profit_margin": 0.0738, "solvency_ratio": 0.4558 }
    }
  ]
}

Beløb er hele tal i regnskabets valuta, som står i feltet currency. Perioden står i period_start og period_end, så du ikke behøver gætte på brudte regnskabsår.

Felter og nøgletal

Regnskabstal varierer mellem virksomheder. En lille virksomhed i regnskabsklasse B udelader fx ofte omsætning, så regn med, at felter kan være null. Nøgletal er decimaler, så 0,2866 betyder 28,66 procent.

GruppeEksempler på felterFra plan
Resultat og balancerevenue, gross_profit, net_profit, equity, total_assets, total_liabilitiesStandard
Link til årsrapportreport_urlStandard
Nøgletalprofit_margin, gross_margin, solvency_ratio, return_on_equity, current_ratioStandard
Udvidede posteremployee_expenses, average_employees, goodwill, inventories, provisionsStandard
Årsændringerrevenue_yoy, profit_yoy, equity_yoyProfessionel
Pengestrømmecash_from_operations, cash_from_investing, free_cash_flowProfessionel
Revisionaudit_opinion, going_concern_flagProfessionel
Nøgletal og årsændringer beregnes af FirmaAPI ud fra de indberettede tal. De er ikke udtryk for en vurdering af virksomheden. Er en underliggende post ikke indberettet, er nøgletallet null.

Eksempel: hent og brug regnskaber i Python

Eksemplet henter regnskaberne, sorterer kvartalsrapporter fra og viser omsætning, resultat og soliditetsgrad for hvert år. Det viser også, hvordan du håndterer en plan, der ikke giver adgang til regnskaber.

import os
import requests

API_KEY = os.environ["FIRMAAPI_KEY"]

def hent_regnskaber(cvr: str) -> list[dict]:
    res = requests.get(
        f"https://firmaapi.dk/api/v1/company/{cvr}",
        params={"include": "finance"},
        headers={"Authorization": f"Bearer {API_KEY}"},
        timeout=10,
    )
    if res.status_code == 403:
        fejl = res.json()["error"]
        raise PermissionError(
            f"Kræver plan: {fejl.get('required_plan')} (din plan: {fejl.get('current_plan')})"
        )
    res.raise_for_status()
    data = res.json()
    if data.get("financials_pending"):
        return []  # tallene hentes - prøv igen om lidt
    return [r for r in data.get("financials", []) if r.get("report_type") == "annual"]

for r in hent_regnskaber("24256790"):
    soliditet = (r.get("ratios") or {}).get("solvency_ratio")
    print(r["year"], r.get("revenue"), r.get("net_profit"), soliditet)

Samme kald i andre sprog finder du i guiderne til Node.js, PHP og C#.

Find virksomheder ud fra regnskabstal

Du behøver ikke hente regnskaber for hver virksomhed for at finde dem, der opfylder et krav. Den avancerede søgning har et indeks over omsætning og kapital fra seneste regnskab. Filtrene findes på alle planer. Eksemplet finder de 25 største aktive IT-selskaber i Aarhus efter omsætning:

curl "https://firmaapi.dk/api/v1/search/advanced?industry=62&city=Aarhus&status=Aktiv&has_financials=true&sort=revenue:desc&limit=25" \
  -H "Authorization: Bearer cvr_live_din_api_nøgle"

Brug revenue_min og revenue_max til at afgrænse et interval. Virksomheder uden kendt omsætning sorteres sidst, så de ikke fylder i toppen.

Når regnskaber ikke er med

Der er tre almindelige årsager, og alle kan genkendes i svaret:

  • Planen mangler adgang. Gratis og Basis får 403 PLAN_UPGRADE_REQUIRED med required_plan: "standard".
  • Regnskabet hentes. financials_pending er true. Prøv igen om lidt.
  • Virksomheden har intet offentligt regnskab. has_financials er false, og listen er tom.

Hver plan har sin egen kvote. Standard giver 150.000 opslag om måneden til 299 kr, og Professionel giver 500.000 opslag til 469 kr. Se priser for en fuld sammenligning. Du kan også få besked, når et nyt regnskab udkommer, med webhooken company.financials.published. Den beskrives på siden om CVR webhooks.

Ofte stillede spørgsmål

Hvilke regnskabstal kan jeg hente via API'et?

Du kan hente omsætning, bruttoresultat, resultat før og efter skat, egenkapital, aktiver, forpligtelser og en række udvidede poster. På Standard følger også nøgletal som soliditetsgrad og overskudsgrad. Professionel tilføjer pengestrømme, årsændringer og oplysninger fra revisionspåtegningen, når de findes i regnskabet.

Hvor mange år bagud kan jeg hente?

Standard giver det seneste årsregnskab. Professionel giver op til 5 års regnskaber. Enterprise kan aftales med flere år. Gratis og Basis har ikke adgang til regnskabsdata.

Hvorfor har en virksomhed ingen regnskabstal?

Ikke alle virksomheder aflægger et offentligt regnskab, og nogle har ikke indberettet endnu. Feltet has_financials fortæller, om der er et kendt regnskabssignal. Er financials_pending sat til true, hentes tallene første gang, og du kan prøve igen lidt senere.

Kan jeg få selve årsrapporten som PDF?

Fra Standard indeholder hvert regnskab feltet report_url, som peger på den indberettede årsrapport hos Erhvervsstyrelsen. Feltet er null, hvis linket ikke er tilgængeligt.

Kan jeg søge efter virksomheder ud fra omsætning?

Ja. Den avancerede søgning har filtrene revenue_min, revenue_max, capital_min og capital_max samt has_financials og sortering på revenue. Filtrene måles på seneste regnskabsår i søgeindekset.

Hent dit første regnskab

Regnskabsdata kræver mindst Standard-planen. Du kan bygge resten af integrationen på den gratis plan og opgradere, når du er klar.