List patients
Returns a paginated list of patients accessible to the clinic associated with your API key. ### Access Model Patients in Vetigen are **global entities** — a single patient record may be shared across multiple clinics via `CustomerClinicConnection`. This endpoint returns patients that have an active connection to the caller's clinic, regardless of which clinic originally created the record. ### Sorting Results are sorted by `updated_at DESC` by default — most recently modified first. ### Pagination Use `page` and `page_size` query parameters. The response includes `has_more: true` when additional pages are available. Prefer cursor-style iteration over random page access for large datasets — page numbers may shift as records change. ### Common Errors - `PATIENT.ACCESS_DENIED` — API key's clinic has no connection to the requested patients. - `AUTH.RATE_LIMITED` — see rate-limit headers.
Authorization
JWT-auth API key issued from the Vetigen Developer Portal. Pass as Authorization: Bearer YOUR_API_KEY.
In: header
Query Parameters
Page number (1-indexed).
11 <= valueItems per page. Max 100.
201 <= value <= 100Filter by species (e.g. dog, cat, rabbit).
Only return patients updated after this ISO 8601 timestamp. Useful for incremental sync.
date-timeResponse Body
application/json
application/json
application/json
application/json
application/json
curl -H "Authorization: Bearer $VETIGEN_API_KEY" \ "https://api.vetigen.com/api/v1/patients?page=1&page_size=20&species=dog"{
"success": true,
"data": {
"items": [
{
"fp": "patient_01JABC9XYZKL4N7P3Q8TRM2ZDE",
"name": "Boncuk",
"species": "dog",
"breed": "Golden Retriever",
"sex": "male",
"date_of_birth": "2019-06-15",
"weight_kg": 28.4,
"owner_customer_fp": "customer_01JABC...",
"created_at": "2024-11-03T09:24:17.000Z",
"updated_at": "2026-03-18T14:02:41.000Z"
}
],
"total": 152,
"page": 1,
"page_size": 20,
"has_more": true
},
"message": "OK"
}{
"success": false,
"error": {
"code": "AUTH.UNAUTHORIZED",
"message": "Authentication required.",
"severity": "error"
}
}{
"success": false,
"error": {
"code": "AUTH.FORBIDDEN",
"message": "Insufficient permissions.",
"severity": "error"
}
}{
"success": false,
"error": {
"code": "AUTH.RATE_LIMITED",
"message": "Rate limit exceeded. Retry in 42 seconds.",
"severity": "warning"
}
}{
"success": false,
"error": {
"code": "PATIENT.NOT_FOUND",
"message": "Patient with fingerprint patient_01JABC does not exist.",
"severity": "error",
"details": {}
}
}Usage Notes
Incremental Sync Pattern
For dashboards and third-party integrations mirroring patient data, combine updated_since with periodic polling (every 5–15 minutes):
// Store the last successful sync timestamp per integration
const cursor = await db.getSyncCursor('vetigen:patients');
const nextCursor = new Date().toISOString();
const params = new URLSearchParams({
page: '1',
page_size: '100',
...(cursor && { updated_since: cursor }),
});
// Paginate until has_more === false, then persist nextCursor.Using updated_since avoids full table scans and keeps bandwidth proportional to actual clinic activity.
Common Pitfalls
- Species filter values are lowercase ISO codes where applicable (
dog,cat,rabbit,bird,reptile,exotic). Uppercase values silently match nothing. - Page numbers shift if patients are created/deleted between requests. Prefer
updated_since+ full pagination for sync jobs. - Soft-deleted patients are excluded by default. To include them, use the admin endpoint (not available in the public API).
Response Size
A page_size=100 response with typical field coverage averages ~35 KB gzipped. Plan batch sizes accordingly if you're bandwidth-constrained (e.g. mobile sync).
Related
Webhooks
How to receive real-time events from Vetigen via webhooks.
Get patient
Returns full details of a single patient by fingerprint. ### Multi-Clinic Visibility This endpoint succeeds if the API key's clinic has an active `CustomerClinicConnection` to the patient — **even if another clinic originally created the record**. Ownership of medical records within the patient is determined by `performed_by_clinic_fp` on each record. ### What This Returns Only the patient entity itself. Related medical records (SOAP, vaccines, medications, diagnostics) are fetched separately from their respective endpoints.