Food & Drink — entry 008 of 20
Open Brewery DB
Open Brewery DB is an open, keyless directory of breweries, cideries, and bottle shops across the US and several other countries, searchable by name, city, state, or brewery type. A live GET against the real gateway, api.openbrewerydb.org, returned genuine JSON while carrying an echoed Access-Control-Allow-Origin header, reconfirming both cors yes and auth None in the same probe.
Open Brewery DB is a free, keyless directory of breweries, cideries, and bottle shops -- searchable by name, city, state, or type. A live GET this run against `/breweries/meta` returned `{"total":11822,...}` -- a live, dated counter, not a fixed fact -- spanning the US and several other countries.
GreatAPIs Score
Auth quickstart
- No API key, signup, or credit card required -- a live GET this run against `/breweries?by_city=san_diego&per_page=1` returned a genuine brewery record with zero credentials, carrying an echoed `Access-Control-Allow-Origin` header so a browser `fetch()` works too.
Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.
Search breweries by city
GEThttps://api.openbrewerydb.org/v1/breweries?by_city=san_diego&per_page=1
[{"id":"ef970757-fe42-416f-931d-722451f1f59c","name":"10 Barrel Brewing Co","brewery_type":"large","address_1":"1501 E St","address_2":null,"address_3":null,"city":"San Diego","state_province":"California","postal_code":"92101-6618","country":"United States","longitude":-117.129593,"latitude":32.714813,"phone":"6195782311","website_url":"http://10barrel.com","state":"California","street":"1501 E St"}]Every filter (`by_city`, `by_state`, `by_type`, `by_name` via `/breweries/search?query=`) returns this same flat array shape -- no wrapping envelope. `brewery_type` is one of a fixed set (`micro`, `regional`, `brewpub`, `large`, `planning`, `bar`, `contract`, `proprietor`, `closed`, ...), confirmed live in `/breweries/meta`'s `by_type` breakdown this run.
Try it
Developer reference
https://api.openbrewerydb.org/v1- GET/breweries
- GET/breweries/{id}
- GET/breweries/search
- GET/breweries/meta
Gotchas & limits
- The default page size is **50**, not the full result set -- a live GET this run against a filter-less `/breweries` returned exactly 50 records, while `per_page=200` (the documented cap) returned exactly 200. There is no `total` field on the list route itself; get it from `/breweries/meta` instead.
- An unmatched filter value is **HTTP 200 with an empty array**, not a 404 -- a live GET this run against `/breweries?by_city=zzzznotacity` returned `200 []`. Code that treats an empty array as an error will misreport a simple no-results case.
- An unknown id at `/breweries/{id}` is a real **HTML 404 page**, not a JSON error envelope -- a live GET this run against `/breweries/not-a-real-id` returned Laravel's default 404 page (`<title>Not Found</title>`) with `content-type: text/html`. Code that always calls `.json()` on the response without checking status first will throw on a bad or stale id.
- `/breweries/meta` accepts the same `by_city`/`by_state`/`by_type` filters as the list route and returns scoped counts (`total`, `by_state`, `by_country`, `by_type`) instead of records -- it's a separate aggregate endpoint, not a query param on `/breweries`.