Budget Bytes APIbudgetbytes.com ↗
Search Budget Bytes recipes by keyword and fetch full details: ingredients, instructions, prep/cook times, cost per serving, and nutrition via a clean REST API.
What is the Budget Bytes API?
The Budget Bytes API provides 2 endpoints for accessing recipe data from budgetbytes.com, covering everything from keyword search to full recipe detail. search_recipes returns paginated summaries including estimated recipe cost and per-serving cost in USD, while get_recipe delivers the complete record: structured ingredients, step-by-step instructions, ISO-8601 prep and cook times, nutrition facts, cuisine tags, and author attribution — all keyed by slug.
curl -X GET 'https://api.parse.bot/scraper/b661a832-ce17-42ef-bece-44541e854015/search_recipes?query=chicken' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace budgetbytes-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Budget Bytes recipe search and detail drill-down."""
from parse_apis.budgetbytes_com_api import BudgetBytes, RecipeNotFound
client = BudgetBytes()
# Search for chicken recipes, cap at 5 results total.
for hit in client.recipe_summaries.search(query="chicken", limit=5):
print(hit.title, f"${hit.recipe_cost_usd}/recipe" if hit.recipe_cost_usd else "cost N/A")
# Drill into the first match for full ingredients and nutrition.
first = client.recipe_summaries.search(query="pasta", limit=1).first()
if first is not None:
recipe = first.details()
print(recipe.name, recipe.recipe_yield)
for step in recipe.instructions:
print("-", step)
if recipe.nutrition is not None:
print("Calories:", recipe.nutrition.calories)
# Direct lookup by known slug, with error handling.
try:
recipe = client.recipes.get(slug="baked-chicken-breast")
print(recipe.name, recipe.author, f"${recipe.serving_cost_usd}/serving")
except RecipeNotFound:
print("Recipe not found")
print("exercised: recipe_summaries.search / details / recipes.get")
Searches Budget Bytes recipes by free-text keyword and returns one page of 12 recipe summaries (title, slug, URL, estimated recipe cost and per-serving cost in USD, short description, thumbnail). One round trip per page. Pagination is caller-controlled through `page`; omitting it returns page 1. `total_pages` is the number of result pages the site reports, `has_more` is true while a later page exists. A query with no matches returns an empty `results` array with `total_pages` 0; a `page` past the last page returns an empty `results` array with `total_pages` null. Cost fields are null when the site does not show a cost for that recipe.
| Param | Type | Description |
|---|---|---|
| page | integer | 1-based result page number; each page holds 12 recipes. |
| queryrequired | string | Free-text search keyword(s), e.g. an ingredient or dish name. |
{
"type": "object",
"fields": {
"page": "integer page number returned",
"query": "echoed search keyword",
"results": "array of recipe summaries: slug (id for get_recipe), title, url, recipe_cost_usd (number|null), serving_cost_usd (number|null), description, image_url",
"has_more": "boolean, true when a later page exists",
"page_size": "integer, recipes per page (always 12)",
"total_pages": "integer number of result pages reported by the site (0 for no matches, null when page is past the end)"
},
"sample": {
"data": {
"page": 1,
"query": "chicken",
"results": [
{
"url": "https://www.budgetbytes.com/baked-chicken-breast/",
"slug": "baked-chicken-breast",
"title": "Baked Chicken Breast",
"image_url": "https://www.budgetbytes.com/wp-content/uploads/2025/01/1-Baked-Chicken-Breast-Overhead-Pan-Wide-368x276.jpg",
"description": "These easy Baked Chicken Breasts are marinated in a simple brine before being seasoned to perfection and baked in the oven until golden, tender, and JUICY!",
"recipe_cost_usd": 7.75,
"serving_cost_usd": 1.94
}
],
"has_more": true,
"page_size": 12,
"total_pages": 88
},
"status": "success"
}
}About the Budget Bytes API
Search and Discovery
search_recipes accepts a free-text query parameter (ingredient name, dish type, or any keyword) and returns up to 12 recipe summaries per page. Each result includes a slug used to fetch full details, title, url, recipe_cost_usd, and serving_cost_usd. Pagination is controlled with the page parameter (1-based); the response includes has_more, total_pages, and page_size so callers can walk through all matching results without guessing. When a page number exceeds available results, total_pages returns null.
Full Recipe Detail
get_recipe takes a slug from search results and returns the complete recipe record. Time fields (prep_time, cook_time, total_time) are expressed as ISO-8601 durations (e.g., PT40M), making them straightforward to parse with standard libraries. The nutrition object contains per-serving values for fields like calories, proteinContent, fatContent, and others with units included as strings. The endpoint also returns cuisines (array), keywords (comma-separated string or null), image_url, author, and the canonical url.
Cost Data
Budget Bytes is explicitly organized around affordable cooking, so cost fields are a first-class part of the data model. Both search_recipes and get_recipe expose recipe_cost_usd and serving_cost_usd as numeric values (or null when the source page omits them). This makes cost-aware filtering and display straightforward without any secondary parsing step.
The Budget Bytes API is a managed, monitored endpoint for budgetbytes.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when budgetbytes.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official budgetbytes.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a budget meal planner that filters recipes by serving_cost_usd under a set threshold
- Populate a recipe recommendation engine keyed by ingredient keywords using search_recipes
- Display weekly meal prep suggestions with prep_time and cook_time parsed from ISO-8601 durations
- Create a nutrition tracker that pulls per-serving macros from the get_recipe nutrition object
- Aggregate recipe cost data across categories to analyze price trends on a food blog
- Generate a grocery budget tool that maps recipe_cost_usd to shopping list totals
- Index Budget Bytes content by cuisine type using the cuisines array for faceted search
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.