# Czech Companies (ARES) - IČO Lookup, VAT & NACE Search (`jpopendata/czech-ares-companies`) Actor

Czech companies and other legal entities from ARES, the official register of the Czech Ministry of Finance: IČO lookup (100 per request) or search by name, legal form, CZ-NACE, municipality and region, with VAT status. No sole traders. Unofficial; not affiliated with the Ministry of Finance.

- **URL**: https://apify.com/jpopendata/czech-ares-companies.md
- **Developed by:** [JP Open Data](https://apify.com/jpopendata) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Czech Companies (ARES) — IČO Lookup, VAT & NACE Search

Get Czech companies and other legal entities from **ARES** (Administrativní registr ekonomických subjektů), the official register of economic subjects run by the **Ministry of Finance of the Czech Republic**, through its public REST API. No account, no API key.

- **IČO lookup** — paste up to 5,000 IČOs; they are checked 100 per request. You get the name, legal form, status, VAT payer flag, tax ID (DIČ), CZ-NACE activities, municipality / postcode / region, register file number and the status in each source register.
- **Company search** — by name keyword, legal form, CZ-NACE 2025 activity code and municipality; filter the rows by region and status.
- **Legal entities only.** Sole traders (OSVČ, natural persons) are never requested, so no personal data of individuals is collected.

### Quick start — verified input

```json
{
  "legalForms": ["a.s."],
  "nace": ["62"],
  "municipalities": ["Brno"],
  "maxItems": 20
}
```

Returns 20 IT joint-stock companies with their registered office in Brno (one request, a few seconds). Running the Actor with an **empty input `{}` does exactly the same**.

IČO lookup example (verified):

```json
{
  "icos": ["00177041", "27082440", "45274649", "24261980", "00006947"]
}
```

### Input

| Field | What to enter | Example |
|---|---|---|
| `icos` | IČO numbers to look up (missing leading zeros and a `CZ` prefix are fine). Up to 5,000. When set, the search fields are ignored and every IČO found is returned. | `["00177041", "CZ27082440", "6947"]` |
| `keyword` | Words of the registered name. ARES matches the words in any order, ignoring case and accents. | `"skoda auto"` |
| `legalForms` | Abbreviations, names or 3-digit codes. Empty = every legal-entity form. | `["s.r.o.", "a.s.", "družstvo"]` |
| `nace` | CZ-NACE 2025 codes (NACE Rev. 2.1). Every code below the one you give is included. | `["62"]`, `["47.1"]`, `["J"]` |
| `municipalities` | Municipality names in Czech (accents optional; Prague districts like `"Praha 5"` work) or 6-digit RÚIAN codes. | `["Brno", "Ostrava", "554782"]` |
| `regions` | Region names (Czech or English) or NUTS 3 codes. Filters the rows of a search that is already narrowed by keyword, NACE or municipality. | `["South Moravian"]`, `["CZ064"]` |
| `status` | `any` (default), `active` or `ceased`. | `"active"` |
| `maxItems` | Maximum rows for a search (1–20,000). Not applied to IČO lookups. | `500` |
| `maxApiRequests` | Hard cap on requests to ARES in one run (default 200). | `50` |

A search needs at least one of `keyword`, `nace` or `municipalities`: ARES returns at most 1,000 matches per query and has no region filter. When a query matches more than 1,000 entities, the Actor splits it by legal form or NACE code where it can, and tells you in the log and in the `RUN_SUMMARY` record which part was still too broad.

### Output

One row per legal entity (shortened):

```json
{
  "ico": "00177041",
  "aresId": "00177041",
  "name": "Škoda Auto a.s.",
  "legalFormCode": "121",
  "legalForm": "Akciová společnost",
  "legalFormEn": "Joint-stock company (a.s.)",
  "status": "active",
  "establishedOn": "1990-11-20",
  "ceasedOn": null,
  "vatRegistered": true,
  "taxId": "CZ00177041",
  "vatGroupTaxId": null,
  "inInsolvencyRegister": false,
  "naceCodes": ["70200", "471", "77110"],
  "naceNames": ["Poradenství v oblasti podnikání a řízení podniků", "Nespecializovaný maloobchod", "Pronájem a leasing osobních automobilů a lehkých motorových vozidel"],
  "naceCodes2008": ["29100", "45200", "471"],
  "municipality": "Mladá Boleslav",
  "municipalityCode": 535419,
  "postalCode": "29301",
  "district": "Mladá Boleslav",
  "districtCode": 3207,
  "region": "Středočeský kraj",
  "regionCode": 27,
  "country": "Česká republika",
  "countryCode": "CZ",
  "courtFileNumber": "B 332/MSPH",
  "primarySource": "basicRegisterOfPersons",
  "registrations": { "publicRegister": "active", "vat": "active", "exciseTax": "ceased", "insolvencyRegister": "not_registered", "...": "..." },
  "activeRegisters": ["publicRegister", "statisticalRegister", "tradeLicenceRegister", "basicRegisterOfPersons", "vat", "healthcareProviders", "schools", "subsidies"],
  "lastUpdated": "2026-09-16",
  "aresUrl": "https://ares.gov.cz/ekonomicke-subjekty?ico=00177041",
  "matchedBy": "ico",
  "source": "ARES - Administrativní registr ekonomických subjektů (Ministry of Finance of the Czech Republic)",
  "sourceUrl": "https://ares.gov.cz/",
  "license": "Source: ARES (Administrativní registr ekonomických subjektů), Ministry of Finance of the Czech Republic, ...",
  "retrievedAt": "2026-10-13T06:40:00.000Z"
}
```

Field notes:

- `status` is `active`, `ceased` (ARES gives a cessation date, or the primary register / the Basic Register of Persons marks the entity as ceased) or `unknown`. Entities "v likvidaci" (in liquidation) stay `active` until they are struck off.
- `vatRegistered` is `true` when the entity is an active VAT payer (ARES register DPH). `taxId` (DIČ) can exist without VAT registration.
- `naceCodes` are CZ-NACE 2025 codes, `naceNames` their Czech names in the same order; `naceCodes2008` are the older codes.
- `registrations` shows the status in each source register: public register (commercial register, associations, foundations…), statistical register (RES), trade licence register, Basic Register of Persons, VAT, VAT group, excise tax, insolvency register, bankruptcy register, healthcare providers, churches, political parties, schools, agriculture, subsidies, state accounting.
- The registered address is reduced to **municipality, postcode, district, region and country**. Street and house number are not included.
- A few registered branches have no IČO of their own: `ico` is `null` and `aresId` is `ARES_…`.
- The `RUN_SUMMARY` record in the key-value store lists the queries, the IČOs that were not found, rows filtered out by region/status, and why a run stopped early (if it did).

### Common input mistakes

| You entered | Use instead | Why |
|---|---|---|
| `"legalForms": ["OSVČ"]` | a legal-entity form such as `"s.r.o."` | Sole traders (natural persons) are never returned. |
| `"regions": ["Brno"]` | `"municipalities": ["Brno"]` | Brno is a municipality; regions are kraje such as `"Jihomoravský kraj"`. |
| `"nace": ["62.01"]` | `"nace": ["62"]` or `["62.10"]` | ARES uses CZ-NACE 2025; 62.01 was a 2008 code. A division includes all its sub-codes. |
| `"municipalities": ["60200"]` | `"municipalities": ["Brno"]` or `["582786"]` | Postcodes are not municipality codes (those have 6 digits). |
| only `"legalForms": ["s.r.o."]` | add a keyword, NACE code or municipality | ARES returns at most 1,000 matches per query. |
| `"icos": ["1234567"]` (wrong digit) | the exact 8-digit IČO | IČOs have a check digit; invalid ones are skipped and listed in the log. |

### Empty results?

- The keyword does not appear as a word in any registered name. Use full words (`"kofola"`, `"skoda auto"`); accents and case do not matter.
- The filters exclude everything together (e.g. a NACE subclass plus a small municipality plus a rare legal form). Try a NACE division such as `"62"`.
- The municipality is spelled differently from the register, or many villages share the name — use the 6-digit municipality code.
- `status: "ceased"` — ARES searches return few ceased entities.
- In an IČO lookup, an IČO that is not returned either does not exist in ARES or belongs to a sole trader (never requested). Such IČOs are listed in `RUN_SUMMARY.notFoundIcos`.

### How it works

The Actor calls only the documented ARES search endpoint (`POST /ekonomicke-subjekty-v-be/rest/ekonomicke-subjekty/vyhledat`). Requests are sent one at a time, at least 1.2 seconds apart — far below the ARES limit of 500 queries per minute — with a hard request budget, no repeated identical queries and no rotation of IP addresses, as the ARES operating conditions require. Datacenter access works directly; no proxy is needed.

### Data source, terms and disclaimer

- **Unofficial tool. Not affiliated with or endorsed by the Ministry of Finance of the Czech Republic or the source registers.**
- Data: ARES — Administrativní registr ekonomických subjektů, Ministry of Finance of the Czech Republic, https://ares.gov.cz. ARES makes public data of the Czech source registers available; the Ministry states that anyone may use the service within its query limits.
- The Ministry states that ARES information is **for information purposes only and cannot be used as conclusive evidence in court proceedings**, and that it is not responsible for how ARES data are used or interpreted in other systems. Check the source register (e.g. the commercial register) before relying on a record. Every row carries the source, link and this notice.
- Only public data of legal entities is returned. Registered names of some legal entities contain personal names (e.g. a partnership named after its partners); they are output as registered. Statutory bodies, members and other natural persons are never requested.
- You are responsible for using the data lawfully, including the GDPR and the rules on unsolicited marketing that apply to you.

# Actor input Schema

## `icos` (type: `array`):

Optional. Czech company IDs (IČO), e.g. "00177041" (Škoda Auto), "27082440" (Alza.cz), "45274649" (ČEZ). Missing leading zeros and a "CZ" prefix (DIČ form) are fine. Up to 5,000 per run, 100 per ARES request. When this list is set, the search fields below are ignored, every IČO found is returned (Max results does not apply), and IČOs not returned are listed in the RUN_SUMMARY record (not in ARES, or a sole trader, which this Actor never requests).

## `keyword` (type: `string`):

Optional. Words of the registered name, e.g. "kofola", "skoda auto", "stavební". ARES matches the words in any order and ignores case and accents.

## `legalForms` (type: `array`):

Optional. Abbreviations, names or 3-digit codes: "s.r.o." (112, limited liability company), "a.s." (121, joint-stock company), "v.o.s." (111), "k.s." (113), "družstvo" / "cooperative" (205), "spolek" / "z.s." (706), "o.p.s." (141), "z.ú." (161), "nadace" (117), "SVJ" (145), "SE" (932), "branch" (501). Empty = every legal-entity form. Sole traders (OSVČ) cannot be selected.

## `nace` (type: `array`):

Optional. CZ-NACE 2025 codes (NACE Rev. 2.1): a section letter ("J"), a division ("62" = computer programming and consultancy), a group or class ("62.10" / "6210") or a subclass ("62109"). Every code below the one you give is included automatically. An entity matches if ANY of its activity codes matches.

## `municipalities` (type: `array`):

Optional. Municipality names as written in Czech, e.g. "Brno", "Praha", "Ostrava", "Plzeň" (accents optional; "Praha 5" or "Brno-střed" districts work too), or 6-digit RÚIAN municipality codes (582786 = Brno, 554782 = Praha). For names shared by many villages (Lhota, Nová Ves) use the code. Up to 20; each one is a separate ARES search.

## `regions` (type: `array`):

Optional. Czech or English region names or NUTS 3 codes, e.g. "Jihomoravský kraj", "South Moravian", "CZ064", "Prague". ARES has no region search, so regions filter the rows of a search that is already narrowed by a keyword, NACE code or municipality.

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

any (default) returns every entity with its status field; active keeps only active entities; ceased keeps only entities ARES marks as ceased (searches rarely return them).

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

Stop a search after this many entities (1..20,000). ARES returns at most 1,000 matches per query; broader searches are split by legal form or NACE code when possible. Does not apply to IČO lookups.

## `maxApiRequests` (type: `integer`):

Hard cap on requests to ARES in this run (1..2,000; requests are sent one at a time, at least 1.2 s apart). The Quick start needs 1; an IČO lookup needs 1-2 per 100 IČOs.

## `proxyConfiguration` (type: `object`):

Not needed: ARES answers Apify datacenter IPs directly. If you add a proxy, the whole run uses one sticky session (one IP, no rotation, as the ARES operating conditions require).

## Actor input object example

```json
{
  "icos": [],
  "keyword": "",
  "legalForms": [],
  "nace": [],
  "municipalities": [],
  "regions": [],
  "status": "any",
  "maxItems": 20,
  "maxApiRequests": 200,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `records` (type: `string`):

One row per Czech legal entity with the ARES attribution (source, sourceUrl, license, retrievedAt) on every item.

# 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 = {
    "icos": [],
    "keyword": "",
    "legalForms": [],
    "nace": [],
    "municipalities": [],
    "regions": [],
    "status": "any",
    "maxItems": 20,
    "maxApiRequests": 200,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("jpopendata/czech-ares-companies").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 = {
    "icos": [],
    "keyword": "",
    "legalForms": [],
    "nace": [],
    "municipalities": [],
    "regions": [],
    "status": "any",
    "maxItems": 20,
    "maxApiRequests": 200,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("jpopendata/czech-ares-companies").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 '{
  "icos": [],
  "keyword": "",
  "legalForms": [],
  "nace": [],
  "municipalities": [],
  "regions": [],
  "status": "any",
  "maxItems": 20,
  "maxApiRequests": 200,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call jpopendata/czech-ares-companies --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jpopendata/czech-ares-companies"
        }
    }
}
```

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/aYB34d2st1LMaeb7E/builds/KR2I50uoV1tK0yuZH/openapi.json
