SmileCloudDocs

Animals

At a veterinary clinic the patient is the animal. An animal belongs to a client — the person who brings it in — and that is where the contact details live: an animal record carries no phone or email of its own.

Animal endpoints require the patients:read scope. Vaccination and measurement history require their own scopes, noted below.

Veterinary clinics only

At a dental clinic these endpoints return 404 with the problem type unsupported_capability. Call GET /v1/me before integrating — the animals capability tells you whether a clinic has them.

#The animal object

FieldTypeDescription
idstringUnique animal id (clinic-scoped).
namestring | nullThe animal's name. Animals have no family name.
speciesobject | null{ id, name } from the clinic's species catalog.
breedobject | null{ id, name } from the clinic's breed catalog.
sexstring | nullmale, female, or null.
reproductive_statusstring | nullneutered, or null meaning unknown. Never read null as "intact" — it means no procedure is on file.
neuter_datestring | nullISO YYYY-MM-DD.
birth_datestring | nullISO YYYY-MM-DD.
estimated_agestring | nullRecorded when the date of birth is unknown.
weight_kgnumber | nullThe standing weight on the record. The measured history is /measurements, and the two can legitimately differ.
colorstring | nullCoat or markings.
blood_typestring | null
microchip_numberstring | null
tag_numberstring | null
license_numberstring | null
enclosure_numberstring | null
statusobject | nullEmbedded status reference (id, name, color).
clientobject | nullThe owner: { id, first_name, last_name, phone, email }. null when no owner is on file.
created_atstring | nullISO 8601 timestamp.
updated_atstring | nullISO 8601 timestamp.

#List / search animals

GET /v1/animals

Returns a paginated list of animals. Combine filters to narrow the search.

ParameterInDescription
queryqueryName search. Matches the animal's own name only, not the owner's.
species_idqueryRestrict to one species (see Catalog).
breed_idqueryRestrict to one breed.
client_idqueryOnly this owner's animals.
microchipqueryExact microchip number.
limit, cursorqueryPagination.
bash
curl -G https://api.smile-app.co.il/v1/animals \
  -H "Authorization: Bearer sk_live_..." \
  --data-urlencode "microchip=941000024688123"
json
{
  "data": [
    {
      "id": "4211",
      "name": "Rexi",
      "species": { "id": "3", "name": "Dog" },
      "breed": { "id": "17", "name": "Labrador" },
      "sex": "male",
      "reproductive_status": "neutered",
      "weight_kg": 28.4,
      "microchip_number": "941000024688123",
      "client": {
        "id": "4210",
        "first_name": "Dana",
        "last_name": "Levi",
        "phone": "0521234567",
        "email": "dana@example.com"
      }
    }
  ],
  "next_cursor": null
}

#Retrieve an animal

GET /v1/animals/{id}

Returns one animal. An id that belongs to a client returns 404 — an id that works here is always an animal.

#An animal's appointments, treatments, payments, calls and messages

GET /v1/animals/{id}/appointments GET /v1/animals/{id}/treatments GET /v1/animals/{id}/payments GET /v1/animals/{id}/calls GET /v1/animals/{id}/whatsapp/messages POST /v1/animals/{id}/payments

These are the same collections the generic API exposes under /v1/patients/{id}/…, with identical payloads, parameters and required scopes — an animal id is a patient id. They exist so a veterinary integration can stay in one vocabulary instead of switching to patients the moment it does anything with an animal.

Each requires the scope of the resource it returns, and each item takes the shape documented on that resource's own page:

CollectionScopeObject
appointmentsappointments:readAppointment
treatmentstreatments:readTreatment
paymentspayments:readPayment
payments (POST)payments:writeRecording a payment
callscalls:readCall
whatsapp/messageswhatsapp:readMessage

All of them are paginated and accept limit and cursor.

#List an animal's vaccinations

GET /v1/animals/{id}/vaccines · requires vaccines:read

Returns a paginated list of administered doses, most recent first.

FieldTypeDescription
idstringRecord id.
vaccineobject | null{ id, name, code, interval_months } from the vaccine catalog.
performed_atstring | nullISO YYYY-MM-DD.
next_due_atstring | nullWhen the clinic scheduled the next dose. Use it as given — clinics deviate from the catalog interval per animal, so do not recompute it.
batch_numberstring | null
microchip_numberstring | nullRecorded at administration, where the clinic captures it.
tag_numberstring | null
pricenumber | null
discountnumber | null
notesstring | null
administered_byobject | null{ id, name }.
appointment_idstring | nullThe visit it was given at, when linked.

#List an animal's measurements

GET /v1/animals/{id}/measurements · requires measurements:read

Returns a paginated list of measurement sessions, most recent first. A session is everything recorded at one moment — weight, temperature, pulse, respiration, body condition score — which is how a clinic records them and the only way a trend reads back correctly.

The catalog is open: the five seeded types are vital signs, but a clinic records whatever it needs. Fetch the available types from /v1/catalog/measurements.

FieldTypeDescription
idstringSession id.
recorded_atstring | nullISO 8601 timestamp.
recorded_byobject | null{ id, name }.
notesstring | null
valuesarray{ measurement: { id, name, unit }, value } per reading.
json
{
  "data": [
    {
      "id": "301",
      "recorded_at": "2026-08-12T10:30:00+03:00",
      "recorded_by": { "id": "7", "name": "Dr Cohen" },
      "notes": null,
      "values": [
        { "measurement": { "id": "1", "name": "Weight", "unit": "kg" }, "value": 28.4 }
      ]
    }
  ],
  "next_cursor": null
}