Pet diet (public)
Members can record what each of their pets eats. An owner may choose to show the pet’s current food publicly, for
example on the pet’s public page or an animal listing. This read gives you that public part, and nothing else: it is
404 for every pet whose owner did not opt in.
Read a pet’s current food
Section titled “Read a pet’s current food”GET /api/diet/v1/public/animals/{animalId}/dietAnonymous: no token. animalId is the pet’s id (a UUID). Responses use the standard envelope (data, resultCode);
properties whose value is null are left out.
| Answer | When | data |
|---|---|---|
200, resultCode Diet_Public_GT_Resource_SU | The owner shows the pet’s food publicly. | the public diet (below) |
404, Diet_Public_GT_Resource_FL | The owner has not opted in, no diet is recorded, or there is no such pet. The three are not told apart. | none |
The same answer is served at GET /api/diet/v1/animals/{animalId}/diet/public for callers that already send a signed-in
United Pet Club token. Use the anonymous route unless you have that token anyway.
The public diet
Section titled “The public diet”{ "data": { "animalId": "…", "since": "2026-10-01", "items": [ { "roleCode": "MAIN", "foodKindCode": "KIBBLE", "sourceCode": "PET_FOOD", "productName": "…", "brandName": "…", "petFoodProductId": "…", "petFoodVariantId": "…", "startedOn": "2026-10-01" }, { "roleCode": "TOPPER", "foodKindCode": "HOME_MADE_RECIPE", "sourceCode": "RECIPE", "recipeId": "…", "startedOn": "2026-10-01" } ] }, "resultCode": "Diet_Public_GT_Resource_SU"}The values above illustrate the shape; ids and names are elided.
| Property | Meaning |
|---|---|
animalId | The pet. |
since | The day the current diet started (YYYY-MM-DD). |
items | The foods the pet eats now, in the owner’s order. Foods the owner stopped are not listed. |
items[].roleCode | MAIN, TREAT, SUPPLEMENT, TOPPER or MEDICATED. |
items[].foodKindCode | KIBBLE, WET, RAW, FREEZE_DRIED, DEHYDRATED, FRESH_COOKED, HOME_MADE_RECIPE, TREAT, CHEW, SUPPLEMENT, TOPPER or MILK_REPLACER. |
items[].sourceCode | PET_FOOD (a food from the pet-food catalog), RECIPE (a recipe from the recipes catalog) or CUSTOM (described by the owner). |
items[].productName, items[].brandName | The catalog names, for a PET_FOOD item whose product is public. |
items[].petFoodProductId, items[].petFoodVariantId | The catalog product and package, for the same items. Read the label with GET /api/pet-food/v1/products/{petFoodProductId}. |
items[].recipeId | The recipe, for a RECIPE item. |
items[].startedOn | The day the pet started on this food (YYYY-MM-DD). |
What is never in it
Section titled “What is never in it”- Amounts, schedules, preparation and notes. The public diet says what, never how much or when.
- Prescriptions and recalls. Whether a food is a prescription diet, and any recall notice on it, stay private to the owner and the people they share the pet with.
- Foods not yet in the public catalog. A food the owner added that is still waiting for review is listed by its role and kind only: no names, no catalog ids.
- Names of custom foods. A
CUSTOMitem is listed by its role and kind only.
Show an item without names by its kind (for example “Kibble” for KIBBLE).
Things to know
Section titled “Things to know”- It can disappear at any time. The owner can turn public sharing off; when a pet changes owner, sharing is turned
off until the new owner turns it on. Treat a
404as “nothing to show”, and do not keep a copy longer than you would keep any other public page content. - It changes when the diet changes. A new diet gets a new
since; read it again rather than assuming a food is still fed.
Food statistics
Section titled “Food statistics”Members’ pets’ foods and recorded outcomes count in totals about each catalog food (pet food research, part of the United Pet Club Platform Agreement). Two anonymous reads return those totals, and nothing else: every number covers at least 10 pets, is rounded to the nearest 5, and numbers that would let someone work out a smaller group are withheld too. There is no row-level data and no export.
What pets like mine eat
Section titled “What pets like mine eat”GET /api/diet/v1/public/research/foods?species=DOG&breedGroup=MEDIUM&ageBand=ADULT&take=10| Parameter | Values |
|---|---|
species | Required. A species code from the pet-food catalog, for example DOG or CAT. |
breedGroup | Optional. The breed’s size class: TOY, SMALL, MEDIUM, LARGE, GIANT, MIXED, UNKNOWN. |
ageBand | Optional. Age when the pet started the food: JUNIOR (under 1 year), ADULT (1 to 7), SENIOR (7 and over), UNKNOWN. |
take | 1 to 50 foods, default 10. |
An unknown code answers 400 Diet_Research_VL_Request_RJ. Otherwise 200 Diet_Research_GT_Resource_SU with data:
| Property | Meaning |
|---|---|
speciesCode, breedGroupCode, ageBandCode | The filters applied. |
level | 0 species only, 1 one filter, 2 both filters. |
builtAtUtc | When the statistics were last rebuilt (nightly); null before the first build. |
threshold, roundedTo | 10 and 5. |
disclaimerCode | Diet_Disclaimer_GT_Research_SU, the “statistics, not advice” notice: show it with the numbers (Using the statistics). |
foods[] | Most-eaten first: productId, productName, brandName, productSlug, petCount, outcomes, medianDaysOnFood. |
outcomes is { improved, noChange, worsened, notAssessed }: each pet’s latest outcome on the food, as its owner
recorded it. A null count is withheld, not zero: show it as “withheld” and never compute it from the others.
medianDaysOnFood is rounded to 5 days, or null.
One food’s statistics
Section titled “One food’s statistics”GET /api/diet/v1/public/research/products/{productId}Always 200. data = { productId, builtAtUtc, threshold, roundedTo, disclaimerCode, species[], shifts[] }. Each
species[] entry has speciesCode, petCount, outcomes, medianDaysOnFood and breakdowns[]
({ dimensionCode, cells[{ value, petCount, outcomes, medianDaysOnFood }] } for BREED_GROUP, AGE_BAND,
SEX_NEUTER, TIME_ON_FOOD, CONDITION). Each shifts[] entry compares a reformulation: versionNo, effectiveFrom,
changeNote, and before / after ({ petCount, outcomes }, pets assessed in the year before the new label and since).
Empty lists mean nothing is published for that food yet. A missing breakdown row is withheld.
Using the statistics
Section titled “Using the statistics”- Both reads send
Cache-Control: public, max-age=900; the numbers change at most once a night. - Always show the disclaimer: the numbers come from owners who chose to share, are not veterinary advice and are not a ranking of food quality.
- Do not combine readings over time to infer changes for small groups, and do not present a count as exact.