# Poland KRS Company Registry Scraper (`crawlerbros/poland-krs-company-registry-scraper`) Actor

Look up companies, foundations, and associations in Poland's KRS (Krajowy Rejestr Sadowy) by KRS number. Get legal form, REGON/NIP, address, share capital, board members, PKD activity codes, and financial filing history from the official registry API.

- **URL**: https://apify.com/crawlerbros/poland-krs-company-registry-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Automation, Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Poland KRS Company Registry Scraper

Look up companies, foundations, and associations in **KRS** — Poland's National Court Register (Krajowy Rejestr Sądowy), maintained by the Ministry of Justice. Get legal form, REGON/NIP tax identifiers, registered address, share capital, board members and proxy holders, business activity (PKD codes), financial statement filing history, and — with the full extract — the complete change history and merger/transformation record. No auth, no proxy, no cookies required.

### Data source & limitations

This actor uses **api-krs.ms.gov.pl**, the Ministry of Justice's official, public, unauthenticated REST API for KRS extracts ("odpisy") — the same backend registry that the KRS search portal (wyszukiwarka-krs.ms.gov.pl) is a front-end for. The search *portal* itself sits behind an Incapsula WAF that returns a JavaScript challenge page to every zero-cost access method (plain HTTP, TLS-impersonated HTTP requests, and a headless browser with stealth patches were all confirmed blocked); the official API subdomain has no such protection and requires no API key, login, or agreement — it's designed for exactly this kind of machine lookup. As a result, this actor supports **exact KRS-number lookup** (the core, high-value use case — verifying and enriching a known company) rather than free-text name search.

### What this actor does

- **Lookup by KRS number**, one or many at once
- **Two registers, plus auto-detect:** P (Register of Entrepreneurs), S (Register of Associations, Foundations, and Public Healthcare Institutions), or `AUTO` to try P then S per number — handy when a batch mixes companies with foundations/associations
- **Two extract types:** current state ("Aktualny") or the full historical extract ("Pełny") — every past entry, name change, address change, and board membership since registration
- **Empty fields are omitted** — you only ever see fields KRS actually has data for

### Output per entity

**Always present:**

- `krsNumber`, `name`, `legalForm`, `register`, `registerCode`
- `extractType`, `extractDateTime`, `stateAsOfDate`
- `sourceUrl` — the official API URL for this exact lookup

**Present when applicable:**

- `regon`, `nip` — tax/statistical identifiers
- `registrationDate`, `lastEntryNumber`, `lastEntryDate`, `lastEntryCaseSignature`, `registeringCourt`
- `isPublicBenefitOrg` — official Public Benefit Organization (OPP) status
- `previousRegistration` — prior register name/number, if the entity predates KRS (registered before 2001)
- `address` — region, county, commune, city, street, house/apartment number, postal code, country, `fullAddress`, email, website
- `branches[]` — regional branches/units with their own addresses (associations & foundations, register S)
- `supervisingAuthority` — the state authority exercising oversight (associations & foundations, register S)
- `organizationPurpose` — the entity's stated mission/purpose (associations & foundations, register S)
- `oppPaidActivities[]`, `oppUnpaidActivities[]` — PKD codes for paid vs. unpaid Public Benefit Organization activity scope
- `capital` — share capital amount/currency, target/reserve capital, paid-up capital, conditional capital increase, total shares, nominal share value, in-kind contributions (companies with share capital only)
- `shareSeries[]` — share issuance series (name, share count, privilege status) for joint-stock companies
- `boardAuthorizedToIssueSubscriptionWarrants` — whether the management board is authorized to issue subscription warrants
- `entityDurationPeriod`, `statuteGrantsPersonalRights`, `bondholdersHaveProfitShareRight` — charter-duration and statute-rights flags
- `statuteAmendments[]` — articles-of-association / statute deed & amendment history (capped at 30 most recent)
- `representationBody`, `representationMethod`, `representatives[]` — board members (name partially masked for privacy, role, suspension status)
- `supervisoryBoard[]`, `proxyHolders[]` (with proxy type)
- `mainActivity`, `otherActivities[]` — PKD (Polish business activity classification) codes
- `financialStatementFilings[]`, `consolidatedFinancialStatementFilings[]` — submission dates and periods of filed annual (and, for capital groups, consolidated) financial statements
- `firstFiscalYearEndDate` — the date the entity's first fiscal year ended
- `entriesHistory[]` + `entriesHistoryCount` (full extract only, capped at 30 most recent) — every court filing entry: description, date, case signature, court
- `dzial4` / `dzial5` / `dzial6` — liabilities & receivables, receivership/trusteeship, and merger/division/transformation/liquidation/bankruptcy/restructuring history, passed through under their official Polish section keys when populated (these sections cover ~150 granular, low-frequency legal-filing fields; only present when the entity has history in that area)

Every record also includes `recordType: "company"` and `scrapedAt` (UTC timestamp).

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `byKrsNumber` | Lookup mode |
| `krsNumbers` | array | `["0000006865"]` | KRS registry numbers, e.g. `0000006865` |
| `register` | string | `P` | `P` (Register of Entrepreneurs), `S` (Associations/Foundations), or `AUTO` (try both) |
| `extractType` | string | `Aktualny` | `Aktualny` (current) or `Pelny` (full history) |
| `publicBenefitOrgOnly` | bool | `false` | Only emit entities with OPP status |
| `maxItems` | int | `20` | Hard cap (1–200) |

