# Weedmaps Cannabis Dispensary & Business Leads Scraper (`scrapesage/weedmaps-cannabis-scraper`) Actor

Scrape Weedmaps dispensaries, delivery services, brands & doctors with licenses, phone, email, website, hours, ratings, payments & menus. Lead scoring + monitoring.

- **URL**: https://apify.com/scrapesage/weedmaps-cannabis-scraper.md
- **Developed by:** [Scrape Sage](https://apify.com/scrapesage) (community)
- **Categories:** Lead generation, E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 cannabis listing scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Weedmaps Scraper — Cannabis Dispensary, Delivery & Brand Leads (Licenses, Emails, Phones & Menus)

Extract **complete Weedmaps listing data** — including the fields other scrapers leave empty: **state license numbers, business email, phone, full weekly hours, payment methods, social links, and live menu pricing (THC/CBD)**. Turn every licensed dispensary, delivery service, brand, and doctor into a **ready-to-contact B2B lead** with a built-in lead score.

No login, no API key, no browser — fast JSON extraction straight from Weedmaps' public discovery API.

### Why this Weedmaps scraper?

Most cannabis scrapers return a name and an address and stop there. This actor merges Weedmaps' list **and** detail endpoints to ship the **richest dataset in the category** — and every record carries a real, contactable phone **and** email.

| Data | Typical scrapers | This actor |
|---|---|---|
| Business phone | ✅ | ✅ |
| Business **email** | ❌ | ✅ **100% of listings** |
| State **license number(s) + type** | ❌ | ✅ |
| Website | partial | ✅ when listed |
| Full weekly business hours | ❌ | ✅ |
| Payment methods (cash/debit/credit/ACH/ATM) | ❌ | ✅ |
| Online ordering / pickup / curbside / delivery flags | ❌ | ✅ |
| Social links (Instagram/Facebook/Twitter/YouTube) | ❌ | ✅ opt-in detail |
| Rating, review count, ranking, member-since | partial | ✅ |
| Live menu — product, brand, category, price tiers, THC/CBD | ❌ | ✅ opt-in |
| Menu mode — one record per product across stores | ❌ | ✅ |
| Per-store menu summary (top categories & brands) | ❌ | ✅ opt-in |
| Price range (eighth / ounce / gram min–max) | ❌ | ✅ |
| Active promo / deal codes | ❌ | ✅ |
| Distance from search point | ❌ | ✅ |
| Lead score (0–100) per business | ❌ | ✅ |
| New-opening / change monitoring | ❌ | ✅ built-in |

### Use cases

- **B2B lead generation** — sell to licensed cannabis operators: POS & payments, compliance/seed-to-sale, packaging, lab testing, insurance, banking, security, marketing & SEO, delivery logistics, and real estate. Filter by `leadScore`, `isLicensed`, and `state`, then reach out with `phone` and `email`.
- **Market & competitor intelligence** — map every dispensary and delivery service in a city, track ratings, online-ordering adoption, and **menu pricing / THC potency** by brand and category.
- **M&A and investment sourcing** — find licensed operators by market, license type (medical/recreational), and size signals (`reviewsCount`, `menuItemsCount`, `currentDealsCount`).
- **Brand distribution & retail expansion** — see which retailers carry which brands, and where the white space is, by scraping menus across markets.
- **New-opening alerts** — schedule recurring runs with **monitor mode** to capture newly licensed dispensaries and delivery services the day they appear — the highest-intent leads in the industry.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) — the free plan is enough to try this actor.
2. Open the **Weedmaps Cannabis Dispensary & Business Leads Scraper**, type one or more locations (e.g. `Denver, CO`), pick the listing types, and click **Start**.
3. Watch licensed cannabis leads stream into the dataset table.
4. **Export** as JSON, CSV, Excel, or XML — or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

