Providers
Providers are the people who deliver care at a clinic: veterinarians, vet techs, and other staff who can be assigned to appointments or attached to medical records. Each provider record carries their role and the availability windows that drive scheduling. Schedule templates sit alongside providers and define the appointment types, durations, and color-coding the clinic uses on its calendar.
Most scheduling integrations read providers to populate dropdowns, and read schedule templates to render the right slot length per appointment type.
Schema
Section titled “Schema”Authoritative schemas live in the live Swagger UI. The fields below are a representative subset for orientation.
| Field | Type | Description |
|---|---|---|
id | string | Server-assigned identifier. |
name | string | The provider’s display name. There are no separate firstName / lastName fields; doctor expands to the underlying user record. |
initials | string | Provider’s initials. |
clinicId | string | Clinic the provider belongs to. |
doctorId | string | The related doctor/user record. doctor expands it. |
appointmentTypeIds | array | Appointment types this provider offers (“Services Offered”). appointmentTypes expands them. |
isReliefDoctor | boolean | Whether this provider is a relief doctor. |
isArchived | boolean | Whether the provider is archived. Archived providers are not bookable; there is no active field. |
color | string | Hex colour used for the provider on the calendar. |
sortOrder | integer | Display order for provider lists. |
dateCreated | string | ISO 8601 UTC timestamp of creation. |
dateUpdated | string | ISO 8601 UTC timestamp of last update. |
List providers
Section titled “List providers”/pav2/open-api-providers Returns the providers configured for the clinic identified by X-Clinic-Id. Availability is included on the record so most calendar UIs need a single round trip.
Example
Section titled “Example”curl -X POST https://open-api.shepherd.vet/pav2/open-api-providers \ -H "Content-Type: application/json" \ -H "X-Integration-Public-Key: $SHEPHERD_PUBLIC_KEY" \ -H "X-Integration-Private-Key: $SHEPHERD_PRIVATE_KEY" \ -H "X-Clinic-Id: $SHEPHERD_CLINIC_ID" \ -d '{"page":1,"rpp":100,"sort":"lastName|asc"}'import os, requests
resp = requests.post( "https://open-api.shepherd.vet/pav2/open-api-providers", headers={ "Content-Type": "application/json", "X-Integration-Public-Key": os.environ["SHEPHERD_PUBLIC_KEY"], "X-Integration-Private-Key": os.environ["SHEPHERD_PRIVATE_KEY"], "X-Clinic-Id": os.environ["SHEPHERD_CLINIC_ID"], }, json={"page": 1, "rpp": 100, "sort": "lastName|asc"}, timeout=30,)resp.raise_for_status()for p in resp.json()["item"]: print(p["lastName"], p["firstName"], p["role"])using System.Net.Http.Json;
using var http = new HttpClient();http.DefaultRequestHeaders.Add("X-Integration-Public-Key", publicKey);http.DefaultRequestHeaders.Add("X-Integration-Private-Key", privateKey);http.DefaultRequestHeaders.Add("X-Clinic-Id", clinicId);
var body = JsonContent.Create(new { page = 1, rpp = 100, sort = "lastName|asc",});var resp = await http.PostAsync( "https://open-api.shepherd.vet/pav2/open-api-providers", body);resp.EnsureSuccessStatusCode();Console.WriteLine(await resp.Content.ReadAsStringAsync());<?php$ch = curl_init('https://open-api.shepherd.vet/pav2/open-api-providers');curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Content-Type: application/json', 'X-Integration-Public-Key: ' . getenv('SHEPHERD_PUBLIC_KEY'), 'X-Integration-Private-Key: ' . getenv('SHEPHERD_PRIVATE_KEY'), 'X-Clinic-Id: ' . getenv('SHEPHERD_CLINIC_ID'), ], CURLOPT_POSTFIELDS => json_encode([ 'page' => 1, 'rpp' => 100, 'sort' => 'lastName|asc', ]),]);$response = curl_exec($ch);curl_close($ch);echo $response;const resp = await fetch('https://open-api.shepherd.vet/pav2/open-api-providers', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Integration-Public-Key': process.env.SHEPHERD_PUBLIC_KEY, 'X-Integration-Private-Key': process.env.SHEPHERD_PRIVATE_KEY, 'X-Clinic-Id': process.env.SHEPHERD_CLINIC_ID, }, body: JSON.stringify({ page: 1, rpp: 100, sort: 'lastName|asc' }),});if (!resp.ok) throw new Error(`Shepherd ${resp.status}: ${await resp.text()}`);const page = await resp.json();for (const p of page.item) console.log(p.lastName, p.firstName, p.role);Response
Section titled “Response”{ "item": [ { "id": "bb551122-18b4-4a91-a5c9-abc123456789", "clinicId": "9890662f-52db-4a41-a5c1-b2e300d400b4", "name": "Dr. Alex Rivera", "initials": "AR", "doctorId": "6a5b4c3d-2e1f-0a9b-8765-4321fedcba09", "doctor": null, "appointmentTypeIds": ["8fc9c6d1-a829-4b93-a5ea-1c83db96a1b4"], "appointmentTypes": null, "isReliefDoctor": false, "isArchived": false, "color": "#2878FD", "sortOrder": 1, "dateCreated": "2025-07-01T13:21:09Z", "dateUpdated": "2026-03-04T10:00:01Z" } ], "totalRecords": 12, "page": 1, "recordsPerPage": 100, "sort": "lastName|asc", "searchQuery": null, "embed": null, "links": []}Schedule templates
Section titled “Schedule templates”/pav2/open-api-schedule-templates Returns the appointment-type catalog used by the clinic calendar: each template carries a name, duration, color, and the rules that decide which providers it applies to. Combine providers and schedule templates to build a slot picker.
Example
Section titled “Example”curl -X POST https://open-api.shepherd.vet/pav2/open-api-schedule-templates \ -H "Content-Type: application/json" \ -H "X-Integration-Public-Key: $SHEPHERD_PUBLIC_KEY" \ -H "X-Integration-Private-Key: $SHEPHERD_PRIVATE_KEY" \ -H "X-Clinic-Id: $SHEPHERD_CLINIC_ID" \ -d '{"page":1,"rpp":100}'const resp = await fetch( 'https://open-api.shepherd.vet/pav2/open-api-schedule-templates', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Integration-Public-Key': process.env.SHEPHERD_PUBLIC_KEY, 'X-Integration-Private-Key': process.env.SHEPHERD_PRIVATE_KEY, 'X-Clinic-Id': process.env.SHEPHERD_CLINIC_ID, }, body: JSON.stringify({ page: 1, rpp: 100 }), },);if (!resp.ok) throw new Error(`Shepherd ${resp.status}: ${await resp.text()}`);const page = await resp.json();for (const t of page.item) { console.log(t.name, t.durationMinutes);}See also
Section titled “See also”- Conventions for pagination, embedding, sorting, and date filters.
- Lookups for the enumerated values used elsewhere in scheduling.
- Errors for the two JSON error body shapes.