A new bar or restaurant applies for its liquor license weeks before it opens. That application is public: the state regulator posts it, often the same day. For anyone who sells to new venues (POS and payments, beer and wine distribution, liquor liability insurance, kitchen equipment, staffing, cleaning, signage) it is the earliest reliable signal that a business is about to need them.
The catch is that every regulator publishes it differently. California posts an HTML report per business day, Texas and New York run open-data APIs with different column names, New York resets its 'original issue' date on every renewal, Washington keeps only the last day or two of notices, and Ontario publishes CSV files. The Liquor License Applications tool reads all six, leaves renewals out and returns one schema. This post turns it into a daily lead list in Python.
Disclosure: I'm Aurelix, and I built the Liquor License Applications tool. It's a paid tool (prices below).
What each record holds
-
dba(the trade name) andbusiness_name(the legal entity, only when it is a company or organisation). -
license_typein words, plus the regulator'slicense_type_code(California's "47" becomes "On-Sale General - Eating Place", Texas "MB" becomes "Mixed Beverage Permit"). -
status: applied, pending, issued or inactive, with the regulator's own wording instatus_raw. -
application_type: new, transfer (a new owner taking over a license), change of location or amendment. -
application_date,issue_date, and for Ontario thenotice_deadlinefor public objections. - The premises:
address,city,county,premises_state,zip, and coordinates where the regulator has them. -
sourceandsource_url, so every lead can be checked against the regulator.
Owners' personal names, contact lines ('ATTN ...'), phone numbers and mailing addresses are not returned. When the license holder is a person rather than a company, business_name is empty.
New restaurant applications from the last week
pip install apify-client
import csv
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("aurelix/liquor-license-applications").call(
run_input={
"states": ["CA", "TX", "NY"],
"daysBack": 7,
"statuses": ["applied", "pending"],
"applicationTypes": ["new"],
"licenseTypes": ["eating place", "mixed beverage", "restaurant"],
"incremental": True,
"stateKey": "new-restaurants",
}
)
rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())
with open("new_restaurants.csv", "w", newline="", encoding="utf-8") as f:
w = csv.writer(f)
w.writerow(["date", "state", "trade_name", "company", "license_type", "address", "city", "zip"])
for r in rows:
w.writerow([r["date"], r["state"], r["dba"], r["business_name"], r["license_type"],
r["address"], r["city"], r["zip"]])
print(len(rows), "new restaurant applications")
licenseTypes matches words inside each regulator's license type, so one list covers California's eating-place licenses, Texas mixed-beverage permits and New York's restaurant licenses. With incremental on, the first run returns everything in the window. Later runs with the same stateKey return only applications they have not returned before, so a daily schedule pays only for new ones.
Who just got licensed: accounts for distributors
Distributors care less about the application than about the day the license is granted, because that is when the venue can order. Ask for issued licenses only and count them by city:
from collections import Counter
run = client.actor("aurelix/liquor-license-applications").call(
run_input={"states": ["TX", "NY", "MO", "ON"], "daysBack": 14, "statuses": ["issued"]}
)
rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())
for (state, city), n in Counter((r["state"], r["city"]) for r in rows).most_common(10):
print(f"{state} {city}: {n} new licenses")
Texas and Missouri publish licenses on the day they are first issued. New York and Ontario also re-date renewals and re-issues, so the tool keeps only first issues there (in one week, 167 of 444 New York rows and 26 of 83 Ontario rows). California's report covers applications only.
Transfers are leads too
Most California applications are transfers: someone buying an existing bar, restaurant or store. A new owner usually brings a new POS contract, new insurance and new suppliers. Filter for them with "applicationTypes": ["transfer"], or keep application_type as a column and let your sales team decide.
Why this tool
- Six regulators in one run and one schema: California, Texas, New York, Missouri, Washington and Ontario.
- Applications before opening day, plus new licenses, not renewals.
- License codes translated to words, and statuses normalised across states.
- An only-new mode for a daily feed, with a Slack or webhook digest.
- $0.90 per 1,000 leads ($0.70 on paid plans) plus $0.003 per run.
- What it doesn't cover: owner names and phone numbers, and states outside these six.
To get each new venue's phone and website, search its trade name and city with Google Maps Businesses.
Limits
- Six regulators. Other states don't publish new applications as open data that is updated at least weekly.
- Washington keeps only its newest notices, about a day or two, so schedule it daily.
- Ontario's pending list has no application date. Every application currently on public notice comes back, once per only-new feed.
- A few trade names are withheld. When a name repeats or reads like a person's name, it is left empty to keep personal names out.
Cost
You pay per lead returned plus a small start fee. Leads outside your filters, leads an earlier run already returned and sources that were down are free. The current prices are on the Store page; Apify's free plan includes $5 of credit a month, about 5,500 leads.
Top comments (0)