# Estonia Company Data, Contacts & Ownership (Äriregister) (`foxlabs/estonia-company-data`) Actor

Search 358K+ Estonian companies from the official Business Register. Verified identity, address, email & phone, VAT, capital and activities (EMTAK) — plus optional ownership: board, shareholders & beneficial owners (UBO). Open data (CC BY 4.0), no key.

- **URL**: https://apify.com/foxlabs/estonia-company-data.md
- **Developed by:** [Berkan Kaplan](https://apify.com/foxlabs) (community)
- **Categories:** Lead generation
- **Stats:** 3 total users, 0 monthly users, 88.6% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

<p align="center"><a href="https://apify.com/foxlabs/estonia-company-data"><img src="https://data.foxlabs.com.tr/img/estonia-company-data-banner.svg" alt="Estonia Company Data, Contacts & Ownership" width="100%" /></a></p>

## Estonia Company Data, Contacts & Ownership (Äriregister)

Need **verified, deliverable B2B data for the Estonian market** — not a stale identity dump? This Actor turns Estonia's official **Business Register (Äriregister / RIK)** into ready-to-use company records: **358,000+ companies**, **~96% with a public email**, plus VAT, share capital, sector (EMTAK) — and the full **ownership graph** (board, shareholders, beneficial owners).

Built on Estonia's **official open data**, licensed **CC BY 4.0** — free to reuse **and resell**, with attribution. **No API key, no login, no fragile HTML scraping** — so it doesn't break when a website changes.

- 🇪🇪 **358K+ companies** — the whole active register, not a sample
- 📧 **~96% have a real email** (measured) — a genuine, compliant lead source
- 🏛️ **Ownership on demand** — board, shareholders (with %) and **beneficial owners (UBO)** for KYC/AML
- ⚡ **One run → one clean, flat dataset** (JSON / CSV / Excel / API)

### Quick start (API)

Get 100 IT companies in Tallinn that have an email, in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/foxlabs~estonia-company-data/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "activityQuery": "62", "location": "Tallinn", "onlyWithEmail": true, "maxResults": 100 }'
```

Prefer no code? Open the **Input** tab, set your filters, and click **Start** — then download the results.

### What you get

One clean, flat record per company:

| Field | Type | Description |
|---|---|---|
| `name` | string | Registered legal name |
| `registryCode` | string | 8-digit Estonian registry code (ariregistri kood) |
| `legalForm` / `legalFormCode` | string | e.g. *Osaühing* / `OÜ` |
| `status` / `isActive` | string / bool | Registry status |
| `vatNumber` | string | EE VAT number (where registered) |
| `email` / `emails[]` | string / array | Public contact email(s) |
| `phone` / `phones[]` | string / array | Public phone(s) |
| `website` | string | Where listed |
| `address` / `county` | string | Full address + county |
| `capital` | object | `{ amount, currency }` share capital |
| `primaryActivity` / `activities[]` | string / array | EMTAK sector `{ emtakCode, activity }` |
| `ownership` *(optional)* | object | `{ board[], shareholders[] (with sharePercent), beneficialOwners[] }` |
| `source` / `license` / `registryUrl` | string | Provenance |

#### Sample output

```json
{
  "name": "CGI Eesti OÜ",
  "registryCode": "10006966",
  "legalForm": "Osaühing",
  "status": "Registrisse kantud",
  "isActive": true,
  "vatNumber": "EE100259311",
  "email": "eesti@cgi.com",
  "phone": "+372 6649100",
  "website": "https://www.cgi.com",
  "county": "Harju maakond",
  "capital": { "amount": 95850, "currency": "EUR" },
  "primaryActivity": "Programmeerimine",
  "activities": [{ "emtakCode": "62101", "activity": "Programmeerimine" }],
  "ownership": {
    "board": [{ "name": "Andres Birnbaum", "role": "Juhatuse liige", "type": "person" }],
    "shareholders": [{ "name": "CGI Sverige AB", "type": "entity", "sharePercent": 100, "ownershipType": "Ainuomand" }],
    "beneficialOwners": [{ "name": "Steve Perron", "controlMethod": "kõrgema juhtorgani liige…", "countryOfResidence": "Kanada" }]
  },
  "source": "Estonian Business Register (Äriregister / RIK)",
  "license": "CC BY 4.0",
  "registryUrl": "https://ariregister.rik.ee/est/company/10006966"
}
```

*(Real record, verified against the live register on 2026-07-28. `ownership` appears only when **Include ownership** is on — it is prefilled on, so the very first run shows it.)*

### Input & filters

- **Company name** search (case-insensitive), or exact **registry codes** for precise lookup.
- **Legal form** (OÜ, AS, MTÜ, FIE …) and **status** (active only / all).
- **Location** — matches the company address (county or city, e.g. `Tallinn`, `Harju`).
- **Activity / sector** — an EMTAK code prefix (`62` = IT) or a keyword.
- **Only companies with an email** — for clean lead lists.
- **Include ownership** — attach board, shareholders & beneficial owners.
- **Max results** — up to 200,000.

### Example inputs (copy & paste)

```jsonc
// 1) Lead list — all IT companies in Tallinn that publish an email
{ "activityQuery": "62", "location": "Tallinn", "onlyWithEmail": true, "maxResults": 1000 }

