DodoDentist API reference

Every endpoint of the DodoDentist REST API, generated from the API itself.

All endpoints are relative to https://api.dododentist.com. Create an API key in your DodoDentist dashboard, then authenticate every request with it.

apiKeyHTTP Basic auth carrying only the API key secret: Authorization: Basic base64(<key secret>).

accessTokenOperator session token issued by the DodoDentist dashboard: Authorization: Token <access token>.

Download the OpenAPI specification for use with your own tooling.

Appointments

GET/api/appointments

List appointments

Lists the appointments of your organization. Requires the appointments:read scope.

appointments:readapiKeyaccessToken
Parameters
NameInTypeDescription
clinicIdquerystring
patientIdquerystring
startTimequerystring
endTimequerystring
fieldsquerystringComma-separated projection of fields to return
Responses
StatusMeaning
200Array of appointments
401Missing or invalid credentials
403API key is missing the appointments:read scope
429API key rate limit exceeded
POST/api/appointments

Create an appointment

Requires the appointments:write scope. Fires the appointment.created webhook.

appointments:writeapiKeyaccessToken
Request body
FieldTypeDescription
clinicIdrequiredstring
patientIdstring
startTimestring
endTimestring
Responses
StatusMeaning
200The created appointment
403API 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.

appointments:readapiKeyaccessToken
Parameters
NameInTypeDescription
appointmentIdrequiredpathstring
Responses
StatusMeaning
200The appointment
404Not found (or owned by another organization)
PUT/api/appointments/{appointmentId}

Update an appointment

Requires the appointments:write scope. Fires the appointment.updated webhook.

appointments:writeapiKeyaccessToken
Parameters
NameInTypeDescription
appointmentIdrequiredpathstring
Responses
StatusMeaning
200The updated appointment
404Not found (or owned by another organization)
DELETE/api/appointments/{appointmentId}

Delete an appointment

Requires the appointments:write scope. Fires the appointment.deleted webhook.

appointments:writeapiKeyaccessToken
Parameters
NameInTypeDescription
appointmentIdrequiredpathstring
Responses
StatusMeaning
200The deleted appointment
404Not found (or owned by another organization)

Clinics

GET/api/clinics

List clinics

Lists the clinics of your organization. Requires the clinics:read scope.

clinics:readapiKeyaccessToken
Responses
StatusMeaning
200Array of clinics
403API key is missing the clinics:read scope

Invoices

GET/api/invoices

List invoices

Lists the invoices of your organization. Requires the invoices:read scope.

invoices:readapiKeyaccessToken
Parameters
NameInTypeDescription
clinicIdquerystring
patientIdquerystring
Responses
StatusMeaning
200Array of invoices
403API key is missing the invoices:read scope

Patients

GET/api/patients

List patients

Lists the patients of your clinic. Requires the patients:read scope.

patients:readapiKeyaccessToken
Parameters
NameInTypeDescription
clinicIdquerystring
emailquerystring
_idsquerystringComma-separated list of patient ids
fieldsquerystringComma-separated projection of fields to return
Responses
StatusMeaning
200Array of patients
401Missing or invalid credentials
403API key is missing the patients:read scope
429API 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.

patients:writeapiKeyaccessToken
Request body
FieldTypeDescription
clinicIdrequiredstring
namestring
emailstring
phonestring
Responses
StatusMeaning
200The created patient
403API 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.

patients:readapiKeyaccessToken
Parameters
NameInTypeDescription
patientIdrequiredpathstring
Responses
StatusMeaning
200The patient
404Not found (or owned by another organization)
PUT/api/patients/{patientId}

Update a patient

Requires the patients:write scope. Fires the patient.updated webhook.

patients:writeapiKeyaccessToken
Parameters
NameInTypeDescription
patientIdrequiredpathstring
Responses
StatusMeaning
200The updated patient
404Not found (or owned by another organization)
DELETE/api/patients/{patientId}

Delete a patient

Requires the patients:write scope. Fires the patient.deleted webhook.

patients:writeapiKeyaccessToken
Parameters
NameInTypeDescription
patientIdrequiredpathstring
Responses
StatusMeaning
200The deleted patient
404Not found (or owned by another organization)

Payments

GET/api/payments

List payments

Lists the payments of your organization. Requires the payments:read scope.

payments:readapiKeyaccessToken
Parameters
NameInTypeDescription
clinicIdquerystring
patientIdquerystring
Responses
StatusMeaning
200Array of payments
403API 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.

treatments:readapiKeyaccessToken
Responses
StatusMeaning
200Array of treatments
403API 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.

accessToken
Responses
StatusMeaning
200Array 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.

accessToken
Request body
FieldTypeDescription
clinicIdrequiredstring
urlrequiredstring
eventsarray (patient.created | patient.updated | patient.deleted | appointment.created | appointment.updated | appointment.deleted | invoice.created | invoice.updated | invoice.deleted | payment.created | payment.updated | payment.deleted)Empty array subscribes to all events
Responses
StatusMeaning
200The 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.

accessToken
Parameters
NameInTypeDescription
webhookSubscriptionIdrequiredpathstring
Responses
StatusMeaning
200The updated subscription (without secret)
DELETE/api/webhooksubscriptions/{webhookSubscriptionId}

Delete a webhook subscription

accessToken
Parameters
NameInTypeDescription
webhookSubscriptionIdrequiredpathstring
Responses
StatusMeaning
200Deleted