# BBC Good Food API

> BBC Good Food returns recipe search results and full recipe details as a workflow and API.

BBC Good Food, also called BBC Food, finds recipes using a dish or ingredient search, with optional diet, result-count and time filters. Get recipe returns ingredients, method steps and nutrition per serving using a dish name or recipe link.

- Page: https://fous.com/tools/bbc-good-food
- Handle: `@bbc-good-food`
- Category: [Food](https://fous.com/tools/category/food)
- Source website: https://bbcgoodfood.com
- Last verified: Sep 29, 2026

## Methods

### Get recipe

Operation `get_recipe`, version 1. 1 credit per completed call. Failed calls without a completed billing receipt are free; completed work can remain charged if delivery is interrupted.

Get a full BBC Good Food recipe by dish name or recipe link, including ingredients, method and nutrition per serving. A name uses the closest matching recipe in site search; details absent from the page are null.

**Input**

| Field | Type | Required | Example | Description |
|---|---|---|---|---|
| `recipe` | string | yes | `"https://www.bbcgoodfood.com/recipes/classic-lasagne-0"` | Dish name or BBC Good Food recipe page link, for example Easy vegetarian lasagne. |

**Input schema**

```json
{
  "type": "object",
  "required": [
    "recipe"
  ],
  "properties": {
    "recipe": {
      "type": "string",
      "description": "Dish name or BBC Good Food recipe page link, for example Easy vegetarian lasagne.",
      "examples": [
        "https://www.bbcgoodfood.com/recipes/classic-lasagne-0",
        "Easy vegetarian lasagne"
      ]
    }
  },
  "additionalProperties": false,
  "examples": [
    {
      "recipe": "https://www.bbcgoodfood.com/recipes/classic-lasagne-0"
    },
    {
      "recipe": "Easy vegetarian lasagne"
    }
  ]
}
```

**Output**

| Field | Type | Example | Description |
|---|---|---|---|
| `title` | string or null | `"Classic lasagne"` |  |
| `author` | string or null | `"Good Food team"` |  |
| `servings` | string or null | `"Serves 6"` |  |
| `cook_time` | string or null | `"1 hr and 40 mins"` |  |
| `photo_url` | string or null | `"https://images.immediate.co.uk/production/volatile/sites/30/2023/11/Lasagne-d4cb438.jpg?resize=768,845"` |  |
| `prep_time` | string or null | `"20 mins"` |  |
| `difficulty` | string or null | `"Easy"` |  |
| `recipe_url` | string or null | `"https://www.bbcgoodfood.com/recipes/classic-lasagne-0"` |  |
| `total_time` | string or null | `"2 hrs"` |  |
| `description` | string or null | `"Prepare this easy homemade lasagne ahead of time and save in the freezer, uncooked, for when you need it during a busy ` |  |
| `ingredients` | array |  |  |
| `star_rating` | number or null | `4.7` |  |
| `dietary_tags` | array |  |  |
| `method_steps` | array |  |  |
| `method_steps[].instruction` | string | `"To make the meat sauce, heat 2 tbsp olive oil in a frying pan and cook 750g lean beef mince in two batches for about 10` |  |
| `method_steps[].step_number` | integer | `1` |  |
| `number_of_ratings` | integer or null | `339` |  |
| `nutrition_per_serving` | object |  |  |
| `nutrition_per_serving.kcal` | number or null | `580` |  |
| `nutrition_per_serving.fat_g` | number or null | `32` |  |
| `nutrition_per_serving.salt_g` | number or null | `1.71` |  |
| `nutrition_per_serving.carbs_g` | number or null | `31` |  |
| `nutrition_per_serving.fibre_g` | number or null | `3` |  |
| `nutrition_per_serving.sugars_g` | number or null | `8` |  |
| `nutrition_per_serving.protein_g` | number or null | `44` |  |
| `nutrition_per_serving.saturates_g` | number or null | `14` |  |

**Example input**

```json
{
  "recipe": "https://www.bbcgoodfood.com/recipes/classic-lasagne-0"
}
```

**Example output**

```json
{
  "title": "Classic lasagne",
  "author": "Good Food team",
  "servings": "Serves 6",
  "cook_time": "1 hr and 40 mins",
  "photo_url": "https://images.immediate.co.uk/production/volatile/sites/30/2023/11/Lasagne-d4cb438.jpg?resize=768,845",
  "prep_time": "20 mins",
  "difficulty": "Easy",
  "recipe_url": "https://www.bbcgoodfood.com/recipes/classic-lasagne-0",
  "total_time": "2 hrs",
  "description": "Prepare this easy homemade lasagne ahead of time and save in the freezer, uncooked, for when you need it during a busy week. Just bake for an extra 45 mins",
  "ingredients": [
    "2 olive oil plus extra for the dish",
    "750g lean beef mince",
    "90g pack prosciutto"
  ],
  "star_rating": 4.7,
  "dietary_tags": [
    "Freezable"
  ],
  "method_steps": [
    {
      "instruction": "To make the meat sauce, heat 2 tbsp olive oil in a frying pan and cook 750g lean beef mince in two batches for about 10 mins until browned all over.",
      "step_number": 1
    },
    {
      "instruction": "Finely chop 4 slices of prosciutto from a 90g pack, then stir through the meat mixture.",
      "step_number": 2
    },
    {
      "instruction": "Pour over 800g passata or half our basic tomato sauce recipe and 200ml hot beef stock. Add a little grated nutmeg, then season.",
      "step_number": 3
    }
  ],
  "number_of_ratings": 339,
  "nutrition_per_serving": {
    "kcal": 580,
    "fat_g": 32,
    "salt_g": 1.71,
    "carbs_g": 31,
    "fibre_g": 3,
    "sugars_g": 8,
    "protein_g": 44,
    "saturates_g": 14
  }
}
```

### Search recipes

Operation `search_recipes`, version 1. 1 credit per completed call. Failed calls without a completed billing receipt are free; completed work can remain charged if delivery is interrupted.

Find Good Food recipes for a dish or ingredients in search order, with ratings, time, difficulty, photos and links. Excludes app-only recipes.

**Input**

| Field | Type | Required | Example | Description |
|---|---|---|---|---|
| `diet` | string | no | `"vegan"` | Diet to filter by, for example vegetarian. |
| `query` | string | yes | `"chickpea curry"` | Dish or ingredients to search, for example vegetarian lasagne. |
| `max_results` | integer | no | `12` | Maximum number of recipes to return, for example 20. |
| `max_total_minutes` | integer | no | `45` | Maximum total recipe time in minutes, for example 45. |

**Input schema**

```json
{
  "type": "object",
  "required": [
    "query"
  ],
  "properties": {
    "diet": {
      "enum": [
        "any",
        "vegetarian",
        "vegan",
        "gluten_free",
        "dairy_free",
        "healthy"
      ],
      "type": "string",
      "default": "any",
      "description": "Diet to filter by, for example vegetarian.",
      "examples": [
        "vegan",
        "vegetarian",
        "any"
      ]
    },
    "query": {
      "type": "string",
      "minLength": 1,
      "description": "Dish or ingredients to search, for example vegetarian lasagne.",
      "examples": [
        "chickpea curry",
        "vegetarian lasagne"
      ]
    },
    "max_results": {
      "type": "integer",
      "default": 20,
      "maximum": 50,
      "minimum": 1,
      "description": "Maximum number of recipes to return, for example 20.",
      "x-fous-developer": true,
      "examples": [
        12,
        20,
        50
      ]
    },
    "max_total_minutes": {
      "type": "integer",
      "minimum": 1,
      "description": "Maximum total recipe time in minutes, for example 45.",
      "examples": [
        45,
        10
      ]
    }
  },
  "additionalProperties": false,
  "examples": [
    {
      "diet": "vegan",
      "query": "chickpea curry",
      "max_results": 12,
      "max_total_minutes": 45
    },
    {
      "diet": "vegetarian",
      "query": "vegetarian lasagne",
      "max_results": 20
    },
    {
      "diet": "any",
      "query": "vegetarian lasagne",
      "max_results": 50
    }
  ]
}
```

**Output**

| Field | Type | Example | Description |
|---|---|---|---|
| `recipes` | array |  | Matching public recipes in Good Food search order. |
| `recipes[].title` | string or null | `"Chickpea curry"` | Recipe title. |
| `recipes[].difficulty` | string or null | `"Easy"` | Recipe difficulty. |
| `recipes[].photo_link` | string or null | `"https://images.immediate.co.uk/production/volatile/sites/30/2020/08/kadala-curry-fad4df3.jpg"` | Link to the recipe photo. |
| `recipes[].total_time` | string or null | `"40 mins"` | Total time to make the recipe. |
| `recipes[].recipe_link` | string | `"https://www.bbcgoodfood.com/recipes/kadala-curry"` | Link to the recipe page. |
| `recipes[].star_rating` | number or null | `4.65` | Average star rating out of five. |
| `recipes[].number_of_ratings` | integer or null | `504` | Number of ratings. |
| `recipes[].total_time_minutes` | integer or null | `40` | Total time in minutes. |

**Example input**

```json
{
  "diet": "vegan",
  "query": "chickpea curry",
  "max_results": 12,
  "max_total_minutes": 45
}
```

**Example output**

```json
{
  "recipes": [
    {
      "title": "Chickpea curry",
      "difficulty": "Easy",
      "photo_link": "https://images.immediate.co.uk/production/volatile/sites/30/2020/08/kadala-curry-fad4df3.jpg",
      "total_time": "40 mins",
      "recipe_link": "https://www.bbcgoodfood.com/recipes/kadala-curry",
      "star_rating": 4.65,
      "number_of_ratings": 504,
      "total_time_minutes": 40
    },
    {
      "title": "Spinach & chickpea curry",
      "difficulty": "Easy",
      "photo_link": "https://images.immediate.co.uk/production/volatile/sites/30/2020/08/recipe-image-legacy-id-967480_10-0d616d6.jpg",
      "total_time": "20 mins",
      "recipe_link": "https://www.bbcgoodfood.com/recipes/spinach-chickpea-curry",
      "star_rating": 4.5,
      "number_of_ratings": 85,
      "total_time_minutes": 20
    },
    {
      "title": "Chana masala (chickpea curry) with spinach",
      "difficulty": "Easy",
      "photo_link": "https://images.immediate.co.uk/production/volatile/sites/30/2020/08/chana-dfd903f.jpg",
      "total_time": "35 mins",
      "recipe_link": "https://www.bbcgoodfood.com/recipes/chana-masala-spinach",
      "star_rating": 4.45,
      "number_of_ratings": 55,
      "total_time_minutes": 35
    }
  ]
}
```

## Quick start

Replace `YOUR_API_KEY` with a Fous API key. To create one, open Developers at the bottom of Fous Studio, turn on Developer mode, then go to API keys (https://app.fous.com/keys). Change the values in `input` to run the same tool on new data.

```bash
curl 'https://api.fous.com/v1/query' \
  --fail-with-body --silent --show-error --max-time 180 \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  --data-raw '{
  "api": "@bbc-good-food",
  "visibility": "public",
  "operation": "get_recipe",
  "version": 1,
  "input": {
    "recipe": "https://www.bbcgoodfood.com/recipes/classic-lasagne-0"
  },
  "response": {
    "format": "json"
  }
}'
```

```python
# Save as fous.py and run with python3 fous.py. No packages needed.
import json
import urllib.error
import urllib.request

api_key = "YOUR_API_KEY"

body = json.loads("{\n  \"api\": \"@bbc-good-food\",\n  \"visibility\": \"public\",\n  \"operation\": \"get_recipe\",\n  \"version\": 1,\n  \"input\": {\n    \"recipe\": \"https://www.bbcgoodfood.com/recipes/classic-lasagne-0\"\n  },\n  \"response\": {\n    \"format\": \"json\"\n  }\n}")
request = urllib.request.Request(
    "https://api.fous.com/v1/query",
    data=json.dumps(body).encode("utf-8"),
    headers={
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json",
    },
    method="POST",
)
try:
    with urllib.request.urlopen(request, timeout=180) as response:
        result = json.load(response)
except urllib.error.HTTPError as error:
    raise RuntimeError(f"HTTP {error.code}: {error.read().decode('utf-8', errors='replace')}") from error
if result.get("success") is False:
    raise RuntimeError(result.get("error", {}).get("message", "Request failed"))
print(json.dumps(result["data"]["output"], indent=2))
```

```typescript
// Save as fous.mts and run with npx tsx fous.mts.
const apiKey = "YOUR_API_KEY";

const response = await fetch("https://api.fous.com/v1/query", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${apiKey}`,
    "Content-Type": "application/json",
  },
  signal: AbortSignal.timeout(180_000),
  body: JSON.stringify({
  "api": "@bbc-good-food",
  "visibility": "public",
  "operation": "get_recipe",
  "version": 1,
  "input": {
    "recipe": "https://www.bbcgoodfood.com/recipes/classic-lasagne-0"
  },
  "response": {
    "format": "json"
  }
}),
});
type ApiResult = { success: boolean; data?: { output: unknown }; error?: { message: string } };
const result: ApiResult = await response.json();
if (!response.ok || result.success === false) {
  throw new Error(result.error?.message ?? `HTTP ${response.status}`);
}
if (!result.data) throw new Error("Missing API response data");
console.log(result.data.output);
```

## Use from an AI assistant

Connect this tool to Claude Code, Claude Desktop, Cursor, VS Code, Codex and any MCP client as its own MCP server. Each method is a typed tool whose arguments are the method’s input.

- Server URL: `https://api.fous.com/mcp/tools/bbc-good-food`
- Authorization: `Authorization: Bearer <Fous API key>`