// 2) KYC / KYB lookup — specific companies with the full ownership graph (board, shareholders, UBO)
//    (this is the prefilled example — Bolt Technology OÜ + CGI Eesti OÜ)
{ "registryCodes": ["12417834", "10006966"], "includeOwnership": true }

// 3) Whole segment — every active AS (public limited company)
{ "legalForm": "AS", "status": "active", "maxResults": 50000 }

// 4) Company name search — find a company and its owners by name
{ "searchQuery": "Bolt", "includeOwnership": true }

// 5) Regional lead list — companies in Tartu county with a deliverable email
{ "location": "Tartu", "onlyWithEmail": true, "maxResults": 5000 }

// 6) Non-profit directory — every active MTÜ (non-profit association)
{ "legalForm": "MTÜ", "status": "active", "maxResults": 10000 }

// 7) Sector export — the full construction sector (EMTAK 41–43)
{ "activityQuery": "41", "maxResults": 20000 }
```

### Use cases

- **Outbound sales & lead lists.** You sell to Estonian software firms. Filter `activityQuery: "62"` + `location: "Tallinn"` + `onlyWithEmail: true` and you get a CRM-ready list of companies with a **deliverable email**, VAT, and a size signal (share capital) to prioritise — no manual list-building.
- **KYC / KYB & AML.** Onboarding an Estonian counterparty? Pass its `registryCodes` with **Include ownership** on → verified legal identity, VAT, status, and the **beneficial-owner (UBO) chain** your compliance checks require, in one call.
- **Market sizing & research.** Studying a sector? Pull every company for an EMTAK code or a county → count the players, their legal forms and capital distribution to size the market and spot leaders.
- **CRM enrichment & cleanup.** Already have a list of Estonian names or codes? Feed them in → append VAT, current contacts, capital and ownership. Missing fields return `null`, never a guess.
- **Investment & M\&A screening.** Screen a sector for targets: filter by activity + `status`, enable ownership to see who controls each company, and rank by share capital.
- **Recruiting & partnership prospecting.** Find companies by region + sector with a phone/email to reach decision-makers directly.

### Performance & throughput

Each run loads the official bulk register (~30–60s), then filters locally — so large pulls are fast: **~10,000 companies in a few minutes**. Turning on **Include ownership** downloads three extra relation files (board / shareholders / UBO — **~106 MB compressed, ≈2 GB unpacked**); measured on 2026-07-28 that added **~9 s** to a run, not minutes. Throughput is bounded only by your Apify plan; there are no external keys, proxies or rate limits.

### Integrations

**JavaScript** (`apify-client`):

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('foxlabs/estonia-company-data').call({
  activityQuery: '62', location: 'Tallinn', onlyWithEmail: true, maxResults: 500,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

**Python** (`apify-client`):

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("foxlabs/estonia-company-data").call(run_input={
    "activityQuery": "62", "location": "Tallinn", "onlyWithEmail": True, "maxResults": 500,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["name"], item.get("email"))
```

Also works with **Make / n8n / Zapier** (Apify app → run this Actor, map the input), scheduled runs, webhooks, and the **Apify MCP server** for AI agents.

### Data quality (measured, active companies)

| Field | Fill rate |
|---|---|
| Name, registry code, legal form, status | **100%** |
| Business activity (EMTAK) | **~96%** |
| Contact email | **~96%** |
| Address | ~92% |
| Share capital | ~76% |
| Phone | ~65% |
| VAT number | ~34% *(only VAT-registered companies have one)* |
| Website | ~6% *(Estonian companies list email, rarely a website)* |

Measured on a representative live-dataset sample. Contacts and financials come **only** from the register — never fabricated; missing values are `null`.

### Pricing

**Pay per result** — you're billed per company returned; ownership enrichment is included in that price when enabled. There's an Apify **free tier** to evaluate the full feature set before you scale. No proxies or third-party costs.

### FAQ

**Can I use this data commercially / resell it?** Yes — the register is **CC BY 4.0**, which permits commercial reuse and redistribution *with attribution*. Records carry the required attribution string.

**How fresh is the data?** It's read from the register's official open-data drop, refreshed by RIK. Each run pulls the current data.

**Do I need an API key or account with Estonia?** No. No key, no login.

**What export formats are available?** JSON, CSV, Excel, or via the Apify API/integrations.

**Can I look up specific companies?** Yes — put their 8-digit codes in `registryCodes`.

**What's in the ownership data?** Board members (role), shareholders (with `sharePercent`), and beneficial owners (control method, country). Turn on **Include ownership**.

**Are personal ID codes included?** No — only names, roles and (where relevant) a stable hash. See GDPR note below.

**Why is `website` so low?** Estonian companies register an email, rarely a website. Email + phone are the reliable channels.

**How many companies can I get in one run?** Up to 200,000 via `maxResults`.

**Is there a rate limit?** No external key/limit — throughput is bounded only by your Apify plan.

### Troubleshooting

