Cannabis License Monitor — New, Changed & Expiring, No Login avatar

Cannabis License Monitor — New, Changed & Expiring, No Login

Pricing

from $20.00 / 1,000 license alerts

Go to Apify Store
Cannabis License Monitor — New, Changed & Expiring, No Login

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

Peter Skotte

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

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

StateSource (fetched live)LicensesStatus detailFreshness
CADept. of Cannabis Control search API (search.cannabis.ca.gov)~21k incl. surrendered/expired/revokedActive / Expired / Surrendered / Revoked / Suspended / CanceledRefreshed daily by DCC
NYOffice of Cannabis Management on data.ny.gov~2.3k current OCM licensesActive / Inactive / In-Process / Under reviewWeekly
MACannabis Control Commission open-data extract~950 approved licensesActive / Payment Pending + suspension/revocation datesWeekly
WALCB retailer spreadsheet + producer/processor renewals on data.wa.gov~1.4k retailers, producers, processorsACTIVE / CLOSED / EXPIRED / TITLE CERTIFICATEWeekly (LCB)
COMED licensed-facility lists (all 9 facility types)~600 current facilitiesCurrent licensees only → removed when delistedMonthly
NVCannabis Compliance Board establishment list~640 active, conditional, surrendered/revokedActive / Conditional / Surrendered / RevokedMonthly
MDMaryland Cannabis Administration data-dashboard workbook~210 growers, processors, dispensaries, ancillaryCurrent licensees only → removed when delistedMonthly
MEOffice of Cannabis Policy adult-use workbook + medical establishments & caregivers~1.9kActive / Conditional / PendingMonthly
CTDept. of Consumer Protection establishments on data.ct.gov~115Current licensees only → removed when delistedWeekly
FLOMMU licensed MMTC table~50 MMTC license holdersInitial Licensure / Dispensing AuthorizationAs published
MICannabis Regulatory Agency Accela portal, full "Download results" CSV export (adult-use + medical facility modules)~10k incl. void/closed/suspended/revokedActive / Late Renewal / License Void / Closed / Suspended / RevokedLive (exported from the CRA portal on every run)
OHDivision of Cannabis Control license lists (dispensary, cultivator, processor, testing-lab workbooks)~320 current dual-use licensesCurrent licensees only → removed when delistedAs 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

changeTypeEmitted whenExtra fields
new_licenseA license number appears that the monitor has not seen before. Newest issueDate first, capped by maxNewPerState.firstSeenAt
status_changeThe normalised status differs from the one stored last run (e.g. active → suspended).previousStatus
expiring_soonexpirationDate 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
removedCO, 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

statusRaw regulator values mapped here
activeActive, ACTIVE (ISSUED), Active (renewal on file), Open, Licensed, Approved, Limited Operations, Initial Licensure, Dispensing Authorization
pendingPending, Conditional, Pending Conditional, In-Process, Payment Pending, PCA / Amendment Under Review, Provisional
inactiveInactive, Surrendered, Canceled, CLOSED (PERMANENT/TEMPORARY), Not Operating, Former Title Certificate, Withdrawn, Denied
expiredExpired
suspendedSuspended
revokedRevoked
unknownanything else — statusRaw always keeps the original text

Input

FieldDefaultNotes
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.
expiringWithinDays30Window for expiring_soon.
maxNewPerState5Cap 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.
firstRunModeemitAllemitAll: 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.
monitorIddefaultOne state store per ID — run several watchlists side by side.
maxItems10Hard 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.

  1. Create a task with your states, licenseTypes and statuses, and give monitorId a meaningful name (ny-retail).
  2. First run: set firstRunMode to baseline. It records every current license and emits nothing, so day one is not a thousand-row backlog. (The default {} run uses emitAll instead so you see real rows on a first test — the five newest licenses in NY and MA.)
  3. Raise maxItems (500+) and maxNewPerState (50+) so a busy week is never truncated.
  4. 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.
  5. Point webhookUrl at 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.