PetExec Company & Account API
Read company-level configuration - locations, employees, lead sources ("how found"), and named preference values - plus the authenticated user's own profile and owner-portal menu.
Read company-level configuration - locations, employees, lead sources ("how found"), and named preference values - plus the authenticated user's own profile and owner-portal menu.
openapi: 3.0.3
info:
title: PetExec API
description: >-
The PetExec API is a REST API for existing PetExec customers and their
developers to extend the PetExec pet-care business management platform
(daycare, boarding, grooming, training, and scheduled services). Every
endpoint, path, and scope in this document is transcribed directly from
PetExec's own public GitHub examples repository
(https://github.com/PetExec/API-Examples), which is the only complete
source of PetExec API technical detail publicly available - PetExec's
interactive apidoc reference at
https://secure.petexec.net/api/apidoc/index.html is a JavaScript-rendered
single-page app and does not expose a machine-readable spec. Access
requires an active PetExec account. Client credentials (client_id /
client_secret) are self-issued from Company Preferences > Misc. Settings >
Maintain API Applications inside the PetExec console, then exchanged for a
scoped Bearer token via an OAuth2 Resource Owner Password Credentials
(password) grant against POST /token. PetExec was acquired by Togetherwork
in November 2024 and is being migrated toward Gingr; PetExec is no longer
accepting new customers, but this API surface is documented as live for
existing accounts as of the review date. Some of PetExec's own published
examples are internally inconsistent (mixed "user-card" / "userCard"
casing, a menu example that appears to call the wrong path) - those
inconsistencies are called out inline below rather than silently
corrected.
version: '1.0'
contact:
name: PetExec
url: https://www.petexec.net/features/api-for-developers
servers:
- url: https://secure.petexec.net/api
description: PetExec production API (used by nearly all official PHP and most JavaScript examples)
- url: https://beta.petexec.net/api
description: PetExec beta/staging API (referenced by some official JavaScript examples for the same paths; not separately documented)
security:
- bearerAuth: []
tags:
- name: Authentication
description: OAuth2 password-grant token issuance.
- name: Owners
description: Owner (pet parent) account records and search.
- name: Pets
description: Pet profiles, pet types, breeds, and vets.
- name: Boarding
description: Boarding reservations, packages, and services.
- name: Daycare
description: Daycare reservations and services.
- name: Grooming
description: Grooming reservations, groomers, and services.
- name: Scheduled Services
description: Scheduled-service reservations, types, and services.
- name: Calendar
description: Company-wide and per-owner reservation calendars by date range.
- name: Vaccinations
description: Pet vaccination (shot) records.
- name: Credit Cards
description: Owner stored payment cards.
- name: Purchase History
description: Owner purchase/transaction history.
- name: Reports
description: Billing and statistics reports.
- name: Company
description: Company locations, employees, lead sources, and preferences.
- name: Profile
description: The authenticated user's own profile and portal menu.
paths:
/token:
post:
operationId: getAccessToken
tags:
- Authentication
summary: Obtain an access token (password grant)
description: >-
Exchanges a PetExec username/password plus a client_id/client_secret
(sent as an HTTP Basic Authorization header) for a scoped Bearer
access token. `scope` is a space-separated list, e.g.
"owner_read owner_update". Public clients (e.g. browser JavaScript)
should not expose client_secret.
security: []
parameters:
- name: Authorization
in: header
required: true
description: 'Basic base64(client_id:client_secret)'
schema:
type: string
requestBody:
required: true
content:
application/x-www-form-urlencoded:
schema:
type: object
required:
- grant_type
- username
- password
properties:
grant_type:
type: string
enum: [password]
username:
type: string
password:
type: string
scope:
type: string
description: Space-separated list of requested scopes (e.g. owner_read, owner_update, usercard_read, menu_read, report_read).
responses:
'200':
description: Access token issued.
content:
application/json:
schema:
$ref: '#/components/schemas/TokenResponse'
'401':
$ref: '#/components/responses/Unauthorized'
/owner:
get:
operationId: listOwners
tags:
- Owners
summary: List active owners
description: Returns all active owner (pet parent) accounts. Requires the owner_read scope.
responses:
'200':
description: A list of owners.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Owner'
'401':
$ref: '#/components/responses/Unauthorized'
/owner/{owner_id}:
parameters:
- $ref: '#/components/parameters/OwnerId'
get:
operationId: getOwner
tags:
- Owners
summary: Get owner information
description: Retrieves a single owner's account information. Requires the owner_read scope.
responses:
'200':
description: The requested owner.
content:
application/json:
schema:
$ref: '#/components/schemas/Owner'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/search/owners/{search_criteria}/page/{page_number}/data/{data_per_page}:
get:
operationId: searchOwners
tags:
- Owners
summary: Search owners
description: Keyword search across owners, paginated.
parameters:
- name: search_criteria
in: path
required: true
schema:
type: string
- $ref: '#/components/parameters/PageNumber'
- $ref: '#/components/parameters/DataPerPage'
responses:
'200':
description: A page of matching owners.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Owner'
'401':
$ref: '#/components/responses/Unauthorized'
/pet/{pet_id}:
parameters:
- $ref: '#/components/parameters/PetId'
get:
operationId: getPet
tags:
- Pets
summary: Get pet information
description: Retrieves a single pet profile.
responses:
'200':
description: The requested pet.
content:
application/json:
schema:
$ref: '#/components/schemas/Pet'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
delete:
operationId: deletePet
tags:
- Pets
summary: Delete a pet
description: Deletes a pet profile.
responses:
'200':
description: Deletion confirmation.
content:
application/json:
schema:
$ref: '#/components/schemas/DeleteResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/pet-type/:
get:
operationId: listPetTypes
tags:
- Pets
summary: List pet types
description: Lists the pet types configured for the company (e.g. Dog, Cat).
responses:
'200':
description: A list of pet types.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/PetType'
'401':
$ref: '#/components/responses/Unauthorized'
/breed/pet-type/{pet_type_id}:
get:
operationId: listBreedsForPetType
tags:
- Pets
summary: List breeds for a pet type
description: >-
Lists breeds available for a given pet type. Note: the official
example (JavaScript/pet_breed/get_pet_breed.js) names its path
variable "petid" but uses it as a pet-type identifier; documented here
as pet_type_id for clarity.
parameters:
- name: pet_type_id
in: path
required: true
schema:
type: string
responses:
'200':
description: A list of breeds.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Breed'
'401':
$ref: '#/components/responses/Unauthorized'
/search/pets/{search_criteria}/page/{page_number}/data/{data_per_page}:
get:
operationId: searchPets
tags:
- Pets
summary: Search pets
description: Keyword search across pets, paginated.
parameters:
- name: search_criteria
in: path
required: true
schema:
type: string
- $ref: '#/components/parameters/PageNumber'
- $ref: '#/components/parameters/DataPerPage'
responses:
'200':
description: A page of matching pets.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Pet'
'401':
$ref: '#/components/responses/Unauthorized'
/vet/:
get:
operationId: listVets
tags:
- Pets
summary: List vets
description: Lists the veterinarians recorded for the company's pets.
responses:
'200':
description: A list of vets.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Vet'
'401':
$ref: '#/components/responses/Unauthorized'
/boarding/{boarding_id}:
parameters:
- $ref: '#/components/parameters/BoardingId'
get:
operationId: getBoarding
tags:
- Boarding
summary: Get a boarding reservation
responses:
'200':
description: The requested boarding reservation.
content:
application/json:
schema:
$ref: '#/components/schemas/Reservation'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
delete:
operationId: deleteFutureBoarding
tags:
- Boarding
summary: Delete a future boarding reservation
responses:
'200':
description: Deletion confirmation.
content:
application/json:
schema:
$ref: '#/components/schemas/DeleteResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/boarding/packages/owner/{owner_id}:
get:
operationId: getOwnerBoardingPackages
tags:
- Boarding
summary: Get an owner's boarding packages
parameters:
- $ref: '#/components/parameters/OwnerId'
responses:
'200':
description: The owner's boarding packages.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/BoardingPackage'
'401':
$ref: '#/components/responses/Unauthorized'
/boarding/services:
get:
operationId: listBoardingServices
tags:
- Boarding
summary: List boarding services
responses:
'200':
description: A list of boarding services.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Service'
'401':
$ref: '#/components/responses/Unauthorized'
/daycare/{daycare_id}:
parameters:
- $ref: '#/components/parameters/DaycareId'
get:
operationId: getDaycare
tags:
- Daycare
summary: Get a daycare reservation
responses:
'200':
description: The requested daycare reservation.
content:
application/json:
schema:
$ref: '#/components/schemas/Reservation'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
delete:
operationId: deleteFutureDaycare
tags:
- Daycare
summary: Delete a future daycare reservation
responses:
'200':
description: Deletion confirmation.
content:
application/json:
schema:
$ref: '#/components/schemas/DeleteResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/daycare/services/:
get:
operationId: listDaycareServices
tags:
- Daycare
summary: List daycare and lunch services
responses:
'200':
description: A list of daycare services.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Service'
'401':
$ref: '#/components/responses/Unauthorized'
/grooming/{grooming_id}:
parameters:
- $ref: '#/components/parameters/GroomingId'
get:
operationId: getGrooming
tags:
- Grooming
summary: Get a grooming reservation
responses:
'200':
description: The requested grooming reservation.
content:
application/json:
schema:
$ref: '#/components/schemas/Reservation'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
delete:
operationId: deleteFutureGrooming
tags:
- Grooming
summary: Delete a future grooming reservation
responses:
'200':
description: Deletion confirmation.
content:
application/json:
schema:
$ref: '#/components/schemas/DeleteResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/grooming/groomers:
get:
operationId: listGroomers
tags:
- Grooming
summary: List company groomers
responses:
'200':
description: A list of groomers.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Employee'
'401':
$ref: '#/components/responses/Unauthorized'
/grooming/services/:
get:
operationId: listGroomingServices
tags:
- Grooming
summary: List grooming services
responses:
'200':
description: A list of grooming services.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Service'
'401':
$ref: '#/components/responses/Unauthorized'
/scheduled-service/{scheduled_service_id}:
delete:
operationId: deleteFutureScheduledService
tags:
- Scheduled Services
summary: Delete a future scheduled service
parameters:
- name: scheduled_service_id
in: path
required: true
schema:
type: string
responses:
'200':
description: Deletion confirmation.
content:
application/json:
schema:
$ref: '#/components/schemas/DeleteResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/scheduled-service/service-types/:
get:
operationId: listScheduledServiceTypes
tags:
- Scheduled Services
summary: List scheduled-service types
responses:
'200':
description: A list of scheduled-service types.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/ServiceType'
'401':
$ref: '#/components/responses/Unauthorized'
/scheduled-service/services/:
get:
operationId: listScheduledServices
tags:
- Scheduled Services
summary: List scheduled-service types and services
responses:
'200':
description: A list of scheduled services.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Service'
'401':
$ref: '#/components/responses/Unauthorized'
/scheduled-service/services/{service_type_id}:
get:
operationId: listServicesByServiceType
tags:
- Scheduled Services
summary: List services for a scheduled-service type
parameters:
- name: service_type_id
in: path
required: true
schema:
type: string
responses:
'200':
description: A list of services for the given type.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Service'
'401':
$ref: '#/components/responses/Unauthorized'
/calendar/boarding/start/{start_date}/end/{end_date}:
get:
operationId: getCompanyBoardingsScheduled
tags:
- Calendar
summary: Get company boardings scheduled in a date range
parameters:
- $ref: '#/components/parameters/StartDate'
- $ref: '#/components/parameters/EndDate'
responses:
'200':
description: Scheduled boardings.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Reservation'
'401':
$ref: '#/components/responses/Unauthorized'
/calendar/daycare/start/{start_date}/end/{end_date}:
get:
operationId: getCompanyDaycaresScheduled
tags:
- Calendar
summary: Get company daycares scheduled in a date range
parameters:
- $ref: '#/components/parameters/StartDate'
- $ref: '#/components/parameters/EndDate'
responses:
'200':
description: Scheduled daycares.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Reservation'
'401':
$ref: '#/components/responses/Unauthorized'
/calendar/grooming/start/{start_date}/end/{end_date}:
get:
operationId: getCompanyGroomingsScheduled
tags:
- Calendar
summary: Get company groomings scheduled in a date range
parameters:
- $ref: '#/components/parameters/StartDate'
- $ref: '#/components/parameters/EndDate'
responses:
'200':
description: Scheduled groomings.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Reservation'
'401':
$ref: '#/components/responses/Unauthorized'
/calendar/scheduled-service/start/{start_date}/end/{end_date}:
get:
operationId: getCompanyScheduledServicesScheduled
tags:
- Calendar
summary: Get company scheduled services scheduled in a date range
parameters:
- $ref: '#/components/parameters/StartDate'
- $ref: '#/components/parameters/EndDate'
responses:
'200':
description: Scheduled services.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Reservation'
'401':
$ref: '#/components/responses/Unauthorized'
/calendar/owner/{owner_id}/boarding/start/{start_date}/end/{end_date}:
get:
operationId: getOwnerBoardingsScheduled
tags:
- Calendar
summary: Get an owner's boardings scheduled in a date range
parameters:
- $ref: '#/components/parameters/OwnerId'
- $ref: '#/components/parameters/StartDate'
- $ref: '#/components/parameters/EndDate'
responses:
'200':
description: The owner's scheduled boardings.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Reservation'
'401':
$ref: '#/components/responses/Unauthorized'
/calendar/owner/{owner_id}/daycare/start/{start_date}/end/{end_date}:
get:
operationId: getOwnerDaycaresScheduled
tags:
- Calendar
summary: Get an owner's daycares scheduled in a date range
parameters:
- $ref: '#/components/parameters/OwnerId'
- $ref: '#/components/parameters/StartDate'
- $ref: '#/components/parameters/EndDate'
responses:
'200':
description: The owner's scheduled daycares.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Reservation'
'401':
$ref: '#/components/responses/Unauthorized'
/calendar/owner/{owner_id}/grooming/start/{start_date}/end/{end_date}:
get:
operationId: getOwnerGroomingsScheduled
tags:
- Calendar
summary: Get an owner's groomings scheduled in a date range
parameters:
- $ref: '#/components/parameters/OwnerId'
- $ref: '#/components/parameters/StartDate'
- $ref: '#/components/parameters/EndDate'
responses:
'200':
description: The owner's scheduled groomings.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Reservation'
'401':
$ref: '#/components/responses/Unauthorized'
/calendar/owner/{owner_id}/scheduled-service/start/{start_date}/end/{end_date}:
get:
operationId: getOwnerScheduledServicesScheduled
tags:
- Calendar
summary: Get an owner's scheduled services scheduled in a date range
parameters:
- $ref: '#/components/parameters/OwnerId'
- $ref: '#/components/parameters/StartDate'
- $ref: '#/components/parameters/EndDate'
responses:
'200':
description: The owner's scheduled services.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Reservation'
'401':
$ref: '#/components/responses/Unauthorized'
/shot/{shot_id}:
parameters:
- name: shot_id
in: path
required: true
schema:
type: string
get:
operationId: getShot
tags:
- Vaccinations
summary: Get a vaccination (shot) record
responses:
'200':
description: The requested shot record.
content:
application/json:
schema:
$ref: '#/components/schemas/Shot'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
delete:
operationId: deleteShot
tags:
- Vaccinations
summary: Delete a vaccination (shot) record
responses:
'200':
description: Deletion confirmation.
content:
application/json:
schema:
$ref: '#/components/schemas/DeleteResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/shot/pet-type/{pet_id}:
get:
operationId: getShotsForPetType
tags:
- Vaccinations
summary: Get all shots for a selected pet type
parameters:
- $ref: '#/components/parameters/PetId'
responses:
'200':
description: A list of shots configured for the pet type.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Shot'
'401':
$ref: '#/components/responses/Unauthorized'
/user-card/owner/{owner_id}:
get:
operationId: getOwnerCreditCards
tags:
- Credit Cards
summary: Get all credit cards for an owner
description: >-
Requires the usercard_read scope. PetExec's own examples are
inconsistent between "user-card" (this GET) and "userCard" (used by
the delete example below); both forms appear in the official
API-Examples repository.
parameters:
- $ref: '#/components/parameters/OwnerId'
responses:
'200':
description: A list of the owner's stored credit cards.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/CreditCard'
'401':
$ref: '#/components/responses/Unauthorized'
/user-card/{card_id}/owner/{owner_id}:
get:
operationId: getOwnerCreditCard
tags:
- Credit Cards
summary: Get a single credit card for an owner
parameters:
- name: card_id
in: path
required: true
schema:
type: string
- $ref: '#/components/parameters/OwnerId'
responses:
'200':
description: The requested credit card.
content:
application/json:
schema:
$ref: '#/components/schemas/CreditCard'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/userCard/{card_id}:
delete:
operationId: deleteCreditCard
tags:
- Credit Cards
summary: Delete a credit card
parameters:
- name: card_id
in: path
required: true
schema:
type: string
responses:
'200':
description: Deletion confirmation.
content:
application/json:
schema:
$ref: '#/components/schemas/DeleteResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/purchase-history/owner/{owner_id}:
get:
operationId: getPurchaseHistory
tags:
- Purchase History
summary: Get an owner's purchase history
parameters:
- $ref: '#/components/parameters/OwnerId'
responses:
'200':
description: The owner's purchase history.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/PurchaseHistoryEntry'
'401':
$ref: '#/components/responses/Unauthorized'
/report/billing-report/{start_date}/{end_date}/{pay_type}/{owner_portal}:
get:
operationId: getBillingReport
tags:
- Reports
summary: Get a billing report
description: Requires the report_read scope.
parameters:
- $ref: '#/components/parameters/StartDate'
- $ref: '#/components/parameters/EndDate'
- name: pay_type
in: path
required: true
description: >-
All Types, Cash, Check, Credit, Clover Mini, Gift Certificate, No
Payment, Paw Point Redemption, Refund, Tradeout, or Unprocessed.
schema:
type: string
- name: owner_portal
in: path
required: true
description: 'yes or no'
schema:
type: string
enum: [yes, 'no']
responses:
'200':
description: The billing report.
content:
application/json:
schema:
type: object
additionalProperties: true
'401':
$ref: '#/components/responses/Unauthorized'
/report/statistics-report/{start_date}/{end_date}/{taxable_only}:
get:
operationId: getStatisticsReport
tags:
- Reports
summary: Get a statistics report
parameters:
- $ref: '#/components/parameters/StartDate'
- $ref: '#/components/parameters/EndDate'
- name: taxable_only
in: path
required: true
description: 'yes or no'
schema:
type: string
enum: [yes, 'no']
responses:
'200':
description: The statistics report.
content:
application/json:
schema:
type: object
additionalProperties: true
'401':
$ref: '#/components/responses/Unauthorized'
/report/statistics-report/{start_date}/{end_date}/breakdown/{pay_type}:
get:
operationId: getStatisticsReportByPayType
tags:
- Reports
summary: Get a statistics report broken down by payment type
parameters:
- $ref: '#/components/parameters/StartDate'
- $ref: '#/components/parameters/EndDate'
- name: pay_type
in: path
required: true
description: >-
Cash, Check, Credit, Clover Mini, Tradeout, Refund, No Payment,
Gift Certificate, Paw Point Redemption, Not Processed, Discount,
Tax, or Tip / Gratuity.
schema:
type: string
responses:
'200':
description: The statistics report broken down by payment type.
content:
application/json:
schema:
type: object
additionalProperties: true
'401':
$ref: '#/components/responses/Unauthorized'
/report/statistics-report/{start_date}/{end_date}/breakdown/service/{service_id}:
get:
operationId: getStatisticsReportByServiceType
tags:
- Reports
summary: Get a statistics report broken down by service
parameters:
- $ref: '#/components/parameters/StartDate'
- $ref: '#/components/parameters/EndDate'
- name: service_id
in: path
required: true
schema:
type: integer
responses:
'200':
description: The statistics report broken down by service.
content:
application/json:
schema:
type: object
additionalProperties: true
'401':
$ref: '#/components/responses/Unauthorized'
/company/locations:
get:
operationId: getCompanyLocations
tags:
- Company
summary: Get company locations
responses:
'200':
description: A list of company locations.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Location'
'401':
$ref: '#/components/responses/Unauthorized'
/company/employees/:
get:
operationId: getCompanyEmployees
tags:
- Company
summary: Get company employees
responses:
'200':
# --- truncated at 32 KB (38 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/petexec/refs/heads/main/openapi/petexec-openapi.yml