---
title: "/companies"
method: GET
path: "/v1/companies"
tags: ["Companies"]
---

# /companies

`GET /v1/companies`

## 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/companies`
- Auth: HTTP bearer

Search companies with filters.

By default only active companies are returned. When `lat` and `lng` are provided,
results are sorted by distance from the center point and include `distance_meters`.

The `industry` and `type` filters accept multiple comma-separated values and
match any of them.

**Pagination without `lat`/`lng`:** `pagination.total_is_exact` indicates whether `total` is
an exact count. When false, `total` is a lower bound (counts are capped at
1,000 or may be incomplete after a query timeout), and `pages` is derived
from that lower bound.

Filter-only browsing (for example, `industry=561110` without a name query)
still returns data beyond row 1,000: `page=11&limit=100` is supported even
when `pages` is 10. Do not treat `pages` as an end marker when
`total_is_exact` is false. An incomplete empty response is not proof that
no companies match; retry or narrow the filters if a query times out.

Name searches rank at most 1,000 candidates. Refine `q` or add filters
when their count is incomplete; deeper pages cannot extend this ranked
window. Query time budgets and rate limits apply to all pages.

**Examples:**
- Text search: `/v1/companies?q=Copenhagen`
- Location search: `/v1/companies?lat=55.6761&lng=12.5683&radius=2000`
- Combined: `/v1/companies?q=cafe&lat=55.6761&lng=12.5683&radius=1000&type=APS`
- Multiple industries near a point: `/v1/companies?industry=561110,563000,551110&lat=55.6761&lng=12.5683&radius=2000`

## Query parameters

- `q` string, nullable: Search query
- `status` string, nullable: Filter by status (active, dissolved)
- `include_inactive` boolean: Include inactive/dissolved companies
- `type` string, nullable: Filter by company type (APS, AS, etc.). Accepts multiple comma-separated values.
- `industry` string, nullable: Filter by industry code. Accepts multiple comma-separated codes, e.g. `561110,563000` (matches any of them).
- `municipality` string, nullable: Filter by municipality code. Accepts multiple comma-separated codes, e.g. `101,147` (matches any of them).
- `postal_code` string, nullable: Filter by postal code (4 digits)
- `lat` number, nullable: Latitude for location-based search
- `lng` number, nullable: Longitude for location-based search
- `radius` integer: Search radius in meters (min 50m, max 50km)
- `page` integer: Page number
- `limit` integer: Results per page

## Response `200`

Successful Response

- AppModelsCompanyCompanySearchResponse: Response for company search endpoint.
  - `data` AppModelsCompanyCompanySearchResult[], required: List of matching companies
    - `cvr` string, required: 8-digit CVR number
    - `name` string, required: Company name
    - `status` string, required: Company status
    - `company_type` string, nullable: Company type code
    - `address` CompanyAddress: Danish address with all CVR fields preserved for accurate geocoding.
      - `address_id` string, nullable: DAWA adgangsadresse ID for direct geocoding lookup
      - `street_name` string, nullable: Street name (vejnavn)
      - `street_code` integer, nullable: Street code, unique per municipality (vejkode)
      - `house_number` integer, nullable: House number (husnummerFra)
      - `house_number_to` integer, nullable: House number end for address ranges
      - `house_letter` string, nullable: Letter suffix, e.g. 'A', 'B'
      - `house_letter_to` string, nullable: Letter suffix end for ranges
      - `floor` string, nullable: Floor (etage), e.g. 'st', '1', '2'
      - `door` string, nullable: Door identifier: 'th' (right), 'tv' (left), 'mf' (middle)
      - `postal_code` string, nullable: 4-digit Danish postal code
      - `postal_district` string, nullable: Postal district name
      - `town_name` string, nullable: Town name for rural areas (bynavn)
      - `care_of` string, nullable: c/o name if applicable
      - `po_box` string, nullable: P.O. box number
      - `free_text` string, nullable: Free text address (typically for foreign addresses)
      - `country_code` string, nullable: ISO 3166-1 alpha-2 country code
      - `municipality_code` string, nullable: 3-digit Danish municipality code
      - `municipality_name` string, nullable: Municipality name
      - `street` string, nullable: Formatted street address for display
      - `city` string, nullable: City name (same as postal_district)
    - `industry` CompanyIndustry: Industry classification using Danish DB07 codes.
      - `primary_code` string, nullable: Primary 6-digit industry code (DB07)
      - `primary_text` string, nullable: Primary industry description
      - `secondary` SecondaryIndustry[]: List of secondary industry codes
        - `code` string, nullable: 6-digit Danish industry code (DB07)
        - `text` string, nullable: Industry description in Danish
    - `employees` CompanyEmployees: Employee count information from CVR.
      - `count` integer, nullable: Exact employee count (if available)
      - `interval` string, nullable: Employee count interval
      - `full_time_equivalent` number, nullable: Full-time equivalent (FTE) count
      - `including_owners` integer, nullable: Employee count including owners
      - `year` integer, nullable: Year the employee data was reported
      - `month` integer, nullable: Month of the figure (monthly series only)
    - `latest_financials` LatestFinancials: Latest financial figures for search results (lightweight).
      - `revenue` integer, nullable: Latest annual amount in the statement's currency. Missing or zero revenue falls back to gross profit; inspect metric to identify the amount (legacy field name).
      - `year` integer, nullable: Year of the financial data
      - `currency` string, nullable: Currency code of the figures (e.g., DKK, EUR, USD)
      - `metric` string: Metric carried in the legacy revenue field: revenue or gross_profit
      - `period_end` string, date-time, nullable: End date of the annual reporting period
    - `location` AppModelsCompanyGeoLocation: GeoJSON Point for geographic coordinates.
      - `type` string: GeoJSON type (always 'Point')
      - `coordinates` number[], required: Coordinates as [longitude, latitude]
    - `founded_date` string, date-time, nullable: Date company was founded/registered
    - `distance_meters` integer, nullable: Distance from search point in meters (only for location searches)
    - `logo_url` string, nullable: Company logo URL if available
    - `phone` string, nullable: Public phone number: the owner-provided number when the profile is claimed, otherwise the CVR-registered number
    - `phone_source` string, nullable: Where `phone` comes from: `company` (provided by the company through a verified claim) or `cvr` (the CVR register)
  - `participants` AppModelsCompanyParticipantSearchResult[], nullable: Matching participants (shown when few company results)
    - `unit_number` integer, required: CVR unit number for participant lookups
    - `name` string, required: Participant name
    - `unit_type` string, required: Type: PERSON or VIRKSOMHED
    - `cvr` string, nullable: CVR number (only for company participants)
    - `company_relations` object[]: Companies this participant is associated with
  - `meta` object: Response metadata including radius_meters for location searches
  - `pagination` object: Pagination info: page, limit, total, pages, total_is_exact. When total_is_exact is false, total and pages are lower bounds. Filter-only browsing can return data beyond pages; name searches have a ranked window of at most 1,000 results. See the endpoint pagination documentation.

## 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)
