# Poland KRS Business Register Scraper (`automation-lab/poland-krs-business-register-scraper`) Actor

Look up official Polish KRS entities by KRS number and export legal identity, status, addresses, representatives, identifiers, and source provenance.

- **URL**: https://apify.com/automation-lab/poland-krs-business-register-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.56 / 1,000 item extracteds

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?

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 Business Register Scraper

Look up official Polish National Court Register records by KRS number.
The Actor turns the current Polish-language KRS API extract into consistent JSON for company verification, recurring KYB checks, enrichment, and audits.
Each result preserves exact source provenance and can optionally include the complete current extract.

### What this Actor does

Poland KRS Business Register Scraper accepts one or many KRS identifiers and retrieves the current official record from the Ministry of Justice API.
It supports both:

- `P` — the entrepreneurs register;
- `S` — the associations, other social and professional organizations, foundations, and public healthcare institutions register;
- `auto` — try `P`, then `S` when no entrepreneurs-register record exists.

One useful entity becomes one dataset item.
Duplicate input identifiers are processed once.
Missing identifiers are logged and skipped unless strict failure behavior is enabled.

### Who is it for?

Use the Actor if you are:

- a compliance analyst refreshing evidence for Polish counterparties;
- a KYB or onboarding team validating legal identity and representatives;
- a legal team collecting current KRS evidence with source links;
- a data engineer enriching CRM, vendor, or supplier records;
- an operations team scheduling repeat checks and comparing datasets;
- a researcher exporting public Polish entity data to CSV, Excel, or JSON.

The Actor is designed for known-identifier verification.
It does not search by company name.

### Why use the official KRS source

Every result comes directly from `api-krs.ms.gov.pl`.
The result includes:

- the exact API request URL;
- the official KRS portal URL;
- the fetch timestamp;
- current register identifiers and latest-entry metadata;
- optional raw source data for audit or specialist processing.

The source may mask personal names and PESEL values.
The Actor does not attempt to bypass that source behavior.

### Data you can extract

| Field | Meaning |
| --- | --- |
| `krsNumber` | Normalized 10-digit KRS identifier |
| `name` | Current registered entity name |
| `registry` | Official register code |
| `legalForm` | Legal form in Polish |
| `nip` | Polish tax identifier, when recorded |
| `regon` | Statistical identifier, when recorded |
| `registrationDate` | KRS registration date |
| `recordState` | Official numeric state of the register position |
| `latestEntryNumber` | Latest register entry number |
| `latestEntryDate` | Latest register entry date |
| `latestEntrySignature` | Signature for the latest entry |
| `registeredOffice` | Normalized seat and postal address |
| `electronicDeliveryAddress` | BAE electronic-delivery address, when present |
| `representationBody` | Governing representation body |
| `representationMethod` | Official representation rule |
| `representatives` | Representatives, roles, and suspension flags |
| `proxies` | Commercial proxies (`prokurenci`) from KRS |
| `partners` | Partners/shareholders exposed in section one |
| `shareCapital` | Source share-capital section |
| `activities` | Source PKD activity section |
| `statusProceedings` | Section-six status and proceeding information |
| `sourceApiUrl` | Exact official API URL used |
| `sourcePortalUrl` | Official KRS search portal |
| `fetchedAt` | ISO 8601 retrieval timestamp |
| `rawCurrentExtract` | Optional full official current extract |

Fields can be null when the register does not provide them for that legal form.

### Getting started

1. Open the Actor input page.
2. Add one or more numeric KRS identifiers.
3. Keep **Register type** on `auto` unless you know the register.
4. Choose whether to include the complete raw current extract.
5. Set the maximum records and concurrency.
6. Click **Start**.
7. Open the **Dataset** tab to inspect or export results.

A short identifier such as `123456` is normalized to `0000123456`.
Values containing letters or more than ten digits are rejected.

### Input parameters

#### `krsNumbers`

Required array of 1–1,000 KRS identifiers.
Each value must contain 1–10 digits.
Duplicates are removed.

#### `registry`

Optional register selection:

- `auto` (default): check `P`, then `S`;
- `P`: entrepreneurs only;
- `S`: associations and foundations only.

Selecting an exact register avoids a second request for absent records.

#### `includeRawExtract`

Defaults to `false`.
Enable it when you need source-native sections that are not normalized into dedicated fields.
Raw values remain in Polish and may change when the upstream API evolves.

#### `failOnNotFound`

Defaults to `false`.
When false, unknown KRS numbers are logged and omitted.
When true, any unknown identifier causes a non-zero run result after completed lookups.

#### `maxItems`

Limits the number of unique supplied identifiers processed.
The default is 100 and the maximum is 1,000.

#### `maxConcurrency`

Controls simultaneous official API requests.
The default is 5 and the maximum is 10.
Lower it if the official service is under load.

### Example input

