Skip to main content

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
If you need a resource that is not listed, contact us. Do not guess at paths.

Data isolation

  • Every public request is scoped by the organization on the API key.
  • Soft-deleted / inactive rows are excluded (isActive: true filters 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-8601
  • X-Cicini-Event: event name
  • X-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.