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.
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 the Norwegian corporate landscape 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")
Industry landscape mapping
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.005 per entity. Officer data is included at no extra cost.
Explore the scraper referenced in this article — see 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.
Maps Leads: Verified Email Extraction from Google Maps Business Listings
How to pull B2B leads from Google Maps with MX-verified emails, past the official API's 120-result cap, and pay only for contactable businesses.
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.