Przejdź do głównej zawartości

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​

PoleTypWymaganeOpis
external_idstring (1-120)✅Twój ID z CRM
namestring (1-200)✅Wyświetlana nazwa (np. "Konsultacja dermatologiczna")
descriptionstring (max 2000)—Pełen opis
duration_minutesint (5-480)✅Czas trwania — używany do alokacji slotów (1 wizyta = N×15min)
price_centsint (≥0)✅Cena w groszach (G-FIN-001)
currencystring (3-3)—Default "PLN"
is_activebool—Default true. false = ukryty publicznie
is_nfzbool—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