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.
| Gruppe | Eksempler på felter | Fra plan |
|---|---|---|
| Resultat og balance | revenue, gross_profit, net_profit, equity, total_assets, total_liabilities | Standard |
| Link til årsrapport | report_url | Standard |
| Nøgletal | profit_margin, gross_margin, solvency_ratio, return_on_equity, current_ratio | Standard |
| Udvidede poster | employee_expenses, average_employees, goodwill, inventories, provisions | Standard |
| Årsændringer | revenue_yoy, profit_yoy, equity_yoy | Professionel |
| Pengestrømme | cash_from_operations, cash_from_investing, free_cash_flow | Professionel |
| Revision | audit_opinion, going_concern_flag | Professionel |
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_REQUIREDmedrequired_plan: "standard". - Regnskabet hentes.
financials_pendingertrue. Prøv igen om lidt. - Virksomheden har intet offentligt regnskab.
has_financialserfalse, 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.