Quickstart
Get up and running with the CannMenus API in under 5 minutes. This guide walks you through authentication and your first product search.
Prerequisites: You'll need an API token from the CannMenus Pro dashboard.
Your First Request
Let's search for pre-rolls near downtown Los Angeles. This example uses curl, but you can use any HTTP client.
curl "https://api.cannmenus.com/v1/products?states=California&category=Pre-roll&lat=34.0522&lng=-118.2437&distance=5&page=1" \
-H "X-Token: YOUR_API_TOKEN"
What this does:
- Searches in California (
states=California) - Filters to Pre-roll category only (
category=Pre-roll) - Centers on downtown LA coordinates (
lat=34.0522&lng=-118.2437) - Limits to 5-mile radius (
distance=5) - Returns the first page of results (
page=1)
Understanding the Response
The API returns a JSON response with two main sections:
{
"data": [
{
"retailer_id": "10600",
"sku": "07A0Sbb8OieeaR8rIW6MVHRw",
"products": [
{
"cann_sku_id": "07A0Sbb8OieeaR8rIW6MVHRw",
"brand_name": "Jeeter",
"brand_id": 1234,
"product_name": "Baby Jeeter Infused Pre-roll",
"display_weight": "0.5g",
"category": "Pre-roll",
"subcategory": "Infused",
"percentage_thc": 35.2,
"percentage_cbd": 0.1,
"latest_price": 18.00,
"menu_provider": "Dutchie",
"recreational": true,
"medical": false
}
]
}
],
"pagination": {
"total_records": 847,
"current_page": 1,
"total_pages": 43,
"next_page": 2,
"prev_page": null
}
}
Response Structure
| Field | Description |
|---|---|
data | Array of SKU groups, each containing products from a specific retailer |
data[].retailer_id | Unique identifier for the dispensary |
data[].sku | Unique SKU identifier for this product variant |
data[].products | Array of product listings (may include multiple menu providers) |
pagination | Metadata for navigating through results |
Product Fields
| Field | Description |
|---|---|
brand_name | Brand that manufactures the product |
product_name | Normalized product name |
display_weight | Product size/weight (e.g., "3.5g", "100mg") |
category | Main category (Flower, Edible, Vape, etc.) |
subcategory | Specific subcategory (Gummy, Cartridge, Infused, etc.) |
percentage_thc / percentage_cbd | Cannabinoid percentages (for flower, concentrates) |
mg_thc / mg_cbd | Cannabinoid milligrams (for edibles, tinctures) |
latest_price | Current retail price |
menu_provider | Source platform (Dutchie, Weedmaps, Leafly, etc.) |
Try Different Searches
Search by Brand
curl "https://api.cannmenus.com/v1/products?states=California&brand=Stiiizy&page=1" \
-H "X-Token: YOUR_API_TOKEN"
Search Edibles with High THC
curl "https://api.cannmenus.com/v1/products?states=Colorado&category=Edible&min_mg_thc=50&page=1" \
-H "X-Token: YOUR_API_TOKEN"
Find Products at a Specific Retailer
curl "https://api.cannmenus.com/v1/products?states=Illinois&retailers=10600&page=1" \
-H "X-Token: YOUR_API_TOKEN"
Using Python
import requests
API_URL = "https://api.cannmenus.com/v1"
headers = {"X-Token": "YOUR_API_TOKEN"}
response = requests.get(
f"{API_URL}/products",
headers=headers,
params={
"states": "California",
"category": "Pre-roll",
"lat": 34.0522,
"lng": -118.2437,
"distance": 5,
"page": 1
}
)
data = response.json()
print(f"Found {data['pagination']['total_records']} products")
for sku_group in data["data"]:
for product in sku_group["products"]:
print(f"- {product['brand_name']} {product['product_name']}: ${product['latest_price']}")
Using JavaScript
const API_URL = "https://api.cannmenus.com/v1";
const API_TOKEN = "YOUR_API_TOKEN";
const response = await fetch(
`${API_URL}/products?states=California&category=Pre-roll&lat=34.0522&lng=-118.2437&distance=5&page=1`,
{
headers: { "X-Token": API_TOKEN }
}
);
const data = await response.json();
console.log(`Found ${data.pagination.total_records} products`);
data.data.forEach(skuGroup => {
skuGroup.products.forEach(product => {
console.log(`- ${product.brand_name} ${product.product_name}: $${product.latest_price}`);
});
});
Next Steps
- Learn about SKU organization to understand product grouping
- Explore the Products endpoint for all query parameters
- See Pagination for handling large result sets
- Check Categories and Tags for filtering options
