# Estonian Company Check: Business Register, Tax Debts (`deriverge/estonian-company-check`) Actor

Check Estonian companies in bulk against the e-Business Register and the tax authority. Add registry codes and get name, status including liquidation and bankruptcy, VAT validity, verified tax debt, and quarterly turnover, taxes and headcount. Rows that cannot be matched are free.

- **URL**: https://apify.com/deriverge/estonian-company-check.md
- **Developed by:** [deriverge s.r.o.](https://apify.com/deriverge) (community)
- **Categories:** Business, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 company records

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/actors/running/actors-in-store.md#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

## Estonian Company Checker

### What does Estonian Company Checker do?

**Estonian Company Checker** verifies Estonian companies in bulk against the e-Business Register and the Tax and Customs Board (EMTA). Give it a list of 8-digit registry codes and for each one you get back the legal name, address, legal form and status, the VAT number with an independent VIES confirmation, the exact tax debt the company owes, and quarterly figures nobody else in this category offers: turnover, state and labour taxes paid, and average headcount, quarter by quarter.

The quarterly data is the point. A company can look perfectly registered while its turnover has been zero for three quarters and its last employee left a year ago. A name-and-address lookup will never tell you that. This actor will.

| Source | The question only it answers |
|---|---|
| **e-Business Register** | Does the company exist, and is it registered, in liquidation or bankrupt? |
| **EMTA debtor list** | How much does it owe the tax authority right now? |
| **EMTA quarterly data** | Is it actually trading? Turnover, taxes paid and headcount per quarter |
| **EU VIES** | Does the EU confirm the VAT number is valid for cross-border trade? |

### Fair billing

You pay only for companies that resolve. Checksum failures are caught locally and never generate a request. Sources that return no answer are not billed as joins. A run that resolves nothing costs nothing.

### Verified zero is not a missing check

The debtor list only contains debtors, so an empty answer means **verified: no tax debt**, and the output says `taxDebtEur: 0` rather than `null`. A `null` appears only when the check itself could not be performed, and the provenance row says why. The same rule everywhere: when a source is down, the affected fields are `null` and flagged, never silently guessed.

### Sole traders are people

The register also contains sole traders (FIE) under their personal names. When the entity is a natural person, **the name and address are withheld by design**. You still learn that the code exists, its status, whether it pays VAT and whether it owes taxes.

### Typos never reach the register

Estonian registry codes carry a checksum digit. Every code is validated locally first; a code that fails the checksum is reported as a typo, costs nothing, and never generates a download.

### Input

```json
{
  "companies": [
    "10000018",
    { "code": "10000024", "reference": "supplier-42" }
  ],
  "includeQuarterly": true,
  "includeVies": true
}
```

Strings and objects can be mixed freely. The optional `reference` is returned unchanged so you can join results back to your own system.

### Output

One row per submitted company:

```json
{
  "input": "10000018",
  "matched": true,
  "entityType": "legal_entity",
  "code": "10000018",
  "name": "AMSERV AUTO OSAÜHING",
  "legalForm": "Osaühing",
  "companyActive": true,
  "vatNumber": "EE100057810",
  "vatValidVies": true,
  "taxDebtEur": 0,
  "quarterly": [
    {
      "year": 2026,
      "turnoverEur": [19993085, 33789639, null, null],
      "stateTaxesEur": [1561762, 2101422, null, null],
      "employees": [236, 242, null, null]
    }
  ],
  "riskFlags": [],
  "provenance": [
    { "source": "e-Business Register (RIK)", "ok": true },
    { "source": "EMTA tax debtor list", "ok": true },
    { "source": "EU VIES", "ok": true }
  ]
}
```

A `null` inside a quarter means the quarter has not been reported yet, which is not the same thing as a zero. A zero is a reported zero, and a reported zero turnover raises a risk flag, because a dormant supplier is worth knowing about before you prepay.

### Watch a list for changes

Checking a supplier once is useful. Checking the same list every morning and reading only what changed is what keeps you out of trouble. Give the run a watch name (or save it as a task and schedule it) and every later run compares its results with the previous one: a company that turned inactive, a new risk flag, a VAT registration cancelled, a published account that disappeared. The differences are stored in the `CHANGES` record of the run, ready for an integration or an email. The comparison itself is free.

### Pricing

| Event | Price |
|---|---|
| Run fee, charged once per run that resolves at least one company | $0.03 |
| Company resolved | $0.008 |
| Each additional source that returned an answer | $0.003 |
| Company not found | **free** |

### Frequently asked questions

**What does an unmatched row cost?** Nothing. Rows that fail the checksum or are not in the register are returned with an explanation and are never charged.

**Is a zero tax debt a real answer?** Yes. The debtor list contains only debtors, so an empty result is a verified zero, reported as 0. A null appears only when the check itself could not run, and the provenance row says why.

**What does a null quarter mean?** The quarter has not been reported yet. A reported zero turnover is a different thing and raises a risk flag, because a dormant supplier is worth knowing about before you prepay.

**Where does the data come from?** The Estonian e-Business Register open data (CC BY 4.0), the Tax and Customs Board (EMTA) debtor list and quarterly figures, and EU VIES. Every value carries its source and timestamp.

### Where the data comes from

All sources are official, public and free of charge. The e-Business Register publishes daily extracts as open data under CC BY 4.0, and EMTA publishes the debtor list and quarterly figures on its own site. The register's live API is disallowed by its robots.txt, so this actor deliberately uses the published extracts instead. No scraping of web pages, no proxies, no headless browser.

This is the Estonian sibling of our [Czech & Slovak](https://apify.com/deriverge/czech-company-check) and [Romanian](https://apify.com/deriverge/romanian-company-check) company checkers. All three share the same validation engine and the same billing rule: unmatched rows are free.

# Actor input Schema

## `companies` (type: `array`):

One entry per company: an 8-digit registry code (10000018) or an object with code and an optional reference that is returned unchanged. Typos that fail the checksum are reported and never charged.

## `includeQuarterly` (type: `boolean`):

Join the tax authority's quarterly data: turnover, state and labour taxes paid, and average headcount per quarter. The clearest signal of whether a company is actually alive.

## `includeVies` (type: `boolean`):

Cross-check every VAT number against the EU VIES system as a second, independent source. A disagreement between the registers is reported as a risk flag.

## `watchKey` (type: `string`):

Give the run a name such as "suppliers" and schedule it. Every later run with the same name compares its results with the previous one and stores the differences (status changes, new risk flags, removed accounts) in the CHANGES record. Comparison is free. Runs from a saved task are compared automatically even without a name.

## Actor input object example

```json
{
  "companies": [
    "10000018",
    {
      "code": "10000024",
      "reference": "supplier-42"
    }
  ],
  "includeQuarterly": true,
  "includeVies": true
}
```

# Actor output Schema

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

One row per submitted company, with identity, legal status, VAT validity, verified tax debt, quarterly turnover and risk flags.

## `summary` (type: `string`):

How many entities were resolved, how many were not found and therefore not charged, and how many carry a risk flag.

# 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 = {
    "companies": [
        "10000018",
        {
            "code": "10000024",
            "reference": "supplier-42"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("deriverge/estonian-company-check").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 = { "companies": [
        "10000018",
        {
            "code": "10000024",
            "reference": "supplier-42",
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("deriverge/estonian-company-check").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 '{
  "companies": [
    "10000018",
    {
      "code": "10000024",
      "reference": "supplier-42"
    }
  ]
}' |
apify call deriverge/estonian-company-check --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,deriverge/estonian-company-check"
        }
    }
}

```

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/7o2b0HFPPV92FtQir/builds/84T3SVwhN26WX9P7J/openapi.json
