# Norway Company Register Scraper: Brreg Business Data (`bogdiehard/brreg-norway-company-scraper`) Actor

Norwegian companies from the official Brønnøysund register as flat rows: search by municipality, industry, legal form, size or age, or pull the daily feed of new, changed and deleted companies.

- **URL**: https://apify.com/bogdiehard/brreg-norway-company-scraper.md
- **Developed by:** [Demetrius Greses Jr](https://apify.com/bogdiehard) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.56 / 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 Scraper: Brreg Business Data

Returns Norwegian companies from the official Brønnøysund company register as flat, Excel-ready rows (organisation number, name, legal form, industry code, address, employees, registration date, bankruptcy and liquidation flags), for B2B sales teams, KYC analysts and market researchers, with a daily feed of new, changed and deleted companies.

### Use cases

- **B2B sales teams:** pull every active AS in Oslo in computer programming (industry 62.100) with its address and registration date as a spreadsheet for account research.
- **KYC and compliance analysts:** run the change feed each day and watch for new, changed and deleted companies, then check bankruptcy and liquidation flags on the companies you monitor.
- **Market researchers:** count and profile companies by municipality, industry code, legal form, size band and founding year.
- **Data and BI teams:** load a daily change feed into a warehouse or dashboard, keyed on the stable organisation number, with ISO dates.
- **AI agents:** answer questions such as "how many AS companies registered in Bergen since 2024?" through the Apify API or MCP server, against one fixed schema.

### Sample output

Three rows from a live run (search for AS companies in municipality 0301, Oslo):

| name | id | legalForm | industry | employees | registeredAt |
| --- | --- | --- | --- | --- | --- |
| AUTOBJØRN A/S | 810359862 | Aksjeselskap | Reparasjon og vedlikehold av motorvogner | 12 | 1995-02-19 |
| BJØRNSTJERNE BJØRNSONSGATE AS | 810363142 | Aksjeselskap | Utleie av egen eller leid fast eiendom | null | 1995-02-19 |
| METALLCO AS | 810392312 | Aksjeselskap | Materialgjenvinning | 49 | 1995-02-19 |

One item as JSON, from the same run (the purpose text is shortened):

```json
{
    "id": "810392312",
    "name": "METALLCO AS",
    "legalFormCode": "AS",
    "legalForm": "Aksjeselskap",
    "registeredAt": "1995-02-19T00:00:00.000Z",
    "foundedAt": "1967-01-10T00:00:00.000Z",
    "industryCode": "38.210",
    "industry": "Materialgjenvinning",
    "industryCode2": null,
    "industryCode3": null,
    "employees": 49,
    "employeesRegistered": true,
    "street": "Strømsveien 287",
    "postalCode": "0668",
    "city": "OSLO",
    "municipalityCode": "0301",
    "municipality": "OSLO",
    "countryCode": "NO",
    "postalAddress": "Postboks 15 ALNABRU, 0614 OSLO",
    "website": null,
    "bankrupt": false,
    "bankruptAt": null,
    "underLiquidation": false,
    "underCompulsoryLiquidation": false,
    "vatRegistered": true,
    "businessRegistered": true,
    "lastAnnualAccountsYear": 2025,
    "shareCapital": 17483400,
    "shareCapitalCurrency": "NOK",
    "sectorCode": "2100",
    "sector": "Private aksjeselskaper mv.",
    "inGroup": true,
    "formerNames": ["ROLF BAKKE AS"],
    "purpose": "Handel, agenturvirksomhet, eksport og import, produksjon og alt hva dermed står i forbindelse …",
    "changeType": null,
    "deletedAt": null,
    "sourceUrl": "https://data.brreg.no/enhetsregisteret/api/enheter/810392312",
    "detailUrl": "https://w2.brreg.no/enhet/sok/detalj.jsp?orgnr=810392312",
    "scrapedAt": "2026-10-12T23:08:41.860Z"
}
```

### Pricing

**$0.80 per 1,000 results.** A 500-result run costs about $0.40. You pay only for results saved to your dataset, plus Apify's standard start fee of $0.00005 per run. Apify Silver and Gold plan users get lower per-result prices automatically.

Set **Max results** to cap what a run can cost. The Actor stops cleanly when it reaches your spending limit.

### Input

See the input tab for the full configuration. The fields are:

| Field | Type | Description |
| --- | --- | --- |
| `mode` | string | `search` (default) reads companies that match the filters. `updates` reads the change feed: new, changed and deleted companies since `updatesSince`. |
| `name` | string | Keep companies whose name matches this text, as the register matches names. Search mode only. |
| `legalForms` | array | Legal form codes, for example `AS`, `ASA`, `ANS`, `DA`, `NUF`, `SA`. Empty means all forms except sole proprietorships (`ENK`, opt-in below). Private persons (`PERS`) and estates (`BO`, `KBO`) are never output. Search mode only. |
| `municipalityCodes` | array | 4-digit municipality numbers, for example `0301` for Oslo. Empty means the whole country. Search mode only. |
| `industryCodes` | array | SN2025 industry codes, for example `62.100` (computer programming), or a prefix such as `62` for the whole division. Older SN2007 codes such as `62.010` match nothing. Search mode only. |
| `minEmployees` | integer | Keep companies with at least this many registered employees. Search mode only. |
| `maxEmployees` | integer | Keep companies with at most this many registered employees. Search mode only. |
| `registeredFrom` | string | Keep companies registered on or after this date, `YYYY-MM-DD`. Search mode only. |
| `registeredTo` | string | Keep companies registered on or before this date, `YYYY-MM-DD`. Search mode only. |
| `onlyActive` | boolean | Leave out companies that are bankrupt or under liquidation (default true). Search mode only. The change feed always includes them. |
| `includeSoleProprietorships` | boolean | Include sole proprietorships (`ENK`). Off by default: a sole proprietorship is named after its owner. Private persons (`PERS`) and estates (`BO`, `KBO`) are never output, whatever this setting. |
| `updatesSince` | string | Change feed mode only: the earliest change time, ISO 8601, for example `2026-10-11T00:00:00Z`. Empty means 24 hours before the run. |
| `maxItems` | integer | Maximum number of results to return (default 100, up to 50,000). You are charged per result. |
| `proxyConfiguration` | object | Not needed for this official open-data API, so it is off by default. |

Example input (the daily test):

```json
{
    "mode": "search",
    "municipalityCodes": ["0301"],
    "legalForms": ["AS"],
    "maxItems": 20
}
```

Example input for the change feed, run daily (leave `updatesSince` empty to read the last 24 hours):

```json
{
    "mode": "updates",
    "maxItems": 500
}
```

### Integrations

- **API:** run the Actor and fetch results with the [Apify API](https://docs.apify.com/api/v2) or the JavaScript and Python clients.
- **AI agents:** call it as a tool through the [Apify MCP server](https://mcp.apify.com).
- **No-code:** connect it to Make, Zapier or n8n, or export results straight to Google Sheets.
- **Scheduling:** run the change feed daily with Apify Schedules. With `updatesSince` left empty, each run reads the last 24 hours, so you get only recent changes.

### FAQ

**What are the limits?** The register answers at most 10,000 matches per query. A search with more matches and a **Max results** above 10,000 is split automatically: first by municipality, then by registration year, with duplicates removed by organisation number. A single municipality and registration year with more than 10,000 companies cannot be split further, so the first 10,000 are read and the log says so. A query with 10,000 matches or fewer is read in full. Sub-entities (branches, `underenheter`) are not included in version 0.1. Each changed company in the change feed costs one register lookup. The Actor makes about three lookups a second, so a 24-hour feed of 8,734 changes takes about 50 minutes to read in full. Every saved row is one platform charge call, which takes about 0.1 to 0.3 seconds, so a run of tens of thousands of rows takes hours; start with a small **Max results** to test.

**Why are some fields empty?** A field is `null` when the company did not register it. Most companies have no registered employee count, for example. In one 20-row sample, 17 rows had `employees` null.

**Why does `municipalityCodes` return companies whose business address is elsewhere?** The register matches the municipality on the business address or on the postal address, and the Actor passes that match on. `municipalityCode` and `municipality` show the business address, so they can differ from the filter.

**Which industry codes work?** `industryCodes` take the SN2025 codes that the Brønnøysund register uses now, for example `62.100` for computer programming. Older SN2007 codes such as `62.010` match nothing. If your codes match no company, the run succeeds with no rows, and its status message names the codes and gives this hint. A prefix matches every code under it: `62` covers the whole division, `62.1` or `62.10` covers the codes that start with those digits, and `62.100` is a single code. Several codes and prefixes can go in one list.

**Why are sole proprietorships and other personal records missing?** Sole proprietorships (`ENK`) are named after their owners, so they are left out unless you turn on `includeSoleProprietorships`. Records of other natural persons (`PERS`), estates (`BO`) and bankruptcy estates (`KBO`) name private individuals and are never output.

**What does `changeType` mean?** In change feed mode: `Ny` means a new company, `Endring` a changed one, `Ukjent` a change the register did not classify, `Sletting` a deletion reported by the feed while the register still returns the company as live (rare), and `deleted` a company the register reports as deleted. In search mode the field is `null`. Deleted companies keep their name and legal form when the register still returns them; otherwise only the organisation number is known.

**What is never collected?** The Actor never reads board members, signatories or other roles, and never reads personal identification numbers. Contact fields (email address, phone, mobile) are never copied into a result, so they cannot appear in the dataset. A company name can still contain a person's name, which is why the personal forms (`ENK`, `PERS`, `BO`, `KBO`) are excluded by default.

**Is this legal?** The Actor collects public data only, from the official Brønnøysund open API. It needs no login, no account cookies and no CAPTCHA solving, and it asks the register for about three requests a second, never more than three at a time. It is not affiliated with, endorsed by or connected to the Brønnøysund Register Centre. Contains data under the Norwegian licence for Open Government data (NLOD) 2.0 distributed by the Brønnøysund Register Centre (Brønnøysundregistrene). You are responsible for how you use the data.

**Something broke or a field is missing?** Open an issue on the Actor's Issues tab. We answer within one business day and usually ship a fix within 48 hours.

### Related Actors

- [More Husena Actors](https://apify.com/bogdiehard): the other Actors from Husena LLC.

### Changelog

- **0.1** (2026-10-12): First release. Search by filters with splitting past 10,000 results, a daily change feed with new, changed and deleted companies, flat rows and privacy defaults.
- **0.1.x** (2026-10-13): SN2025 industry codes and code prefixes; hint when an industry code matches nothing.

# Actor input Schema

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

Search: companies that match the filters. Change feed: companies the register changed since "Updates since" (new, changed or deleted). The filters apply to search only.

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

Free text matched against the company name, as the register matches names. Search mode only.

## `legalForms` (type: `array`):

Keep companies with these legal forms. Empty means every form except sole proprietorships (ENK, available with the setting below). Records of private persons (PERS) and estates (BO, KBO) are never output. Search mode only.

## `municipalityCodes` (type: `array`):

4-digit municipality numbers (kommunenummer), for example 0301 for Oslo. Empty means the whole country. Search mode only.

## `industryCodes` (type: `array`):

SN2025 industry codes (the standard Brreg uses now), for example 62.100 (computer programming) or a prefix such as 62 for the whole division. Older SN2007 codes such as 62.010 no longer match anything. Search mode only.

## `minEmployees` (type: `integer`):

Keep companies with at least this many registered employees. Search mode only.

## `maxEmployees` (type: `integer`):

Keep companies with at most this many registered employees. Search mode only.

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

Keep companies registered in the register on or after this date, as YYYY-MM-DD. Search mode only.

## `registeredTo` (type: `string`):

Keep companies registered on or before this date, as YYYY-MM-DD. Search mode only.

## `onlyActive` (type: `boolean`):

Leave out companies that are bankrupt or under liquidation. Search mode only. The change feed always includes them.

## `includeSoleProprietorships` (type: `boolean`):

Off by default. A sole proprietorship (ENK) is a business named after its owner, so its name is a person's name. Records of private persons (PERS) and of estates (BO, KBO) are never output, whatever this setting.

## `updatesSince` (type: `string`):

Change feed mode only: the earliest change time to include, as ISO 8601, for example 2026-10-11T00:00:00Z. Empty means 24 hours before the run.

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

Maximum number of results to return (up to 50,000). You are charged per result. Above 10,000, a search is split into several queries automatically.

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

Not needed for this official open-data API, so it is off by default. Turn it on only if the register blocks your requests.

## Actor input object example

```json
{
  "mode": "search",
  "legalForms": [
    "AS"
  ],
  "municipalityCodes": [
    "0301"
  ],
  "onlyActive": true,
  "includeSoleProprietorships": false,
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

## `stats` (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 = {
    "mode": "search",
    "legalForms": [
        "AS"
    ],
    "municipalityCodes": [
        "0301"
    ],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("bogdiehard/brreg-norway-company-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",
    "legalForms": ["AS"],
    "municipalityCodes": ["0301"],
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": False },
}

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

```

## MCP server setup

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