Cannabis License Monitor — New, Changed & Expiring, No Login
Pricing
from $20.00 / 1,000 license alerts
Cannabis License Monitor — New, Changed & Expiring, No Login
Watch cannabis licenses in 10 states (CA, NY, MA, WA, CO, NV, MD, ME, CT, FL) and get only NEW licenses, status changes (suspended, revoked, expired), removals and licenses expiring soon, with business, type and dates. Daily schedule. No login. MCP-ready. $20 per 1,000 alerts.
Pricing
from $20.00 / 1,000 license alerts
Rating
0.0
(0)
Developer
Peter Skotte
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Cannabis License Monitor — new licenses, status changes & expirations in 12 states
Schedule it daily and get only what changed in official cannabis license data: newly issued licenses, status changes (active → suspended / revoked / expired / surrendered), licenses about to expire, and licensees that dropped off a regulator's current list — filtered by state, license type and status. Built for vendors and ancillary suppliers prospecting new licensees, insurers and lenders tracking enforcement, and compliance teams watching their own portfolio's renewals.
The monitor downloads each state's full regulator list on every run, diffs it against what it saw last time, emits one row per change, posts a summary to your webhook and remembers the new state. No browser, no proxies, no login: every source is a public regulator API, open-data feed or published spreadsheet.
Supported states
| State | Source (fetched live) | Licenses | Status detail | Freshness |
|---|---|---|---|---|
| CA | Dept. of Cannabis Control search API (search.cannabis.ca.gov) | ~21k incl. surrendered/expired/revoked | Active / Expired / Surrendered / Revoked / Suspended / Canceled | Refreshed daily by DCC |
| NY | Office of Cannabis Management on data.ny.gov | ~2.3k current OCM licenses | Active / Inactive / In-Process / Under review | Weekly |
| MA | Cannabis Control Commission open-data extract | ~950 approved licenses | Active / Payment Pending + suspension/revocation dates | Weekly |
| WA | LCB retailer spreadsheet + producer/processor renewals on data.wa.gov | ~1.4k retailers, producers, processors | ACTIVE / CLOSED / EXPIRED / TITLE CERTIFICATE | Weekly (LCB) |
| CO | MED licensed-facility lists (all 9 facility types) | ~600 current facilities | Current licensees only → removed when delisted | Monthly |
| NV | Cannabis Compliance Board establishment list | ~640 active, conditional, surrendered/revoked | Active / Conditional / Surrendered / Revoked | Monthly |
| MD | Maryland Cannabis Administration data-dashboard workbook | ~210 growers, processors, dispensaries, ancillary | Current licensees only → removed when delisted | Monthly |
| ME | Office of Cannabis Policy adult-use workbook + medical establishments & caregivers | ~1.9k | Active / Conditional / Pending | Monthly |
| CT | Dept. of Consumer Protection establishments on data.ct.gov | ~115 | Current licensees only → removed when delisted | Weekly |
| FL | OMMU licensed MMTC table | ~50 MMTC license holders | Initial Licensure / Dispensing Authorization | As published |
| MI | Cannabis Regulatory Agency Accela portal, full "Download results" CSV export (adult-use + medical facility modules) | ~10k incl. void/closed/suspended/revoked | Active / Late Renewal / License Void / Closed / Suspended / Revoked | Live (exported from the CRA portal on every run) |
| OH | Division of Cannabis Control license lists (dispensary, cultivator, processor, testing-lab workbooks) | ~320 current dual-use licenses | Current licensees only → removed when delisted | As published (list dated in the file, updated roughly weekly) |
Not supported (and why): OR (OLCC moved its license table into a Socrata story with no public tabular feed as of Sep 2026), MO (Tableau only), AZ (regulator PDF last updated 2021), IL (PDF updated Jan 2026, layout too unstable), NM (feed has no license numbers or status), MN / VT / NJ (browser-only portals), RI (blocks cloud requests).
Michigan is the largest list (~10k records across the adult-use and medical modules, about a minute to export);
its records have no issue date, so a first emitAll run orders Michigan by license number. Ohio publishes current
licensees only, so a license that drops off a DCC list surfaces as removed.
Change types
changeType | Emitted when | Extra fields |
|---|---|---|
new_license | A license number appears that the monitor has not seen before. Newest issueDate first, capped by maxNewPerState. | firstSeenAt |
status_change | The normalised status differs from the one stored last run (e.g. active → suspended). | previousStatus |
expiring_soon | expirationDate is within expiringWithinDays of today and the license is not already expired / revoked / inactive. Alerted once per expiration date: a renewal that moves the date re-arms it. | daysToExpiration |
removed | CO, MD and CT publish current licensees only, so a license vanishing from the list is the only signal that it lapsed, was surrendered or was revoked. Emitted with the stored name, type and last known status. | previousStatus |
Status normalisation
status | Raw regulator values mapped here |
|---|---|
active | Active, ACTIVE (ISSUED), Active (renewal on file), Open, Licensed, Approved, Limited Operations, Initial Licensure, Dispensing Authorization |
pending | Pending, Conditional, Pending Conditional, In-Process, Payment Pending, PCA / Amendment Under Review, Provisional |
inactive | Inactive, Surrendered, Canceled, CLOSED (PERMANENT/TEMPORARY), Not Operating, Former Title Certificate, Withdrawn, Denied |
expired | Expired |
suspended | Suspended |
revoked | Revoked |
unknown | anything else — statusRaw always keeps the original text |
Input
| Field | Default | Notes |
|---|---|---|
states | ["NY","MA"] | Two-letter codes from the table above. Every listed state is downloaded in full each run. |
licenseTypes | [] (all) | Case-insensitive substrings matched against the regulator's license type: "retail", "dispensary", "cultivat", "manufactur", "microbusiness", "delivery"… |
statuses | [] (all) | Only report rows whose current normalised status is in this list. For status_change the new status is tested, so ["suspended","revoked","expired"] gives an enforcement-only feed. removed rows have no current status and pass this filter. |
expiringWithinDays | 30 | Window for expiring_soon. |
maxNewPerState | 5 | Cap on new_license rows per state per run. On the very first run every license is new, so this keeps it to a sample of the newest issue dates. On later runs, extras beyond the cap stay unseen and come out next run. |
firstRunMode | emitAll | emitAll: report the newest licenses per state on the first run. baseline: silently record everything and emit nothing, so the next run reports only what changed. |
webhookUrl | "" | Optional POST target for the run summary. |
monitorId | default | One state store per ID — run several watchlists side by side. |
maxItems | 10 | Hard cap on rows per run across all change types. Rows beyond the cap are not marked seen and come out next run. |
Rows are emitted in priority order across all states — new licenses, then status changes, then removals, then expirations — so an expiration backlog in one state never crowds out an enforcement alert in another.
Recommended setup for a daily feed
- Create a task with your
states,licenseTypesandstatuses, and givemonitorIda meaningful name (ny-retail). - First run: set
firstRunModetobaseline. It records every current license and emits nothing, so day one is not a thousand-row backlog. (The default{}run usesemitAllinstead so you see real rows on a first test — the five newest licenses in NY and MA.) - Raise
maxItems(500+) andmaxNewPerState(50+) so a busy week is never truncated. - Schedule the task daily. CA refreshes nightly; NY, MA, WA and CT update weekly; CO, NV, MD and ME monthly. A daily run costs only the start fee on days nothing changed.
- Point
webhookUrlat Slack (incoming webhook), Zapier, Make or your own endpoint.
State lives in a named key-value store cannabis-monitor-<hash of monitorId> in your Apify account
(STATE record: seen[state][licenseNumber] → {status, expirationDate, …}, capped at 50,000 licenses per state).
Delete the store to reset a monitor. If a state's source fails or returns a partial list (fewer than half the
licenses seen last time), that state is skipped for the run and its saved state is left untouched, so a regulator
outage never produces a wave of false removed rows.
Example profiles
Vendor prospecting — new retail licenses in NY, MA and CT
{ "states": ["NY", "MA", "CT"], "licenseTypes": ["retail", "dispensary", "microbusiness"], "statuses": ["active"],"maxNewPerState": 50, "maxItems": 500, "firstRunMode": "baseline", "monitorId": "northeast-retail" }
Insurer / lender — enforcement actions across every state
{ "states": ["CA", "NY", "MA", "WA", "NV", "ME"], "statuses": ["suspended", "revoked", "expired", "inactive"],"maxItems": 1000, "firstRunMode": "baseline", "monitorId": "enforcement" }
Compliance — renewals due in the next 60 days for California cultivators
{ "states": ["CA"], "licenseTypes": ["cultivation"], "expiringWithinDays": 60, "maxItems": 2000, "monitorId": "ca-cult-renewals" }
Output
One row per change:
{"state": "NY","licenseNumber": "OCM-PT3B-26-000185","businessName": "S'Lo Down LLC","dbaName": null,"licenseType": "Adult-Use Processor Type Three-Branding","status": "active","statusRaw": "Active","previousStatus": null,"issueDate": "2026-09-24","expirationDate": "2028-09-24","daysToExpiration": 727,"address": null,"city": null,"zip": null,"county": null,"sourceUrl": "https://data.ny.gov/Economic-Development/Current-OCM-Licenses/jskf-tt3q","changeType": "new_license","firstSeenAt": "2026-09-28T21:45:53.606Z","monitorId": "default"}
A status change looks like {"changeType": "status_change", "status": "suspended", "statusRaw": "Suspended", "previousStatus": "active", …};
an expiration alert like {"changeType": "expiring_soon", "expirationDate": "2026-10-18", "daysToExpiration": 20, …}.
Address fields are null where the regulator does not publish them (see the coverage table).
Webhook payload
POSTed once per run as application/json, also saved as the SUMMARY record in the run's key-value store:
{"monitorId": "northeast-retail","runAt": "2026-09-29T10:00:03.118Z","baseline": false,"states": ["NY", "MA", "CT"],"failedStates": [],"newCount": 3,"statusChangeCount": 1,"expiringCount": 4,"removedCount": 0,"seenTotal": { "NY": 2265, "MA": 953, "CT": 115 },"changes": [ { "...first 50 rows, same shape as the dataset..." } ]}
Pricing
Pay per event: a small start fee plus a per-row fee only for changes emitted. A daily monitor that finds nothing new costs just the start fee. Need to check a specific list of licensees instead of watching for changes? Use the companion Cannabis License Verifier actor.