# Norway Brønnøysund Company Registry Scraper (`crawlerbros/norway-bronnoysund-company-registry-scraper`) Actor

Search Norway's official Brønnøysund Register Centre (Enhetsregisteret) for registered companies and organisations by name or exact organisation number. Get organisation form, address, industry code, employee count, board members/CEO, financial capital, bankruptcy status, and more.

- **URL**: https://apify.com/crawlerbros/norway-bronnoysund-company-registry-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Norway Brønnøysund Company Registry Scraper

Search Norway's official **Brønnøysund Register Centre** (Enhetsregisteret / Central Coordinating Register for Legal Entities) for registered companies and organisations. Look up by name or exact organisation number and get organisation form, address, industry code, employee count, financial capital, bankruptcy/winding-up status, VAT registration, and registered board members / CEO. Pure HTTP, no login, no API key required — this is Norway's own free, official government open-data API.

### Data Source & Usage Notes

- **Free, public, no login, official government API.** `data.brreg.no/enhetsregisteret/api` is the Brønnøysund Register Centre's own open-data REST API; no account, API key, or paywall stands between a user and this data.
- **Two registries in one API.** The source exposes both main units (`enheter` — companies, sole proprietorships, associations, foundations, government bodies) and sub-units (`underenheter` — individual physical business locations/branches belonging to a main unit); this actor exposes both as separate modes.
- **Board members / CEO come from a separate endpoint.** The source's own `enheter/{orgNumber}/roller` endpoint is a distinct API call per unit; this actor fetches it automatically when `includeRoles=true` (default).
- **Not affiliated with the Brønnøysund Register Centre or the Norwegian government.** This is an independent third-party tool using the source's own free, public, no-login open-data API.

### What this actor does

- **Three modes:** `search` (main-unit search by name + filters), `byOrgNumber` (exact 9-digit organisation-number lookup, one or more per run), `subUnits` (sub-unit/branch search by name and/or parent organisation number)
- **Full unit profile** — organisation form, historical names, contact info (website/email/phone), postal and business addresses, registration dates, industry codes (up to 3), employee count, institutional sector code, share capital, bankruptcy/winding-up/VAT-registration flags, articles-of-association purpose text, and (for foundations/associations) statutory purpose
- **Registered roles** — CEO, board chair, board members, deputy members, auditor, contact person, each with name and (for individuals) date of birth
- **Real enum-backed organisation-form filter** — all 44 official organisation-form codes, extracted directly from the source's own `/organisasjonsformer` endpoint
- **Empty fields are omitted**

### What's NOT included (and why)

- **Annual financial statements (regnskap) line items.** The source's separate `regnskapsregisteret` API exposes full profit/loss and balance-sheet data per fiscal year; that is a distinct, much larger dataset and out of scope for v1 (this actor does include `sisteInnsendteAarsregnskap`, the year of the most recently filed annual accounts, from the main unit record).
- **Bulk full-registry export.** The source offers a bulk CSV/JSON dump of the entire registry (millions of rows); this actor is a targeted search/lookup tool, not a full-registry mirror.

### Output per unit

