Dutchie Dispensary Menu Scraper
Pricing
from $1.50 / 1,000 results
Dutchie Dispensary Menu Scraper
Extract complete product menus from any Dutchie-powered dispensary. Get product names, brands, prices, THC/CBD levels, categories, and more in under 60 seconds. Pay only for results.
Pricing
from $1.50 / 1,000 results
Rating
5.0
(1)
Developer
Tim McGillicuddy
Maintained by CommunityActor stats
1
Bookmarked
35
Total users
3
Monthly active users
43 days
Issues response
8 days ago
Last modified
Categories
Share
Extract complete product menus from any Dutchie-powered dispensary. Get product names, brands, prices, THC/CBD levels, categories, and more in under 60 seconds. Pay only for results.
$1.50 per 1,000 products.
Why use this scraper?
This actor avoids fragile DOM parsing by using Dutchie's underlying GraphQL data layer where available. That makes it faster and less sensitive to visual layout changes than browser-based scrapers.
That said, no scraper is bulletproof. Dutchie platform updates, anti-bot changes, or private/medical-only menu restrictions may still require maintenance. When issues arise, they are addressed promptly — see the Issues tab for response history.
More resilient than HTML scrapers. No Puppeteer. No brittle CSS selectors. Direct API access where possible.
Perfect for
- Competitive intelligence — monitor competitor pricing and inventory daily
- Brand tracking — track where your products are sold and for how much
- Market research — analyze category trends, average prices, and popular strains
- Aggregators — build your own cannabis product directory or comparison tool
Quick Start
Single dispensary
{"dispensaryUrls": ["https://dutchie.com/dispensary/your-store-name"],"maxItems": 0}
Bulk / competitor monitoring
{"dispensaryUrls": ["https://dutchie.com/dispensary/store-one","https://dutchie.com/dispensary/store-two","https://dutchie.com/dispensary/store-three"],"maxItems": 0}
Features
- GraphQL-based extraction — bypasses HTML rendering; uses Dutchie's own data layer for speed and stability
- Chrome-like TLS fingerprinting — via
curl_cffi; residential proxies supported for harder targets and bulk runs - Automatic dispensary resolution — resolves the dispensary's internal Dutchie identifier from the supplied URL using multiple fallback methods
- Full menu pagination — fetches every page until the menu is complete (up to 10,000 products)
- Per-variant output — each size/weight option is its own record for accurate pricing analysis
- Special offers — captures active deal names and promotions from the Specials tab
- Bulk mode — scrape multiple dispensaries in a single run
- Proxy support — optional Apify residential/datacenter proxy for high-volume use
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 |
useProxy | boolean | false | Enable Apify proxy rotation |
proxyGroup | string | RESIDENTIAL | RESIDENTIAL or DATACENTER |
Output Schema
Each product variant is one record in the dataset. All fields are present in every record; unavailable values are returned as null.
| Field | Type | Description |
|---|---|---|
schema_version | string | Schema version identifier (currently "1.0") |
dispensary_name | string | Display name of the dispensary |
dispensary_url | string | The input URL used to identify the dispensary |
product_id | string | Dutchie's internal product identifier |
product_name | string | Full product name including variant descriptor |
brand | string | Brand or manufacturer name |
category | string | Top-level product category (e.g. Flower, Vape, Edible) |
subcategory | string | Sub-category (e.g. disposables, pre-ground) |
strain_type | string | Indica, Sativa, Hybrid, or null |
thc_level | string | THC potency as a formatted string (e.g. "86.9%" or "5mg") |
cbd_level | string | CBD potency as a formatted string, or null if not listed |
potency_unit | string | "Percentage" or "Milligrams" |
variant_size | string | Weight, volume, or count descriptor (e.g. "2g", "1/2oz") |
display_price | string | Price as displayed on the menu (e.g. "$59.00") |
numeric_price | number | Price as a numeric value for sorting and math |
special_offer_name | string | Active deal or promotion name, or null |
description | string | Product description text, or null if not provided |
image_url | string | Direct URL to the product image |
product_url | string | Direct URL to the product's page on the dispensary's Dutchie menu |
in_stock | boolean | true if the product is currently available |
scraped_at | string | ISO 8601 UTC timestamp of when the record was collected |
Verified Sample Output
The following is a real, unmodified product record from a live run against a Dutchie-powered dispensary (May 21, 2026):
{"schema_version": "1.0","dispensary_name": "Quincy Cannabis Co.","dispensary_url": "https://dutchie.com/dispensary/quincy-cannabis-quincy-retail-rec","product_id": "6612c76bf0325e0001293d94","product_name": "Berry Haze | Traveler Pro | 2g","brand": "Fernway","category": "Vape","subcategory": "disposables","strain_type": "Indica","thc_level": "86.9%","cbd_level": "1.0%","potency_unit": "Percentage","variant_size": "2g","display_price": "$59.00","numeric_price": 59,"special_offer_name": null,"description": null,"image_url": "https://dutchie-images.s3.us-west-2.amazonaws.com/a8b15b0df29617a7bca1d5956ba6a88f","product_url": "https://dutchie.com/dispensary/quincy-cannabis-quincy-retail-rec/product/6612c76bf0325e0001293d94","in_stock": true,"scraped_at": "2026-05-21T11:57:13Z"}
Note on
descriptionandspecial_offer_name: These fields arenullwhen the dispensary does not populate them in their Dutchie menu. Both fields are always present in the output record.
Pricing
Pay-Per-Result: $1.50 per 1,000 product variants (SKUs)
You are billed only for records successfully written to the dataset — not for attempted scrapes, failed requests, or empty runs. Test with maxItems: 10 for a low-cost validation run before committing to a full pull.
| Scenario | Approx. Products | Estimated Cost |
|---|---|---|
| Single small store | ~200 SKUs | ~$0.30 |
| Single large store | ~1,000 SKUs | ~$1.50 |
| 5 stores (bulk) | ~5,000 SKUs | ~$7.50 |
| 10 stores (bulk) | ~10,000 SKUs | ~$15.00 |
Troubleshooting
"Could not resolve dispensary" error
- Copy the exact URL from your browser's address bar — the slug after
/dispensary/must match exactly - Some stores use separate recreational and medical URLs; try both
403 Forbidden / access blocked
- Enable
useProxy: trueand setproxyGroup: "RESIDENTIAL"
Fewer products than expected
- Some stores have separate rec and medical menus; this actor scrapes the rec menu by default
- Verify the store's menu is publicly accessible without login
Actor times out
- Increase the Actor timeout in your Apify console settings (default 60s; set to 300s for large stores)
- Use
maxItemsto limit output during testing
Questions or custom integration requests? Open an issue on this Actor's Issues tab. Include your run ID and the dispensary URL for the fastest response.