Norway Companies Scraper avatar

Norway Companies Scraper

Pricing

from $11.90 / 1,000 results

Go to Apify Store
Norway Companies Scraper

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

Norm Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

Norm Data

🇳🇴 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

CapabilityThis actorOther Brreg scrapers on Apify
Name search + organisation number lookupyesyes
Batch list of organisation numbers in one runyessome
Filters: municipality, NACE, legal form, postal codeyesyes
Filters: employee range, VAT status, sector, date rangesyessome
Bankrupt-only filteryesrare
Officers: board, chair, CEO, auditor (full array with birth dates)yesnames only, or none
Filed annual accounts, multi-yearyesrare
Sub-units: every establishment of a companyyesno
Change feed: entities registered or changed since a dateyesno
Free-plan previewyesrare

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

FieldApplies toDescription
maxItemsallCeiling on rows written.
modeallsearch, lookup, subunits or updates.
querysearchFull or partial company name.
municipalitysearchMunicipality number (e.g. 0301 Oslo).
industryCodesearchNACE / SN2007 code, prefix match.
orgFormsearchLegal form code (AS, ASA, ENK, NUF, ...).
postalCodesearchFour-digit postal code.
employeesFrom / employeesTosearchRegistered employee range.
sectorCodesearchInstitutional sector code.
vatRegisteredsearchany, yes, no.
bankruptOnlysearchOnly companies flagged bankrupt.
foundedFrom / foundedTosearchFounding date range, YYYY-MM-DD.
registeredFrom / registeredTosearchEntity-register date range, YYYY-MM-DD.
orgNumberslookupNine-digit organisation numbers. Separators are stripped.
parentOrgNumbersubunitsReturn the establishments under this company.
changedSinceupdatesYYYY-MM-DD.
includeRolessearch, lookup, subunitsAdd CEO, chair and officers.
includeFinancialssearch, lookupAdd 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.

FieldDescription
nameRegistered name.
org_numberNine-digit organisation number.
activeFalse when bankrupt, under liquidation, or under forced liquidation.
org_form / org_form_labelLegal form code and Norwegian label.
industry_code / industry_label (and _2, _3)NACE codes and labels.
sector_code / sector_labelInstitutional sector.
employeesRegistered employee count.
ceo / chair / officersBoard and management (with includeRoles).
website / phone / emailContact details where registered.
business_address ... business_countryBusiness address, broken into parts.
postal_address ... postal_cityPostal address.
founded_date / age_years / registered_dateDates and derived age.
vat_registered / vat_registered_dateVAT (MVA) register status.
bankrupt / bankruptcy_date / under_liquidation / under_forced_liquidationDistress flags.
part_of_group / parent_org_numberGroup membership.
share_capital / share_capital_currency / share_capital_sharesRegistered capital.
historical_namesPrevious names with date ranges.
annual_accountsFiled accounts per year (with includeFinancials).
is_sub_unitTrue for establishment rows.
change_type / changed_at / update_idChange-feed rows only.
queryIn Look up mode, the number you asked for. null otherwise.
errornull on a normal row. "not found" on a Look up row whose number did not resolve (every other field is then null).
urlLink to the public registry page.
scraped_atISO 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

# JSON
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"
# CSV
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"
# Paginate large datasets
curl "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 includeRoles on, a company adds one detail record charge when board / CEO data is found; with includeFinancials on, 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 install
bun test # offline: input parsing and normalisation against synthetic fixtures
bun run src/main.ts # reads storage/key_value_stores/default/INPUT.json