Leafly Dispensary Scraper avatar

Leafly Dispensary Scraper

Pricing

from $3.00 / 1,000 results

Go to Apify Store
Leafly Dispensary Scraper

Leafly Dispensary Scraper

[πŸ’° $3.00 / 1K] Extract Leafly dispensary data at scale β€” names, addresses, phone, hours, ratings, delivery & pickup options, payment methods, licensing, and optional customer reviews. Search by city or state, or paste specific dispensary URLs.

Pricing

from $3.00 / 1,000 results

Rating

0.0

(0)

Developer

SolidCode

SolidCode

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Pull complete cannabis dispensary profiles from Leafly at scale β€” 51 fields per store covering street address, phone, email, website, live hours, delivery radius and order minimums, payment acceptance, state license numbers and four separate star ratings, plus optional customer reviews with the dispensary's own replies. Built for cannabis brands mapping retail distribution, dispensary groups benchmarking competitors, and B2B sales teams that need a current, structured storefront list without copying pages out of a directory by hand.

Why This Scraper?

  • A 51-field store profile, not a directory card β€” every dispensary row is enriched from the store's own Leafly page: full description, email, website, phone, licenseNumber, parent organizationName, logo, cover photo and a full photos gallery. Search listings carry none of that.
  • Four separate star ratings, not one β€” rating overall plus qualityRating, serviceRating and atmosphereRating, so you can tell a store with great product and bad service apart from one with the reverse β€” the split that actually explains a 4.2.
  • Delivery economics on every store β€” deliveryEnabled, deliveryFee, deliveryMinimum and deliveryRadiusMiles alongside pickupEnabled and the quoted pickupMinutesMinimum/pickupMinutesMaximum wait window, so you can size a real fulfillment footprint instead of guessing which stores ship.
  • Four payment flags plus ATM presence β€” acceptsCash, acceptsCreditCards, acceptsDebitCards and hasAtm: the exact fields payments, POS and lending vendors prospect on in a cash-heavy industry.
  • State license numbers and operator rollups β€” licenseNumber straight off the store record wherever the store publishes one, plus organizationName and organizationSlug so storefronts belonging to a chain group cleanly into their multi-store operator for market-share math.
  • Reviews are opt-in and hard-capped β€” includeReviews is off by default and maxReviewsPerDispensary bounds it per store, so one popular dispensary sitting on thousands of reviews can never quietly inflate your run.
  • Reviews include the dispensary's reply β€” each review carries staffResponse and staffResponseDate next to wouldRecommend, wouldShopAgain, upvotesCount and the reviewer name, so you can measure which operators actually answer criticism and how quickly.
  • Two linked record types in one dataset β€” every row carries a recordType of dispensary or review, and each review repeats dispensaryName, dispensarySlug and dispensaryUrl so review rows stand alone in a spreadsheet with no joins.
  • City, state or ZIP β€” one state sweeps 1,000+ stores β€” "Denver, CO" targets a metro, "Colorado" returns over 1,000 dispensaries statewide, "80202" is accepted as another spelling of the same market, and pasted Leafly dispensary URLs skip search entirely to refresh a known account list.
  • Never the wrong city, quietly β€” every search is checked against the location Leafly actually matched, so an entry that can't be placed is reported back to you instead of being answered with a full page of stores from another state or another country. That silent-wrong-area failure is the one that poisons a dataset without anyone noticing.
  • United States and Canada in the same run β€” Los Angeles, Denver and Las Vegas storefronts alongside Toronto and Vancouver, each with latitude, longitude and timeZone for mapping, plus automatic de-duplication so a store appearing in two overlapping searches is returned β€” and billed β€” once.

Use Cases

Retail Distribution & Brand Expansion

  • Map every licensed storefront in a new state before a product launch, license numbers included
  • Rank target accounts by rating and review volume to decide where a sales rep goes first
  • Separate delivery-capable stores from pickup-only ones when planning fulfillment routes
  • Spot white space by comparing dispensary density across neighboring metros

B2B Sales & Lead Generation

  • Build outbound lists with direct phone, email and website for each store
  • Segment by payment acceptance β€” cash-and-ATM-only stores are the warmest payments leads
  • Target multi-store operators by grouping rows on organizationSlug
  • Re-run a fixed list of dispensary URLs on a schedule to keep CRM records fresh

Competitive & Market Intelligence

  • Track how many dispensaries operate in a metro month over month
  • Benchmark quality, service and atmosphere ratings separately against nearby competitors
  • Benchmark your rating, review count and follower count against nearby competitors
  • Compare delivery fees and order minimums across a region to price your own service
  • Monitor which stores keep an active menu using hasMenuItems and lastMenuUpdate

