Poland CRBR Beneficial Owners Scraper avatar

Poland CRBR Beneficial Owners Scraper

Pricing

from $0.06 / 1,000 item extracteds

Go to Apify Store
Poland CRBR Beneficial Owners Scraper

Poland CRBR Beneficial Owners Scraper

Extract Polish CRBR beneficial ownership records by NIP, KRS, company name, PESEL, or beneficiary name for AML, KYC, KYB, and due diligence.

Pricing

from $0.06 / 1,000 item extracteds

Rating

0.0

(0)

Developer

Hanna Nosova

Hanna Nosova

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

15 days ago

Last modified

Share

Search Poland's public Central Register of Beneficial Owners (CRBR) and export complete company filings, beneficial owners, control rights, representatives, discrepancies, and filing evidence. The Actor uses the Ministry of Finance's documented public data service and needs no CRBR login or paid data-provider key.

Use it for AML, KYC, KYB, due diligence, compliance evidence, investigations, and authorized registry research.

Best-value mode

Set outputMode to companyRecords to receive one row per company filing with every beneficial owner and every direct, indirect, or other control right nested in that row. This is the most data per billable result.

Use ownerRows when your downstream system needs one flattened row per beneficial owner. It remains the default for backward compatibility.

Ready-to-run examples

Input example

{
"searches": [{ "mode": "nip", "query": "6770065406" }],
"outputMode": "companyRecords",
"maxResults": 20
}

What data can I get?

  • Company identity: name, NIP, KRS, legal form, Polish and foreign address fields
  • Complete beneficial-owner details returned by CRBR
  • All direct, indirect, and other control rights, including amounts, units, codes, privileges, and descriptions
  • Filing representatives and their roles
  • Presentation period, event date, correction details, reference numbers, and request timestamps
  • Discrepancies, query status, request ID, and source metadata
  • Deterministic recordKey values for deduplication and resumable batches
  • not_found rows for valid queries with no match and uncharged error rows for failed searches

Who is it for?

  • AML and KYC teams verifying beneficial ownership before onboarding
  • KYB teams enriching authorized Polish company portfolios
  • Compliance, legal, and finance teams retaining official filing evidence
  • Investigators, journalists, and researchers working with a lawful purpose

Search options

ModeRequired valueBest use
nip10-digit NIPFast, precise company lookup
krs1-10 digit KRSFast, precise company lookup
companyNameAt least 2 charactersDiscovery; may return many companies
beneficiaryPesel11-digit PESELExact beneficiary lookup
beneficiaryNameFirst name, last name, and birthDateBeneficiary lookup without PESEL

Exact NIP or KRS searches are the safest choice for production KYB. A broader company-name query can return more companies in one request, but should be bounded with maxResults.

Input settings

FieldTypeDefaultDescription
searchesarrayrequiredOne or more CRBR searches; up to 10,000 per run
outputModestringownerRowscompanyRecords for maximum data per row, or ownerRows for flattened owner rows
maxResultsinteger20Maximum saved dataset rows
dateFromYYYY-MM-DDtodayStart of the CRBR presentation period
dateToYYYY-MM-DDtodayEnd of the CRBR presentation period
requestDelayMsinteger500Delay between source requests; use 0 only for bounded batches
requestTimeoutSecsinteger30Timeout for each attempt
maxRetriesinteger2Retries for temporary failures and rate limits
includeRawbooleanfalseInclude the parsed source fragment; larger and may contain additional personal data

Historical searches can return more filings than a current-day lookup. The Ministry states that current-state requests may take up to five minutes and historical-period requests may take until the end of the next business day, so allow an adequate Actor timeout for wide historical periods.

Output example

In companyRecords mode, a row has this shape:

{
"recordType": "company",
"outputMode": "companyRecords",
"found": true,
"companyName": "COMARCH S.A.",
"nip": "6770065406",
"krs": "0000057567",
"beneficialOwners": [
{
"fullName": "...",
"citizenships": ["PL"],
"controlEntries": [
{
"kind": "direct",
"controlType": "...",
"ownershipAmount": "...",
"ownershipUnit": "..."
}
]
}
],
"representatives": [],
"discrepancies": [],
"requestId": "...",
"sourceApiVersion": "2022/12/01",
"retrievedAt": "2026-07-20T00:00:00.000Z"
}

The dataset schema lists every available field. RUN_SUMMARY records settled counts and warnings. If a run reaches its safe deadline or customer charge limit with pending searches, RUN_CHECKPOINT lets an Apify resurrection continue without duplicating stored rows. Increase the charge limit before resurrecting a charge-limited run.

Pricing

This Actor uses pay-per-event pricing. A run costs $0.005 to start, plus one item charge per successfully stored dataset row. Failed search rows are not charged. Valid no-match rows are charged because they are auditable query results.

