Norway Company Register (Brreg) & Updates
Pricing
from $1.50 / 1,000 company records
Norway Company Register (Brreg) & Updates
Look up Norwegian companies by organisation number, search Brreg Enhetsregisteret by municipality, NACE, form and status, list subentities, and track register changes with a cursor. Official open data (NLOD).
Pricing
from $1.50 / 1,000 company records
Rating
0.0
(0)
Developer
Cliqto Media
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
9 days ago
Last modified
Categories
Share
Norway Company Register (Brreg) & Updates reads the official Brønnøysund Register Centre (Brreg) data for Norwegian companies. Add organisation numbers for an exact lookup, search Enhetsregisteret by name, municipality, NACE code, form and status, or fetch the latest register changes with a cursor. You get one clean row per company, with form, industry, employees, addresses, dates and a clear status: active, bankrupt, deleted or not found.
It is made for KYB checks, CRM cleaning, B2B prospect lists and change monitoring in Norway. No login and no API key are needed. A run with three organisation numbers finishes in a few seconds and costs about $0.0064.

Contents
- What it does
- Quick start
- Input
- Output
- Pricing
- Use cases
- Monitoring register changes
- API and integrations
- Limits
- Troubleshooting
- FAQ
- Data source and licence
- Support
What it does
The Actor reads the open Enhetsregisteret API of the Brønnøysund Register Centre. Each run uses one of three modes:
- Lookup. Each organisation number (organisasjonsnummer) is an exact match. The Actor checks the MOD11 check digit first. It finds both legal units (entities, hovedenheter) and their establishments (subentities, underenheter). An unknown number gives a
not_foundrow, so no input is lost. - Search. Filter the register by name words, municipality, NACE code, organisation form, bankruptcy, liquidation, VAT registration, employee count and registration date. Up to 500 rows per run.
- Updates. Read the official change feed: new units, changes, deletions and removals. Start from a date, then continue from
nextUpdateIdof the previous run without gaps or duplicates.
In lookup and search mode you can also add the subentities of each company (branches, shops, workplaces) as separate rows.
Good fit
- Check that a Norwegian supplier or customer exists, is active and is not bankrupt (KYB, onboarding).
- Fill CRM records with the official name, form, NACE code, address and VAT status.
- Build a list of companies in a municipality or with a NACE code.
- Watch the register every day for new, changed or deleted companies.
Not a fit
- Board members, CEOs, owners or other people. The Actor does not output roles or personal data.
- Street addresses and contacts of sole proprietorships (ENK). They belong to private persons, so the Actor hides them (see Personal data).
- Annual accounts, credit scores or official certificates (firmaattest).
- A full copy of the register. Brreg offers free bulk downloads for that.
Quick start
- Open the Input tab. The form already has three organisation numbers: the Brønnøysund Register Centre, Equinor and one subentity.
- Click Start.
- Open the Companies view in the Output tab. Check
name,registryStatus,orgFormandindustryCode. - Replace the numbers with your own list (up to 100), or switch Mode to search or updates.
Expected result: three complete rows in a few seconds.
Input
Choose the mode with mode. Fields of other modes are ignored.
| Field | Type | Default | Allowed values | What it does |
|---|---|---|---|---|
mode | string | lookup | lookup, search, updates | Selects the mode. |
orgNumbers | array of strings | none (form example: 3 numbers) | up to 100; 9 digits | Lookup mode. Spaces and the VAT form NO 923 609 016 MVA are accepted. A wrong check digit gives a free error row without a request. Duplicates are looked up once. |
includeSubentities | boolean | false | Lookup and search: adds subentity rows for each entity found. One extra request per entity. | |
maxSubentitiesPerEntity | integer | 20 | 1–100 | Maximum subentity rows per entity. subentitiesTotal shows how many exist. |
searchTarget | string | entities | entities, subentities | Search legal units or establishments. |
name | string | none | Search: words in the registered name, e.g. rørlegger. | |
municipalityNumbers | array of strings | empty | 4 digits, e.g. 0301 Oslo, 4601 Bergen | Search: business address (entities) or location (subentities). |
naceCodes | array of strings | empty | NACE SN2025 codes or prefixes: 62, 62.1, 62.100 | Search: industry filter. |
orgForms | array of strings | empty | AS, ASA, ENK, NUF, DA, SA, STI, BEDR, … | Search: organisation form. |
bankrupt | string | any | any, yes, no | Search, entities only. |
underLiquidation | string | any | any, yes, no | Search, entities only. |
vatRegistered | string | any | any, yes, no | Search: VAT register status. |
minEmployees, maxEmployees | integer | none | min: 0, 1 or 5+; max: 0 or 4+ | Search: registered employees. The register only accepts these values. |
registeredFrom, registeredTo | string | none | YYYY-MM-DD | Search, entities only: registration date range. |
maxResults | integer | 50 | 1–500 | Search: maximum rows. RUN_SUMMARY shows the total number of matches. |
updatesTarget | string | entities | entities, subentities | Updates: change feed of entities or subentities. |
updatesSince | string | none | date or ISO date-time with zone, not in the future | Updates: start point of the first run. |
updatesFromId | integer | none | ≥1 | Updates: nextUpdateId from the previous run. Takes priority over updatesSince. |
maxUpdates | integer | 100 | 1–500 | Updates: maximum events per run. |
includeRecordDetails | boolean | true | Updates: adds the current record (name, form, address, status) to each event. | |
includeContactDetails | boolean | false | Adds e-mail, phone and mobile of companies. Never for sole proprietorships. |
Input examples
Lookup with subentities:
{"mode": "lookup","orgNumbers": ["923609016", "NO 974 760 673 MVA"],"includeSubentities": true,"maxSubentitiesPerEntity": 10}
Search for active IT companies in Oslo with 5 or more employees:
{"mode": "search","municipalityNumbers": ["0301"],"naceCodes": ["62"],"bankrupt": "no","minEmployees": 5,"maxResults": 200}
First run of a change monitor:
{"mode": "updates","updatesSince": "2026-10-11","maxUpdates": 500}
Output
Each Dataset row has rowType: entity, subentity or update. Use the Companies, Updates and Row status views, or export all fields. The key-value store has a RUN_SUMMARY record with the run status, counts and, in updates mode, the cursor.
Row status
status | Meaning | Charged |
|---|---|---|
complete | The record was found. A deleted company is complete with isDeleted: true and registryStatus: "deleted". | yes |
partial | The company was found, but its subentities could not be listed. Read statusReason. | yes |
not_found | The number is not in the register, or Brreg removed it from open data (registryStatus: "removed_from_open_data"). | not-found price |
error | Wrong number (INVALID_ORG_NUMBER) or a source failure (RATE_LIMITED, SOURCE_UNAVAILABLE, …). | no |
On a complete entity row, statusReason notes when maxSubentitiesPerEntity limited the subentity rows.
Output example
A trimmed entity row:
{"rowType": "entity","status": "complete","input": "923609016","orgNumber": "923609016","registryStatus": "active","name": "EQUINOR ASA","orgForm": "ASA","industryCode": "06.100","industryText": "Utvinning av råolje","employees": 21272,"address": "Forusbeen 50","postalCode": "4035","city": "STAVANGER","municipalityCode": "1103","registeredDate": "1995-03-12","vatRegistered": true,"vatRegistrationDate": "1989-07-01","isBankrupt": false,"isDeleted": false,"historicalNames": [{ "name": "STATOIL ASA", "from": "2009-11-02", "to": "2018-05-16" }],"subentitiesTotal": 35,"url": "https://virksomhet.brreg.no/nb/oppslag/enheter/923609016","provider": "Brønnøysundregistrene — Enhetsregisteret","licence": "NLOD 2.0"}
null means the register has no value. It never means zero.
Fields
| Field | Type | Meaning | Example |
|---|---|---|---|
rowType | string | entity, subentity or update | "entity" |
status, statusReason, errorCode | string | Row result, see above | "complete" |
input, checksumValid | string, boolean | Your value and its MOD11 check (lookup only) | "923609016", true |
orgNumber | string | Organisation number, 9 digits | "923609016" |
registryStatus | string | active, bankrupt, under_liquidation, under_forced_liquidation, closed, deleted, removed_from_open_data | "active" |
name | string | Registered name | "EQUINOR ASA" |
orgForm, orgFormText | string | Organisation form | "ASA", "Allmennaksjeselskap" |
isSoleProprietorship, personalDataMinimized | boolean | ENK flag, and whether personal data was hidden | false |
parentOrgNumber | string or null | Parent entity (for subentities) or parent organisation | null |
industryCode … industryText3 | string or null | Up to three NACE codes (SN2025) with Norwegian text | "06.100", "Utvinning av råolje" |
sectorCode, sectorText | string or null | Institutional sector | "1120" |
employees, hasRegisteredEmployees, employeesRegisteredDate | integer, boolean, string | Registered employees. null means not registered, never zero. | 21272, true |
address, postalCode, city, municipality, municipalityCode, countryCode | string or null | Business address (entities) or location (subentities) | "Forusbeen 50", "4035", "STAVANGER" |
postalAddress, postalPostalCode, postalCity | string or null | Postal address | "Postboks 8500" |
website, email, phone, mobile | string or null | Website; contacts only with includeContactDetails | "www.equinor.com" |
foundedDate, registeredDate, startDate, closedDate | string or null | Dates YYYY-MM-DD; start and closed dates are for subentities | "1972-09-18", "1995-03-12" |
vatRegistered, vatRegistrationDate | boolean, string | VAT register (Merverdiavgiftsregisteret) | true, "1989-07-01" |
inBusinessRegister, inNonProfitRegister, inFoundationRegister, inPartyRegister, inGroup | boolean or null | Other registers and group flag (entities) | true |
isBankrupt, bankruptcyDate | boolean, string | Bankruptcy (konkurs) | false, null |
underLiquidation, underLiquidationDate, underForcedLiquidation, forcedLiquidationDate | boolean, string | Liquidation flags | false |
isDeleted, deletedDate | boolean, string | Deleted from the register | false |
lastAnnualAccountsYear | string or null | Last submitted annual accounts | "2025" |
activityDescription | string or null | Registered activity text; null on minimized rows | "Selv, eller gjennom deltakelse …" |
historicalNames | array | Earlier names: {name, from, to} | [{"name": "STATOIL ASA", …}] |
subentitiesTotal, subentitiesReturned | integer or null | Subentities in the register and rows written | 35, 10 |
updateId, updateType, updateDate, changedFields | Update rows: event ID, Ny/Endring/Sletting/Fjernet, time, changed field names | "Endring" | |
searchRank | integer or null | Position in search results | 1 |
url, sourceUrl | string | Public register page and the API URL read | |
fetchedAt, provider, licence | string | Read time, source and licence | "NLOD 2.0" |
Personal data
A sole proprietorship (ENK) is a private person's business. For ENK rows and their subentities the Actor sets personalDataMinimized: true and hides the street address, postal address, e-mail, phone, mobile and activity text. Name, form, industry, municipality and postal code stay, as the public minimum. The same applies to a subentity whose parent form cannot be read. The Actor never outputs roles (board members, CEO, owners).
Run summary
RUN_SUMMARY.status is one of COMPLETE, PARTIAL, NOT_FOUND, NO_RESULTS, CAPPED (stopped at your cost limit), ERROR, INVALID_INPUT or CANCELLED. counts shows rows by status and charged rows. In search mode, search.total is the number of matches. In updates mode, updates has nextUpdateId and hasMore.
Pricing
Pay per event. Platform usage is included.
| Event | Price | When |
|---|---|---|
| Actor start | $0.001 | Once per run (per GB of memory; the default 256 MB counts once) |
| Company record | $0.0018 | Each complete or partial entity or subentity row. Lower on higher Apify plans: $0.0017 Bronze, $0.0016 Silver, $0.0015 Gold. |
| Not-found lookup | $0.0005 | Each not_found row |
| Update event | $0.0005 | Each row in updates mode |
error rows are free. An empty search costs only the start.
| Run | Example cost (Free plan) |
|---|---|
| 3 organisation numbers (form example) | $0.0064 |
| 10 organisation numbers | $0.019 |
| 100 organisation numbers | $0.181 |
| Search, 500 rows | $0.901 |
| 500 update events | $0.251 |
| 100 unknown numbers | $0.051 |
Subentities add up fast: 100 large employers with up to 100 subentities each gave 5,840 rows in our test. Set Maximum cost per run in the run options to cap your spend. The Actor stops before a paid row that does not fit and reports CAPPED.
Use cases
| Buyer job | Mode and input | Key output fields |
|---|---|---|
| Verify a company (KYB) | lookup, orgNumbers | status, registryStatus, isBankrupt, underLiquidation, isDeleted, vatRegistered |
| Clean CRM records | lookup, orgNumbers | name, orgForm, industryCode, address, postalCode, city, website |
| Map branches of a company | lookup + includeSubentities | subentity rows: orgNumber, parentOrgNumber, address, employees, closedDate |
| Prospect list by area and industry | search, municipalityNumbers + naceCodes | name, employees, industryText, registeredDate, searchRank |
| Daily change monitor | updates, updatesSince, then updatesFromId | updateType, updateDate, changedFields, registryStatus |
| New companies in a region | search, registeredFrom + municipalityNumbers | name, orgForm, registeredDate, industryCode |
Monitoring register changes
- Run updates mode once with
updatesSince(for example yesterday). - Read
RUN_SUMMARY.updates.nextUpdateId. - Next time, start with
updatesFromIdset to that value. You get the events after the last one, with no gaps or duplicates. - If
hasMoreistrue, more events are waiting: run again with the newnextUpdateId.
Event types: Ny (new), Endring (change), Sletting (deleted) and Fjernet (removed from open data; the Actor does not keep or show the old record). Brreg publishes a few thousand entity events on a normal weekday.
To run this every day, save the input as an Apify task and add a schedule. A schedule cannot change updatesFromId by itself, so for a gap-free monitor read nextUpdateId from each run through the API.
API and integrations
Start a run through the Apify API (POST /v2/acts/cliqtomedia~norway-brreg-company-register/runs) with the same JSON input, then read the Dataset. Export to CSV, Excel or JSON, or connect the run to other tools with Apify integrations. Join rows on orgNumber; subentities link to their parent through parentOrgNumber.
Coming from another Brreg tool? Common field names here: postalCode (zip), postalAddress / postalPostalCode / postalCity (post address), countryCode, isBankrupt, registeredDate (registration date in Enhetsregisteret), inNonProfitRegister (Frivillighetsregisteret), underForcedLiquidation. Missing values are null, not empty strings.
Use with AI agents (MCP)
AI agents can call this Actor through the Apify MCP server: add https://mcp.apify.com?tools=cliqtomedia/norway-brreg-company-register to your MCP client (Claude, Cursor, VS Code and others). The MCP server needs your Apify account (OAuth sign-in or an Apify API token); Brreg itself needs no key. The smallest useful input:
{ "orgNumbers": ["923609016"] }
Key output fields for an agent: status, name, registryStatus, orgForm, industryCode, employees, isBankrupt, isDeleted. A lookup of 10 numbers takes a few seconds and costs about $0.019. A lookup of 100 numbers with many subentities can take about a minute, so the agent may need to poll the run. Search results match on name words, so an agent should confirm a company by orgNumber.
Limits
- Lookup: up to 100 organisation numbers per run. Search: up to 500 rows. Updates: up to 500 events.
- Up to 100 subentities per entity.
- The Actor sends about 3 requests per second and stops source work after 240 seconds. Our largest test (100 numbers, 5,840 rows) took 55 seconds.
- Search uses the register's own filters. Employee filters accept only the values the register supports (see Input).
- NACE codes follow SN2025 (for example
62.100). Old SN2007 codes like62.010find nothing. - Data is read live. Brreg updates the open data during the day; there is no separate source timestamp per record.
Troubleshooting
| Symptom | Check | Action |
|---|---|---|
error row with INVALID_ORG_NUMBER | checksumValid | The number has a typo. Check the 9 digits. |
not_found for a real company | registryStatus | removed_from_open_data means Brreg removed it. Otherwise check the number. |
| A deleted company | isDeleted, deletedDate | This is correct register data, not an error. |
Address or contacts are null | personalDataMinimized | Sole proprietorships are minimized on purpose. Contacts need includeContactDetails. |
Search returns NO_RESULTS | NACE codes, employee values | Use SN2025 codes and allowed employee values. |
Fewer subentity rows than subentitiesTotal | statusReason, maxSubentitiesPerEntity | Raise the limit (up to 100). |
CAPPED | Run options | Raise Maximum cost per run or send fewer numbers. |
INVALID_INPUT | RUN_SUMMARY.message | Common causes: no valid number in lookup mode, a date in the future, updates mode without updatesSince or updatesFromId. |
RATE_LIMITED or SOURCE_UNAVAILABLE rows | RUN_SUMMARY.http | Run the failed numbers again later. |
FAQ
Do I need an API key or a Norwegian account?
No. Brreg's open API is free and needs no key. You only need your Apify account.
What is the difference between an entity and a subentity?
An entity (hovedenhet) is the legal unit, for example an AS. A subentity (underenhet) is an establishment of that unit, such as a shop or an office, with its own organisation number. Lookup finds both kinds.
Why are board members and owners not included?
They are personal data. This Actor gives company data only.
How fresh is the data?
Each run reads Brreg live. fetchedAt is the time of reading. The updates mode shows each change with its event time.
Can I use the data commercially?
Yes. Enhetsregisteret data is published under the Norwegian Licence for Open Government Data (NLOD 2.0), which allows commercial reuse with attribution. Personal data is outside that licence; contact data must be used within GDPR and Norwegian marketing law.
Data source and licence
Data: Enhetsregisteret of the Brønnøysund Register Centre (Brønnøysundregistrene), through its open API, under the Norwegian Licence for Open Government Data (NLOD 2.0). When you reuse the data, name the source. This Actor is independent and not endorsed by the Brønnøysund Register Centre.
Support
Use the Issues tab of this Actor. Add the run ID, the mode and the statusReason or errorCode you saw. Do not send API tokens or private data.