```json
{
    "searchTerms": ["Los Angeles, CA", "Denver, CO"],
    "listingTypes": ["dispensary", "delivery"],
    "maxItems": 100,
    "includeDetails": true,
    "includeMenu": false,
    "onlyLicensed": false,
    "radiusMiles": 25,
    "monitorMode": false
}
````

- **searchTerms** — locations to search: `City, ST` (`Denver, CO`), `City, State`, a ZIP, or raw `lat,lng`. Each is searched independently and the item budget is shared evenly across them.
- **listingTypes** — any of `dispensary` (storefronts), `delivery`, `brand`, `doctor`. Default `dispensary`.
- **mode** — `leads` *(default)* = one rich record per business; `menu` = one record per product on each business's live menu (name, brand, category, price tiers, THC/CBD) with retailer context, for product & price intelligence.
- **startUrls** — optional. Paste Weedmaps listing URLs (`https://weedmaps.com/dispensaries/...`) to scrape specific listings directly.
- **maxItems** *(default 100)* — total cap across all locations/types. Use `0` for no limit (advanced).
- **includeDetails** *(default true)* — enrich each listing with license number(s), website, full hours, social links, description and business attributes (one fast API call each). Recommended on.
- **includeMenu** *(default false)* — in Leads mode, nest the live menu (product name, brand, category, price tiers, THC/CBD, rating) inside each business record.
- **includeMenuSummary** *(default false)* — in Leads mode, attach a compact `menuSummary` (total products, top categories, top brands, price range) to each business.
- **maxMenuItemsPerListing** *(default 50)* — menu cap per business (applies to nested menu, summary, and Menu mode).
- **onlyLicensed** *(default false)* — keep only listings that expose a state license number.
- **openNow / onlineOrderingOnly** — quick quality filters.
- **radiusMiles** *(default 25)* — search radius around each location.
- **latitude / longitude** — search around an exact point instead of a city name.
- **monitorMode** *(default false)* — track listings across runs and, by default, output only **new or changed** ones (see below).
- **proxyConfiguration** — defaults to Apify Proxy; Weedmaps is reachable from datacenter IPs.

### Output

One rich record per listing. Example (claimed dispensary, trimmed):

```json
{
    "platform": "weedmaps",
    "listingType": "dispensary",
    "wmid": 161027351,
    "name": "Pharmer's Market - Norman",
    "doingBusinessAs": "Pharmer's Market - Norman",
    "licenseType": "medical",
    "isMedical": true,
    "isRecreational": false,
    "licenseNumber": "DAAA-N1JM-2WP4",
    "licenses": [{ "type": "Medical Retail", "number": "DAAA-N1JM-2WP4" }],
    "isLicensed": true,
    "address": "530 West Lindsey Street",
    "city": "Norman",
    "state": "Oklahoma",
    "zipCode": "73069",
    "latitude": 35.203962,
    "longitude": -97.448847,
    "distanceMiles": 0.4,
    "timezone": "America/Chicago",
    "phone": "(405) 857-7445",
    "email": "pharmersmarketlindsey@gmail.com",
    "website": "http://www.pharmersmarketonlindsey.com",
    "socialInstagram": "https://www.instagram.com/pharmersmarketonlindsey/",
    "socialFacebook": "https://www.facebook.com/PharmerMarket/",
    "rating": 5.0,
    "reviewsCount": 1473,
    "memberSince": "2019",
    "isVerifiedSeller": true,
    "claimed": true,
    "socialEquity": false,
    "onlineOrderingEnabled": true,
    "hasCurbsidePickup": true,
    "retailerServices": ["storefront", "pickup"],
    "acceptsCreditCards": false,
    "hasAtm": true,
    "hasSecurityGuard": true,
    "openNow": true,
    "todaysHours": "9:00am - 11:59pm",
    "businessHours": { "monday": "9:00am - 10:00pm", "friday": "9:00am - 11:59pm" },
    "menuItemsCount": 819,
    "avatarImage": "https://images.weedmaps.com/dispensaries/.../avatar.png",
    "webUrl": "https://weedmaps.com/dispensaries/pharmhouse-cannabis-company",
    "leadScore": 96,
    "leadSignals": ["phone", "email", "website", "licensed", "well-rated", "established", "online-ordering", "verified", "social"],
    "searchLocation": "Norman, OK",
    "scrapedAt": "2026-06-26T21:00:00.000Z"
}
```