- `organisasjonsnummer`, `navn`, `organisasjonsformKode`, `organisasjonsformBeskrivelse`
- `historiskeNavn` — array of `{navn, fraDato, tilDato}` for every prior registered name
- `hjemmeside`, `epostadresse`, `telefon`, `mobil`
- `postadresse`, `forretningsadresse`, `beliggenhetsadresse` — each `{gate, postnummer, poststed, kommune, kommunenummer, land, landkode}`
- `registreringsdatoEnhetsregisteret`, `stiftelsesdato`
- `oppstartsdato`, `nedleggelsesdato` — sub-unit start/closure dates (sub-units only, when registered)
- `registrertIMvaregisteret`, `registreringsdatoMerverdiavgiftsregisteret`, `registreringsdatoMerverdiavgiftsregisteretEnhetsregisteret`
- `frivilligMvaRegistrertBeskrivelser`, `registreringsdatoFrivilligMerverdiavgiftsregisteret` — voluntary VAT registration reason(s) and date, when applicable
- `naeringskode1` / `naeringskode2` / `naeringskode3` — each `{kode, beskrivelse}` (NACE industry codes)
- `antallAnsatte`, `harRegistrertAntallAnsatte`, `registreringsdatoAntallAnsatteEnhetsregisteret`, `registreringsdatoAntallAnsatteNAVAaregisteret`
- `institusjonellSektorkodeKode`, `institusjonellSektorkodeBeskrivelse`
- `registrertIForetaksregisteret`, `registreringsdatoForetaksregisteret`, `registrertIStiftelsesregisteret`, `registrertIFrivillighetsregisteret`, `registrertIPartiregisteret`
- `konkurs`, `konkursdato`, `underAvvikling`, `underTvangsavviklingEllerTvangsopplosning`, `erIKonsern`
- `tvangsopplostPgaManglendeRegnskapDato`, `tvangsopplostPgaManglendeRevisorDato`, `tvangsopplostPgaMangelfulltStyreDato`, `tvangsavvikletPgaManglendeSlettingDato` — compulsory-dissolution reason dates, when applicable
- `fravalgRevisjonDato`, `fravalgRevisjonBeslutningsDato` — audit opt-out dates, when applicable
- `maalform`, `sisteInnsendteAarsregnskap`
- `vedtektsdato`, `vedtektsfestetFormaal`, `aktivitet`
- `kapital` — `{belop, antallAksjer, type, valuta, innfortDato}` (share capital, when registered)
- `overordnetEnhet` — parent organisation number (sub-units only)
- `roller` — array of `{roleType, personName, personBirthDate}` or `{roleType, companyName, companyOrgNumber}` for company-held roles (present when `includeRoles=true`)
- `sourceUrl` — the unit's own bookmarkable public profile page
- `recordType: "unit"` / `"subUnit"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search` / `byOrgNumber` / `subUnits` |
| `navn` | string | `Equinor` | Name to search for (mode=search / subUnits). Optional — leave blank to browse purely by the filters below instead of by name. |
| `organisasjonsnumre` | array | `["923609016"]` | Exact org numbers to look up (mode=byOrgNumber) |
| `overordnetEnhet` | string | – | Parent org number filter (mode=subUnits) |
| `organisasjonsform` | array | – | Filter by organisation-form code(s), e.g. `AS`, `ENK`, `STI` |
| `naeringskode` | string | – | Filter by exact industry code, e.g. `62.010` |
| `kommunenummer` | string | – | Filter by municipality number, e.g. `0301` (Oslo) |
| `fraRegistreringsdatoEnhetsregisteret` / `tilRegistreringsdatoEnhetsregisteret` | string | – | Registration-date range in the Central Coordinating Register, format `YYYY-MM-DD` (mode=search / subUnits) |
| `postnummer` | string | – | Filter by exact postal code |
| `fraAntallAnsatte` / `tilAntallAnsatte` | int | – | Employee-count range |
| `konkurs` | boolean | – | Bankruptcy status filter (mode=search) |
| `underAvvikling` | boolean | – | Winding-up status filter (mode=search) |
| `registrertIMvaregisteret` | boolean | – | VAT registration filter (mode=search) |
| `institusjonellSektorkode` | array | – | Filter by institutional sector code(s) (SSB classification), e.g. `2100` (mode=search) |
| `sisteInnsendteAarsregnskap` | int | – | Filter by exact year of last filed annual accounts, e.g. `2023` (mode=search) |
| `fraStiftelsesdato` / `tilStiftelsesdato` | string | – | Founding-date range, format `YYYY-MM-DD` (mode=search) |
| `includeRoles` | boolean | `true` | Fetch board members / CEO per unit |
| `maxItems` | int | `20` | Hard cap (1–1000) |

