Every restaurant, food truck, caterer and bar in Texas needs a sales tax permit before it opens. The Texas Comptroller publishes all active permits on data.texas.gov, with the permit issue date and a NAICS industry code for each location. That makes it one of the best free sources of brand-new restaurant leads in the country, if you sell POS systems, payment processing, food distribution, linen service, insurance or local marketing.
When I ran this on Oct 24, 2026, the last 30 days held 1,431 new food and drink outlets owned by companies (sole proprietors excluded): Houston 144, San Antonio 89, Dallas 87, Austin 84, Fort Worth 43, El Paso 30.
The script
import requests from collections import Counter from datetime import date, timedelta def texas_new_food_outlets(days=30, city=None): since = (date.today() - timedelta(days=days)).isoformat() where = (f"outlet_permit_issue_date >= '{since}T00:00:00'" " AND taxpayer_organization_type != 'IS'" # skip sole proprietors " AND outlet_naics_code >= 722000 AND outlet_naics_code < 723000") if city: where += f" AND upper(outlet_city) = '{city.upper()}'" return requests.get("https://data.texas.gov/resource/jrea-zgmq.json", params={ "$select": "taxpayer_name,outlet_name,outlet_address,outlet_city,outlet_zip_code," "outlet_naics_code,outlet_permit_issue_date,outlet_first_sales_date", "$where": where, "$order": "outlet_permit_issue_date DESC", "$limit": 50000}, timeout=120).json() rows = texas_new_food_outlets(30) print(len(rows), "new Texas food and drink outlets in 30 days") print(Counter(r.get("outlet_city") for r in rows).most_common(6)) print(Counter(r.get("outlet_naics_code") for r in rows).most_common(5)) The NAICS codes that matter
The top codes in that 30-day window:
| NAICS | What it is | New outlets |
|---|---|---|
| 722511 | Full-service restaurants | 371 |
| 722513 | Limited-service (counter, fast casual) | 345 |
| 722330 | Mobile food services (food trucks) | 323 |
| 722515 | Snack and coffee bars | 193 |
| 722410 | Bars and drinking places | 79 |
Food trucks are almost as common as sit-down restaurants, which matters if you sell mobile POS or commissary space. Narrow the range in the $where to target one type, for example outlet_naics_code = 722330.
Things that will trip you up
- NAICS is a number, not text.
starts_with(outlet_naics_code, '722')returns HTTP 400. Use a numeric range (>= 722000 AND < 723000) as the script does. - Taxpayer vs outlet.
taxpayer_nameis the legal owner (often an LLC with a numbered name), andoutlet_nameis the sign on the door. Use the outlet name in your outreach. - First sales date is the real timing signal.
outlet_first_sales_dateis when the location expects to start selling. If it's in the future, the place isn't open yet, which is the perfect time to pitch equipment and setup services. - Chains show up too. A franchise group opening five locations appears as five outlets under one taxpayer number. Group by
taxpayer_nameto spot them.
Make it a weekly list
Change days=30 to days=7, run it every Monday, and de-duplicate on outlet name plus ZIP. Add city="Austin" to stay local.
Optional: if you'd rather not maintain the script, I publish this as a hosted, scheduled tool: Texas New Business Leads. Set naicsPrefixes to 722 for restaurants (paid per result). Disclosure: it's my tool. The code above does the same job for free.
