---
title: "/screen"
method: POST
path: "/v1/screen"
tags: ["Screening"]
---

# /screen

`POST /v1/screen`

## Request

- Base URL: `https://api.companydata.dk` (the document declares no server; this is the origin it was published from)
- URL: `https://api.companydata.dk/v1/screen`
- Auth: HTTP bearer

Screen the company register on structured criteria: industry, geography,
company type, size and financial key figures from the latest annual
report. All given filters are combined with AND; results are paginated
with an opaque cursor.

Example: companies in Region Midtjylland with an equity ratio below 15%
and at least 5 employees:

```json
{
  "filters": {
    "region_codes": ["1082"],
    "employees": {"min": 5},
    "financials": {"equity_ratio": {"max": 0.15}}
  },
  "sort": {"field": "equity_ratio", "direction": "asc"},
  "limit": 50
}
```

**Data notes:**

- Financial criteria use the company's most recent annual report. Most
  small companies (reporting class B) do not publish revenue, only gross
  profit; filtering on `revenue` therefore excludes them. Each result
  includes `financials.reporting_class` and `financials.period_end` so
  you can judge coverage and freshness.
- **Metric coverage** (active companies with the metric, August 2026 —
  about 41% of the ~860,000 active companies file annual reports at all;
  the rest are mainly sole proprietorships with no filing duty):

  | Metric | Active companies |
  |---|---|
  | `profit_loss`, `equity`, `total_assets` | ~353,000 (41%) |
  | `equity_ratio` | ~348,000 (40%) |
  | `gross_profit` | ~338,000 (39%) |
  | `current_ratio` | ~329,000 (38%) |
  | `return_on_equity` | ~299,000 (35%) |
  | `operating_profit` | ~278,000 (32%) |
  | `employees` | ~257,000 (30%) |
  | `revenue` | ~24,000 (2.7%) |

  For "small companies" screens, `gross_profit` and `employees` reach
  the broad register; `revenue` reaches only the minority obliged to
  disclose it (reporting classes C/D).
- Amounts are DKK. Ratios are fractions: `equity_ratio` 0.15 means a
  soliditetsgrad of 15%. Figures are as filed; occasional filing errors
  can produce extreme ratio values.
- A company only matches a financial filter if its latest report contains
  that metric. Sorting by a metric likewise only returns companies where
  the metric is present.
- Growth metrics (`revenue_growth`, `gross_profit_growth`,
  `equity_growth`) are year-over-year fractions computed from the
  report's own comparative figures: -0.2 means a 20% decline. Absent
  when the base year is missing or zero.
- `cds_score` (0-100) and `cds_ratings` filter on the CDS (CompanyData
  Score). Only companies with a computed score match these filters.
- Each result carries `location` (`lat`/`lng`, WGS84) for the registered
  address, so a result set can be plotted or trimmed by area without a
  second lookup. It is absent when the address could not be geocoded or
  is withheld.

Use `POST /v1/screen/count` with the same filters to size a segment
before pulling pages.

## Request body

