# 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/workflows/bbc-good-food
- Handle: `@bbc-good-food`
- Category: [Food](https://fous.com/workflows/category/food)
- Source website: https://bbcgoodfood.com
- Last verified: Sep 29, 2026
- Fous is not affiliated with BBC Good Food.

## Methods

### Get recipe

Operation `get_recipe`, version 1. 1 credit per call.

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

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

Call the API with a Fous API key (`FOUS_API_KEY`). To create one, turn on Developer mode in Fous Studio, then open Keys & connections → API keys (https://app.fous.com/keys).

```bash
# First set your key: export FOUS_API_KEY='YOUR_FOUS_API_KEY'
: "${FOUS_API_KEY:?Set FOUS_API_KEY before running this example}"

curl 'https://api.fous.com/v1/query' \
  --fail-with-body --silent --show-error --max-time 120 \
  -H "Authorization: Bearer $FOUS_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.
# First set your key: export FOUS_API_KEY='YOUR_FOUS_API_KEY'
import json
import os
import urllib.error
import urllib.request

api_key = os.environ.get("FOUS_API_KEY")
if not api_key:
    raise RuntimeError("Set FOUS_API_KEY before running this example")

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=120) 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.
// First set your key: export FOUS_API_KEY='YOUR_FOUS_API_KEY'
const apiKey = process.env.FOUS_API_KEY;
if (!apiKey) throw new Error("Set FOUS_API_KEY before running this example");

const response = await fetch("https://api.fous.com/v1/query", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${apiKey}`,
    "Content-Type": "application/json",
  },
  signal: AbortSignal.timeout(120_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);
```

Or describe the data in plain language: send `{"api":"@bbc-good-food","prompt":"Describe the data you need, with every detail"}` to the same URL. Fous fills in the input, runs the method that fits and returns only the fields you asked for; `data.route.calls[].request` is the exact call it made. Routing is free; the run costs the same.

## 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

### Is Fous affiliated with BBC Good Food?

No. Fous is not affiliated with BBC Good Food. This workflow reads the public bbcgoodfood.com website and returns its data.

### How much does it cost?

Each run costs 1 credit. 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; repeating the same request within a day may return the saved result. Fous checks this workflow automatically; it last passed a check 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/workflows/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/workflows/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/workflows/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/workflows/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/workflows/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/workflows/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/workflows/food-standards-agency.md): Official UK food hygiene ratings for food businesses.
- [USDA FoodData Central API](https://fous.com/workflows/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 workflows](https://fous.com/workflows/category/food)