- **0 results** → your filters are too narrow. Widen the `location` or `activityQuery`, or clear `onlyWithEmail`.
- **Ownership run is slower** → ownership pulls ~106 MB of board/shareholder/UBO relations (≈2 GB unpacked). Leave **Include ownership** off for the fastest bulk lead runs.
- **A company has no email** → ~4% of active companies publish none; that's the register, not a miss (value is `null`, never fabricated).
- **First results take ~a minute** → the Actor loads the official bulk open data at the start of each run (it's built for filtered lists, not single instant lookups).

### Notes, limits & legal (honest)

- **Personal data / GDPR.** Board, shareholder and beneficial-owner names are individuals published *by law* in the official register. Redistribution is permitted under CC BY 4.0, but if you process this personal data you're responsible for your own GDPR legal basis. Personal ID codes are **not** included.
- **County vs. court district.** `county` comes from the real company address. (Estonia's registry court is centralised to Tartu for every company, so that field isn't usable geography — we don't expose it.)
- **Attribution.** Records carry `Contains Estonian Business Register data, © Republic of Estonia, licensed under CC BY 4.0`.
- **Not affiliated** with RIK or the Republic of Estonia; this Actor redistributes their public open data.

### Support

Questions, a field you'd like added, or a custom build? Open the **Issues** tab on this Actor, or email **info@foxlabs.com.tr**. We reply fast.

*If this Actor saves you time, a ⭐ review really helps.*

### Changelog

#### 0.2.2 — 2026-07-28

- **Ownership is now prefilled ON**, with a ready KYB lookup (`12417834` Bolt Technology OÜ + `10006966` CGI Eesti OÜ) — the first run out of the box returns board, shareholders (`sharePercent`) and **beneficial owners (UBO)**, not identity-only rows. The API `default` is unchanged (`false`).
- Fix: the sample output and KYB example used registry code `10259958`, which doesn't exist in the register — corrected to CGI Eesti OÜ's real code **10006966** (verified on the live 2026-07-28 register drop).
- Docs: ownership cost measured and corrected — **~106 MB compressed / ≈2 GB unpacked, ~9 s extra parse**.

#### 0.2 — 2026-07-05

- Reworked docs: API quick-start, sample output, integration snippets (JS/Python/Make/MCP), FAQ & troubleshooting.

#### 0.1

- Initial release. 358K+ Estonian companies from the official Business Register open data (CC BY 4.0): identity, VAT, address, email/phone, share capital and EMTAK activities, with optional board/shareholder/beneficial-owner ownership.

***

Part of the **[foXLabs data platform](https://data.foxlabs.com.tr/)** — official public-data company, contact, ownership, jobs, charity, location & AI-search intelligence scrapers. Browse the full suite at **[data.foxlabs.com.tr](https://data.foxlabs.com.tr/)**.

# Actor input Schema

## `searchQuery` (type: `string`):

Find companies whose name contains this text (case-insensitive). Leave empty to browse by the filters below. Example: "Bolt" or "holding".

## `registryCodes` (type: `array`):

Look up specific companies by their 8-digit Estonian registry code (ariregistri kood). Overrides the name search. Example: \["12417834" = Bolt Technology OÜ, "10006966" = CGI Eesti OÜ].

## `legalForm` (type: `string`):

Keep only companies of this legal form. "Any" returns all forms.

## `status` (type: `string`):

Which companies to include by registry status.

## `location` (type: `string`):

Keep only companies whose address contains this text — a county or city. Example: "Tallinn", "Harju", "Tartu". Leave empty for all of Estonia.

## `activityQuery` (type: `string`):

Keep only companies whose reported activity (EMTAK) matches — a numeric EMTAK code prefix (e.g. "62" for IT) or a keyword found in the activity text. Leave empty for all sectors.

## `onlyWithEmail` (type: `boolean`):

Return only companies that publish a contact email (≈96% of active companies do). Useful for lead lists.

## `includeOwnership` (type: `boolean`):

Attach board members, shareholders and beneficial owners (UBO) to each company. Adds ~106 MB of reference downloads (≈2 GB unpacked) at the start of the run, so it is slower — turn on when you need the ownership graph.

## `maxResults` (type: `integer`):

Maximum number of companies to return.

## Actor input object example

```json
{
  "registryCodes": [
    "12417834",
    "10006966"
  ],
  "legalForm": "any",
  "status": "active",
  "onlyWithEmail": false,
  "includeOwnership": true,
  "maxResults": 1000
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQuery": "",
    "registryCodes": [
        "12417834",
        "10006966"
    ],
    "includeOwnership": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("foxlabs/estonia-company-data").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQuery": "",
    "registryCodes": [
        "12417834",
        "10006966",
    ],
    "includeOwnership": True,
}

# Run the Actor and wait for it to finish
run = client.actor("foxlabs/estonia-company-data").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQuery": "",
  "registryCodes": [
    "12417834",
    "10006966"
  ],
  "includeOwnership": true
}' |
apify call foxlabs/estonia-company-data --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=foxlabs/estonia-company-data",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/YvYOepIEbz5JJx55h/builds/7QA2HgQAL62XRI59h/openapi.json
