# Polish Company Dossier – KRS, VAT, Risk Signals (`matikitli/pl-company-dossier`) Actor

Look up Polish companies by NIP, KRS or REGON and get one structured dossier each: KRS court register data, VAT white list status, bank account verification, EU VIES, PKD codes, filing history and risk signals (liquidation, bankruptcy, arrears). Official sources only. $0.01 per dossier.

- **URL**: https://apify.com/matikitli/pl-company-dossier.md
- **Developed by:** [Mateusz Kitlinski](https://apify.com/matikitli) (community)
- **Categories:** Business, Lead generation, AI
- **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 record (full)s

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

### What does Polish Company Dossier do?

**Polish Company Dossier** turns a list of Polish company identifiers (**NIP**, **KRS** or **REGON**, mixed in any format) into one clean, structured **company dossier per identifier**. It combines **official government sources only**:

- **KRS court register** (Krajowy Rejestr Sądowy, Ministry of Justice): name, legal form, address, share capital, PKD activity codes, management and supervisory board summary, annual financial statement filing history, liquidation, bankruptcy, restructuring and other register events.
- **VAT white list** (Wykaz podatników VAT, Ministry of Finance): VAT status (active/exempt/not registered), registration and removal dates, bank accounts and the **official request ID that proves you checked**.
- **EU VIES** (opt-in): whether the company's EU VAT number is valid for intra-EU trade, checked on your behalf.
- Optionally **GUS REGON**, with your own free key: full PKD list, ownership form, suspension and bankruptcy dates.

On top of the raw data, every dossier includes **risk signals** with severity (LOW/MEDIUM/HIGH): in liquidation, bankruptcy or restructuring, arrears with enforcement, curator, suspended activity, VAT removed, financial statements overdue, recently registered, minimum share capital, bank account not on the white list, and more.

One identifier never breaks your run. Typos, unknown companies and sole proprietors get a clear **problem row that you are not charged for**.

### Who is it for?

- **KYB / AML / credit-risk teams** checking Polish counterparties in bulk.
- **Accounts payable**: verify that the bank account on an invoice is on the supplier's VAT white list before you pay. Under Polish tax rules this protects your VAT deduction and your joint liability.
- **B2B sales and procurement**: enrich lead lists with legal form, size signals, PKD codes and status.
- **AI agents** (via the Apify MCP server): one call answers "check this Polish company".

### How to use it

1. Paste identifiers into **Company identifiers**, one per line. Formats like `774-000-14-54`, `PL7740001454`, `KRS 28860` or `610188201` are all accepted.
2. Optional: verify a bank account by adding it after a semicolon: `7740001454;PL61109010140000071219812874`.
3. Choose **Full** (KRS + VAT white list, optional VIES) or **Basic** (KRS register only, cheaper).
4. Run it. Download results as JSON, CSV or Excel, or use the **Overview** and **Risk signals** table views.

### Input

```json
{
  "identifiers": ["7740001454", "0000019193", "KRS 0000800000", "7740001454;61109010140000071219812874"],
  "mode": "full",
  "checkVies": false,
  "includeBankAccounts": false
}
```

| Field | Default | Description |
|---|---|---|
| `identifiers` | — | NIP / KRS / REGON list (up to 10,000), optional `;account` suffix |
| `mode` | `full` | `full` = KRS + VAT white list + bank check (+ VIES if enabled); `basic` = KRS only |
| `checkVies` | `false` | Opt-in EU VAT validity check in VIES, done on your behalf for your own intra-EU invoicing (full mode) |
| `includeBankAccounts` | `false` | List all white-list bank accounts (the count is always included) |
| `vatStatusDate` | today | VAT status as of a past date |
| `gusApiKey` | — | Your own GUS REGON key (secret) for extra fields |

### Output

One item per input, in input order. A trimmed real example:

```json
{
  "status": "ok",
  "input": { "raw": "KRS 0000800000", "detectedType": "krs", "normalized": "0000800000" },
  "company": {
    "name": "ENOLOGIA SPÓŁKA Z OGRANICZONĄ ODPOWIEDZIALNOŚCIĄ",
    "legalFormCategory": "LLC", "nip": "9562353240", "regon": "384157209", "krs": "0000800000",
    "registeredAt": "2019-08-20"
  },
  "address": { "city": "TORUŃ", "postalCode": "87-100", "formatted": "UL. SZOSA CHEŁMIŃSKA 26/303, 87-100 TORUŃ" },
  "shareCapital": { "amount": 5000.0, "currency": "PLN", "isMinimumForLegalForm": true },
  "activities": { "main": { "code": "01.21.Z", "description": "UPRAWA WINOGRON" }, "totalCount": 10 },
  "governance": { "managementBody": { "name": "ZARZĄD", "memberCount": 1, "functions": { "PREZES ZARZĄDU": 1 } } },
  "financialStatements": { "lastPeriodEnd": "2025-12-31", "overdue": false, "filingsCount": 6 },
  "registerEvents": [],
  "vatWhiteList": { "statusVat": "ACTIVE", "bankAccountsCount": 1, "asOfDate": "2026-10-02", "requestId": "geDau-98m2cg8" },
  "vies": { "valid": true, "nameMatchesRegistry": true },
  "riskLevel": "LOW",
  "riskSignals": [{ "code": "MINIMUM_SHARE_CAPITAL", "severity": "LOW", "message": "Share capital equals the statutory minimum for the legal form." }],
  "sourceStatus": { "krs": "ok", "vatWhiteList": "ok", "vies": "ok", "regon": "skipped", "bankAccount": "skipped" }
}
```

Problem rows keep the same shape with `status` set to `invalid_input`, `not_found`, `out_of_scope`, `source_unavailable` or `error`, plus a human-readable `statusReason`. Every field is documented in the dataset schema (Output tab). A machine-readable run summary is saved as `OUTPUT` in the key-value store: counts by status, per-source health and charged events.

### Pricing

Pay per event: **you only pay for delivered dossiers**.

| Event | Price |
|---|---|
| Full dossier (KRS + VAT white list + risk signals, optional VIES) | **$0.01** |
| Basic dossier (KRS register + risk signals) | **$0.004** |
| Bank account verification (white list check with official request ID) | **$0.002** |
| Problem rows (invalid, not found, sole proprietor, source down) | **free** |

**Example:** 1,000 companies in full mode cost **$10**. In basic mode they cost **$4**. Adding 1,000 bank-account checks costs **$2** more. You can cap spending per run with the platform's *maximum cost per run* setting. The actor then stops cleanly and reports how many identifiers were left.

### Data sources and legal

- KRS Open API (api-krs.ms.gov.pl), Ministry of Justice, public domain (CC0).
- VAT white list API (wl-api.mf.gov.pl), Ministry of Finance, public register (art. 96b VAT Act).
- VIES, European Commission.
- GUS REGON BIR1.1 (optional, your key), Statistics Poland, CC BY 4.0.

**Privacy by design:** the output is company-level only. Names, PESEL numbers and other data of natural persons (board members, shareholders, proxies, liquidators, trustees) are never included; boards are summarised as counts per function. Free-text register fields that may contain personal data are not copied. Sole proprietorships (JDG) are returned as `out_of_scope` without personal details.

### Limits

- The **VAT white list allows 100 search requests per day per IP** (30 companies each). This actor batches 30 companies per request and never exceeds fair use. If the daily quota is exhausted, KRS-number inputs still get full KRS dossiers (VAT section marked `unavailable`). NIP/REGON-only inputs then need the KRS number or your GUS key. **For very large jobs, prefer KRS numbers.**
- Insolvency data comes from the KRS register (section 6), which can lag the separate KRZ insolvency register by days or weeks.
- Financial statement *contents* (figures) are not included. You get the full filing history and an overdue check. The overdue check applies to companies and cooperatives that must file to KRS; foundations, associations and small partnerships are not judged on it.

### FAQ

#### Is it legal to use this data?

Yes. All sources are official public registers published for reuse. KRS data is CC0. The actor only outputs company-level data and respects source rate limits.

#### Can I use it from my code, Zapier, Make or an AI agent?

Yes: through the Apify API, integrations, or the Apify MCP server, where the actor appears as a tool. A single-company call usually finishes in a few seconds.

#### What does `duplicateOf` mean?

If two inputs resolve to the same company (for example its NIP and its KRS number), the second row points to the first row's position. Both are delivered.

#### I found a problem or need another field.

Open an issue on the Issues tab. We respond quickly and ship fixes with tests.

### Polski — krótko

**Raport o firmie po NIP, KRS lub REGON**: dane z KRS (forma prawna, adres, kapitał, PKD, zarząd w formie podsumowania, sprawozdania finansowe, likwidacja/upadłość/restrukturyzacja), status VAT z **Białej listy** (z identyfikatorem zapytania jako dowodem weryfikacji), **weryfikacja rachunku bankowego** przed płatnością, opcjonalnie VIES oraz sygnały ryzyka. Tylko oficjalne źródła, bez danych osobowych. Płacisz wyłącznie za dostarczone raporty: **0,01 USD** za pełny raport.

### Other actors from this developer

- [Polish Public Tenders](https://apify.com/matikitli/pl-public-tenders): open tenders and contract awards from BZP and EU TED, with winners per lot, a daily monitor and company profiles for every winning company (the same data as this actor).

- [Slovak Company Financials](https://apify.com/matikitli/sk-company-financials): revenue, profit, assets and equity of Slovak companies from the official RÚZ register, with 5-year history and ratios.

More official-data actors for Central-Eastern Europe are in progress. Follow this developer's page to get them first.

# Changelog

This Actor's version history is a separate document: https://apify.com/matikitli/pl-company-dossier/changelog.md

# Actor input Schema

## `identifiers` (type: `array`):

One Polish company per line: 10-digit NIP (tax ID), KRS number (e.g. 0000028860) or 9/14-digit REGON. Dashes, spaces and prefixes like 'PL', 'NIP', 'KRS' are fine. To also verify a bank account against the VAT white list, append it after a semicolon: '7740001454;PL61109010140000071219812874'. Up to 10,000 per run.

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

'full' (default): KRS register + VAT white list + EU VIES + bank account checks. 'basic': cheaper, KRS court-register sections only (identity, address, capital, PKD, board summary, filing history, register-based risk signals).

## `checkVies` (type: `boolean`):

Full mode only, off by default. Validates the company's EU VAT number in the European Commission VIES service on your behalf, for your own intra-EU invoicing and counterparty checks. Returns validity, check time and whether the VIES name matches KRS.

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

Full mode only. Include every bank account the company has on the VAT white list (the account count is always included). Large companies can have 200+ accounts.

## `vatStatusDate` (type: `string`):

Date for the VAT white list status and bank account checks (YYYY-MM-DD). Defaults to today; future dates are treated as today. Example: 2026-01-31.

## `gusApiKey` (type: `string`):

Optional. Your own free key for the GUS REGON BIR1.1 service (request it at regon\_bir@stat.gov.pl). Adds full PKD list, ownership form, founding body, suspension and bankruptcy dates, and resolves NIP/REGON when the VAT white list is unavailable.

## Actor input object example

```json
{
  "identifiers": [
    "7740001454",
    "0000019193",
    "KRS 0000800000"
  ],
  "mode": "full",
  "checkVies": false,
  "includeBankAccounts": false
}
```

# Actor output Schema

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

Dataset items produced by the run.

## `summary` (type: `string`):

Machine-readable run summary (counts by status, per-source health, charged events).

# 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 = {
    "identifiers": [
        "7740001454",
        "0000019193",
        "KRS 0000800000"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("matikitli/pl-company-dossier").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 = { "identifiers": [
        "7740001454",
        "0000019193",
        "KRS 0000800000",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("matikitli/pl-company-dossier").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 '{
  "identifiers": [
    "7740001454",
    "0000019193",
    "KRS 0000800000"
  ]
}' |
apify call matikitli/pl-company-dossier --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,matikitli/pl-company-dossier"
        }
    }
}
```

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/phgutuMke96sw1zti/builds/o6qFDannFC9L3a7iM/openapi.json
