# Poland Healthcare Facilities API – Official RPWDL Register (`enterprising_hamster/polish-healthcare-facilities-rpwdl`) Actor

Polish hospitals, clinics and other healthcare facilities from the official RPWDL register: address, phone, organisation e-mail, website, NIP/REGON, legal form, specialties and beds. Filter by region, city, specialty or ownership. Companies and public bodies only. Export CSV, JSON or Excel.

- **URL**: https://apify.com/enterprising_hamster/polish-healthcare-facilities-rpwdl.md
- **Developed by:** [Kamil Kaczmarek](https://apify.com/enterprising_hamster) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 75.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.20 / 1,000 facilities

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?

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 Healthcare Facilities API – Official RPWDL Register

**Poland healthcare facilities API**: every **hospital, clinic, outpatient centre, laboratory, rehabilitation and nursing facility** run by a company or a public body in Poland, straight from the official register **RPWDL (Rejestr Podmiotów Wykonujących Działalność Leczniczą)** kept by the Ministry of Health — about **24,000 facilities** of about 12,000 providers, refreshed daily. Get the address, phone, organisation e-mail, website, NIP and REGON, legal form and ownership, plus specialties of clinics and wards, beds, intensive care beds, dialysis stations, quality accreditations and inspections. Filter by region, city, specialty or ownership and export JSON, CSV or Excel for lead generation, market sizing, medtech and pharma sales, or healthcare analytics. **No individual practitioners.** Polski opis: **placówki medyczne** — szpitale, przychodnie i inne jednostki organizacyjne podmiotów leczniczych z rejestru RPWDL (Minister Zdrowia), z filtrem regionu i specjalności; bez praktyk zawodowych i JDG.

**No individual practitioners.** The Actor leaves out sole traders, partnerships and doctors', nurses' and physiotherapists' own practices, withholds entries whose names contain a person's first name and surname, and withholds e-mail addresses that may belong to a person. See [Privacy](#privacy).

### What data can you get

About **24,000 facilities** (organisational units) of about 12,000 providers, refreshed daily by the registry:

- **Facility:** name, registry IDs, REGON, kind (hospital, other 24-hour inpatient care, outpatient), start date, suspension.
- **Provider:** name, NIP, REGON, register book number, legal form (SP ZOZ, sp. z o.o., S.A., foundation, budget unit, research institute, church entity, cooperative), ownership (PUBLIC, PRIVATE, NON_PROFIT, CHURCH), founding body of public providers.
- **Address:** street, building, postal code, city, commune, TERYT codes of commune, county and voivodeship.
- **Contacts:** phone, organisation e-mail (role or brand mailboxes such as `sekretariat@` or `rejestracja@`), website.
- **What it does:** specialties of active cells with ministry codes (e.g. `1800` dental clinic, `4500` general surgery ward), number of cells, beds, intensive care beds, day-care places, dialysis stations, medical fields of the services.
- **Quality:** accreditations and ISO certificates, number and date of the latest recorded inspection.

### How to use

1. Press **Start**. With no changes you get the first 100 facilities of the register (about a minute).
2. Pick **voivodeships**, **counties (TERYT)** or **cities**, and optionally a **facility kind**, **ownership** or **specialty**.
3. Raise **Max facilities** to export more; the whole register is about 24,000 facilities and takes about two minutes.
4. Schedule weekly runs with **Only new or changed** to receive new facilities and changed entries only.

### Input

Dental clinics in Kraków with an organisation e-mail (B2B leads):

```json
{ "cities": ["Kraków"], "specialtyCodes": ["1800"], "onlyWithEmail": true, "maxItems": 500 }
```

Public hospitals ≥100 beds in Mazowieckie (market sizing / medtech):

```json
{ "voivodeships": ["14"], "facilityKinds": ["HOSPITAL"], "minBeds": 100, "ownership": ["PUBLIC"], "maxItems": 200 }
```

| Field | Default | What it does |
|---|---|---|
| `voivodeships` | all | TERYT codes, e.g. `["14"]` for Mazowieckie. Names such as `mazowieckie` also work through the API. |
| `terytCodes` | none | County or commune prefixes, e.g. `1465` Warsaw, `1261` Kraków. |
| `cities` | none | City names as in the address, e.g. `Kraków`. Case and Polish letters do not matter. |
| `facilityKinds` | all | `HOSPITAL`, `INPATIENT_OTHER`, `OUTPATIENT`. |
| `ownership` | all | `PUBLIC`, `PRIVATE`, `NON_PROFIT`, `CHURCH`. |
| `specialtyCodes` | none | 4-digit cell codes, e.g. `1800` dental clinic, `7210` ultrasound, `4500` surgery ward. |
| `specialtyKeywords` | none | Polish words in specialty names, e.g. `kardiolog`, `rehabilitac`. |
| `nameContains` | none | Text in the facility or provider name, e.g. `LUX MED`. |
| `nips` | none | Only these providers (10-digit NIP). |
| `onlyWithEmail`, `onlyWithPhone`, `onlyWithWebsite` | `false` | Only facilities with that contact. |
| `minBeds` | `0` | Only facilities with at least this many beds. |
| `maxItems` | `100` | Hard cap of facilities, and so of cost. |
| `onlyNew`, `stateKey` | `false`, `default` | Skip facilities already delivered with unchanged data. |

### Output

One item per facility (shortened):

```json
{
  "facilityId": "975336",
  "facilityName": "Szpital",
  "establishmentName": "Centrum Lecznictwa Szpitalnego w Ciechanowie",
  "facilityKind": "HOSPITAL",
  "providerName": "SPECJALISTYCZNY SZPITAL WOJEWÓDZKI W CIECHANOWIE",
  "providerNip": "5661019200",
  "legalForm": "independent public healthcare institution (SP ZOZ)",
  "ownership": "PUBLIC",
  "foundingBody": "województwo",
  "street": "Powstańców Wielkopolskich",
  "building": "2",
  "postalCode": "06-400",
  "city": "Ciechanów",
  "voivodeship": "mazowieckie",
  "phone": "236723127",
  "email": "sekretariat@szpitalciechanow.com.pl",
  "emailWithheld": false,
  "website": "www.szpitalciechanow.com.pl",
  "specialties": [{"code": "4000", "name": "Oddział chorób wewnętrznych"}, {"code": "4070", "name": "Oddział hematologiczny"}],
  "cellsCount": 47,
  "beds": 376,
  "dialysisStations": 14,
  "qualityAccreditations": [{"scope": "Akredytacja Ministra Zdrowia w zakresie udzielania świadczeń zdrowotnych", "issued": "2023-04-26"}],
  "inspectionsCount": 17,
  "registryDate": "2026-10-21",
  "license": "CC BY 4.0 (dane.gov.pl). Source: RPWDL, Ministry of Health; processed by this Actor."
}
```

Specialty and medical field names are the registry's Polish names; codes are the ministry's (Rozporządzenie w sprawie systemu resortowych kodów identyfikacyjnych, part VIII). The run's key-value store also holds `SUMMARY` (registry date, matching facilities, entries withheld for privacy) and `RUN_STATS`.

### Pricing (pay per event)

| Event | Price | When |
|---|---|---|
| `facility` | $0.004 | One delivered facility. |

100 facilities cost $0.40, the whole register of about 24,000 facilities about $96. Polish data brokers sell 1,000 clinic records for 249-270 PLN; Doctoralia scrapers in the Apify Store charge $0.002-0.005 per doctor without registry data. A facility delivered once is never charged again in the same run, and **Only new or changed** keeps scheduled runs cheap.

### Use cases

- **B2B lead generation:** medical equipment, software, laboratory and cleaning services, insurance, recruitment for clinics and hospitals.
- **Market sizing:** count dental clinics, rehabilitation centres or hospital beds by county.
- **Pharma and medtech territory planning:** hospitals with wards of a given specialty.
- **Monitoring:** new facilities in a region every week.
- **Data enrichment:** add legal form, beds and specialties to a list of NIPs.

### Privacy

RPWDL is public, but the President of the Polish Data Protection Office (UODO) [asked in September 2025](https://uodo.gov.pl/pl/138/3882) to limit how the personal data in it are reused, and the Supreme Administrative Court confirmed that GDPR applies to data in public registers. This Actor therefore delivers organisations only:

- **Kept:** SP ZOZ, budget units, research institutes, church entities, foundations and associations, cooperatives, limited liability and joint-stock companies.
- **Left out:** sole traders, civil, general, professional and limited partnerships (their names carry the owners' names) and every individual or group professional practice (doctors, dentists, nurses, midwives, physiotherapists, laboratory diagnosticians).
- **Withheld:** facilities whose provider, establishment or unit name contains a Polish first name followed by a surname (checked against the PESEL first-name list), about 2% of the rest.
- **E-mail:** only role or brand mailboxes (`sekretariat@`, `rejestracja@`, `info@`, or the brand name). Anything that may be a person's address is withheld and `emailWithheld` is set.

Names of companies sometimes still contain a surname (for example a family clinic's brand). Use the data for business-to-business contact with organisations, and follow GDPR and the Polish Telecommunications Law when you contact anyone.

### FAQ

**Is there an API for Polish hospitals and clinics?** RPWDL is the official Ministry of Health register (search + file downloads on the public RPWDL site; dataset on dane.gov.pl under CC BY 4.0; CeZ documents a public API in the RPWDL 2.0 programme). This Actor turns the public export into one filterable table of **organisational facilities** callable from the Apify API, with CSV/JSON/Excel export.

**How do I export Polish healthcare facilities to CSV or Excel?** Set Max facilities (and region/specialty filters), run the Actor, then download the dataset as CSV or Excel from the run page or via the Apify API. The whole register is about 24,000 facilities.

**Do you include individual doctors or private practices?** No. Sole traders, partnerships and professional practices (doctors, dentists, nurses, midwives, physiotherapists, diagnosticians) are left out; names that look like a person and personal e-mails are withheld. See Privacy.

**What is the difference vs Doctoralia / ZnanyLekarz scrapers?** Those scrape commercial doctor directories (reviews, booking). This Actor reads the **official RPWDL register**: NIP/REGON, legal form, ownership, ministry specialty codes, beds and accreditations for companies and public bodies.

**Is this legal?** The registry is published on dane.gov.pl under **CC BY 4.0**, which allows commercial reuse with attribution, and the export needs no account. Keep the `source` and `license` fields or credit "Rejestr Podmiotów Wykonujących Działalność Leczniczą, Ministry of Health, dane.gov.pl, CC BY 4.0" when you publish the data.

**How fresh is it?** The registry regenerates its export every night; `registryDate` on each item shows which export it came from.

**Why are there fewer facilities than in the registry?** About 17,000 of the 30,000 active providers are sole traders, partnerships or practices, which the Actor leaves out on purpose.

**Do you have NFZ contracts?** Not yet.

### Integrations

Call the Actor from the Apify API, Python or JavaScript clients, Make, Zapier, n8n or the Apify MCP server and read the dataset as JSON, CSV or Excel.

### Development

```bash
python -m venv .venv && .venv/bin/pip install -r requirements-dev.txt
.venv/bin/python -m pytest -q
examples/run-local-ppe.sh examples/hospitals-mazowieckie.json
```

### Disclaimer

Data comes from the Rejestr Podmiotów Wykonujących Działalność Leczniczą (RPWDL) of the Minister of Health, published by Centrum e-Zdrowia on dane.gov.pl (dataset 728) under CC BY 4.0, processed by this Actor (filtered, joined and translated field names). Not an official extract. The first-name list used for privacy screening comes from the PESEL register (dane.gov.pl dataset 1667, CC0 1.0).

### 🇵🇱 Po polsku

Aktor zwraca placówki medyczne (jednostki organizacyjne podmiotów leczniczych) z Rejestru Podmiotów Wykonujących Działalność Leczniczą: adres z kodami TERYT, telefon, e-mail organizacji, stronę WWW, NIP i REGON, formę prawną, rodzaj własności, specjalności komórek z kodami resortowymi, liczbę łóżek, akredytacje i kontrole. Filtry: województwo, powiat lub gmina (TERYT), miejscowość, rodzaj placówki, własność, specjalność, nazwa, NIP, minimalna liczba łóżek, obecność danych kontaktowych. Tylko spółki kapitałowe, SP ZOZ, jednostki budżetowe, instytuty, fundacje, stowarzyszenia, spółdzielnie i podmioty kościelne. Bez jednoosobowych działalności, spółek osobowych i praktyk zawodowych, bez wpisów z imieniem i nazwiskiem w nazwie i bez adresów e-mail, które mogą należeć do osoby. Źródło: RPWDL, Minister Zdrowia, dane.gov.pl, licencja CC BY 4.0.

# Changelog

This Actor's version history is a separate document: https://apify.com/enterprising_hamster/polish-healthcare-facilities-rpwdl/changelog.md

# Actor input Schema

## `voivodeships` (type: `array`):

Only facilities in these voivodeships (regions). Empty = all of Poland.

## `terytCodes` (type: `array`):

TERYT code prefixes: 4 digits for a county (e.g. 1465 = Warsaw, 1261 = Kraków), 6-7 digits for a commune. Combined with voivodeships: a facility in any listed area matches.

## `cities` (type: `array`):

City or village names as in the address, e.g. Warszawa, Kraków. Case and Polish letters do not matter.

## `facilityKinds` (type: `array`):

Kind of healthcare establishment. Empty = all.

## `ownership` (type: `array`):

Public (SP ZOZ, budget units, research institutes, companies at least 51% public), private companies, non-profits or church entities. Empty = all.

## `specialtyCodes` (type: `array`):

4-digit ministry codes of cells (VIII part of the resort code), e.g. 1800 dental clinic, 4500 general surgery ward, 7210 ultrasound lab. A facility matches if any of its active cells has one.

## `specialtyKeywords` (type: `array`):

Words found in specialty or medical field names, in Polish, e.g. stomatolog, kardiolog, rehabilitac, okulist. A facility matches if any word appears.

## `nameContains` (type: `string`):

Text found in the facility, establishment or provider name, e.g. LUX MED or szpital.

## `nips` (type: `array`):

Only facilities of providers with these tax IDs (10 digits).

## `onlyWithEmail` (type: `boolean`):

Only facilities with an organisation e-mail address.

## `onlyWithPhone` (type: `boolean`):

Only facilities with a phone number.

## `onlyWithWebsite` (type: `boolean`):

Only facilities with a website.

## `minBeds` (type: `integer`):

Only facilities with at least this many beds (0 = no limit).

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

Stop after this many facilities, and so this many charged events. The whole register is about 24,000 facilities.

## `onlyNew` (type: `boolean`):

Skip facilities delivered in an earlier run with the same state key and unchanged data. Use it for scheduled runs that report new and changed entries.

## `stateKey` (type: `string`):

Name of the memory used by 'Only new or changed'. Use one key per filter set.

## Actor input object example

```json
{
  "onlyWithEmail": false,
  "onlyWithPhone": false,
  "onlyWithWebsite": false,
  "minBeds": 0,
  "maxItems": 100,
  "onlyNew": false
}
```

# Actor output Schema

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

One item per healthcare facility (organisational unit) with contacts, specialties and beds.

## `summary` (type: `string`):

Registry date, matching facilities, entries withheld for privacy and charge limit.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("enterprising_hamster/polish-healthcare-facilities-rpwdl").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("enterprising_hamster/polish-healthcare-facilities-rpwdl").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 '{}' |
apify call enterprising_hamster/polish-healthcare-facilities-rpwdl --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,enterprising_hamster/polish-healthcare-facilities-rpwdl"
        }
    }
}
```

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/Oc14wJK3YfONzOvcB/builds/derAZW3kw9fVVbbPA/openapi.json