Every business record also includes a `priceSummary` (overall + eighth/ounce/gram min–max) and, when active, a `promoCode` (`{ code, title, discount, discountType }`). With `includeMenu: true` you also get a nested `menu` array of `{ name, brand, category, genetics, price, priceTiers, thcPercent, cbdPercent, rating }`; with `includeMenuSummary: true` you get a compact `menuSummary` (`{ totalProducts, topCategories, topBrands, priceMin, priceMax }`).

**Menu mode** (`mode: "menu"`) — one record per product, with its business attached:

```json
{
    "type": "menuItem",
    "retailerName": "STIIIZY Downtown LA",
    "retailerCity": "Los Angeles",
    "retailerState": "California",
    "retailerLicenseType": "hybrid",
    "name": "Jack of Diamonds | Indoor Smalls - Half Oz",
    "brand": "Connected Cannabis Co.",
    "category": "Indica",
    "genetics": "Hybrid",
    "price": 110,
    "priceTiers": [{ "label": "1/2 oz", "price": 110, "unit": "ounce" }],
    "thcPercent": 28.4,
    "isOnlineOrderable": true
}
```

### Automate & schedule

Run this actor on autopilot and pull results into your own stack:

- **[Apify API](https://docs.apify.com/api/v2)** — start runs, fetch datasets, and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** — official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** — run it daily/weekly with **monitor mode** to capture newly licensed dispensaries and price changes; perfect for lead pipelines.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger downstream actions (CRM import, Slack alert, email sequence) the moment a run finishes.

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/weedmaps-cannabis-scraper').call({
    searchTerms: ['Denver, CO', 'Los Angeles, CA'],
    listingTypes: ['dispensary', 'delivery'],
    maxItems: 100,
    includeDetails: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} cannabis business leads`);
```

#### Monitor mode vs. Schedules — how they work together

