Dutchie Scraper: Cannabis Menu & Pricing Data Extractor
Pricing
from $3.00 / 1,000 results
Dutchie Scraper: Cannabis Menu & Pricing Data Extractor
Extract real-time pricing, inventory, THC/CBD levels, and brand data from any Dutchie-powered cannabis dispensary. $3.00/1k products. No API key needed. Residential proxy required.
Pricing
from $3.00 / 1,000 results
Rating
5.0
(2)
Developer
Tim McGillicuddy
Maintained by CommunityActor stats
1
Bookmarked
53
Total users
3
Monthly active users
3 days ago
Last modified
Categories
Share
Dutchie Scraper — Cannabis Dispensary Menu & Pricing Data Extractor
Extract complete product menus, real-time pricing, THC/CBD levels, and brand data from any Dutchie-powered cannabis dispensary — in under 60 seconds. Pay only for results you receive.
Built by a working budtender who needed this data and couldn't find a reliable way to get it. Now you can.
What Is This?
Dutchie powers the online menus for 400+ cannabis dispensaries across the US. This Actor extracts their complete product catalogs — structured, clean, and ready for analysis — without you writing a single line of code.
$3.00 per 1,000 products. No subscription. No failed-run charges. No minimum.
Platforms like BDSA and Headset charge $500–$2,000/month for cannabis market intelligence. PuppyWalker delivers the same shelf-velocity and pricing data for a fraction of the cost — with no enterprise contract required.
⚡ Quick Start (Python)
$pip install apify-client
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run_input = {"dispensaryUrls": ["https://dutchie.com/dispensary/your-store-name"],"maxItems": 0, # 0 = full menu, 10 = free preview"useProxy": True, # Required — see proxy note below"proxyGroup": "RESIDENTIAL"}run = client.actor("tfmcg3/dutchie-dispensary-scraper").call(run_input=run_input)for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(f"{item['product_name']} | {item['category']} | {item['display_price']}")
Proxy note: Always set
useProxy: truewithproxyGroup: "RESIDENTIAL". Cloudflare blocks Apify datacenter IPs and returns 0 items with no error. Residential proxies are required for reliable extraction.
Free preview: Set maxItems: 10 for a near-zero-cost test run before committing to a full scrape.
Who Uses This
| Buyer Type | What They Do With It |
|---|---|
| Cannabis brand managers | Track shelf placement, pricing compliance, and stockouts across every dispensary carrying their brand |
| Dispensary operators | Benchmark competitor pricing and promotions before customers notice the difference |
| Market researchers | Build cannabis price trend datasets, analyze category mix, and track new product launches |
| Data aggregators | Power cannabis product directories, comparison tools, and investment research platforms |
| Developers | Integrate dispensary data into apps, dashboards, or pipelines via Apify's API |
| Compliance officers | Cross-reference public Dutchie menus against internal Metrc data to catch inventory sync failures |
Why This Scraper vs. DIY
Building your own Dutchie scraper takes days of development time and breaks every time Dutchie updates their platform. This Actor:
- Uses Dutchie's underlying GraphQL data layer — not fragile HTML parsing or CSS selectors
- Uses
curl_cffifor Chrome-like TLS fingerprinting — bypasses bot detection at the TCP level - Handles authentication, rate limiting, pagination, and store resolution automatically
- Is actively maintained — when Dutchie changes something, it gets fixed fast (see Issues tab)
- Costs less than a coffee to scrape an entire dispensary's menu
Tested at scale: 949+ runs, 100% success rate on recent runs (June–July 2026).
What You Get (Output Fields)
Each product variant is one clean record. All fields are always present — unavailable values return as null.
| Field | Description |
|---|---|
product_name | Full name including variant descriptor |
brand | Brand or manufacturer |
category | Flower, Vape, Edible, Concentrate, etc. |
subcategory | Disposables, pre-ground, infused, etc. |
strain_type | Indica, Sativa, Hybrid |
thc_level | THC potency (e.g. "22.4%" or "10mg") |
cbd_level | CBD potency or null |
variant_size | Weight/volume (e.g. "3.5g", "1/2oz") |
display_price | Price as shown on menu (e.g. "$38.00") |
numeric_price | Price as number for math/sorting |
special_offer_name | Active deal or promo name |
in_stock | true / false real-time availability |
product_url | Direct link to the product on Dutchie |
image_url | Product image URL |
dispensary_name | Store display name |
scraped_at | ISO 8601 UTC timestamp |
Verified Sample Output
Real, unmodified record from a live run (July 2026):
{"schema_version": "1.0","dispensary_name": "Pinnacle Cannabis - Quincy","product_name": "Berry Haze | Traveler Pro | 2g","brand": "Fernway","category": "Vape","subcategory": "disposables","strain_type": "Indica","thc_level": "86.9%","cbd_level": "1.0%","variant_size": "2g","display_price": "$59.00","numeric_price": 59,"special_offer_name": null,"in_stock": true,"scraped_at": "2026-07-12T14:21:00Z"}
Pricing
Pay-per-result. You are only charged for records successfully written to the dataset.
| Use Case | Products | Estimated Cost |
|---|---|---|
| Free preview / test run | 10 SKUs | ~$0.00 |
| Single small dispensary | ~200 SKUs | ~$0.60 |
| Single large dispensary | ~1,000 SKUs | ~$3.00 |
| 5 competitors (daily) | ~5,000 SKUs | ~$15.00/mo |
| 10 competitors (daily) | ~10,000 SKUs | ~$30.00/mo |
Pricing: $3.00 per 1,000 products. You are never charged for failed runs or empty results.
Scheduling Template: Daily Competitor Monitor
Set up a daily run in Apify's scheduler to track competitor pricing automatically:
{"dispensaryUrls": ["https://dutchie.com/dispensary/competitor-store-1","https://dutchie.com/dispensary/competitor-store-2","https://dutchie.com/dispensary/competitor-store-3"],"maxItems": 0,"useProxy": true,"proxyGroup": "RESIDENTIAL"}
Recommended schedule: Daily at 6:00 AM local time. Combine with a webhook to push results to Google Sheets, Slack, or your own database. For enterprise daily monitoring with email alerts, see puppywalker.dog.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
dispensaryUrls | string[] | required | One or more Dutchie dispensary URLs |
maxItems | integer | 0 (unlimited) | Max products per store; 0 = full menu |
offersOnly | boolean | false | Extract only active deals/promotions (skips full menu) |
useProxy | boolean | true | Recommended: always true. Residential proxies required to bypass Cloudflare |
proxyGroup | string | RESIDENTIAL | RESIDENTIAL (required) or DATACENTER (not recommended — Cloudflare blocks) |
Technical Details
- GraphQL-based extraction — uses Dutchie's own data layer, not brittle HTML parsing
- Chrome-like TLS fingerprinting via
curl_cffi— bypasses basic bot detection at the TCP level - Automatic store resolution — resolves Dutchie's internal store ID from any valid URL format
- Full pagination — fetches every page until the menu is complete (up to 10,000 products)
- Per-variant records — each size/weight option is its own row for accurate pricing analysis
- Specials tab support — captures active deal names and promotions
Frequently Asked Questions
Does this work on all Dutchie dispensaries? Yes — any publicly accessible Dutchie menu. Medical-only or login-gated menus are not supported.
How do I find the right URL?
Copy the URL directly from your browser when viewing the dispensary's Dutchie menu. Supported formats: dutchie.com/dispensary/store-name, dutchie.com/dispensary/store-name/menu, and dutchie.com/embedded-menu/store-name.
What if I get 0 results with no error?
This is almost always a proxy issue. Set useProxy: true and proxyGroup: "RESIDENTIAL". Cloudflare blocks Apify datacenter IPs silently — the run succeeds but returns no data. Residential proxies fix this reliably.
Can I schedule daily runs? Yes — use Apify's built-in scheduler to run this Actor on any schedule. Combine with webhooks to receive data automatically. See the scheduling template above.
Is there a free trial?
Set maxItems: 10 for a near-zero-cost preview run before committing to a full scrape.
What if the Actor breaks after a Dutchie update? Open an issue on the Issues tab with your run ID and dispensary URL. Fixes are prioritized and typically deployed within 48 hours.
Use Case Examples
Track competitor pricing daily Run against 5–10 competitor URLs on a daily Apify schedule. Export to Google Sheets. Know every price change before your customers do.
Monitor your brand's shelf placement Search the output for your brand name across 50+ dispensaries. Spot stockouts, pricing violations, and new distribution opportunities in minutes.
Real-time out-of-stock alerts When a high-velocity SKU disappears from a dispensary's menu, trigger a webhook to Slack or email so your sales rep can call the buyer immediately — before a competitor fills the shelf.
Build a cannabis price comparison tool Scrape 100+ dispensaries, normalize the data, and power a public-facing product comparison site or investor dashboard.
Identify market trends Analyze category mix, average THC levels, and pricing trends across a metro area. Publish the insights. Build an audience.
Questions or custom integration requests? Open an issue on the Issues tab. Include your run ID and dispensary URL for the fastest response. Or visit puppywalker.dog for enterprise pricing and daily monitoring options.