**Tools**

- `get_recipe`: Get recipe. 1 credit per completed call. Failed calls without a completed billing receipt are free; completed work can remain charged if delivery is interrupted.
- `search_recipes`: Search recipes. 1 credit per completed call. Failed calls without a completed billing receipt are free; completed work can remain charged if delivery is interrupted.
- `fous_get_run`: the result of a run that was still going, by its `request_id`. Free.

Claude Code:

```bash
claude mcp add --scope user --transport http fous-bbc-good-food https://api.fous.com/mcp/tools/bbc-good-food --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"
```

To give the assistant every tool, connect `https://api.fous.com/mcp`: it finds one with `fous_search_tools` and runs it with `fous_run_tool`. Setup for other clients: https://fous.com/llms-full.txt.

## Use cases

- Find recipes that fit a dish, ingredient, diet or time limit
- Compare recipe ratings, difficulty and cooking times
- Retrieve ingredients and method steps for meal planning
- Review per-serving nutrition when evaluating recipes

## FAQ

### Can I run it with my own inputs?

Yes. Change the inputs in Studio and press Run, or send new inputs from your code, or ask a connected AI assistant.

### Can I call this BBC Good Food tool as an API?

Yes. Send a POST request to /v1/query with your Fous API key and the inputs, and get JSON back.

