Serious Eats APIseriouseats.com ↗
Search and retrieve full recipe data from Serious Eats. Get ingredients, cook times, ratings, reviews, and instructions via 2 REST endpoints.
What is the Serious Eats API?
The Serious Eats API provides 2 endpoints for searching the site's recipe catalog and retrieving structured recipe details. The search endpoint returns matching titles, URLs, and thumbnail images for any keyword query, while get_recipe returns a full recipe record with 10+ fields including ingredients, preparation steps, cook/prep/total times in ISO 8601 format, ratings, and user reviews.
curl -X GET 'https://api.parse.bot/scraper/a37f835d-181b-41e9-8ddc-9c9c7ced68c9/search?limit=5&query=chocolate+chip+cookies' \ -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 seriouseats-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: Serious Eats Recipe API — search recipes, drill into details."""
from parse_apis.serious_eats_recipe_api import SeriousEats, RecipeNotFound
client = SeriousEats()
# Search for recipes — limit= caps total items fetched.
for summary in client.recipesummaries.search(query="pasta carbonara", limit=5):
print(summary.title, summary.url)
# Drill into the first result to get full recipe details.
hit = client.recipesummaries.search(query="chocolate chip cookies", limit=1).first()
if hit:
recipe = hit.details()
print(recipe.title, recipe.prep_time, recipe.cook_time)
print("Ingredients:", len(recipe.ingredients))
for step in recipe.instructions[:2]:
print(" -", step[:80])
if recipe.rating:
print("Rating:", recipe.rating.score, "from", recipe.rating.count, "reviews")
for review in recipe.reviews[:2]:
print(" Review by", review.author, "—", review.text[:60])
# Typed error handling: catch RecipeNotFound for an invalid URL.
try:
client.recipes.get(url="https://www.seriouseats.com/nonexistent-recipe-page-12345")
except RecipeNotFound as exc:
print(f"Recipe not found: {exc}")
print("exercised: recipesummaries.search / details / recipes.get / RecipeNotFound")
Full-text search over Serious Eats recipes by keyword. Returns matching recipe titles, URLs, and thumbnail images. Paginates as a single page up to the requested limit. Multi-word queries are supported.
| Param | Type | Description |
|---|---|---|
| limit | integer | Maximum number of search results to return. |
| queryrequired | string | Search keyword or phrase (e.g. 'chicken', 'chocolate cake'). |
{
"type": "object",
"fields": {
"count": "integer — number of results returned",
"query": "string — the search query echoed back",
"results": "array of recipe summary objects with keys: title (string), url (string), image (string URL)"
},
"sample": {
"data": {
"count": 5,
"query": "chicken",
"results": [
{
"url": "https://www.seriouseats.com/chicken-dinners-polynesian-chicken",
"image": "https://www.seriouseats.com/thmb/7GVOhFne4thXzPi5ECll-34pfJ8=/282x188/filters:no_upscale():max_bytes(150000):strip_icc():format(webp)/__opt__aboutcom__coeus__resources__content_migration__serious_eats__seriouseats.com__images__2012__09__20120921-223424-polynesian-chicken-edit-f0967e4cb8fb4f3a86b69cb0a8f6f5f4.jpg",
"title": "Chicken Dinners: Polynesian Chicken"
},
{
"url": "https://www.seriouseats.com/chicken-dinners-mapo-chicken",
"image": "https://www.seriouseats.com/thmb/7WZZ_MO64pFq73xDqqugFw0jc74=/282x188/filters:no_upscale():max_bytes(150000):strip_icc():format(webp)/__opt__aboutcom__coeus__resources__content_migration__serious_eats__seriouseats.com__images__2013__01__20130114-237007-mapo-chicken-primary-d09d55078f364147a9078e67a70cb29d.jpg",
"title": "Chicken Dinners: Mapo Chicken"
}
]
},
"status": "success"
}
}About the Serious Eats API
Search Recipes
The search endpoint accepts a required query string — single keywords like chicken or multi-word phrases like chocolate cake — and an optional limit integer to cap the number of results. The response includes a count of results returned, the query echoed back, and a results array. Each result object carries a title, url, and image (thumbnail URL), making it straightforward to build ingredient-based or topic-based browsing without constructing Serious Eats URLs manually.
Full Recipe Details
The get_recipe endpoint accepts a full Serious Eats recipe URL (e.g. https://www.seriouseats.com/chocolate-chip-cookies-recipe) and returns a structured record. Key fields include title, description, yield (serving size), main_image, and timing fields — prep_time, cook_time, and total_time — all in ISO 8601 duration format. Note that total_time can be either a plain ISO 8601 string or an object with minValue and maxValue keys when the recipe specifies a time range.
Ratings and Reviews
The rating field returns an object with score and count, reflecting the aggregated user rating on the recipe page. The reviews array contains individual review objects with author, text, and an optional rating per reviewer. Both fields may be null or empty for recipes without community feedback. The source_url field is always present and mirrors the input URL, useful for deduplication when retrieving multiple recipes.
The Serious Eats API is a managed, monitored endpoint for seriouseats.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when seriouseats.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 seriouseats.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 recipe search interface that surfaces Serious Eats results by ingredient or dish name using the
queryparam - Aggregate cook and prep times from
cook_timeandprep_timefields to filter recipes by total time required - Populate a recipe card UI with
title,main_image,yield, anddescriptionfromget_reciperesponse fields - Analyze user sentiment by processing the
reviewsarray, including per-reviewerratingandtext - Track average recipe ratings using the
scoreandcountfields in theratingobject across a set of URLs - Generate meal planning tools that combine search results with full recipe details for structured weekly menus
- Feed a nutrition or cooking dataset with structured recipe metadata including yield and timing fields
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Serious Eats have an official developer API?+
What does the `get_recipe` endpoint return for recipe timing fields?+
prep_time, cook_time, and total_time, all in ISO 8601 duration format (e.g. PT30M for 30 minutes). total_time may also be returned as an object with minValue and maxValue keys when the recipe specifies a variable time range rather than a fixed duration.Does the API return a full list of ingredients and step-by-step instructions?+
get_recipe endpoint returns description and structured metadata. A dedicated ingredients list and numbered instruction steps are not exposed as separate fields in the current response schema. The API covers title, yield, timing, rating, reviews, and images. You can fork it on Parse and revise it to add an ingredients array or instructions field.Does the search endpoint support filtering by cuisine type, dietary restriction, or recipe category?+
search endpoint currently supports keyword queries via the query parameter only; there are no filter parameters for cuisine, dietary tags, or category. You can fork it on Parse and revise to add filtering endpoints that narrow results by those attributes.Can I retrieve multiple pages of search results with the `search` endpoint?+
limit parameter to control how many results are returned, but there is no offset or page parameter for paginating through a larger result set. The current response reflects the top matches up to your specified limit.