Dutchie Dispensary Menu Scraper avatar

Dutchie Dispensary Menu Scraper

Pricing

from $1.50 / 1,000 results

Go to Apify Store
Dutchie Dispensary Menu Scraper

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

Tim McGillicuddy

Maintained by Community

Actor stats

1

Bookmarked

35

Total users

3

Monthly active users

43 days

Issues response

8 days ago

Last modified

Share

Apify Actor Python

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

ParameterTypeDefaultDescription
dispensaryUrlsstring[]requiredOne or more Dutchie dispensary URLs
maxItemsinteger0 (unlimited)Max products per store; 0 = full menu
useProxybooleanfalseEnable Apify proxy rotation
proxyGroupstringRESIDENTIALRESIDENTIAL 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.

FieldTypeDescription
schema_versionstringSchema version identifier (currently "1.0")
dispensary_namestringDisplay name of the dispensary
dispensary_urlstringThe input URL used to identify the dispensary
product_idstringDutchie's internal product identifier
product_namestringFull product name including variant descriptor
brandstringBrand or manufacturer name
categorystringTop-level product category (e.g. Flower, Vape, Edible)
subcategorystringSub-category (e.g. disposables, pre-ground)
strain_typestringIndica, Sativa, Hybrid, or null
thc_levelstringTHC potency as a formatted string (e.g. "86.9%" or "5mg")
cbd_levelstringCBD potency as a formatted string, or null if not listed
potency_unitstring"Percentage" or "Milligrams"
variant_sizestringWeight, volume, or count descriptor (e.g. "2g", "1/2oz")
display_pricestringPrice as displayed on the menu (e.g. "$59.00")
numeric_pricenumberPrice as a numeric value for sorting and math
special_offer_namestringActive deal or promotion name, or null
descriptionstringProduct description text, or null if not provided
image_urlstringDirect URL to the product image
product_urlstringDirect URL to the product's page on the dispensary's Dutchie menu
in_stockbooleantrue if the product is currently available
scraped_atstringISO 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 description and special_offer_name: These fields are null when 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.

ScenarioApprox. ProductsEstimated 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: true and set proxyGroup: "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 maxItems to 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.