### How much does it cost?

Each completed run costs 1 credit. Failed runs without a completed receipt are free; completed work can remain charged if delivery is interrupted. With pay as you go, a credit costs 1¢. Monthly plans cost less per credit.

### Do I need a BBC Good Food account?

No. You only need a Fous account.

### How current is the data?

Fous gets the data from bbcgoodfood.com when you run it. Some results are reused for up to 24 hours, and results that use your account or key are never reused. It was last verified on Sep 29, 2026.

### Which recipes match a dish or ingredient search?

Search recipes returns matching recipes in Good Food search order, with ratings, time, difficulty and photos.

### What ingredients and steps does a recipe use?

Get recipe returns the recipe’s ingredients and method steps when given a dish name or recipe link.

### What nutrition does a recipe provide per serving?

Get recipe returns available per-serving nutrition, including calories, protein, fat, carbohydrates, fibre, sugars, salt and saturates.

## Related

- [Food Network API](https://fous.com/tools/food-network.md): Food Network offers recipes, cooking shows, and food inspiration, with searchable recipes and ingredient, direction, rating, and cooking-time details when available.
- [Allrecipes API](https://fous.com/tools/allrecipes.md): Allrecipes offers recipes and cooking ideas, with searchable results and full recipe details, including ingredients, directions, cooking times, ratings and nutrition.
- [Serious Eats API](https://fous.com/tools/serious-eats.md): Serious Eats offers recipes, cooking techniques, and food guides, with available ingredients, directions, timing, ratings, and nutrition; some details may be absent.
- [Open Food Facts API](https://fous.com/tools/open-food-facts.md): Open Food Facts provides public packaged-food information, including ingredients, allergens, nutrition, and product classifications; coverage varies, and search results favor popular products.
- [BBC News API](https://fous.com/tools/bbc-news.md): BBC News returns section-ordered headlines, searchable articles with dates, authors and sections (filters/newest sorting cover 180 matches), and article text with available latest live entries.
- [Goodreads API](https://fous.com/tools/goodreads.md): Goodreads returns public book searches, matched-book details with variable editions, popular or newest reviews, author books by popularity or date, and up to 100 quotes.
- [Food Standards Agency API](https://fous.com/tools/food-standards-agency.md): Official UK food hygiene ratings for food businesses.
- [USDA FoodData Central API](https://fous.com/tools/usda-fooddata-central.md): USDA FoodData Central provides food composition, nutrition facts per 100 g or chosen listed portions, and relevant food and branded-product search results; missing data may be unavailable.
- [All Food tools](https://fous.com/tools/category/food)
