# Poland Company Check — KRS Register & VAT White List (`us0r/poland-company-check`) Actor

Check Polish companies by KRS number, NIP or REGON against the official KRS court register and the VAT white list. One row per company: status, liquidation, bankruptcy and tax-arrears flags, VAT status, bank account verification with official request ID. No proxy, no scraping.

- **URL**: https://apify.com/us0r/poland-company-check.md
- **Developed by:** [us0r](https://apify.com/us0r) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 company checkeds

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

## Poland Company Check — KRS Register & VAT White List

Give this Actor a list of Polish companies — by **KRS number, NIP (tax ID) or
REGON**, in whatever format your books hold them. It queries the two official
government sources and returns **one row per entry**, including the ones that
were not found:

- the **KRS court register** (Krajowy Rejestr Sądowy, Ministry of Justice):
  legal status, address, share capital, management, business activity, filed
  accounts — and every liquidation, bankruptcy, restructuring, tax-arrears and
  suspension entry, with court, case number and date;
- the **VAT white list** (Wykaz podatników VAT, Ministry of Finance): VAT status,
  registration and removal dates, registered bank accounts — and, if you pass
  one, whether a specific bank account is on the list, with the ministry's
  **request ID as proof of the check**.

Both are official REST interfaces. No scraping, no proxy, no browser — which is
why a check takes well under a second and costs what it costs.

Built for supplier onboarding and KYB, accounts payable checks before a
transfer, AML and due diligence workflows that have to show they looked, and
periodic re-checks of a customer or supplier book.

### What you get per entry

| Field | Example |
|---|---|
| `query`, `queryType` | `PL 781-176-76-96`, `nip` |
| `found`, `foundIn` | `true`, `["krs", "vat_white_list"]` |
| `status` | `active` · `suspended` · `restructuring` · `dissolved` · `in_liquidation` · `bankruptcy` · `deleted` · `not_in_krs` · `not_found` |
| `riskFlags` | `["enforcement_arrears", "bankruptcy_petition_pending"]` |
| `riskDetails` | court, case number, date, amount — per flag |
| `krsNumber`, `nip`, `regon`, `register` | `0000236233`, `7811767696`, `300065148`, `entrepreneurs` |
| `name`, `legalForm` | `VML ENTERPRISE SOLUTIONS SPÓŁKA Z OGRANICZONĄ ODPOWIEDZIALNOŚCIĄ`, `SPÓŁKA Z OGRANICZONĄ ODPOWIEDZIALNOŚCIĄ` |
| `address` | street, postal code, city, voivodeship, county, municipality, one-line form |
| `email`, `website` | as filed with the court |
| `shareCapital` | `{"amount": 1451177561.25, "currency": "PLN"}` |
| `mainActivity`, `otherActivities` | PKD code and description, e.g. `19.20.Z` |
| `management` | governing body, representation rule, functions, size |
| `supervisoryBoardSize`, `procuratorsCount` | `10`, `5` (ORLEN S.A.) |
| `financialStatements` | last filed on, period, filings on record, `filingOverdue` |
| `registeredOn`, `lastEntryOn`, `registryCourt`, `dataAsOf` | ISO dates, registry court of the last entry |
| `deletion` | for deleted companies: deleted on, legally final on, reason |
| `vat` | see below |
| `bankAccountCheck` | see below |
| `note` | plain-language explanation when a NIP could not be resolved |
| `checkedAt`, `error` | timestamp; error text for rows that could not be checked |

#### Status and risk flags

The register records events, not a status. This Actor reads sections 4 to 6 of
the extract and keeps **ongoing proceedings apart from finished ones** — the
register keeps both. A company whose 2019 arrangement proceedings were
discontinued shows `restructuring_ended`, not `restructuring`.

| Flag | Meaning |
|---|---|
| `bankruptcy` | bankruptcy declared, no end entered |
| `bankruptcy_petition_pending` | court secured the debtor's assets in bankruptcy proceedings |
| `bankruptcy_petition_dismissed_no_assets` | petition dismissed because the assets would not cover the costs |
| `restructuring`, `restructuring_petition_pending` | restructuring or arrangement proceedings open / assets secured |
| `liquidation`, `dissolution` | liquidation opened, company dissolved |
| `suspended` | business activity suspended, not resumed |
| `enforcement_arrears` | tax or social-security arrears under enforcement, not concluded |
| `court_curator` | court-appointed curator (often: no functioning board) |
| `deleted` | struck off the register |
| `vat_not_active` | in the register as a business, but not (or no longer) VAT-registered |
| `bank_account_not_on_white_list` | the account you passed is not registered for this taxpayer |
| `bankruptcy_ended`, `restructuring_ended` | historical, kept for context |

`status` is the single most serious of these, in the order deleted → bankruptcy
→ in liquidation → dissolved → restructuring → suspended → active.

#### VAT white list and bank account verification

`vat` carries `status` (`active`, `exempt`, `not_registered`, `not_listed`),
the registration, removal and restoration dates, the number of registered bank
accounts (the full list with `includeBankAccounts`), the working address, and
**`requestId` plus `requestDateTime`**.

The ministry stores every query, and the request ID is what confirms that a
check was made on that day. Under Polish law, a business payment over
15,000 PLN to an account that is not on the white list loses its tax
deductibility — the request ID is the record you keep.

Pass an account with an entry to verify it:

```json
{"nip": "7740001454", "bankAccount": "PL09102010260000110207607072"}
```

`bankAccountCheck.onWhiteList` comes back `true` or `false`, with its own
request ID. The check uses the ministry's dedicated method, which also knows
the virtual (collection) accounts that never appear in the account list.

### Input

```json
{
  "companies": [
    "0000019193",
    "PL 781-176-76-96",
    "610188201",
    {"nip": "7740001454", "bankAccount": "PL09102010260000110207607072"}
  ],
  "includeBankAccounts": false,
  "includeRawExtract": false
}
```

| Option | Default | Meaning |
|---|---|---|
| `companies` | — | KRS numbers, NIPs, Polish VAT IDs or REGONs; objects for bank account checks |
| `includeBankAccounts` | `false` | Full list of registered bank accounts instead of just the count |
| `includeRawExtract` | `false` | The untouched KRS extract under `raw`, every field in Polish |
| `pauseSeconds` | `0.1` | Delay before each request to the two APIs |

The identifier type is detected automatically: `KRS 19193`, `0000019193`,
`774-000-14-54`, `PL7740001454`, `NIP: 774 000 14 54` and the padded 14-digit
REGON from a KRS extract all work. **Check digits are validated before
querying** — a mistyped NIP comes back as a row with `error`, not as a false
"not found". Duplicates in your list are checked once.

### Speed

Measured 12 October 2026: **57 entries in 25 seconds**, 59 requests in total,
including start-up. The VAT white list answers up to 30 entries per request, so
a list costs roughly one register request per company plus one white-list
request per 30.

### Limits, honestly

- **NIP and REGON are resolved through the VAT white list.** The KRS register
  itself cannot be searched by NIP. A company that is not VAT-registered is
  therefore only found by its KRS number — the row says so in `note` instead of
  claiming the company does not exist. In a random sample of active KRS
  companies, 6 of 15 NIPs were not on the white list.
- **No search by name.** The register's name search sits behind bot
  protection; this Actor does not work around it. Use one of the numbers.
- **Board members are listed by function only.** The official API masks
  personal names ("F\*\*\*\*\*") and this Actor does not pass the remnants on.
- **Sole proprietorships live in CEIDG, not KRS.** Their NIP is found on the
  white list (`not_in_krs`), with VAT status and accounts but without a
  register extract.
- **`filingOverdue` is a heuristic**: a capital company registered for more
  than 24 months whose last annual accounts were filed more than 18 months
  ago. Partnerships and associations often do not file with the court, so it
  stays `null` for them.
- **The white list has a daily query limit** that the ministry does not
  publish. If it is reached, the run continues with register data and says so
  in `vat.error`.
- **This is not a credit report.** It states what the two official registers
  say on the day you ask.

### Pricing

Pay per event:

| Event | What it covers |
|---|---|
| `actor-start` | once per run |
| `company-check` | one entry checked — whether or not it was found |
| `bank-account-check` | one bank account verified against the white list |

**Rows with an `error` are free**: a wrong check digit or a source that did not
answer is never billed. A spending limit you set on the run is respected —
the run stops cleanly when it is reached.

### Po polsku

**Weryfikacja kontrahenta w KRS i na białej liście VAT.** Wklej listę numerów
KRS, NIP lub REGON w dowolnym formacie — Actor sam rozpozna rodzaj numeru i
sprawdzi cyfrę kontrolną. Dla każdej pozycji z listy dostajesz jeden wiersz,
także gdy firmy nie znaleziono:

- **status w KRS** — aktywna, zawieszona, w likwidacji, w upadłości, w
  restrukturyzacji, wykreślona — oraz wpisy z działów 4–6 odpisu (zaległości
  podatkowe i składkowe objęte egzekucją, kurator, zabezpieczenie majątku w postępowaniu upadłościowym),
  z podziałem na postępowania trwające i zakończone;
- **status VAT z białej listy** — czynny, zwolniony, niezarejestrowany — oraz
  zarejestrowane rachunki bankowe;
- **sprawdzenie rachunku bankowego** na białej liście z identyfikatorem
  zapytania (`requestId`) Ministerstwa Finansów jako potwierdzeniem weryfikacji
  przy płatnościach powyżej 15 000 zł;
- adres, kapitał zakładowy, PKD, organ reprezentacji i data ostatniego
  sprawozdania finansowego złożonego do KRS.

Dane pochodzą wyłącznie z oficjalnych API Ministerstwa Sprawiedliwości (KRS) i
Ministerstwa Finansów (biała lista) — bez proxy i bez scrapingu. Wiersze z
błędną cyfrą kontrolną są bezpłatne. Wyszukiwanie po nazwie firmy nie jest
dostępne.

### Related Actors

- **[Norway Company Check](https://apify.com/us0r/norway-company-check)** — the same list check for Norwegian
  companies: Brønnøysund register status, forced dissolution with its reason,
  the bankruptcy trustee, roles and three years of annual accounts.
- **[Finland Company Check](https://apify.com/us0r/finland-company-check)** — the same list check for Finnish
  companies: PRH/YTJ status, registered loss of share capital, tax registers
  and digital financial statements.
- **[UK Company Check](https://apify.com/us0r/uk-company-check)** — the same list check for UK
  companies: Companies House status, strike-off notices, insolvency cases,
  charges, directors, PSCs and balance sheet figures.
- **[German Insolvency & Bankruptcy Check](https://apify.com/us0r/insolvenz-check-de)**
  — the same screening job for Germany: a list of names against the official
  insolvency register, one row per name, found or not.
- **[German Insolvency Announcements](https://apify.com/us0r/insolvenzbekanntmachungen-de)**
  — the whole German insolvency stream as it is published, with parsed fields.
- **[German Foreclosure Auctions](https://apify.com/us0r/zwangsversteigerungen-de)**
  — court-ordered property auctions with dates, addresses and appraised values.
- **[German Government Auctions](https://apify.com/us0r/government-auctions-de)**
  — what public authorities sell off on zoll-auktion.de and justiz-auktion.de.

***

Keywords: KRS, Krajowy Rejestr Sądowy, KRS API, eKRS, odpis KRS, NIP, REGON,
biała lista VAT, wykaz podatników VAT, white list VAT Poland, Polish VAT check,
verify Polish VAT number, NIP check, weryfikacja NIP, weryfikacja kontrahenta,
sprawdzenie kontrahenta, rachunek bankowy biała lista, split payment, mechanizm
podzielonej płatności, Polish company check, Poland company search, Polish
company registry, Poland business register, Poland KYB, KYC Poland, AML Poland,
due diligence Poland, supplier verification Poland, counterparty check,
Polish bankruptcy check, upadłość, likwidacja, restrukturyzacja, zaległości
podatkowe, Polish company data, company verification API, business verification,
supplier screening, vendor onboarding, accounts payable check.

# Actor input Schema

## `companies` (type: `array`):

One entry per company: a KRS number ("0000019193" or "19193"), a NIP / Polish VAT ID ("7811767696", "PL 781-176-76-96") or a REGON (9 digits). The type is detected automatically. To verify a supplier's bank account against the VAT white list, pass an object instead: {"nip": "7740001454", "bankAccount": "PL09102010260000110207607072"}.

## `includeBankAccounts` (type: `boolean`):

The VAT white list holds every bank account a taxpayer has reported. Off: only the count is returned (large companies list hundreds). On: the full list goes into vat.bankAccounts.

## `includeRawExtract` (type: `boolean`):

Adds the untouched JSON extract from the court register under 'raw' — every field the register holds, in Polish. Useful for your own parsing; makes rows much larger.

## `pauseSeconds` (type: `number`):

Politeness delay towards the two government APIs.

## Actor input object example

```json
{
  "companies": [
    "0000019193",
    "PL 781-176-76-96",
    {
      "nip": "7740001454",
      "bankAccount": "PL09102010260000110207607072"
    }
  ],
  "includeBankAccounts": false,
  "includeRawExtract": false,
  "pauseSeconds": 0.1
}
```

# Actor output Schema

## `companies` (type: `string`):

One row per entry checked, including the ones not found or rejected for a wrong check digit.

## `risk` (type: `string`):

Status, risk flags, VAT status and bank account verification with the official request IDs.

# 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 = {
    "companies": [
        "0000019193",
        "PL 781-176-76-96",
        {
            "nip": "7740001454",
            "bankAccount": "PL09102010260000110207607072"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("us0r/poland-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 = { "companies": [
        "0000019193",
        "PL 781-176-76-96",
        {
            "nip": "7740001454",
            "bankAccount": "PL09102010260000110207607072",
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("us0r/poland-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 '{
  "companies": [
    "0000019193",
    "PL 781-176-76-96",
    {
      "nip": "7740001454",
      "bankAccount": "PL09102010260000110207607072"
    }
  ]
}' |
apify call us0r/poland-company-check --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,us0r/poland-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/HOJ1wd4gTyajqL3GY/builds/RfOIMXYnyY47hQCnS/openapi.json