Reputation & Customer Experience

  • Pull recent reviews across a competitor set and mine recurring complaint themes
  • Measure staff-response coverage and lag from staffResponse and staffResponseDate
  • Track the wouldRecommend rate per store as a simple loyalty signal
  • Surface the most-upvoted reviews to see what customers actually amplify

Delivery, Mapping & Tech Platforms

  • Seed a store directory with coordinates, time zones, weekly hours and logos
  • Model delivery coverage from radius, fee and minimum-order values
  • Prioritize integration targets by menu freshness and review volume
  • Enrich an existing store database with photos, descriptions and cover imagery

Getting Started

Simple β€” one city

{
"searchLocations": ["Denver, CO"]
}

Multi-market β€” full coverage, no cap

{
"searchLocations": ["Los Angeles, CA", "San Diego, CA", "Toronto, Ontario"],
"maxDispensariesPerLocation": 0
}

0 means every dispensary in the market, which is 1,000+ rows for a large metro or a whole state. Leave reviews off on a sweep this wide.

With customer reviews

{
"searchLocations": ["Denver, CO"],
"maxDispensariesPerLocation": 30,
"includeReviews": true,
"maxReviewsPerDispensary": 50
}

Reviews multiply your row count: 30 stores Γ— 50 reviews adds up to 1,500 review rows on top of the 30 store rows. Keep maxReviewsPerDispensary set β€” see the pricing note below.

Known account list β€” direct dispensary URLs

{
"searchLocations": [],
"dispensaryUrls": [
"https://www.leafly.com/dispensary-info/the-green-solution4afc",
"https://www.leafly.com/dispensary-info/botanico5210"
],
"includeReviews": true,
"maxReviewsPerDispensary": 20
}

Input Reference

What to Collect

ParameterTypeDefaultDescription
searchLocationsarray of strings["Denver, CO"]US and Canadian cities, states, provinces or ZIP codes to find dispensaries in β€” "Denver, CO", "Colorado", "80202", "Toronto, ON", "Vancouver, British Columbia". Each entry runs its own search. Anything that can't be matched to a US or Canadian market is reported back instead of returning another area's stores.
dispensaryUrlsarray of strings[]Specific Leafly dispensary page URLs to collect directly. Use instead of, or alongside, location search.

Limits & Reviews

ParameterTypeDefaultDescription
maxDispensariesPerLocationinteger20The most dispensaries to collect per location. Results arrive 30 at a time, so any limit below 30 still returns β€” and bills for β€” 30 stores. Set it in multiples of 30 for predictable counts. 0 collects every dispensary in that market (1,000+ rows for a whole state). Does not apply to pasted URLs β€” each URL is one dispensary.
includeReviewsbooleanfalseAlso collect customer reviews for each dispensary. Off by default, because reviews add extra rows.
maxReviewsPerDispensaryinteger20When reviews are on, the most reviews to collect per dispensary β€” collected exactly, not rounded up. Every review is a billed row and a popular store can hold thousands, so 0 (all available) is best kept for short, targeted store lists. Ignored when reviews are off.

Output

Results arrive as a single dataset with two record types, told apart by the recordType field. Empty fields are removed from each row rather than returned as blanks.

recordType: "dispensary"

{
"recordType": "dispensary",
"id": 20746,
"slug": "the-green-solution4afc",
"name": "The Green Solution - Wewatta St. @ Union Station",
"url": "https://www.leafly.com/dispensary-info/the-green-solution4afc",
"description": "One of the most-awarded dispensaries in Colorado...",
"storeType": "dispensary",
"phone": "720-990-9723",
"email": "support@tgscolorado.com",
"website": "https://www.tgscolorado.com/stores/denverwewatta",
"address": "1995 Wewatta Street",
"city": "Denver",
"state": "CO",
"postalCode": "80202",
"country": "US",
"latitude": 39.7566978,
"longitude": -104.9980103,
"rating": 4.6091,
"qualityRating": 4.6,
"serviceRating": 4.6272,
"atmosphereRating": 4.6,
"reviewCount": 110,
"followerCount": 310,
"openNow": true,
"openUntil": "2026-07-24 23:45:00 -0600",
"hours": "9am - 7pm Daily",
"schedule": { "monday": { "open": "1901-01-01T09:00:00.000Z", "close": "1901-01-02T23:45:00.000Z", "isOpen": true } },
"timeZone": "America/Denver",
"deliveryEnabled": false,
"deliveryFee": 0,
"deliveryMinimum": 0,
"deliveryRadiusMiles": 10,
"pickupEnabled": true,
"pickupMinutesMinimum": 15,
"pickupMinutesMaximum": 30,
"acceptsCash": true,
"acceptsCreditCards": false,
"acceptsDebitCards": true,
"hasAtm": true,
"licenseNumber": "402-00883",
"offersMedicalCards": false,
"isAdaAccessible": true,
"hasVeteranDiscount": true,
"hasMenuItems": true,
"lastMenuUpdate": "2026-07-24T20:36:46.312Z",
"organizationName": "The Green Solution - Colorado",
"organizationSlug": "the-green-solution-colorado",
"logoUrl": "https://images.leafly.com/menu/...png",
"coverPhotoUrl": "https://leafly-public.imgix.net/dispensary/photos/...jpg",
"photos": ["https://leafly-public.imgix.net/dispensary/photos/...jpg"],
"scrapedAt": "2026-07-24T20:42:38Z"
}

