Nieoficjalne REST API do przeszukiwania Rejestru Produktów Leczniczych (RPL)
Oficjalny rejestr leków prowadzony przez Centrum e-Zdrowia nie udostępnia publicznego API do wyszukiwania. Ten projekt wypełnia tę lukę — pobiera oficjalny eksport XML z rejestry.ezdrowie.gov.pl, indeksuje go silnikiem pełnotekstowym i udostępnia przez REST API.
Szukasz: Rejestr Produktów Leczniczych API, Rejestr Leków API, API Rejestru Leków, Baza Leków API, wyszukiwarka leków API, URPL API, e-Zdrowie API, Polish Drug Registry API, Polish Medicine Database API
- Wyszukiwanie pełnotekstowe po wszystkich polach produktu (nazwa, substancja czynna, producent itp.)
- Wyszukiwanie po konkretnych polach — zapytania po nazwie produktu, postaci farmaceutycznej, substancji czynnej, podmiocie odpowiedzialnym i innych
- Paginacja wyników z konfigurowalnym rozmiarem strony (do 100 wyników na stronę)
- Automatyczna codzienna aktualizacja — indeks odświeża się co noc o 3:00 z oficjalnego eksportu XML
- Swagger UI do interaktywnego przeglądania API
- Gotowy do Dockera z trwałym przechowywaniem danych i health checkami
- Wydajny parser XML — strumieniowe przetwarzanie całego rejestru bez ładowania go w całości do pamięci
- .NET 9 / ASP.NET Core
- Lucene.NET — silnik wyszukiwania pełnotekstowego
- Quartz.NET — harmonogram zadań do automatycznej aktualizacji indeksu
- Serilog — logowanie strukturalne
- Docker — konteneryzacja
Wszystkie dane pochodzą z oficjalnego eksportu rządowego:
https://rejestry.ezdrowie.gov.pl/api/rpl/medicinal-products/public-pl-report/6.0.0/overall.xml
Ten plik XML jest publikowany przez Centrum e-Zdrowia i zawiera pełny rejestr dopuszczonych produktów leczniczych, w tym nazwy produktów, substancje czynne, kody ATC, producentów, dane dotyczące pozwoleń, informacje o opakowaniach oraz linki do oficjalnej dokumentacji (ulotki dla pacjentów, charakterystyki produktów leczniczych).
GET /api/health
Zwraca status usługi. Używany przez Docker do health checków.
GET /api/search?q={zapytanie}&page=1&pageSize=25
Przeszukuje wszystkie zaindeksowane pola (nazwa produktu, nazwa powszechna, substancja czynna, producent, postać farmaceutyczna).
| Parametr | Wymagany | Domyślnie | Opis |
|---|---|---|---|
q |
Tak | — | Fraza wyszukiwania (min. 2 znaki) |
page |
Nie | 1 | Numer strony |
pageSize |
Nie | 25 | Liczba wyników na stronę (maks. 100) |
Przykłady:
GET /api/search?q=Paracetamol
GET /api/search?q=Ibuprofen&page=2&pageSize=10
GET /api/search/fields?nazwaProduktu=...&substancjaCzynna=...
Wyszukiwanie po jednym lub wielu konkretnych polach. Wymagany jest co najmniej jeden parametr.
| Parametr | Opis |
|---|---|
nazwaProduktu |
Nazwa produktu leczniczego |
nazwaPowszechnieStosowana |
Nazwa powszechnie stosowana (INN) |
nazwaPoprzedniaProduktu |
Poprzednia nazwa produktu |
nazwaPostaciFarmaceutycznej |
Postać farmaceutyczna (np. tabletki, kapsułki, żel) |
podmiotOdpowiedzialny |
Podmiot odpowiedzialny (producent) |
substancjaCzynna |
Substancja czynna |
Przykłady:
GET /api/search/fields?substancjaCzynna=Amoxicillin
GET /api/search/fields?podmiotOdpowiedzialny=Hasco&nazwaPostaciFarmaceutycznej=tabletki
{
"items": [
{
"product": {
"id": "100123",
"nazwaProduktu": "Paracetamol Hasco",
"rodzajPreparatu": "ludzki",
"nazwaPowszechnieStosowana": "Paracetamolum",
"moc": "500 mg",
"nazwaPostaciFarmaceutycznej": "Tabletki",
"podmiotOdpowiedzialny": "Hasco-Lek S.A.",
"numerPozwolenia": "12345",
"substancjeCzynne": ["Paracetamolum"],
"kodyATC": ["N02BE01"],
"drogiPodania": ["Doustnie"],
"opakowania": ["05909990123456|OTC|1234"],
"ulotka": "https://...",
"charakterystyka": "https://..."
},
"score": 12.34
}
],
"totalCount": 45,
"page": 1,
"pageSize": 25,
"totalPages": 2
}- .NET 9 SDK lub Docker
docker compose up -dAPI będzie dostępne pod adresem http://localhost:5200. Przy pierwszym uruchomieniu aplikacja pobierze i zaindeksuje cały rejestr — może to zająć kilka minut. Gotowość można sprawdzić przez endpoint health:
curl http://localhost:5200/api/healthcd src/RPL.Api
dotnet runAPI wystartuje pod adresem http://localhost:5128 (HTTP) lub https://localhost:7219 (HTTPS). Swagger UI jest dostępny pod głównym adresem w trybie developerskim.
dotnet testKonfiguracja odbywa się przez appsettings.json lub zmienne środowiskowe.
| Ustawienie | Domyślnie | Opis |
|---|---|---|
Rpl:XmlSourceUrl |
(oficjalny URL rządowy) | URL do eksportu XML rejestru |
Rpl:CronSchedule |
0 0 3 * * ? |
Wyrażenie cron Quartz do re-indeksacji |
Rpl:RunOnStartup |
true |
Indeksowanie przy starcie aplikacji |
Rpl:DownloadTimeoutSeconds |
300 |
Timeout pobierania HTTP (w sekundach) |
Lucene:IndexPath |
App_Data/MedicinalProductIndex |
Ścieżka do katalogu indeksu Lucene |
Lucene:DefaultPageSize |
25 |
Domyślna liczba wyników na stronę |
Lucene:MaxPageSize |
100 |
Maksymalna dozwolona liczba wyników na stronę |
Nadpisywanie przez zmienne środowiskowe w Dockerze:
environment:
- Rpl__CronSchedule=0 0 6 * * ?
- Lucene__MaxPageSize=50src/RPL.Api/
├── Controllers/ # Endpointy API (Search, Health)
├── Models/ # Modele danych (ProduktLeczniczy, SearchResponse, PagedResult)
├── Search/ # Logika indeksowania i wyszukiwania Lucene.NET
├── Xml/ # Pobieranie XML i parser strumieniowy
├── Jobs/ # Zadanie Quartz do indeksowania
├── Configuration/ # Klasy opcji konfiguracyjnych
└── Program.cs # Konfiguracja aplikacji i DI
tests/RPL.Api.Tests/
├── Controllers/ # Testy jednostkowe kontrolerów
├── Integration/ # Testy integracyjne HTTP
├── Search/ # Testy jednostkowe serwisu wyszukiwania
├── Xml/ # Testy jednostkowe parsera i downloadera XML
└── TestData/ # Przykładowy XML do testów
- Pobieranie — zadanie Quartz pobiera pełny eksport XML z rejestru rządowego
- Parsowanie — strumieniowy parser XML wyciąga rekordy produktów jeden po drugim (wydajne pamięciowo)
- Indeksowanie — każdy produkt jest indeksowany w Lucene.NET z analizowanymi polami tekstowymi do wyszukiwania i przechowywanymi danymi JSON do zwracania wyników
- Wyszukiwanie — zapytania API są tłumaczone na zapytania Lucene z paginacją
- Powtórzenie — indeks jest przebudowywany codziennie o 3:00, aby uwzględnić zmiany w rejestrze
Jeśli nie chcesz hostować własnej instancji i po prostu potrzebujesz dostępu do API, napisz do mnie — chętnie udostępnię swoje wdrożenie.
Projekt udostępniany w stanie takim, w jakim jest (as-is). Dane o produktach leczniczych pochodzą z publicznego rejestru rządowego i podlegają jego własnym warunkom użytkowania.
Rejestr Produktów Leczniczych API, Rejestr Leków API, API Rejestru Leków, Baza Leków API, wyszukiwarka leków API, URPL API, e-Zdrowie API, Centrum e-Zdrowia, Rejestr Produktow Leczniczych, leki API, Polish Drug Registry API, Polish Medicine Database API, Polish pharmaceutical API, Poland medicine search