How to Query Norway BRREG Business Register in Python (Companies, Officers, AML)
Norway's BRREG business register is public and free, but navigating the API to get companies plus officer roles requires multiple calls per entity. Learn how to extract company status, industry, address, and full officer rosters as structured JSON.
The actor referenced in this article. Pay only for results delivered.
Norway’s Brønnøysund Register Centre (BRREG) is one of the most structured and complete public company registries in the world. It covers 1.16 million registered entities. The officer roles endpoint is particularly valuable for AML and KYB: it returns typed role categories (not just a flat list of names) including CEOs, board members, and authorized signatories. Here is how to use it.
Try it live: Norway Company Register (BRREG), 13 Fields + Officers. Pay per result delivered. Failed and empty results are never charged.
What each entity record contains
- Organization name and number (9-digit)
- Company status (active, dissolved, bankrupt, etc.)
- Formation date and registered municipality
- NACE industry code and description
- Employee band
- Registered address
- Full officer roster: role type, name, and country of residence
Common use cases
KYB and onboarding. Verify that a Norwegian counterparty or supplier is an active registered entity and surface its beneficial ownership structure for due diligence.
AML screening. Get the natural persons behind a legal entity, CEO, board members, and authorized signatories, by name and country of residence for PEP and sanctions checks.
Market research. Count active companies by industry code (NACE) and municipality to map Norwegian companies by sector and geography.
Partner vetting. Before engaging a Norwegian agency, contractor, or distributor, verify their entity status and check who the legal signatories are.
Using the Apify actor
import apify_client
client = apify_client.ApifyClient('YOUR_APIFY_TOKEN')
run_input = {
"query": "Equinor",
"maxResults": 10,
"includeOfficers": True,
}
run = client.actor('themineworks/norway-brreg-entity-search').call(run_input=run_input)
for entity in client.dataset(run['defaultDatasetId']).iterate_items():
if entity.get('_type'):
continue
print(f"{entity.get('name')} ({entity.get('org_number')})")
print(f" Status: {entity.get('status')} | Founded: {entity.get('founded_date', 'N/A')}")
print(f" Industry: {entity.get('nace_description', 'N/A')} ({entity.get('nace_code', 'N/A')})")
print(f" Address: {entity.get('municipality', 'N/A')}, {entity.get('county', 'N/A')}")
print(f" Employees: {entity.get('employees', 'N/A')}")
print(f" Officers ({len(entity.get('officers', []))}):")
for officer in entity.get('officers', []):
print(f" {officer.get('role_description')}: {officer.get('name')} ({officer.get('country_of_residence', 'NO')})")
Batch KYB check for a supplier list
SUPPLIERS = [
"Aker Solutions",
"Kongsberg Gruppen",
"Yara International",
]
for name in SUPPLIERS:
run = client.actor('themineworks/norway-brreg-entity-search').call(
run_input={"query": name, "maxResults": 1, "includeOfficers": True}
)
results = [r for r in client.dataset(run['defaultDatasetId']).iterate_items() if not r.get('_type')]
if results:
e = results[0]
print(f"\n{name}")
print(f" Status: {e.get('status')} | Org: {e.get('org_number')}")
officers = e.get('officers', [])
ceo = next((o for o in officers if 'daglig' in o.get('role_code', '').lower()), None)
if ceo:
print(f" CEO: {ceo.get('name')} ({ceo.get('country_of_residence', 'NO')})")
else:
print(f"\n{name}: not found")
Mapping companies by industry
from collections import Counter
run_input = {
"naceCode": "62",
"maxResults": 500,
"includeOfficers": False,
}
run = client.actor('themineworks/norway-brreg-entity-search').call(run_input=run_input)
results = [r for r in client.dataset(run['defaultDatasetId']).iterate_items() if not r.get('_type')]
by_municipality = Counter(r.get('municipality', 'Unknown') for r in results if r.get('status') == 'active')
print("Active IT companies by municipality:")
for city, count in by_municipality.most_common(15):
print(f" {city}: {count}")
Officer nationality screening
Flag entities where key officers are based outside Norway:
for entity in results:
foreign_signatories = [
o for o in entity.get('officers', [])
if o.get('country_of_residence') not in ('NO', None)
and 'sign' in o.get('role_code', '').lower()
]
if foreign_signatories:
print(f"\n{entity.get('name')} has foreign authorized signatories:")
for o in foreign_signatories:
print(f" {o.get('name')}: {o.get('country_of_residence')} ({o.get('role_description')})")
Pricing
$0.0025 per entity. Officer data is included at no extra cost.
Explore the scraper referenced in this article: inputs, outputs, and pricing, then run it on Apify.
Frequently asked questions
Is BRREG publicly accessible? +
Yes. Brønnøysund Register Centre (BRREG) is the Norwegian government business registry, and its data is freely accessible via public REST API at data.brreg.no. No API key is required.
What officer data is included? +
The scraper returns the full officer roster including role type (CEO, board member, board chair, authorized signatory, deputy), full name, and country of residence for each officer.
Can I search by organization number? +
Yes. You can search by company name (text search across 1.16 million entities) or look up a specific entity by its 9-digit Norwegian organization number.
Airbnb Scraper: Listing Prices, Ratings, and Availability Without the API
Airbnb has no public listings API. Here's how to pull nightly price, rating, superhost status and coordinates from Airbnb search results using Python.
Realtor.com Scraper: Property and Agent Data Without the MLS Paywall
Scrape Realtor.com listings in Python: price, beds, baths, county, and the listing agent + brokerage office on every record. No login, no API key.
Redfin Scraper: For-Sale and Sold Property Data in Python (No API Key)
Scrape Redfin listings by city, ZIP, or URL in Python: price, beds, baths, sqft, agent, MLS status, and coordinates. No login, no browser, no unblocker.
Zillow Property Details API: Zestimate, Tax History, and Agent Data by URL
Pull full Zillow property records by URL or ZPID in Python: price history, tax history, schools, HOA, and agent data the official API never exposed.