Blue Bottle Coffee APIbluebottlecoffee.com ↗
Access Blue Bottle Coffee product listings, roast levels, tasting notes, variant pricing, and cafe locations across the US via a structured REST API.
What is the Blue Bottle Coffee API?
The Blue Bottle Coffee API exposes 5 endpoints covering the full product catalog, per-product variant pricing, and cafe locations across US regions. Use list_all_products to retrieve every item in the shop with roast level and tasting notes, get_product_details to pull variant-level pricing and customer reviews by slug, or list_cafes to get structured address data for every Blue Bottle location.
No input parameters required.
curl -X GET 'https://api.parse.bot/scraper/47b1ad91-88e8-49b3-8200-57541a683d81/list_all_products' \ -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 bluebottlecoffee-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.
"""Blue Bottle Coffee: browse catalog, drill into product details, find cafes."""
from parse_apis.blue_bottle_coffee_api import BlueBottle, CategorySlug, ProductNotFound
client = BlueBottle()
# List espresso products by category using the enum
for product in client.productsummaries.by_category(category_slug=CategorySlug.ESPRESSO, limit=3):
print(product.name, product.roast_level)
# Drill into one product's full details via the summary→detail navigation
summary = client.productsummaries.list(limit=1).first()
if summary:
detail = summary.details()
print(detail.name, detail.tasting_notes, detail.description[:80])
for v in detail.variants[:2]:
print(v.name, v.price, v.for_sale)
# Direct product lookup by slug
try:
product = client.products.get(slug="hayes-valley-espresso")
print(product.name, product.roast_level)
except ProductNotFound as exc:
print(f"Product not found: {exc.slug}")
# Search cafes by location
for cafe in client.cafes.search(query="New York", limit=3):
print(cafe.name, cafe.address.street, cafe.address.locality, cafe.region)
print("exercised: productsummaries.by_category / productsummaries.list / summary.details / products.get / cafes.search")
List all coffee products available in the Blue Bottle Coffee shop. Returns product names, slugs, tasting notes, roast levels, and images. Single-page endpoint returning the complete catalog.
No input parameters required.
{
"type": "object",
"fields": {
"total": "integer total number of products returned",
"products": "array of product objects with name, slug, tasting_notes, roast_level, and image fields"
},
"sample": {
"data": {
"total": 25,
"products": [
{
"name": "Hayes Valley Espresso",
"slug": "hayes-valley-espresso",
"image": "/2024/2024 Updated Packaging/Hayes Valley Espresso/M1_HayesValleyEspresso_Hero_1.png",
"roast_level": "Dark Roast",
"tasting_notes": "Baking Chocolate, Orange Zest, Brown Sugar"
}
]
},
"status": "success"
}
}About the Blue Bottle Coffee API
Product Catalog
The list_all_products endpoint returns every product currently in the Blue Bottle shop, including each product's name, slug, roast_level, tasting_notes, and image. To narrow results to a specific category, use list_products_by_category with a category_slug such as best-sellers, espresso, single-origin, or brew-tools. Both endpoints return a total count alongside the products array.
Product Details and Variants
get_product_details accepts a slug (e.g. hayes-valley-espresso, bella-donovan) and returns the full record for that product. The variants array lists each purchasable option with id, name, price in integer cents, sku, for_sale status, and an option field describing the variant (such as grind type or size). The endpoint also returns a description string, roast_level, tasting_notes, and a metadata array of meta tag objects useful for SEO analysis. A reviews array is included but may be empty for some products.
Cafe Locations
list_cafes returns all Blue Bottle cafe locations with a structured address object containing street, locality, district, postalCode, and countryCode fields, plus a region label covering areas like Northern California, Southern California, New York, Las Vegas, Chicago, Boston, and Washington DC. To filter by location, search_cafes_by_location accepts an optional query string matched against cafe name, address, and region fields — passing San Francisco or Broadway returns only matching cafes with the same address structure.
The Blue Bottle Coffee API is a managed, monitored endpoint for bluebottlecoffee.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when bluebottlecoffee.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 bluebottlecoffee.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 coffee product comparison tool using variant pricing from
get_product_detailsacross roast levels. - Power a store locator map by feeding
list_cafesaddress data into a mapping library. - Track which products are currently for sale by checking the
for_salefield in thevariantsarray. - Aggregate tasting notes and roast levels from
list_all_productsto analyze catalog patterns. - Filter the espresso-specific product lineup using
list_products_by_categorywithcategory_slug: espresso. - Monitor SKU and variant availability changes over time using
skuandfor_salefields. - Retrieve structured cafe address data by city or neighborhood using
search_cafes_by_location.
| 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 Blue Bottle Coffee offer an official developer API?+
What does `get_product_details` return that `list_all_products` does not?+
get_product_details adds the variants array (with per-variant price in cents, sku, for_sale, and option), a description string, a metadata array of meta tag objects, and a reviews array. The list endpoints return only name, slug, roast_level, tasting_notes, and image.Does the API return cafe hours or phone numbers?+
list_cafes and search_cafes_by_location return name, slug, region, and a structured address with street, locality, district, postalCode, and countryCode. Hours and contact details are not included. You can fork this API on Parse and revise it to add an endpoint that retrieves those fields for individual cafe slugs.Are all product categories accessible via `list_products_by_category`?+
best-sellers, brew-tools, espresso, and single-origin. Other category slugs may not return results. You can fork this API on Parse and revise it to add support for additional category slugs if Blue Bottle adds new ones.Can I retrieve historical pricing or track price changes over time?+
price is an integer in cents for each variant. It does not expose pricing history. You can fork this API on Parse and revise it to log responses over time and build a price-tracking layer on top.