```json
{
  "krsNumbers": ["0000123456", "0000030897"],
  "registry": "auto",
  "includeRawExtract": false,
  "failOnNotFound": false,
  "maxItems": 2,
  "maxConcurrency": 2
}
```

The first example exercises the entrepreneurs register.
The second exercises the associations register.

### Example output

```json
{
  "krsNumber": "0000123456",
  "name": "RODENSTOCK POLSKA SPÓŁKA Z OGRANICZONĄ ODPOWIEDZIALNOŚCIĄ",
  "registry": "RejP",
  "legalForm": "SPÓŁKA Z OGRANICZONĄ ODPOWIEDZIALNOŚCIĄ",
  "nip": "6342373405",
  "regon": "27676445600000",
  "registrationDate": "25.07.2002",
  "recordState": 1,
  "registeredOffice": {
    "country": "POLSKA",
    "province": "MAZOWIECKIE",
    "city": "WARSZAWA",
    "postalCode": "02-017"
  },
  "representationBody": "ZARZĄD",
  "representatives": [
    {
      "firstName": "V*****",
      "surname": "N******",
      "role": "WICEPREZES ZARZĄDU SPÓŁKI",
      "suspended": false
    }
  ],
  "sourceApiUrl": "https://api-krs.ms.gov.pl/api/krs/OdpisAktualny/0000123456?rejestr=P&format=json",
  "fetchedAt": "2026-09-09T14:00:00.000Z"
}
```

Names above reflect the masking returned by the public API.
They are not expanded or inferred.

### How much does it cost to verify Polish KRS entities?

The Actor uses pay-per-event pricing:

- a **$0.005** one-time start charge per run;
- a tiered **item** charge for each useful KRS entity written to the dataset.

| Account tier | Price per returned entity |
| --- | ---: |
| FREE | $0.0049036 |
| BRONZE | $0.004264 |
| SILVER | $0.0033259 |
| GOLD | $0.0025584 |
| PLATINUM | $0.0025584 |
| DIAMOND | $0.0025584 |

Unknown, invalid, duplicate, or failed lookups do not produce an item charge.
Batching identifiers into one run shares the start charge across the batch.

For example, the total customer charge for 10 returned entities is the start fee plus 10 item events at the active account tier.
For 100 returned entities it is the start fee plus 100 item events.
Apify selects the applicable tier for your account.

### Reliability and retries

The Actor uses the public JSON API rather than browser automation.
Requests have a 30-second timeout.
Transient network errors, rate limits, and temporary server errors are retried up to three times with backoff.
Stable not-found responses are not retried.

`auto` register detection can make two requests for an entity that exists only in `S` or does not exist.
No proxy is used automatically.
This keeps runtime and transfer costs low.

### Integrations

The Actor returns current snapshots for supplied KRS identifiers. Connect those snapshots to systems that store, compare, or review them; the Actor does not provide built-in monitoring or name search.

#### Scheduled KYB checks

1. Create an Apify Task containing your known KRS-number list.
2. Schedule the Task daily, weekly, or monthly.
3. Export each run dataset to Google Sheets, a warehouse, or object storage.
4. Join snapshots on `krsNumber` and compare `latestEntryNumber`, `latestEntryDate`, legal identity, address, and representative fields.
5. Route detected changes into your existing compliance review process.

#### Google Sheets and spreadsheet review

Download the dataset as CSV or Excel, or use an Apify integration to send the current records to Google Sheets. Keep each run in a dated sheet or append a snapshot timestamp, then compare stable `krsNumber` rows and latest-entry fields. Flatten nested representative and address fields in your integration when one-column-per-value reporting is required.

#### Warehouses and ETL pipelines

Fetch dataset items through the dataset API as JSON or JSONL and load them into your warehouse or data lake. Preserve `sourceApiUrl`, `sourcePortalUrl`, and `fetchedAt` with each row so downstream audits retain official provenance. JSON or JSONL is preferable when you need complete nested sections; CSV, Excel, XML, and RSS exports are also available.

### API usage with cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~poland-krs-business-register-scraper/runs?token=$APIFY_TOKEN&waitForFinish=120" \
  -H "Content-Type: application/json" \
  -d '{"krsNumbers":["0000123456"],"registry":"auto","maxItems":1}'
```

Retrieve dataset items using the `defaultDatasetId` returned by the run.
Do not embed tokens in public source code.

### API usage with JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/poland-krs-business-register-scraper').call({
  krsNumbers: ['0000123456', '0000030897'],
  registry: 'auto',
  maxItems: 2,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### API usage with Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/poland-krs-business-register-scraper').call(
    run_input={
        'krsNumbers': ['0000123456'],
        'registry': 'auto',
        'maxItems': 1,
    }
)
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### Use with MCP and AI agents

Add the Actor to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/poland-krs-business-register-scraper"
```

