Skip to content

Repository files navigation

RPL.Api — Rejestr Produktów Leczniczych API

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

Funkcje

  • 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

Stos technologiczny

  • .NET 9 / ASP.NET Core
  • Lucene.NET — silnik wyszukiwania pełnotekstowego
  • Quartz.NET — harmonogram zadań do automatycznej aktualizacji indeksu
  • Serilog — logowanie strukturalne
  • Docker — konteneryzacja

Źródło danych

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).

Endpointy API

Health Check

GET /api/health

Zwraca status usługi. Używany przez Docker do health checków.

Wyszukiwanie pełnotekstowe

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

Wyszukiwanie po polach

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

Format odpowiedzi

{
  "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
}

Uruchomienie

Wymagania

Uruchomienie z Dockerem (zalecane)

docker compose up -d

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

Uruchomienie lokalne

cd src/RPL.Api
dotnet run

API wystartuje pod adresem http://localhost:5128 (HTTP) lub https://localhost:7219 (HTTPS). Swagger UI jest dostępny pod głównym adresem w trybie developerskim.

Uruchomienie testów

dotnet test

Konfiguracja

Konfiguracja 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=50

Struktura projektu

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

Jak to działa

  1. Pobieranie — zadanie Quartz pobiera pełny eksport XML z rejestru rządowego
  2. Parsowanie — strumieniowy parser XML wyciąga rekordy produktów jeden po drugim (wydajne pamięciowo)
  3. Indeksowanie — każdy produkt jest indeksowany w Lucene.NET z analizowanymi polami tekstowymi do wyszukiwania i przechowywanymi danymi JSON do zwracania wyników
  4. Wyszukiwanie — zapytania API są tłumaczone na zapytania Lucene z paginacją
  5. Powtórzenie — indeks jest przebudowywany codziennie o 3:00, aby uwzględnić zmiany w rejestrze

Skorzystaj z mojego wdrożenia

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.

Licencja

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.

Słowa kluczowe

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

About

REST API do wyszukiwania w Rejestrze Produktów Leczniczych (RPL) z pełnotekstowym wyszukiwaniem

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages