Last Updated: June 25, 2026
The Catalog.beer API is organized around REST. We use HTTP response codes to indicate the success or failure of your request. We also use basic HTTP features like HTTP authentication and HTTP verbs.
The Catalog.beer API can be accessed using the following root URL:
https://api.catalog.beer
When making an API request, be sure to include an accept: application/json header. All data returned by the API will be in JSON format.
Similarly, when making a PUT or POST request to the API, the body of your request must be in JSON as well. Be sure to include the content-type: application/json header in your request.
Authenticate your account when using the API by including your secret API key in the request. You can find your API key on your Account page. Your API key carries many privileges, so be sure to keep it secret! Do not share your secret API key in publicly accessible areas such GitHub, client-side code, and so forth.
Authentication to the API is performed via the 'Basic' HTTP authentication scheme. Provide your API key as the username value. You do not need to provide a password.
When making a request using basic HTTP authentication, your request should contain a header field in the form of Authorization: Basic <credentials>, where <credentials> is the base64_encode('username:password') (Recall that your username in this case is your API Key and the password field should be left blank).
For example, if your API Key is: cadcbe6f-a80d-4e33-9f20-b53c2ed83845
base64_encode('cadcbe6f-a80d-4e33-9f20-b53c2ed83845:')
Returning: Y2FkY2JlNmYtYTgwZC00ZTMzLTlmMjAtYjUzYzJlZDgzODQ1Og==
Then your cURL request will look something like:
curl --location --request GET 'https://api.catalog.beer/brewer' --header 'Accept: application/json' --header 'Authorization: Basic Y2FkY2JlNmYtYTgwZC00ZTMzLTlmMjAtYjUzYzJlZDgzODQ1Og=='
All API requests must be made over HTTPS. Calls made over plain HTTP will fail. API requests without authentication will also fail.
Catalog.beer uses conventional HTTP response codes to indicate the success or failure of an API request. In general, codes in the 2xx range indicate success, codes in the 4xx range indicate an error that failed given the information provided (e.g., a required parameter was omitted), and codes in the 5xx range indicate an error with Catalog.beer’s servers.
The following parameters are returned in JSON format when an error occurs
| Parameter | Type | Description |
|---|---|---|
| error | Boolean | true or false. Indicates an error occurred in processing your request. |
| error_msg (optional) |
string | A message relaying additional information about the error. |
| valid_state (optional) |
array | An array containing the attribute names and their validation state. A field’s state is binary: either ‘valid’ or ‘invalid’. You can use this parameter to help target which attributes are invalid. |
| valid_msg (optional) |
array | An array containing the attribute names and the corresponding error message for that attribute. You can use this information to show help text next to the attributes that were invalid. |
Sample error JSON returned for a POST request to /brewer:
{
"error": true,
"error_msg": "",
"valid_state": {
"name": "invalid",
"url": "valid",
"description": "valid",
"short_description": "valid"
},
"valid_msg": {
"name": "Please give us the name of the brewery you'd like to add.",
"url": "",
"description": "",
"short_description": ""
}
}
The Catalog.beer API supports the following HTTP methods for creating, reading, updating, and deleting resources.
| Method | Description |
|---|---|
| GET | Retrieve a resource or list of resources. |
| POST | Create a new resource. |
| PUT | Full replacement of a resource. All required fields must be present. Omitted optional fields are cleared to null. If the resource does not exist, it will be created (returns 201 Created). If the resource already exists, it will be replaced (returns 200 OK). |
| PATCH | Partial update of a resource. Only the fields you provide will be modified; all other fields remain unchanged. The resource must already exist (returns 404 Not Found otherwise). |
| DELETE | Remove a resource. Returns 204 No Content with no response body on success. |
If you send a request using an HTTP method that is not supported by the endpoint, the API will return a 405 Method Not Allowed response. The Allow header on the response will list the methods that the endpoint does support.
The brewer object is the central piece of the beer data puzzle. Brewers can have beers and locations associated with them. And in order to add a beer or location to the database, there must be a brewer to associate them with.
Whether you’re retrieving information on a specific brewer, adding a new brewer, or updating an existing brewer, successful requests will return the brewer object in JSON format. That object has the following parameters.
| Parameter | Type | Description |
|---|---|---|
| id | string | The brewer_id; a unique identifier for the brewer. |
| object | string | The name of the object. In this case: “brewer”. |
| name | string | The name of the brewer. |
| description | string | A description of the brewer. Note that this field may contain markdown or new line characters. |
| short_description | string | A short, max 160 character, description of the brewer. |
| url | string | The URL of the brewer’s website. |
| cb_verified | Boolean | A true or false value denoting whether or not a Catalog.beer administrator has verified the brewer’s information. |
| brewer_verified | Boolean | A true or false value denoting whether or not the brewer themselves has contributed and verified their information. |
| last_modified | integer | A Unix timestamp indicating when the brewer was last modified. |
{
"id": "ce7d83f5-0c3d-42f4-9162-ca97019e89d1",
"object": "brewer",
"name": "HopSaint Brewing Company",
"description": "HopSaint was born after one too many late nights navigating a crowded bar just to have a great beer unceremoniously poured into a dirty pint glass. We believe fresh draft beer shouldn't be confined to the pub. You should choose when, where, how, and with whom you enjoy a fresh, crafted beer. That's at the heart of HopSaint - a community that fosters lasting relationships & enriches our hometown through the production of honest, real beer. A community built on craft beer.",
"short_description": "A brewery in Torrance, CA.",
"url": "https://www.hopsaint.com/",
"cb_verified": true,
"brewer_verified": false,
"last_modified": 1783639445
}
To add a brewer, send a POST request to the /brewer endpoint with the following parameters encoded in the body of the request as JSON. Successful requests will return a brewer object.
POST https://api.catalog.beer/brewer
| Parameter | Type | Description |
|---|---|---|
| name | string | The name of the brewer. |
| description (optional) |
string | A description of the brewer. This should be like the “About” page posted by the brewer. A brief origin story coupled with who they are. This field supports markdown. |
| short_description (optional) |
string | A short description of the brewer; max 160 characters. Describe the brewer as you might in a tweet. Short and sweet. |
| url (optional) |
string | The URL of the brewer’s website. |
curl -X POST \
https://api.catalog.beer/brewer \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
-H 'content-type: application/json' \
-d '{"name":"HopSaint Brewing Company","description":"HopSaint was born after one too many late nights navigating a crowded bar just to have a great beer unceremoniously poured into a dirty pint glass. We believe fresh draft beer shouldn\u0027t be confined to the pub. You should choose when, where, how, and with whom you enjoy a fresh, crafted beer. That\u0027s at the heart of HopSaint - a community that fosters lasting relationships & enriches our hometown through the production of honest, real beer. A community built on craft beer.","short_description":"A brewery in Torrance, CA.","url":"https://www.hopsaint.com/"}'
To replace a brewer’s data, send a PUT request to the /brewer endpoint with the brewer_id appended to the path. All required fields must be present. Omitted optional fields will be cleared to null. If the brewer does not exist, it will be created and a 201 Created response will be returned. Successful requests return a brewer object.
PUT https://api.catalog.beer/brewer/{brewer_id}
| Parameter | Type | Description |
|---|---|---|
| name | string | The name of the brewer. |
| description (optional) |
string | A description of the brewer. Cleared if omitted. |
| short_description (optional) |
string | A short description of the brewer; max 160 characters. Cleared if omitted. |
| url (optional) |
string | The URL of the brewer’s website. Cleared if omitted. |
curl -X PUT \
https://api.catalog.beer/brewer/ce7d83f5-0c3d-42f4-9162-ca97019e89d1 \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
-H 'content-type: application/json' \
-d '{"name":"HopSaint Brewing Company","description":"HopSaint was born after one too many late nights navigating a crowded bar just to have a great beer unceremoniously poured into a dirty pint glass. We believe fresh draft beer shouldn\u0027t be confined to the pub. You should choose when, where, how, and with whom you enjoy a fresh, crafted beer. That\u0027s at the heart of HopSaint - a community that fosters lasting relationships & enriches our hometown through the production of honest, real beer. A community built on craft beer.","short_description":"A brewery in Torrance, CA.","url":"https://www.hopsaint.com/"}'
To partially update a brewer, send a PATCH request to the /brewer endpoint with the brewer_id appended to the path. Only the fields you include will be updated; all other fields remain unchanged. Successful requests return a brewer object.
PATCH https://api.catalog.beer/brewer/{brewer_id}
| Parameter | Type | Description |
|---|---|---|
| name (optional) |
string | The name of the brewer. |
| description (optional) |
string | A description of the brewer. |
| short_description (optional) |
string | A short description of the brewer; max 160 characters. |
| url (optional) |
string | The URL of the brewer’s website. |
curl -X PATCH \
https://api.catalog.beer/brewer/ce7d83f5-0c3d-42f4-9162-ca97019e89d1 \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
-H 'content-type: application/json' \
-d '{"short_description":"A brewery in Torrance, CA."}'
To delete a brewer, send a DELETE request to the /brewer endpoint with the brewer_id appended to the path. No request body is required. Successful requests return a 204 No Content response with no body.
DELETE https://api.catalog.beer/brewer/{brewer_id}
curl -X DELETE \
https://api.catalog.beer/brewer/ce7d83f5-0c3d-42f4-9162-ca97019e89d1 \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
To retrieve a brewer, send a GET request to the /brewer endpoint with the {brewer_id} parameter appended to the path.
GET https://api.catalog.beer/brewer/{brewer_id}
A brewer object will be returned for successful requests.
curl -X GET \
https://api.catalog.beer/brewer/ce7d83f5-0c3d-42f4-9162-ca97019e89d1 \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
If you want a list of all the brewers in the database, send a GET request to the /brewer endpoint.
GET https://api.catalog.beer/brewer
| Name | Type | Description |
|---|---|---|
| cursor (optional) |
string | An opaque string value that indicates where the results should start from. This value is returned as next_cursor after an initial query to the endpoint. |
| count (optional) |
integer | The number of results you would like returned from your request. The default value is 500. |
A sample request with query parameters. Be sure to encode all non-alphanumeric characters except -_.
GET https://api.catalog.beer/brewer?count=5&cursor=NQ%3D%3D
This request returns a list object with the following parameters.
| Parameter | Type | Description |
|---|---|---|
| object | string | The name of the object. In this case: “list”. |
| url | string | The API endpoint accessed to retrieve this object. In this case: /brewer. |
| has_more | Boolean | Whether or not there is more data available after this set. If false, you have reached the last items on the list. |
| next_cursor (optional) |
string | To retrieve the next set of results, provide this value as the cursor parameter on your subsequent API request. |
| data | array | An array containing all the brewers in the database sorted alphabetically by name. Each array object has the following attributes: id, name, and last_modified, described below. |
| id | string | The brewer_id. |
| name | string | The name of the brewer. |
| last_modified | integer | A Unix timestamp representing the date and time the brewer was last modified. |
curl -X GET \
'https://api.catalog.beer/brewer?count=2' \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
{
"object": "list",
"url": "/brewer",
"has_more": true,
"next_cursor": "Mg==",
"data": [
{
"id": "19555c52-ade8-43fe-a7a8-5888af0842e9",
"name": "'t Hofbrouwerijke",
"last_modified": 1588448205
},
{
"id": "d150fff4-ff71-4171-bd36-fb6dc8a83377",
"name": "(512) Brewing Company",
"last_modified": 1588448205
}
]
}
You can retrieve the total number of brewers that are in the database by sending a GET request the endpoint /brewer/count. A JSON object with the following parameters will be returned.
GET https://api.catalog.beer/brewer/count
| Parameter | Type | Description |
|---|---|---|
| object | string | The name of the object. In this case: “count”. |
| url | string | The API endpoint accessed to retrieve this object. In this case: /brewer/count. |
| value | integer | The number of brewers in the database. |
curl -X GET \
https://api.catalog.beer/brewer/count \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
{
"object": "count",
"url": "/brewer/count",
"value": 6760
}
Search for brewers by name or description using full-text search. To search, send a GET request to the /brewer/search endpoint with a q query parameter.
GET https://api.catalog.beer/brewer/search?q={query}
| Name | Type | Description |
|---|---|---|
| q | string | The search query string. Maximum 255 characters. |
| count (optional) |
integer | The number of results you would like returned. The default value is 25. Maximum is 100. |
| cursor (optional) |
string | An opaque string value that indicates where the results should start from. This value is returned as next_cursor after an initial query to the endpoint. |
A sample request with query parameters. Be sure to encode all non-alphanumeric characters except -_.
GET https://api.catalog.beer/brewer/search?q=stone+brewing&count=5
This request returns a list object with the following parameters. Results are sorted by relevance to the search query.
| Parameter | Type | Description |
|---|---|---|
| object | string | The name of the object. In this case: “list”. |
| url | string | The API endpoint accessed to retrieve this object. In this case: /brewer/search. |
| query | string | The search query that was submitted. |
| has_more | Boolean | Whether or not there are more results available. If false, you have reached the last items in the result set. |
| next_cursor (optional) |
string | To retrieve the next set of results, provide this value as the cursor parameter on your subsequent API request. Only present when has_more is true. |
| data | array | An array of brewer objects matching the search query, sorted by relevance. |
curl -X GET \
'https://api.catalog.beer/brewer/search?q=stone&count=1' \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
{
"object": "list",
"url": "/brewer/search",
"query": "stone",
"has_more": true,
"next_cursor": "MQ==",
"data": [
{
"id": "a751e1bb-e738-4a3a-906b-6a707e082908",
"object": "brewer",
"name": "Stone Coast Brewing",
"description": null,
"short_description": null,
"url": "http://www.stonecoast.com/",
"cb_verified": false,
"brewer_verified": false,
"last_modified": 1588448205
}
]
}
If you would like a list of all the beers made by a brewer, send a request to the /brewer/{brewer_id}/beer endpoint.
This request returns a list object with the following parameters.
| Parameter | Type | Description |
|---|---|---|
| object | string | The name of the object. In this case: “list”. |
| url | string | The API endpoint accessed to retrieve this object. In this case: /brewer/{brewer_id}/beer. |
| has_more | Boolean | As of this writing, this will always return false. In the future, if pagination of results is required, this value may become true. |
| brewer | object | A brewer object containing information for the requested {brewer_id}. |
| data | array | An array containing all the beers associated with this brewer in the database sorted alphabetically by name. Each array object has the following attributes: id, name, style, style_id, parent, class, and beverage_type described below. |
| id | string | The beer_id. |
| name | string | The name of the beer. |
| style | string | The style of the beer (human-readable label). |
| style_id | string | The canonical style id, or null if filed at the family/class level. |
| parent | string | The canonical family id (e.g. porter). |
| class | string | The super-class (ale/lager), or null. |
| beverage_type | string | beer, cider, perry, or mead. |
curl -X GET \
https://api.catalog.beer/brewer/ab94abb7-a3e8-4cce-8945-4758cac66a53/beer \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
{
"object": "list",
"url": "/brewer/ab94abb7-a3e8-4cce-8945-4758cac66a53/beer",
"has_more": false,
"brewer": {
"id": "ab94abb7-a3e8-4cce-8945-4758cac66a53",
"object": "brewer",
"name": "Ballast Point Brewing Company",
"description": null,
"short_description": null,
"url": "https://www.ballastpoint.com/",
"cb_verified": false,
"brewer_verified": false,
"last_modified": 1541544607
},
"data": [
{
"id": "650f8973-7c09-4cbf-99cd-857e095d84b0",
"name": "Abandon Ship With Chipotle",
"style": "Smoke Beer (Lager or Ale)",
"style_id": "smoke-beer",
"parent": "smoked-beer",
"class": null,
"beverage_type": "beer"
},
{
"id": "36ebef31-f05b-4c78-b7c1-731ed136fe11",
"name": "Ballast Point Belgian-Style Tripel",
"style": "Belgian-Style Tripel",
"style_id": "belgian-tripel",
"parent": "belgian-strong-ale",
"class": "ale",
"beverage_type": "beer"
},
{
"id": "e778b401-0c2b-4bc0-8b53-ccb59860c1bf",
"name": "Ballast Point Red Velvet Cake",
"style": "Chocolate / Cocoa-Flavored Beer",
"style_id": "chocolate-beer",
"parent": "flavored-beer",
"class": null,
"beverage_type": "beer"
}
]
}
Response truncated for documentation — this brewer has 81 beers in its data array.
If you would like to know all the locations associated with a brewer, send a request to the /brewer/{brewer_id}/locations endpoint.
This request returns a list object with the following parameters.
| Parameter | Type | Description |
|---|---|---|
| object | string | The name of the object. In this case: “list”. |
| url | string | The API endpoint accessed to retrieve this object. In this case: /brewer/{brewer_id}/locations. |
| has_more | Boolean | As of this writing, this will always return false. In the future, if pagination of results is required, this value may become true. |
| brewer | object | A brewer object for the requested brewer. |
| data | array | An array containing all the locations associated with this brewer in the database sorted alphabetically by name. Each array object has the following attributes: id and name described below. |
| id | string | The location_id. |
| name | string | The name of the location. |
curl -X GET \
https://api.catalog.beer/brewer/ab94abb7-a3e8-4cce-8945-4758cac66a53/locations \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
{
"object": "list",
"url": "/brewer/ab94abb7-a3e8-4cce-8945-4758cac66a53/locations",
"has_more": false,
"brewer": {
"id": "ab94abb7-a3e8-4cce-8945-4758cac66a53",
"object": "brewer",
"name": "Ballast Point Brewing Company",
"description": null,
"short_description": null,
"url": "https://www.ballastpoint.com/",
"cb_verified": false,
"brewer_verified": false,
"last_modified": 1541544607
},
"data": [
{
"id": "76b558cd-a5f7-4fbe-820a-7a9dc9a924fe",
"name": "Chicago"
},
{
"id": "e6c0250b-f179-48ac-8eab-a97c5159c733",
"name": "Daleville"
},
{
"id": "4ece62c7-38c2-41a2-a4db-02048e46fe55",
"name": "Home Brew Mart"
},
{
"id": "972dc9a3-4462-48b5-9a0f-eb0ab6f94738",
"name": "Little Italy"
},
{
"id": "275047c9-72f4-4bec-a61e-26bf2b9d3f3e",
"name": "Long Beach"
},
{
"id": "baa6cb7d-391b-4755-8881-b4a123ed821a",
"name": "Miramar"
},
{
"id": "132eece9-6d63-42a4-81b1-0177a0050414",
"name": "Scripps Ranch"
},
{
"id": "2cc26eda-0028-4821-8e8f-df48c7688f77",
"name": "Temecula"
},
{
"id": "795b4249-04ed-4061-beda-9273a5feeabd",
"name": "The Kettle Room"
}
]
}
Beer is at the heart of it all. From an API perspective, beers are associated with brewers via a brewer_id.
When you add a new beer, are looking for information on a specific beer, or are updating a beer in the database, successful requests will return the beer object in JSON format. That object has the following parameters.
| Parameter | Type | Description |
|---|---|---|
| id | string | The beer_id; a unique identifier for the beer. |
| object | string | The name of the object; in this case: “beer”. |
| name | string | The name of the beer. |
| style | string | The style of the beer as a human-readable label — the brewer’s own wording, preserved exactly (e.g. “West Coast IPA”). |
| style_id | string | The canonical style the label resolved to (e.g. american-ipa), or null when the beer is filed at the family or class level rather than a specific style. |
| parent | string | The canonical family (e.g. ipa) the beer belongs to. Derived from style_id, or set directly when filed at the family level. |
| class | string | The super-class the beer rolls up to: ale or lager, or null for families that do not roll up to one (wheat, sour, cider, mead, etc.). |
| beverage_type | string | One of beer, cider, perry, or mead. Derived from the resolved style; never trusted from client input. |
| description | string | A description of the beer. This field may contain a basic description, may contain tasting notes and/or brewer’s notes. This field may contain markdown or new line characters. |
| abv | float | The Alcohol by Volume (ABV) percentage of the beer. |
| ibu | integer | The International Bitterness/Bittering Units (IBU) value of the beer. |
| cb_verified | Boolean | A true or false value denoting whether or not a Catalog.beer administrator has verified the brewer's information. |
| brewer_verified | Boolean | A true or false value denoting whether or not the brewer themselves has contributed and verified their information. |
| last_modified | integer | A Unix timestamp indicating when the beer was last modified. |
| brewer | object | A brewer object containing information on the brewer. |
{
"id": "6a7119c6-92a2-40d2-b87a-2e4529c8577a",
"object": "beer",
"name": "Sculpin IPA",
"style": "American-Style India Pale Ale",
"style_id": "american-ipa",
"parent": "ipa",
"class": "ale",
"beverage_type": "beer",
"description": "Our Sculpin IPA is a great example of what got us into brewing in the first place. After years of experimenting, we knew hopping an ale at five separate stages would produce something special. The result ended up being this gold-medal winning IPA, whose inspired use of hops creates hints of apricot, peach, mango and lemon flavors.",
"abv": 7,
"ibu": 70,
"cb_verified": true,
"brewer_verified": false,
"last_modified": 1783642824,
"brewer": {
"id": "ab94abb7-a3e8-4cce-8945-4758cac66a53",
"object": "brewer",
"name": "Ballast Point Brewing Company",
"description": null,
"short_description": null,
"url": "https://www.ballastpoint.com/",
"cb_verified": false,
"brewer_verified": false,
"last_modified": 1541544607
}
}
To add a beer to the database, send a POST request to the /beer endpoint with the following parameters encoded in the body of the request as JSON. Successful requests will return a beer object.
POST https://api.catalog.beer/beer
The style you submit is kept exactly as you wrote it and matched to the catalog’s standard list of styles — for example, “West Coast IPA” resolves to the west-coast-ipa style, “IPA” to the ipa family, and “Lager” to the lager class. To name the classification yourself, send style_id, parent, or class; if you send more than one, the most specific wins. If the label doesn’t match and no classification is given, the request returns a 400 Bad Request error. See Styles.
| Parameter | Type | Description |
|---|---|---|
| brewer_id | string | The brewer_id for the brewer who makes the beer. |
| name | string | The name of the beer. |
| style | string | The brewer’s style label, resolved to a canonical style/family/class (see note above). Required unless you supply style_id, parent, or class. |
| style_id (optional) |
string | File at a specific canonical style (e.g. american-ipa). Takes precedence over style. |
| parent (optional) |
string | File at a family (e.g. ipa) without choosing a specific style. |
| class (optional) |
string | File at a super-class: ale or lager. |
| description (optional) |
string | A description of the beer. This may be a basic description, or it can be detailed, containing tasting notes and brewer’s notes. This field may contain markdown and new line characters. |
| abv | float | The Alcohol by Volume (ABV) percentage of the beer. |
| ibu (optional) |
integer | The International Bitterness/Bittering Units (IBU) value of the beer. |
curl -X POST \
https://api.catalog.beer/beer \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
-H 'content-type: application/json' \
-d '{"brewer_id": "ab94abb7-a3e8-4cce-8945-4758cac66a53", "name": "Sculpin IPA", "style": "American-Style India Pale Ale", "description": "Our Sculpin IPA is a great example of what got us into brewing in the first place. After years of experimenting, we knew hopping an ale at five separate stages would produce something special. The result ended up being this gold-medal winning IPA, whose inspired use of hops creates hints of apricot, peach, mango and lemon flavors.", "abv": 7, "ibu": 70}'
To replace a beer’s data, send a PUT request to the /beer endpoint with the beer_id appended to the path. All required fields must be present. Omitted optional fields will be cleared to null. If the beer does not exist, it will be created and a 201 Created response will be returned. Successful requests return a beer object.
PUT https://api.catalog.beer/beer/{beer_id}
The style fields work the same as when adding a beer: send the label as style, or name the classification with style_id, parent, or class. If the label doesn’t match and no classification is given, the request returns a 400 Bad Request error — unless the label is unchanged from the beer’s current style, in which case the update succeeds and the beer keeps its current classification. See Styles.
| Parameter | Type | Description |
|---|---|---|
| brewer_id | string | The brewer_id for the brewer who makes the beer. |
| name | string | The name of the beer. |
| style | string | The brewer’s style label, resolved to a canonical style/family/class. Required unless you supply style_id, parent, or class. |
| style_id (optional) |
string | File at a specific canonical style (e.g. american-ipa). Takes precedence over style. |
| parent (optional) |
string | File at a family (e.g. ipa) without choosing a specific style. |
| class (optional) |
string | File at a super-class: ale or lager. |
| abv | float | The Alcohol by Volume (ABV) percentage of the beer. |
| description (optional) |
string | A description of the beer. Cleared if omitted. |
| ibu (optional) |
integer | The International Bitterness/Bittering Units (IBU) value of the beer. Cleared if omitted. |
curl -X PUT \
https://api.catalog.beer/beer/6a7119c6-92a2-40d2-b87a-2e4529c8577a \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
-H 'content-type: application/json' \
-d '{"brewer_id": "ab94abb7-a3e8-4cce-8945-4758cac66a53", "name": "Sculpin IPA", "style": "American-Style India Pale Ale", "description": "Our Sculpin IPA is a great example of what got us into brewing in the first place. After years of experimenting, we knew hopping an ale at five separate stages would produce something special. The result ended up being this gold-medal winning IPA, whose inspired use of hops creates hints of apricot, peach, mango and lemon flavors.", "abv": 7, "ibu": 70}'
To partially update a beer, send a PATCH request to the /beer endpoint with the beer_id appended to the path. Only the fields you include will be updated; all other fields remain unchanged. Successful requests return a beer object.
PATCH https://api.catalog.beer/beer/{beer_id}
To change a beer’s style, send any of style, style_id, parent, or class. The style is re-resolved and all of the beer’s classification fields are updated together. Resending the beer’s current style unchanged never fails — the beer keeps its current classification. See Styles.
| Parameter | Type | Description |
|---|---|---|
| brewer_id (optional) |
string | The brewer_id for the brewer who makes the beer. |
| name (optional) |
string | The name of the beer. |
| style (optional) |
string | The brewer’s style label, re-resolved to a canonical style/family/class. |
| style_id (optional) |
string | File at a specific canonical style (e.g. american-ipa). |
| parent (optional) |
string | File at a family (e.g. ipa). |
| class (optional) |
string | File at a super-class: ale or lager. |
| description (optional) |
string | A description of the beer. |
| abv (optional) |
float | The Alcohol by Volume (ABV) percentage of the beer. |
| ibu (optional) |
integer | The International Bitterness/Bittering Units (IBU) value of the beer. |
curl -X PATCH \
https://api.catalog.beer/beer/6a7119c6-92a2-40d2-b87a-2e4529c8577a \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
-H 'content-type: application/json' \
-d '{"abv":7,"ibu":70}'
To delete a beer, send a DELETE request to the /beer endpoint with the beer_id appended to the path. No request body is required. Successful requests return a 204 No Content response with no body.
DELETE https://api.catalog.beer/beer/{beer_id}
curl -X DELETE \
https://api.catalog.beer/beer/6a7119c6-92a2-40d2-b87a-2e4529c8577a \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
To retrieve a beer, send a GET request to the /beer endpoint with the {beer_id} parameter appended to the path.
GET https://api.catalog.beer/beer/{beer_id}
A beer object will be returned for successful requests.
curl -X GET \
https://api.catalog.beer/beer/6a7119c6-92a2-40d2-b87a-2e4529c8577a \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
Retrieves a list of all the beer in the database. To access this data, send a GET request to the /beer endpoint.
GET https://api.catalog.beer/beer
| Name | Type | Description |
|---|---|---|
| cursor (optional) |
string | An opaque string value that indicates where the results should start from. This value is returned as next_cursor after an initial query to the endpoint. |
| count (optional) |
integer | The number of results you would like returned from your request. The default value is 500. |
A sample request with query parameters. Be sure to encode all non-alphanumeric characters except -_.
GET https://api.catalog.beer/beer?count=5&cursor=NQ%3D%3D
This request returns a list object with the following parameters.
| Parameter | Type | Description |
|---|---|---|
| object | string | The name of the object. In this case: “list”. |
| url | string | The API endpoint accessed to retrieve this object. In this case: /beer. |
| has_more | Boolean | Whether or not there is more data available after this set. If false, you have reached the last items on the list. |
| next_cursor | string | To retrieve the next set of results, provide this value as the cursor parameter on your subsequent API request. |
| data | array | An array containing all the beers in the database sorted alphabetically by name. Each array object has the following attributes: id, name, and last_modified, described below. |
| id | string | The beer_id. |
| name | string | The name of the beer. |
| last_modified | integer | A Unix timestamp representing the date and time the beer was last modified. |
curl -X GET \
'https://api.catalog.beer/beer?count=3' \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
{
"object": "list",
"url": "/beer",
"has_more": true,
"next_cursor": "Mw==",
"data": [
{
"id": "ed8d5bcd-9016-4954-9f4c-81855dbad55a",
"name": "¡Ándale! Pale Ale",
"last_modified": 1588448205
},
{
"id": "64cd7a20-ebf3-4358-bacf-180d1b7d9b96",
"name": "¡Guava Libre!",
"last_modified": 1588448205
},
{
"id": "5e4bf0c1-c743-4438-9289-6e77c17ad467",
"name": "¡Magnifico!",
"last_modified": 1588448205
}
]
}
To retrieve the total number of beers that are in the database, send a GET request to the /beer/count endpoint. A JSON object with the following parameters will be returned.
GET https://api.catalog.beer/beer/count
curl -X GET \
https://api.catalog.beer/beer/count \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
{
"object": "count",
"url": "/beer/count",
"value": 60605
}
Search for beer by name, style, or description using full-text search. To search, send a GET request to the /beer/search endpoint with a q query parameter.
GET https://api.catalog.beer/beer/search?q={query}
| Name | Type | Description |
|---|---|---|
| q | string | The search query string. Maximum 255 characters. |
| count (optional) |
integer | The number of results you would like returned. The default value is 25. Maximum is 100. |
| cursor (optional) |
string | An opaque string value that indicates where the results should start from. This value is returned as next_cursor after an initial query to the endpoint. |
A sample request with query parameters. Be sure to encode all non-alphanumeric characters except -_.
GET https://api.catalog.beer/beer/search?q=ipa&count=5
This request returns a list object with the following parameters. Results are sorted by relevance to the search query. Each result is a full beer object including the nested brewer object, so you can display results without making additional API calls.
| Parameter | Type | Description |
|---|---|---|
| object | string | The name of the object. In this case: “list”. |
| url | string | The API endpoint accessed to retrieve this object. In this case: /beer/search. |
| query | string | The search query that was submitted. |
| has_more | Boolean | Whether or not there are more results available. If false, you have reached the last items in the result set. |
| next_cursor (optional) |
string | To retrieve the next set of results, provide this value as the cursor parameter on your subsequent API request. Only present when has_more is true. |
| data | array | An array of beer objects matching the search query, sorted by relevance. Each beer object includes a nested brewer object. |
curl -X GET \
'https://api.catalog.beer/beer/search?q=sculpin&count=1' \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
{
"object": "list",
"url": "/beer/search",
"query": "sculpin",
"has_more": true,
"next_cursor": "MQ==",
"data": [
{
"id": "6a7119c6-92a2-40d2-b87a-2e4529c8577a",
"object": "beer",
"name": "Sculpin IPA",
"style": "American-Style India Pale Ale",
"style_id": "american-ipa",
"parent": "ipa",
"class": "ale",
"beverage_type": "beer",
"description": "Our Sculpin IPA is a great example of what got us into brewing in the first place. After years of experimenting, we knew hopping an ale at five separate stages would produce something special. The result ended up being this gold-medal winning IPA, whose inspired use of hops creates hints of apricot, peach, mango and lemon flavors.",
"abv": 7,
"ibu": 70,
"cb_verified": true,
"brewer_verified": false,
"last_modified": 1783642824,
"brewer": {
"id": "ab94abb7-a3e8-4cce-8945-4758cac66a53",
"object": "brewer",
"name": "Ballast Point Brewing Company",
"description": null,
"short_description": null,
"url": "https://www.ballastpoint.com/",
"cb_verified": false,
"brewer_verified": false,
"last_modified": 1541544607
}
}
]
}
Catalog.beer records a beer’s style in two parts: the brewer’s own label and a canonical classification. The label (beer.style) is plain text, stored and returned exactly as submitted. The classification files the beer against a standard vocabulary of styles, which is what allows the catalog to be sorted, filtered, and counted by style. The vocabulary is drawn from the Brewers Association (BA) and Beer Judge Certification Program (BJCP) style guidelines.
The vocabulary has three tiers, from broadest to most specific. Each tier corresponds to a field on the beer object.
| Tier | Beer Field | Description |
|---|---|---|
| Class | class | The broadest grouping: ale or lager. Some families (e.g. wheat beers, sours, ciders, meads) do not roll up to a class; for those, class is null. |
| Family | parent | A group of related styles, such as ipa, stout, or pilsner. |
| Style | style_id | One specific style, such as american-ipa or west-coast-ipa. |
A beer may be filed at any tier. The API derives the broader tiers from the one you provide — file a beer as west-coast-ipa and its parent is set to ipa and its class to ale. The API never fills in a more specific tier than the one you gave it.
When adding or updating a beer, there are two ways to set the classification:
If the label doesn’t match anything in the vocabulary and no classification is given, the request returns a 400 Bad Request error. The vocabulary includes catch-all styles (catch_all: true — e.g. specialty-beer) for beers that don’t fit a more specific style. One exception: when updating an existing beer, resending its current label unchanged never fails — the beer keeps its current classification, even if that label wouldn’t resolve on its own.
The beer’s beverage_type (beer, cider, perry, or mead) is set from the resolved classification. It cannot be set directly.
The /style endpoints are read-only. Use them to browse the vocabulary, build a style picker, or check a label before submitting a beer.
The /style endpoints return style objects. List Styles returns a compact form of each; Retrieve a Style returns the full object, adding parent_name, source, and specs.
| Field | Type | Description |
|---|---|---|
| id | string | The style’s slug (e.g. american-ipa) — the value used as style_id on a beer. |
| object | string | Always style. |
| name | string | The canonical style name (e.g. “American-Style India Pale Ale”). |
| beverage_type | string | One of beer, cider, perry, or mead. |
| parent | string | The slug of the family this style belongs to (e.g. ipa) — the canonical family tier you can file a beer at. |
| class | string | The slug of the class the style rolls up to (ale or lager), or null for families that do not roll up to one. |
| parent_name (detail only) | string | The display name of the parent family (e.g. “India Pale Ale”). |
| source (detail only) | string | The primary guideline the style is drawn from: BA-2026, BJCP-2021, OCB-2012, or NABA-2024. |
| catch_all | Boolean | true for non-standard “catch-all” styles (e.g. specialty-beer) used when nothing more specific fits. Use it to separate fallback buckets from standard styles — for example, keeping catch-alls out of a picker’s ranked matches. |
| aliases | array | Other names and spellings that resolve to this style, excluding the canonical name. Use these to match user-entered labels client-side — for example, in a typeahead — without an API request per keystroke. |
| specs (detail only) | object | The style’s guideline ranges — abv, ibu, srm, og, and fg. See the specs field below. |
The specs field (detail only) holds the style’s guideline ranges, drawn from the same source as the style. Each field is a { "min": …, "max": … } object, or null when the guideline doesn’t specify that measurement. An individual min or max may also be null when the guideline gives only one bound.
| Field | Type | Description |
|---|---|---|
| abv | object | Alcohol by Volume range, as a percentage (e.g. 6.3 means 6.3%).min and max are floats. |
| ibu | object | International Bitterness Units range — the measure of hop bitterness. min and max are integers. |
| srm | object | Standard Reference Method range — beer color, from pale straw (low) to black (high). min and max are floats. |
| og | object | Original Gravity range — the wort’s specific gravity before fermentation. min and max are floats. |
| fg | object | Final Gravity range — the beer’s specific gravity after fermentation. min and max are floats. |
{
"id": "american-ipa",
"object": "style",
"name": "American-Style India Pale Ale",
"beverage_type": "beer",
"parent": "ipa",
"class": "ale",
"parent_name": "India Pale Ale",
"source": "BA-2026",
"catch_all": false,
"aliases": ["American India Pale Ale", "American IPA"],
"specs": {
"abv": { "min": 6.3, "max": 7.5 },
"ibu": { "min": 50, "max": 70 },
"srm": { "min": 4, "max": 12 },
"og": { "min": 1.06, "max": 1.07 },
"fg": { "min": 1.01, "max": 1.016 }
}
}
To list every style in the vocabulary, send a GET request to the /style endpoint. Styles are returned alphabetically by name as compact style objects. The response also includes a version field identifying the current version of the vocabulary; when it changes, refresh any cached copy.
GET https://api.catalog.beer/style
curl -X GET \
https://api.catalog.beer/style \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
{
"object": "list",
"url": "/style",
"version": "2.3.0",
"has_more": false,
"data": [
{
"id": "american-ipa",
"object": "style",
"name": "American-Style India Pale Ale",
"beverage_type": "beer",
"parent": "ipa",
"class": "ale",
"catch_all": false,
"aliases": ["American India Pale Ale", "American IPA"]
}
]
}
Response truncated for documentation — the full response contains every style in the vocabulary.
To retrieve a single style, send a GET request to the /style endpoint with the {style_id} parameter appended to the path. The style_id is the style’s slug (e.g. american-ipa), not a UUID. Successful requests return a full style object, including its specs.
GET https://api.catalog.beer/style/{style_id}
curl -X GET \
https://api.catalog.beer/style/american-ipa \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
{
"id": "american-ipa",
"object": "style",
"name": "American-Style India Pale Ale",
"beverage_type": "beer",
"parent": "ipa",
"class": "ale",
"parent_name": "India Pale Ale",
"source": "BA-2026",
"catch_all": false,
"aliases": ["American India Pale Ale", "American IPA"],
"specs": {
"abv": { "min": 6.3, "max": 7.5 },
"ibu": { "min": 50, "max": 70 },
"srm": { "min": 4, "max": 12 },
"og": { "min": 1.06, "max": 1.07 },
"fg": { "min": 1.01, "max": 1.016 }
}
}
To list the families in the vocabulary (the parent tier), send a GET request to the /style/parent endpoint. Families are returned in display order. Each family object has the following parameters.
GET https://api.catalog.beer/style/parent
| Parameter | Type | Description |
|---|---|---|
| slug | string | The family’s slug (e.g. ipa) — the value used as parent on a beer. |
| object | string | The name of the object; in this case: “style_parent”. |
| name | string | The name of the family (e.g. “India Pale Ale”). |
| beverage_type | string | One of beer, cider, perry, or mead. |
| class | string | The slug of the class this family rolls up to (ale or lager), or null if it does not roll up to one. |
| description | string | A brief description of the family. |
| sort_order | integer | The family’s position in display order. |
| aliases | array | Names and spellings that resolve to this family when sent as a beer’s style. |
curl -X GET \
https://api.catalog.beer/style/parent \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
{
"object": "list",
"url": "/style/parent",
"has_more": false,
"data": [
{
"slug": "ipa",
"object": "style_parent",
"name": "India Pale Ale",
"beverage_type": "beer",
"class": "ale",
"description": "The hop showcase of brewing: pale, bitter, and intensely aromatic ales ranging from crisp, resinous West Coast versions to soft, juicy hazy ones, plus session, double, Belgian, and black variations. Hops drive the aroma, flavor, and bitterness, with malt kept in a supporting role.",
"sort_order": 2,
"aliases": ["India Pale Ale", "IPA", "IPAs"]
}
]
}
Response truncated for documentation — the full response contains every family.
To list the classes in the vocabulary — currently ale and lager — send a GET request to the /style/class endpoint. Classes are returned in display order. Each class object has the following parameters.
GET https://api.catalog.beer/style/class
| Parameter | Type | Description |
|---|---|---|
| slug | string | The class’s slug (e.g. ale) — the value used as class on a beer. |
| object | string | The name of the object; in this case: “style_class”. |
| name | string | The name of the class (e.g. “Ale”). |
| beverage_type | string | One of beer, cider, perry, or mead. |
| sort_order | integer | The class’s position in display order. |
| aliases | array | Names and spellings that resolve to this class when sent as a beer’s style. |
curl -X GET \
https://api.catalog.beer/style/class \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
{
"object": "list",
"url": "/style/class",
"has_more": false,
"data": [
{
"slug": "ale",
"object": "style_class",
"name": "Ale",
"beverage_type": "beer",
"sort_order": 1,
"aliases": ["Ale", "Ales"]
},
{
"slug": "lager",
"object": "style_class",
"name": "Lager",
"beverage_type": "beer",
"sort_order": 2,
"aliases": ["Lager", "Lagers"]
}
]
}
Brewers can have multiple locations associated with them. These should be public locations at which beer is served as opposed to a production or office space that does not offer beer tasting.
When you add an address to a location, are looking for information on a specific location, or are updating a location in the database, successful requests will return the location object in JSON format. That object has the following parameters.
| Parameter | Type | Description |
|---|---|---|
| id | string | The location_id; a unique identifier for the location. |
| object | string | The name of the object; in this case: “location”. |
| name | string | The name of the location. |
| url | string | A URL that is specific to the location. |
| country_code | string | The ISO 3166–1 Alpha–2 Code for the country in which the location is located. Reference the ISO 3166 standard. |
| country_short_name | string | The ISO 3166–1 short name for the country, in title case. Reference the ISO 3166 standard. |
| latitude (optional) |
float | The latitude of the location. |
| longitude (optional) |
float | The longitude of the location. |
| cb_verified | Boolean | A true or false value denoting whether or not a Catalog.beer administrator has verified the location’s information. |
| brewer_verified | Boolean | A true or false value denoting whether or not the brewer themselves has contributed and verified the location’s information. |
| last_modified | integer | A Unix timestamp indicating when the location was last modified. |
| address (optional) |
object | At this time, the database supports addresses for locations in the United States. See the US Addresses object. The telephone field is included within this object. |
| brewer | object | A brewer object containing information on the brewer associated with this location. |
Sample location object with a US address.
{
"id": "972dc9a3-4462-48b5-9a0f-eb0ab6f94738",
"object": "location",
"name": "Little Italy",
"url": "https://www.ballastpoint.com/location/ballast-point-little-italy/",
"country_code": "US",
"country_short_name": "United States of America",
"latitude": 32.7276344,
"longitude": -117.1697159,
"cb_verified": false,
"brewer_verified": false,
"last_modified": 1589147029,
"address": {
"address1": null,
"address2": "2215 India St",
"city": "San Diego",
"sub_code": "US-CA",
"state_short": "CA",
"state_long": "California",
"zip5": 92101,
"zip4": 1725,
"telephone": 6192557213
},
"brewer": {
"id": "ab94abb7-a3e8-4cce-8945-4758cac66a53",
"object": "brewer",
"name": "Ballast Point Brewing Company",
"description": null,
"short_description": null,
"url": "https://www.ballastpoint.com/",
"cb_verified": false,
"brewer_verified": false,
"last_modified": 1541544607
}
}
To add a location for a brewer, send a POST request to the /location endpoint with the following parameters encoded in the body of the request as JSON. Successful requests will return a location object.
POST https://api.catalog.beer/location
| Parameter | Type | Description |
|---|---|---|
| brewer_id | string | The brewer_id for the brewer you would like to associate the location with. |
| name | string | The name of the location. This can be generic and mirror the name of the city in which it is located or can be specific. |
| url (optional) |
string | A URL specific to the location. This URL should provide visitors additional information on the beer tasting location (e.g. address, hours, or more information). It should not be the same as the brewer’s URL. |
| country_code | string | The ISO 3166–1 Alpha–2 Code for the country in which the location is located. Reference the ISO 3166 standard. |
curl -X POST \
https://api.catalog.beer/location \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
-H 'content-type: application/json' \
-d '{"brewer_id":"9f96b99b-9865-4cf0-8950-bdc0d675be9f","name":"San Pedro","country_code":"US"}'
{
"id": "9c6a2a29-6c1d-4fdc-ba34-b9c7e2c1e14b",
"object": "location",
"name": "San Pedro",
"url": null,
"country_code": "US",
"country_short_name": "United States of America",
"latitude": null,
"longitude": null,
"cb_verified": false,
"brewer_verified": false,
"last_modified": 1589147029,
"brewer": {
"id": "9f96b99b-9865-4cf0-8950-bdc0d675be9f",
"object": "brewer",
"name": "Brouwerij West",
"description": null,
"short_description": null,
"url": "https://www.brouwerijwest.com/",
"cb_verified": true,
"brewer_verified": false,
"last_modified": 1517001234
}
}
To replace a location’s data, send a PUT request to the /location endpoint with the location_id appended to the path. All required fields must be present. Omitted optional fields will be cleared to null. If the location does not exist, it will be created and a 201 Created response will be returned. Successful requests return a location object.
PUT https://api.catalog.beer/location/{location_id}
| Parameter | Type | Description |
|---|---|---|
| brewer_id | string | The brewer_id for the brewer you would like to associate the location with. |
| name | string | The name of the location. |
| country_code | string | The ISO 3166–1 Alpha–2 Code for the country in which the location is located. |
| url (optional) |
string | A URL specific to the location. Cleared if omitted. |
curl -X PUT \
https://api.catalog.beer/location/9c6a2a29-6c1d-4fdc-ba34-b9c7e2c1e14b \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
-H 'content-type: application/json' \
-d '{"brewer_id":"9f96b99b-9865-4cf0-8950-bdc0d675be9f","name":"San Pedro","country_code":"US"}'
To partially update a location, send a PATCH request to the /location endpoint with the location_id appended to the path. Only the fields you include will be updated; all other fields remain unchanged. Successful requests return a location object.
PATCH https://api.catalog.beer/location/{location_id}
| Parameter | Type | Description |
|---|---|---|
| brewer_id (optional) |
string | The brewer_id for the brewer you would like to associate the location with. |
| name (optional) |
string | The name of the location. |
| country_code (optional) |
string | The ISO 3166–1 Alpha–2 Code for the country in which the location is located. |
| url (optional) |
string | A URL specific to the location. |
curl -X PATCH \
https://api.catalog.beer/location/9c6a2a29-6c1d-4fdc-ba34-b9c7e2c1e14b \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
-H 'content-type: application/json' \
-d '{"name":"San Pedro"}'
To delete a location, send a DELETE request to the /location endpoint with the location_id appended to the path. No request body is required. Successful requests return a 204 No Content response with no body.
DELETE https://api.catalog.beer/location/{location_id}
curl -X DELETE \
https://api.catalog.beer/location/9c6a2a29-6c1d-4fdc-ba34-b9c7e2c1e14b \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
Addresses and telephone numbers are stored separately from locations to allow for country specific addressing schemes and telephone numbers. Hence the need to make a second request to add an address to a location.
To add an address or telephone number for a location, send a POST request to the /address endpoint with the location_id appended to the path and the following parameters encoded in the body of the request as JSON. Successful requests will return a location object.
Currently, only US addresses are supported. This documentation will be updated once support for other countries has been added.
POST https://api.catalog.beer/address/{location_id}
| Parameter | Type | Description |
|---|---|---|
| address1 (optional) |
string | The suite or unit number of the location (if applicable - e.g. Suite 101). |
| address2 | string | The street address of the location. |
| city (optional) Either the city and sub_code must be provided OR the zip5 must be provided. |
string | The name of the city. |
| sub_code (optional) Either the city and sub_code must be provided OR the zip5 must be provided. |
string | The ISO 3166–2 Code for the subdivision in which the location is located. Reference the ISO 3166 standard. (e.g. “US-CA” for California) |
| zip5 (optional) Either the city and sub_code must be provided OR the zip5 must be provided. |
string | The traditional 5-digit ZIP Code for the location. |
| zip4 (optional) |
string | The additional ZIP+4 Code used by the US Postal Service. More on the ZIP+4 Code. |
| telephone (optional) |
string | The 10-digit telephone number for the location. You may submit the number with formatting (e.g. (555) 444–3333) or as an integer. Formatting will be stripped when the data is processed and an integer will be returned. |
curl -X POST \
https://api.catalog.beer/address/9c6a2a29-6c1d-4fdc-ba34-b9c7e2c1e14b \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
-H 'content-type: application/json' \
-d '{"address1":"Warehouse No 9","address2":"110 E 22nd St","city":"San Pedro","sub_code":"US-CA","telephone":"3108339330"}'
{
"id": "9c6a2a29-6c1d-4fdc-ba34-b9c7e2c1e14b",
"object": "location",
"name": "San Pedro",
"url": null,
"country_code": "US",
"country_short_name": "United States of America",
"latitude": 33.7273445,
"longitude": -118.2799377,
"cb_verified": false,
"brewer_verified": false,
"last_modified": 1589147029,
"address": {
"address1": "Warehouse No 9",
"address2": "110 E 22nd St",
"city": "San Pedro",
"sub_code": "US-CA",
"state_short": "CA",
"state_long": "California",
"zip5": 90731,
"zip4": 7202,
"telephone": 3108339330
},
"brewer": {
"id": "9f96b99b-9865-4cf0-8950-bdc0d675be9f",
"object": "brewer",
"name": "Brouwerij West",
"description": null,
"short_description": null,
"url": "https://www.brouwerijwest.com/",
"cb_verified": true,
"brewer_verified": false,
"last_modified": 1517001234
}
}
To create or replace an address for a location, send a PUT request to the /address endpoint with the location_id appended to the path. This will completely replace any existing address data for the location. Omitted optional fields will be cleared to null. Successful requests will return a location object.
PUT https://api.catalog.beer/address/{location_id}
| Parameter | Type | Description |
|---|---|---|
| address1 (optional) |
string | The suite or unit number of the location (if applicable - e.g. Suite 101). Cleared if omitted. |
| address2 | string | The street address of the location. |
| city (optional) Either the city and sub_code must be provided OR the zip5 must be provided. |
string | The name of the city. |
| sub_code (optional) Either the city and sub_code must be provided OR the zip5 must be provided. |
string | The ISO 3166–2 Code for the subdivision in which the location is located. Reference the ISO 3166 standard. (e.g. “US-CA” for California) |
| zip5 (optional) Either the city and sub_code must be provided OR the zip5 must be provided. |
string | The traditional 5-digit ZIP Code for the location. |
| zip4 (optional) |
string | The additional ZIP+4 Code used by the US Postal Service. Cleared if omitted. |
| telephone (optional) |
string | The 10-digit telephone number for the location. Cleared if omitted. |
curl -X PUT \
https://api.catalog.beer/address/9c6a2a29-6c1d-4fdc-ba34-b9c7e2c1e14b \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
-H 'content-type: application/json' \
-d '{"address1":"Warehouse No 9","address2":"110 E 22nd St","city":"San Pedro","sub_code":"US-CA","zip5":"90731","zip4":"7202","telephone":"3108339330"}'
To retrieve a location, send a GET request to the /location endpoint with the {location_id} parameter appended to the path.
GET https://api.catalog.beer/location/{location_id}
A location object will be returned for successful requests.
curl -X GET \
https://api.catalog.beer/location/972dc9a3-4462-48b5-9a0f-eb0ab6f94738 \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
One of the questions that gets asked most is “where is the nearest brewery?” or “I’m heading to Acme town, what breweries are local?”. To answer those questions or questions like them, use this endpoint.
To retrieve a location, send a GET request to the /location/nearby endpoint with the {latitude} and {longitude} query parameters appended to the path.
| Name | Type | Description |
|---|---|---|
| latitude | float | The latitude of the location where you would like to search around. Combined with longitude, this pair describes the center of your search radius. |
| longitude | float | The longitude of the location where you would like to search around. Combined with latitude, this pair describes the center of your search radius. |
| search_radius (optional) |
integer | The radius of the search circle, centered at the provided latitude and longitude. If left empty, the default value of 25 will be used. The default units are miles. Use the metric flag to search in kilometers. |
| metric (optional) |
boolean | Set this value to true if you would like your search radius and results to be measured in kilometers. The default value for this variable is false, yielding a search radius and results measured in miles, though you can state it explicitly. |
| cursor (optional) |
string | An opaque string value that indicates where the results should start from. This value is returned as next_cursor after an initial query to the endpoint. |
| count (optional) |
integer | The number of results you would like returned from your request. The default value is 100. |
A sample request with query parameters.
GET https://api.catalog.beer/location/nearby?latitude={latitude}&longitude={longitude}
This request returns a list object with the following parameters.
| Parameter | Type | Description |
|---|---|---|
| object | string | The name of the object. In this case: “list”. |
| url | string | The API endpoint accessed to retrieve this object. In this case: /location/nearby. |
| has_more | Boolean | Whether or not there is more data available after this set. If false, you have reached the last items on the list. |
| next_cursor (optional) |
string | To retrieve the next set of results, provide this value as the cursor parameter on your subsequent API request. Only present when has_more is true. |
| data | array |
An array containing all the locations that match your query parameters. Each result contains three objects:
|
| distance | float | The straight line distance from the query latitude and longitude to the brewery, rounded to the tenths place (a single decimal place). |
| units | string | The unit of distance. The value of this field will be either “miles” (the default value) or “kilometers” if the metric query parameter is set to true. |
curl -X GET \
'https://api.catalog.beer/location/nearby?latitude=32.748482&longitude=-117.130094&search_radius=10&count=1' \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
{
"object": "list",
"url": "/location/nearby",
"has_more": true,
"next_cursor": "MQ==",
"data": [
{
"location": {
"id": "0b4ee673-8db0-4952-bbd6-cc0b69994c10",
"object": "location",
"name": "North Park",
"brewer_id": "7205f9f1-6bf0-4241-9f0f-35a2351d8450",
"url": null,
"country_code": "US",
"country_short_name": "United States of America",
"latitude": 32.7476883,
"longitude": -117.12854,
"telephone": 6192557136,
"address": {
"address1": null,
"address2": "3812 Grim Ave",
"city": "San Diego",
"sub_code": "US-CA",
"state_short": "CA",
"state_long": "California",
"zip5": 92104,
"zip4": 3602
}
},
"distance": {
"distance": 0.1,
"units": "miles"
},
"brewer": {
"id": "7205f9f1-6bf0-4241-9f0f-35a2351d8450",
"object": "brewer",
"name": "Mike Hess Brewing Co.",
"description": null,
"short_description": null,
"url": "https://www.mikehessbrewing.com/",
"cb_verified": true,
"brewer_verified": false
}
}
]
}
Find nearby brewery locations by providing a US ZIP code. This endpoint geocodes the ZIP code and returns locations within the search radius, just like the Find Nearby Locations endpoint.
Send a GET request to the /location/zip endpoint with the zip_code query parameter.
| Name | Type | Description |
|---|---|---|
| zip_code | string | A 5-digit US ZIP code (e.g., 92104). |
| search_radius (optional) |
integer | The radius of the search circle, centered at the provided ZIP code. If left empty, the default value of 25 will be used. The default units are miles. Use the metric flag to search in kilometers. |
| metric (optional) |
boolean | Set this value to true if you would like your search radius and results to be measured in kilometers. The default value for this variable is false, yielding a search radius and results measured in miles. |
| cursor (optional) |
string | An opaque string value that indicates where the results should start from. This value is returned as next_cursor after an initial query to the endpoint. |
| count (optional) |
integer | The number of results you would like returned from your request. The default value is 100. |
The response format is identical to the Find Nearby Locations endpoint, returning a list object with location, distance, and brewer objects for each result. The url field will be /location/zip.
curl -X GET \
'https://api.catalog.beer/location/zip?zip_code=92104&search_radius=10&count=1' \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
{
"object": "list",
"url": "/location/zip",
"has_more": true,
"next_cursor": "MQ==",
"data": [
{
"location": {
"id": "95a881ef-794a-4f2a-bd5a-ed88cfd1988d",
"object": "location",
"name": "North Park Flavordome",
"brewer_id": "69e7ae7d-9a37-46b3-aa5d-7bf5d092b976",
"url": "https://www.moderntimesbeer.com/locations/north-park-flavordome/",
"country_code": "US",
"country_short_name": "United States of America",
"latitude": 32.7414894,
"longitude": -117.129921,
"telephone": 6192695222,
"address": {
"address1": null,
"address2": "3000 Upas St",
"city": "San Diego",
"sub_code": "US-CA",
"state_short": "CA",
"state_long": "California",
"zip5": 92104,
"zip4": 4221
}
},
"distance": {
"distance": 0.6,
"units": "miles"
},
"brewer": {
"id": "69e7ae7d-9a37-46b3-aa5d-7bf5d092b976",
"object": "brewer",
"name": "Modern Times Beer",
"description": null,
"short_description": null,
"url": "http://www.moderntimesbeer.com/",
"cb_verified": true,
"brewer_verified": false
}
}
]
}
Find nearby brewery locations by providing a city and state. This endpoint geocodes the city and returns locations within the search radius, just like the Find Nearby Locations endpoint.
Send a GET request to the /location/city endpoint with the city and state query parameters.
| Name | Type | Description |
|---|---|---|
| city | string | The name of the city to search around (e.g., San Diego). |
| state | string | The state name or abbreviation (e.g., California or CA). |
| search_radius (optional) |
integer | The radius of the search circle, centered at the provided city. If left empty, the default value of 25 will be used. The default units are miles. Use the metric flag to search in kilometers. |
| metric (optional) |
boolean | Set this value to true if you would like your search radius and results to be measured in kilometers. The default value for this variable is false, yielding a search radius and results measured in miles. |
| cursor (optional) |
string | An opaque string value that indicates where the results should start from. This value is returned as next_cursor after an initial query to the endpoint. |
| count (optional) |
integer | The number of results you would like returned from your request. The default value is 100. |
The response format is identical to the Find Nearby Locations endpoint, returning a list object with location, distance, and brewer objects for each result. The url field will be /location/city.
curl -X GET \
'https://api.catalog.beer/location/city?city=San%20Diego&state=CA&search_radius=10&count=1' \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
{
"object": "list",
"url": "/location/city",
"has_more": true,
"next_cursor": "MQ==",
"data": [
{
"location": {
"id": "7abe715f-0ddf-405e-b730-e2ab1abaef13",
"object": "location",
"name": "East Village",
"brewer_id": "880a8e73-ae38-4466-b6af-f84141ae6996",
"url": "https://baycitybrewingco.com/visit/tasting-room/",
"country_code": "US",
"country_short_name": "United States of America",
"latitude": 32.7119141,
"longitude": -117.1571503,
"telephone": 6197701844,
"address": {
"address1": null,
"address2": "627 8th Ave",
"city": "San Diego",
"sub_code": "US-CA",
"state_short": "CA",
"state_long": "California",
"zip5": 92101,
"zip4": 6453
}
},
"distance": {
"distance": 0.3,
"units": "miles"
},
"brewer": {
"id": "880a8e73-ae38-4466-b6af-f84141ae6996",
"object": "brewer",
"name": "Bay City Brewing",
"description": "Our brewing facility is located in the heart of San Diego between Mission Bay and San Diego Bay. From craft beer and cocktails to delicious food and wine, we strive to make every experience memorable.\r\n\r\nThe Bay City Brewing Company was established in San Diego, California in 1912 (incorporated in 1911). It was initially controlled by F.C. and August Lang, J.H. Zitt’s father-in-law and brother-in-law. Today, the Bay City Brewing Company is owned and operated by its partners Chad Robley, Ben Dubois, and Greg Anderson – all local San Diegans.",
"short_description": null,
"url": "http://baycitybrewingco.com/",
"cb_verified": true,
"brewer_verified": false
}
}
]
}
The usage endpoints allow you to check your API usage for the current billing period. Each API key has a monthly request limit (default: 1,000 requests). Requests to the /usage endpoints are not counted against your limit.
| Parameter | Type | Description |
|---|---|---|
| object | string | The name of the object. In this case: “usage”. |
| api_key | string | The API key associated with this usage record. |
| year | integer | The year of the current billing period (e.g. 2026). |
| month | integer | The month of the current billing period (1–12). |
| count | integer | The number of API requests made during the current billing period. |
| request_limit | integer | The maximum number of requests allowed per month for this API key. |
| request_buffer | integer | A grace zone beyond the request limit. Requests will not be blocked until count exceeds request_limit + request_buffer. |
| resets_on | string | The date your usage count resets, formatted as YYYY-MM-DD (always the first of the next month). |
| last_updated | integer | Unix timestamp of the last time the usage counter was updated. Returns 0 if no requests have been made this month. |
To retrieve your current API usage and limits, send a GET request to the /usage/my-usage endpoint. This returns your usage for the current billing period. No special permissions are required—the endpoint returns data for the authenticated API key.
GET https://api.catalog.beer/usage/my-usage
A usage object will be returned for successful requests.
curl -X GET \
https://api.catalog.beer/usage/my-usage \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}'
{
"object": "usage",
"api_key": "cadcbe6f-a80d-4e33-9f20-b53c2ed83845",
"year": 2026,
"month": 3,
"count": 142,
"request_limit": 1000,
"request_buffer": 50,
"resets_on": "2026-04-01",
"last_updated": 1741723456
}
When your usage exceeds your request_limit + request_buffer, the API will return a 429 Too Many Requests response for all non-usage endpoints. Your count resets on the first of each month. To request a higher limit, contact us.
For locations in the United States, data is stored and captured using the US Addresses data structure.
Addresses for the United States are stored in an object with the following parameters.
| Parameter | Type | Description |
|---|---|---|
| address1 (optional) |
string | The apartment, suite, or unit number of the location (if applicable). |
| address2 | string | The street address of the location. |
| city | string | The name of the city |
| sub_code | string | The ISO 3166–2 Code for the subdivision in which the location is located. Reference the ISO 3166 standard. (e.g. US-CA) |
| state_short | string | The two character all-caps notation for the state (e.g. CA). |
| state_long | string | The full name of the state or district (e.g. California) |
| zip5 | integer | The traditional 5-digit ZIP Code for the location. |
| zip4 (optional) |
integer | The additional ZIP+4 Code used by the US Postal Service. More on the ZIP+4 Code. |
| telephone (optional) |
integer | An unformatted integer representing the telephone number of the location. Does not include the country code. For example, a US telephone number written in the international format as +1 (555) 444–3333 is stored as 5554443333 in our database. |
The users endpoints allow you to manage your own account. User accounts are created through the Catalog.beer website, not directly via the API.
Successful requests to user endpoints will return the user object in JSON format. That object has the following parameters.
| Parameter | Type | Description |
|---|---|---|
| id | string | The user_id; a unique identifier for the user. |
| object | string | The name of the object. In this case: “users”. |
| name | string | The user’s name. |
| string | The user’s email address. | |
| email_verified | Boolean | A true or false value denoting whether the user’s email address has been verified. |
| email_auth | string/null | The email verification code, or null if the email has already been verified. |
| email_auth_sent | integer/null | A Unix timestamp indicating when the email verification was sent, or null. |
| admin | Boolean | A true or false value denoting whether the user has administrator privileges. |
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"object": "users",
"name": "Jane Doe",
"email": "jane@example.com",
"email_verified": true,
"email_auth": null,
"email_auth_sent": null,
"admin": false
}
To retrieve your user information, send a GET request to the /users endpoint with your {user_id} appended to the path. You can only retrieve your own user information.
GET https://api.catalog.beer/users/{user_id}
A user object will be returned for successful requests.
curl -X GET \
https://api.catalog.beer/users/a1b2c3d4-e5f6-7890-abcd-ef1234567890 \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
To retrieve your API key, send a GET request to the /users/{user_id}/api-key endpoint. You can only retrieve your own API key. The API key will be null if your email address has not yet been verified.
GET https://api.catalog.beer/users/{user_id}/api-key
| Parameter | Type | Description |
|---|---|---|
| object | string | The name of the object. In this case: “api_key”. |
| user_id | string | The user_id associated with the API key. |
| api_key | string/null | The API key, or null if the user’s email has not been verified. |
curl -X GET \
https://api.catalog.beer/users/a1b2c3d4-e5f6-7890-abcd-ef1234567890/api-key \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
{
"object": "api_key",
"user_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"api_key": "cadcbe6f-a80d-4e33-9f20-b53c2ed83845"
}
To update your account, send a PATCH request to the /users endpoint with your user_id appended to the path. Only the fields you include will be updated; all other fields remain unchanged. Successful requests return a user object.
PATCH https://api.catalog.beer/users/{user_id}
| Parameter | Type | Description |
|---|---|---|
| name (optional) |
string | The user’s name. Max 255 characters. |
| email (optional) |
string | The user’s email address. Changing your email to a different domain will reset your email verification status and any brewery staff privileges associated with the previous domain. |
| password (optional) |
string | A new password for the account. Must be at least 8 characters. |
curl -X PATCH \
https://api.catalog.beer/users/a1b2c3d4-e5f6-7890-abcd-ef1234567890 \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
-H 'content-type: application/json' \
-d '{"name":"Jane Smith"}'
To delete your account, send a DELETE request to the /users endpoint with your user_id appended to the path. No request body is required. Successful requests return a 204 No Content response with no body. This action permanently deletes your account and associated data.
DELETE https://api.catalog.beer/users/{user_id}
curl -X DELETE \
https://api.catalog.beer/users/a1b2c3d4-e5f6-7890-abcd-ef1234567890 \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
To request a password reset, send a POST request to the /users/{user_id}/reset-password endpoint. The user’s email must be verified. A password reset email will be sent to the email address on file. This endpoint is rate limited to one request per 15 minutes. Successful requests return a 204 No Content response.
POST https://api.catalog.beer/users/{user_id}/reset-password
curl -X POST \
https://api.catalog.beer/users/a1b2c3d4-e5f6-7890-abcd-ef1234567890/reset-password \
-H 'accept: application/json' \
-H 'authorization: Basic {secret_key}' \
To reset your password using a password reset key (received via email), send a POST request to the /users/password-reset/{password_reset_key} endpoint with your new password in the request body. Successful requests return a 204 No Content response.
POST https://api.catalog.beer/users/password-reset/{password_reset_key}
| Parameter | Type | Description |
|---|---|---|
| password | string | The new password. Must be at least 8 characters. |
curl -X POST \
https://api.catalog.beer/users/password-reset/e5f67890-abcd-1234-5678-90abcdef1234 \
-H 'accept: application/json' \
-H 'content-type: application/json' \
-d '{"password":"mynewpassword123"}'