# Czech Company Data — ARES Registry, VAT & Directors (`foxlabs/czech-company-data`) Actor

Search 3M+ Czech companies from the official ARES registry (ares.gov.cz) — identity, IČO, VAT (DIČ), legal form, NACE, registered address and founding date, plus optional directors/board (names, roles) and share capital. Open data, no key.

- **URL**: https://apify.com/foxlabs/czech-company-data.md
- **Developed by:** [Berkan Kaplan](https://apify.com/foxlabs) (community)
- **Categories:** Lead generation
- **Stats:** 3 total users, 0 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. 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/czech-company-data"><img src="https://data.foxlabs.com.tr/img/czech-company-data-banner.svg" alt="Czech Company Data" width="100%" /></a></p>

## Czech Company Data — ARES Registry, VAT & Directors

Look up **or discover** any Czech company — verified identity, VAT number, what it does, who runs it and how much capital it holds. This Actor reads the Czech Ministry of Finance's official **ARES** registry (Administrativní registr ekonomických subjektů) and returns clean, structured records: legal name, **IČO**, **VAT (DIČ)**, legal form, **NACE** activity codes, registered address and founding date — plus, on demand, the **board of directors** and **share capital** from the public register.

Built on the **official ARES REST API** — **open data, no API key, no login, no scraping**. **Two ways in:** look up companies you know (by name or IČO), **or discover** new ones by **industry (NACE) + city + legal form** — a ready-made lead list, each company fully enriched.

- 🇨🇿 **3M+ Czech entities** — the whole ARES registry
- 🧭 **Discovery mode** — browse by **industry (NACE) + city + legal form** without knowing names (auto-splits busy queries past ARES's 1,000-result cap)
- 🆔 **Identity + VAT (DIČ)** + legal form + NACE codes + address
- 👔 **Directors & capital** *(opt-in)* — the board **currently in office** (names, roles, tenure), supervisory board and registered share capital — history and duplicate filings removed
- ✅ **Active filter** — exclude dissolved entities
- 🆓 **Open data** — reuse and redistribute, no key

### Quick start (API)

Look up two companies by IČO with directors and capital:

```bash
curl -X POST "https://api.apify.com/v2/acts/foxlabs~czech-company-data/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "icoList": ["00177041", "27082440"], "includeDirectors": true }'
```

Prefer no code? Open the **Input** tab, enter a name or IČO numbers, and click **Start** — then download the results.

### What you get

One clean, flat record per company:

| Field | Type | Description |
|---|---|---|
| `name` | string | Registered legal name |
| `ico` | string | 8-digit company ID (IČO) |
| `vat` | string | VAT number (DIČ), if VAT-registered |
| `legalForm` / `legalFormCode` | string | Legal form in English + the ARES code |
| `address` / `city` / `region` / `postalCode` | string | Registered seat |
| `nace` / `primaryNace` | array / string | CZ-NACE activity codes |
| `foundingDate` | string | Date of establishment |
| `isActive` / `activeRegisters` | bool / array | Whether it's active, and in which registers |
| `directors` *(opt-in)* | array | Statutory body / board — **people currently in office**, `{ name, role, from, type, citizenship }`. One row per person-and-role |
| `directorsCount` *(opt-in)* | number | **Distinct people** in `directors[]` (lower than the row count when someone holds two roles) |
| `directorsTruncated` *(opt-in)* | bool | `true` if the board was longer than the 30-row cap — never silently cut |
| `supervisoryBoard` *(opt-in)* | array | Supervisory board members currently in office (same shape) |
| `supervisoryBoardCount` / `supervisoryBoardTruncated` *(opt-in)* | number / bool | Same two guarantees for the supervisory board |
| `capital` *(opt-in)* | object | Registered share capital `{ amount, currency }` |
| `source` / `license` / `aresUrl` | string | Provenance — ARES, open data, and the ARES page |

Missing values come back as `null`, never a guess.

#### Sample output

Real record for **Škoda Auto a.s.** (`icoList: ["00177041"]`, directors on) — board abbreviated:

```json
{
  "name": "Škoda Auto a.s.",
  "ico": "00177041",
  "vat": "CZ00177041",
  "legalForm": "Joint-stock company (a.s.)",
  "legalFormCode": "121",
  "address": "tř. Václava Klementa 869, Mladá Boleslav II, 29301 Mladá Boleslav",
  "city": "Mladá Boleslav",
  "nace": ["70200", "471", "77110"],
  "primaryNace": "70200",
  "foundingDate": "1990-11-20",
  "isActive": true,
  "directors": [
    { "name": "MICHAEL KERSCHENSTEINER", "role": "Prokura", "type": "person", "from": null, "citizenship": "DE" },
    { "name": "MAREN GRÄF", "role": "člen představenstva", "type": "person", "from": "2024-03-01", "citizenship": "DE" },
    { "name": "KLAUS ZELLMER", "role": "předseda představenstva", "type": "person", "from": "2022-07-01", "citizenship": "DE" }
  ],
  "directorsCount": 7,
  "directorsTruncated": false,
  "capital": { "amount": 16708850000, "currency": "CZK" },
  "source": "ARES — Administrative Register of Economic Entities (Czech Republic)",
  "license": "Open data — Ministry of Finance of the Czech Republic",
  "aresUrl": "https://ares.gov.cz/ekonomicke-subjekty?ico=00177041"
}
```

### Example inputs (copy & paste)

```jsonc
// 1) DISCOVER — IT companies (NACE 62) in Olomouc, limited-liability (s.r.o.)
{ "naceActivity": "62", "city": "Olomouc", "legalForm": "112", "maxResults": 100 }

// 2) DISCOVER — accounting/legal firms (NACE 69) in Brno, with directors
{ "naceActivity": "69", "city": "Brno", "includeDirectors": true, "maxResults": 200 }

// 3) Exact lookup by IČO, with directors & capital
{ "icoList": ["00177041", "27082440"], "includeDirectors": true }

// 4) Name search
{ "searchQuery": "Kaufland", "maxResults": 100 }

// 5) Name + address, active only, with the board
{ "searchQuery": "logistika", "addressQuery": "Praha", "onlyActive": true, "includeDirectors": true }
```

### Input & filters

- **Industry / sector** (`naceActivity`) — DISCOVER by CZ-NACE code prefix, e.g. `62` (IT), `41` (construction), `47` (retail). No name needed.
- **City** (`city`) — DISCOVER or filter by registered city, e.g. `Praha`, `Brno`, `Olomouc`. Pair with a sector or legal form.
- **Legal form** (`legalForm`) — s.r.o., a.s., cooperative… also a standalone discovery criterion.
- **Company name contains** (`searchQuery`) — substring match on the name.
- **IČO numbers** (`icoList`) — exact lookup; overrides the search.
- **Address contains** (`addressQuery`) — extra client-side filter (street / district).
- **Only active** (`onlyActive`) — exclude dissolved entities.
- **Include directors & capital** (`includeDirectors`) — attach the board, supervisory board and share capital.
- **Max results** (`maxResults`) — 1 to **100,000**.

> **ARES's 1,000-result cap:** one query returns at most 1,000 companies. For busy combinations (e.g. Praha + a broad sector) the Actor **auto-splits by legal form** to pull more; the very densest slices (Praha s.r.o. in a broad sector) still hit the cap — narrow with a City or a more specific sector. The Actor warns, it never crashes.

### Use cases

- **B2B prospecting & enrichment.** Match your CRM on IČO or name and top up VAT, legal form, NACE and address.
- **KYC / KYB & due diligence.** Verify a Czech counterparty, its directors and its share capital in one call.
- **Board / director mapping.** Attach the statutory body to see who runs a company.
- **Market & competitor research.** Search a name or sector and size the field.

### Performance & throughput

The Actor calls the live ARES API (search returns full records in pages of 100; directors/capital add one public-register lookup per company, 5 in parallel). No proxies, no keys. A single search is bounded to ARES's 1,000-result cap; use IČO lists or narrower filters for large pulls.

### Integrations

Works with **JavaScript / Python `apify-client`**, **Make / n8n / Zapier**, scheduled runs, webhooks, and the **Apify MCP server**.

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('foxlabs/czech-company-data').call({ icoList: ['00177041'], includeDirectors: true });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

### Data quality (honest)

- **Identity, legal form, NACE, address and founding date are complete** for essentially every entity — core ARES fields.
- **VAT (DIČ)** is present only for VAT-registered subjects; associations and non-registered entities return `null`.
- **Directors are the board in office today.** The public register (Veřejný rejstřík) keeps every past version of every appointment; each superseded one is struck with a deletion date, and the Actor keeps only the rows that carry none — verified across 75 companies / 3,223 appointment rows, that flag is set on every ended appointment. Škoda Auto returns its 7 current officers, ČEZ its 7, matching the member counts the register itself declares. Results are **most-recently-appointed first**; `directorsCount` counts distinct people and `directorsTruncated` tells you if the 30-row cap was reached.
- **A board can legitimately be empty.** If every appointment has been struck and no successor filed, `directors` is `[]` — that is the register's own state, not a gap, and it's a signal worth reading.
- **Roles and tenure dates are as filed.** Some appointments (typically prokurists and liquidators) carry no start date in the register, so `from` is `null` — the person is still returned.
- **Capital** is the latest registered share capital.
- Nothing is fabricated — a missing value is `null`.

### Pricing

**Pay per result** — billed per company returned; directors and capital are included when enabled. Apify **free tier** to evaluate. No proxies, no third-party API costs — ARES is a free public API.

### FAQ

**Where does the data come from?** The Czech Ministry of Finance's official **ARES** registry (ares.gov.cz).

**Can I use it commercially / resell it?** Yes — ARES is open public data.

**Do I get director names?** Yes, with **Include directors & capital** on — the statutory body and supervisory board **as they stand today**, with roles and tenure. Appointments the register has struck are excluded, so you don't read a former chairman as the current one.

**How does industry + city discovery work?** Pick a sector (`naceActivity`, a CZ-NACE prefix like `62`) and/or a `city` and `legalForm` — the Actor queries ARES server-side and enriches every match. For busy combinations it auto-splits by legal form to beat ARES's 1,000-result cap.

**Why does a broad search return nothing with a warning?** ARES rejects any single query returning more than 1,000 companies — narrow it (a City, a legal form, a more specific sector, or exact IČO numbers).

**Do I need an API key?** No. No key, no login, no scraping.

### Troubleshooting

- **"Search matches too many companies"** → narrow the name, add `addressQuery`, or use `icoList`.
- **No `vat`** → the company isn't VAT-registered (normal for associations and small entities).
- **Empty `directors` on an active company** → every appointment on file has been struck and no successor filed yet. Real register state, not a miss.
- **The same person twice in `directors`** → they hold two roles (e.g. board member *and* liquidator). `directorsCount` counts them once.

### Support

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

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

### Changelog

#### 0.1.2 — 2026-07-28

- **`directors[]` and `supervisoryBoard[]` are now the board actually in office.** The previous filter only dropped appointments that carried an explicit end date, which ARES leaves blank on most historical rows — so people who had left years ago were returned as current: Škoda Auto came back with **16 rows / 14 names including a chairman who left in 2004**, ČEZ with **30 rows (cap full) covering 9 people**, MARTIN NOVÁK repeated 5×. ARES actually strikes each superseded appointment with a deletion date, and that is what the Actor now filters on. Škoda: **16 → 7 rows / 7 people**; ČEZ: **30 → 7 / 7** — both matching the member counts ARES itself declares. Across a 75-company check: 384 → 174 director rows, 301 → 142 supervisory rows, no company left without a board it should have had.
- **Liquidators and prokurists are no longer dropped.** The old code required a start date, which the register doesn't record for those roles — 5 of 75 sample companies had their *entire* statutory body silently omitted. They are returned now, with `from: null`.
- **New `directorsCount` / `supervisoryBoardCount`** — **distinct people**, not row count, so a person holding two roles is counted once.
- **New `directorsTruncated` / `supervisoryBoardTruncated`** — the 30-row cap can no longer cut a board silently. (With history removed the largest board seen in the 75-company check was 10, so the cap is no longer reached in practice.)

#### 0.1.1 — 2026-07-28

- **Include directors & capital is now prefilled ON** — the very first run on the prefilled IČO numbers (Škoda Auto, ČEZ) returns the statutory body, supervisory board and registered share capital, not identity + VAT only. The API `default` is unchanged (`false`), so programmatic users still opt in.
- Documented limitation: `directors[]` / `supervisoryBoard[]` include historical and duplicate entries because ARES's public register often omits an appointment's end date (ČEZ: 30 rows covering 9 distinct people). Read the list as "everyone ARES shows without a recorded end date", not as today's board. A dedupe fix is planned.

#### 2026-07 — Out-of-the-box example ✅

- Two example IČO numbers (Škoda Auto, ČEZ) are prefilled, so the very first run returns full company records without any setup.

#### 2026-07 — Discovery mode 🧭

- Added **discovery**: browse companies by **industry (NACE) + city + legal form** without knowing names/IČO. Server-side ARES filters; **auto-splits by legal form** to pull past ARES's 1,000-result cap on busy city+sector combinations.

#### 0.1 — 2026-07-09

- Initial release. Czech companies from the official ARES registry: identity, IČO, VAT (DIČ), legal form, NACE, address and founding date, with opt-in directors/board, supervisory board and share capital. Open data, no key.

***

Part of the **[foXLabs data platform](https://data.foxlabs.com.tr/)** — official public-data company, contact, ownership, charity, procurement, 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). Example: "Škoda", "Alza", "logistika". Leave empty to look up by IČO or to DISCOVER by sector/city/form below.

## `icoList` (type: `array`):

Exact 8-digit Czech company IDs (IČO) for precise lookup, e.g. \["00177041", "45274649"]. Overrides the name search.

## `naceActivity` (type: `string`):

DISCOVER companies by economic activity — a CZ-NACE code prefix, e.g. "62" (IT / programming), "41" (construction), "47" (retail), "10" (food). Combine with City + Legal form to narrow below ARES's 1,000-result cap. No name needed.

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

Filter to a single legal form. Also works as a standalone discovery criterion (e.g. all joint-stock companies in a city).

## `city` (type: `string`):

DISCOVER or filter by registered city (ARES municipality name), e.g. "Praha", "Brno", "Ostrava". Must be combined with a sector or legal form (ARES does not allow a city-only search).

## `addressQuery` (type: `string`):

Extra client-side filter — keep only companies whose full registered address contains this text (a street or district). Applied after the search. Leave empty for none.

## `onlyActive` (type: `boolean`):

Exclude companies that have been dissolved / struck off (have a termination date).

## `includeDirectors` (type: `boolean`):

Attach the statutory body / board (directors' names, roles, tenure), supervisory board and registered share capital from the public register (Veřejný rejstřík). Off by default — adds a lookup per company.

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

Maximum number of companies to return (1–100000). Note: a single discovery query is capped at 1,000 by ARES — narrow with sector + city + form to go deeper.

## Actor input object example

```json
{
  "icoList": [
    "00177041",
    "45274649"
  ],
  "legalForm": "",
  "onlyActive": false,
  "includeDirectors": 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": "",
    "icoList": [
        "00177041",
        "45274649"
    ],
    "naceActivity": "",
    "legalForm": "",
    "city": "",
    "addressQuery": "",
    "includeDirectors": true,
    "maxResults": 1000
};

// Run the Actor and wait for it to finish
const run = await client.actor("foxlabs/czech-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": "",
    "icoList": [
        "00177041",
        "45274649",
    ],
    "naceActivity": "",
    "legalForm": "",
    "city": "",
    "addressQuery": "",
    "includeDirectors": True,
    "maxResults": 1000,
}

# Run the Actor and wait for it to finish
run = client.actor("foxlabs/czech-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": "",
  "icoList": [
    "00177041",
    "45274649"
  ],
  "naceActivity": "",
  "legalForm": "",
  "city": "",
  "addressQuery": "",
  "includeDirectors": true,
  "maxResults": 1000
}' |
apify call foxlabs/czech-company-data --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/k6qhd9qX8dbTjdi0r/builds/6NoDsaxIibQErUmhR/openapi.json
