# Norway BRREG Scraper (`aurenic/norway-brreg-scraper`) Actor

Extract Norwegian company registry data from Brønnøysundregistrene (Enhetsregisteret). 1.1M+ companies with NACE codes, VAT status, bankruptcy flags, board roles, and recent-update feeds. No API key, no login, no proxy.

- **URL**: https://apify.com/aurenic/norway-brreg-scraper.md
- **Developed by:** [Aurenic](https://apify.com/aurenic) (community)
- **Security:** Limited permissions
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Norway BRREG Scraper

Extract Norwegian company registry data from Brønnøysundregistrene (Enhetsregisteret). 1.1M+ companies with NACE codes, VAT status, bankruptcy flags, board roles, and recent-update feeds. No API key, no login, no proxy.

### What does Norway BRREG Scraper do?

Scrape Norway's official business registry — the **Enhetsregisteret** — through Brønnøysundregistrene's open data API, in three modes:

- **Search companies** — filter by company name, NACE industry code, municipality, legal form, VAT registration, and bankruptcy status. Auto-paginates up to 10,000 results per query.
- **Lookup by org number** — pass a 9-digit organisasjonsnummer, get the full record plus optionally all registered roles (board, CEO, chair, auditor).
- **Recent updates feed** — the live feed of entity changes for monitoring new registrations, bankruptcies, and status shifts.

The API is **free, open, and keyless**. Data is published under the Norwegian License for Open Government Data (NLOD) \[citation:5]\[citation:7].

### Output fields

#### Company

| Field | Description |
|---|---|
| orgNumber | 9-digit organisasjonsnummer |
| name | Registered name |
| orgForm / orgFormText | Legal form code and description |
| industryCode / industryText | Primary NACE/SN2007 code and description |
| industryCode2/3 | Secondary NACE codes |
| address / postalCode / city | Business address |
| municipality / municipalityCode | Municipality |
| postAddress / postPostalCode / postCity | Postal address |
| employees | Number of employees |
| registrationDate | Registration date in Enhetsregisteret |
| vatRegistered | VAT registration flag |
| vatRegistrationDate | VAT registration date |
| bankrupt | Bankruptcy flag |
| underLiquidation | Liquidation status |
| underForcedLiquidation | Forced liquidation status |
| sectorCode / sectorText | Institutional sector |
| activityDescription | Articles of association purpose |
| lastUpdated | Last registry update |
| url | Direct link to virksomhet.brreg.no |

#### Role (when `includeRoles: true`)

| Field | Description |
|---|---|
| orgNumber | Company the role belongs to |
| roleType / roleTypeText | Role code and description (CEO, chair, board member, auditor) |
| name | Person or entity name |
| personFodselsdato | Date of birth (where published) |
| entityOrgNumber / entityName | For entity roles |
| isPerson / isEntity | Role subject type |
| resigned | Whether the role has ended |
| lastUpdated | Role last-updated timestamp |

#### Update (updates mode)

| Field | Description |
|---|---|
| orgNumber | Company that changed |
| date | Update date |
| changeType | Type of change |
| changedFields | Array of changed fields |
| updatedBy | Updating system |

### Who is it for?

- **B2B sales teams** building Norwegian prospect lists filtered by NACE code, municipality, and VAT status
- **KYB and compliance teams** verifying Norwegian counterparties and monitoring bankruptcy/liquidation flags
- **Market researchers** analyzing company formation by industry and region
- **Procurement teams** enriching supplier records with registry data
- **Risk analysts** monitoring portfolio companies for konkurs (bankruptcy) and avvikling (liquidation) events
- **Data journalists** investigating Norwegian business activity

### Pricing

**$1.20 per 1,000 results.** No subscription.

| Results | Cost |
|---|---|
| 100 | $0.12 |
| 1,000 | $1.20 |
| 10,000 | $12.00 |

### How to use it

1. Pick a **Mode**.
2. For search: enter a **Company Name**, or use **NACE Code**, **Municipality Code**, **Legal Form**, **VAT**, and **Bankruptcy** filters.
3. For lookup: enter **Org Numbers**.
4. Optionally enable **Include Board Roles** for CEO/chair/board enrichment.
5. Click **Start**.

### Output example

```json
{
  "recordType": "company",
  "orgNumber": "923609016",
  "name": "SESAM STASJON AS",
  "orgForm": "AS",
  "orgFormText": "Aksjeselskap",
  "industryCode": "52.292",
  "industryText": "Skipsmegling",
  "address": "Tyvholmen 1",
  "postalCode": "0301",
  "city": "OSLO",
  "municipality": "OSLO",
  "municipalityCode": "0301",
  "country": "NO",
  "employees": 12,
  "registrationDate": "2017-10-20",
  "vatRegistered": true,
  "vatRegistrationDate": "2017-10-21",
  "bankrupt": false,
  "underLiquidation": false,
  "sectorCode": "2100",
  "lastUpdated": "2023-11-21",
  "url": "https://virksomhet.brreg.no/nb/oppslag/enheter/923609016",
  "scrapedAt": "2026-09-25T12:00:00.000Z"
}
```

### Technical details

- **Source: Brønnøysundregistrene Open Data API** at `data.brreg.no/enhetsregisteret/api`. Free, keyless, no authentication \[citation:7]\[citation:9].
- **Data license: NLOD** (Norwegian License for Open Government Data). Free to use and redistribute \[citation:5].
- **Auto-pagination** via `size` and `page` params. BRREG caps deep pagination at ~10,000 results per query \[citation:5].
- **No browser, no proxy, no rate limit** — pure REST JSON.
- **Three modes** — search, lookup, updates feed.
- **Optional role enrichment** — one extra request per company for board/CEO/chair/auditor data.

### Known limits

- **BRREG paginates to ~10,000 results per query.** For the full 1.1M-company registry, use their nightly bulk-download files instead \[citation:5].
- **Financial statements are not in this API.** Revenue and profit live in the separate Regnskapsregisteret behind an agreement \[citation:18].
- **Contact data is not collected by BRREG.** Email, phone, and website are not in the registry. Pair with an enrichment actor if needed \[citation:18].
- **Person identifiers are restricted.** Roles with personal ID numbers require Maskinporten authentication and are not exposed \[citation:13].
- **Some historical records may be incomplete.** Newly registered entities and recently changed records may lag by up to 24 hours.

### FAQ

**Do I need an API key?** No. The BRREG open data API is fully keyless \[citation:7].

**Do I need a proxy?** No. Datacenter IPs work. BRREG has no hard rate limit; 250ms delay is polite \[citation:5].

**What is an organisasjonsnummer?** The 9-digit Norwegian company identifier, equivalent to a VAT number or company registration number.

**How do I find a company's org number?** Search by name first — the `orgNumber` field is in every result.

**What's the difference between search and updates mode?** Search queries the current registry state. Updates mode returns the live feed of entity changes for monitoring new registrations and status shifts.

**How do I export data?** After a run, go to Storage → Export as JSON, CSV, Excel.

### Support

Open an issue on the Actor's page for bugs or feature requests.

# Actor input Schema

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

What to fetch.

## `query` (type: `string`):

Free-text search on company name (e.g. 'Sesam', 'consulting').

## `orgNumbers` (type: `array`):

9-digit Norwegian organisasjonsnummer (e.g. 923609016). Used in lookup mode.

## `naceCode` (type: `string`):

NACE/SN2007 industry code (e.g. 62.010 for software, 73.110 for advertising, 69.201 for accounting).

## `municipalityCode` (type: `string`):

4-digit Norwegian municipality code (0301 Oslo, 4601 Bergen, 5001 Trondheim).

## `orgForm` (type: `string`):

Legal form code: AS (limited company), ASA, ENK (sole proprietorship), ANS, DA, NUF, SA.

## `vatRegistered` (type: `string`):

Filter by VAT registration.

## `bankrupt` (type: `string`):

Filter by bankruptcy status.

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

Also fetch CEO, chair, board members, and auditor for each company. Slower — one extra request per company.

## `maxResults` (type: `integer`):

Cap on companies (BRREG paginates up to 10,000 per query).

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

Hard cap on all records including roles.

## `requestDelayMs` (type: `integer`):

Delay between requests. BRREG has no hard rate limit; 250ms is polite.

## Actor input object example

```json
{
  "mode": "search",
  "query": "consulting",
  "orgNumbers": [
    "923609016"
  ],
  "naceCode": "",
  "municipalityCode": "",
  "orgForm": "",
  "vatRegistered": "",
  "bankrupt": "",
  "includeRoles": false,
  "maxResults": 2000,
  "maxItems": 5000,
  "requestDelayMs": 250
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "orgNumbers": [
        "923609016"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("aurenic/norway-brreg-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 = { "orgNumbers": ["923609016"] }

# Run the Actor and wait for it to finish
run = client.actor("aurenic/norway-brreg-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 '{
  "orgNumbers": [
    "923609016"
  ]
}' |
apify call aurenic/norway-brreg-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,aurenic/norway-brreg-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/CgT9TI7R9fZPWMP6R/builds/uzLqS68ROjhyKcilc/openapi.json
