# Poland VAT Whitelist & KRS API: Biała lista, NIP, Accounts (`actose/poland-vat-whitelist-krs`) Actor

VAT status, whitelisted bank accounts, KRS board, share capital and liquidation flags for Polish NIPs, IBANs and KRS numbers in bulk. Official MF request ID. No API key, no login. MCP-ready for AI agents. Not found is free. $3 per 1,000 entities. Weryfikacja kontrahenta: biała lista VAT i KRS.

- **URL**: https://apify.com/actose/poland-vat-whitelist-krs.md
- **Developed by:** [ABM](https://apify.com/actose) (community)
- **Categories:** Lead generation, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.55 / 1,000 entity checkeds

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

## Poland VAT Whitelist & KRS API (Biała lista VAT, NIP, KRS)

**Price: $0.003 per entity found ($3 per 1,000). Invalid, unknown and not-found inputs are free. No monthly rental.**

Check Polish counterparties in bulk: for every **NIP**, **bank account (NRB / IBAN PL)**, **KRS number** or **NIP;account pair**, this actor returns

- the **VAT taxpayer status** from the Ministry of Finance whitelist (*Wykaz podatników VAT*, "Biała lista VAT"): active (*Czynny*), exempt (*Zwolniony*), not registered, removal / denial / restoration dates and legal basis;
- the **bank accounts on the whitelist** and whether a given account belongs to the supplier (also covers virtual accounts via the official check endpoint);
- the official **MF request ID** (`whitelistRequestId`), the proof of verification accountants keep for the tax file;
- **KRS data** from the National Court Register: legal form, share capital, board and representation rules, commercial proxies, supervisory board, shareholders, main PKD activity, last financial statement filed and **liquidation / insolvency entries** (section 6).

Outputs are available in **English or Polish** (`outputLanguage`), with an LLM-ready `summary` sentence per entity.

Data comes only from the two free public government APIs (`wl-api.mf.gov.pl` and `api-krs.ms.gov.pl`). No API key, no login, no scraping of HTML pages.

### How much does it cost?

| Volume | Price |
|---|---|
| 1 entity found | $0.003 |
| 1,000 suppliers checked | **$3.00** |
| 10,000 invoices' bank accounts | $30.00 |

You pay one `entity-checked` event per input that is **found** (NIP on the whitelist, account on the whitelist, KRS number that exists, or NIP;account pair confirmed). Invalid NIPs, wrong checksums, unknown NIPs, accounts not on the list and API errors are returned in the dataset **free of charge**. Set a maximum charge per run in Apify and the actor stops cleanly when it is reached.

### Input

```json
{
  "nips": ["5252344078", "PL 774-000-14-54"],
  "bankAccounts": ["34103015080000000504162001"],
  "nipAccountPairs": ["5252344078;34103015080000000504162001"],
  "krsNumbers": ["0000387251"],
  "includeKrs": true,
  "outputLanguage": "en",
  "date": "",
  "onlyChanged": false,
  "watchlistName": "default",
  "saveKrsExtract": false
}
```

| Field | Description |
|---|---|
| `nips` | Polish tax IDs. Dashes, spaces and the `PL` prefix are accepted. Checksum is validated locally. |
| `bankAccounts` | 26-digit NRB numbers (with or without `PL`). Returns whether the account is whitelisted and its owner. |
| `nipAccountPairs` | `NIP;ACCOUNT` – official yes/no check that the account belongs to that NIP. |
| `krsNumbers` | KRS numbers (leading zeros optional). Adds the VAT status of the company's NIP. |
| `includeKrs` | Fetch KRS data for NIPs / accounts whose owner has a KRS number (default `true`). |
| `outputLanguage` | `en` or `pl` for `vatStatus` and `summary`. Official Polish values are always kept too. |
| `date` | Whitelist status on a past date (`YYYY-MM-DD`, up to 5 years back). Empty = today, Polish time. |
| `onlyChanged` | Monitoring mode: only output (and pay for) entities that changed since the last run. |
| `watchlistName` | Separate memory per client / supplier list for `onlyChanged`. |
| `saveKrsExtract` | Save the full official KRS JSON in the key-value store, link in `krsRawExtractUrl`. |

### Output

One dataset item per input. Example for a NIP (abridged):

```json
{
  "inputType": "nip",
  "input": "5252344078",
  "found": true,
  "checkDate": "2026-11-05",
  "name": "GOOGLE POLAND SPÓŁKA Z OGRANICZONĄ ODPOWIEDZIALNOŚCIĄ",
  "nip": "5252344078",
  "regon": "140182840",
  "krs": "0000240611",
  "vatStatus": "Active VAT payer",
  "vatStatusCode": "ACTIVE",
  "vatStatusPl": "Czynny",
  "isActiveVatPayer": true,
  "residenceAddress": "RONDO IGNACEGO DASZYŃSKIEGO 2C, 00-843 WARSZAWA",
  "registrationLegalDate": "2005-10-06",
  "removalDate": null,
  "bankAccounts": ["34103015080000000504162001"],
  "bankAccountsCount": 1,
  "hasVirtualAccounts": false,
  "whitelistRequestId": "gadZC-996jk2c",
  "whitelistRequestDateTime": "05-11-2026 06:08:12",
  "krsFound": true,
  "krsLegalForm": "SPÓŁKA Z OGRANICZONĄ ODPOWIEDZIALNOŚCIĄ",
  "krsLegalFormEn": "Limited liability company (sp. z o.o.)",
  "krsRegistrationDate": "06.09.2005",
  "krsShareCapital": 800000.0,
  "krsShareCapitalCurrency": "PLN",
  "krsRepresentationBody": "ZARZĄD",
  "krsRepresentationMethod": "KAŻDY CZŁONEK ZARZĄDU SAMODZIELNIE",
  "krsRepresentatives": [{"name": "P*** T****** M******", "function": "CZŁONEK ZARZĄDU", "suspended": false, "body": "ZARZĄD"}],
  "krsProxies": [{"name": "M******** J***** K*********", "type": "PROKURA SAMOISTNA"}],
  "krsMainActivityPkd": {"code": "…", "description": "…"},
  "krsSection6Entries": [],
  "krsInLiquidationOrInsolvency": false,
  "summary": "GOOGLE POLAND SPÓŁKA Z OGRANICZONĄ ODPOWIEDZIALNOŚCIĄ (NIP 5252344078): Active VAT payer on 2026-11-05. 1 bank account(s) on the whitelist. KRS 0000240611: Limited liability company (sp. z o.o.), share capital 800 000.00 PLN, represented by ZARZĄD (KAŻDY CZŁONEK ZARZĄDU SAMODZIELNIE).",
  "error": null,
  "checkedAt": "2026-11-05T06:08:13+00:00"
}
```

A bank account that is **not** on the whitelist returns `"accountOnWhitelist": false`, `"vatStatusCode": "NOT_FOUND"` and a warning in `summary`, and is not charged.

### Use cases

#### 1. Accounts payable: check every supplier account before the payment run

*Who:* an AP accountant at a Polish subsidiary paying 400 invoices a week. Payments over 15,000 PLN to an account not on the whitelist lose tax deductibility and create joint VAT liability.
*Input:* `{"nipAccountPairs": ["5252344078;34103015080000000504162001", "7740001454;PL61109010140000071219812874"]}`
*Output:* `[{"input": "5252344078;34103015080000000504162001", "accountOnWhitelist": true, "whitelistRequestId": "bmnPn-996jk05"}, {"input": "7740001454;…", "accountOnWhitelist": false, "summary": "Bank account … is NOT assigned to NIP 7740001454…"}]`
*Next:* the ERP blocks the payments where `accountOnWhitelist` is false; the request IDs are archived with the payment batch as proof. Cost for 400 pairs: at most $1.20.

#### 2. Monthly supplier master-data monitoring

*Who:* a shared-services centre with 2,500 Polish vendors.
*Input:* `{"nips": ["5252344078", "5250007738", "…"], "onlyChanged": true, "watchlistName": "vendors-pl", "includeKrs": true}` scheduled on the 1st of each month.
*Output:* only vendors whose VAT status, account list, board or liquidation flags changed, e.g. `{"nip": "…", "vatStatusCode": "NOT_REGISTERED", "removalDate": "2026-10-12", "changedSinceLastRun": true}`
*Next:* changes land in a Google Sheet for the vendor-master team. First run: 2,500 × $0.003 = $7.50; following months only changed vendors are charged (typically a few dozen, under $0.20).

#### 3. KYB / onboarding of a new B2B customer

*Who:* a credit controller or a fintech onboarding SMEs.
*Input:* `{"krsNumbers": ["0000387251"], "outputLanguage": "pl", "saveKrsExtract": true}`
*Output:* `{"krsName": "MTM GÓRNICTWO SPÓŁKA Z OGRANICZONĄ ODPOWIEDZIALNOŚCIĄ", "krsShareCapital": 400000.0, "krsRepresentationMethod": "JEŻELI ZARZĄD SPÓŁKI JEST JEDNOOSOBOWY…", "vatStatus": "Czynny podatnik VAT", "krsInLiquidationOrInsolvency": false, "krsRawExtractUrl": "https://api.apify.com/v2/key-value-stores/…/records/krs-0000387251"}`
*Next:* the analyst checks who may sign the contract (representation method), the share capital for the credit limit, and stores the raw extract in the customer file.

#### 4. AI agent answering "Can I pay this invoice?"

An agent receives a PDF invoice, extracts NIP and account, calls this actor through MCP and answers with the `summary` field, which is a ready-made sentence in English or Polish.

### API examples

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("<username>/poland-vat-whitelist-krs").call(run_input={
    "nips": ["5252344078", "7740001454"],
    "includeKrs": True,
    "outputLanguage": "en",
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["nip"], item["vatStatusCode"], item["bankAccountsCount"], item["krsShareCapital"])
```

**JavaScript**

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<APIFY_TOKEN>' });
const run = await client.actor('<username>/poland-vat-whitelist-krs').call({
    nipAccountPairs: ['5252344078;34103015080000000504162001'],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((i) => [i.input, i.accountOnWhitelist, i.whitelistRequestId]));
```

### Integrations (Make, Zapier, n8n, Google Sheets)

- **n8n / Make**: Google Sheets "Watch rows" (new supplier with NIP and IBAN) → *Apify: Run actor* with `{"nipAccountPairs": ["{{nip}};{{iban}}"]}` → *Get dataset items* → write `accountOnWhitelist`, `vatStatus` and `whitelistRequestId` back into the row, and send a Slack alert when `accountOnWhitelist` is false.
- **Zapier**: use the Apify app "Run Actor" action, then "Fetch Dataset Items".
- **Google Sheets / Excel**: export the dataset as CSV or XLSX from the run page, or schedule the actor with `onlyChanged` and the Apify Google Sheets integration.
- **Webhooks / REST API**: `POST https://api.apify.com/v2/acts/<username>~poland-vat-whitelist-krs/run-sync-get-dataset-items?token=…`

### Use with AI agents (MCP)

The actor is available through the Apify MCP server (`https://mcp.apify.com`) for Claude, Cursor, ChatGPT and other agents. Tool input is the JSON above; each result contains a self-contained `summary` sentence plus structured fields (`vatStatusCode`, `accountOnWhitelist`, `krsInLiquidationOrInsolvency`) that an agent can reason on directly.

### FAQ

**Is this the official data?** Yes. It calls the Ministry of Finance whitelist API and the Ministry of Justice KRS API, the same sources as the government search websites. The `whitelistRequestId` is the official identifier of the query.

**Can I check a past date?** Yes, set `date` (the whitelist keeps 5 years of history). KRS data is always the current extract.

**Why are board members' names partly hidden (`M******`)?** The KRS API itself masks personal names and PESEL numbers of natural persons. The actor returns the functions, the governing body, the representation rules and company shareholders in full. Names of partners and representatives of partnerships and sole traders do appear in the whitelist data (`whitelistRepresentatives`, `whitelistPartners`) when the Ministry publishes them.

**What about sole traders (JDG)?** They are on the VAT whitelist but not in KRS; you get the VAT status and accounts, KRS fields stay `null`.

**What does "NOT_FOUND" mean for a NIP?** The NIP has a valid checksum but is not in the VAT taxpayer list on that date (never registered for VAT, or unknown). It is not charged.

**Do I need a proxy or an API key?** No.

### Limits

- The Ministry of Finance limits search queries per IP (about 100 queries a day, 30 identifiers each). The actor groups identifiers by 30 and rotates to another datacenter IP if the limit is hit; if no IP is left, remaining items are returned with a clear error and are not charged.
- `nipAccountPairs` use the official check endpoint (about 5,000 checks per day per IP).
- KRS search by NIP or name is not offered by the public KRS API; KRS data is reached through the KRS number published on the whitelist or given in `krsNumbers`. A company not registered for VAT can only be found by its KRS number.
- KRS personal names are masked by the source (see FAQ).
- Section 6 flags (`krsSection6Entries`) list the non-empty sections (e.g. `likwidacja`, `postepowanieUpadlosciowe`); read the raw extract for the details.

### Po polsku: weryfikacja kontrahenta – biała lista VAT i KRS

Aktor sprawdza masowo kontrahentów w **wykazie podatników VAT (biała lista)** Ministerstwa Finansów i w **KRS**: status VAT (czynny, zwolniony, niezarejestrowany), rachunki bankowe na białej liście, czy rachunek należy do danego NIP (przed przelewem powyżej 15 000 zł), identyfikator zapytania do dokumentacji, a z KRS: formę prawną, kapitał zakładowy, zarząd i sposób reprezentacji, prokurentów, PKD oraz informacje o likwidacji lub upadłości. Wyniki po polsku: `"outputLanguage": "pl"`.

Przykład wejścia:

```json
{"nips": ["5252344078"], "nipAccountPairs": ["5252344078;34103015080000000504162001"], "outputLanguage": "pl"}
```

Przykład wyniku:

```json
{"nip": "5252344078", "vatStatus": "Czynny podatnik VAT", "bankAccountsCount": 1, "krsShareCapital": 800000.0,
 "summary": "GOOGLE POLAND SPÓŁKA Z OGRANICZONĄ ODPOWIEDZIALNOŚCIĄ (NIP 5252344078): Czynny podatnik VAT na dzień 2026-11-05. Liczba rachunków na białej liście: 1. …"}
```

Płacisz tylko za znalezione podmioty: 0,003 USD za podmiot; błędne NIP-y i rachunki spoza listy są bezpłatne.

# Actor input Schema

## `nips` (type: `array`):

10-digit Polish tax identification numbers. Dashes, spaces and the PL prefix are accepted (e.g. PL 525-234-40-78). Each NIP returns its VAT status, whitelisted bank accounts and, if enabled, KRS data. Invalid numbers are reported free of charge.

## `bankAccounts` (type: `array`):

26-digit Polish bank account numbers (NRB), with or without PL prefix and spaces. Returns whether the account is on the VAT whitelist and who owns it. Use before paying an invoice over 15,000 PLN.

## `nipAccountPairs` (type: `array`):

Verify that a given bank account belongs to a given NIP on the whitelist (official check endpoint, also covers virtual / split accounts). Format: NIP;ACCOUNT, e.g. 5252344078;34103015080000000504162001.

## `krsNumbers` (type: `array`):

National Court Register numbers (up to 10 digits, leading zeros optional). Returns the current KRS extract (legal form, share capital, board, representation rules, proxies, PKD, liquidation/insolvency entries) plus the VAT status of its NIP.

## `includeKrs` (type: `boolean`):

For NIPs and bank accounts whose owner has a KRS number, also fetch the current KRS extract (representatives, share capital, representation method, liquidation flags).

## `outputLanguage` (type: `string`):

Language of the human-readable fields (vatStatus, summary). Field names stay in English; official Polish values (vatStatusPl, krsLegalForm) are always kept.

## `date` (type: `string`):

Date of the VAT whitelist status (the register keeps 5 years of history). Leave empty for today (Polish time). KRS data is always the current extract.

## `onlyChanged` (type: `boolean`):

For scheduled runs: output (and pay for) only entities whose VAT status, accounts or KRS data changed since the previous run with the same watchlist name. First run outputs everything.

## `watchlistName` (type: `string`):

Name of the memory used by 'Only changed'. Use a different name per client or supplier list.

## `saveKrsExtract` (type: `boolean`):

Store the full official KRS JSON extract in the key-value store and add its link (krsRawExtractUrl) to the result, for audit files.

## Actor input object example

```json
{
  "nips": [
    "5252344078",
    "7740001454"
  ],
  "bankAccounts": [
    "34103015080000000504162001"
  ],
  "nipAccountPairs": [
    "5252344078;34103015080000000504162001"
  ],
  "krsNumbers": [
    "0000387251"
  ],
  "includeKrs": true,
  "outputLanguage": "en",
  "onlyChanged": false,
  "watchlistName": "default",
  "saveKrsExtract": false
}
```

# Actor output Schema

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

VAT status, whitelist accounts and KRS data for each checked entity.

## `files` (type: `string`):

Official KRS JSON extracts saved when 'Save the raw KRS extract' is enabled.

# 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 = {
    "nips": [
        "5252344078",
        "7740001454"
    ],
    "bankAccounts": [
        "34103015080000000504162001"
    ],
    "nipAccountPairs": [
        "5252344078;34103015080000000504162001"
    ],
    "krsNumbers": [
        "0000387251"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("actose/poland-vat-whitelist-krs").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 = {
    "nips": [
        "5252344078",
        "7740001454",
    ],
    "bankAccounts": ["34103015080000000504162001"],
    "nipAccountPairs": ["5252344078;34103015080000000504162001"],
    "krsNumbers": ["0000387251"],
}

# Run the Actor and wait for it to finish
run = client.actor("actose/poland-vat-whitelist-krs").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 '{
  "nips": [
    "5252344078",
    "7740001454"
  ],
  "bankAccounts": [
    "34103015080000000504162001"
  ],
  "nipAccountPairs": [
    "5252344078;34103015080000000504162001"
  ],
  "krsNumbers": [
    "0000387251"
  ]
}' |
apify call actose/poland-vat-whitelist-krs --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,actose/poland-vat-whitelist-krs"
        }
    }
}
```

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/dS83WTEbZvkQOxRJO/builds/94GnrjZqDvbhkIDgj/openapi.json
