How to use it: 3 steps
- Make a free Apify accountApify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
974760673in Organisation numbers. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
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.
- 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.
Good for
- 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 good 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.
Who uses it
KYB teams
Check that a Norwegian partner is active and not bankrupt.
Sales teams
Build lists by municipality, industry or staff size.
Data teams
Watch new, changed and deleted companies every day.
Price
Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.
| What you pay for | Price | When |
|---|---|---|
| Start fee | $0.001 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
| Company record | $0.0018 (from $0.0015 on paid Apify plans) | One found Norwegian entity or subentity (complete or partial row) saved to the Dataset. |
| Not-found lookup | $0.0005 | One valid organisation number that is not in the open Brreg register, saved as a not_found row. |
| Update event | $0.0005 | One register change event (new, changed, deleted or removed unit) saved to the Dataset in updates mode. |
Examples
- One company: about $0.0028.
- 1,000 companies: about $1.80.
- Every day 100 companies, for 30 days: about $5.43 a month.
Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed. That is enough for about 2,700 companies.
Prices checked on 24 October 2026. See the current price on Apify.
Questions
Do I need a Brreg API key?
No. The Brreg open API is free and needs no key.
What is a subentity?
It is a branch of a company, like a shop or an office.
Are board members or owners included?
No. They are personal data. The tool gives company data only.
Can I use the data commercially?
Yes. It is under NLOD 2.0, which allows reuse with attribution.
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.
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.
Details
Step by step on Apify
- 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.
Use cases
| Task | 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 |
Tips for better results
- Use SN2025 NACE codes like 62.100. Old codes find nothing.
- In updates mode, start the next run from nextUpdateId.
- Turn on subentities to get shops and offices as their own rows.
Limits and good to know
- 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. |
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"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"
}Use it from code
Actor ID: cliqtomedia/norway-brreg-company-register. You need your Apify API token from Apify Console → Settings → API & Integrations.
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/norway-brreg-company-register").call(run_input={
"mode": "lookup",
"orgNumbers": [
"974760673",
"923609016",
"994667084"
]
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~norway-brreg-company-register/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"mode": "lookup", "orgNumbers": ["974760673", "923609016", "994667084"]}'# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("cliqtomedia/norway-brreg-company-register")
result = tool.invoke({"run_input": {"mode": "lookup", "orgNumbers": ["974760673", "923609016", "994667084"]}})
print(result)The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.
Data fields (40)
| Field | Type | Meaning |
|---|---|---|
rowType | string | Row type: entity (hovedenhet / legal unit), subentity (underenhet / establishment) or update (one event of the register change feed). |
status | string | Row result: complete, partial, not_found or error. See statusReason and errorCode. |
statusReason | string | Plain-English reason for a partial, not_found or error row; on a complete entity row, a note when subentities were limited by maxSubentitiesPerEntity; otherwise null. |
errorCode | string | Machine code for error rows, e.g. INVALID_ORG_NUMBER, RATE_LIMITED, SOURCE_UNAVAILABLE; null otherwise. |
input | string | The value as you entered it (lookup mode); null for search and update rows. |
orgNumber | string | Norwegian organisation number (organisasjonsnummer), 9 digits. Null only when the input was not a 9-digit number. |
checksumValid | boolean | Whether the input passes the MOD11 check digit (lookup mode); null for search and update rows. |
registryStatus | string | Summary status: active, bankrupt, under_liquidation, under_forced_liquidation, closed (subentity closed), deleted (slettet) or removed_from_open_data (HTTP 410 / Fjernet). |
name | string | Registered name (navn). |
orgForm | string | Organisation form code, e.g. AS, ASA, ENK, NUF, BEDR. |
orgFormText | string | Organisation form description in Norwegian, e.g. Aksjeselskap. |
isSoleProprietorship | boolean | True for ENK (enkeltpersonforetak) and for subentities of an ENK; their street address and contacts are withheld. |
personalDataMinimized | boolean | True when street address and contact fields were withheld to protect a natural person (sole proprietorship). |
parentOrgNumber | string | Parent unit (overordnetEnhet): the legal unit of a subentity, or the superior body of a public entity. |
industryCode | string | Main NACE industry code (næringskode 1, SN2025), e.g. 62.100. |
industryText | string | Main industry description. |
industryCode2 | string | Second NACE industry code. |
industryText2 | string | Second industry description. |
industryCode3 | string | Third NACE industry code. |
industryText3 | string | Third industry description. |
sectorCode | string | Institutional sector code (entities only). |
sectorText | string | Institutional sector description. |
employees | integer | Number of employees registered in the Aa-register; null when none are registered (not zero). |
hasRegisteredEmployees | boolean | Whether employees are registered. |
employeesRegisteredDate | string | Date the employee count was last registered (YYYY-MM-DD). |
address | string | Street address lines joined with a comma (forretningsadresse, or beliggenhetsadresse for subentities). Null for sole proprietorships. |
postalCode | string | Postal code of the business address. |
city | string | Post town of the business address. |
municipality | string | Municipality (kommune) name. |
municipalityCode | string | Municipality number, 4 digits, e.g. 0301 (Oslo). |
countryCode | string | Country code of the business address, e.g. NO. |
postalAddress | string | Postal address lines (postadresse). Null for sole proprietorships. |
postalPostalCode | string | Postal code of the postal address. |
postalCity | string | Post town of the postal address. |
website | string | Website (hjemmeside) as registered. |
email | string | Registered e-mail; only with includeContactDetails and never for sole proprietorships. |
phone | string | Registered phone; only with includeContactDetails and never for sole proprietorships. |
mobile | string | Registered mobile; only with includeContactDetails and never for sole proprietorships. |
foundedDate | string | Founding date (stiftelsesdato), YYYY-MM-DD. |
registeredDate | string | Date registered in Enhetsregisteret, YYYY-MM-DD. |
Input settings (23)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Mode required | mode | string | "lookup" |
| Organisation numbers | orgNumbers | array | ["974760673", "923609016", "994667084"] |
| Include subentities | includeSubentities | boolean | false |
| Max subentities per entity | maxSubentitiesPerEntity | integer | 20 |
| Search target | searchTarget | string | "entities" |
| Name contains | name | string | |
| Municipality numbers | municipalityNumbers | array | |
| NACE industry codes | naceCodes | array | |
| Organisation forms | orgForms | array | |
| Bankrupt | bankrupt | string | "any" |
| Under liquidation | underLiquidation | string | "any" |
| VAT registered | vatRegistered | string | "any" |
| Min employees | minEmployees | integer | |
| Max employees | maxEmployees | integer | |
| Registered from | registeredFrom | string | |
| Registered to | registeredTo | string | |
| Max search results | maxResults | integer | 50 |
| Updates of | updatesTarget | string | "entities" |
| Changes since | updatesSince | string | |
| Continue from update ID | updatesFromId | integer | |
| Max update events | maxUpdates | integer | 100 |
| Include current record details | includeRecordDetails | boolean | true |
| Include e-mail and phone | includeContactDetails | boolean | false |
Use cases with this tool
Each guide shows all the steps and the other tools.
