# Poland KRS Company Extractor (Official API) (`uhqxx/krs-poland`) Actor

Extracts company data from the official Polish KRS business register open API: name, legal form, NIP, REGON, address, share capital, PKD activities and website. Look up KRS numbers or list the companies registered or changed on a given day. No account, no scraping.

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

## Pricing

from $4.00 / 1,000 company extracteds

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

## Poland KRS Company Extractor (Official API)

### What is Poland KRS Company Extractor?

**Poland KRS Company Extractor** reads the **official open API of the Polish business register (KRS, Krajowy Rejestr Sądowy)** and turns it into a clean table: one row per company, with the **name, legal form, NIP, REGON, address, share capital, PKD activity codes, website and registration dates**. Give it a list of KRS numbers, or give it a day and get the **companies registered on that day** (or every company that changed that day). Export the result as JSON, CSV or Excel.

It uses the register's own open API, published by the Polish Ministry of Justice: no scraping, no login, no account, no proxy.

> This Actor is an independent tool. It is not affiliated with, or endorsed by, the Polish Ministry of Justice.

### What can this KRS extractor do?

- Extract company data from the **KRS register of entrepreneurs** for any list of KRS numbers (with or without leading zeros).
- List the **new companies of a given day** (by reading that day's official bulletin), for example to feed a B2B lead list or a market watch.
- List **every company that changed on a given day** (new filings, address changes, capital changes...).
- Return flat, ready-to-use columns: address split into street, number, postal code and city; PKD activity codes; share capital as a number; dates in ISO format.
- Optionally add the **management board members** (name and role). Off by default.
- Skip the KRS numbers and the people in your exclusion lists.
- Report honestly what it could not read, with a clear status for each number.

### Who is it for?

- Sales and marketing teams building lists of new Polish companies.
- Compliance, KYB and credit teams checking a company against the official register.
- Researchers and analysts following company creation by region or by activity (PKD code).
- Developers who need Polish register data in a simple API call.

### 3 ways to use it

1. **Watch new companies every day.** Schedule a run with yesterday's date and "New companies": you get the companies registered that day, with address, activity and capital.
2. **Check a list of suppliers or customers.** Paste their KRS numbers and get legal form, NIP, REGON, address, capital and the date of the last entry.
3. **Enrich a spreadsheet.** Turn a column of KRS numbers into a full table.

### Example output

Fictional company, real structure:

```json
{
  "krs": "0000000123",
  "status": "ok",
  "statusDetail": null,
  "name": "EXEMPLE SPÓŁKA Z OGRANICZONĄ ODPOWIEDZIALNOŚCIĄ",
  "legalForm": "SPÓŁKA Z OGRANICZONĄ ODPOWIEDZIALNOŚCIĄ",
  "nip": "0000000000",
  "regon": "000000000",
  "registrationDate": "2026-10-30",
  "lastEntryDate": "2026-10-30",
  "lastEntryNumber": 1,
  "statementAsOf": "2026-10-30",
  "voivodeship": "WIELKOPOLSKIE",
  "county": "POZNAŃ",
  "municipality": "POZNAŃ",
  "city": "POZNAŃ",
  "street": "UL. PRZYKŁADOWA",
  "houseNumber": "1",
  "apartmentNumber": "2",
  "postalCode": "60-000",
  "website": "WWW.EXEMPLE.PL",
  "shareCapital": 5000,
  "shareCapitalCurrency": "PLN",
  "mainActivityCode": "62.01.Z",
  "mainActivity": "DZIAŁALNOŚĆ ZWIĄZANA Z OPROGRAMOWANIEM",
  "otherActivityCodes": ["62.02.Z", "93"],
  "board": null
}
```

### How to use it

1. Open the Actor on Apify.
2. Fill **KRS numbers** (one per line) and/or a **Bulletin date** (`YYYY-MM-DD`, after 2021-12-08).
3. With a bulletin date, choose **New companies** or **All companies changed that day**.
4. Set **Maximum number of companies** (100 by default).
5. Click **Start**, then open the **Results** table or export it as JSON, CSV or Excel. A short summary (totals only) is saved in the `SUMMARY` record of the key-value store.

You can also run it through the [Apify API](https://docs.apify.com/api/v2), on a schedule, or from integrations such as Make, Zapier or n8n.

#### Input

| Field | Meaning | Default |
|---|---|---|
| `krsNumbers` | KRS numbers to extract. `19193` and `0000019193` are the same. | none |
| `bulletinDate` | A day (`YYYY-MM-DD`, after 2021-12-08, not in the future). Adds that day's companies. The bulletin of the current day may be incomplete. | empty |
| `bulletinScope` | `newCompanies` (registered that day) or `allChanges` (every company changed that day). | `newCompanies` |
| `maxCompanies` | Safety limit per run, 1 to 5,000. | 100 |
| `includeBoard` | Adds name and role of the management body members and registered proxies. Never includes PESEL numbers or shareholders. | off |
| `excludedKrs` | KRS numbers that must NOT be processed. | empty |
| `excludedPeople` | Full names removed from the board list (when `includeBoard` is on). Ignores case, accents and the order of the words; a first name + surname is enough. | empty |
| `requestsPerSecond` | How fast the official API is queried, 1 to 5. | 2 |

You need at least `krsNumbers` or `bulletinDate`.

#### Output columns

| Column | Meaning |
|---|---|
| `krs`, `status`, `statusDetail` | The KRS number, the status of the row (see below) and an explanation when it is not `ok`. |
| `name`, `legalForm` | Company name and legal form (in Polish, as in the register). |
| `nip`, `regon` | Tax identification number and statistical number. |
| `registrationDate`, `lastEntryDate`, `lastEntryNumber`, `statementAsOf` | Registration date, date and number of the last entry, and the date the data is valid as of. |
| `voivodeship`, `county`, `municipality` | Administrative location of the registered seat. |
| `city`, `street`, `houseNumber`, `apartmentNumber`, `postalCode` | Address. |
| `website` | Website as written in the register (often empty). |
| `shareCapital`, `shareCapitalCurrency` | Registered share capital as a number, and its currency. |
| `mainActivityCode`, `mainActivity`, `otherActivityCodes` | PKD activity codes (for example `62.01.Z`) and the description of the main activity. |
| `board` | Only with `includeBoard`: list of `{name, role}`. Otherwise `null`. |

Missing information is always `null`: nothing is guessed or filled in.

#### What the statuses mean

- **ok**: the company was extracted. **Only these rows are charged.**
- **not_found**: the number is not in the register of entrepreneurs (the register answered "not found"). It may exist in the other KRS register (associations and foundations), which is not covered.
- **no_data**: the register answered without any content for this number. We do not guess why.
- **error**: the request failed or the answer could not be used (for example an empty or broken answer). Run it again later.

### FAQ

#### Is this scraping? Is it allowed?

No scraping: the Actor calls the **official open API** of the Polish business register, which the Ministry of Justice publishes for reuse (the page cites the Polish law on open data and the reuse of public sector information, and refers to the GDPR). We have not found a published rate limit, so the Actor is deliberately gentle (2 requests per second by default) and stops if the API keeps failing. You remain responsible for how you reuse the data.

#### Can I search companies by name or by city?

No. The official API only answers by KRS number, or by the daily bulletin. If you do not know the KRS number, you can use the bulletin of a day to list that day's companies and filter the table afterwards.

#### How reliable is "New companies"?

It is **best effort**. KRS numbers follow the order of registration, so the newest companies are at the top of the day's bulletin. The Actor reads the bulletin from the top and stops after 150 older companies in a row. On the day we tested, this worked, but companies registered a day earlier can be mixed in near the boundary, so a few new companies could be missed. Use "All companies changed that day" if you need everything.

#### Does it give e-mail addresses or phone numbers?

No. The register data we saw contains no e-mail address or phone number, only an optional website. Nothing else is collected.

#### How long does a run take?

At the default speed of 2 requests per second, about 500 companies take 4 to 5 minutes and 5,000 companies about 40 minutes. A bulletin run reads more numbers than it keeps (numbers that give nothing, and older companies that mark the boundary). Set the run timeout of your run high enough for the number of companies you ask.

#### What data is as of when?

Each row has `statementAsOf`: the date the data is valid as of in the register. It can be a few days old.

### Honest limits

- Only the **KRS register of entrepreneurs** is read. Entities that are listed only in the other KRS register (associations, foundations and similar) are not covered; their numbers come back as `not_found`. Some foundations and cooperatives do appear in the register of entrepreneurs, and are returned.
- Lookup by KRS number or by day only (no search by name).
- Tested on 400 companies of one day's bulletin: limited liability companies, joint-stock companies, general, limited and professional partnerships, cooperatives, foundations, associations, craft guilds and branches of foreign companies. Fields that do not exist for a legal form come back as `null`. A form that did not appear in this sample could still have a different structure.
- `shareCapital` is only filled for entities that have a share capital: general partnerships, foundations and cooperatives have none in this field and return `null`.
- `nip` or `regon` can be empty: in our test, 13 of 400 rows lacked a REGON and 2 lacked a NIP (we did not verify why).
- The "New companies" mode is best effort (see the FAQ).
- The bulletin of the current day can be incomplete.
- Part of the numbers listed in a bulletin give nothing usable (`not_found` or `no_data`). In our test, reading one day's bulletin, 123 of 524 numbers (about 23%) were in that case. They are counted in the summary (`bulletinSkipped`) and are not saved as rows. The Actor therefore reads more numbers than it keeps, which takes time but costs you nothing: only `ok` rows are charged.
- Text values (names, addresses, activities) are in Polish and in capital letters, as in the register.
- **Run time limit.** If the run timeout you set is about to be reached, the Actor stops early instead of being cut off: the companies already saved are kept, the others are not extracted and not charged, and the status message says so (the `SUMMARY` record has the totals). Start a new run for the rest, or raise the run timeout.

### Data and GDPR: please read

**Data processed.** Public data about companies, taken from the official register. If you turn on `includeBoard`, the output also contains the **names and roles of the people** who manage or represent the company, which are personal data published in the register under Polish law. The Actor never outputs PESEL numbers (the API already masks them), shareholders or partners who are private individuals, e-mail addresses, phone numbers or private addresses.

**Minimisation.** `includeBoard` is **off by default**: leave it off unless you need it.

**What leaves the Actor.** Only the KRS number or the bulletin date you asked for is sent to the official API. No other service is used. Logs contain totals only, never names or numbers.

**What is kept.** The Actor keeps nothing of its own. Your results and your run input (including exclusion lists) are stored by Apify with your run, according to Apify's own retention rules. You can delete them from the Console.

**You are responsible for your use.** You decide why and how the data is used, so you are responsible for compliance with the GDPR and Polish law. In particular:

- Have a valid legal basis for any processing of personal data, and inform the people concerned when required.
- Honour objections and other requests. Use **Excluded people** and **Excluded KRS numbers** so that people who objected are never processed again.
- Follow the rules on business prospecting in your country (for e-mail, phone or post).
- Do not use the data to harass, profile or discriminate against people.

This is general information, not legal advice. We have not reviewed the Polish data protection authority's guidance on reusing public register data.

### En bref (français)

Lit l'**API officielle ouverte du registre du commerce polonais (KRS)** et la transforme en tableau : nom, forme juridique, NIP, REGON, adresse, capital, codes d'activité PKD, site web, dates. Vous donnez des numéros KRS, ou une date pour obtenir les **sociétés créées ce jour-là** (au mieux) ou toutes celles modifiées ce jour-là. Pas de scraping, pas de compte. Les dirigeants (nom et fonction) sont une option **désactivée par défaut** ; jamais de PESEL, d'associés personnes physiques, d'e-mails ni de téléphones. Une **liste d'exclusion** (sociétés et personnes) est disponible. Limites : recherche par numéro ou par jour seulement, registre des entrepreneurs seulement, mode « nouvelles sociétés » au mieux. Vous restez responsable de l'usage des données (RGPD, droit polonais, prospection).

### Pricing

You pay per company extracted. The price is shown in the **Pricing** tab of the Actor.

- **Charged:** each company whose row has the status `ok`.
- **Never charged:** rows with the status `not_found`, `no_data` or `error`, duplicates, numbers in your exclusion list, and companies beyond your `maxCompanies` limit.
- A small fixed fee per run start may also apply, as shown in the Pricing tab.
- You can cap what a run can spend with the maximum cost setting of the run. The Actor stops cleanly when the cap is reached; results already saved are kept.

# Actor input Schema

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

KRS numbers of the companies to extract, one per line. With or without leading zeros (19193 and 0000019193 are the same). Duplicates are processed once.

## `bulletinDate` (type: `string`):

Optional. A day in the format YYYY-MM-DD (after 2021-12-08, not in the future). Adds the companies the register published for that day. The bulletin of the current day may be incomplete.

## `bulletinScope` (type: `string`):

With a bulletin date: newCompanies = companies registered on that day (best effort: the list is read from the newest numbers down and stops after a long series of older companies, so a few new companies can be missed); allChanges = every company that changed that day.

## `maxCompanies` (type: `integer`):

Safety limit for one run. Companies beyond this number are not extracted. A run reads about 2 companies per second by default.

## `includeBoard` (type: `boolean`):

Adds the name and role of the members of the management body and of the registered proxies (personal data published in the register). Never includes PESEL numbers or shareholders. Off by default.

## `excludedKrs` (type: `array`):

KRS numbers that must NOT be processed. They are skipped, not saved and not counted.

## `excludedPeople` (type: `array`):

Full names (for example Jan Kowalski) to remove from the board members list when 'Include management board members' is on, for example people who objected. Matching ignores case and accents.

## `requestsPerSecond` (type: `integer`):

How fast the official API is queried, from 1 to 5. The default (2) is deliberately gentle. The run stops if the API keeps failing.

## Actor input object example

```json
{
  "krsNumbers": [
    "0000019193"
  ],
  "bulletinScope": "newCompanies",
  "maxCompanies": 100,
  "includeBoard": false,
  "excludedKrs": [],
  "excludedPeople": [],
  "requestsPerSecond": 2
}
```

# 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 = {
    "krsNumbers": [
        "0000019193"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("uhqxx/krs-poland").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": ["0000019193"] }

# Run the Actor and wait for it to finish
run = client.actor("uhqxx/krs-poland").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": [
    "0000019193"
  ]
}' |
apify call uhqxx/krs-poland --silent --output-dataset

```

## MCP server setup

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

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/E7O02Ryvq45WPlihW/builds/5EsyHEgSpab5tF7Ph/openapi.json
