Datacircle

Build a free B2B leads list with SQL: 1,469 Texas construction owners

Lead list vendors sell you their niches. When yours isn't one of them, say the owners of Texas construction companies of 11 to 200 people, with an email or a phone, you can cut it yourself from a free B2B database in one SQL query.

Below: the download, the query, and what it gives on the October 2026 release of Datacircle's free 10M+ U.S. dataset: 1,469 owners, presidents, founders and CEOs with an email or a mobile phone, in a CSV. It costs nothing, and changing three lines gives you another state, industry or title.

1. Download the free dataset

Sign up with your work email: the 10M+ U.S. dataset is on your dashboard, with a download button. It's a 2.3 GB zip of two Parquet files, 9,521,154 people and 1,748,139 companies of 11 to 500 employees. Or from the API, with the key on the same dashboard:

import os, shutil, zipfile

import requests

API = "https://api.datacircle.dev"
KEY = {"Authorization": f"Token {os.environ['DATACIRCLE_API_KEY']}"}

files = requests.get(f"{API}/files/", headers=KEY).json()
us_10m = next(file for file in files if file["dataset"] == "us_10m")
link = requests.post(f"{API}/files/{us_10m['id']}/download-link/", headers=KEY).json()["url"]  # valid one hour
with requests.get(link, stream=True) as answer, open(us_10m["filename"], "wb") as file:
    answer.raise_for_status()
    shutil.copyfileobj(answer.raw, file)  # 2.3 GB
zipfile.ZipFile(us_10m["filename"]).extractall("us_10m")

us_10m/ now holds us_smb_mid_market_companies.parquet and us_smb_mid_market_persons.parquet. Every column, with its fill rate: the free US B2B leads dataset.

2. One query

DuckDB reads Parquet as it is, on a laptop, with no database to set up (pip install duckdb). People join their company on CURRENT_JOB_COMPANY_LINKEDIN_ID = LINKEDIN_ID; the company gives the state, industry and size, the person the title and the contact:

import duckdb

duckdb.sql("create view companies as select * from 'us_10m/us_smb_mid_market_companies.parquet'")
duckdb.sql("create view people as select * from 'us_10m/us_smb_mid_market_persons.parquet'")

leads = duckdb.sql(r"""
  select people.FULL_NAME, people.CURRENT_JOB_TITLE, people.EMAIL, people.MOBILE_PHONE, people.LINKEDIN_URL,
         companies.NAME as COMPANY, companies.URL as WEBSITE, companies.EMPLOYEE_COUNT_RANGE, companies.HQ_CITY
  from people join companies on people.CURRENT_JOB_COMPANY_LINKEDIN_ID = companies.LINKEDIN_ID
  where companies.HQ_STATE_CODE = 'TX'
    and companies.LINKEDIN_INDUSTRY = 'Construction'
    and companies.EMPLOYEE_COUNT_RANGE in ('11-50', '51-200')
    and regexp_matches(people.CURRENT_JOB_TITLE, '\b(owner|co-owner|president|founder|co-founder|ceo|chief executive)\b', 'i')
    and not regexp_matches(people.CURRENT_JOB_TITLE, 'vice', 'i')
    and (people.EMAIL is not null or people.MOBILE_PHONE is not null)
""")
leads.write_csv("texas_construction_owners.csv")
print(leads.shape)  # (1469, 9)

The title filter keeps owners, co-owners, presidents, founders and CEOs, and drops vice presidents. A field is filled only where the dataset has it, so the last line keeps the people you can reach: an email, a mobile phone, or both.

What it gives

Each step of the query, on the October 2026 release, for Texas and for the whole U.S.:

Construction companies of 11 to 200 employees and their owners, free 10M+ US dataset, October 2026
TexasUnited States
Construction companies, 11 to 200 employees8,394104,510
With at least one person in the people file6,61977,106
Their people39,535475,862
Owners, presidents, founders and CEOs2,20827,836
Companies with one of them1,81822,440
With an email85810,473
With a mobile phone1,21915,964
With one or the other: the CSV1,46918,690

