Dutchie Scraper: Cannabis Menu & Pricing Data Extractor avatar

Dutchie Scraper: Cannabis Menu & Pricing Data Extractor

Pricing

from $3.00 / 1,000 results

Go to Apify Store
Dutchie Scraper: Cannabis Menu & Pricing Data Extractor

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

Tim McGillicuddy

Maintained by Community

Actor stats

1

Bookmarked

53

Total users

3

Monthly active users

3 days ago

Last modified

Share

Dutchie Scraper — Cannabis Dispensary Menu & Pricing Data Extractor

Apify Actor Python Rating Runs Success Rate

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 ApifyClient
client = 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: true with proxyGroup: "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 TypeWhat They Do With It
Cannabis brand managersTrack shelf placement, pricing compliance, and stockouts across every dispensary carrying their brand
Dispensary operatorsBenchmark competitor pricing and promotions before customers notice the difference
Market researchersBuild cannabis price trend datasets, analyze category mix, and track new product launches
Data aggregatorsPower cannabis product directories, comparison tools, and investment research platforms
DevelopersIntegrate dispensary data into apps, dashboards, or pipelines via Apify's API
Compliance officersCross-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_cffi for 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.

FieldDescription
product_nameFull name including variant descriptor
brandBrand or manufacturer
categoryFlower, Vape, Edible, Concentrate, etc.
subcategoryDisposables, pre-ground, infused, etc.
strain_typeIndica, Sativa, Hybrid
thc_levelTHC potency (e.g. "22.4%" or "10mg")
cbd_levelCBD potency or null
variant_sizeWeight/volume (e.g. "3.5g", "1/2oz")
display_pricePrice as shown on menu (e.g. "$38.00")
numeric_pricePrice as number for math/sorting
special_offer_nameActive deal or promo name
in_stocktrue / false real-time availability
product_urlDirect link to the product on Dutchie
image_urlProduct image URL
dispensary_nameStore display name
scraped_atISO 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 CaseProductsEstimated Cost
Free preview / test run10 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

ParameterTypeDefaultDescription
dispensaryUrlsstring[]requiredOne or more Dutchie dispensary URLs
maxItemsinteger0 (unlimited)Max products per store; 0 = full menu
offersOnlybooleanfalseExtract only active deals/promotions (skips full menu)
useProxybooleantrueRecommended: always true. Residential proxies required to bypass Cloudflare
proxyGroupstringRESIDENTIALRESIDENTIAL (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.