The recipe object
Recipes are scraped from sites that publish them however they like, then normalized into one object. This is that object.
One shape, everywhere
GET /recipes, GET /recipes/{id}, GET /search and GET /popular all return it. Search adds a score, popular adds a popularityScore; nothing else differs.
Reading a recipe
There are two ways in, and they hold the same content.
- Structured.
ingredientsis parsed into quantities, units, names and preparation;instructionsis numbered steps. Use this to compute with — scaling, shopping lists, filtering. - Flat.
text.ingredientsandtext.instructionsare plain lines, in order, ready to render. Use this to display.
An ingredient's display is the line to show. It is written back from the structured fields in the recipe's own language, so a Swedish recipe stays Swedish even though name and ingredientId are canonical English. That is what makes “tomat”, “Tomate” and “tomato” groupable without translating anyone's recipe.
Every duration is { seconds } — never “1 hr 20 mins”. Format it yourself and you can format it in any language.
Absent means unknown
An optional field that is missing means the source did not say, not that the answer is zero or false. This matters most for dietary: vegan: false is a known no, while no vegan key at all means nobody has established it. Its source tells you whether the site declared the flags or the pipeline inferred them from the ingredients.
The same is true of nutrition, whose source is provided or calculated, and whose basis says whether the numbers are per serving, per recipe or per 100 g. Do not compare two recipes' nutrition without checking both.
Every field
allergensstring[]optionalEU-declarable allergens found in the recipe, from the list served by GET /vocabularies.
authorobjectoptionalWho wrote the recipe, and a link to them when the site published one.
categoriesstring[]Normalized category slugs from an open set, such as "pasta" or "soup". The value the `category` filter takes.
coursesstring[]Course slugs from the closed list. The value the `course` filter takes.
createdAtstringWhen the recipe first entered the database. ISO 8601.
cuisinesstring[]Cuisine slugs from the closed list. The value the `cuisine` filter takes.
descriptionstringoptionalThe recipe’s own summary.
dietaryobjectoptionalDietary flags. A missing flag is unknown; false is a known no. `source` says whether the site declared them or the pipeline inferred them from the ingredients.
equipmentstring[]optionalEquipment the recipe calls for, as words rather than slugs.
idstringThe recipe id.
One ingredient line, parsed. The source line is not returned; `display` is the line written back from these fields, in the recipe’s own language.
One step. The text is authoritative; everything else on a step comes from enrichment and may be absent.
languagestringThe language the recipe is written in, as a two-letter ISO 639-1 code.
Images and videos. An image carries a `role` of hero, gallery, step or thumbnail; a video carries gallery or step. A recipe has at most one hero image.
Nutrition, either as the site published it or calculated from the ingredients — `source` says which. `basis` says whether the numbers are per serving, per recipe or per 100 g.
ratingobjectoptionalThe rating the source published, with how many people rated it.
servingsobjectoptionalHow much the recipe makes. "Serves 4-6" is a quantity of 4 with a max of 6; "Makes 24 cookies" is a quantity of 24 with a unit of "cookie".
tagsstring[]The source site’s own keywords, cleaned but not mapped to any vocabulary.
techniquesstring[]optionalTechniques the recipe uses, as words rather than slugs.
The recipe as plain lines: every ingredient’s `display` and every step’s `text`, in order. A convenience for rendering; nothing here is missing from the structured fields.
Preparation, cooking, inactive and total time, each in seconds.
titlestringThe recipe title.
updatedAtstringWhen the recipe was last written. ISO 8601.
urlstringThe page the recipe was read from. One source URL is one recipe.
A whole recipe
A real response from GET /recipes/{id}.
{
"recipe": {
"id": "6a9820e58f8122ec891b68a3",
"author": {
"name": "Lindsay Ostrom",
"url": "https://pinchofyum.com/about"
},
"description": "This peanut butter dark chocolate hummus is a sweet alternative to traditional hummus. Perfect served on graham crackers as an afternoon snack!",
"instructions": [
{
"step": 1,
"text": "Blend everything through milk in a food processor."
},
{
"step": 2,
"text": "Add flour by the spoonful and blend until desired consistency is reached."
},
{
"step": 3,
"text": "Stir in dark chocolate."
},
{
"step": 4,
"text": "Chill before serving."
}
],
"language": "en",
"media": [
{
"id": "hero",
"role": "hero",
"type": "image",
"url": "https://pinchofyum.com/tachyon/2011/05/Peanut-Butter-Dark-Chocolate-Hummus.jpeg?fit=225%2C225",
"variants": [
{
"url": "https://pinchofyum.com/tachyon/2011/05/Peanut-Butter-Dark-Chocolate-Hummus.jpeg?fit=195%2C195"
},
{
"url": "https://pinchofyum.com/tachyon/2011/05/Peanut-Butter-Dark-Chocolate-Hummus.jpeg?fit=180%2C180"
},
{
"url": "https://pinchofyum.com/tachyon/2011/05/Peanut-Butter-Dark-Chocolate-Hummus.jpeg"
}
]
}
],
"nutrition": {
"basis": {
"type": "serving"
},
"calories": {
"unit": "kcal",
"value": 201
},
"carbohydrates": {
"unit": "g",
"value": 29.4
},
"cholesterol": {
"unit": "mg",
"value": 0.8
},
"fat": {
"unit": "g",
"value": 7.4
},
"fiber": {
"unit": "g",
"value": 3.3
},
"micronutrients": {
"trans-fat": {
"unit": "g",
"value": 0
}
},
"protein": {
"unit": "g",
"value": 5.6
},
"saturatedFat": {
"unit": "g",
"value": 2.5
},
"sodium": {
"unit": "mg",
"value": 76
},
"source": "provided",
"sugar": {
"unit": "g",
"value": 16.9
}
},
"rating": {
"count": 1,
"reviewCount": 1,
"value": 5
},
"servings": {
"max": 8,
"original": "6-8",
"quantity": 6
},
"times": {
"cook": {
"seconds": 600
},
"prep": {
"seconds": 300
},
"total": {
"seconds": 900
}
},
"title": "Peanut Butter Dark Chocolate Hummus",
"categories": [],
"courses": [
"dessert"
],
"createdAt": "2026-09-02T13:13:09.089Z",
"cuisines": [
"american"
],
"ingredients": [
{
"display": "1 can white beans or chickpeas, rinsed",
"name": "white beans or chickpeas",
"optional": false,
"preparation": "rinsed",
"quantity": {
"unit": "can",
"value": 1
}
},
{
"display": "¼ cup peanut butter",
"name": "peanut butter",
"optional": false,
"quantity": {
"unit": "cup",
"value": 0.25
}
},
{
"display": "2 tbsp caramel sauce",
"name": "caramel sauce",
"optional": false,
"quantity": {
"unit": "tbsp",
"value": 2
}
},
{
"display": "2 tbsp maple syrup",
"name": "maple syrup",
"optional": false,
"quantity": {
"unit": "tbsp",
"value": 2
}
},
{
"display": "¼ cup brown sugar",
"name": "brown sugar",
"optional": false,
"quantity": {
"unit": "cup",
"value": 0.25
}
},
{
"display": "pinch of cinnamon",
"name": "pinch of cinnamon",
"optional": false
},
{
"display": "¼ cup milk",
"name": "milk",
"optional": false,
"quantity": {
"unit": "cup",
"value": 0.25
}
},
{
"display": "¼ cup flour",
"name": "flour",
"optional": false,
"quantity": {
"unit": "cup",
"value": 0.25
}
},
{
"display": "chopped dark chocolate",
"name": "chopped dark chocolate",
"optional": false
}
],
"tags": [
"chocolate hummus",
"peanut butter hummus",
"peanut butter chocolate",
"hummus recipe",
"dessert hummus"
],
"text": {
"ingredients": [
"1 can white beans or chickpeas, rinsed",
"¼ cup peanut butter",
"2 tbsp caramel sauce",
"2 tbsp maple syrup",
"¼ cup brown sugar",
"pinch of cinnamon",
"¼ cup milk",
"¼ cup flour",
"chopped dark chocolate"
],
"instructions": [
"Blend everything through milk in a food processor.",
"Add flour by the spoonful and blend until desired consistency is reached.",
"Stir in dark chocolate.",
"Chill before serving."
]
},
"updatedAt": "2026-09-06T01:11:59.223Z",
"url": "https://pinchofyum.com/pb-dark-chocolate-hummus"
}
}