# Norway Company Registry & Changes Monitor (`automatic/norway-company-changes-monitor`) Actor

Look up Norwegian companies by name, organisation number, industry, municipality, legal form or registration date. Export registry details, addresses, contacts, status flags, and opt-in change tracking for new, amended and closed companies.

- **URL**: https://apify.com/automatic/norway-company-changes-monitor.md
- **Developed by:** [Philip Kirkbride](https://apify.com/automatic) (community)
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 companies

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 Company Registry & Changes Monitor

Export company records from Norway's official open company register, Brønnøysundregistrene, for due diligence, supplier checks, market research and portfolio monitoring. Search by name, organisation number, industry, municipality, legal form, registration date or insolvency status. Or keep a list of organisation numbers and run the actor on a schedule to see what changed.

Each row is one company. It contains the organisation number, registered name, legal form, industry codes and descriptions, registration and founding dates, bankruptcy and liquidation flags, deletion date, business and postal addresses, municipality, employee count, website, email, phone, mobile, parent organisation, registered purpose and activity text, historical names, capital, sector, language form and register memberships. Values are shown exactly as the register publishes them. Missing values are null.

Public register data is published under the Norwegian Licence for Open Government Data (NLOD 2.0).

**Typical uses**

- **Supplier and customer checks (KYC/KYB):** confirm a Norwegian company's organisation number, legal form, address, status and register memberships before you sign.
- **Portfolio and credit monitoring:** follow a list of organisation numbers and get only the companies that were amended, went bankrupt, entered liquidation or were deleted since your last run.
- **Lead lists and market research:** export every AS or ASA in an industry (NACE code) and municipality, with employee counts, websites and phone numbers.
- **New-company feeds:** filter by registration date to list companies registered in a month, for example in one industry or region.
- **Data enrichment:** add industry codes, capital, sector and historical names to an existing list of Norwegian companies.

### Quick start

Run with `{}` (or the Console prefill) for a small first result: a full-mode name search for Equinor, capped at 50 companies.

```json
{"name": "Equinor", "maxItems": 50}
```

### Usage

#### Monitor a portfolio

```json
{
  "orgNumbers": ["923609016", "959733600", "983908179"],
  "mode": "changes",
  "stateKey": "my-portfolio",
  "maxItems": 50
}
```

The first run in changes mode reports every company as new. Later runs with the same change-ledger name report only companies that are new, amended or closed since the previous run. Amended rows carry the changed field names, the previous values, and the register's own change-notice id and time. Closed rows show the current deleted or removed status. A company you already follow is still checked when it no longer matches your search, for example after a bankruptcy under `bankrupt: false`, a move to another municipality or a new industry code, and it is reported as amended or closed. Amendments and closures come before new companies. When `maxItems` ends a run, the status says so and the remaining changes arrive with the next run. A run that stops early never marks companies it did not deliver as already seen. If a saved change ledger cannot be read, the run fails before it delivers or charges any company rows and leaves the ledger as it was. One change ledger holds about 20,000 companies; use a second `stateKey` for more.

#### Search the register

```json
{
  "name": "Equinor",
  "maxItems": 50
}
```

#### Filter by industry, municipality, legal form, date or status

```json
{
  "naceCodes": ["06.100", "62.010"],
  "municipalityNumbers": ["0301", "1103"],
  "legalForms": ["ASA", "AS"],
  "registeredFrom": "2020-01-01",
  "registeredTo": "2026-12-31",
  "bankrupt": false,
  "underLiquidation": false,
  "maxItems": 100
}
```

Filters combine. Leave a status filter unset to include both values. Organisation numbers and search filters are alternatives, not combined.

### Inputs

| Input | What it does |
|---|---|
| `orgNumbers` | Up to 2,000 organisation numbers to monitor. |
| `name` | Company name or part of a name (up to 180 characters). |
| `naceCodes` | Up to 10 industry codes, such as `06.100`. |
| `municipalityNumbers` | Up to 20 municipality numbers for the business address. |
| `legalForms` | Up to 50 legal-form codes, such as `ASA`, `AS` or `ENK`. |
| `registeredFrom`, `registeredTo` | Registration-date window in the Enhetsregisteret, as `YYYY-MM-DD`. |
| `bankrupt`, `underLiquidation`, `underCompulsoryLiquidation`, `underBankruptcyProceedings` | Optional insolvency-status filters. |
| `mode` | `full` returns every matching company; `changes` returns only changes since the previous run. Default `full`. |
| `stateKey` | Changes mode only. Optional name for a change ledger; reuse it to continue the same portfolio. Without it, the ledger is tied to the exact portfolio or filter set (not to `maxItems`). |
| `updatesSince` | Changes mode only. Optional date from which the register's change notices are attached. By default each company's notices since its last check are used. |
| `maxItems` | Maximum rows for the run. Default 50, maximum 5,000. |

If no portfolio and no search filters are supplied, the actor searches for Equinor so a first run is never unbounded.

### Output example

One full-mode row for Equinor ASA (example values as published by the register at the time of capture; longer arrays shortened here):

```json
{
  "orgNumber": "923609016",
  "name": "EQUINOR ASA",
  "recordStatus": "active",
  "legalFormCode": "ASA",
  "legalFormDescription": "Allmennaksjeselskap",
  "naceCode": "06.100",
  "naceDescription": "Utvinning av råolje",
  "naceCodes": [
    {
      "code": "06.100",
      "description": "Utvinning av råolje",
      "role": "principal"
    },
    {
      "code": "06.200",
      "description": "Utvinning av naturgass",
      "role": "secondary"
    }
  ],
  "registeredAt": "1995-03-12",
  "foundedAt": "1972-09-18",
  "businessRegisterRegisteredAt": "1988-04-28",
  "vatRegisterRegisteredAt": "1989-07-01",
  "employeeCountRegisteredAt": "2026-10-13",
  "lastAnnualAccountsYear": 2025,
  "bankrupt": false,
  "underLiquidation": false,
  "underCompulsoryLiquidation": false,
  "underBankruptcyProceedings": null,
  "deletedAt": null,
  "businessAddress": {
    "lines": [
      "Forusbeen 50"
    ],
    "postalCode": "4035",
    "postTown": "STAVANGER",
    "municipality": "STAVANGER",
    "municipalityNumber": "1103",
    "country": "Norge",
    "countryCode": "NO"
  },
  "postalAddress": {
    "lines": [
      "Postboks 8500"
    ],
    "postalCode": "4035",
    "postTown": "STAVANGER",
    "municipality": "STAVANGER",
    "municipalityNumber": "1103",
    "country": "Norge",
    "countryCode": "NO"
  },
  "municipality": "STAVANGER",
  "municipalityNumber": "1103",
  "employees": 21231,
  "employeesRegistered": true,
  "website": "www.equinor.com",
  "email": null,
  "phone": "51 99 00 00",
  "mobile": null,
  "parentOrgNumber": null,
  "purpose": [
    "Å utvikle, produsere og markedsføre ulike former for energi, avledede"
  ],
  "activity": [
    "Selv, eller gjennom deltakelse i eller sammen med andre selskaper å"
  ],
  "historicalNames": [
    {
      "name": "Den norske stats oljeselskap a.s",
      "fromDate": "1995-03-12T16:23:00",
      "toDate": "2001-05-11T08:32:09"
    },
    {
      "name": "STATOIL ASA",
      "fromDate": "2001-05-11T08:32:09",
      "toDate": "2007-10-01T06:44:33"
    }
  ],
  "capital": {
    "amount": 5976872600.0,
    "currency": "NOK",
    "shareCount": 2390749040,
    "type": "Aksjekapital",
    "introducedAt": "2026-07-02"
  },
  "institutionalSectorCode": "1120",
  "institutionalSectorDescription": "Statlig eide aksjeselskaper mv.",
  "languageForm": "Bokmål",
  "hasGroupAffiliation": true,
  "registeredInBusinessRegister": true,
  "registeredInVatRegister": true,
  "registeredInVolunteerRegister": false,
  "registeredInFoundationRegister": false,
  "registeredInPartyRegister": false,
  "annotations": [],
  "voluntaryVatDescriptions": [
    "Utleier av bygg eller anlegg"
  ],
  "sourceUrl": "https://virksomhet.brreg.no/nb/oppslag/enheter/923609016",
  "observedAt": "2026-11-04T12:00:00+00:00",
  "changeType": null,
  "changedFields": [],
  "previousValues": {},
  "updateId": null,
  "updateAt": null,
  "updateChangeType": null,
  "updateChanges": null,
  "firstSeenAt": null,
  "lastSeenAt": null
}
```

In changes mode, `changeType` is `new`, `amended` or `closed`; `changedFields` and `previousValues` describe the change; and `updateId`, `updateAt`, `updateChangeType` and `updateChanges` carry the register's own change-notice version. In full mode those fields are null or empty. `firstSeenAt` and `lastSeenAt` are set only in changes mode.

### Dates and limitations

Registration and deletion dates are calendar dates. Change-notice times keep the UTC offset the register published. Observation time is UTC. Historical-name times are the register's local Norwegian times and are shown in ISO form without an invented offset.

The register publishes a search window of at most 10,000 companies per search; a broad search reports that window. In changes mode, companies you already follow are still checked, but new companies beyond that window are not found. Records the register has deleted or removed are shown with their published status when the source still exposes them. A register record that cannot be found is named in the run status rather than invented. A company that is absent from a capped or incomplete run is not treated as closed. The actor reports what the open register publishes and makes no beneficial-ownership or solvency claims beyond the published flags.

### Pricing

Pay per result:

- **$0.005** per actor start (one start event per GB of memory; the default 512 MB run is one start event).
- **$0.0025** per delivered company row.

Worked costs: the default 50-company Equinor search is about **$0.13**; 1,000 companies about **$2.51**. In changes mode you pay only for the companies that are new, amended or closed, so a daily check of a 500-company portfolio where five companies changed costs about **$0.018**. The first changes run reports every company as new and is charged for each.

### Scheduling a changes feed

1. Run once with `"mode": "changes"`, your `orgNumbers` (or search filters) and a `stateKey`. This builds the ledger and reports every company as `new`.
2. Save the same input as a task and schedule it daily or weekly. Each later run delivers only companies that are new, amended or closed, with `changedFields` and `previousValues`.
3. Keep `maxItems` above the number of changes you expect; if it is reached, the status says so and the rest arrive on the next run.
4. Use one `stateKey` per portfolio, and avoid overlapping runs on the same ledger.

### FAQ

**How fresh is the data?** Each run reads the open register at run time; nothing is cached except your own change ledger.

**Which companies are covered?** Entities in Enhetsregisteret, the Central Coordinating Register for Legal Entities (main units, such as AS, ASA, ENK, NUF and foundations). Sub-units are not included.

**How big can a run be?** Up to 5,000 rows per run and 2,000 organisation numbers per portfolio. A single search is limited by the register's own window of 10,000 companies; narrow broad searches with filters.

**Does it include owners, board members or accounts?** No. It returns the register's company record and status flags; it makes no beneficial-ownership or solvency claims beyond the published flags.

**Which export formats are available?** JSON, CSV, Excel and the other Apify dataset formats.

**What is the default run size?** 512 MB memory and a 300-second timeout. For very large exports, raise the timeout in the run options.

### Support

For support, open an issue on the Actor page and include the run ID.

# Actor input Schema

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

Up to 2,000 nine-digit Norwegian organisation numbers to monitor as a portfolio. Leave empty to use the search filters instead.

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

Company name or part of a name to search for. Ignored when organisation numbers are supplied.

## `naceCodes` (type: `array`):

Up to 10 Norwegian NACE codes, for example 06.100 for oil extraction or 62.010 for computer programming. Values are combined.

## `municipalityNumbers` (type: `array`):

Up to 20 four-digit municipality numbers for the business address, for example 0301 for Oslo.

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

Up to 50 legal-form codes, for example ASA for a public limited company, AS for a private limited company or ENK for a sole proprietorship.

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

Earliest registration date in the register, as YYYY-MM-DD.

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

Latest registration date in the register, as YYYY-MM-DD.

## `bankrupt` (type: `boolean`):

Leave unset for both; true keeps bankrupt companies, false excludes them.

## `underLiquidation` (type: `boolean`):

Leave unset for both; true keeps companies under liquidation, false excludes them.

## `underCompulsoryLiquidation` (type: `boolean`):

Leave unset for both; true keeps companies under compulsory liquidation or compulsory winding-up.

## `underBankruptcyProceedings` (type: `boolean`):

Leave unset for both; true keeps companies under bankruptcy, compulsory liquidation or compulsory winding-up.

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

Full returns every matching company. Changes keeps a ledger and returns only companies that are new, amended or closed since the previous run.

## `stateKey` (type: `string`):

Optional name for a changes-mode ledger. Use the same name on later runs to continue the same ledger. Leave empty to derive it from the portfolio or search.

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

Optional ISO date or timestamp. In changes mode, the register's change notices from this time on are attached to delivered rows; by default each company's notices since it was last checked are used. The first run still reports every company as new.

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

Stop after this many rows across the whole run.

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

Optional connection settings. Direct connections are used by default.

## `apifyProxyCountry` (type: `string`):

Optional two-letter country for platform connections; defaults to NO.

## Actor input object example

```json
{
  "orgNumbers": [],
  "name": "Equinor",
  "naceCodes": [],
  "municipalityNumbers": [],
  "legalForms": [],
  "mode": "full",
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "apifyProxyCountry": "NO"
}
```

# 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 = {
    "name": "Equinor",
    "mode": "full",
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("automatic/norway-company-changes-monitor").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 = {
    "name": "Equinor",
    "mode": "full",
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("automatic/norway-company-changes-monitor").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 '{
  "name": "Equinor",
  "mode": "full",
  "maxItems": 50
}' |
apify call automatic/norway-company-changes-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automatic/norway-company-changes-monitor"
        }
    }
}
```

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/ro8e38jjn4jt1cZwl/builds/5Dge1ZLdHV6yGsJaz/openapi.json
