# CRBR Scraper - Poland Beneficial Owners Registry Data (`studio-amba/crbr-scraper`) Actor

Extract beneficial ownership (UBO) data from Poland's CRBR government register. Get company NIP, KRS, address, plus beneficial owner names, PESEL, nationality, and ownership share. Search by NIP, KRS, or company name. No login required.

- **URL**: https://apify.com/studio-amba/crbr-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.00 / 1,000 result scrapeds

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/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

## CRBR Scraper

Extract beneficial ownership (UBO) data from Poland's CRBR (Centralny Rejestr Beneficjentow Rzeczywistych / Central Register of Beneficial Owners). Returns the company's NIP, KRS number, legal form and address, plus every registered beneficial owner's name, PESEL, nationality, country of residence, and ownership or control basis. No login or cookies required.

### How to scrape CRBR data

1. Go to this actor's page on the [Apify Store](https://apify.com/store).
2. Click **Try for free** to open the actor in Apify Console.
3. Enter a company name (e.g., `Żabka Polska`), a 10-digit NIP tax number (e.g., `5223071241`), or a 10-digit KRS registry number (e.g., `0000636642`).
4. Set the maximum number of results you need (default: 30, the registry's own name-search cap).
5. Click **Start** and wait for the run to finish (usually under a minute).
6. Download your data as JSON, CSV, Excel, or connect it to your workflow via the Apify API.

### Why use this actor?

CRBR is the official Polish government register of Ultimate Beneficial Owners, maintained by the Ministry of Finance under Poland's implementation of the EU's AMLD5 anti-money-laundering directive. Every Polish sp. z o.o., S.A., and similar entity is legally required to file the natural persons who ultimately own or control it. This actor gives you programmatic access to that register without manual searches on the government portal.

Use cases:

- **KYC / AML checks**: Identify the real people behind a Polish counterparty before onboarding them.
- **Due diligence**: Verify ownership structure and control chains before a business deal or investment.
- **Compliance monitoring**: Screen beneficial owners against sanctions or PEP lists.
- **Lead generation**: Find decision-makers and controlling shareholders for B2B outreach.

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `searchQuery` | String | No | Search companies by name (e.g., `Żabka Polska`). Note: the registry's name search is diacritic-sensitive — use real Polish accented letters, not ASCII transliteration. Defaults to `Polska` if no other criteria given. |
| `nip` | String | No | Search by Polish tax identification number (NIP, 10 digits, no dashes). Returns one detailed record. |
| `krsNumber` | String | No | Look up a specific company by its 10-digit KRS registry number. Returns one detailed record. |
| `maxResults` | Integer | No | Maximum results to return (default: 30, max: 30 — the registry caps name search at roughly 30 matches server-side). |
| `proxyConfiguration` | Object | No | Proxy settings. Polish residential proxies recommended. |

Provide at least one of `searchQuery`, `nip`, or `krsNumber`. If none is given, the actor searches for `Polska` and returns the first batch of matches.

#### Example input

```json
{
    "searchQuery": "Żabka Polska",
    "maxResults": 10,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "PL"
    }
}
```

#### NIP lookup

```json
{
    "nip": "5223071241"
}
```

#### KRS number lookup

```json
{
    "krsNumber": "0000636642"
}
```

### Output

Each result contains the following fields:

| Field | Type | Example |
|-------|------|---------|
| `companyName` | String | `"ŻABKA POLSKA SPÓŁKA Z OGRANICZONĄ ODPOWIEDZIALNOŚCIĄ"` |
| `nip` | String | `"5223071241"` |
| `krsNumber` | String | `"0000636642"` |
| `legalForm` | String | `"Spółka z ograniczoną odpowiedzialnością"` |
| `address` | String | `"STANISŁAWA MATYI 8"` |
| `city` | String | `"POZNAŃ"` |
| `postalCode` | String | `"61-586"` |
| `province` | String | `"WIELKOPOLSKIE"` |
| `country` | String | `"Poland"` |
| `beneficialOwners` | Array | See below |
| `reportedBy` | Array | `[{"firstName": "BARTOSZ", "lastName": "MENZ", "role": "zgłaszający - inny"}]` |
| `url` | String | URL of the CRBR search portal |
| `scrapedAt` | String | ISO timestamp |

Each entry in `beneficialOwners` has:

| Field | Type | Example |
|-------|------|---------|
| `firstName` | String | `"JOLANTA"` |
| `lastName` | String | `"BAŃCZEROWSKA"` |
| `pesel` | String | `"69021406545"` |
| `dateOfBirth` | String or null | `null` (populated only when PESEL is unavailable) |
| `nationality` | String | `"POLSKA"` |
| `countryOfResidence` | String | `"POLSKA"` |
| `ownershipType` | String or null | `"wspólnik spółki z o.o."` |
| `ownershipShare` | String or null | `"3500"` |
| `shareUnit` | String or null | `"PLN"` |
| `controlBasis` | String or null | `"osoba fizyczna zajmująca wyższe stanowisko kierownicze..."` |

#### Example output

```json
{
    "companyName": "ŻABKA POLSKA SPÓŁKA Z OGRANICZONĄ ODPOWIEDZIALNOŚCIĄ",
    "nip": "5223071241",
    "krsNumber": "0000636642",
    "legalForm": "Spółka z ograniczoną odpowiedzialnością",
    "address": "STANISŁAWA MATYI 8",
    "city": "POZNAŃ",
    "postalCode": "61-586",
    "province": "WIELKOPOLSKIE",
    "country": "Poland",
    "beneficialOwners": [
        {
            "firstName": "JOLANTA",
            "lastName": "BAŃCZEROWSKA",
            "pesel": "69021406545",
            "dateOfBirth": null,
            "nationality": "POLSKA",
            "countryOfResidence": "POLSKA",
            "ownershipType": null,
            "ownershipShare": null,
            "shareUnit": null,
            "controlBasis": "osoba fizyczna zajmująca wyższe stanowisko kierownicze, o której mowa w art. 2 ust. 2 pkt.1 lit. a tiret 5 ustawy AML"
        }
    ],
    "reportedBy": [
        { "firstName": "BARTOSZ", "lastName": "MENZ", "role": "zgłaszający - inny" }
    ],
    "url": "https://crbr.podatki.gov.pl/adcrbr/",
    "scrapedAt": "2026-08-02T09:13:13.384Z"
}
```

### Important notes

- **Full PESEL disclosed, unmasked**: Poland's CRBR publicly discloses the full national ID number (PESEL) of every beneficial owner and every person who filed the report — this is the register's own design under Poland's AMLD5 implementation, not something this actor extracts through a side channel or bypass. The same public, unauthenticated search on crbr.podatki.gov.pl returns this data to anyone. Handle exported PESEL data as sensitive personal data under your own compliance obligations.
- **Publicly listed companies are typically absent**: Public/exchange-listed companies (e.g., PKN Orlen, CD Projekt) generally don't have CRBR filings, since their ownership is already disclosed through securities-market reporting. Zero results for a well-known public company is expected, not a bug — search a privately held subsidiary instead.
- **Name search is diacritic-sensitive**: `"Żabka"` matches, `"Zabka"` (ASCII-folded) does not. Use real Polish accented letters in `searchQuery`.
- **Name search is capped at ~30 results**: The government API has no pagination and returns at most roughly 30 companies per name query. For exhaustive coverage, look up companies individually by NIP or KRS number.
- **Data source**: This actor uses the official CRBR JSON API (crbr.podatki.gov.pl) maintained by Poland's Ministry of Finance. No login or account required.

### Data coverage

The CRBR register contains beneficial-ownership filings for:

- **Spółki z o.o.** (limited liability companies)
- **Spółki akcyjne** (joint-stock companies, non-listed)
- **Spółki jawne, partnerskie, komandytowe** and other commercial partnerships required to report under Poland's AML Act

Each record includes the company's registered identity, the natural persons identified as ultimate beneficial owners, their ownership share or control basis, and the person who filed the report on the company's behalf.

### Integrations

Connect this actor with other tools in your stack:

- **Apify API**: Fetch results programmatically in any language.
- **Webhooks**: Get notified when a run completes.
- **Zapier / Make**: Automate KYC workflows with CRBR data.
- **Google Sheets**: Export directly to spreadsheets.
- **Slack / Email**: Send alerts when a specific company or beneficiary is found.

### Cost estimation

- **Direct NIP or KRS lookup** (1 company): 1 API call, minimal compute.
- **Name search** (up to 30 companies): 1 API call, minimal compute — the registry returns full detail for every match in a single response.
- **Typical run**: Under $0.05 in Apify platform compute for any single search.

### Related Scrapers

Studio AMBA maintains a full cluster of European company-registry actors with a consistent record shape for cross-country KYB workflows:

- `krs-scraper` — Poland's National Court Register (company filings, board members, share capital)
- `kvk-scraper` — Netherlands Chamber of Commerce register
- `handelsregister-scraper` — Germany's commercial register
- `registro-imprese-scraper` — Italy's business register
- `registro-mercantil-scraper` — Spain's mercantile register
- `companies-house-scraper` — UK Companies House
- `kbo-enrichment` — Belgium's Crossroads Bank for Enterprises

### Legal

This actor accesses publicly available data from Poland's official CRBR government portal (crbr.podatki.gov.pl), maintained by the Ministry of Finance under the Act on Anti-Money Laundering and Counter-Terrorism Financing. Users are responsible for ensuring their use of the data — particularly personal data such as PESEL numbers — complies with applicable data protection and AML regulations.

# Actor input Schema

## `searchQuery` (type: `string`):

Search companies by name (e.g., 'Żabka Polska', 'CD Projekt'). Note: the registry's name search is diacritic-sensitive (Polish accented letters must match exactly). Partial matches work. Defaults to 'Polska' if no search criteria provided.

## `nip` (type: `string`):

Search by Polish tax identification number / NIP (e.g., '5223071241' for Zabka Polska). 10 digits, no dashes. Returns a single detailed record.

## `krsNumber` (type: `string`):

Look up a specific company by its 10-digit KRS registry number (e.g., '0000636642' for Zabka Polska). Returns a single detailed record.

## `maxResults` (type: `integer`):

Maximum number of company records to return. Name searches are capped by the government registry at roughly 30 matching companies.

## `proxyConfiguration` (type: `object`):

Apify proxy configuration. Polish residential proxies recommended for best reliability.

## Actor input object example

```json
{
  "searchQuery": "Żabka Polska",
  "maxResults": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "PL"
  }
}
```

# 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 = {
    "searchQuery": "Żabka Polska",
    "maxResults": 5,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "PL"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/crbr-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 = {
    "searchQuery": "Żabka Polska",
    "maxResults": 5,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "PL",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/crbr-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQuery": "Żabka Polska",
  "maxResults": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "PL"
  }
}' |
apify call studio-amba/crbr-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=studio-amba/crbr-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/lVQZvkJAkYdlw5Tsx/builds/Ewfi1tOKdJ8vDyxZg/openapi.json
