Norway Companies Scraper
Pricing
from $11.90 / 1,000 results
Norway Companies Scraper
Scrape Norway's Brønnøysund company register by name or filter (legal form, NACE, municipality, employees, VAT, dates). Clean firmographics with CEO, board, annual accounts, address and share capital. Batch lookup by org number, sub-units of a parent, and a change feed for CRM sync.
Pricing
from $11.90 / 1,000 results
Rating
0.0
(0)
Developer
Norm Data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share

🇳🇴 Norway Companies Scraper
Scrape the Norwegian company register (Brreg / Brønnøysundregistrene, the Brønnøysund Register Centre) with no API key and no login. Search over a million Norwegian entities by name or by structured filters, look up a batch of organisation numbers, pull every establishment of a company, or read the register's change feed. Get clean structured company data for KYB, compliance and B2B lead generation: legal form, NACE industry codes, addresses, employees, VAT (MVA) and bankruptcy status, the full board, chair, CEO and auditor, share capital, and filed annual accounts.
Here is one real row (trimmed), for Equinor ASA:
{"org_number": "923609016","name": "EQUINOR ASA","active": true,"age_years": 53,"org_form": "ASA","org_form_label": "Allmennaksjeselskap","industry_code": "06.100","industry_label": "Utvinning av råolje","sector_label": "Statlig eide aksjeselskaper mv.","employees": 21239,"ceo": "Anders Opedal","chair": "Jarle Kjell Roth","website": "www.equinor.com","phone": "51 99 00 00","business_address": "Forusbeen 50","business_city": "STAVANGER","business_municipality": "STAVANGER","founded_date": "1972-09-18","registered_date": "1995-03-12","vat_registered": true,"bankrupt": false,"under_liquidation": false,"part_of_group": true,"share_capital": 5976872600,"share_capital_currency": "NOK","historical_names": [{ "name": "STATOIL ASA", "from": "2001-05-11", "to": "2018-05-16" }],"officers": [{ "role_code": "DAGL", "role": "Daglig leder", "name": "Anders Opedal", "is_person": true, "birth_date": "1968-05-04", "active": true }],"annual_accounts": [{ "year": "2025", "currency": "USD", "revenue": 67956000000, "operating_result": 5563000000, "annual_result": 5731000000, "total_assets": 103432000000, "total_equity": 39182000000, "total_debt": 64249000000 }],"url": "https://virksomhet.brreg.no/nb/oppslag/enheter/923609016","query": null,"error": null,"scraped_at": "2026-09-08T15:20:57.000Z"}
What it does
Reads Norway's central register of business entities (Enhetsregisteret and Regnskapsregisteret), published as open data by the Brønnøysund Register Centre. Four modes:
- Search companies by name and any of: municipality, NACE industry code, legal form, postal code, employee range, institutional sector, VAT status, founding date range, registration date range, bankrupt-only. Filters combine with logical AND.
- Look up by organisation number: paste a batch of nine-digit numbers, get the full record
for each. Works for companies and sub-units. Numbers that do not resolve come back as a row
with
error: "not found", so the output always has one row per input. The KYB / CRM-refresh workflow. - Sub-units (establishments): every establishment (branch, site, department) registered under a parent company, each with its own address, employees and industry code. Or a standalone sub-unit search.
- Change feed: every entity registered or changed on or after a date, newest first. Keep a local copy in sync, or watch for new companies, bankruptcies and liquidations.
Two optional enrichments, on by default:
- Board and CEO (
includeRoles): CEO, chair, and the full officer list with role codes, role names, birth dates, and an active flag. Company officers such as the auditor carry their own organisation number. One extra request per company. - Annual accounts (
includeFinancials): filed accounts for the years on record, with revenue, operating result, annual result, total assets, equity and debt. One extra request per company.
Missing source values are returned as null, never invented.
Why this scraper
- No API key, no login, no captcha. Public open data, delivered clean and flat.
- Two modes nobody else on Apify has: every establishment of a company, and the register's change feed for monitoring and CRM sync.
- Real KYB depth: board, chair, CEO, auditor, share capital, sector code, group membership, historical names and statutory purpose on every record.
- Multi-year financials: revenue, results, assets, equity and debt from the filed accounts.
- Export anywhere: JSON, CSV or Excel, from the Apify API, CLI or any language.
How it compares
| Capability | This actor | Other Brreg scrapers on Apify |
|---|---|---|
| Name search + organisation number lookup | yes | yes |
| Batch list of organisation numbers in one run | yes | some |
| Filters: municipality, NACE, legal form, postal code | yes | yes |
| Filters: employee range, VAT status, sector, date ranges | yes | some |
| Bankrupt-only filter | yes | rare |
| Officers: board, chair, CEO, auditor (full array with birth dates) | yes | names only, or none |
| Filed annual accounts, multi-year | yes | rare |
| Sub-units: every establishment of a company | yes | no |
| Change feed: entities registered or changed since a date | yes | no |
| Free-plan preview | yes | rare |
Use cases
- KYB and KYC / compliance. Verify a Norwegian counterparty by organisation number, capture legal form, status, officers and financials for the onboarding file.
- B2B lead generation. Build targeted company lists by industry (NACE), municipality, size (employee range) or VAT status, with phone, website and address.
- CRM enrichment. Feed a list of organisation numbers and refresh every account with current registry fields, leadership and accounts.
- Monitoring. Run the change feed on a schedule to catch new registrations, name changes, bankruptcies and liquidations as the register publishes them.
- Credit and risk. Pull revenue, equity, liabilities and multi-year accounts for a portfolio of companies.
- Location mapping. Use sub-units mode to list every site a company operates from.
Quickstart
{"mode": "search","query": "Equinor","includeRoles": true,"includeFinancials": true,"maxItems": 10}
Every AS company in Oslo with 20 to 100 employees, registered for VAT:
{"mode": "search","municipality": "0301","orgForm": "AS","employeesFrom": 20,"employeesTo": 100,"vatRegistered": "yes","maxItems": 500}
Refresh a list of companies:
{ "mode": "lookup", "orgNumbers": ["923609016", "974760673"] }
Every establishment of a company:
{ "mode": "subunits", "parentOrgNumber": "923609016" }
New or changed companies since a date:
{ "mode": "updates", "changedSince": "2026-09-01", "maxItems": 1000 }
Input reference
| Field | Applies to | Description |
|---|---|---|
maxItems | all | Ceiling on rows written. |
mode | all | search, lookup, subunits or updates. |
query | search | Full or partial company name. |
municipality | search | Municipality number (e.g. 0301 Oslo). |
industryCode | search | NACE / SN2007 code, prefix match. |
orgForm | search | Legal form code (AS, ASA, ENK, NUF, ...). |
postalCode | search | Four-digit postal code. |
employeesFrom / employeesTo | search | Registered employee range. |
sectorCode | search | Institutional sector code. |
vatRegistered | search | any, yes, no. |
bankruptOnly | search | Only companies flagged bankrupt. |
foundedFrom / foundedTo | search | Founding date range, YYYY-MM-DD. |
registeredFrom / registeredTo | search | Entity-register date range, YYYY-MM-DD. |
orgNumbers | lookup | Nine-digit organisation numbers. Separators are stripped. |
parentOrgNumber | subunits | Return the establishments under this company. |
changedSince | updates | YYYY-MM-DD. |
includeRoles | search, lookup, subunits | Add CEO, chair and officers. |
includeFinancials | search, lookup | Add filed annual accounts. |
Output reference (selected)
Columns are ordered for reading: identity, classification, size, people, contact, address, dates, status, then the nested and provenance fields.
| Field | Description |
|---|---|
name | Registered name. |
org_number | Nine-digit organisation number. |
active | False when bankrupt, under liquidation, or under forced liquidation. |
org_form / org_form_label | Legal form code and Norwegian label. |
industry_code / industry_label (and _2, _3) | NACE codes and labels. |
sector_code / sector_label | Institutional sector. |
employees | Registered employee count. |
ceo / chair / officers | Board and management (with includeRoles). |
website / phone / email | Contact details where registered. |
business_address ... business_country | Business address, broken into parts. |
postal_address ... postal_city | Postal address. |
founded_date / age_years / registered_date | Dates and derived age. |
vat_registered / vat_registered_date | VAT (MVA) register status. |
bankrupt / bankruptcy_date / under_liquidation / under_forced_liquidation | Distress flags. |
part_of_group / parent_org_number | Group membership. |
share_capital / share_capital_currency / share_capital_shares | Registered capital. |
historical_names | Previous names with date ranges. |
annual_accounts | Filed accounts per year (with includeFinancials). |
is_sub_unit | True for establishment rows. |
change_type / changed_at / update_id | Change-feed rows only. |
query | In Look up mode, the number you asked for. null otherwise. |
error | null on a normal row. "not found" on a Look up row whose number did not resolve (every other field is then null). |
url | Link to the public registry page. |
scraped_at | ISO 8601 timestamp of when the row was collected. |
Run via API and CLI
curl -X POST "https://api.apify.com/v2/acts/USERNAME~norway-companies-scraper/run-sync-get-dataset-items?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"mode":"search","municipality":"0301","orgForm":"AS","maxItems":200}'
$apify call USERNAME/norway-companies-scraper --input '{"mode":"lookup","orgNumbers":["923609016"]}'
Fetch results
# JSONcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"# CSVcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"# Paginate large datasetscurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"
<DATASET_ID> is defaultDatasetId on the run object.
Billing and limits
- Pay per result. Billed per company row written to the dataset. The current rates are on the Actor's Pricing tab.
- Enrichment is billed separately, and only when it returns data. With
includeRoleson, a company adds one detail record charge when board / CEO data is found; withincludeFinancialson, it adds one financials record charge only when the company has filed accounts. A company with no officers or no filed accounts is not charged the add-on, and sub-unit rows are billed as base rows only. - No charge on failure. A run that produces zero rows fails with a message and is not billed.
- A Look up number that does not resolve still writes one
error: "not found"row and is billed as a base row, so your output count matches your input list. - Free Apify plans run the built-in 10-row sample only. Upgrade to run your own settings.
- A 1,000-company run with both enrichments on finishes in about a minute.
FAQ and troubleshooting
Do I need an API key or login? No. The Norwegian company register is public open data, no key, no login, no captcha.
Can I look up a company by organisation number? Yes, use mode: "lookup" with orgNumbers.
It accepts one or many, and resolves both companies and sub-units. A number that does not
resolve comes back as a row with query set and error: "not found", so you keep one row per
input.
A run returned 0 rows. Why? The name or filter combination matched nothing. Loosen filters
(drop municipality, industryCode or the employee range), or check the spelling. Zero-row runs
are not charged.
How does billing work? Three line items on the Pricing tab: the base company row, an optional detail record (board, CEO, officers) and an optional financials record (filed annual accounts). The two add-ons are billed per company and only when that data is actually returned, so you never pay for an empty column.
Why are ceo, chair and officers missing? includeRoles was off. Turn it on.
Why is annual_accounts missing or empty? Either includeFinancials was off, or the company
has not filed accounts (common for new, dormant or very small entities). Missing values are
null, never invented.
How current is the data? It reflects the register at run time. New registrations, status changes and freshly filed accounts appear as soon as the register publishes them.
Why are names and labels in Norwegian? The register holds them as filed. It does not hold English company names.
Is this an official Brønnøysund tool? No. Independent, not affiliated with the Brønnøysund Register Centre. It reads only data the register publishes as open data.
Local development
bun installbun test # offline: input parsing and normalisation against synthetic fixturesbun run src/main.ts # reads storage/key_value_stores/default/INPUT.json