# CEE Company Due Diligence (CZ/SK/PL) Risk Summary (`quietpinelabs/cee-due-diligence`) Actor

One risk summary per Czech, Slovak or Polish company from official registers: ARES / RPO / KRS profile, ISIR insolvency, Registr smluv contract exposure, TED tenders — with coded flags, a documented heuristic score and source links. One price per company.

- **URL**: https://apify.com/quietpinelabs/cee-due-diligence.md
- **Developed by:** [Quietpine Labs](https://apify.com/quietpinelabs) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $35.00 / 1,000 due-diligence summaries

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Company risk summaries for Czechia, Slovakia and Poland from official registers (ARES, RPO, KRS, ISIR, Registr smluv, TED)

Give it a list of Czech, Slovak or Polish companies (IČO or KRS number) and get **one JSON risk summary per company**: the register profile (ARES, RPO or KRS), the Czech insolvency register (ISIR), optional public-contract exposure from Registr smluv, TED tender counts, coded red flags with severities, a transparent heuristic score and a source link plus licence for every register touched. All sources are official open-data channels queried in-process, so you pay one price per company and nothing per source. Lookup is by identifier only — no name search.

### Who uses it

- **KYC/AML and supplier-onboarding teams** — first screening of counterparties in three jurisdictions with one input shape.
- **Procurement and credit teams** — dissolution, liquidation, insolvency, contract and tender exposure before signing; flagged companies routed onward via Make, Zapier or n8n.
- **Journalists and analysts** — batch-screen up to 200 companies per run and filter on flags.

### Use cases

**1. Screen a mixed CZ/SK/PL list with the default checks:**

```json
{ "entities": [{ "country": "CZ", "id": "45274649" }, { "country": "SK", "id": "35763469" }, { "country": "PL", "id": "0000028860" }] }
```

**2. Czech counterparties including public-contract exposure over the last three months:**

```json
{ "entities": [{ "country": "CZ", "id": "26863154" }], "checks": { "contracts": true }, "contractsMonths": 3 }
```

Adds `publicContracts` (count and CZK sum) — heavier, see *Limits & fair use*.

**3. Profile and insolvency only, no officers, no TED (fastest):**

```json
{ "icos": ["45274649", "26863154"], "checks": { "tenders": false, "officers": false } }
```

### Input

| Field | Type | Default | Meaning |
|---|---|---|---|
| `entities` | `{ country, id }[]` (max 200) | ČEZ (CZ) + Slovak Telekom (SK) | `country` is `CZ`, `SK` or `PL`; `id` is the IČO (CZ/SK, checksum-validated) or the KRS number (PL). Invalid ids are reported and never charged. |
| `icos` | string\[] | – | Shorthand: Czech IČO added as `{ country: "CZ" }` entities. |
| `checks.insolvency` | boolean | `true` | **CZ only** — ISIR lookup by IČO. SK and PL have no official machine-readable insolvency API; their summaries say so (`insolvency.checked: false`, info flag). |
| `checks.contracts` | boolean | `false` | **CZ only** — streams Registr smluv dumps once per run and counts contracts where the entity is publisher or a party. Heavier: about 130 MB per previous month, 1–3 minutes. |
| `checks.tenders` | boolean | `true` | All countries — TED counts of notices with the entity as buyer and awards naming it as winner (two requests per entity). PL uses the NIP/REGON from the KRS profile, so it is skipped when KRS did not answer. |
| `checks.officers` | boolean | `true` | Include officers (names, roles, dates) in the profile; for CZ this adds one ARES request per entity and also yields share capital and previous names. |
| `tendersSinceDays` | integer 1–3660 | `365` | TED look-back window. |
| `contractsMonths` | integer 1–3 | `2` | Registr smluv window: current month plus `contractsMonths − 1` previous months. |
| `maxRecords` | integer | `1000` | Maximum number of entities summarised. |

`name`, `region`, `dateFrom`/`dateTo` and `mode` are not applicable (see *Incremental mode*).

### Output

One `RiskSummary` per entity. Real record from the default input (local run on 2026-10-18; the embedded `profile` is the ARES actor's `CompanyProfile`, shortened here — officer names to initials, NACE and registrations omitted):

```jsonc
{
  "entity": { "country": "CZ", "id": "45274649", "name": "ČEZ, a. s." },
  "profile": {
    "country": "CZ", "id": "45274649", "idType": "ico", "name": "ČEZ, a. s.", "kind": "legal-person",
    "legalForm": { "code": "121", "label": "Akciová společnost" }, "status": "active",
    "registeredAddress": { "street": "Duhová", "houseNumber": "1444/2", "city": "Praha", "postalCode": "14000", "region": "Hlavní město Praha", "country": "CZ", "formatted": "Duhová 1444/2, 14000 Praha, CZ" },
    "vatId": "CZ45274649", "establishedOn": "1992-05-06",
    "officers": [ { "name": "I. D. B. M.", "role": "předseda představenstva", "roleCode": "STATUTARNI_ORGAN_CLEN", "from": "2025-12-20" } /* … 15 more */ ],
    "shareCapital": { "amount": 53798975900, "currency": "CZK" }, "previousNames": [],
    "provenance": { "source": "ares", "sourceUrl": "https://ares.gov.cz/ekonomicke-subjekty?ico=45274649", "licence": "Zdroj: ARES, Ministerstvo financí ČR …", "retrievedAt": "2026-10-18T02:30:03.139Z", "sourceUpdatedAt": "2026-10-08" }
    // … nace, otherIds, registrations
  },
  "insolvency": { "checked": true, "active": false, "proceedings": 0 },
  "publicContracts": { "checked": false, "count": 0 },
  "tenders": { "checked": true, "noticesAsBuyer": 701, "awardsAsWinner": 1 },
  "flags": [
    { "code": "TED_BUYER", "severity": "info", "message": "701 TED notice(s) as contracting authority/buyer" },
    { "code": "TED_WINNER", "severity": "info", "message": "1 TED award notice(s) naming the entity as winner/tenderer" }
  ],
  "score": 0,
  "sources": [
    { "source": "ares", "url": "https://ares.gov.cz/ekonomicke-subjekty?ico=45274649", "licence": "Zdroj: ARES, Ministerstvo financí ČR …" },
    { "source": "isir", "url": "https://isir.justice.cz/", "licence": "Zdroj: Insolvenční rejstřík, Ministerstvo spravedlnosti ČR …" },
    { "source": "ted", "url": "https://ted.europa.eu/", "licence": "Source: TED, Publications Office of the European Union …" }
  ],
  "generatedAt": "2026-10-18T02:30:02.930Z"
}
```

The Slovak company in the same run came back with `insolvency: { "checked": false, …, "error": "no official API for this country" }` and the info flag `INSOLVENCY_CHECK_UNAVAILABLE`.

`profile` is absent when the register did not answer or does not know the id. Each check block carries `checked` and, on failure, `error`. `sources[]` lists every register touched with a deep link and its licence text.

Flags: **high** — `REGISTRY_NOT_FOUND`, `DISSOLVED`, `IN_LIQUIDATION`, `IN_INSOLVENCY_ACTIVE` (ISIR case number and deep link for CZ, register status for SK/PL); **medium** — `INSOLVENCY_HISTORY` (closed proceedings only), `SOURCE_UNAVAILABLE_<source>` (an outage is never reported as a clean result); **low** — `RECENTLY_ESTABLISHED` (under 12 months), `FREQUENT_NAME_CHANGES` (3 or more), `NO_OFFICERS_LISTED`; **info** — `NO_NACE`, `VAT_NOT_REGISTERED` (CZ), `PUBLIC_CONTRACT_EXPOSURE`, `TED_BUYER`, `TED_WINNER`, `INSOLVENCY_CHECK_UNAVAILABLE` (SK/PL).

**Score (heuristic, not a credit score):** `score = min(100, sum of weights)` with high = 40, medium = 20, low = 10, info = 0 — a transparent sum of the flags, nothing more. It does not predict default, is not calibrated against outcome data, and deliberately counts `SOURCE_UNAVAILABLE` flags. Use the flags, not the number, for decisions; 0 means no weighted heuristic fired, not "safe".

### Pricing in plain words

You pay **$0.05 per company summary returned**, plus $0.00005 per run start — no per-source fees. A summary is charged only when it is informative: the profile was found, the id was definitely not found, or at least one check completed. Never charged: invalid ids, and summaries in which no source answered at all (still written to the dataset with their `SOURCE_UNAVAILABLE_*` flags). On the free plan ($5 monthly credit) that is about 100 companies a month. Bronze, Silver and Gold volume discounts are configured on the store page. The run stops gracefully at `maxRecords` or your maximum total charge.

### Limits & fair use

- Max **200 entities per run**, processed two at a time. Every bundled source keeps its own pacing within the publishers' limits: ARES 4 requests/s (published limit 500/min), ISIR 1 request/s (ceiling 3,000/day, 50/min), RPO 1 request/s and KRS 1.5 requests/s (no published limits), TED 2 requests/s (fair-usage 700/min), Registr smluv 1 download/s. Keep the total of your due-diligence and ISIR runs below about 2,500 IČO per day.
- Requests per entity: CZ 1–2 ARES + 1 ISIR + 2 TED; SK 2 RPO + 2 TED; PL 1–3 KRS + 2 TED. The default two entities finish in about 5 s; 200 Czech entities take about 4 minutes (ISIR-bound).
- `checks.contracts` streams the Registr smluv dumps once per run (about 250 MB for the default two-month window), adding 1–3 minutes; use 512 MB or more memory.
- **Poland:** the KRS open API was returning a maintenance page ("Przerwa techniczna") at the time of writing. Until it is back, PL entities get `SOURCE_UNAVAILABLE_PL_KRS`, the TED check is skipped (no NIP) and the summary is **not charged**.
- A source failure never fails the entity: the block gets `checked: false` and an `error`, the flag is added and the rest of the summary is still produced.

### Incremental mode

Not applicable: a risk summary is a point-in-time snapshot, so `mode: "incremental"` is accepted and ignored. To monitor changes, schedule the actor and compare `flags` between runs, or use the companion ISIR actor for a true change feed.

### Data protection

The actor processes only data the six registers publish by law about economic entities (zák. č. 304/2013 Sb., zák. č. 182/2006 Sb. § 419, zák. č. 340/2015 Sb., zák. č. 272/2015 Z. z. § 7, Decision 2011/833/EU, ustawa o KRS art. 4 ust. 4a) with the same minimisation as the companion actors:

- **Identifier lookup only** — no name search, so private individuals cannot be found. A natural-person entrepreneur appears only because you supplied that entity's own IČO, with the address reduced to the municipality.
- **Never output:** rodné číslo, PESEL (even masked), birth dates, nationality, residential addresses, personal e-mail or phone, beneficial-owner fields, signatories. Every summary passes the shared key deny-list and schema validation.
- **Officers:** names, roles and dates only, and only with `checks.officers`; KRS names arrive masked by the Ministry and are never un-masked.
- **ISIR:** proceedings purged under § 425 are not served and never appear; co-debtors without an IČO are dropped. **Registr smluv:** natural persons among contract parties are not output — only counts and sums are derived.
- **No retention by the developer:** datasets live in your Apify storage; the developer stores only run statistics.

Lawful basis for the processing inside a run is Art. 6(1)(f) GDPR — legitimate interest in making statutorily public register data about economic entities machine-readable for due diligence, KYC/AML and procurement. You are the controller of what you download. Corrections or removals of register content must be requested from the source register; `sources[].url` and `profile.provenance.sourceUrl` show which records each summary was built from. This section describes the actor's behaviour and is not legal advice.

### FAQ

**Does it call the other paid actors?** No. Their clients and mappers are compiled into this actor; you pay only `company-summary`.

**Why is `insolvency.checked` false for Slovak and Polish companies?** Neither the Slovak Register úpadcov nor the Polish KRZ offers an official machine-readable API usable without an account, so the actor says so plainly instead of pretending a clean result. A register status of `in-insolvency` from the RPO or KRS extract is still flagged.

**Is the score a credit score?** No. It is a documented sum of flag weights with no calibration against defaults or payment behaviour. Read the flags and each block's `checked` and `error` fields.

**What happens when a source is down (as KRS was at the time of writing)?** That block gets `checked: false` and an `error`, the entity gets a medium `SOURCE_UNAVAILABLE_*` flag, and the rest of the summary is still produced. If every source failed, the summary is written but not charged.

**Can I get the underlying records (contracts, notices, proceedings)?** Use the companion actors (ARES, ISIR, Registr smluv, RPO, TED, KRS); this actor only aggregates.

**Who invoices me?** Apify. Usage is billed to your Apify account; the developer never sees your data or payment details.

### Source & licence

Every summary carries the applicable texts in `sources[].licence` and `profile.provenance.licence`:

- **ARES** — Zdroj: ARES, Ministerstvo financí ČR (https://ares.gov.cz). Public-sector open data; informative character only ("pouze informativní charakter"). Reused under the ARES operating terms.
- **ISIR** — Zdroj: Insolvenční rejstřík, Ministerstvo spravedlnosti ČR (https://isir.justice.cz), public register under § 419 zák. č. 182/2006 Sb. Records removed under § 425 are not served.
- **Registr smluv** — Zdroj: Registr smluv (https://smlouvy.gov.cz), open data under zák. č. 340/2015 Sb. Recipients of this data are independent GDPR controllers; records made inaccessible at the source must be deleted.
- **SK RPO** — Source: RPO (https://rpo.statistics.sk), licensed under Creative Commons Attribution 4.0 (CC BY 4.0) by Štatistický úrad SR; administrator since 1 June 2026: Ministerstvo vnútra SR. Data are free and informative in character (§ 7 ods. 2 zák. č. 272/2015 Z. z.).
- **TED** — Source: TED, Publications Office of the European Union (https://ted.europa.eu), reused under Commission Decision 2011/833/EU. Modified: normalised to JSON, personal contact data removed. Not endorsed by the Publications Office; TED logo not used.
- **PL KRS** — Źródło: Krajowy Rejestr Sądowy, Ministerstwo Sprawiedliwości (https://api-krs.ms.gov.pl), public domain (CC0 1.0) per dane.gov.pl dataset 27606. Personal identifiers are masked by the Ministry and never un-masked here.

Not affiliated with any of these authorities (Ministerstvo financí ČR, Ministerstvo spravedlnosti ČR, Digitální a informační agentura, Štatistický úrad SR, Ministerstvo vnútra SR, the Publications Office of the European Union, Ministerstwo Sprawiedliwości). Data have informative character and may change at any time.

### Changelog / support

- 0.1 — first public release: CZ/SK/PL profiles, ISIR check, optional Registr smluv exposure, TED counts, flags and heuristic score. PL pending the end of the KRS API maintenance.

Questions, bugs and feature requests: use the **Issues** tab of this actor.

Documentation drafted with AI assistance and reviewed by the publisher before publication.

# Actor input Schema

## `entities` (type: `array`):

Companies to screen, max 200 per run: `{ "country": "CZ"|"SK"|"PL", "id": "…" }` — IČO for CZ and SK (8 digits, checksum-validated), KRS number for PL (zero-padded to 10 digits). Invalid ids are reported and skipped, never charged. Default: ČEZ (CZ) and Slovak Telekom (SK).

## `checks` (type: `object`):

Which checks to run on top of the registry profile. `insolvency` (CZ only — ISIR by IČO; SK/PL have no official API and are reported as not checked), `contracts` (CZ only — streams Registr smluv dumps for the last `contractsMonths` months; adds 1–3 minutes and ~250 MB of download per run), `tenders` (all countries — TED notices where the entity is buyer and awards where it is winner; for PL the NIP from the KRS profile is used), `officers` (include officer names, roles and dates in the profile).

## `tendersSinceDays` (type: `integer`):

Only TED notices published within this many days are counted.

## `contractsMonths` (type: `integer`):

Current month plus this many minus one previous months (1–3). Each previous month is one ~130 MB dump; the current month uses daily dumps.

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

Optional shorthand: Czech IČO added as `{ country: "CZ" }` entities.

## `maxRecords` (type: `integer`):

Stop after this many entity summaries (protects your budget).

## Actor input object example

```json
{
  "entities": [
    {
      "country": "CZ",
      "id": "45274649"
    },
    {
      "country": "SK",
      "id": "35763469"
    }
  ],
  "checks": {
    "insolvency": true,
    "contracts": false,
    "tenders": true,
    "officers": true
  },
  "tendersSinceDays": 365,
  "contractsMonths": 2,
  "maxRecords": 1000
}
```

# Actor output Schema

## `results` (type: `string`):

All records returned by this run (full JSON).

## `overview` (type: `string`):

No description

## `stats` (type: `string`):

Records requested, returned and charged, plus source request counts.

# 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 = {
    "entities": [
        {
            "country": "CZ",
            "id": "45274649"
        },
        {
            "country": "SK",
            "id": "35763469"
        }
    ],
    "checks": {
        "insolvency": true,
        "contracts": false,
        "tenders": true,
        "officers": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("quietpinelabs/cee-due-diligence").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 = {
    "entities": [
        {
            "country": "CZ",
            "id": "45274649",
        },
        {
            "country": "SK",
            "id": "35763469",
        },
    ],
    "checks": {
        "insolvency": True,
        "contracts": False,
        "tenders": True,
        "officers": True,
    },
}

# Run the Actor and wait for it to finish
run = client.actor("quietpinelabs/cee-due-diligence").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 '{
  "entities": [
    {
      "country": "CZ",
      "id": "45274649"
    },
    {
      "country": "SK",
      "id": "35763469"
    }
  ],
  "checks": {
    "insolvency": true,
    "contracts": false,
    "tenders": true,
    "officers": true
  }
}' |
apify call quietpinelabs/cee-due-diligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,quietpinelabs/cee-due-diligence"
        }
    }
}
```

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/3Efker2biXuahDOiQ/builds/lIJes8e3Znydw6wRC/openapi.json
