POST /api/v1/clinic/services
Bulk upsert serwisów. Idempotent po (clinic_id, external_id), atomic
race-safe (INSERT ... ON CONFLICT DO UPDATE z LEARNINGS Graphium).
Auth: Bearer pk_live_* z scope services:write.
Request
POST /api/v1/clinic/services HTTP/1.1
Authorization: Bearer pk_live_XXXXXXXX_<secret>
Content-Type: application/json
{
"services": [ /* ServiceIngestItem, max 500 */ ]
}
ServiceIngestItem
| Pole | Typ | Wymagane | Opis |
|---|---|---|---|
external_id | string (1-120) | ✅ | Twój ID z CRM |
name | string (1-200) | ✅ | Wyświetlana nazwa (np. "Konsultacja dermatologiczna") |
description | string (max 2000) | — | Pełen opis |
duration_minutes | int (5-480) | ✅ | Czas trwania — używany do alokacji slotów (1 wizyta = N×15min) |
price_cents | int (≥0) | ✅ | Cena w groszach (G-FIN-001) |
currency | string (3-3) | — | Default "PLN" |
is_active | bool | — | Default true. false = ukryty publicznie |
is_nfz | bool | — | Default false. Filtr ?nfz=true w discovery |
:::warning Cena w groszach, nie złotych
price_cents=15000 = 150,00 PLN. NIGDY float (G-FIN-001).
:::
Response 200
{
"created": 5,
"updated": 2,
"errors": []
}
Pełen przykład
curl -X POST https://api.pandoktorek.pl/api/v1/clinic/services \
-H "Authorization: Bearer pk_live_XXXXXXXX_<secret>" \
-H "Content-Type: application/json" \
-d '{
"services": [
{
"external_id": "svc-dermatologia-30",
"name": "Konsultacja dermatologiczna",
"description": "Pierwsza wizyta — wywiad, badanie skóry, diagnoza.",
"duration_minutes": 30,
"price_cents": 25000,
"currency": "PLN",
"is_active": true,
"is_nfz": false
},
{
"external_id": "svc-nfz-podst",
"name": "Wizyta NFZ — podstawowa",
"duration_minutes": 15,
"price_cents": 0,
"is_nfz": true
}
]
}'
Service ↔ doctor mapping
Service jest per klinika — wszyscy lekarze klinki mogą go oferować.
Per-doctor pricing (np. dr Kowalczyk pobiera więcej za to samo) → dodatkowo
upload przez Faza 2 endpoint POST /clinic/doctors/{external_id}/pricing.
Default w MVP: każdy lekarz klinki oferuje wszystkie active services tej klinki, w cenie podstawowej.
Limity
- Max 500 services per request
- Duration 5-480 min (od mini-konsulty po długi zabieg)
- Description max 2000 znaków
- Rate limit: 10 000 requests/dobę per API key