Products Endpoint
Search for cannabis products across thousands of dispensaries. Filter by location, category, brand, potency, price, and more.
This is the primary endpoint for product discovery. Products are grouped by SKU to consolidate listings from multiple menu providers.
Request
GET https://api.cannmenus.com/v1/products
Required Parameters
At least one of these parameters must be provided:
- Name
states- Type
- string | string[]
- Description
US state(s) or Canadian province(s) to search. Use full names (e.g., "California", "Ontario").
states=California states=California&states=Oregon
Location Parameters
Narrow results by geographic area:
- Name
lat- Type
- number
- Description
Latitude coordinate for location-based search. Must be used with
lng.
- Name
lng- Type
- number
- Description
Longitude coordinate for location-based search. Must be used with
lat.
- Name
distance- Type
- number
- Description
Radius in miles from the lat/lng point. Default:
10. Max:100.
- Name
zipcode- Type
- string
- Description
US ZIP code or Canadian postal code. Alternative to lat/lng.
- Name
city- Type
- string
- Description
City name. Best used with
statesfor accuracy.
Product Filters
- Name
category- Type
- string
- Description
Product category. See Categories reference for valid values.
category=Flower category=Edible category=Vape
- Name
subcategory- Type
- string
- Description
Product subcategory. See Subcategories reference for valid values.
subcategory=Gummy subcategory=Cartridge
- Name
tags- Type
- string | string[]
- Description
Product tags for detailed filtering. See Tags reference for valid values.
tags=Live%20Resin tags=Indica&tags=Sugar%20Free
- Name
brand- Type
- string
- Description
Filter by brand name. Partial matching supported.
brand=Stiiizy brand=Cookies
- Name
brand_id- Type
- number
- Description
Filter by exact brand ID.
- Name
retailers- Type
- number | number[]
- Description
Filter to specific retailer IDs. Use the Retailers endpoint to find IDs.
retailers=10600 retailers=10600&retailers=10601
- Name
name- Type
- string
- Description
Search product names. Partial matching supported.
name=Blue%20Dream
Potency Filters
Filter by cannabinoid content:
- Name
min_percentage_thc- Type
- number
- Description
Minimum THC percentage (0-100). For flower, concentrates, vapes.
- Name
max_percentage_thc- Type
- number
- Description
Maximum THC percentage (0-100).
- Name
min_percentage_cbd- Type
- number
- Description
Minimum CBD percentage (0-100).
- Name
max_percentage_cbd- Type
- number
- Description
Maximum CBD percentage (0-100).
- Name
min_mg_thc- Type
- number
- Description
Minimum THC milligrams. For edibles, tinctures, topicals.
- Name
max_mg_thc- Type
- number
- Description
Maximum THC milligrams.
- Name
min_mg_cbd- Type
- number
- Description
Minimum CBD milligrams.
- Name
max_mg_cbd- Type
- number
- Description
Maximum CBD milligrams.
Price Filters
- Name
min_price- Type
- number
- Description
Minimum product price in dollars.
- Name
max_price- Type
- number
- Description
Maximum product price in dollars.
Menu Type
- Name
recreational- Type
- boolean
- Description
Filter to recreational products only.
recreational=true
- Name
medical- Type
- boolean
- Description
Filter to medical products only.
medical=true
Pagination
- Name
page- Type
- number
- Description
Page number to retrieve. Default:
1. Each page contains up to 20 SKU groups.
Example Requests
Basic Search
Search for flower in California:
curl "https://api.cannmenus.com/v1/products?states=California&category=Flower&page=1" \
-H "X-Token: YOUR_API_TOKEN"
Location-Based Search
Find edibles within 5 miles of Denver:
curl "https://api.cannmenus.com/v1/products?states=Colorado&category=Edible&lat=39.7392&lng=-104.9903&distance=5&page=1" \
-H "X-Token: YOUR_API_TOKEN"
Potency Filter
High-THC concentrates in Washington:
curl "https://api.cannmenus.com/v1/products?states=Washington&category=Concentrate&min_percentage_thc=80&page=1" \
-H "X-Token: YOUR_API_TOKEN"
Price Range
Budget-friendly flower under $30 in Oregon:
curl "https://api.cannmenus.com/v1/products?states=Oregon&category=Flower&max_price=30&page=1" \
-H "X-Token: YOUR_API_TOKEN"
Multiple Filters
Live resin vapes from a specific brand in Nevada:
curl "https://api.cannmenus.com/v1/products?states=Nevada&category=Vape&brand=Stiiizy&tags=Live%20Resin&page=1" \
-H "X-Token: YOUR_API_TOKEN"
Response
{
"data": [
{
"retailer_id": "10600",
"sku": "07A0Sbb8OieeaR8rIW6MVHRw",
"products": [
{
"cann_sku_id": "07A0Sbb8OieeaR8rIW6MVHRw",
"brand_name": "Cookies",
"brand_id": 1042,
"raw_product_name": "Cookies - Gary Payton 3.5g",
"product_name": "Gary Payton",
"raw_weight_string": "3.5g",
"display_weight": "3.5g",
"raw_product_category": "Flower",
"category": "Flower",
"raw_subcategory": "Flower",
"subcategory": null,
"product_tags": ["Hybrid", "Indoor"],
"percentage_thc": 28.5,
"percentage_cbd": 0.1,
"mg_thc": null,
"mg_cbd": null,
"quantity_per_package": 1,
"medical": false,
"recreational": true,
"latest_price": 55.00,
"menu_provider": "Dutchie"
}
]
}
],
"pagination": {
"total_records": 1250,
"current_page": 1,
"total_pages": 63,
"next_page": 2,
"prev_page": null
}
}
Response Fields
| Field | Type | Description |
|---|---|---|
retailer_id | string | Unique dispensary identifier |
sku | string | Unique product variant identifier |
products | array | Listings for this SKU (may include multiple menu providers) |
cann_sku_id | string | Same as parent sku |
brand_name | string | Brand name |
brand_id | number | Unique brand identifier |
raw_product_name | string | Original product name from menu provider |
product_name | string | Normalized product name |
display_weight | string | Product size/weight |
category | string | Normalized category |
subcategory | string | Normalized subcategory (if applicable) |
product_tags | array | Applied product tags |
percentage_thc | number | THC percentage (for flower, concentrates) |
percentage_cbd | number | CBD percentage |
mg_thc | number | THC milligrams (for edibles, tinctures) |
mg_cbd | number | CBD milligrams |
latest_price | number | Current retail price |
menu_provider | string | Source platform |
recreational | boolean | Available for recreational purchase |
medical | boolean | Available for medical purchase |
Best Practices
Use Location Filters for Performance
Queries with lat/lng or zipcode are faster and return more relevant results:
# Faster - location-scoped
?states=California&lat=34.0522&lng=-118.2437&distance=10
# Slower - state-wide scan
?states=California
Paginate Through All Results
Don't assume all results fit on one page. Always check pagination.next_page:
all_products = []
page = 1
while True:
response = requests.get(
f"{API_URL}/products",
headers=headers,
params={"states": "California", "category": "Flower", "page": page}
)
data = response.json()
all_products.extend(data["data"])
if data["pagination"]["next_page"] is None:
break
page += 1
Cache Retailer IDs
If you frequently query products from the same dispensaries, cache their retailer IDs and use the retailers parameter for faster lookups.
