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

  1. 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.
  2. Taxpayer vs outlet. taxpayer_name is the legal owner (often an LLC with a numbered name), and outlet_name is the sign on the door. Use the outlet name in your outreach.
  3. First sales date is the real timing signal. outlet_first_sales_date is 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.
  4. Chains show up too. A franchise group opening five locations appears as five outlets under one taxpayer number. Group by taxpayer_name to 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.