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 only for results delivered, no result no charge.
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.
GitHub Repo Intelligence: Vet Any Dependency Before You Add It
Pull stars, forks, contributors, commit recency, latest release and full README for any public GitHub repo in one call. No token required, MCP-ready for agents doing dependency checks.
Bilibili Scraper: Video, Creator and Search Data in Python
Pull Bilibili videos by keyword, URL or creator ID: titles, view and like counts, duration, author stats. Plain HTTP, no cookies, no login required.
SEEK Jobs Scraper: Australian Job Listings in Python
How to pull SEEK.com.au job listings by keyword, location, work type and salary band in Python: title, company, salary range, apply link, no login or API key.