Shopping list builder
Every list on this page is one call to the public API. Pick a few recipes and watch what they share collapse into single lines.
Shopping list
Nothing yet
Pick a recipe and the API builds your list here, adding up anything the recipes share — two dishes wanting garlic become one line.
Pick recipes

Peruvian-Style Roast Chicken with Green Sauce
onceuponachef.com120 min

Black Bean & Corn Salad with Chipotle-Honey Vinaigrette
onceuponachef.com30 min

Baked Ziti
onceuponachef.com90 min

Fish Florentine
skinnytaste.com20 min

Spinach Quiche
onceuponachef.com90 min

Turkey Taco Soup
skinnytaste.com20 min
How this works
Everything on this page is two calls to the public API. There is no shopping list logic in the browser — the merging, the scaling and the aisles all happen behind GET /shopping-list, and the page only draws what comes back.
Step 1
Fill the grid
The 36 cards come from GET /popular, ranked so a single five-star review cannot outrank a long-standing favourite. Six are on screen; the rest wait behind them.
Step 2
Collect the ids
Every recipe carries an
id. Adding one puts it in the query string, which is why this page can be shared and survives a refresh. Up to 20 ids go into one request.Step 3
Build the list
?recipes=id,idcomes back as one list grouped by aisle. Amounts are added up wherever the units allow — grams to grams, cloves to cloves — so two recipes wanting garlic become one line.
The request this page makes
curl "https://api.tinyplates.dev/shopping-list?recipes=66d0a1b2c3d4e5f6a7b8c9d0,66d0a1b2c3d4e5f6a7b8c9d1" \ -H "Authorization: Bearer $TINY_PLATES_KEY"
Amounts that cannot be added stay separate: two cloves of garlic and 10 g of garlic are different lines, because turning one into the other needs a weight per clove nobody has. Ask for id:servings and the quantities are scaled to that many servings first.
Related endpoints: GET /search to find recipes by description, GET /pantry to go the other way and cook from what you already have, and GET /recipes/:id for the full recipe behind any card.