- ScreenRequest: Request body for POST /v1/screen.
  - `filters` ScreenFilters, required: Screening criteria. All given filters are combined with AND. At least one filter beyond `statuses` must be set.
    - `industry_codes` string[]: DB07 industry codes, 2-6 digits. Codes shorter than 6 digits match as prefixes: `47` matches every retail code. Matches primary or secondary industry.
    - `company_types` string[]: Company type codes, e.g. A/S, ApS, ENK
    - `statuses` string[]: Company statuses to include. Defaults to active companies only. Valid values: active, dissolved, under_bankruptcy, liquidation.
    - `founded` DateRange: Inclusive date range. At least one bound must be set.
      - `from` string, date, nullable: Inclusive start date
      - `to` string, date, nullable: Inclusive end date
    - `municipality_codes` string[]: Municipality codes
    - `postal_codes` string[]: Postal codes
    - `region_codes` string[]: Region codes (resolved to the region's municipalities)
    - `geo` GeoRadius: Circular geographic area (same bounds as /v1/companies geo search).
      - `lat` number, required: Latitude of center
      - `lng` number, required: Longitude of center
      - `radius` integer, required: Radius in meters (50-50000)
    - `employees` NumericRange: Inclusive min/max range. At least one bound must be set.
      - `min` number, nullable: Inclusive lower bound
      - `max` number, nullable: Inclusive upper bound
    - `financials` object: Key figure ranges, e.g. `{"equity_ratio": {"min": 0.15}}`. Valid keys: revenue, gross_profit, operating_profit, profit_loss, equity, total_assets, equity_ratio, current_ratio, return_on_equity, profit_margin, revenue_growth, gross_profit_growth, equity_growth. Amounts in DKK; ratios and growth rates as fractions. Note that most small companies (reporting class B) do not publish revenue, only gross profit. A company only matches a metric filter if its latest annual report contains that metric.
    - `reporting_classes` string[]: Reporting classes (regnskabsklasse) to include: A, B, C, D
    - `financial_period_end_after` string, date, nullable: Only match companies whose latest annual report period ends on or after this date (freshness guard)
    - `late_filings` NumericRange: Inclusive min/max range. At least one bound must be set.
      - `min` number, nullable: Inclusive lower bound
      - `max` number, nullable: Inclusive upper bound
    - `auditor_changes` NumericRange: Inclusive min/max range. At least one bound must be set.
      - `min` number, nullable: Inclusive lower bound
      - `max` number, nullable: Inclusive upper bound
    - `has_overdue_filing` boolean, nullable: Active companies whose next expected annual report has passed its statutory deadline without being published
    - `has_going_concern` boolean, nullable: The latest report carries a going concern emphasis from the auditor
    - `has_qualified_opinion` boolean, nullable: The latest auditor opinion is not unqualified
    - `cds_score` NumericRange: Inclusive min/max range. At least one bound must be set.
      - `min` number, nullable: Inclusive lower bound
      - `max` number, nullable: Inclusive upper bound
    - `cds_ratings` string[]: CDS rating buckets to include: excellent, good, moderate, high_risk, critical
    - `has_phone` boolean, nullable: Company has a phone number
    - `has_email` boolean, nullable: Company has an email address
    - `has_website` boolean, nullable: Company has a website
    - `has_properties` boolean, nullable: Company owns properties
    - `property_area` NumericRange: Inclusive min/max range. At least one bound must be set.
      - `min` number, nullable: Inclusive lower bound
      - `max` number, nullable: Inclusive upper bound
    - `property_zones` string[]: Planzone of owned properties: byzone, landzone and/or sommerhusomraade. Matches companies owning at least one property in any selected zone.
    - `has_flood_risk_properties` boolean, nullable: Company owns at least one property with elevated flood risk (in a cloudburst depression or flooded at a storm surge of 3 m or less, per Klimadatastyrelsen's DHM models)
    - `has_poor_energy_label` boolean, nullable: Company owns at least one property whose current energy label is D, E, F or G (per Energistyrelsen's EMOData register)
    - `auditor_cvrs` string[]: Companies whose current registered auditor is one of these audit firms (CVR numbers)
    - `contact_role_categories` string[]: Companies with an enriched contact person in any of these role categories (management, sales, marketing, it, hr, finance, operations, procurement, customer_service). Sourced from the company's own website.
    - `has_livestock` boolean, nullable: Company has at least one active livestock herd in CHR. Companies with a CHR marketing protection are excluded.
    - `livestock_species_codes` integer[]: CHR species (dyreart) codes, e.g. 12=Kvæg, 15=Svin, 13=Får. Matches companies with at least one active herd of any selected species. Implies the CHR marketing protection exclusion.
    - `exclude_advertising_protected` boolean, nullable: Exclude companies with CVR advertising protection (reklamebeskyttelse). Required when results are used for direct marketing.
  - `sort` ScreenSort: Result ordering. Sorting on a field implicitly restricts results to companies where that field is present (e.g. sorting by revenue only returns companies with a known revenue).
    - `field` string, required: Sort field: any financial metric name, or employees, founded_date, period_end
    - `direction` string: asc or desc
  - `cursor` string, nullable: Opaque pagination cursor from a previous response's meta.next_cursor. Filters and sort must be unchanged between pages.
  - `limit` integer: Results per page (1-100)

## Response `200`

Successful Response

- ScreenResponse
  - `data` ScreenItem[], required
    - `cvr` string, required
    - `name` string, required
    - `status` string, required
    - `company_type` string, nullable
    - `industry` ScreenItemIndustry
      - `code` string, nullable: Primary DB07 industry code
      - `text` string, nullable: Primary industry description
    - `address` ScreenItemAddress
      - `municipality_code` string, nullable
      - `municipality_name` string, nullable
      - `postal_code` string, nullable
      - `postal_district` string, nullable
    - `location` ScreenItemLocation: WGS84 coordinates of the company's registered address.
      - `lat` number, required: Latitude (WGS84)
      - `lng` number, required: Longitude (WGS84)
    - `founded_date` string, date, nullable: Company founding date
    - `employees` integer, nullable: Best known headcount (CVR or annual report)
    - `financials` ScreenItemFinancials: Key figures from the company's most recent annual report. Only published figures are present; most reporting class B companies publish gross profit but not revenue.
      - `period_end` string, date, nullable: Annual report period end
      - `reporting_class` string, nullable: Regnskabsklasse (A/B/C/D)
      - `currency` string, nullable: Currency for amounts
      - `is_consolidated` boolean, nullable: Whether the report is consolidated (koncernregnskab)
      - `revenue` number, nullable
      - `gross_profit` number, nullable
      - `operating_profit` number, nullable
      - `profit_loss` number, nullable
      - `equity` number, nullable
      - `total_assets` number, nullable
      - `equity_ratio` number, nullable: Soliditetsgrad as a fraction
      - `current_ratio` number, nullable
      - `return_on_equity` number, nullable
      - `profit_margin` number, nullable
      - `revenue_growth` number, nullable: YoY growth as a fraction
      - `gross_profit_growth` number, nullable: YoY growth as a fraction
      - `equity_growth` number, nullable: YoY growth as a fraction
    - `cds` ScreenItemCDS
      - `score` integer, nullable: CDS score, 0-100
      - `rating` string, nullable: excellent, good, moderate, high_risk or critical
  - `meta` ScreenMeta, required
    - `limit` integer, required
    - `has_more` boolean, required: Whether another page exists
    - `next_cursor` string, nullable: Cursor for the next page (absent on the last page)
    - `preview` boolean: True for the free preview on companydata.dk (the first rows only, no pagination). Always false for API keys.
    - `preview_withheld` string, nullable: Why a preview returned no rows: `pro_filters` (the filters use Pro-only criteria) or `daily_limit` (the day's previews are used).

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/companydata/apis/companydata-dk-api.md) · [All operations](https://skmtc.dev/companydata/apis/companydata-dk-api/llms.txt) · [OpenAPI document](https://skmtc.dev/companydata/apis/companydata-dk-api/revisions/1cc6c361ae64?raw)
