# Poland Company Check (KRS, VAT whitelist, REGON) (`precisionlabs/poland-company-check`) Actor

Check Polish companies by NIP, KRS or REGON: KRS registry, VAT whitelist status and bank accounts, liquidation and bankruptcy flags. Official government APIs only.

- **URL**: https://apify.com/precisionlabs/poland-company-check.md
- **Developed by:** [Precision Labs](https://apify.com/precisionlabs) (community)
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 company records

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, VAT whitelist, REGON)

**Check any Polish company in seconds: is it real, is it active, is it a VAT payer, and is this really its bank account?** Paste NIP, KRS or REGON numbers and get one clean record per company, with red flags. Built by Precision Labs on official government APIs only.

### What it does

For each company it combines two official registers:

- **KRS, the National Court Register (Ministry of Justice):**
  - name, legal form, address, share capital
  - main business activity (PKD code)
  - how the company is represented, and its board roles
  - date of its latest annual accounts
  - liquidation, bankruptcy, restructuring or deregistration
- **VAT whitelist, "Biała lista" (Ministry of Finance):**
  - VAT status on any date in the last 5 years
  - registered bank accounts
  - an official **request ID**, which serves as proof that you made the check

It works out which register to ask first, whichever number you give it. It then turns all of this into **red flags** and an overall **risk level** (high, medium or low).

### Who it's for

- **Accounts payable:** confirm a supplier's bank account is on the VAT whitelist before paying an invoice over PLN 15,000. Paying a different account can cost you the tax deduction and make you jointly liable for the supplier's VAT.
- **Onboarding, compliance and KYB (know your business) teams:** verify Polish customers and suppliers in bulk.
- **Foreign companies trading with Poland:** get English field names and clear statuses, so you don't have to read Polish registry extracts.
- **AI agents:** call it as a tool for supplier due diligence.

### Input

| Field                   | Description                                                                                      |
| ----------------------- | ------------------------------------------------------------------------------------------------ |
| **Companies**           | One per line: `7740001454`, `KRS 0000028860`, `REGON 610188201`. Dashes and spaces are fine.     |
| ↳ with a bank account   | `7740001454 PL30 1020 1026 0000 1402 0355 0589` also checks the account against the whitelist.   |
| **Mode**                | `profile` (full record) or `monitor` (only what changed since the last run).                     |
| **VAT status on date**  | For example, an invoice date. Defaults to today.                                                  |
| Include bank accounts   | List the whitelist bank accounts (on by default).                                                 |
| Include sole traders    | Off by default. See *Personal data* below.                                                        |

```json
{
    "companies": ["7740001454", "KRS 0000010681", "7740001454 PL30 1020 1026 0000 1402 0355 0589"],
    "mode": "profile"
}
```

### Output

One record per company. This one is shortened:

```json
{
    "input": "7740001454",
    "found": true,
    "name": "ORLEN SPÓŁKA AKCYJNA",
    "legalForm": "SPÓŁKA AKCYJNA",
    "nip": "7740001454",
    "regon": "610188201",
    "krs": "0000028860",
    "status": "active",
    "riskLevel": "low",
    "flags": [],
    "addressLine": "CHEMIKÓW 7, 09-411 PŁOCK",
    "registeredAt": "2001-07-19",
    "shareCapital": { "amount": 1451177561.25, "currency": "PLN" },
    "mainActivity": { "code": "19.20.Z", "description": "WYTWARZANIE I PRZETWARZANIE PRODUKTÓW RAFINACJI ROPY NAFTOWEJ..." },
    "representation": { "body": "ZARZĄD", "rule": "DWAJ CZŁONKOWIE ZARZĄDU DZIAŁAJĄCY ŁĄCZNIE...", "members": [{ "role": "PREZES ZARZĄDU", "suspended": false }] },
    "lastAnnualAccounts": { "filedAt": "2026-06-16", "period": "OD 01.01.2025 DO 31.12.2025" },
    "vat": {
        "status": "active",
        "bankAccounts": ["30102010260000140203550589", "..."],
        "proof": { "requestId": "av76s-9926i48", "requestedAt": "18-10-2026 20:16:09", "checkedForDate": "2026-10-18" }
    },
    "bankAccountCheck": { "account": "30102010260000140203550589", "onWhitelist": true, "proof": { "requestId": "KeVch-9926i49" } }
}
```

You can download results as JSON, CSV or Excel, or read them through the Apify API.

#### Red flags

| Code                            | Severity | Meaning                                                    |
| ------------------------------- | -------- | ---------------------------------------------------------- |
| `DEREGISTERED`                  | high     | Removed from KRS.                                          |
| `BANKRUPTCY`                    | high     | Bankruptcy proceedings that haven't closed.                |
| `LIQUIDATION` / `DISSOLUTION`   | high     | The company is being wound up.                             |
| `ARREARS`                       | high     | Unpaid debts recorded in KRS.                              |
| `VAT_NOT_ACTIVE`                | high     | Not an active VAT payer on the date checked.               |
| `BANK_ACCOUNT_NOT_ON_WHITELIST` | high     | The account you gave isn't registered for this NIP.        |
| `NOT_FOUND`                     | high     | In neither register.                                       |
| `RESTRUCTURING`                 | medium   | Restructuring proceedings are open.                        |
| `CURATOR`                       | medium   | A court-appointed curator is recorded.                     |
| `NO_RECENT_ANNUAL_ACCOUNTS`     | medium   | No annual accounts filed in over 20 months.                |
| `PAST_BANKRUPTCY`               | info     | Past bankruptcy proceedings, now closed.                   |
| `RECENTLY_REGISTERED`           | info     | Less than a year old.                                      |
| `RECENT_REGISTRY_CHANGE`        | info     | The KRS entry changed in the last month.                   |
| `VAT_EXEMPT`                    | info     | Registered as VAT-exempt.                                  |
| `NOT_IN_KRS`                    | info     | A VAT payer outside KRS, such as a sole trader.            |