#### Claude Desktop, Cursor, and VS Code setup

Use this same MCP server configuration in Claude Desktop, Cursor, or VS Code:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/poland-krs-business-register-scraper"
    }
  }
}
```

Example prompts:

- “Fetch the current KRS record for 0000123456 and summarize legal identity and address.”
- “Verify these KRS identifiers and return NIP, REGON, representatives, and official source links.”
- “Refresh my Polish counterparty list and highlight latest-entry numbers for downstream comparison.”

AI output should not replace legal or compliance review.

### Responsible use and legality

KRS is a public official register, but public availability does not remove every legal obligation.
Use results only for lawful purposes.
Apply data-minimization, retention, access-control, and accuracy procedures appropriate to your jurisdiction.
Do not use masked fields to infer undisclosed personal data.
Verify high-impact decisions against the live official source.
Respect Apify's terms and the source's applicable rules.

### Limitations

- Input is by KRS identifier, not company name.
- Results are current extracts, not historical change events.
- The official API can be unavailable or rate-limited.
- Source field names and nested raw sections are in Polish.
- Personal names and identifiers may be masked by the official API.
- Not every legal form contains the same sections.
- A missing optional section appears as null, an empty array, or an empty object.
- The Actor does not download PDF extracts or financial-statement files.
- The Actor does not provide legal, sanctions, insolvency, or beneficial-ownership advice.

### Troubleshooting

#### “Invalid KRS number”

Use digits only, with at most ten digits.
The Actor adds leading zeroes automatically.

#### No dataset item was produced

Check the log for a not-found message.
Try `registry: "auto"` if you selected the wrong register.
Confirm the identifier in the official KRS portal.
Enable `failOnNotFound` when omission should fail your pipeline.

#### The run reports a temporary API error

Retry later or reduce `maxConcurrency`.
The Actor already retries transient failures three times inside a run.
Do not add aggressive external retries against the public service.

#### A field is masked or null

That is the value supplied by the official current-extract API.
Enable `includeRawExtract` to inspect the source section.
The Actor does not reconstruct masked personal data.

### FAQ

#### Is this the official Polish register?

The Actor is not operated by the Polish Ministry of Justice.
It retrieves data from the Ministry's official public KRS API and includes source URLs.

#### Does it search by entity name?

No.
Supply known KRS identifiers.
Use the official search portal to identify a KRS number when you only know a name.

#### Can it process companies and foundations together?

Yes.
Use `registry: "auto"` for mixed batches.

#### Does it charge for missing records?

No item event is emitted for a missing record.
The one-time run-start charge still applies.

#### Can I compare changes automatically?

Schedule repeat runs and compare exported snapshots using stable `krsNumber` keys and latest-entry metadata.
The Actor itself does not label differences.

#### Why are representatives' names masked?

The official API can return masked personal values.
The output accurately preserves that source behavior.

### Related Automation Lab Actors

- [Poland KRS Financial Statements Scraper](https://apify.com/automation-lab/poland-krs-financial-scraper) — export KRS financial-filing mentions for known identifiers.
- [VIES EU VAT Number Scraper](https://apify.com/automation-lab/vies-eu-vat-number-scraper) — validate EU VAT registrations for a complementary business-verification workflow.

Choose this Actor for current Polish KRS legal identity and representation data.
Choose the financial Actor when the primary job is filing-document discovery.

# Actor input Schema

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

One or more Polish KRS identifiers. Short values are left-padded to the official 10-digit format.

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

Auto checks the entrepreneurs register (P) and then the associations register (S). Select P or S to restrict lookups.

## `includeRawExtract` (type: `boolean`):

Include the complete Polish-language official API extract alongside normalized fields.

## `failOnNotFound` (type: `boolean`):

Fail the run if any supplied KRS number is absent from the selected register(s). Otherwise missing identifiers are logged and skipped.

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

Maximum number of supplied KRS identifiers to process.

## `maxConcurrency` (type: `integer`):

Maximum simultaneous official API lookups.

## Actor input object example

```json
{
  "krsNumbers": [
    "0000123456"
  ],
  "registry": "auto",
  "includeRawExtract": false,
  "failOnNotFound": false,
  "maxItems": 10,
  "maxConcurrency": 5
}
```

# Actor output Schema

## `overview` (type: `string`):

Normalized legal identity, address, representation, status, and source provenance for each found KRS entity.

# 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 = {
    "krsNumbers": [
        "0000123456"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/poland-krs-business-register-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 = {
    "krsNumbers": ["0000123456"],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/poland-krs-business-register-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 '{
  "krsNumbers": [
    "0000123456"
  ],
  "maxItems": 10
}' |
apify call automation-lab/poland-krs-business-register-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/poland-krs-business-register-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/aYuIV8X4qWadmRqcG/builds/f0FEs8c3ABfwJJa51/openapi.json