#### Example: lookup a company (current state)

```json
{
  "mode": "byKrsNumber",
  "krsNumbers": ["0000006865"],
  "register": "P",
  "extractType": "Aktualny"
}
```

#### Example: full historical extract with complete filing history

```json
{
  "mode": "byKrsNumber",
  "krsNumbers": ["0000006865"],
  "register": "P",
  "extractType": "Pelny"
}
```

#### Example: lookup a foundation

```json
{
  "mode": "byKrsNumber",
  "krsNumbers": ["0000030897"],
  "register": "S"
}
```

### Use cases

- **KYB / KYC due diligence** — verify a Polish counterparty's legal status, registered address, and board composition before onboarding
- **Company registry enrichment** — bulk-enrich a list of KRS numbers with legal form, REGON/NIP, and address
- **Corporate history research** — pull the full merger/acquisition/transformation history (`dzial6`) for M\&A due diligence
- **Compliance monitoring** — track filing entries (`entriesHistory`) for changes in board composition or capital
- **Nonprofit/NGO research** — identify Public Benefit Organizations (register=S, `publicBenefitOrgOnly=true`)

### FAQ

**What's KRS?** The Krajowy Rejestr Sądowy — Poland's National Court Register, the authoritative public record of every company, partnership, foundation, association, and public healthcare institution registered in Poland. Maintained by the Ministry of Justice (Ministerstwo Sprawiedliwości).

**Why P vs S register — how do I know which one a company is in?** Businesses, partnerships, and sole traders are in the Register of Entrepreneurs (P). Foundations, associations, and most non-profits are in the Register of Associations (S). If you look up a KRS number under the wrong register, the actor fails soft for that number (no crash, just no record) — try the other register, or set `register: "AUTO"` to have the actor try both automatically for every number in the batch.

**Are board member names fully visible?** No — consistent with the official API's own privacy design, names and personal ID numbers (PESEL) for individuals are partially masked with asterisks (e.g. `N**********`), showing enough to identify a role holder's initial letters while protecting full personal data. This is how the Ministry of Justice's own public API returns this data — not a redaction added by this actor.

**What's the difference between Aktualny and Pełny extracts?** `Aktualny` shows only the entity's current state (present address, current board, current name). `Pełny` includes the complete history: every prior name, address, and board composition change, plus a full list of every court filing entry ever recorded. Pełny extracts are larger and take slightly longer to fetch.

**Why are dzial4/dzial5/dzial6 in Polish while everything else is in English?** Those sections (liabilities & receivables, receivership, and merger/liquidation/bankruptcy history) cover roughly 150 deep, low-frequency legal-filing field names. Rather than risk a partial or misleading translation, they're passed through under their official Polish section keys — and are almost always absent (most entities have no history in these areas), so in practice they rarely appear in output.

**Is authentication required?** No. This actor uses the Ministry of Justice's public, unauthenticated KRS extract API — no API key, login, or proxy needed.

**How fresh is the data?** Real-time — every request reads live from api-krs.ms.gov.pl.

# Actor input Schema

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

What to fetch.

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

Polish KRS registry numbers, e.g. `0000006865`. Leading zeros optional.

## `register` (type: `string`):

Which of the two KRS registers the numbers belong to. Use Auto-detect if your `krsNumbers` list mixes entrepreneurs with foundations/associations.

## `extractType` (type: `string`):

Current state only, or the full historical extract (every past entry, including deregistered data).

## `publicBenefitOrgOnly` (type: `boolean`):

Only emit entities with official Public Benefit Organization (OPP) status. Mainly relevant for register=S.

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

Hard cap on emitted records.

## Actor input object example

```json
{
  "mode": "byKrsNumber",
  "krsNumbers": [
    "0000006865"
  ],
  "register": "P",
  "extractType": "Aktualny",
  "publicBenefitOrgOnly": false,
  "maxItems": 20
}
```

# Actor output Schema

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

Dataset containing all scraped KRS entities.

# 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 = {
    "mode": "byKrsNumber",
    "krsNumbers": [
        "0000006865"
    ],
    "register": "P",
    "extractType": "Aktualny",
    "publicBenefitOrgOnly": false,
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/poland-krs-company-registry-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 = {
    "mode": "byKrsNumber",
    "krsNumbers": ["0000006865"],
    "register": "P",
    "extractType": "Aktualny",
    "publicBenefitOrgOnly": False,
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/poland-krs-company-registry-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 '{
  "mode": "byKrsNumber",
  "krsNumbers": [
    "0000006865"
  ],
  "register": "P",
  "extractType": "Aktualny",
  "publicBenefitOrgOnly": false,
  "maxItems": 20
}' |
apify call crawlerbros/poland-krs-company-registry-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlerbros/poland-krs-company-registry-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/N5LaAQHzBBb20aQKo/builds/CwFuMZlKEnJXLgIec/openapi.json
