Recipes
Published recipes are readable anonymously under /api/recipe/v1/. Reads return the standard
{ data, resultCode } envelope (see Errors); writes (authoring, picks, selling)
require a member session and are not part of the partner surface.
Search recipes
Section titled “Search recipes”GET /api/recipe/v1/recipes/search — published recipes with facet counts.
| Query | Meaning |
|---|---|
q | free text over title, summary and keywords |
species | AnimalTaxonomy species code (D dogs, C cats) |
lifeStage | ALL · JUVENILE · ADULT · SENIOR · PREGNANT · LACTATING |
purpose | EVERYDAY_MEAL · CONDITION_SUPPORT · GENTLE_MEAL · TREAT_TOPPER |
trust | VET_REVIEWED · UPC_RECOMMENDED · PRO_RECOMMENDED (comma-separated = all must hold) |
allergenFree | allergen codes the recipe must NOT contain (CHICKEN, BEEF, DAIRY, EGG, FISH, WHEAT_GLUTEN, SOY, CORN, LAMB, PORK, PEANUT) |
dietary, category, mealType, condition, difficulty, time | further facets (time = max total minutes) |
sort | POPULAR (default) · RATING · NEWEST · TIME · TITLE |
facets | true to include counts |
skip, take | paging (take ≤ 100) |
{ "data": { "items": [{ "id": "…", "title": "Chicken and rice bowl", "slug": "chicken-and-rice-bowl", "feedingPurpose": "GENTLE_MEAL", "accessLevel": "PUBLIC", "isVerified": true, "isUpcRecommended": true, "programSealNumber": "UPCR-2026-000001", "speciesCodes": ["D"], "allergens": ["CHICKEN"], "recommenderKinds": ["VETERINARIAN"], "recommendationCount": 3, "ratingAverage": 4.7, "ratingCount": 12, "caloriesPerServingKcal": 370, "totalTimeMinutes": 30, "heroFileId": "…" }], "totalCount": 1, "skip": 0, "take": 24, "facets": [{ "facet": "PURPOSE", "values": [{ "value": "GENTLE_MEAL", "count": 1 }] }] }, "resultCode": "Recipe_Recipe_GT_Resource_SU"}Private and unlisted recipes are never listed. heroFileId is a media id; resolve it through
the media endpoints like any other picture.
Read a recipe
Section titled “Read a recipe”GET /api/recipe/v1/recipes/by-slug/{slug} (or /recipes/{id}). Alongside the basics you get:
feedingPurpose,maxFeedingDays(Gentle Meal),careLineKey;isVerified(Vet Reviewed) andupcRecommended(sealNumber, dates);defaultVariationwithingredients(each line:quantity,unit,quantityGrams,energyKcal,preparationNote,isOptional),steps,speciesSuitability,conditionLinks,allergenSummary,nutritionSnapshot(caloriesPerServingKcal,energyKcalPer100gof the dish as served,finishedWeightGrams,weightBasis) andnutrientTotalsper batch / serving / 100 g / 1,000 kcal;rating— the review rollup (averageScore,reviewCount,histogram, per-aspect averages) plus the subject triple to post a review through the Review API;recommendations,collaborators,productLinks,offers.
Add ?locale=fr-CA (any platform locale) to receive the author’s translated title / summary when
one exists — isMachineTranslated tells you whether a person reviewed it — and the canonical English
otherwise; locale on the response says which you got and sourceLocale names the language the author
wrote the recipe in (the original every translation is made from — there is never an overlay for it). Ingredient lines, steps and numbers are never
translated per locale: units are the platform’s Unit catalog codes (g, cup_us, …), so render them
with your own unit labels.
Paid recipes (accessLevel: "PAID") return hasFullAccess: false and
accessGate: "PURCHASE_REQUIRED" for anonymous callers: ingredients and steps are empty,
nutrition, offers and trust marks are present. Do not present a teaser as the full recipe.
GET /api/recipe/v1/recipes/{id}/variations/{vid}/portion?species=D&weightKg=20&activity=NEUTERED_ADULT
returns a feeding plan (resting and maintenance energy, the recipe’s daily budget, grams per
day, servings per day, batch days) — a starting point, never a prescription. Activity codes:
GET /api/recipe/v1/lookups/activity-levels.
Verify a seal
Section titled “Verify a seal”GET /api/recipe/v1/program/seals/{sealNumber} (UPCR-YYYY-NNNNNN) returns the certificate:
status (RECOMMENDED is current; SUSPENDED, EXPIRED, REVOKED are not), the recipe
title and slug, purpose, species, recommendedAtUtc, expiresAtUtc and the recipe version
the seal covers. The public page is https://unitedpetclub.com/{locale}/recipes/seal/{sealNumber}.
Ingredients and measures
Section titled “Ingredients and measures”GET /api/recipe/v1/ingredients?q=chicken%20breast&take=20 searches the shared catalog
(curated staples first). Each row carries preparationState (RAW, COOKED, DRIED,
CANNED, …) and energyKcalPer100g. Values are per 100 g of the food in that
preparation — raw and cooked entries of one food are different rows with different calories;
GET /ingredients/{id} lists the alternatives under relatedPreparations, plus the full
nutrientValues (keyed by nutrient code, see GET /nutrients), portions (household measures
with grams and calories) and per-species safety.
GET /api/recipe/v1/ingredients/{id}/measure?quantity=2&unit=cup converts a household measure:
{ "data": { "quantity": 2, "unit": "cup", "grams": 316, "conversionSource": "PORTION", "energyKcalPer100g": 130, "energyKcal": 410.8, "nutrients": [{ "nutrient": "PROTEIN_G", "name": "Protein", "unit": "g", "amountPer100g": 2.7, "amount": 8.53 }], "knownMeasures": [{ "portionName": "1 cup", "gramWeight": 158, "energyKcal": 205.4 }], "note": null }}conversionSource is MASS (g, kg, oz, lb), DENSITY (volume × the ingredient’s density),
PORTION (a known household measure) or NONE — then grams is null and note explains;
use grams or one of knownMeasures. Units are resolved against the platform’s Unit catalog, so unit
comes back as the canonical code (cup → cup_us, gram → g); household measures the catalog does
not model (slice, can) are kept as sent and resolve through the ingredient’s known measures.
Lookups
Section titled “Lookups”GET /api/recipe/v1/lookups/{set} for feeding-purposes, recipe-categories, meal-types,
life-stages, suitability-levels, allergens, dietary-attributes, step-action-types,
activity-levels, access-levels and the other vocabularies; GET /api/recipe/v1/nutrients
for the nutrient dimension (code, unit, group). Pass ?locale= to any lookup and name carries the display
name in that locale (platform fallback chain: locale → language default → en-US); every vocabulary is
translated into all 72 platform locales, and a term with no translation yet returns its English name.
sysName is always the English label; code is the stable key.