For the whole U.S., drop the HQ_STATE_CODE line. In Texas, 608 of the 1,469 have both an email and a mobile; 1,044 work at companies of 11 to 50 people and 425 at 51 to 200. Where they are:

The Texas list by the company's headquarters city
CityLeads
Houston225
Dallas123
Austin112
San Antonio75
Fort Worth66
Plano23

The CSV has nine columns: FULL_NAME, CURRENT_JOB_TITLE, EMAIL, MOBILE_PHONE, LINKEDIN_URL, COMPANY, WEBSITE, EMPLOYEE_COUNT_RANGE and HQ_CITY. Each email comes with EMAIL_VALIDATED_AT, the date it was last verified, if you want it in the list too.

3. Your own niche

Three lines make the list: the state (HQ_STATE_CODE, two letters), the industry (LINKEDIN_INDUSTRY, as on LinkedIn) and the title pattern. To pick an industry, count them first; Texas has 115,133 companies in the free file, and these are its largest industries:

duckdb.sql("""
  select LINKEDIN_INDUSTRY, count(*) as companies
  from companies
  where HQ_STATE_CODE = 'TX' and LINKEDIN_INDUSTRY is not null
  group by 1 order by 2 desc limit 8
""").show()
Texas companies of 11 to 500 employees by LinkedIn industry, free 10M+ US dataset, October 2026
IndustryCompanies
Construction8,768
Medical Practices5,714
Restaurants5,576
Oil and Gas5,431
IT Services and IT Consulting4,893
Hospitals and Health Care4,411
Real Estate3,658
Retail3,220

A title pattern for sales leaders is (head of sales|vp.*sales|sales director|director of sales|chief revenue), for IT (cio|cto|it director|director of it|head of it). Every state and industry, counted from the 50M+ file: the free list of US companies, with a page per state, such as Texas, and per industry, such as construction.

Then: the live profile

The file is a snapshot. When a lead matters, fetch the person's live LinkedIn profile from its LINKEDIN_URL: their current job, past roles, education and skills, through Datacircle's API at $1.25 per 1,000 profiles found, nothing for a profile that can't be reached. The $5 you get at signup pays for the first 4,000. A Python script that does it for a whole CSV: get LinkedIn profile data with Python.

Rather have the list cut already? The free lists: U.S. software founders, sales, marketing, finance, IT and talent leaders, agency owners, one CSV each. And the 50M+ U.S. dataset, 43.6M people and 6.7M companies of every size, unlocks once 3 people you invited sign up.

Questions

Where can I get a free B2B leads list?

Cut it yourself from a free B2B database: Datacircle's 10M+ US dataset is free to download whole with a work email (9.5M people, 1.75M companies of 11 to 500 employees, two Parquet files), and one SQL query turns it into the list you need, as a CSV. Or take one of the ready-made free lists at datacircle.dev/lists.

How do I build a B2B lead list with SQL?

Join the people to their companies (CURRENT_JOB_COMPANY_LINKEDIN_ID = LINKEDIN_ID), filter the companies on state, industry and size and the people on their title, keep the rows with an email or a phone, and write the result to a CSV. DuckDB does it on the Parquet files directly, with nothing to install but pip install duckdb.

How many construction company owners in Texas have an email or a phone?

In the free file's October 2026 release, 2,208 owners, presidents, founders and CEOs work at 1,818 Texas construction companies of 11 to 200 employees; 1,469 of them have an email or a mobile phone (858 an email, 1,219 a mobile, 608 both).

Can I use pandas instead of DuckDB?

Yes: read both Parquet files with pd.read_parquet, merge them on CURRENT_JOB_COMPANY_LINKEDIN_ID and LINKEDIN_ID, then filter. The people file is 1.8 GB, so pandas needs several times that in memory; DuckDB reads only the columns and rows the query needs.

Sign up with your work email: your API key and a $5 credit that never expires are on your dashboard, with the free 10M+ U.S. B2B leads dataset.

Sign up