DodoDentist API 1.0.0
Public REST API for DodoDentist. Authenticate with an API key created in the DodoDentist dashboard: send the base64-encoded key secret with HTTP Basic auth. Each key carries per-resource scopes like patients:read or appointments:write.
https://api.dododentist.com
apiKey— HTTP Basic auth carrying only the API key secret:Authorization: Basic base64(<key secret>).accessToken— Operator session token issued by the DodoDentist dashboard:Authorization: Token <access token>.
Appointments
GET/api/appointments
List appointments
Lists the appointments of your organization. Requires the appointments:read scope.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
clinicId |
query | string | |
patientId |
query | string | |
startTime |
query | string | |
endTime |
query | string | |
fields |
query | string | Comma-separated projection of fields to return |
Responses
| Status | Meaning |
|---|---|
200 | Array of appointments |
401 | Missing or invalid credentials |
403 | API key is missing the appointments:read scope |
429 | API key rate limit exceeded |
POST/api/appointments
Create an appointment
Requires the appointments:write scope. Fires the appointment.created webhook.
Request body application/json
| Field | Type | Description |
|---|---|---|
clinicId required |
string | |
patientId |
string | |
startTime |
string | |
endTime |
string |
Responses
| Status | Meaning |
|---|---|
200 | The created appointment |
403 | API key is missing the appointments:write scope |
GET/api/appointments/{appointmentId}
Get an appointment
Returns a single appointment by id. Appointments belonging to another organization respond 404. Requires the appointments:read scope.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
appointmentId required |
path | string |
Responses
| Status | Meaning |
|---|---|
200 | The appointment |
404 | Not found (or owned by another organization) |
PUT/api/appointments/{appointmentId}
Update an appointment
Requires the appointments:write scope. Fires the appointment.updated webhook.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
appointmentId required |
path | string |
Responses
| Status | Meaning |
|---|---|
200 | The updated appointment |
404 | Not found (or owned by another organization) |
DELETE/api/appointments/{appointmentId}
Delete an appointment
Requires the appointments:write scope. Fires the appointment.deleted webhook.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
appointmentId required |
path | string |
Responses
| Status | Meaning |
|---|---|
200 | The deleted appointment |
404 | Not found (or owned by another organization) |
Clinics
GET/api/clinics
List clinics
Lists the clinics of your organization. Requires the clinics:read scope.
Responses
| Status | Meaning |
|---|---|
200 | Array of clinics |
403 | API key is missing the clinics:read scope |
Invoices
GET/api/invoices
List invoices
Lists the invoices of your organization. Requires the invoices:read scope.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
clinicId |
query | string | |
patientId |
query | string |
Responses
| Status | Meaning |
|---|---|
200 | Array of invoices |
403 | API key is missing the invoices:read scope |
Patients
GET/api/patients
List patients
Lists the patients of your clinic. Requires the patients:read scope.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
clinicId |
query | string | |
email |
query | string | |
_ids |
query | string | Comma-separated list of patient ids |
fields |
query | string | Comma-separated projection of fields to return |
Responses
| Status | Meaning |
|---|---|
200 | Array of patients |
401 | Missing or invalid credentials |
403 | API key is missing the patients:read scope |
429 | API key rate limit exceeded |
POST/api/patients
Create a patient
Creates a patient in your clinic. Requires the patients:write scope. Fires the patient.created webhook.
Request body application/json
| Field | Type | Description |
|---|---|---|
clinicId required |
string | |
name |
string | |
email |
string | |
phone |
string |
Responses
| Status | Meaning |
|---|---|
200 | The created patient |
403 | API key is missing the patients:write scope |
GET/api/patients/{patientId}
Get a patient
Returns a single patient by id. Patients belonging to another organization respond 404. Requires the patients:read scope.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
patientId required |
path | string |
Responses
| Status | Meaning |
|---|---|
200 | The patient |
404 | Not found (or owned by another organization) |
PUT/api/patients/{patientId}
Update a patient
Requires the patients:write scope. Fires the patient.updated webhook.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
patientId required |
path | string |
Responses
| Status | Meaning |
|---|---|
200 | The updated patient |
404 | Not found (or owned by another organization) |
DELETE/api/patients/{patientId}
Delete a patient
Requires the patients:write scope. Fires the patient.deleted webhook.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
patientId required |
path | string |
Responses
| Status | Meaning |
|---|---|
200 | The deleted patient |
404 | Not found (or owned by another organization) |
Payments
GET/api/payments
List payments
Lists the payments of your organization. Requires the payments:read scope.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
clinicId |
query | string | |
patientId |
query | string |
Responses
| Status | Meaning |
|---|---|
200 | Array of payments |
403 | API key is missing the payments:read scope |
Treatments
GET/api/treatments
List treatments
Lists your organization's treatment (service/price) catalog. Requires the treatments:read scope.
Responses
| Status | Meaning |
|---|---|
200 | Array of treatments |
403 | API key is missing the treatments:read scope |
Webhook subscriptions
GET/api/webhooksubscriptions
List webhook subscriptions
Webhook subscriptions deliver patient.created, patient.updated, patient.deleted, appointment.created, appointment.updated, appointment.deleted, invoice.* and payment.* events to your server as signed POST requests (X-Dododentist-Signature: t=<timestamp>,v1=<hex HMAC-SHA256 of "timestamp.body">). An endpoint failing 20 times in a row is disabled automatically. Subscriptions are managed with an operator access token; the secret is only returned once, on create.
Responses
| Status | Meaning |
|---|---|
200 | Array of webhook subscriptions (without secrets) |
POST/api/webhooksubscriptions
Create a webhook subscription
The response includes the signing secret exactly once — store it; it cannot be retrieved again.
Request body application/json
| Field | Type | Description |
|---|---|---|
clinicId required |
string | |
url required |
string | |
events |
array | Empty array subscribes to all events |
Responses
| Status | Meaning |
|---|---|
200 | The created subscription, including its secret |
PUT/api/webhooksubscriptions/{webhookSubscriptionId}
Update a webhook subscription
url, events and active are editable; the secret and clinic are immutable. Re-enabling an auto-disabled endpoint is done by setting active back to true.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
webhookSubscriptionId required |
path | string |
Responses
| Status | Meaning |
|---|---|
200 | The updated subscription (without secret) |
DELETE/api/webhooksubscriptions/{webhookSubscriptionId}
Delete a webhook subscription
Parameters
| Name | In | Type | Description |
|---|---|---|---|
webhookSubscriptionId required |
path | string |
Responses
| Status | Meaning |
|---|---|
200 | Deleted |