They are independent and complementary: a **[Schedule](https://docs.apify.com/platform/schedules)** decides *when* the actor runs (e.g. every morning), while **monitor mode** decides *what each run outputs*. With `monitorMode: true` the actor remembers every listing it has seen in a key-value store and, by default (`monitorOnlyNew: true`), emits only listings that are **new or changed** since last time — so a daily schedule becomes a clean "new dispensary openings & price changes" feed with no duplicates.

### Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** — multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** — push new cannabis leads straight into your CRM.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get notified when a monitored market gets a new licensed operator.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** — auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** — pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** — trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "find licensed dispensaries in Denver with online ordering and list their emails" and let it run this scraper for you.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** — AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) — no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### More scrapers from scrapesage

Build a complete **local-business & B2B lead-gen stack**:

- **[Google Maps Scraper](https://apify.com/scrapesage/google-maps-scraper)** — any local business with phone, website, and reviews.
- **[Houzz Scraper](https://apify.com/scrapesage/houzz-scraper)** — home & design professional leads.
- **[Bark Listing Scraper](https://apify.com/scrapesage/bark-listing-scraper)** — service-provider leads across hundreds of categories.
- **[US Business Formation Scraper](https://apify.com/scrapesage/us-business-formation-scraper)** — newly registered companies as fresh-intent leads.
- **[TaxBuzz Scraper](https://apify.com/scrapesage/taxbuzz-scraper)** — accountant & tax-preparer leads with contact data.
- **[LinkedIn Company Scraper](https://apify.com/scrapesage/linkedin-company-scraper)** — company firmographics and profiles.
- **[Google Ads Transparency Scraper](https://apify.com/scrapesage/google-ads-transparency-scraper)** — who's advertising what, including cannabis brands.
- **[Facebook Ad Library Scraper](https://apify.com/scrapesage/facebook-ad-library-scraper)** — competitor ad intelligence.

### Tips

- **More leads per city**: raise `radiusMiles` (up to 150) to widen the net, or add nearby cities to `searchTerms`.
- **Highest-quality leads only**: set `onlyLicensed: true` and sort the dataset by `leadScore`.
- **Cheapest runs**: turn `includeDetails` off for a fast list (still includes phone, email, rating); turn it on for licenses, website, hours, and socials.
- **Recurring monitoring**: combine [Schedules](https://docs.apify.com/platform/schedules) with `monitorMode: true` to track only new/changed listings.
- **Dispensaries vs delivery**: storefront `dispensary` listings have the highest license/website coverage; `delivery` listings include more unclaimed operators (still phone + email).

### FAQ

**How do I scrape dispensaries for a specific city?** Put the city in `searchTerms` as `City, ST` (e.g. `Denver, CO`), choose your `listingTypes`, and start. You can mix many cities in one run.

**Does it need a Weedmaps API key or login?** No. It reads Weedmaps' public discovery endpoints — no key, no cookies, no browser.

**Where do the emails and phones come from?** They are the public contact details Weedmaps displays on each listing. Coverage of phone and email is ~100% across listing types; website, license, and hours are present for claimed/storefront listings and may be absent on unclaimed delivery-only listings.

**Can I get menu prices and THC levels?** Yes — set `includeMenu: true`. Each listing gets its live menu with product, brand, category, price tiers, and THC/CBD percentages.

**How do I monitor new dispensary openings?** Turn on `monitorMode`, then create a daily [Schedule](https://docs.apify.com/platform/schedules). Each run outputs only new or changed listings — add a [webhook](https://docs.apify.com/platform/integrations/webhooks) or [Zapier zap](https://docs.apify.com/platform/integrations/zapier) to push them into your CRM.

**A field is null — why?** Core fields (name, phone, email, rating, location, lead score) are present for every listing. Some listings — especially unclaimed, delivery-only ones — don't publish a website, license number, or hours; those fields are `null` only when Weedmaps genuinely doesn't expose them, never because the scraper skipped them.

**Is scraping Weedmaps legal?** This actor collects publicly available business data only. You are responsible for using the data in compliance with applicable laws (including marketing/communication and privacy regulations) and Weedmaps' terms.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome — this actor is actively maintained.

# Actor input Schema

## `searchTerms` (type: `array`):

Locations to search, e.g. "Los Angeles, CA", "Denver, Colorado", "Portland, OR" or a ZIP like "90001". Each is combined with every selected listing type. Leave empty if you use Start URLs or direct coordinates.

## `listingTypes` (type: `array`):

Which Weedmaps listing types to collect. Dispensaries (storefronts) and delivery services are the core B2B retail leads; brands and doctors are also supported.

## `mode` (type: `string`):

`Leads` (default) = one rich record per business (dispensary/delivery/brand/doctor) with contacts, license, hours & lead score. `Menu` = one record per product on each business's live menu (name, brand, category, price tiers, THC/CBD) for product & price intelligence.

## `startUrls` (type: `array`):

Optional. Paste Weedmaps listing URLs (e.g. https://weedmaps.com/dispensaries/some-shop) to scrape those specific listings directly.

## `maxItems` (type: `integer`):

Maximum number of listings to return across all locations and types. Use 0 for no limit (advanced — can be large and slow). Default keeps runs fast and cheap.

## `includeDetails` (type: `boolean`):

Fetch each listing's detail page to enrich it with license number(s), website, full weekly hours, social links, description and business attributes. One extra fast API call per listing. Recommended ON for the richest leads.

## `includeMenu` (type: `boolean`):

Also collect each listing's live menu (product name, brand, category, price, THC/CBD). Adds extra API calls and time — opt-in for pricing/inventory intelligence.

## `maxMenuItemsPerListing` (type: `integer`):

Cap on menu products collected per business — applies to 'Include menu products', the menu summary, and Menu output mode.

## `includeMenuSummary` (type: `boolean`):

In Leads mode, attach a compact `menuSummary` to each business: total products, top product categories, top brands carried, and price range. One extra API call per business.

## `onlyLicensed` (type: `boolean`):

Keep only listings that expose a state license number (requires 'Include full details'). Filters out unverified/placeholder listings.

## `openNow` (type: `boolean`):

Keep only listings that are currently open for business.

## `onlineOrderingOnly` (type: `boolean`):

Keep only listings that accept online orders (pickup or delivery).

## `radiusMiles` (type: `integer`):

Radius around each resolved location to search. Larger = more listings, wider net.

## `latitude` (type: `string`):

Optional. Search around an exact point instead of a city name. Use together with Longitude.

## `longitude` (type: `string`):

Optional. Search around an exact point instead of a city name. Use together with Latitude.

## `monitorMode` (type: `boolean`):

Track results across runs in a key-value store and, by default, only output listings that are new or have changed since the last run. Pair with an Apify Schedule for a recurring 'new dispensary openings' lead feed. (Independent of the scheduler — the schedule decides WHEN to run, monitor mode decides WHAT each run outputs.)

## `monitorOnlyNew` (type: `boolean`):

When Monitor mode is on: if true, emit only new or changed listings; if false, emit everything but tag each record as new/updated/unchanged.

## `monitorKey` (type: `string`):

Namespace for the monitor state store, so different saved tasks track their own history. Letters, numbers and hyphens.

## `proxyConfiguration` (type: `object`):

Residential proxy is required — Weedmaps blocks datacenter IPs. The default (Apify Residential) is recommended for reliability; data volume is tiny (JSON), so residential cost is negligible.

## Actor input object example

```json
{
  "searchTerms": [
    "Los Angeles, CA"
  ],
  "listingTypes": [
    "dispensary"
  ],
  "mode": "leads",
  "startUrls": [],
  "maxItems": 100,
  "includeDetails": true,
  "includeMenu": false,
  "maxMenuItemsPerListing": 50,
  "includeMenuSummary": false,
  "onlyLicensed": false,
  "openNow": false,
  "onlineOrderingOnly": false,
  "radiusMiles": 25,
  "monitorMode": false,
  "monitorOnlyNew": true,
  "monitorKey": "default",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All scraped Weedmaps cannabis listing records as JSON items in the default dataset.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchTerms": [
        "Los Angeles, CA"
    ],
    "listingTypes": [
        "dispensary"
    ],
    "maxItems": 100,
    "maxMenuItemsPerListing": 50,
    "radiusMiles": 25,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/weedmaps-cannabis-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchTerms": ["Los Angeles, CA"],
    "listingTypes": ["dispensary"],
    "maxItems": 100,
    "maxMenuItemsPerListing": 50,
    "radiusMiles": 25,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/weedmaps-cannabis-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "Los Angeles, CA"
  ],
  "listingTypes": [
    "dispensary"
  ],
  "maxItems": 100,
  "maxMenuItemsPerListing": 50,
  "radiusMiles": 25,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call scrapesage/weedmaps-cannabis-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scrapesage/weedmaps-cannabis-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Weedmaps Cannabis Dispensary & Business Leads Scraper",
        "description": "Scrape Weedmaps dispensaries, delivery services, brands & doctors with licenses, phone, email, website, hours, ratings, payments & menus. Lead scoring + monitoring.",
        "version": "0.1",
        "x-build-id": "jCTkpb8XqYiiha8ch"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/scrapesage~weedmaps-cannabis-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-scrapesage-weedmaps-cannabis-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/scrapesage~weedmaps-cannabis-scraper/runs": {
            "post": {
                "operationId": "runs-sync-scrapesage-weedmaps-cannabis-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/scrapesage~weedmaps-cannabis-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-scrapesage-weedmaps-cannabis-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchTerms": {
                        "title": "Search locations (city / state / ZIP)",
                        "type": "array",
                        "description": "Locations to search, e.g. \"Los Angeles, CA\", \"Denver, Colorado\", \"Portland, OR\" or a ZIP like \"90001\". Each is combined with every selected listing type. Leave empty if you use Start URLs or direct coordinates.",
                        "default": [
                            "Los Angeles, CA"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "listingTypes": {
                        "title": "Listing types",
                        "type": "array",
                        "description": "Which Weedmaps listing types to collect. Dispensaries (storefronts) and delivery services are the core B2B retail leads; brands and doctors are also supported.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "dispensary",
                                "delivery",
                                "brand",
                                "doctor"
                            ],
                            "enumTitles": [
                                "Dispensaries (storefronts)",
                                "Delivery services",
                                "Brands",
                                "Doctors / clinics"
                            ]
                        },
                        "default": [
                            "dispensary"
                        ]
                    },
                    "mode": {
                        "title": "Output mode",
                        "enum": [
                            "leads",
                            "menu"
                        ],
                        "type": "string",
                        "description": "`Leads` (default) = one rich record per business (dispensary/delivery/brand/doctor) with contacts, license, hours & lead score. `Menu` = one record per product on each business's live menu (name, brand, category, price tiers, THC/CBD) for product & price intelligence.",
                        "default": "leads"
                    },
                    "startUrls": {
                        "title": "Start URLs (Weedmaps pages)",
                        "type": "array",
                        "description": "Optional. Paste Weedmaps listing URLs (e.g. https://weedmaps.com/dispensaries/some-shop) to scrape those specific listings directly.",
                        "default": [],
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxItems": {
                        "title": "Max listings",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of listings to return across all locations and types. Use 0 for no limit (advanced — can be large and slow). Default keeps runs fast and cheap.",
                        "default": 100
                    },
                    "includeDetails": {
                        "title": "Include full details (licenses, website, hours, socials)",
                        "type": "boolean",
                        "description": "Fetch each listing's detail page to enrich it with license number(s), website, full weekly hours, social links, description and business attributes. One extra fast API call per listing. Recommended ON for the richest leads.",
                        "default": true
                    },
                    "includeMenu": {
                        "title": "Include menu products",
                        "type": "boolean",
                        "description": "Also collect each listing's live menu (product name, brand, category, price, THC/CBD). Adds extra API calls and time — opt-in for pricing/inventory intelligence.",
                        "default": false
                    },
                    "maxMenuItemsPerListing": {
                        "title": "Max menu items per listing",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Cap on menu products collected per business — applies to 'Include menu products', the menu summary, and Menu output mode.",
                        "default": 50
                    },
                    "includeMenuSummary": {
                        "title": "Add menu summary to each lead",
                        "type": "boolean",
                        "description": "In Leads mode, attach a compact `menuSummary` to each business: total products, top product categories, top brands carried, and price range. One extra API call per business.",
                        "default": false
                    },
                    "onlyLicensed": {
                        "title": "Only licensed listings",
                        "type": "boolean",
                        "description": "Keep only listings that expose a state license number (requires 'Include full details'). Filters out unverified/placeholder listings.",
                        "default": false
                    },
                    "openNow": {
                        "title": "Only open now",
                        "type": "boolean",
                        "description": "Keep only listings that are currently open for business.",
                        "default": false
                    },
                    "onlineOrderingOnly": {
                        "title": "Only with online ordering",
                        "type": "boolean",
                        "description": "Keep only listings that accept online orders (pickup or delivery).",
                        "default": false
                    },
                    "radiusMiles": {
                        "title": "Search radius (miles)",
                        "minimum": 1,
                        "maximum": 150,
                        "type": "integer",
                        "description": "Radius around each resolved location to search. Larger = more listings, wider net.",
                        "default": 25
                    },
                    "latitude": {
                        "title": "Latitude (advanced)",
                        "type": "string",
                        "description": "Optional. Search around an exact point instead of a city name. Use together with Longitude."
                    },
                    "longitude": {
                        "title": "Longitude (advanced)",
                        "type": "string",
                        "description": "Optional. Search around an exact point instead of a city name. Use together with Latitude."
                    },
                    "monitorMode": {
                        "title": "Monitor mode (only new / changed)",
                        "type": "boolean",
                        "description": "Track results across runs in a key-value store and, by default, only output listings that are new or have changed since the last run. Pair with an Apify Schedule for a recurring 'new dispensary openings' lead feed. (Independent of the scheduler — the schedule decides WHEN to run, monitor mode decides WHAT each run outputs.)",
                        "default": false
                    },
                    "monitorOnlyNew": {
                        "title": "Monitor: emit only new/changed",
                        "type": "boolean",
                        "description": "When Monitor mode is on: if true, emit only new or changed listings; if false, emit everything but tag each record as new/updated/unchanged.",
                        "default": true
                    },
                    "monitorKey": {
                        "title": "Monitor state key",
                        "type": "string",
                        "description": "Namespace for the monitor state store, so different saved tasks track their own history. Letters, numbers and hyphens.",
                        "default": "default"
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Residential proxy is required — Weedmaps blocks datacenter IPs. The default (Apify Residential) is recommended for reliability; data volume is tiny (JSON), so residential cost is negligible.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
