Przejdź do głównej zawartości

Webhook events

Koperta (v1)​

Każde zdarzenie ma ten sam kształt:

{
"id": "9f0c2b1e-…",
"type": "booking.created",
"api_version": "1",
"created_at": "2026-11-05T10:00:00+00:00",
"clinic_id": "c1a7…",
"data": { "booking": { } }
}
  • id = X-Pandoktorek-Event-Id — deduplikuj po nim (dostarczenie at-least-once).
  • Kolejność nie jest gwarantowana. Porównuj data.booking.updated_at z ostatnio znanym stanem i ignoruj starsze.
  • data.booking to stan rezerwacji w chwili wysyłki; type mówi, co się stało.
  • Klient MUSI ignorować nieznane pola i nieznane wartości status/type (v1 rozwija się tylko addytywnie).

Katalog​

typeKiedy
booking.creatednowa rezerwacja (marketplace, widget, panel kliniki, panel lekarza)
booking.confirmedpending → confirmed
booking.cancelledanulowanie przez pacjenta lub klinikę (cancelled_by)
booking.completedwizyta zakończona (ręcznie lub automatycznie)
booking.no_showpacjent nie przyszedł
review.creatednowa opinia (data = {review_id, booking_id, rating, doctor_user_id})

Rezerwacja (data.booking)​

Ten sam model zwraca publiczne API rezerwacji.

{
"id": "b2c3…",
"status": "confirmed",
"source": "marketplace",
"start_at": "2026-11-12T09:00:00+00:00",
"end_at": "2026-11-12T10:00:00+00:00",
"price_cents": 15000,
"currency": "PLN",
"doctor": { "id": "d4e5…", "external_id": "mydr-12" },
"service": { "id": "s6f7…", "external_id": "svc-rtg", "name": "RTG", "duration_minutes": 60 },
"room": { "id": "r8a9…", "external_id": null, "name": "Gabinet 2" },
"slots": [
{ "id": "…", "external_id": "mydr-slot-991" },
{ "id": "…", "external_id": "mydr-slot-992" }
],
"cancelled_at": null,
"cancelled_by": null,
"cancel_reason": null,
"created_at": "2026-11-05T10:00:00+00:00",
"updated_at": "2026-11-05T10:00:00+00:00",
"patient": null
}
  • Każde odwołanie ma id (PanDoktorek) i external_id (Twój identyfikator; null, gdy obiekt powstał w panelu PanDoktorka bez mapowania).
  • slots[] — usługa dłuższa niż slot zajmuje kilka kolejnych slotów.
  • cancelled_by: patient | clinic | null.
  • source — kanał, z którego przyszła rezerwacja: marketplace (wyszukiwarka PanDoktorka), clinic_site (mini-strona kliniki pandoktorek.pl/h/{klinika}), embed (widget na stronie kliniki), api (Twój system przez API), admin (panel kliniki). Lista może się rozszerzyć — nieznaną wartość traktuj jak zwykłą rezerwację.

Dane pacjenta​

patient jest null, chyba że subskrypcja ma włączone include_patient (przeznaczone dla systemu wiodącego kliniki — np. EDM; wymaga adresu https://):

"patient": {
"first_name": "Jan",
"last_name": "Kowalski",
"email": "jan@example.pl",
"phone": "+48600111222",
"is_guest": true,
"notes": "Powód wizyty wpisany przez pacjenta"
}

Nigdy nie wysyłamy: PESEL, tokenów, haseł, adresów IP. Systemy niewiodące („slot zajęty”) nie powinny mieć włączonej flagi.