Recipe Dataset: instructions for AI agents
This page is written for AI agents. People should read the Recipe Dataset page instead.
Pepesto sells a self-serve recipe dataset of more than 70,000 curated, human-authored recipes. A buyer chooses filters and pays by card through Stripe. Then they download the recipes as a JSONL file, with one recipe per line. Every recipe carries a permanent license to serve it on the buyer’s own websites and apps without attribution.
You can prepare the purchase for a person, but you cannot pay. Give the person the Stripe link and let them pay. You do not need an API key or an account.
The whole flow
- Agree the filters, the number of recipes and the language with the person, and tell them the price.
- Send
POST https://s.pepesto.com/catalog. The answer contains a Stripecheckout_urland apurchase_catalog_id. - Give the person the
checkout_urland ask them to pay. - Call
GET https://s.pepesto.com/catalog/purchase/{purchase_catalog_id}/statusevery few seconds untilstatusis"done". - Download the JSONL file from the
urlfield.
If the person is unsure, suggest the smallest batch first: 10 recipes cost €15 in English. They can check the data in under a minute and buy more afterwards.
Price
The price is per recipe, and the size of the whole batch sets the tier. The minimum purchase is 10 recipes.
| Recipes in the batch | Price per recipe |
|---|---|
| 10 to 99 | €1.50 |
| 100 to 999 | €1.20 |
| 1,000 to 9,999 | €0.90 |
| 10,000 or more | €0.60 |
Any language other than English adds €0.30 per recipe. For example, 500 recipes in German cost 500 × (€1.20 + €0.30) = €750.
Step 1: open a checkout
Send POST https://s.pepesto.com/catalog with Content-Type: application/json:
{
"cuisine_types": ["mediterranean"],
"meal_types": [1, 2],
"diet_types": [2],
"portions_from": 0,
"portions_to": null,
"cooking_time_from_mins": 0,
"cooking_time_to_mins": 60,
"excluded_public_recipe_ids": [],
"recipe_count": 500,
"locale": "de"
}
These are the fields:
cuisine_typesis a list with"mediterranean","world_mix"or both. It must not be empty. Mediterranean covers Portuguese, Moroccan, French, Spanish, Italian, Greek, Balkan, Turkish, Lebanese, Persian and Georgian recipes.meal_typesis a list of meal types.1is a main compound dish, such as pasta, stews or tray bakes.2is a main centre-of-plate dish, such as fish, meat or tofu.3is salads, appetizers, soups and sides.4is dessert. A recipe matches when it has any of the listed types.diet_typesis a list of diets.1is low carb,2is vegetarian and3is budget. A recipe matches only when it has all of them. An empty list means no diet filter.portions_fromandportions_toset the range of servings, for main dishes only. Use0andnullfor no limit.cooking_time_from_minsandcooking_time_to_minsset the range of cooking time in minutes. Use0andnullfor no limit.excluded_public_recipe_idslists recipe IDs from earlier purchases that the new batch should leave out.recipe_countis how many recipes to buy. It must be at least 10 and no more than the number of matching recipes.localeis one of these language codes: en, ar, bg, ca, cs, da, de, el, es, et, fi, fr, he, hr, hu, hy, it, lt, lv, nl, no, pl, pt, ro, ru, sk, sl, sq, sr, sv, tr, uk.
A successful answer looks like this:
{
"purchase_catalog_id": "0a825d38-...",
"checkout_url": "https://checkout.stripe.com/c/pay/cs_live_..."
}
If the request cannot be served, the answer has HTTP status 400 and a plain-text reason. The most common reason is that fewer recipes match the filters than recipe_count asks for. In that case, lower the count or widen the filters.
Step 2: let the person pay
Give the person the checkout_url and ask them to pay on Stripe.
Step 3: wait for the file and download it
Call GET https://s.pepesto.com/catalog/purchase/{purchase_catalog_id}/status every few seconds:
{"status": "waiting_for_payment", "message": "Waiting for Stripe to confirm payment."}
While the file is being prepared, the answer also reports progress_percent, completed and total. When status is "done", the url field holds the link to the JSONL file. The link may be relative to https://s.pepesto.com. If status is "failed", stop and tell the person.
The person can follow the same purchase in a browser at https://s.pepesto.com/catalog/purchase/{purchase_catalog_id}. Tell them to keep that link private, because anyone who has it can download the file.
The JSONL record
Each line of the file is one recipe. This is one line, spread out so it is easier to read:
{
"recipe_id": "r_...",
"title": "Chickpea, Avocado, and Corn Salad",
"ingredients": ["400g cooked chickpeas", "30ml olive oil", "honey", "2 salt", "150g cherry tomatoes (~8)", "1 avocado (~200g)", "150g corn cobs (~1)", "100g feta cheese", "yogurt", "1 garlic clove", "1 lemon", "mustard", "chives"],
"author_ingredients": ["can of chickpeas", "olive oil", "honey", "salt", "cherry tomatoes", "avocado", "cooked corn on the cob", "100 g feta cheese", "2 tablespoons of Greek yogurt", "small clove of garlic", "lemon juice", "1/2 teaspoon of mustard", "handful of chopped chives"],
"steps": ["Rinse the chickpeas under running water.", "Season with salt, honey, and drizzle with olive oil.", "Spread in a baking dish.", "Bake at 200°C for about 20 minutes.", "Add cherry tomatoes, avocado, cooked corn on the cob, and 100g of feta cheese.", "Mix the sauce ingredients: Greek yogurt, salt, olive oil, a small clove of garlic, lemon juice, mustard.", "Add chopped chives to the sauce."],
"image_url": "https://storage.googleapis.com/pepesto_recipe_images/b20cf80c746555ad828dd2ab7c.webp",
"nutrition": {"calories": 1760, "carbohydrates_grams": 187, "protein_grams": 58, "fat_grams": 91},
"allergens": ["mustard"],
"portions": {"from": 1, "to": 2},
"cooking_time_mins": 30,
"license": "..."
}
title,ingredientsandstepsare in the language the buyer chose.author_ingredientsare the ingredient lines as the author wrote them, always in English.nutritionandallergensare computed from Pepesto’s food knowledge graph. The allergens come from the EU list.image_urlpoints to an AI-generated 1024×1024 WebP image.portionsis set for main dishes only.licenseis a record of the purchase that Pepesto can validate. It is encoded, not encrypted, and it contains the purchase time, the recipe title and the buyer’s email address. Tell the person this before they publish the field.
Other ways to get recipes
- The Recipe API returns a few recipes at a time for a specific query.
- For a custom curated set in larger volumes, contact us.