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_atz ostatnio znanym stanem i ignoruj starsze. data.bookingto stan rezerwacji w chwili wysyłki;typemówi, co się stało.- Klient MUSI ignorować nieznane pola i nieznane wartości
status/type(v1 rozwija się tylko addytywnie).
Katalog
type | Kiedy |
|---|---|
booking.created | nowa rezerwacja (marketplace, widget, panel kliniki, panel lekarza) |
booking.confirmed | pending → confirmed |
booking.cancelled | anulowanie przez pacjenta lub klinikę (cancelled_by) |
booking.completed | wizyta zakończona (ręcznie lub automatycznie) |
booking.no_show | pacjent nie przyszedł |
review.created | nowa 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) iexternal_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 klinikipandoktorek.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.