The ClinovaVet API provides RESTful access to your clinic's data. All requests are made over HTTPS to
https://app.clinova.vet/api/v1.
https://app.clinova.vet/api/v1
Rate limits are enforced to ensure system stability:
All API requests require authentication using your secret API key. Include your key in the
Authorization header as a Bearer token.
sk_live_)curl https://app.clinova.vet/api/v1/owners \
-H "Authorization: Bearer sk_live_a3f8b9c1e2d4f5g6h7i8j9k0l1m2n3o4p5q6"
| Code | Meaning |
|---|---|
| 200 | Success |
| 201 | Resource created |
| 400 | Bad request (invalid parameters) |
| 401 | Unauthorized (invalid API key) |
| 403 | Forbidden (insufficient permissions) |
| 404 | Resource not found |
| 429 | Rate limit exceeded |
| 500 | Internal server error |
Manage client (pet owner) records.
Retrieve a list of all owners.
| Parameter | Type | Description |
|---|---|---|
limit |
integer | Number of records (default: 50, max: 100) |
offset |
integer | Pagination offset (default: 0) |
search |
string | Search by name, email, or phone |
GET /api/v1/owners?limit=10&search=Smith
{
"data": [
{
"id": "cku9g6x2p0000ab0f0s1z2z3z",
"firstName": "John",
"middleName": null,
"lastName": "Smith",
"email": "john.smith@example.com",
"phone": "+1-555-123-4567",
"address": "123 Main St, New York, NY 10001",
"lastVisit": "2026-01-15T14:30:00.000Z",
"createdAt": "2024-03-01T10:00:00.000Z",
"updatedAt": "2026-01-15T14:30:00.000Z"
}
],
"pagination": {
"total": 125,
"limit": 10,
"offset": 0,
"hasMore": true
}
}
Retrieve details for a specific owner.
GET /api/v1/owners/cku9g6x2p0000ab0f0s1z2z3z
{
"id": "cku9g6x2p0000ab0f0s1z2z3z",
"firstName": "John",
"middleName": null,
"lastName": "Smith",
"email": "john.smith@example.com",
"phone": "+1-555-123-4567",
"address": "123 Main St, New York, NY 10001",
"lastVisit": "2026-01-15T14:30:00.000Z",
"createdAt": "2024-03-01T10:00:00.000Z",
"updatedAt": "2026-01-15T14:30:00.000Z",
"pets": [
{
"id": "cku9g7y3q0001ab0f0t2a3b4c",
"name": "Max",
"species": "Dog",
"breed": "Golden Retriever"
}
]
}
Create a new owner record.
| Field | Type | Required | Description |
|---|---|---|---|
firstName |
string | Yes | Owner's first name |
lastName |
string | Yes | Owner's last name |
middleName |
string | No | Owner's middle name |
email |
string | No | Email address |
phone |
string | No | Phone number |
address |
string | No | Physical address |
POST /api/v1/owners
Content-Type: application/json
{
"firstName": "Jane",
"lastName": "Doe",
"email": "jane.doe@example.com",
"phone": "+1-555-987-6543",
"address": "456 Oak Ave, Brooklyn, NY 11201"
}
{
"id": "cku9h8z4r0002ab0f0u3b4c5d",
"firstName": "Jane",
"middleName": null,
"lastName": "Doe",
"email": "jane.doe@example.com",
"phone": "+1-555-987-6543",
"address": "456 Oak Ave, Brooklyn, NY 11201",
"lastVisit": null,
"createdAt": "2026-01-20T21:45:00.000Z",
"updatedAt": "2026-01-20T21:45:00.000Z"
}
Manage patient (pet) records.
Retrieve a list of all pets.
| Parameter | Type | Description |
|---|---|---|
limit |
integer | Number of records (default: 50, max: 100) |
offset |
integer | Pagination offset |
ownerId |
string | Filter by owner ID |
species |
string | Filter by species (Dog, Cat, etc.) |
{
"data": [
{
"id": "cku9g7y3q0001ab0f0t2a3b4c",
"name": "Max",
"species": "Dog",
"breed": "Golden Retriever",
"birthdate": "2020-05-15T00:00:00.000Z",
"weight": 32.5,
"neutered": true,
"ownerId": "cku9g6x2p0000ab0f0s1z2z3z",
"createdAt": "2024-03-01T10:15:00.000Z"
}
],
"pagination": {
"total": 87,
"limit": 50,
"offset": 0,
"hasMore": true
}
}
Create a new pet record.
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | Yes | Pet's name |
species |
string | Yes | Dog, Cat, Bird, etc. |
ownerId |
string | Yes | Owner's ID |
breed |
string | No | Breed name |
birthdate |
string | No | ISO 8601 date |
weight |
number | No | Weight in kg |
neutered |
boolean | No | Default: false |
POST /api/v1/pets
Content-Type: application/json
{
"name": "Bella",
"species": "Cat",
"breed": "Siamese",
"ownerId": "cku9g6x2p0000ab0f0s1z2z3z",
"birthdate": "2022-08-20",
"weight": 4.2,
"neutered": true
}
Access SOAP notes and diagnostic data.
Retrieve medical records.
| Parameter | Type | Description |
|---|---|---|
petId |
string | Filter by pet ID |
startDate |
string | ISO date filter (from) |
endDate |
string | ISO date filter (to) |
{
"data": [
{
"id": "cku9i9a5s0003ab0f0v4c5d6e",
"date": "2026-01-15T14:30:00.000Z",
"title": "Annual Checkup",
"description": "Patient alert and responsive...",
"diagnosis": "Healthy, no concerns",
"treatment": "Continue current diet, schedule next checkup",
"differentialDiagnosis": null,
"bloodTestJson": null,
"urineTestJson": null,
"petId": "cku9g7y3q0001ab0f0t2a3b4c",
"createdById": "auth0|123456",
"createdAt": "2026-01-15T14:30:00.000Z"
}
]
}
Manage billing and payments.
Retrieve invoices.
| Parameter | Type | Description |
|---|---|---|
status |
string | PAID, UNPAID, CANCELLED |
ownerId |
string | Filter by owner |
{
"data": [
{
"id": "cku9j0b6t0004ab0f0w5d6e7f",
"invoiceNumber": "INV-2026-001523",
"totalAmount": 245.50,
"status": "PAID",
"ownerId": "cku9g6x2p0000ab0f0s1z2z3z",
"petId": "cku9g7y3q0001ab0f0t2a3b4c",
"itemsJson": "[{\"name\":\"Rabies Vaccine\",\"price\":45.00,\"quantity\":1}]",
"createdAt": "2026-01-15T15:00:00.000Z"
}
]
}
All errors follow a consistent JSON structure:
{
"error": {
"code": "RESOURCE_NOT_FOUND",
"message": "Owner with ID 'invalid-id' not found",
"details": {}
}
}
| Code | Description |
|---|---|
INVALID_API_KEY |
API key is missing or invalid |
RESOURCE_NOT_FOUND |
Requested resource doesn't exist |
VALIDATION_ERROR |
Request body validation failed |
RATE_LIMIT_EXCEEDED |
Too many requests |
INTERNAL_ERROR |
Server-side error occurred |