The risk level is a simple rule based on these flags. It isn't a credit rating.

### Monitor changes

Set **Mode** to `monitor` and [schedule](https://docs.apify.com/platform/schedules) the Actor, for example daily or weekly. The first run saves a baseline. Each run after that outputs only the companies that changed, and shows what changed:

```json
{
    "changeType": "changed",
    "changes": [
        { "field": "status", "before": "active", "after": "in liquidation" },
        { "field": "bankAccounts", "added": ["11114015601234567890123456"], "removed": [] }
    ]
}
```

To get alerts, connect the run to email, Slack or a webhook using Apify [integrations](https://docs.apify.com/platform/integrations). Use **Monitor name** to keep separate watch lists apart.

### Pricing

You pay per event, and you can cap your spend with **Maximum cost per run**:

| Event             | When                                              |
| ----------------- | ------------------------------------------------- |
| `company-profile` | A company was looked up and returned, including "not found" answers, or added to a monitor's baseline. |
| `monitor-check`   | A monitored company was checked and hadn't changed. |
| `change-detected` | A monitored company changed.                      |

Free: numbers that fail the checksum (rejected before any lookup), and lookups where a register was unavailable. The run stops as soon as it reaches your **Maximum cost per run**. In monitor mode, a change that didn't fit within that limit isn't lost: it's reported, and charged, on the next run.

### Personal data

- **Board members:** the KRS API masks their names and PESEL numbers (personal ID numbers). This Actor returns only their roles.
- **Free text:** any PESEL quoted in registry text is removed.
- **Sole traders:** VAT payers outside KRS are mostly sole traders, whose name and address are personal data. By default the Actor returns only their VAT status. Turn on **Include sole traders** only if you have a lawful basis, such as verifying a supplier you are about to pay.

### FAQ

**Where does the data come from?** Directly from the Ministry of Justice KRS API and the Ministry of Finance VAT whitelist API, at the moment you run the Actor. There's no cache and no scraping.

**Does the request ID really count as proof?** It's the identifier the Ministry of Finance gives every whitelist query. Keep it with the payment records to show you checked the account on that date.

**Why are some values in Polish?** Legal forms, activity descriptions and representation rules come straight from the registers. Field names and statuses are in English.

**Why is the REGON 9 digits when KRS shows 14?** KRS pads the main unit's REGON with `00000`. The Actor returns the standard 9-digit form.

**Something looks wrong?** Open an issue on the Actor's Issues tab and include the input line.

# Actor input Schema

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

One per line: a NIP, KRS or REGON number, e.g. 7740001454, KRS 0000028860, REGON 610188201. To verify a supplier's bank account, add it after the number: 7740001454 PL30 1020 1026 0000 1402 0355 0589.

## `mode` (type: `string`):

Profile: a full record per company. Monitor: compare with the previous run and output only companies that changed (schedule the Actor to get alerts).

## `vatDate` (type: `string`):

Check VAT status and bank accounts as of this date, e.g. an invoice date. Leave empty for today. The register covers the last 5 years.

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

List the bank accounts registered on the VAT whitelist.

## `includeSoleTraders` (type: `boolean`):

VAT payers outside KRS are mostly sole traders, whose name and address are personal data. Off: only their VAT status is returned. Turn on only if you have a lawful reason to process this data.

## `monitorName` (type: `string`):

Keeps separate watch lists apart. Letters, numbers, - and \_ only.

## `emitUnchanged` (type: `boolean`):

In monitor mode, also output companies with no changes.

## Actor input object example

```json
{
  "companies": [
    "7740001454",
    "KRS 0000010681",
    "7740001454 PL30 1020 1026 0000 1402 0355 0589"
  ],
  "mode": "profile",
  "includeBankAccounts": true,
  "includeSoleTraders": false,
  "monitorName": "default",
  "emitUnchanged": false
}
```

# Actor output Schema

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

No description

# 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": [
        "7740001454",
        "KRS 0000010681",
        "7740001454 PL30 1020 1026 0000 1402 0355 0589"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("precisionlabs/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": [
        "7740001454",
        "KRS 0000010681",
        "7740001454 PL30 1020 1026 0000 1402 0355 0589",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("precisionlabs/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": [
    "7740001454",
    "KRS 0000010681",
    "7740001454 PL30 1020 1026 0000 1402 0355 0589"
  ]
}' |
apify call precisionlabs/poland-company-check --silent --output-dataset

```

## MCP server setup

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