Skip to content

API reference

The authoritative reference for the Partner API is the OpenAPI 3 document the API itself serves — it is generated from the running code, so it can never drift from behaviour:

WhatWhere
Interactive console (Swagger UI, Try it out enabled)https://api.unitedpetclub.com/docs
OpenAPI documenthttps://api.unitedpetclub.com/openapi/v1/spec.json
OAuth discovery (RFC 9728; not part of the OpenAPI document)https://api.unitedpetclub.com/.well-known/oauth-protected-resource — see Discovery metadata

Use the document to generate a client in your language of choice. Every operation carries two extensions you will not find in a generic spec:

  • x-required-scope — the scope your application needs (see Authentication).
  • x-required-permission — the account-level permission the operation also needs.

The servers entry in the document is whatever origin served it, so a spec fetched from api.unitedpetclub.com targets production.

  • Paths are /api/{resource}/v1/{collection}; ids are UUIDs.
  • Lists accept page (1-based, default 1) and pageSize (1–100, default 20) and return { "data": [...], "pagination": { "page", "pageSize", "total" } }. Out-of-range values are a 400. See Pagination.
  • Creates return 201 Created with a Location header pointing at the new resource; deletes return 204 No Content.
  • All timestamps are ISO 8601 UTC.
  • Errors are application/problem+json — see Errors.
ResourcePath prefixOperationsScope
Animals/api/animal/v1/animalslist (filter species), get, create, update (PATCH), archive (DELETE)animal:read / animal:write
Invoices/api/billing/v1/platform-invoices, /api/billing/v1/client-invoices (/invoices = platform invoices)list, getbilling:read
Breeding records/api/breeding/v1/recordslist (filter animalId), getbreeding:read
Messages to clients/api/communication/v1/messagessend (in-app, to one of the business’s clients)communication:send
Content items/api/content/v1/itemslist (filter kind), getcontent:read
Health records/api/health/v1/recordslist (animalId required), get — a business’s pets only, see belowhealth:read
Inventory items/api/inventory/v1/itemslist (filter sku), getinventory:read
Marketplace offers/api/marketplace/v1/offers (/listings is an alias)list (filter status, kind, catalogCategoryId), getmarketplace:read
Sales/api/order/v1/sales (/orders is an alias)list (filter status), getorder:read
Business profiles/api/profile/v1/profileslist (filter kind), getprofile:read
Social channels/api/social-channel/v1/channelslist (filter provider, status), getsocial-channel:read
Social posts/api/social-publishing/v1/postslist, getsocial-publishing:read
Social engagement/api/social-engagement/v1/posts/{externalPostId}/metrics, …/channels/{channelId}/threadslatest metrics, threadssocial-engagement:read

Every resource in the table above acts for the business that connected your app, exactly like the Partner API below:

  • The token must come from the authorization-code grant. A token your app gets for itself with client credentials acts for no business and answers 403 0010010000406.
  • The business must keep a valid payment card on file (the API is free); without one, 403 0010010000407.
  • The business grants the scope on the consent page. Your app declares the scopes it needs when you register it under Account → Developer → Applications, and the consent page offers the business those it declared. The booking scopes work at once; the business-resource scopes (animals, invoices, messages, social and the rest) are offered only after United Pet Club approved a review of your app’s current scopes, so submit the app for review once it declares them (adding a scope later needs a new review). United Pet Club can suspend an app that misuses the API (its tokens then answer 401 0010010000402). An app that registered itself can ask only for the booking scopes of the Partner API.
  • You see and change only that business’s data. There is no business or account id to pass, and a resource of another business answers 404, exactly like one that does not exist.

Social resources are the business’s too: the social accounts the business connected and the posts it owns, not those of your developer profile. Connecting or disconnecting a social account and publishing posts happen in the United Pet Club apps, not through this API.

The contracts of 2026-10-18 (every resource above except health records) and the consent scopes for all of them, health:read included, are available: a business can grant them on the consent page, and your app can call them with that business’s token. The Changelog lists what changed on 2026-10-18.

Health records are medical records, so they are read for a business, about that business’s own pets:

  • The token must come from the authorization-code grant: it acts for the business that connected your app, which must keep a valid payment card on file. A token your app gets for itself acts for no business and answers 403 0010010000406; without a card on file, 403 0010010000407.
  • The business must own the pet (owner of record or co-owner) or hold full care-circle access to it. Limited access, the kind a groomer or trainer gets, does not include medical records, and a previous owner sees nothing.
  • For any other pet, listing its records answers 403 0010010000405, and a record by id answers 404, exactly like a record that does not exist.
  • If United Pet Club cannot check the pet at that moment, the call answers 503 0010010000503 with Retry-After; retry later. It never answers records it could not check.

Partner API (a business connected your app)

Section titled “Partner API (a business connected your app)”

These routes act for the business whose authorization the token carries; they need a token from the authorization-code grant, and the business must keep a valid payment card on file (they are free; without a card they answer 403 0010010000407). The booking guide walks through them.

ResourcePath (under /api/scheduling/v1)OperationsScope
The business/businessgetscheduling:read
Services/serviceslistscheduling:read
Open slots/services/{serviceId}/slotslist (from, to; latitude, longitude, postalCode for mobile)scheduling:read
Booking options/booking-optionsget (serviceId, locale)scheduling:read
Estimates/estimatecreatescheduling:read
Appointments/appointmentslist (from, to, state, limit), get, book (Idempotency-Key), …/reschedule, …/cancelappointment:read / appointment:write
Clients/clients, /clients/{clientId}, /clients/{clientId}/petslist (search, page, pageSize), get, petsclient:read
Webhooks/webhookslist, get, create, delete, …/rotate-secret, …/enable, …/test, …/deliverieswebhook:manage — see Webhooks