Core & Identity

FieldTypeDescription
recordTypestringAlways "dispensary" for store rows
idintegerLeafly's internal dispensary identifier
slugstringURL slug for the dispensary
namestringDispensary name as displayed
urlstringLink to the dispensary page on Leafly
storeTypestringStore category as Leafly classifies it, e.g. dispensary
descriptionstringThe store's own written description or bio
organizationNamestringParent operator or chain, for stores that belong to one
organizationSlugstringStable identifier for that parent operator
partialbooleanPresent and true only if the full store page could not be loaded and a basic record was returned instead
scrapedAtstringISO-8601 timestamp of when the row was collected

Address & Location

FieldTypeDescription
addressstringStreet address, including a second address line when present
citystringCity
statestringState or province code
postalCodestringZIP or postal code
countrystringCountry code, e.g. US or CA
latitudenumberLatitude of the storefront
longitudenumberLongitude of the storefront
timeZonestringStore time zone, e.g. America/Denver

Contact & Ratings

FieldTypeDescription
phonestringPublic phone number
emailstringPublic contact email
websitestringThe store's own website
ratingnumberAverage overall star rating
qualityRatingnumberAverage rating reviewers gave for product quality
serviceRatingnumberAverage rating reviewers gave for staff and service
atmosphereRatingnumberAverage rating reviewers gave for the store atmosphere
reviewCountintegerTotal number of reviews on Leafly
followerCountintegerNumber of Leafly users following the store

Hours & Menu

FieldTypeDescription
openNowbooleanWhether the store was open at collection time
openUntilstringWhen the store's current opening period ends, with its local UTC offset
hoursstringFree-text opening hours as written by the store
scheduleobjectStructured per-weekday schedule: opening time, closing time and an is-open flag for each day of the week
hasMenuItemsbooleanWhether the store currently publishes a product menu
lastMenuUpdatestringISO-8601 timestamp of the store's most recent menu change

Delivery, Pickup & Payments

FieldTypeDescription
deliveryEnabledbooleanWhether the store delivers
deliveryFeenumberDelivery fee charged
deliveryMinimumnumberMinimum order value for delivery
deliveryRadiusMilesnumberHow far the store delivers, in miles
pickupEnabledbooleanWhether in-store pickup is offered
pickupMinutesMinimumintegerShortest quoted pickup wait, in minutes
pickupMinutesMaximumintegerLongest quoted pickup wait, in minutes
acceptsCashbooleanCash accepted
acceptsCreditCardsbooleanCredit cards accepted
acceptsDebitCardsbooleanDebit cards accepted
hasAtmbooleanATM available on site

Licensing, Amenities & Media

FieldTypeDescription
licenseNumberstringState or provincial license number, where the store publishes one
offersMedicalCardsbooleanWhether the store helps customers obtain medical cards
isAdaAccessiblebooleanWheelchair and ADA accessibility
hasVeteranDiscountbooleanVeteran discount offered
logoUrlstringStore logo image
coverPhotoUrlstringCover photo image
photosarray of stringsGallery image links from the store's page

recordType: "review"

Returned only when includeReviews is enabled.

