Public search
Publiczne endpointy discovery — bez auth, rate limit 600 req/min per IP.
GET /search/doctors
Szukaj lekarzy z filtrami.
Query params
| Param | Typ | Opis |
|---|---|---|
q | string | Free text (imię/nazwisko/specjalizacja) — Meili typo-tolerant |
city | string | Filtruje po mieście klinki (np. "Warszawa") |
specialty | string | Filtruje po specjalizacji (slug, np. "dermatolog") |
nfz | bool | true = tylko lekarze z aktywnymi services NFZ |
tele | bool | true = tylko z is_telehealth_enabled |
kids | bool | true = tylko z accepts_kids |
lang | string | Kod języka komunikacji (en, de, ...) — dla obcokrajowców |
price_max | int | Max cena w groszach (filtruje min cenę services) |
available_from | datetime | Tylko lekarze z slotem available od tej daty |
available_to | datetime | Tylko lekarze z slotem available do tej daty |
page | int | Default 1 |
page_size | int | Default 20, max 100 |
Response
{
"items": [
{
"slug": "dr-anna-kowalczyk-warszawa",
"first_name": "Anna",
"last_name": "Kowalczyk",
"title": "dr",
"specializations": ["dermatologia"],
"clinic_name": "MedTrust Warszawa",
"clinic_city": "Warszawa",
"avg_rating": 4.8,
"review_count": 127,
"min_price_cents": 15000,
"is_telehealth_enabled": true,
"accepts_kids": false,
"next_available_at": "2026-05-10T10:00:00+02:00"
}
],
"total": 247,
"page": 1,
"page_size": 20
}
Przykład
curl "https://api.pandoktorek.pl/search/doctors?q=dermatolog&city=Warszawa&nfz=true&page=1"
GET /search/clinics
Analogicznie, dla klinik.
Query params
| Param | Typ | Opis |
|---|---|---|
q | string | Free text (nazwa klinki) |
city | string | Miasto |
page / page_size | int | Pagination |
Response
{
"items": [
{
"slug": "medtrust-warszawa",
"name": "MedTrust Warszawa",
"city": "Warszawa",
"address": "ul. Marszałkowska 1, 00-001 Warszawa",
"doctor_count": 6,
"avg_rating": 4.7,
"review_count": 341,
"logo_url": "https://..."
}
],
"total": 12,
"page": 1,
"page_size": 20
}
GET /search/specialties
Lista wszystkich specjalizacji (autocomplete dla filtra).
curl "https://api.pandoktorek.pl/search/specialties"
{
"specialties": [
{"slug": "dermatolog", "name": "Dermatolog", "doctor_count": 47},
{"slug": "kardiolog", "name": "Kardiolog", "doctor_count": 23}
]
}
GET /search/stats
Public stats (do landingu / about). Liczba klinik / lekarzy / wizyt.
{
"clinic_count": 12,
"doctor_count": 89,
"completed_bookings_total": 2340
}
Tech notes
- Engine: Meilisearch v1.11 (typo-tolerant, geo-search ready)
- Sync: doctor/clinic upsert → async update Meili index (~5s lag)
- Fallback: jeśli Meili down → PostgreSQL ILIKE search (G-ERR-002)
- Cache: response
Cache-Control: public, max-age=60— możesz cache'ować po stronie klienta / CDN