# Poland KRS Company Profile and Change Watchlist (`danielmichalek/poland-krs-company-watchlist`) Actor

Get business profiles from the official Polish KRS API for supplied company numbers. Compare saved profiles for changed names, addresses and activity codes. Ready to check your company watchlist?

- **URL**: https://apify.com/danielmichalek/poland-krs-company-watchlist.md
- **Developed by:** [Daniel Michałek](https://apify.com/danielmichalek) (community)
- **Categories:** Marketing
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$30.00 / 1,000 completed krs company watchlist reports

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 Profile and Change Watchlist

### What it does

Fetch business-only profiles for supplied KRS company numbers from the official Polish Ministry of Justice public API. Export registered names, legal forms, NIP/REGON identifiers, registered addresses and listed activity codes. Compare the business fields with profiles you previously exported, producing a reviewable difference report for B2B company checks, CRM data maintenance or procurement watchlists.

This is not the offline identifier validator, a search across all companies, a new-company discovery feed, or a source of private contacts. It queries only the supplied identifiers in commercial register P. Board, shareholder, natural-person, email/contact and financial-statement fields are not projected into reports.

### Input

krsNumbers contains1to20 distinct ten-digit strings. Numbers are not accepted as JSON numbers because leading zeros matter. previousProfiles optionally accepts the complete profiles array from a prior report, with projectionVersion1 and the same business fields. A supplied fingerprint is recomputed and checked. Unknown extra baseline fields are not copied into output. Baselines remain customer-supplied, not independently verified historical records.

pkdPrefixes optionally matches source-listed activity code prefixes, for example41,42,43 for section-level checks. Codes are kept at the granularity returned by the source; partial group codes are not padded into invented full codes. Missing or incomplete activity coverage yields unknown when no match can be established. This is not a taxonomy mapping between PKD editions or verification of actual commercial activity.

maxCompanies and maxRequests cap the work at20. The total input cap is2MB, a source response is capped at1MB, and the report at7MB. The official source origin and endpoint are fixed; arbitrary URLs, credentials and proxies are not accepted. Redirects are rejected before another destination is contacted. Requests are sequential, with at least one second between starts, a15second timeout and zero retries. Missing or unsupported source shapes are not accepted as an empty successful profile.

### Output

One dataset report contains verified profiles, supplied-baseline comparisons, activity match observations and explicit source failures. AUDIT is complete JSON, PROFILES_CSV is a spreadsheet-safe company overview and REPORT is Markdown. Feed report.profiles into previousProfiles in a later run to compare snapshots. The Actor does not install a schedule, fetch hidden history, send alerts to third parties or overwrite your baselines.

Source fields are normalized into a stable business projection. Dates from registry headers are preserved as source text; fetchedAt is the actual retrieval timestamp and is not the registry update time. Volatile retrieval timestamps do not affect business fingerprints. A registry revision can change while the selected business fields remain identical; this is reported separately because excluded fields may have changed.

BUSINESS_FIELDS_DIFFER means only that selected fields differ from the supplied baseline. It does not independently establish a real historical change, its legal effective time or the direction of a transaction. Nulls represent unavailable coverage. NO_BASELINE is unknown history, not proof that a company is newly registered or unchanged.

### Pricing and cost control

Launch price: USD0.03 per completed company-watchlist-report for up to20 requested identifiers. Check the current Store price before running. Cost estimates in PRICING are planning values. A partial report with at least one verified profile is emitted once and lists all failures. If every source lookup fails, SOURCE_STATUS is saved and the run fails without a report event; platform execution costs can still apply under the platform terms.

HTTP404 means not found through this register-P lookup, not proof that the entity does not exist elsewhere. Access denial, rate limit, server/transport error, unexpected identity or bad JSON stops further lookups for that run; remaining identifiers are marked skipped. The Actor never switches sources, accounts or proxies to bypass a refusal. It uses no paid model or upstream API subscription.

### Limitations and fair use

A current extract does not certify active trading, solvency, tax status, ownership, creditworthiness or a compliance decision. This tool does not fetch association register S, VIES/VAT status, beneficial owners, financial accounts, phone numbers or people profiles. Source availability and schema can change; source failures remain explicit. Use the official source for legal interpretation and final verification.

Only minimized corporate fields are exported. Raw government responses are not saved by the handler, and people/contact sections are excluded. Input and output still use Apify run storage under its retention settings; use only authorized baselines and avoid personal or secret data. Registered company names and addresses can themselves contain names, so this projection is not an anonymization service.

### Example

examples/input.json queries the public ORLEN KRS number0000028860 with no baseline. A successful first run has NO_BASELINE and does not claim a historical change. Unit fixtures use explicitly synthetic companies. Run npm ci --ignore-scripts, npm test, then the existing factory release.mjs --local-run --write-example. Source remains in this existing factory; Apifi boty is a generated view, not a second codebase.

### Source

Official endpoint pattern: https://api-krs.ms.gov.pl/api/krs/OdpisAktualny/0000028860?rejestr=P\&format=json . No official endorsement is claimed.

# Actor input Schema

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

1to20 distinct ten-digit KRS strings, preserving leading zeros. Only commercial register P is queried; this is not a name/NIP search or discovery of all companies.

## `previousProfiles` (type: `array`):

Optional report.profiles array from an earlier run, projectionVersion1. Baselines are customer-supplied and unverified; partial or corrupted profiles are rejected.

## `pkdPrefixes` (type: `array`):

Optional source-code prefixes such as41,42,43. Results are not discarded; each comparison reports true, false or unknown matching of listed codes, not verified actual trading activity.

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

Hard batch cap; overflow and duplicate identifiers fail without truncation.

## `maxRequests` (type: `integer`):

Hard request cap, one source request per company, zero automatic retries, at least one second between request starts.

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

One report after verified profiles and exports are saved. No report emission when every lookup fails.

## Actor input object example

```json
{
  "krsNumbers": [
    "0000028860"
  ],
  "maxCompanies": 20,
  "maxRequests": 20,
  "maxItems": 1
}
```

# Actor output Schema

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

No description

## `csv` (type: `string`):

No description

## `report` (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": [
        "0000028860"
    ]
};

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

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

```

## MCP server setup

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

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/jrIWH8VwDs7r4LgdD/builds/kYGzi5M1UYK7Hruhz/openapi.json