{
"recordType": "review",
"dispensaryName": "The Green Solution - Wewatta St. @ Union Station",
"dispensarySlug": "the-green-solution4afc",
"dispensaryUrl": "https://www.leafly.com/dispensary-info/the-green-solution4afc",
"reviewId": 3083575,
"rating": 5,
"content": "Great selection and the staff walked me through every concentrate on the shelf.",
"createdAt": "2023-04-22T06:05:38.269Z",
"wouldRecommend": true,
"wouldShopAgain": true,
"userName": "5........m",
"upvotesCount": 3,
"staffResponse": "Thank you so much for the kind words and for taking the time to review us!",
"staffResponseDate": "2023-05-16T15:29:33.147Z",
"scrapedAt": "2026-07-24T20:42:39Z"
}
FieldTypeDescription
recordTypestringAlways "review" for review rows
dispensaryNamestringName of the dispensary being reviewed
dispensarySlugstringSlug of the parent dispensary, for joining back to store rows
dispensaryUrlstringLink to the parent dispensary page
reviewIdintegerLeafly identifier for the review
ratingnumberStar rating the reviewer gave, 1 to 5
contentstringFull review text
createdAtstringISO-8601 date the review was posted
wouldRecommendbooleanWhether the reviewer would recommend the store
wouldShopAgainbooleanWhether the reviewer would shop there again
userNamestringReviewer display name as shown by Leafly
upvotesCountintegerHow many people found the review helpful
staffResponsestringThe dispensary's public reply, when one exists
staffResponseDatestringISO-8601 date of that reply
scrapedAtstringISO-8601 timestamp of when the row was collected

Tips for Best Results

  • Write Canadian markets any way you like. "Toronto, ON", "Toronto, Ontario" and "Vancouver, British Columbia" all land on the right province β€” codes and spelled-out names work identically across all 13 provinces and territories, and accents in names like "MontrΓ©al, QuΓ©bec" are handled for you. If a location can't be matched with certainty it's reported instead of quietly returning a nearby region.
  • A ZIP is another spelling of the market, not a smaller radius. "80202" and "Denver" return the same metro-wide result set, so use a ZIP when it is simply the address format you already have β€” not to tighten a trade area. "City, ST" is the most reliable form and always worth preferring; if you need a genuinely small area, filter the returned latitude/longitude afterwards.
  • State names run a census. "Colorado" alone returns over 1,000 dispensaries. Pair it with maxDispensariesPerLocation: 0 for complete statewide coverage, expect a longer run and a much larger dataset, and leave reviews switched off on a sweep that wide.
  • Cap reviews, always. The default run is one clean row per dispensary. When you want sentiment, maxReviewsPerDispensary between 20 and 50 captures the recent, most relevant feedback. 0 means every review a store has ever received β€” on a large store list that is tens of thousands of extra billed rows, so save it for a short, named set of dispensaries.
  • Results come back 30 at a time. Caps land on the next multiple of 30 rather than cutting a page short, so a cap of 20 and a cap of 30 both return β€” and bill for β€” 30 stores. Set caps in multiples of 30 for predictable counts. Review caps are different: those are collected to the exact number you ask for.
  • Check the partial column on very large runs. Almost every row is the full store profile, but if a store's page won't load, its listing information is kept and the row is flagged partial rather than dropped β€” so you never lose a dispensary. Re-running usually fills those few rows in.
  • Stack overlapping metros freely. List "Los Angeles, CA", "Santa Monica, CA" and "Long Beach, CA" in one run β€” stores appearing in more than one search are returned once, so overlap costs you nothing.
  • Group on organizationSlug before you count. Many storefronts belong to the same operator, so per-store totals overstate how many distinct companies compete in a market. Rolling up first is what turns the dataset into real market share.

Pricing

From $3.00 per 1,000 results β€” flat pay-per-result pricing for complete dispensary profiles and customer reviews. No compute or time-based charges β€” you pay per result, plus a small fixed per-run start fee. Bronze, Silver, and Gold subscribers pay progressively less; the table below shows total cost at each discount tier.

ResultsNo discountBronzeSilverGold
100$0.36$0.34$0.32$0.30
1,000$3.60$3.40$3.20$3.00
10,000$36.00$34.00$32.00$30.00
100,000$360.00$340.00$320.00$300.00

A "result" is any row in the output dataset. Each dispensary is one result, and when review collection is enabled each review is also one result β€” so a run with reviews turned on returns, and bills for, more rows than the same run without them. One flat rate covers both, and maxReviewsPerDispensary puts a hard ceiling on how many review rows a single store can add. Any Apify platform fees are additional and depend on your plan.

Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

  • Zapier / Make / n8n β€” Workflow automation
  • Google Sheets β€” Direct spreadsheet export
  • Slack / Email β€” Notifications on new results
  • Webhooks β€” Trigger custom apps when a run finishes
  • Apify API β€” Full programmatic access

This scraper collects publicly listed business information β€” storefront names, addresses, contact details, published hours, license numbers, and publicly visible customer reviews. Use it for market research, competitive analysis, lead generation, and directory building, and always in line with Leafly's terms of service and applicable law.

Cannabis is a regulated industry with rules that differ by state, province, and country. You are responsible for ensuring your use of this data complies with the marketing, advertising, and licensing regulations that apply to you. Handle reviewer names and review text responsibly and in accordance with applicable data protection laws, including GDPR and CCPA where relevant. Do not use this data to contact individual reviewers or for any unlawful purpose.