# Estonia e-Business Register Scraper (`crawlerbros/estonia-e-business-register-scraper`) Actor

Search Estonia's e-Business Register (ariregister.rik.ee / e-äriregister) by company name, registry code, or VAT number. Get legal form, address, VAT status, board members, shareholders, beneficial owners, EMTAK activity codes, and annual report history.

- **URL**: https://apify.com/crawlerbros/estonia-e-business-register-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Automation, Lead generation, Integrations
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Estonia e-Business Register Scraper

Search **e-Äriregister** — Estonia's official e-Business Register (ariregister.rik.ee), run by RIK (Centre of Registers and Information Systems). Find companies by name, registry code, or VAT number, and pull legal form, address, VAT status, board members / representatives, shareholders, beneficial owners, EMTAK activity codes, and annual report filing history. No auth, no proxy, no cookies required.

### What this actor does

- **Two modes:** `search` (by company name / registry code / VAT number) and `byRegCode` (full detail lookup by exact registry code)
- **Filters:** registration status (active / in liquidation / in bankruptcy / deleted), legal form (20 types)
- **Full company details:** LEI code, capital, founding/registration dates, VAT liability + history, board members and representatives, shareholders, beneficial owners, EMTAK activity classification, up to 20 most-recent annual report filings with PDF links, and Estonian Tax and Customs Board data (tax debt status, latest-quarter state/workforce taxes paid, taxable turnover, employee count)
- **Empty fields are omitted** — you only ever see fields the register actually has data for

### Output per company

**Search mode (light record):**

- `regCode`, `companyId`, `name`, `historicalNames[]`
- `legalForm`, `legalFormId`, `status`, `statusCode`
- `address`, `zipCode`
- `sourceUrl`

**byRegCode mode (full detail — includes everything above, plus):**

- `leiCode`, `legacyRegCode` (older enterprise-register code, where applicable)
- `capital`, `foundedDate`, `registeredDate`, `financialYearPeriod`, `articlesOfAssociationDate`
- `eInvoiceInfo`, `acceptsEInvoices` (bool)
- `isActive` (bool — sole traders only)
- `email`, `phone`, `website`
- `vatLiable` (bool), `vatNumber`, `vatPeriod`, `vatHistory[]`
- `representatives[]` — board members / sole trader / supervisory board, with `name`, `personalIdCode`, `role`, `startDate`
- `shareholders[]` — `name`, `code`, `participation`, `contribution`, `startDate`
- `beneficialOwners[]` — `name`, `personalIdCode`, `mannerOfControl`, `startDate`
- `areasOfActivity[]` — `activity`, `emtakCode`, `type`
- `annualReports[]` (up to 20 most recent) — `year`, `submittedDate`, `period`, `status`, `reportUrl`
- `articlesOfAssociation[]` — the currently effective version, with `effectiveDate`, `validUntil` (omitted when open-ended), `dateOfApproval`, `status`, `documentUrl` (PDF)
- `hasTaxDebt` (bool), `taxDebtStatus` (free text, e.g. "The legal person has no tax debt as of ..."), `taxPeriodLabel` (which quarter the figures below cover), `stateTaxesPaid`, `workforceTaxesPaid`, `taxableTurnover`, `numberOfEmployees` — from the Estonian Tax and Customs Board (EMTA), surfaced without login on the company's own registry page

