Users
Users are the staff identities in Shepherd: the people who sign in, get assigned tasks, and appear as the actor on audit fields like processedByUserId, completedByUserId, or createdByUserId. Each user has a name, a username, a role, and a clinic association.
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 user identifier. The same id appears on audit fields elsewhere in the API. |
userId | string | The underlying user identifier. |
coreUser | object | The user’s core record: name and contact details. There are no flat firstName / lastName fields on this model. |
roles | array | The user’s roles. |
clinicUser | array | Per-clinic user records, for users who work across a group. |
prefix | string | Name prefix (e.g. Dr.), when set. |
suffix | string | Name suffix (e.g. DVM), when set. |
licenseNumber | string | The user’s license number. |
userLicenseTypeId | string | License type reference. userLicenseType expands it. |
dateCreated | string | ISO 8601 UTC timestamp of creation. |
dateUpdated | string | ISO 8601 UTC timestamp of last update. |
List users
Section titled “List users”/pav2/open-api-users Returns the users at the clinic identified by X-Clinic-Id. Use a search query to look up a user by name, or filter by role.
Example
Section titled “Example”curl -X POST https://open-api.shepherd.vet/pav2/open-api-users \ -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-users", 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 u in resp.json()["item"]: print(u["lastName"], u["firstName"], u.get("roleName"))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-users", body);resp.EnsureSuccessStatusCode();Console.WriteLine(await resp.Content.ReadAsStringAsync());<?php$ch = curl_init('https://open-api.shepherd.vet/pav2/open-api-users');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-users', { 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 u of page.item) console.log(u.lastName, u.firstName, u.roleName);Response
Section titled “Response”{ "item": [ { "id": "bb551122-18b4-4a91-a5c9-abc123456789", "userId": "6a5b4c3d-2e1f-0a9b-8765-4321fedcba09", "coreUser": null, "roles": [], "clinicUser": [], "prefix": "Dr.", "suffix": "DVM", "licenseNumber": "TX-12345", "userLicenseTypeId": "2f4a6b8c-1d3e-5f70-9a2b-4c6d8e0f1a2b", "userLicenseType": null, "dateCreated": "2025-07-01T13:21:09Z", "dateUpdated": "2026-03-04T10:00:01Z" } ], "totalRecords": 8, "page": 1, "recordsPerPage": 100, "sort": "lastName|asc", "searchQuery": null, "embed": null, "links": []}Clinic users
Section titled “Clinic users”/pav2/open-api-clinic-users Returns the clinic-membership records that join a user to a clinic, plus per-clinic settings (e.g. isTimeClockEnabled, license fields). Use this when you need to know which clinic a user belongs to in a multi-site account, or to surface clinic-scoped flags. For names, role, and approval status, the /open-api-users endpoint above is usually enough.
curl -X POST https://open-api.shepherd.vet/pav2/open-api-clinic-users \ -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}'See also
Section titled “See also”- Providers for the bookable, medical-and-billable subset of users.
- Tasks for assigning work to users by id.
- Conventions for pagination, sorting, and date filters.
- Groups and multi-site for how clinic-user records change in shared-data groups.