#### Example: search by name

```json
{
  "mode": "search",
  "navn": "Equinor",
  "includeRoles": true,
  "maxItems": 20
}
```

#### Example: filtered browse, no name needed (active AS companies in Oslo with 50+ employees)

```json
{
  "mode": "search",
  "organisasjonsform": ["AS"],
  "kommunenummer": "0301",
  "fraAntallAnsatte": 50,
  "konkurs": false,
  "maxItems": 50
}
```

#### Example: lookup by exact organisation number(s)

```json
{
  "mode": "byOrgNumber",
  "organisasjonsnumre": ["923609016"]
}
```

### Use cases

- **Vendor/customer due diligence** — confirm a Norwegian counterparty's registration status, bankruptcy status, and registered address before signing a contract
- **Compliance & KYC** — verify board members and CEO of record for a Norwegian entity
- **Lead generation** — build lists of Norwegian companies by industry code, municipality, or employee-count range
- **Corporate research** — track historical name changes, share capital, and financial-year filings of a company
- **Registry enrichment** — bulk-append Norwegian entity status and roles to an existing business dataset

### FAQ

**Is this an official Norwegian government product?**
No. This is an independent tool that uses the Brønnøysund Register Centre's own free, public, no-login open-data API.

**Why are some numeric/boolean fields absent from a record?**
Norwegian entities self-report much of this data; fields like `antallAnsatte` or `konkurs` are only present on the source's own record when actually registered. This actor omits absent fields rather than emitting a fake `0`/`false` value.

**Can I get full financial statements (revenue, profit, balance sheet)?**
Not in v1 — see "What's NOT included" above. This actor does include the year of the most recently filed annual accounts (`sisteInnsendteAarsregnskap`).

# Actor input Schema

## `mode` (type: `string`):

What to fetch.

## `navn` (type: `string`):

Organisation name (or partial name) to search for, e.g. `Equinor`. For mode=search and mode=subUnits, leave blank to browse purely by the filters below (organisation form, municipality, employee count, etc.) instead of by name -- at least one of `navn`, the filters, or (for subUnits) `overordnetEnhet` must be set.

## `organisasjonsnumre` (type: `array`):

Exact 9-digit Norwegian organisation number(s) to look up, e.g. `923609016`.

## `overordnetEnhet` (type: `string`):

Only include sub-units belonging to this parent organisation number.

## `organisasjonsform` (type: `array`):

Only include units with these organisation forms. Leave empty to include all.

## `naeringskode` (type: `string`):

Only include units with this exact industry code, e.g. `62.010` (Computer programming).

## `institusjonellSektorkode` (type: `array`):

Only include main units with these institutional sector codes (SSB/Statistics Norway classification). Leave empty to include all. Not applicable to sub-unit search.

## `sisteInnsendteAarsregnskap` (type: `integer`):

Only include main units whose most recently filed annual accounts (regnskapsår) is exactly this year, e.g. `2023`. Not applicable to sub-unit search.

## `fraStiftelsesdato` (type: `string`):

Only include main units founded (stiftelsesdato) on or after this date, format `YYYY-MM-DD`, e.g. `2015-01-01`. Not applicable to sub-unit search.

## `tilStiftelsesdato` (type: `string`):

Only include main units founded (stiftelsesdato) on or before this date, format `YYYY-MM-DD`, e.g. `2020-12-31`. Not applicable to sub-unit search.

## `fraRegistreringsdatoEnhetsregisteret` (type: `string`):

Only include units registered in the Central Coordinating Register for Legal Entities (Enhetsregisteret) on or after this date, format `YYYY-MM-DD`. Applies to mode=search and mode=subUnits.

## `tilRegistreringsdatoEnhetsregisteret` (type: `string`):

