# Norway Company Register Brreg Scraper (`b2b_lead_generation/norway-company-register-brreg-scraper`) Actor

Extract Norwegian company data, roles, and sub-units from the central register by name, industry code, or org number, then export structured JSON, CSV, or Excel files.

- **URL**: https://apify.com/b2b_lead_generation/norway-company-register-brreg-scraper.md
- **Developed by:** [B2B Lead Generation](https://apify.com/b2b_lead_generation) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.99 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Company Register (Brreg) Scraper for Norwegian Companies](https://images.bigibyte.com/cdn-cgi/image/width=800,quality=80,format=auto/apify-actors-covers/norway-company-register-scraper-cover.png)

## Norway Company Register (Brreg) Scraper for Norwegian Companies

This scraper extracts information on Norwegian registered companies and outputs clean dataset rows that you can download as JSON, CSV, or Excel.

Search by company name, industry code (NACE), municipality, or registration date. You can also look up specific organisation numbers, extract board and CEO management roles, or map out sub-units under parent companies. The run automatically caps at your specified limit, handles duplicate entries seamlessly, and saves failed requests as error rows so the rest of your run continues smoothly without stopping.

### Use cases

- **Sales lead generation**: Search by company name or industry code to quickly build target lists with registered addresses, websites, and official details.
- **Account research**: Gather quick profiles on specific companies using their organisation number to check employee counts, active statuses, and registered business names.
- **Leadership & ownership checks**: Fetch active board members and top executives for targeted account lists.
- **Group structures**: Map out branch offices and sub-units linked to a parent company.
- **Targeted local research**: Filter search results by specific municipality codes or registration date ranges.

### What data does this actor extract?

Depending on your selected mode, the actor extracts matching business records, sub-units, or executive role profiles.

If a requested company record cannot be retrieved or found, the actor logs it as an error row containing details about the attempt, ensuring you don't lose the rest of your dataset. Duplicate records are automatically filtered out so you only receive unique entries.

### Input

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `mode` | string | `search` | Choose between company search, direct lookup, leadership roles, or sub-units. |
| `name` | string | `equinor` | Company name filter for search and sub-unit modes. |
| `orgNumbers` | array | `923609016` | Organisation numbers for direct lookups, leadership checks, or parent sub-unit queries. |
| `naeringskode` | string | empty | Industry / NACE code (e.g., `62.010`). Used in search mode. |
| `kommunenummer` | string | empty | Municipality code (e.g., `1103`). Used in search mode. |
| `registeredFrom` | string | empty | Registration date filter (`YYYY-MM-DD`). Used in search mode. |
| `maxItems` | integer | 100 | Maximum number of successful results to collect (capped at 1000). |
| `requestDelaySecs` | number | 1 | Pause between requests to maintain reasonable traffic rates. |
| `userAgent` | string | B2B Lead GenerationActorResearch/1.0 | Contact string sent with outgoing requests. |
| `timeoutSecs` | integer | 300 | Total runtime timeout before saving collected results. |
| `requestTimeoutSecs` | integer | 30 | Individual request timeout limit. |
| `proxyConfiguration` | object | No proxy | Optional proxy settings if required for custom setups. |

#### Example input

```json
{
  "mode": "search",
  "name": "equinor",
  "orgNumbers": ["923609016"],
  "naeringskode": "",
  "kommunenummer": "",
  "registeredFrom": "",
  "maxItems": 100,
  "requestDelaySecs": 1,
  "userAgent": "",
  "timeoutSecs": 300,
  "requestTimeoutSecs": 30,
  "proxyConfiguration": { "useApifyProxy": false }
}

```

### Output

```json
{
  "organisasjonsnummer": "923609016",
  "navn": "EQUINOR ASA",
  "organisasjonsform": "ASA",
  "naeringskode1": "06.100",
  "naeringskode1_beskrivelse": "Utvinning av råolje",
  "antallAnsatte": 21272,
  "hjemmeside": "[www.equinor.com](https://www.equinor.com)",
  "forretningsadresse": {
    "adresse": ["Forusbeen 50"],
    "kommune": "STAVANGER",
    "kommunenummer": "1103",
    "land": "Norge",
    "landkode": "NO",
    "postnummer": "4035",
    "poststed": "STAVANGER"
  },
  "registreringsdatoEnhetsregisteret": "1995-03-12",
  "konkurs": false,
  "scraped_at": "2026-10-12T00:00:00+00:00"
}

```

When running in roles mode, a `roles` field is included containing structured role types and names. For sub-units without a formal business address, location address details are provided instead.

| Field | Type | Description |
| --- | --- | --- |
| `organisasjonsnummer` | string | Unique organisation number used to avoid duplicate records. |
| `navn` | string | Officially registered business name. |
| `organisasjonsform` | string | Legal company structure code (such as ASA, AS, etc.). |
| `naeringskode1` | string | Primary industry / NACE code. |
| `naeringskode1_beskrivelse` | string | Human-readable industry description. |
| `antallAnsatte` | integer | Registered headcount/employee count. |
| `hjemmeside` | string | Registered website address. |
| `forretningsadresse` | object | Registered business address or primary location address. |
| `registreringsdatoEnhetsregisteret` | string | Official registration date. |
| `konkurs` | boolean | Flag indicating bankruptcy status when available. |
| `roles` | array | List of roles and person/entity names (included in roles mode). |
| `scraped_at` | string | UTC timestamp when data was retrieved. |
| `error` | string | Displayed on error rows if a specific call failed. |
| `status` | integer | Response status code recorded for error rows. |
| `message` | string | Explanation of why an individual lookup failed. |

### How it works

1. Evaluates your configured search parameters, filters, and item cap.
2. Constructs request paths cleanly according to your chosen execution mode.
3. Formats parameters and sends clean requests with your custom User-Agent.
4. Pauses between calls based on `requestDelaySecs` to keep execution smooth and safe.
5. Processes returning company data, skips any repeated organisation numbers, and stops when reaching `maxItems` or the end of available records.
6. Saves batch outputs efficiently so you can review completed rows in real time.

### FAQ

**What happens if an organisation number is incorrect or invalid?**
The tool records an error row explaining what went wrong and moves directly on to process the next number in your list.

**Why did my search return fewer results than expected?**
The `maxItems` parameter defaults to 100 results per run and is hard-capped at 1,000 items. Additionally, searches stop naturally once all available matching pages are collected.

**Does leadership role extraction include birth dates or private personal information?**
No. Role outputs focus strictly on role titles and official person or entity names.

**Can I run a sub-unit search combining both a sub-unit name and a parent organisation number at once?**
These lookups are handled separately, so you would run one pass for name matches or another pass using parent organisation numbers.

### Trademark Notice

Norway Company Register and related names, logos, and trademarks belong to their respective owners. Their use in this documentation is solely to identify the target source for business data and does not imply affiliation, sponsorship, endorsement, or partnership.

### Disclaimer

Disclaimer: This Actor is an independent tool and is not affiliated with, endorsed by, sponsored by, or otherwise officially associated with Norway Company Register or its owners. All data is collected from publicly available sources. Users are responsible for complying with the source's terms of use, rate limits, and attribution or licensing requirements.

### Is web scraping legal?

This Actor only collects publicly available data's. Scraping public data is generally legal, but how you use it matters:

- **Personal data:** If the results include personal data (for example names or contact details), privacy regulations such as the GDPR in the EU or CCPA in California may apply. Always ensure you have a legitimate business purpose when storing personal data.
- **Copyright:** Certain content may be protected by copyright laws. Avoid republishing full copyrighted passages without authorization.
- **Terms of use:** Respect source rate limits, usage guidelines, and attribution requirements.
- **Legal advice:** The information provided here is for general informational purposes and does not constitute formal legal advice. Consult a qualified attorney if you have specific legal questions.

To learn more, read Apify's guide: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

# Actor input Schema

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

search lists units from /enheter. by_orgnr loads one unit per organisation number. roles loads /enheter/{orgnr}/roller. subunits lists /underenheter by name or parent organisation number.

## `name` (type: `string`):

Company name sent as navn= on unit search and on sub-unit search. Example: equinor. Ignored for lookup and roles.

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

Nine-digit organisation numbers, one per line. Used as the path id for lookup and roles, and as overordnetEnhet for sub-units when this list is filled in.

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

Industry code sent as naeringskode= on unit search. Example: 62.010. Leave blank to skip this filter.

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

Norwegian municipality number sent as kommunenummer= on unit search. Example: 1103 for Stavanger. Leave blank to skip this filter.

## `registeredFrom` (type: `string`):

Lower bound sent as fraRegistreringsdatoEnhetsregisteret= on unit search, YYYY-MM-DD. Leave blank to skip this filter.

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

Maximum company or role rows to save this run. Hard cap is 1000. Error rows do not count toward this limit.

## `requestDelaySecs` (type: `number`):

Seconds to wait between Brreg requests. Default is 1. A short burst returned 200 with no rate-limit headers, which is not a published quota. Set 0 only for tests.

## `userAgent` (type: `string`):

User-Agent sent on every request. Keep an app name and a contact so the host can identify the client.

## `timeoutSecs` (type: `integer`):

Stop the run after this many seconds and keep rows already collected. Default 300. Maximum 3600.

## `requestTimeoutSecs` (type: `integer`):

How long to wait for one Brreg response before treating that call as failed. Default 30 seconds.

## `proxyConfiguration` (type: `object`):

Optional proxy for Brreg requests. Leave useApifyProxy off. The public endpoint does not require a proxy.

## Actor input object example

```json
{
  "mode": "search",
  "name": "equinor",
  "orgNumbers": [
    "923609016"
  ],
  "naeringskode": "",
  "kommunenummer": "",
  "registeredFrom": "",
  "maxItems": 100,
  "requestDelaySecs": 1,
  "userAgent": "",
  "timeoutSecs": 300,
  "requestTimeoutSecs": 30,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Organisation number, name, form, NACE, employees, website

## `errors` (type: `string`):

Failed Brreg requests with URL, HTTP status, and message.

## `dataset` (type: `string`):

Every row from the run, without a table view applied.

# 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"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("b2b_lead_generation/norway-company-register-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"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("b2b_lead_generation/norway-company-register-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"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call b2b_lead_generation/norway-company-register-brreg-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,b2b_lead_generation/norway-company-register-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/Ak7yHy0LeREMERfZR/builds/MOdjIXxjxqWsjhURL/openapi.json
