# CZ & SK Company Risk Check — KYB Screening (`relevate/cz-sk-company-risk`) Actor

Screen Czech and Slovak companies against four official registers in one call: ARES, the business register, the unreliable-VAT-payer list and the insolvency register (ISIR) plus Slovak RPO. Returns one clean risk JSON per company with explicit, sourced risk flags.

- **URL**: https://apify.com/relevate/cz-sk-company-risk.md
- **Developed by:** [Relevate](https://apify.com/relevate) (community)
- **Categories:** Agents, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $50.00 / 1,000 company screeneds

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

## CZ & SK Company Risk Check — KYB Screening from Official Registers

Screen **Czech and Slovak companies** against the official public registers and get back **one clean risk JSON per company** — identity, ownership, VAT reliability, insolvency and liquidation, plus explicit risk flags you can act on.

Built for onboarding a new supplier, checking a customer before you extend credit, cleaning a CRM, or giving an AI agent a `check_company` tool.

### Why this actor

- ✅ **Four official sources in one call** — ARES, the Czech business register (*veřejný rejstřík*), the Czech unreliable-VAT-payer register, and the Slovak RPO run by the Statistical Office. Government APIs, not scraped web pages.
- ✅ **Explicit, sourced risk flags** — every flag says *what* it found and *where*. No black-box score you cannot defend to your auditor.
- ✅ **The VAT trap, covered** — the officially published bank accounts of a Czech VAT payer. Paying a supplier's unpublished account can make **you** liable for their unpaid VAT. This is the check most tools skip.
- ✅ **CZ and SK in one schema** — the same output shape for both countries, so your pipeline does not care which side of the border a supplier is on.
- ✅ **No personal data by default** — directors and shareholders are returned as roles and counts. Names are strictly opt-in (see below).

### Risk flags

| Flag | Severity | Meaning |
|---|---|---|
| `company-terminated` | critical | Struck from the register |
| `in-liquidation` | critical | Liquidation recorded in the register, or in the registered name |
| `in-bankruptcy` | critical | Insolvency indicated by the registered name |
| `insolvency-proceedings` | critical | Open insolvency entry in the business register |
| `unreliable-vat-payer` | critical | Listed as unreliable by the Czech tax administration |
| `past-insolvency` | medium | Closed insolvency entry in the register history |
| `inactive-status` | high | Register status is not active |
| `no-statutory-body` | high | No current director registered |
| `no-published-bank-account` | medium | VAT-registered but no account published |
| `young-company` | medium | Registered less than 12 months ago |
| `frequent-name-changes` | medium | Traded under three or more former names |
| `source-unavailable` | info | A source did not answer — the result is incomplete, and says so |

`riskScore` (0–100) and `riskLevel` (`none` / `low` / `medium` / `high`) summarise the flags. The flags are the product; the score is a convenience.

### Input

| Field | Example | Notes |
|---|---|---|
| `companyIds` | `["27074358", "31333532"]` | Czech or Slovak IČO. The exact way to screen. |
| `companyNames` | `["Alza.cz a.s."]` | Resolved to the best register match. Prefer IDs. |
| `country` | `"auto"` | CZ and SK IDs are both 8 digits — auto tries CZ, then SK. |
| `includeRegisterDetail` | `true` | Statutory bodies, owners, capital, insolvency and liquidation entries. |
| `includeVatCheck` | `true` | Unreliable-payer flag + published bank accounts (CZ). |
| `includePersons` | `false` | See the note below before turning this on. |
| `maxResults` | `100` | Safety cap. |

### Output example

```json
{
    "found": true,
    "companyId": "25083325",
    "name": "Sberbank CZ, a.s. v likvidaci",
    "country": "CZ",
    "vatId": "CZ25083325",
    "legalForm": "Akciová společnost",
    "foundedOn": "1996-11-01",
    "address": { "full": "U Trezorky 921/2, Jinonice, 15800 Praha 5", "municipality": "Praha" },
    "fileNumber": "B 4353/MSPH",
    "vat": {
        "isVatPayer": true,
        "isUnreliablePayer": false,
        "publishedBankAccounts": ["8010200037/6800", "CZ1768000000009000001936"]
    },
    "insolvency": { "recordedInBusinessRegister": true, "openRecords": 1, "verifyUrl": "https://isir.justice.cz/…" },
    "liquidation": { "inLiquidation": true, "evidence": ["registered name contains \"v likvidaci\""] },
    "riskLevel": "high",
    "riskScore": 88,
    "riskFlags": [
        { "code": "in-liquidation", "severity": "critical", "message": "The company is in liquidation…" },
        { "code": "insolvency-proceedings", "severity": "critical", "message": "1 open insolvency entry in the business register." }
    ]
}
```

Every run also writes a `RUN_SUMMARY` record to the key-value store.

### Typical use cases

| Who | How |
|---|---|
| Finance / AP teams | Before paying an invoice, verify the account number is one the supplier published — otherwise you can be liable for their VAT |
| Sales & credit control | Batch-screen the pipeline; block deals with companies in liquidation |
| Compliance / KYB | Documented, sourced evidence for the file — flags cite the register entry |
| CRM data teams | Re-screen the customer base on a Schedule and alert on new critical flags |
| AI agents | One `check_company` tool call returns everything an agent needs to reason about counterparty risk |

### Personal data

By default the output contains **no names of natural persons**. Directors and shareholders appear as `{ role, since, isNaturalPerson }`; corporate directors and corporate shareholders are named, because a company is not a person.

Turning on `includePersons` adds the names published by the registers themselves (home addresses are always reduced to the municipality). Those registers are public, but processing that data still makes **you** the controller under the GDPR — use it only where you have a lawful basis, such as a genuine KYB or AML obligation.

### Sources & accuracy

| Source | Operator | Used for |
|---|---|---|
| [ARES](https://ares.gov.cz) | Ministry of Finance, CZ | Identity, address, legal form, NACE, registrations |
| Veřejný rejstřík (via ARES) | Ministry of Justice, CZ | Statutory bodies, owners, capital, insolvency, liquidation |
| Registr plátců DPH | Financial Administration, CZ | Unreliable-payer flag, published bank accounts |
| [RPO](https://api.statistics.sk) | Statistical Office, SK | Slovak identity, bodies, stakeholders, capital, predecessors — CC-BY 4.0 |

Insolvency is reported **as recorded in the business register**, with a link to the insolvency register (ISIR) for the authoritative check — ISIR itself is behind a CAPTCHA and this actor does not attempt to bypass it. Register data has a natural lag of days; treat this as a screening layer, not a legal opinion.

### Pricing

Pay per event: a small fee per run start plus a fee per company screened.

### Roadmap

- Polish (KRS) and Hungarian company registers in the same schema
- Financial statements (Sbírka listin / Register účtovných závierok) — revenue, equity, filing gaps
- Corporate ownership chains and ultimate beneficial owners

# Actor input Schema

## `companyIds` (type: `array`):

Czech or Slovak 8-digit company registration numbers. This is the exact, unambiguous way to screen a company.

## `companyNames` (type: `array`):

Screen by name instead. The best register match is used — always prefer company IDs when you have them.

## `country` (type: `string`):

Czech and Slovak company IDs share the same 8-digit format. Auto tries the Czech register first, then the Slovak one. Pick a country to skip the guess.

## `includeRegisterDetail` (type: `boolean`):

Statutory bodies, owners, registered capital, file number, former names, and — importantly — the insolvency and liquidation entries recorded in the public business register (ARES VR / RPO).

## `includeVatCheck` (type: `boolean`):

Queries the Czech tax administration for the unreliable-VAT-payer flag and the officially published bank accounts. Paying an unpublished account can make you liable for your supplier's unpaid VAT.

## `includePersons` (type: `boolean`):

OFF by default. When on, the output includes the names of natural persons acting as directors or shareholders, as published in the public registers (home addresses are always reduced to the municipality). Enabling this makes YOU the controller of that personal data — make sure you have a lawful basis under the GDPR.

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

Safety cap on how many companies are screened in one run.

## `minExpectedResults` (type: `integer`):

Fail the run if fewer than this many companies are screened. Use it in scheduled pipelines to get alerted when a source changes. 0 disables the check.

## Actor input object example

```json
{
  "companyIds": [
    "27074358",
    "31333532"
  ],
  "companyNames": [],
  "country": "auto",
  "includeRegisterDetail": true,
  "includeVatCheck": true,
  "includePersons": false,
  "maxResults": 100,
  "minExpectedResults": 0
}
```

# 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 = {
    "companyIds": [
        "27074358",
        "31333532"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("relevate/cz-sk-company-risk").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 = { "companyIds": [
        "27074358",
        "31333532",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("relevate/cz-sk-company-risk").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 '{
  "companyIds": [
    "27074358",
    "31333532"
  ]
}' |
apify call relevate/cz-sk-company-risk --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,relevate/cz-sk-company-risk"
        }
    }
}

```

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/D2QElKvaVfcqdI8ZP/builds/NJNSAHQuTjdOdnTbd/openapi.json
