# KRS Poland Scraper — Polish company register (KRS) data (`eudatalab/krs-pl-scraper`) Actor

Company data from the official Polish National Court Register (KRS) API: name, NIP, REGON, address, share capital, PKD codes, status, filings. Look up KRS numbers or get every company changed or newly registered on a date.

- **URL**: https://apify.com/eudatalab/krs-pl-scraper.md
- **Developed by:** [Ihor Hrypas](https://apify.com/eudatalab) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

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

## KRS Poland Scraper — Polish Company Register (NIP, REGON, PKD, new companies)

Get Polish companies, foundations and associations from the **KRS** (Krajowy Rejestr Sądowy, the National Court Register run by the Ministry of Justice) as a clean table: KRS number, name, NIP, REGON, legal form, status (active / in liquidation / bankruptcy / dissolved / suspended), registration date, full seat address, website, e-delivery address, share capital, PKD activity codes, financial statements filed, and shareholders that are companies. Look up a list of KRS numbers, or get **every entity that changed on a given day — or only the brand-new companies registered that day**. Pay only per company returned.

No browser, no login: data comes from the official open KRS API (api-krs.ms.gov.pl), so the Actor is fast (25 companies in about 10 seconds), cheap on platform usage and does not break on website redesigns.

### Sample output

Real rows from a staged run (KRS bulletin of 2026-10-20):

| krs | name | legalForm | nip | status | city | mainPkd | shareCapital |
|---|---|---|---|---|---|---|---|
| 0000026644 | WISŁA PŁOCK SPÓŁKA AKCYJNA | SPÓŁKA AKCYJNA | 7742262118 | active | PŁOCK | 93.12.Z | 45809500 |
| 0000003431 | PORT LOTNICZY POZNAŃ-ŁAWICA SPÓŁKA Z OGRANICZONĄ ODPOWIEDZIALNOŚCIĄ | SPÓŁKA Z OGRANICZONĄ ODPOWIEDZIALNOŚCIĄ | 7811533610 | active | POZNAŃ | 52.23.Z | 337385000 |
| 0000025726 | "MERINOSOFT" SPÓŁKA Z OGRANICZONĄ ODPOWIEDZIALNOŚCIĄ | SPÓŁKA Z OGRANICZONĄ ODPOWIEDZIALNOŚCIĄ | 5420000245 | active | BIAŁYSTOK | 62.01.Z | 131000 |
| 0000022922 | "SPOŁEM" POWSZECHNA SPÓŁDZIELNIA SPOŻYWCÓW W ŁODZI W LIKWIDACJI | SPÓŁDZIELNIA | 7240003697 | liquidation | ŁÓDŹ | 47.11.Z | — |

One full record:

```json
{
  "krs": "0000026644",
  "registry": "P",
  "name": "WISŁA PŁOCK SPÓŁKA AKCYJNA",
  "legalForm": "SPÓŁKA AKCYJNA",
  "nip": "7742262118",
  "regon": "610366186",
  "status": "active",
  "registeredAt": "2001-07-13",
  "lastEntryAt": "2026-10-20",
  "lastEntryNumber": 146,
  "court": "SĄD REJONOWY DLA ŁODZI ŚRÓDMIEŚCIA W ŁODZI, XX WYDZIAŁ GOSPODARCZY KRAJOWEGO REJESTRU SĄDOWEGO",
  "voivodeship": "mazowieckie",
  "county": "M. PŁOCK",
  "municipality": "M. PŁOCK",
  "city": "PŁOCK",
  "street": "ŁUKASIEWICZA",
  "houseNumber": "34",
  "flatNumber": null,
  "postalCode": "09-400",
  "country": "POLSKA",
  "website": "www.wisla-plock.pl",
  "email": null,
  "eDeliveryAddress": "AE:PL-65468-98086-RVUED-21",
  "shareCapital": 45809500,
  "shareCapitalCurrency": "PLN",
  "mainPkd": "93.12.Z",
  "mainPkdDescription": "DZIAŁALNOŚĆ KLUBÓW SPORTOWYCH",
  "pkdCodes": ["93.12.Z", "93.19.Z", "93.11.Z", "85.59.B", "85.51.Z", "93.13.Z", "96.04.Z", "96.09.Z", "93.29.B"],
  "purpose": null,
  "isPublicBenefit": false,
  "representationBody": "ZARZĄD",
  "boardMembersCount": 2,
  "corporateShareholders": [{ "name": "GMINA PŁOCK", "krs": null, "regon": "611016086", "shares": null }],
  "branchesCount": 0,
  "financialStatementsCount": 26,
  "lastFinancialStatementFiledAt": "2026-07-06",
  "lastFinancialStatementPeriod": "OD 01.01.2025 DO 31.12.2025",
  "hasArrears": false,
  "foreignParentCountry": null,
  "foreignParentRegister": null,
  "url": "https://api-krs.ms.gov.pl/api/krs/OdpisAktualny/0000026644?rejestr=P&format=json"
}
```

### Use cases

- **New-company lead feed**: every company registered in KRS yesterday (about 150–300 per working day) with address, PKD and share capital — run it daily on a schedule and push to your CRM.
- **KYC / supplier checks and monitoring**: paste a list of KRS numbers and get the current status (liquidation, bankruptcy, suspension), registered address, capital and last filed financial statement; or watch the daily bulletin for changes to your counterparties.
- **B2B lead generation and market sizing**: companies by voivodeship, legal form and PKD code that had a register entry in a date range.
- Feed official Polish company data to an AI agent via the Apify MCP server (e.g. "which of these KRS numbers are in liquidation?").

### Pricing

Pay per event: **$0.002 per company**. No company, no charge — numbers that are not in the register, and entities your filters drop, cost nothing. Set **Max results** to cap the cost of a run.

### Input

| Field | Meaning | Default |
|---|---|---|
| KRS numbers | KRS numbers to look up (`0000019193`, `19193`, `KRS 19193`); when set, the dates are ignored | — |
| Changed from / to | read the KRS daily bulletin: every entity with a register entry on those days (at most 31 days per run, newest first) | 2026-10-20 (form prefill) |
| Only new registrations | keep only entities registered in KRS on the bulletin day | off |
| Register | `P` entrepreneurs (companies, partnerships, cooperatives), `S` associations and foundations, or both | both |
| Voivodeship | region of the registered seat | all |
| Legal form | sp. z o.o., S.A., P.S.A., sp.j., sp.k., S.K.A., sp.p., cooperative, foundation, association, foreign branch, state enterprise | all |
| PKD activity codes | prefix match on all registered activities: `62`, `62.01.Z`, `4120` | all |
| Max results | stop after N companies (= cost cap) | 100 (form: 25) |
| Proxy | not needed for this open government API | off |

With neither KRS numbers nor dates, the Actor reads the latest non-empty bulletin (yesterday, or the last working day before it).

Filters are applied to each extract, so a narrow filter over a long date range reads many extracts that are not returned (and not charged); expect about 4 extracts per second.

### Output fields

`krs`, `registry` (P/S), `name`, `legalForm`, `nip`, `regon` (9 digits), `status` (`active`, `suspended`, `liquidation`, `bankruptcy`, `dissolved`), `registeredAt`, `lastEntryAt`, `lastEntryNumber`, `court`, `voivodeship`, `county`, `municipality`, `city`, `street`, `houseNumber`, `flatNumber`, `postalCode`, `country`, `website`, `email`, `eDeliveryAddress`, `shareCapital`, `shareCapitalCurrency`, `mainPkd`, `mainPkdDescription`, `pkdCodes`, `purpose` (statutory goal of associations/foundations), `isPublicBenefit` (OPP status), `representationBody`, `boardMembersCount`, `corporateShareholders` (shareholders that are legal entities: name, KRS, REGON, shares), `branchesCount`, `financialStatementsCount`, `lastFinancialStatementFiledAt`, `lastFinancialStatementPeriod`, `hasArrears` (unpaid public debts entered in section 4), `foreignParentCountry` and `foreignParentRegister` (branches of foreign companies), `url`, `scrapedAt`

Dates are ISO `YYYY-MM-DD`; texts are as published in KRS (upper case).

### Limits and fair use

Only the open KRS API is used. **No personal data**: board members, partners, shareholders who are natural persons, proxies and liquidators are not returned — only their count and shareholders that are companies or public bodies. (Partnership names such as "… KOWALSKI SPÓŁKA JAWNA" contain partners' surnames because that is the legal company name.) Entities removed from the register have no current extract and are skipped.

### Problems?

Open an issue on the **Issues** tab — median response time is under 6 hours. Include the run ID.

# Actor input Schema

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

Polish KRS numbers to look up, e.g. 0000019193 or 19193 (leading zeros are added). When this list is set, the dates below are ignored; the filters still apply.

## `changedFrom` (type: `string`):

First day of the KRS bulletin to read: every entity that got a register entry that day (new registration, change of address, board, capital, liquidation…). Format YYYY-MM-DD. Leave both dates empty for the latest bulletin.

## `changedTo` (type: `string`):

Last day of the range (inclusive, at most 31 days). Empty = same as 'Changed from'. Days are read newest first.

## `newRegistrationsOnly` (type: `boolean`):

Keep only entities registered in KRS on the bulletin day — a daily feed of brand-new Polish companies (about 150–300 per working day). Only used with dates.

## `registry` (type: `string`):

KRS has two registers. With a KRS list, 'both' tries P first and then S.

## `voivodeships` (type: `array`):

Leave empty for all of Poland.

## `legalForms` (type: `array`):

Leave empty for all legal forms.

## `pkdCodes` (type: `array`):

Polish activity codes (PKD), matched as a prefix against all registered activities, e.g. 62 (IT), 62.01.Z, 4120 or 41.20.Z. An entity matches if ANY of its codes starts with ANY of these.

## `maxItems` (type: `integer`):

Stop after this many saved companies. You pay only for saved results.

## `proxyConfiguration` (type: `object`):

Not needed: KRS is an open government API. Leave off.

## Actor input object example

```json
{
  "changedFrom": "2026-10-20",
  "changedTo": "2026-10-20",
  "newRegistrationsOnly": false,
  "registry": "both",
  "maxItems": 25,
  "proxyConfiguration": {
    "useApifyProxy": 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 = {
    "changedFrom": "2026-10-20",
    "changedTo": "2026-10-20",
    "maxItems": 25,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("eudatalab/krs-pl-scraper").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 = {
    "changedFrom": "2026-10-20",
    "changedTo": "2026-10-20",
    "maxItems": 25,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("eudatalab/krs-pl-scraper").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 '{
  "changedFrom": "2026-10-20",
  "changedTo": "2026-10-20",
  "maxItems": 25,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call eudatalab/krs-pl-scraper --silent --output-dataset

```

## MCP server setup

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

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/RfCcmgMSifPrwSx3M/builds/EP2o1qnkbLJjvZCVI/openapi.json
