API reference
The v1 REST API is a small, read-only surface over your clinic's data. This page covers the conventions that apply everywhere; the resource pages document each endpoint in detail.
#Base URL
text
https://api.smile-app.co.il
All endpoints are versioned under /v1. An OpenAPI 3.1 description of the entire surface is served unauthenticated at /openapi.json.
#Conventions
- Auth - every request needs
Authorization: Bearer sk_live_.... See Authentication. - Format - requests and responses are JSON. Successful responses wrap the payload in a
datafield. - Single resource -
{ "data": { ... } }. - Collection -
{ "data": [ ... ], "next_cursor": "..." | null }for paginated lists, or{ "data": [ ... ] }for bounded lists. - Pagination -
?limit=and?cursor=. See Pagination. - Detail level -
?response_format=concise|detailedwhere supported. - Errors -
application/problem+json. See Errors. - Ids are strings - always treat ids as opaque strings, scoped to one clinic.
#Resources
| Resource | Endpoints | Scope |
|---|---|---|
| Account | GET /v1/me | (none) |
| Patients | GET /v1/patients, /v1/patients/{id} and sub-resources | patients:read |
| Appointments | GET /v1/appointments, /v1/appointments/{id} | appointments:read |
| Availability | GET /v1/availability | availability:read |
| Treatments | GET /v1/treatments/{id}, patient treatments | treatments:read |
| Payments | GET /v1/payments/{id}, patient payments, record a payment | payments:read, payments:write |
| Leads | POST /v1/leads — capture CRM leads from external channels | leads:write |
| Calls | GET /v1/calls, summaries, transcripts, recording links | calls:read |
| Catalog | GET /v1/catalog/* | catalog:read |
| Analytics | GET /v1/metrics, POST /v1/query | analytics:read |
| Webhooks API | POST/GET/DELETE /v1/webhooks | webhooks:manage |
#Embedded references
To save you from chasing ids, list and detail responses embed compact references to related objects rather than returning bare ids. An appointment, for example, includes a small patient, branch, type, and status object inline:
json
{
"data": {
"id": "55021",
"patient": { "id": "8842", "first_name": "Dana", "last_name": "Levi" },
"branch": { "id": "1", "name": "Downtown Branch" },
"type": { "id": "3", "name": "Cleaning", "duration_minutes": 30 },
"status": { "id": "2", "name": "Confirmed", "color": "#16a34a" },
"providers": [{ "id": "12", "name": "Dr. Cohen" }],
"start": "2026-07-01T09:00:00+03:00",
"end": "2026-07-01T09:30:00+03:00"
}
}
These embedded shapes (PatientSummary, BranchRef, TypeRef, StatusRef, ProviderRef) are intentionally minimal - enough to display without a second request.