Retailers Endpoint

Search for cannabis dispensaries across the US and Canada. Find retailers by location, name, or the products they carry.


Request

GET https://api.cannmenus.com/v1/retailers

Parameters

  • Name
    state
    Type
    string
    Description

    Filter by US state or Canadian province. Use full name (e.g., "California", "Ontario").

  • Name
    city
    Type
    string
    Description

    Filter by city name. Best used with state for accuracy.

  • Name
    zipcode
    Type
    string
    Description

    Filter by US ZIP code or Canadian postal code.

  • Name
    lat
    Type
    number
    Description

    Latitude for location-based search. Must be used with lng.

  • Name
    lng
    Type
    number
    Description

    Longitude for location-based search. Must be used with lat.

  • Name
    distance
    Type
    number
    Description

    Radius in miles from lat/lng. Default: 10. Max: 100.

  • Name
    name
    Type
    string
    Description

    Search by retailer name. Partial matching supported.

  • Name
    category
    Type
    string
    Description

    Filter to retailers carrying products in this category.

  • Name
    brand
    Type
    string
    Description

    Filter to retailers carrying this brand.

  • Name
    menu_type
    Type
    string
    Description

    Filter by menu type: recreational, medical, or both.

  • Name
    product_tags
    Type
    string | string[]
    Description

    Filter to retailers with products matching these tags.

  • Name
    is_active
    Type
    boolean
    Description

    Filter to active retailers only. Default: true.

  • Name
    page
    Type
    number
    Description

    Page number. Default: 1.


Example Requests

Search by Location

Find dispensaries near downtown Los Angeles:

curl "https://api.cannmenus.com/v1/retailers?state=California&lat=34.0522&lng=-118.2437&distance=5&page=1" \
  -H "X-Token: YOUR_API_TOKEN"

Search by Name

Find retailers with "rise" in the name in Illinois:

curl "https://api.cannmenus.com/v1/retailers?state=Illinois&name=rise&is_active=true&page=1" \
  -H "X-Token: YOUR_API_TOKEN"

Find Retailers by Brand

Find dispensaries that carry Cookies brand products:

curl "https://api.cannmenus.com/v1/retailers?state=California&brand=Cookies&page=1" \
  -H "X-Token: YOUR_API_TOKEN"

Medical-Only Dispensaries

curl "https://api.cannmenus.com/v1/retailers?state=Florida&menu_type=medical&page=1" \
  -H "X-Token: YOUR_API_TOKEN"

Response

{
  "data": [
    {
      "id": 10600,
      "dispensary_name": "Rise Dispensary Joliet",
      "address": "2130 W Jefferson St",
      "city": "Joliet",
      "state": "Illinois",
      "zipcode": "60435",
      "latitude": 41.5267,
      "longitude": -88.1338,
      "phone": "(815) 338-1234",
      "website": "https://risecannabis.com",
      "menu_providers": ["Dutchie", "Leafly"],
      "menu_type": "both",
      "is_active": true,
      "last_updated": "2024-01-15T14:32:00Z"
    }
  ],
  "pagination": {
    "total_records": 45,
    "current_page": 1,
    "total_pages": 3,
    "next_page": 2,
    "prev_page": null
  }
}

Response Fields

FieldTypeDescription
idnumberUnique retailer identifier (use for Products endpoint)
dispensary_namestringRetailer name
addressstringStreet address
citystringCity
statestringState or province
zipcodestringZIP or postal code
latitudenumberLatitude coordinate
longitudenumberLongitude coordinate
phonestringContact phone number
websitestringRetailer website URL
menu_providersarrayPlatforms where this retailer's menu is sourced
menu_typestringrecreational, medical, or both
is_activebooleanWhether retailer is currently active
last_updatedstringISO 8601 timestamp of last menu update

Common Workflows

Get All Products for a Retailer

First, find the retailer:

import requests

API_URL = "https://api.cannmenus.com/v1"
headers = {"X-Token": "YOUR_API_TOKEN"}

# Find the retailer
response = requests.get(
    f"{API_URL}/retailers",
    headers=headers,
    params={"state": "Illinois", "name": "rise", "is_active": True, "page": 1}
)

retailer = response.json()["data"][0]
retailer_id = retailer["id"]
print(f"Found: {retailer['dispensary_name']} (ID: {retailer_id})")

Then, fetch their products:

# Get all products from this retailer
response = requests.get(
    f"{API_URL}/products",
    headers=headers,
    params={"states": "Illinois", "retailers": retailer_id, "page": 1}
)

products = response.json()["data"]
print(f"Found {len(products)} product SKUs")

Find Nearest Dispensary with Specific Product

# Find dispensaries near user that carry a specific brand
response = requests.get(
    f"{API_URL}/retailers",
    headers=headers,
    params={
        "lat": 41.8781,
        "lng": -87.6298,
        "distance": 10,
        "brand": "Cresco",
        "page": 1
    }
)

for retailer in response.json()["data"]:
    print(f"{retailer['dispensary_name']} - {retailer['address']}, {retailer['city']}")