# Czech ARES Company Registry Scraper (`devilscrapes/czech-company-registry-scraper`) Actor

Look up Czech companies in the official ARES registry by IČO or free-text business name — identity, registered address, NACE activity codes, and active registry sub-sources, as clean, flattened JSON/CSV/Excel rows for KYC, AML, and B2B lead-gen workflows.

- **URL**: https://apify.com/devilscrapes/czech-company-registry-scraper.md
- **Developed by:** [DevilScrapes](https://apify.com/devilscrapes) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

<div align="center">
  <img src=".actor/icon.svg" width="160" alt="Devil Scrapes mark" />

## Czech ARES Company Registry Scraper

**💰 $10.20 / 1 000 results**  ·  pay only for results  ·  no credit card to try

*We do the dirty work so your dataset stays clean.* 😈

Look up Czech companies in the official ARES registry by IČO or free-text business name — identity, registered address, NACE activity codes, and active registry sub-sources, as clean, flattened JSON/CSV/Excel rows for KYC, AML, and B2B lead-gen workflows.

</div>

***

### 🎯 What this scrapes

The Czech Ministry of Finance publishes company records through ARES (Administrativní registr ekonomických subjektů), a keyless, unauthenticated JSON API with a documented, generous 500-requests/minute ceiling and both ID-lookup and name-search in the same API. No visible rival currently holds a Czech ARES-specific listing on the Apify Store. This Actor takes a batch of IČOs and/or free-text business names, flattens each match into a single typed row, and lets you pick exactly which sections you need so you never pay transfer for data you didn't ask for.

### 🔥 What we handle for you

- 🧊 **Flattens ARES's nested JSON envelope** into one clean row — identity, address, NACE codes, and active registrations, picked via a Sections filter so you only pay transfer for what you need.
- 🔢 **IČOs stay strings, always** — leading zeros never get stripped by a spreadsheet export or an overeager number cast.
- 🔁 **We retry transient 429/5xx responses** with exponential backoff, honouring Retry-After when ARES sends one.
- 🩹 **Per-item fault isolation** — one bad IČO or missing sub-key logs a warning and moves on; it never crashes the run.
- 🧱 **Honest not-found handling** — an unknown IČO or a zero-match search still finishes SUCCEEDED with found: false, never a crashed run.
- 💰 **Pay-Per-Event pricing** — a delivered answer (found or not) still costs you $0.01; invalid input costs nothing.
- 🧱 **Rate-limit-aware pacing** — concurrency capped well under ARES's documented 500-requests/minute ceiling, so a big batch never trips the Ministry's throttle.
- 🧊 **Clean, typed dataset rows** — Pydantic-validated, ISO-8601 timestamps, ready for JSON / CSV / Excel export straight from the Apify Console.

### 💡 Use cases

- Run a KYC/AML check on a Czech counterparty by IČO before onboarding.
- Build a Czech B2B prospect list from a batch of business names.
- Verify NACE activity codes and active registrations for a due-diligence file.
- Screen a supplier or partner list for companies missing from the register.

### ⚙️ How to use it

1. Click **Try for free** at the top of the page.
2. Fill in the input form — most fields have sensible defaults.
3. Click **Start**. Output streams into the run's dataset.
4. Export from **Storage → Dataset** as JSON, CSV, or Excel — or fetch via the API.

### 📥 Input

| Field | Type | Required | Default | Notes |
|---|---|:--:|---|---|
| `icos` | `array` | no | \['27074358', '45317054', '00000000'] | Czech IČO company IDs to look up directly via the detail endpoint. Normalized to exactly 8 digits (zero-padded string,… |
| `searchQueries` | `array` | no | \[] | Free-text business names to search via the name-search endpoint. Up to 50 per run, 200 chars each. |
| `enrichWithDetail` | `boolean` | no | False | For search-mode hits only: follow up each match with a detail lookup (adds VAT ID, founding date, NACE codes, active… |
| `resultsPerQuery` | `integer` | no | 20 | Page size per search query. v1 fetches one page per query; total\_matches on each row tells you if more exist. |
| `sections` | `array` | no | \['identity', 'address', 'nace', 'registrations'] | Which flattened sections to project per row — the fewer you request, the leaner (and cheaper to transfer) each row is. |
| `proxyConfiguration` | `object` | no | {'useApifyProxy': False} | ares.gov.cz is a public keyless government JSON API with no anti-bot observed — leave this off unless your account… |

#### Example input

```json
{
  "icos": [
    "27074358",
    "45317054",
    "00000000"
  ],
  "searchQueries": [],
  "enrichWithDetail": false,
  "resultsPerQuery": 20,
  "sections": [
    "identity",
    "address",
    "nace",
    "registrations"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

### 📤 Output

Every row is one dataset item.

| Field | Type | Notes |
|---|---|---|
| `query_type` | `string` | Which input list produced this row: 'ico' or 'search'. |
| `ico` | `string` | 8-digit IČO — the input value (ico-mode) or the matched company's IČO (search-mode). |
| `ico_id` | `string` | ARES's alternate id for entities lacking a plain ico (search-mode only). |
| `search_query` | `string` | The free-text query that produced this row (search-mode only). |
| `total_matches` | `integer` | pocetCelkem for this query (search-mode only). |
| `found` | `boolean` | False for a 404'd IČO or a zero-match search query — not a failure. |
| `warning` | `string` | Populated when found is false, a lookup failed after retries, or a requested section degraded. |
| `name` | `string` | Registered entity name (identity section). |
| `legal_form_code` | `string` | Legal form code (identity section). |
| `founding_date` | `string` | ISO YYYY-MM-DD, detail-only (identity section). |
| `vat_id` | `string` | VAT ID, detail-only (identity section). |
| `tax_office` | `string` | Tax office, search-mode-only field (identity section). |
| `last_updated` | `string` | Last-updated date (identity section). |
| `address_street` | `string` | Registered street (address section). |
| `address_house_number` | `string` | Registered house number (address section). |
| `address_orientation_number` | `string` | Registered orientation number (address section). |
| `address_city` | `string` | Registered city (address section). |
| `address_postal_code` | `string` | Registered postal code (address section). |
| `address_country_name` | `string` | Registered country name (address section). |
| `address_country_code` | `string` | Registered country code (address section). |
| `address_full_text` | `string` | Full registered address as a single string (address section). |
| `nace_codes` | `array` | NACE business-activity codes, detail-only (nace section) — empty list when not requested or none on file. |
| `active_registrations` | `array` | Simplified names of registry sub-sources currently active, detail-only (registrations section) — empty list when not… |
| `source_url` | `string` | The exact detail or search URL queried for this row. |
| `scraped_at` | `string` | ISO 8601 UTC timestamp when this row was recorded. |

#### Example output

```json
{
  "query_type": "ico",
  "ico": "27074358",
  "ico_id": null,
  "search_query": null,
  "total_matches": null,
  "found": true,
  "warning": null,
  "name": "Asseco Central Europe, a.s.",
  "legal_form_code": "121",
  "founding_date": "2004-06-25",
  "vat_id": "CZ27074358",
  "tax_office": null,
  "last_updated": "2026-08-30",
  "address_street": "Bud\u011bjovick\u00e1",
  "address_house_number": "778",
  "address_orientation_number": "3",
  "address_city": "Praha",
  "address_postal_code": "14000",
  "address_country_name": "\u010cesk\u00e1 republika",
  "address_country_code": "CZ",
  "address_full_text": "Bud\u011bjovick\u00e1 778/3, 14000 Praha",
  "nace_codes": [
    "6201Z",
    "6202Z"
  ],
  "active_registrations": [
    "Obchodn\u00ed rejst\u0159\u00edk",
    "Registr pl\u00e1tc\u016f DPH"
  ],
  "source_url": "https://ares.gov.cz/ekonomicke-subjekty-v-be/rest/ekonomicke-subjekty/27074358",
  "scraped_at": "2026-09-08T12:00:00+00:00"
}
```

### 💰 Pricing

Pay-Per-Event — you pay only when these events fire:

| Event | USD | What it is |
|---|---:|---|
| `actor-start` | $0.2 | One-off warm-up charge per run |
| `result-scraped` | $0.01 | Per unique dataset item |

Example: 1 000 results at the rates above ≈ **$10.20**. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.

### 🚧 Limitations

- No auto-pagination across multiple search pages per query in v1 — resultsPerQuery caps at 100 and total\_matches tells you if more exist.
- Search is by business name only — not by IČO substring, VAT ID, or address.
- Only current-state data is returned; no historical/change-log data.
- ARES documents a 500-requests/minute ceiling in the Ministry of Finance's open-data docs — we keep concurrency well under it by default, so very large batches take proportionally longer rather than risking a throttle.

### ❓ FAQ

**Do I need an API key?**

No. ares.gov.cz is a public Czech Ministry of Finance API and needs no credentials — leave the proxy setting off too.

**What happens if an IČO doesn't exist?**

The row comes back with found: false and a warning describing what was queried — the run still finishes SUCCEEDED, you're never billed for a failed run just because one IČO was wrong.

**Can I search by VAT ID or address instead of a name?**

Not in v1 — ARES's keyless search endpoint takes a business name only. Look up the IČO first if you only have a VAT ID or address.

**Why do some fields come back null in search mode?**

Search rows are lighter than detail records. Set enrichWithDetail to true to fetch the full detail record for each match, or look the company up directly by IČO.

### 💬 Your feedback

Spotted a bug, hit a weird edge case, or need a new field? Open an
issue on the Actor's **Issues** tab on Apify Console — we ship
fixes weekly and we read every report.

***

<div align="center">

Built by **[Devil Scrapes](https://apify.com/DevilScrapes)** 😈 — a small fleet of
opinionated public-data Actors. Honest pricing, real engineering, zero fine print.

</div>

# Actor input Schema

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

Czech IČO company IDs to look up directly via the detail endpoint. Normalized to exactly 8 digits (zero-padded string, leading zeros preserved). Up to 500 per run.

## `searchQueries` (type: `array`):

Free-text business names to search via the name-search endpoint. Up to 50 per run, 200 chars each.

## `enrichWithDetail` (type: `boolean`):

For search-mode hits only: follow up each match with a detail lookup (adds VAT ID, founding date, NACE codes, active registrations). Direct IČO lookups always use the detail endpoint regardless of this flag.

## `resultsPerQuery` (type: `integer`):

Page size per search query. v1 fetches one page per query; total\_matches on each row tells you if more exist.

## `sections` (type: `array`):

Which flattened sections to project per row — the fewer you request, the leaner (and cheaper to transfer) each row is.

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

ares.gov.cz is a public keyless government JSON API with no anti-bot observed — leave this off unless your account requires egress through Apify Proxy.

## Actor input object example

```json
{
  "icos": [
    "27074358",
    "45317054",
    "00000000"
  ],
  "searchQueries": [
    "Asseco"
  ],
  "enrichWithDetail": false,
  "resultsPerQuery": 5,
  "sections": [
    "identity",
    "address",
    "nace",
    "registrations"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

All dataset items as JSON.

## `datasetItemsCsv` (type: `string`):

Same data exported to CSV.

## `datasetView` (type: `string`):

Open the run dataset in the Console.

# 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": [
        "27074358",
        "45317054",
        "00000000"
    ],
    "searchQueries": [
        "Asseco"
    ],
    "enrichWithDetail": false,
    "resultsPerQuery": 5,
    "sections": [
        "identity",
        "address",
        "nace",
        "registrations"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("devilscrapes/czech-company-registry-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 = {
    "icos": [
        "27074358",
        "45317054",
        "00000000",
    ],
    "searchQueries": ["Asseco"],
    "enrichWithDetail": False,
    "resultsPerQuery": 5,
    "sections": [
        "identity",
        "address",
        "nace",
        "registrations",
    ],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("devilscrapes/czech-company-registry-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 '{
  "icos": [
    "27074358",
    "45317054",
    "00000000"
  ],
  "searchQueries": [
    "Asseco"
  ],
  "enrichWithDetail": false,
  "resultsPerQuery": 5,
  "sections": [
    "identity",
    "address",
    "nace",
    "registrations"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call devilscrapes/czech-company-registry-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,devilscrapes/czech-company-registry-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/RcIEl8AMXcnefH6Po/builds/CFPggV6L5CgQWR1O5/openapi.json
