Skip to content

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.

GET /api/recipe/v1/recipes/search — published recipes with facet counts.

QueryMeaning
qfree text over title, summary and keywords
speciesAnimalTaxonomy species code (D dogs, C cats)
lifeStageALL · JUVENILE · ADULT · SENIOR · PREGNANT · LACTATING
purposeEVERYDAY_MEAL · CONDITION_SUPPORT · GENTLE_MEAL · TREAT_TOPPER
trustVET_REVIEWED · UPC_RECOMMENDED · PRO_RECOMMENDED (comma-separated = all must hold)
allergenFreeallergen codes the recipe must NOT contain (CHICKEN, BEEF, DAIRY, EGG, FISH, WHEAT_GLUTEN, SOY, CORN, LAMB, PORK, PEANUT)
dietary, category, mealType, condition, difficulty, timefurther facets (time = max total minutes)
sortPOPULAR (default) · RATING · NEWEST · TIME · TITLE
facetstrue to include counts
skip, takepaging (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.

GET /api/recipe/v1/recipes/by-slug/{slug} (or /recipes/{id}). Alongside the basics you get:

  • feedingPurpose, maxFeedingDays (Gentle Meal), careLineKey;
  • isVerified (Vet Reviewed) and upcRecommended (sealNumber, dates);
  • defaultVariation with ingredients (each line: quantity, unit, quantityGrams, energyKcal, preparationNote, isOptional), steps, speciesSuitability, conditionLinks, allergenSummary, nutritionSnapshot (caloriesPerServingKcal, energyKcalPer100g of the dish as served, finishedWeightGrams, weightBasis) and nutrientTotals per 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.

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}.

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.

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.