Veterical API reference

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

All endpoints are relative to https://api.veterical.com. Every request is authenticated with an API key scoped to a single clinic.

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

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

Download the OpenAPI specification for use with your own tooling.

Appointments

GET/api/appointments

List appointments

List appointments for the API key's clinic, optionally filtered by clientId, patientId or a startTime/endTime window. Requires the appointments:read scope.

appointments:readapiKeyaccessToken
Parameters
NameInTypeDescription
clientIdquerystring
patientIdquerystring
startTimequerystring
endTimequerystring
Responses
StatusMeaning
200Array of appointments
401Missing or invalid credentials
403The API key lacks the appointments:read scope
429Rate limit exceeded
POST/api/appointments

Create or update an appointment

Create an appointment in the API key's clinic. Requires the appointments:write scope.

appointments:writeapiKeyaccessToken
Responses
StatusMeaning
200The created appointment
403The API key lacks the appointments:write scope
GET/api/appointments/{appointmentId}

Get an appointment by id

Fetch a single appointment owned by the API key's clinic. Requires the appointments:read scope. Returns 404 for an appointment outside the key's clinic or organization so ids cannot be probed.

appointments:readapiKeyaccessToken
Parameters
NameInTypeDescription
appointmentIdrequiredpathstring
Responses
StatusMeaning
200The appointment
404Not found (or not owned by the caller)

Clients

GET/api/clients

List clients

List the pet owners (clients) of the API key's clinic. Requires the clients:read scope.

clients:readapiKeyaccessToken
Parameters
NameInTypeDescription
emailquerystring
fieldsquerystringComma-separated projection of fields to return
Responses
StatusMeaning
200Array of clients
401Missing or invalid credentials
403The API key lacks the clients:read scope
429Rate limit exceeded
POST/api/clients

Create or update a client

Create a pet owner in the API key's clinic. Requires the clients:write scope.

clients:writeapiKeyaccessToken
Responses
StatusMeaning
200The created client
403The API key lacks the clients:write scope
GET/api/clients/{clientId}

Get a client by id

Fetch a single client owned by the API key's clinic. Requires the clients:read scope. Returns 404 for a client outside the key's clinic or organization so ids cannot be probed.

clients:readapiKeyaccessToken
Parameters
NameInTypeDescription
clientIdrequiredpathstring
Responses
StatusMeaning
200The client
404Not found (or not owned by the caller)

Invoices

GET/api/invoices

List invoices

List invoices for the API key's clinic, optionally filtered by patientId. Requires the invoices:read scope.

invoices:readapiKeyaccessToken
Parameters
NameInTypeDescription
patientIdquerystring
Responses
StatusMeaning
200Array of invoices
401Missing or invalid credentials
403The API key lacks the invoices:read scope
429Rate limit exceeded
POST/api/invoices

Create or update an invoice

Create an invoice in the API key's clinic. Requires the invoices:write scope.

invoices:writeapiKeyaccessToken
Responses
StatusMeaning
200The created invoice
403The API key lacks the invoices:write scope
GET/api/invoices/{invoiceId}

Get an invoice by id

Fetch a single invoice owned by the API key's clinic. Requires the invoices:read scope. Returns 404 for an invoice outside the key's clinic or organization so ids cannot be probed.

invoices:readapiKeyaccessToken
Parameters
NameInTypeDescription
invoiceIdrequiredpathstring
Responses
StatusMeaning
200The invoice
404Not found (or not owned by the caller)

Patients

GET/api/patients

List patients

List the patients (animals) of the API key's clinic. Requires the patients:read scope.

patients:readapiKeyaccessToken
Parameters
NameInTypeDescription
fieldsquerystringComma-separated projection of fields to return
Responses
StatusMeaning
200Array of patients
401Missing or invalid credentials
403The API key lacks the patients:read scope
429Rate limit exceeded
POST/api/patients

Create or update a patient

Create a patient (animal) in the API key's clinic. Requires the patients:write scope.

patients:writeapiKeyaccessToken
Responses
StatusMeaning
200The created patient
403The API key lacks the patients:write scope
GET/api/patients/{patientId}

Get a patient by id

Fetch a single patient owned by the API key's clinic. Requires the patients:read scope. Returns 404 for a patient outside the key's clinic or organization so ids cannot be probed.

patients:readapiKeyaccessToken
Parameters
NameInTypeDescription
patientIdrequiredpathstring
Responses
StatusMeaning
200The patient
404Not found (or not owned by the caller)

Payments

GET/api/payments

List payments

List payments for the API key's clinic, optionally filtered by patientId. Requires the payments:read scope.

payments:readapiKeyaccessToken
Parameters
NameInTypeDescription
patientIdquerystring
Responses
StatusMeaning
200Array of payments
401Missing or invalid credentials
403The API key lacks the payments:read scope
429Rate limit exceeded
POST/api/payments

Create or update a payment

Record a payment in the API key's clinic. Requires the payments:write scope.

payments:writeapiKeyaccessToken
Responses
StatusMeaning
200The created payment
403The API key lacks the payments:write scope
GET/api/payments/{paymentId}

Get a payment by id

Fetch a single payment owned by the API key's clinic. Requires the payments:read scope. Returns 404 for a payment outside the key's clinic or organization so ids cannot be probed.

payments:readapiKeyaccessToken
Parameters
NameInTypeDescription
paymentIdrequiredpathstring
Responses
StatusMeaning
200The payment
404Not found (or not owned by the caller)

Vaccinations

GET/api/vaccinations

List vaccinations

List vaccination records for the API key's clinic, optionally filtered by clientId, patientId or appointmentId. These records drive recall reminders. Requires the vaccinations:read scope.

vaccinations:readapiKeyaccessToken
Parameters
NameInTypeDescription
patientIdquerystring
appointmentIdquerystring
Responses
StatusMeaning
200Array of vaccinations
401Missing or invalid credentials
403The API key lacks the vaccinations:read scope
429Rate limit exceeded
POST/api/vaccinations

Create or update a vaccination

Record a vaccination in the API key's clinic. Requires the vaccinations:write scope.

vaccinations:writeapiKeyaccessToken
Responses
StatusMeaning
200The created vaccination
403The API key lacks the vaccinations:write scope
GET/api/vaccinations/{vaccinationId}

Get a vaccination by id

Fetch a single vaccination record owned by the API key's clinic. Requires the vaccinations:read scope. Returns 404 for a record outside the key's clinic or organization so ids cannot be probed.

vaccinations:readapiKeyaccessToken
Parameters
NameInTypeDescription
vaccinationIdrequiredpathstring
Responses
StatusMeaning
200The vaccination
404Not found (or not owned by the caller)

Webhook subscriptions

GET/api/webhooksubscriptions

List webhook subscriptions

Webhook subscriptions deliver client.created, patient.created, appointment.created, appointment.updated, invoice.created, payment.created and vaccination.created events (among others) to your server as signed POST requests (X-Veterical-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. A subscription is scoped to a single clinicId.

accessToken
Request body
FieldTypeDescription
clinicIdrequiredstring
urlrequiredstring
eventsarray (client.created | client.updated | patient.created | patient.updated | appointment.created | appointment.updated | appointment.deleted | invoice.created | invoice.updated | payment.created | payment.updated | vaccination.created | vaccination.updated)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