Only include units registered in the Central Coordinating Register for Legal Entities (Enhetsregisteret) on or before this date, format `YYYY-MM-DD`. Applies to mode=search and mode=subUnits.

## `kommunenummer` (type: `string`):

Only include units whose business address is in this municipality, e.g. `0301` (Oslo).

## `postnummer` (type: `string`):

Only include units with this exact postal code.

## `fraAntallAnsatte` (type: `integer`):

Only include units with at least this many registered employees.

## `tilAntallAnsatte` (type: `integer`):

Only include units with at most this many registered employees.

## `konkurs` (type: `boolean`):

When set, only include units matching this bankruptcy (konkurs) status. Leave unset to include both.

## `underAvvikling` (type: `boolean`):

When set, only include units matching this winding-up (under avvikling) status. Leave unset to include both.

## `registrertIMvaregisteret` (type: `boolean`):

When set, only include units matching this VAT-register (Merverdiavgiftsregisteret) registration status. Leave unset to include both.

## `includeRoles` (type: `boolean`):

When true, the actor fetches each matched unit's registered roles (CEO, board chair, board members, deputy members) from the source's separate roles endpoint. When false, only the base unit record is returned (faster).

## `maxItems` (type: `integer`):

Hard cap on emitted records.

## Actor input object example

```json
{
  "mode": "search",
  "navn": "Equinor",
  "organisasjonsnumre": [
    "923609016"
  ],
  "overordnetEnhet": "",
  "organisasjonsform": [],
  "naeringskode": "",
  "institusjonellSektorkode": [],
  "fraStiftelsesdato": "",
  "tilStiftelsesdato": "",
  "fraRegistreringsdatoEnhetsregisteret": "",
  "tilRegistreringsdatoEnhetsregisteret": "",
  "kommunenummer": "",
  "postnummer": "",
  "includeRoles": true,
  "maxItems": 20
}
```

# Actor output Schema

## `units` (type: `string`):

Dataset containing all scraped Brønnøysund Register units.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "mode": "search",
    "navn": "Equinor",
    "organisasjonsnumre": [
        "923609016"
    ],
    "overordnetEnhet": "",
    "organisasjonsform": [],
    "naeringskode": "",
    "institusjonellSektorkode": [],
    "fraStiftelsesdato": "",
    "tilStiftelsesdato": "",
    "fraRegistreringsdatoEnhetsregisteret": "",
    "tilRegistreringsdatoEnhetsregisteret": "",
    "kommunenummer": "",
    "postnummer": "",
    "includeRoles": true,
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/norway-bronnoysund-company-registry-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "mode": "search",
    "navn": "Equinor",
    "organisasjonsnumre": ["923609016"],
    "overordnetEnhet": "",
    "organisasjonsform": [],
    "naeringskode": "",
    "institusjonellSektorkode": [],
    "fraStiftelsesdato": "",
    "tilStiftelsesdato": "",
    "fraRegistreringsdatoEnhetsregisteret": "",
    "tilRegistreringsdatoEnhetsregisteret": "",
    "kommunenummer": "",
    "postnummer": "",
    "includeRoles": True,
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/norway-bronnoysund-company-registry-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "search",
  "navn": "Equinor",
  "organisasjonsnumre": [
    "923609016"
  ],
  "overordnetEnhet": "",
  "organisasjonsform": [],
  "naeringskode": "",
  "institusjonellSektorkode": [],
  "fraStiftelsesdato": "",
  "tilStiftelsesdato": "",
  "fraRegistreringsdatoEnhetsregisteret": "",
  "tilRegistreringsdatoEnhetsregisteret": "",
  "kommunenummer": "",
  "postnummer": "",
  "includeRoles": true,
  "maxItems": 20
}' |
apify call crawlerbros/norway-bronnoysund-company-registry-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlerbros/norway-bronnoysund-company-registry-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/vveZfeplPZva7g0GB/builds/GCoXDGbqV3Gn8bedu/openapi.json
