Przejdź do głównej zawartości

Public search

Publiczne endpointy discovery — bez auth, rate limit 600 req/min per IP.

GET /search/doctors​

Szukaj lekarzy z filtrami.

Query params​

ParamTypOpis
qstringFree text (imię/nazwisko/specjalizacja) — Meili typo-tolerant
citystringFiltruje po mieście klinki (np. "Warszawa")
specialtystringFiltruje po specjalizacji (slug, np. "dermatolog")
nfzbooltrue = tylko lekarze z aktywnymi services NFZ
telebooltrue = tylko z is_telehealth_enabled
kidsbooltrue = tylko z accepts_kids
langstringKod języka komunikacji (en, de, ...) — dla obcokrajowców
price_maxintMax cena w groszach (filtruje min cenę services)
available_fromdatetimeTylko lekarze z slotem available od tej daty
available_todatetimeTylko lekarze z slotem available do tej daty
pageintDefault 1
page_sizeintDefault 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​

ParamTypOpis
qstringFree text (nazwa klinki)
citystringMiasto
page / page_sizeintPagination

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