---
title: "Estimate Report"
method: POST
path: "/v1/report-requests/estimate"
tags: ["internal"]
---

# Estimate Report

`POST /v1/report-requests/estimate`

## 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/report-requests/estimate`
- Auth: HTTP bearer

Estimate the number of companies matching the given filters.

Accepts either the legacy flat ReportFilters shape or the new-style
`{"screen": {...}, "list_ids": [], "connection_ids": []}` shape that
exposes every /v1/screen filter.

When `include_preview=true`, the response also includes a sample of
matching companies (capped at 50). The HTML UI never sets this — it's
used by the MCP `preview_lead_list` tool to give agents a concrete
view before the user commits to a full Pro-tier export.

Below Pro (companydata.dk only): a logged-out visitor gets the count, a
Basic account the count and, with include_preview, the first 5 companies,
both within the daily allowances in services/preview_limits.py.

## Query parameters

- `include_preview` boolean
- `preview_limit` integer

## Request body

- union
  - LeadListFilters: New-style lead-list filters: the shared screening model plus the lead-list-only user scopes layered on top. The `screen` key is required (but nullable) and extra keys are forbidden — that is what lets request bodies and stored documents be told apart from the legacy flat ReportFilters shape with certainty.
    - `screen` LeadListScreenCriteria, required: ScreenFilters without the standalone at-least-one guard: inside a lead list, employee_intervals / list_ids / connection_ids can provide the anchor instead (e.g. the UI's default exclude_advertising_protected plus an employee interval). LeadListFilters.screen_or_scope enforces the combined rule.
      - `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.
    - `list_ids` string[]: Company list IDs — restrict to companies in these lists
    - `connection_ids` string[]: Accounting connection IDs — restrict to companies matched in these integrations
    - `employee_intervals` string[]: CVR employee-count intervals (e.g. '2-4', '10-19', 'ANTAL_1000_999999'). Multiple selections OR together, so disjoint brackets stay expressible — unlike the single numeric `screen.employees` range. Unknown interval keys are ignored, matching the legacy shape's behaviour.
  - ReportFilters: Filters for lead list generation (legacy flat shape).
    - `industry_codes` string[]: DB07 industry codes to filter by (max 10)
    - `municipality_codes` string[]: Municipality codes to filter by
    - `company_types` string[]: Company type codes (e.g. A/S, ApS, IVS)
    - `employee_intervals` string[]: Employee count intervals (e.g. '1-4', '10-19', '1000+')
    - `financial_metric` string, nullable: Which financial metric to filter on: 'gross_profit' or 'revenue'
    - `financial_min` integer, nullable: Minimum value for the selected financial metric (DKK)
    - `financial_max` integer, nullable: Maximum value for the selected financial metric (DKK)
    - `has_phone` boolean, nullable: Filter for companies with a phone number
    - `has_email` boolean, nullable: Filter for companies with an email address
    - `has_website` boolean, nullable: Filter for companies with a website
    - `has_properties` boolean, nullable: Filter for companies that own properties
    - `has_flood_risk_properties` boolean, nullable: Filter for companies owning 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)
    - `contact_role_categories` string[]: Filter for 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 via contact enrichment.
    - `has_poor_energy_label` boolean, nullable: Filter for companies owning at least one property whose current energy label is D, E, F or G (renovation prospects, per Energistyrelsen's EMOData register)
    - `property_area_min` integer, nullable: Minimum total building area (m²) across the company's owned properties
    - `property_area_max` integer, nullable: Maximum total building area (m²) across the company's owned properties
    - `property_zones` string[]: Zone status (planzone) of owned properties: byzone, landzone and/or sommerhusomraade. Matches companies owning at least one property in any selected zone (per Plandata.dk's zonekort).
    - `has_livestock` boolean, nullable: Filter for companies with at least one active livestock herd registered in CHR (Det Centrale Husdyrbrugsregister). Companies with a CHR marketing protection (reklamebeskyttelse) are always excluded from livestock-filtered results.
    - `livestock_species_codes` integer[]: CHR species (dyreart) codes to filter by, 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 the list is used for direct marketing: CVR-loven prohibits marketing contact to protected companies based on registry data.
    - `list_ids` string[]: Company list IDs — restrict to companies in these lists
    - `connection_ids` string[]: Accounting connection IDs — restrict to companies matched in these integrations

## Response `200`

Successful Response

- ReportEstimateResponse: Response model for a lead list estimate.
  - `estimated_count` integer, required: Estimated number of companies matching filters
  - `preview` object[], nullable: Sample of matching companies. Only populated when include_preview=true is requested (the MCP preview_lead_list tool, and the free preview on companydata.dk, which shows a Basic account the first 5).
  - `preview_withheld` string, nullable: Why a requested preview is empty below Pro: `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)
