# Ukraine Company Check (EDRPOU) — KYB & due diligence MCP (`kyb-data/ukraine-company-check`) Actor

Check any Ukrainian legal entity by EDRPOU code against official state registers (bankruptcy and more). English JSON for AI agents, KYB, AML and supplier due diligence. Works as an MCP server.

- **URL**: https://apify.com/kyb-data/ukraine-company-check.md
- **Developed by:** [KYB Data](https://apify.com/kyb-data) (community)
- **Categories:** MCP servers, Business, AI
- **Security:** Limited permissions
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $50.00 / 1,000 company-checks

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## Ukraine Company Check — EDRPOU lookup, KYB & due diligence (MCP server)

Check any **Ukrainian legal entity** by its **EDRPOU code** (ЄДРПОУ, the 8-digit state registration
number) against official Ukrainian state registers in one call — and get a clean **English JSON** answer
with red flags, raw records and source attribution.

Built for **AI agents** (MCP) and for **KYB / AML onboarding, counterparty and supplier due diligence,
vendor risk, credit and compliance checks** of companies from Ukraine.

- **One code → one answer** from several registers: bankruptcy, enforcement debts, corruption offences,
  company status and ownership facts (EDR), sanctions, public procurement (Prozorro).
- **Agent-ready:** works as an **MCP server** (Streamable HTTP) with three tools, plus a plain
  `GET /check?edrpou=` endpoint and classic batch runs (list of codes → dataset).
- **Open data only**, CC BY 4.0 / Ukrainian open-data licences, with attribution and `loaded_at`
  timestamps in every answer. Usually refreshed weekly; data from weekly registers can be up to ~2 weeks behind. Every field carries its source date (`loaded_at`).
- **Change history since 2026-11-05:** the registers publish only the current state; we keep our own
  daily snapshots, so every answer shows when records were added or removed (`history`, starting at
  `history_since`), e.g. an enforcement proceeding that was opened and later closed. Nobody else can
  rebuild this history retroactively.
- **Pay per check**, no subscription. Invalid codes are not charged.

### What you get

| Flag in `flags` | Register (publisher) | Publisher updates |
|---|---|---|
| `bankruptcy_case` | Bankruptcy cases (State Judicial Administration) | daily |
| `open_enforcement_proceedings` | Unified Register of Debtors (Ministry of Justice) | daily |
| `corruption_offense` | Persons who committed corruption offences (NACP) | weekly |
| `not_active` | Unified State Register of Legal Entities, EDR (Ministry of Justice): status, termination, head and authorized signatories (`management`: name, Latin transliteration, position), founders and beneficiaries count, capital, predecessors and successors | weekly |
| `not_in_edr` | The code is absent from the EDR — a strong red flag (`not_active` is then `null`) | weekly |
| `sanctions` | Ukraine NSDC sanctions (Presidential decrees) and US OFAC SDN; `true` = an active sanction, `null` = a listing with no stated term | weekly |
| `competition_violation` | Antitrust Committee (AMCU) decisions on bid rigging in the last 3 years, with court appeals — grounds to reject a bidder in public procurement | weekly |
| `financial_institution` | National Bank of Ukraine register of financial institutions: `true` = currently registered (insurer, finance company, credit union, pawnshop…), licences listed; an excluded institution is `false` with `status: excluded` | weekly |
| `public_procurement` | Signed public procurement contracts (Prozorro) in the last 24 months; `null` while the initial history load is incomplete (see `coverage.prozorro`) | continuous |

`true` means the company appears in that register. `false` means there is no record in the loaded
snapshot. It is not a clean bill of health. Each register returns at most the 50 latest records; `counts` gives the full number. Names of private persons are never returned, except the company's head and authorized signatories in `edr[0].management` (see [Personal data](#personal-data)) and where a person's name is part of a legal entity's official registered name (e.g. a farm or a law office): a court, tax office or enforcement office name that mentions a judge, officer, notary or any other person is dropped and only its type (`issuer_type`, `enforcer_type`) is kept; counterparty names come from the EDR. Call `list_sources` (free) for the exact list of flags, licences and load times.

### Input

```json
{ "edrpou": ["39540720", "00032112"] }
```

Up to 10,000 codes per run (about 36 ms per code; the default run timeout is 1 hour). Duplicates are checked and charged once. Keep leading zeros. **Legal entities only**: 10-digit individual tax
numbers (sole proprietors, ФОП) are not supported, are not stored and are not charged.

### Output (one dataset item per company, shortened)

```json
{
  "edrpou": "39540720",
  "name": "ТОВАРИСТВО З ОБМЕЖЕНОЮ ВІДПОВІДАЛЬНІСТЮ «РК ГАЛЕРА»",
  "flags": {
    "bankruptcy_case": true,
    "corruption_offense": false,
    "open_enforcement_proceedings": false,
    "not_active": false
  },
  "bankruptcy": [
    {
      "date": "2026-11-03",
      "type": "Повідомлення про відкриття провадження у справі про банкрутство",
      "case_number": "902/871/26",
      "court": "Господарський суд Вінницької області"
    }
  ],
  "edr": [{
    "status_en": "registered", "registered": "2014-12-10", "founders": 1, "beneficiaries": 1,
    "management": [{ "name": "ІВАНЕНКО ОЛЕНА ПЕТРІВНА", "name_latin": "IVANENKO OLENA PETRIVNA",
                     "role": "керівник", "role_en": "head", "position": "ДИРЕКТОР", "appointed": "2021-06-15" }],
    "management_last_change_seen": null
  }],
  "history": [
    { "date": "2026-11-05", "source": "bankruptcy", "event": "added", "record_key": "902/871/26|…" }
  ],
  "history_since": "2026-11-05",
  "sources": [
    {
      "key": "bankruptcy",
      "title": "Bankruptcy cases (State Judicial Administration)",
      "dataset": "https://data.gov.ua/dataset/544d4dad-0b6d-4972-b0b8-fb266829770f",
      "license": "CC BY 4.0",
      "loaded_at": "2026-11-05T09:09:17+00:00"
    }
  ],
  "disclaimer": "Data from official open registers (data.gov.ua, data.rada.gov.ua, bank.gov.ua, prozorro.gov.ua, NACP open API; sanctions: NSDC decrees, US OFAC), filtered to legal entities, normalised and partly translated by Ukraine Company Check. Not legal advice."
}
```

Field names and flags are in English. Record texts (names, court names, case types) stay in Ukrainian,
exactly as the registers publish them.

### Use it from an AI agent (MCP)

The Actor runs in **Standby mode** and exposes an MCP server over Streamable HTTP:

```
https://kyb-data--ukraine-company-check.apify.actor/mcp
```

Authenticate with your Apify API token: header `Authorization: Bearer <APIFY_TOKEN>`.

**Claude Code:**

```bash
claude mcp add --transport http ukraine-company-check https://kyb-data--ukraine-company-check.apify.actor/mcp --header "Authorization: Bearer $APIFY_TOKEN"
```

**Claude Desktop, Cursor, other clients** (`mcpServers` config):

```json
{
  "mcpServers": {
    "ukraine-company-check": {
      "type": "http",
      "url": "https://kyb-data--ukraine-company-check.apify.actor/mcp",
      "headers": { "Authorization": "Bearer <APIFY_TOKEN>" }
    }
  }
}
```

You can also find it through the Apify MCP server (`https://mcp.apify.com`, tool `search-actors`) by
searching for "Ukraine company check", "EDRPOU" or "Ukrainian KYB".

#### Tools

- `check_company(edrpou)`: full check of one company.
- `check_companies(edrpou_list)`: up to 50 companies in one call.
- `list_sources()`: registers, flags, licences, `loaded_at`. Free.

#### Plain HTTP

```
GET https://kyb-data--ukraine-company-check.apify.actor/check?edrpou=39540720
GET .../check?edrpou=39540720,00032112        (up to 50, comma-separated)
```

### Pricing

Pay per event: **one `company-check` event per valid EDRPOU code checked**. Invalid codes and
`list_sources` are free. In Standby (MCP / HTTP) mode Apify also bills the small platform usage of
the server run, as for every Standby Actor. Set a **maximum cost per run** in Apify to cap spending:
when it is reached, the Actor returns an error instead of data.

### Limitations

- Legal entities only (8-digit EDRPOU). No data about sole proprietors; about individuals only the
  head and signatories of a company (see [Personal data](#personal-data)).
- Usually refreshed weekly; every field carries its source date (`loaded_at` per source). Data from
  weekly registers (EDR, NACP, sanctions, AMCU, NBU) can be up to ~2 weeks behind the state open-data
  publications. Registers themselves can lag behind court and enforcement events.
- Sanctions are matched by EDRPOU code only, not by name. Whether a sanction is active or expired is
  computed at load time.
- A missing record is not proof of absence. Registers have gaps and test rows. We filter the obvious
  ones.
- **Not legal advice.** This is an automated aggregation of public registers. Verify important
  decisions against the official sources linked in `sources`.

### Personal data

**What we return.** For the current EDR record only, `management` lists the company's head (`role: керівник`,
`role_en: head`) and other persons who may act on its behalf (`представник`, `authorized representative`):
full name as registered, the name in Latin letters (Ukrainian national transliteration, Cabinet of Ministers
Resolution No. 55 of 27.01.2010), the position and the appointment date when the register states them.
At most 50 people, the head first; `management_total` gives the full number. `management_last_change_seen`
is the latest date our own history saw the company's management change (head, signatories or members of its
governing bodies; `null` = no change seen since `history_since`); it is not an appointment date. For a
terminated company the "current" record is its last one. An entry is dropped entirely if the register text
cannot be parsed cleanly (for example, a tax number or a phone glued to the name), and a position that mentions
another person is dropped. For military units and similar security bodies, and when no entry could be parsed, `management` and `management_total` are `null` (unknown), not an empty list; an empty list means every person was removed on request.

**What we never return:** individual founders, beneficial owners, dates of birth, addresses, individual tax
numbers (RNOKPP) and passport data, phones and e-mails, members of governing bodies, and the free-text powers of
representatives. Founders, beneficial owners and management changes are visible only as counts and as change
events in `history`.

**Source and legal basis.** The data comes from the EDR open data set of the Ministry of Justice on data.gov.ua
(CC BY 4.0). Under Article 11(1) of the Law of Ukraine "On State Registration of Legal Entities, Individual
Entrepreneurs and Public Formations", information in the register "є відкритими і загальнодоступними (крім
реєстраційних номерів облікових карток платників податків та паспортних даних)" — is open and publicly
available, except tax numbers and passport data. We process it for the legitimate interest of counterparty
due diligence (Article 11(1)(6) of the Law of Ukraine "On Personal Data Protection").

**Removal on request.** Under Article 8(2)(5) of that Law you may object to the processing of your personal
data. To remove your name, open an issue on the **Issues** tab of this Actor with the company's EDRPOU code and
your role (head or representative). Issues are public, so **do not write your name** there: we take it from the
register ourselves. We remove it within 30 days. The removal list stores only the company code and a keyed hash of the name, never the
name itself.

### Data sources and attribution

All data comes from Ukrainian state open-data portals (data.gov.ua, data.rada.gov.ua, bank.gov.ua,
prozorro.gov.ua, the NACP open API) under CC BY 4.0 or Ukrainian open-data law, plus the US Treasury OFAC SDN list
(public domain). Each answer names the dataset, licence and load time for every source used.
Changes to the source data: we keep legal entities only, drop names of private persons other than a company's head and signatories, transliterate those names, normalise
codes, dates and statuses, and translate field names and statuses into English.

**Keywords:** Ukraine company check, EDRPOU lookup, ЄДРПОУ, Ukrainian company registry, EDR, YEDR,
KYB Ukraine, AML, due diligence, counterparty check, supplier verification, vendor risk, bankruptcy
Ukraine, debtors register, NACP corruption register, NSDC sanctions, Prozorro, MCP server, AI agent tool.

# Actor input Schema

## `edrpou` (type: `array`):

8-digit EDRPOU codes of Ukrainian legal entities, one per line. Keep leading zeros. Up to 10,000 per run (duplicates are checked and charged once). 10-digit individual tax numbers (sole proprietors) are not supported and are not charged.

## Actor input object example

```json
{
  "edrpou": [
    "39540720",
    "00032112"
  ]
}
```

# Actor output Schema

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

One item per company: red flags, register records, change history and sources. edr\[0].management lists the company's head and authorized signatories from the state register; no other personal data.

# 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 = {
    "edrpou": [
        "39540720"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("kyb-data/ukraine-company-check").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 = { "edrpou": ["39540720"] }

# Run the Actor and wait for it to finish
run = client.actor("kyb-data/ukraine-company-check").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 '{
  "edrpou": [
    "39540720"
  ]
}' |
apify call kyb-data/ukraine-company-check --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kyb-data/ukraine-company-check"
        }
    }
}
```

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/DFd5iVg1PhpNOVtFO/builds/ppph2xdMJNVgOJz99/openapi.json
