Public vs internal API surface
Use this page to stay honest about what third-party integrations may call.Public (integration-friendly)
The OpenAPI document is the contract.
Internal (not for third-party docs)
Do not build partner integrations on these without an explicit product contract:Not shipped as public v1 (yet)
These product areas exist in the dashboard but have no public API endpoints in v1:- Services / service categories
- Staff / team
- Availability
- Gift cards
- Managing outbound webhooks through the API (configure them in the dashboard)
- Create / update / delete of any resource via public API
Data isolation
- Every public request is scoped by the organization on the API key.
- Soft-deleted / inactive rows are excluded (
isActive: truefilters on customers and appointments). - PHI and sensitive fields: customer responses are an allowlist. Notes are never returned. Date of birth and gender require
clients.sensitive:read. Do not log request or response bodies.
Outbound webhook signatures
Supported event webhooks are configured in the dashboard, not the public API. Each delivery includes:X-Cicini-Signature:t=<unix seconds>,v1=<hex>X-Cicini-Timestamp: event time as ISO-8601X-Cicini-Event: event nameX-Cicini-Event-Id: id for this event, the same value on every retry
v1 is HMAC-SHA256 of t + "." + rawBody using the endpoint secret. Compare with a constant-time check, and reject timestamps more than 5 minutes off your clock. The secret is generated by Cicini and shown once when the endpoint is created.