Apify tierPrice per result row
Free$0.000115
Bronze$0.000100
Silver$0.000078
Gold$0.000060
Platinum$0.000040
Diamond$0.000028

At the Bronze rate, 1,000 companyRecords rows in one run cost about $0.105 including the start event. Batching searches amortizes the start fee. A single query is about $0.0051, so avoid starting a separate run for every identifier when one authorized batch will do.

Cost-efficient input recipes

Batch exact company checks

{
"searches": [
{ "mode": "nip", "query": "6770065406" },
{ "mode": "krs", "query": "0000057567" }
],
"outputMode": "companyRecords",
"maxResults": 1000
}

Retrieve historical filings

{
"searches": [{ "mode": "nip", "query": "6770065406" }],
"outputMode": "companyRecords",
"dateFrom": "2024-01-01",
"dateTo": "2026-07-20",
"maxResults": 100
}

Flatten owners for a warehouse

{
"searches": [{ "mode": "companyName", "query": "COMARCH" }],
"outputMode": "ownerRows",
"maxResults": 100
}

API usage

Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/poland-crbr-beneficial-owners-scraper').call({
searches: [{ mode: 'nip', query: '6770065406' }],
outputMode: 'companyRecords',
maxResults: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python

from apify_client import ApifyClient
client = ApifyClient('YOUR_APIFY_TOKEN')
run = client.actor('fetch_cat/poland-crbr-beneficial-owners-scraper').call(run_input={
'searches': [{'mode': 'nip', 'query': '6770065406'}],
'outputMode': 'companyRecords',
'maxResults': 20,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)

cURL

curl -X POST 'https://api.apify.com/v2/acts/fetch_cat~poland-crbr-beneficial-owners-scraper/runs?token=YOUR_APIFY_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"searches":[{"mode":"nip","query":"6770065406"}],"outputMode":"companyRecords","maxResults":20}'

MCP and AI agents

Use the focused Apify MCP URL:

https://mcp.apify.com?tools=fetch_cat/poland-crbr-beneficial-owners-scraper

Claude CLI

$claude mcp add apify-crbr --url "https://mcp.apify.com?tools=fetch_cat/poland-crbr-beneficial-owners-scraper"

JSON config

{
"mcpServers": {
"apify-crbr": {
"url": "https://mcp.apify.com?tools=fetch_cat/poland-crbr-beneficial-owners-scraper"
}
}
}

Example prompt: “Look up these authorized Polish company NIPs, return one company record per filing, and flag discrepancies or missing CRBR matches.”

Scheduling and integrations

Create an Apify Task for a stable batch, then schedule it for periodic KYB refreshes. Export results through the API, webhooks, Zapier, Make, Google Sheets, or your own data warehouse. Use recordKey as the merge key and retain requestId, presentation dates, and retrievedAt as evidence.

Limits and responsible use

  • The source is public and free, but it is a query service—not a bulk registry dump. This Actor does not attempt exhaustive enumeration.
  • The official service publishes no service-level guarantee. Temporary outages and maintenance can occur; retries honor rate-limit guidance and stay within the run deadline.
  • Broad name queries and long historical periods can be slower. Keep batches bounded and use exact identifiers where possible.
  • CRBR can return names, PESEL values, birth dates, citizenship, residence, and ownership details. Process personal data only with a lawful basis and for an authorized purpose. Apply access controls, retention limits, and data-minimization rules appropriate to your jurisdiction.
  • Do not use the Actor for harassment, identity theft, indiscriminate profiling, or unlawful surveillance.
  • Registry declarations are submitted by authorized representatives. Treat them as official registry evidence, not as a substitute for independent risk assessment.

FAQ

Is GraphQL available?

No documented GraphQL interface was found. The Ministry publishes a documented public data service and its current WSDL/specification. Using that service is more stable and complete than copying calls from the CRBR web application.

What is the cheapest way to get the most data?

Batch exact identifiers into one run and choose companyRecords. One result row contains the whole filing, all owners, and all rights. Add a historical date range only when you need filing history, because historical requests can be slower and return more records.

Does CRBR require a login or API key?

No. The official search register is public and free.

Can this synchronize the entire registry?

The official service is designed for searches. If you need continuous synchronization of hundreds of thousands of entities, a commercial full-registry mirror may be operationally better, but it adds a paid dependency. This Actor intentionally uses the free official source for bounded searches.

Why did my run stop with pending searches?

The Actor reserves cleanup time before the Apify timeout. It saves a checkpoint and can continue after resurrection rather than risking incomplete writes or duplicate charges.

Support

Open an issue from the Actor page and include:

  • Run ID or run URL
  • Sanitized input JSON
  • Expected output
  • Actual output returned by the Actor
  • A reproducible public URL or public registry example, when available

Do not post private batch data or personal identifiers in a public issue.