Every record also includes `recordType: "company"` and `scrapedAt` (UTC timestamp).

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search` / `byRegCode` |
| `searchQuery` | string | `Swedbank` | Company name, registry code, or VAT number (mode=search) |
| `regCodes` | array | – | Estonian registry codes, e.g. `10060701` (mode=byRegCode) |
| `statuses` | array | – | Restrict to `R` / `L` / `N` / `K` (mode=search) |
| `legalFormIds` | array | – | Restrict to one or more of 20 legal forms (mode=search) |
| `maxItems` | int | `10` | Hard cap (1–200). Note: `search` mode is capped at 10 by the upstream Autocomplete service regardless of this value. |

#### Example: search by name

```json
{
  "mode": "search",
  "searchQuery": "Swedbank",
  "maxItems": 10
}
```

#### Example: search restricted to active private limited companies

```json
{
  "mode": "search",
  "searchQuery": "Tallinn",
  "statuses": ["R"],
  "legalFormIds": ["5"],
  "maxItems": 10
}
```

#### Example: full detail lookup by registry code

```json
{
  "mode": "byRegCode",
  "regCodes": ["10060701", "12101717"]
}
```

### Use cases

- **KYB / KYC due diligence** — verify an Estonian counterparty's legal status, registered address, and board members before onboarding
- **Company registry enrichment** — bulk-enrich a list of Estonian registry codes with legal form, VAT status, and address
- **Beneficial ownership screening** — pull `beneficialOwners[]` for AML/compliance checks
- **Sales & lead generation** — find active companies by name pattern, legal form, and status for market mapping
- **Financial diligence** — track annual report filing history and VAT registration dates

### FAQ

**What's e-Äriregister?** Estonia's official Central Commercial Register, published by RIK (Centre of Registers and Information Systems, part of the Estonian Ministry of Justice). It's the authoritative public record of every company, sole trader, non-profit, and foundation registered in Estonia.

**Why is `search` mode capped at 10 results?** It uses RIK's official public Autocomplete service, which is explicitly documented as free/open (no contract, no API key required) but is designed as a type-ahead suggestion feature and returns at most 10 matches, ordered by name relevance. For exhaustive results on a known set of companies, use `byRegCode` with the exact registry codes instead.

**Why do `statuses` / `legalFormIds` filters apply client-side?** The public Autocomplete endpoint doesn't accept server-side filter parameters, so this actor filters the (max 10) returned matches locally.

**Is `personalIdCode` (personal identification code) really public?** Yes — Estonia's e-Business Register displays this for registered representatives, shareholders, and beneficial owners without any login, as part of its legally-mandated public commercial-register transparency (consistent with EU anti-money-laundering ownership-disclosure requirements). This actor surfaces only what's already publicly published on ariregister.rik.ee.

**Why are `annualReports` capped at 20?** Long-established companies can have 25+ years of annual filings. The 20 most recent are included per record to keep payloads manageable; older filings remain visible on the source page.

**Is authentication required?** No. `search` mode uses the public Autocomplete service; `byRegCode` mode reads the public company detail page — the same page anyone can browse at ariregister.rik.ee without logging in ("It is possible to make inquiries about all legal persons").

**How fresh is the data?** Real-time — every request reads live from ariregister.rik.ee.

**Why not use the "Advanced search" page (address / EMTAK activity / representative-role filters)?** That page (`/eng/company_search`) is a stateful, session-driven single-page app that submits filters to an internal search job and polls for results — it requires cookies and JavaScript rendering to work, which this actor deliberately avoids for reliability and cost reasons (per project policy, no cookies/proxy unless strictly necessary). The `statuses` and `legalFormIds` filter values exposed by this actor were verified against that same page's live dropdown options, so filter coverage is complete even though the advanced multi-axis search UI itself isn't replicated.

**Does this cover VAT groups?** Yes — for companies that file VAT jointly as part of a group, `vatNumber`/`vatHistory` reflect the group VAT registration as shown on the company's own registry page.

**Where does the tax-debt / turnover data come from?** It's sourced live from the Estonian Tax and Customs Board (EMTA) database and displayed on ariregister.rik.ee's own company page without any login — this actor reads the same public data. `stateTaxesPaid`, `workforceTaxesPaid`, and `taxableTurnover` reflect the most recently published quarter; fields the register shows as "-" (no data published for that quarter) are omitted rather than sent as zero or null.

# Actor input Schema

## `mode` (type: `string`):

What to fetch.

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

Company name, registry code, or VAT number. Matches Estonia's official Autocomplete service (same one used by the ariregister.rik.ee search box).

## `regCodes` (type: `array`):

Estonian company registry codes (6-9 digits), e.g. `10060701`.

## `statuses` (type: `array`):

Restrict search results to one or more registration statuses. Empty = no filter. Applied client-side; the upstream Autocomplete service mainly surfaces active/liquidating entities.

## `legalFormIds` (type: `array`):

Restrict search results to one or more legal forms. Empty = no filter. Applied client-side.

## `maxItems` (type: `integer`):

Hard cap on emitted records. Note: mode=search is capped at 10 by the upstream Autocomplete service regardless of this value.

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "Swedbank",
  "regCodes": [],
  "statuses": [],
  "legalFormIds": [],
  "maxItems": 10
}
```

# Actor output Schema

## `companies` (type: `string`):

Dataset containing all scraped Estonian companies.

# 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 = {
    "mode": "search",
    "searchQuery": "Swedbank",
    "regCodes": [],
    "statuses": [],
    "legalFormIds": [],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/estonia-e-business-register-scraper").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 = {
    "mode": "search",
    "searchQuery": "Swedbank",
    "regCodes": [],
    "statuses": [],
    "legalFormIds": [],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/estonia-e-business-register-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "mode": "search",
  "searchQuery": "Swedbank",
  "regCodes": [],
  "statuses": [],
  "legalFormIds": [],
  "maxItems": 10
}' |
apify call crawlerbros/estonia-e-business-register-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlerbros/estonia-e-business-register-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/pfjPSgf8fbABr0IIi/builds/JxIzQ0HjyLvYQAJS9/openapi.json
