Most people assume building a lead list costs money. They picture paid databases, LinkedIn Sales Navigator subscriptions, or expensive data scraping tools. But there's a free, publicly maintained dataset sitting in plain sight that most sales professionals have never heard of: OpenStreetMap, queried through the Overpass API.
OpenStreetMap (OSM) is the Wikipedia of maps — a community-maintained geospatial database with over 100 million tagged features. That includes businesses: restaurants, plumbers, dentists, gyms, salons, contractors, auto shops, and thousands of other local business types, each with their address, phone number, business category, and sometimes a website.
You can query all of it for free. Here's how.
What Is the Overpass API?
The Overpass API is a read-only HTTP interface to the OSM database. You send a query, it returns structured data (JSON or XML) about geographic features that match your criteria. No signup. No API key. No rate limit for modest queries. It runs at https://overpass-api.de/api/interpreter and you can test queries interactively at overpass-turbo.eu.
For lead generation, the workflow is simple: define a geographic area, specify a business type, run the query, get a list of businesses with their contact info.
Step 1: Define Your Target Area
You have three options for specifying geography in Overpass:
- Bounding box: A rectangle defined by min/max latitude and longitude. Good for rough city-level searches.
- Named area: A city, county, or neighborhood by name (uses the
areafilter). More precise. - Radius around a point: A circle around specific coordinates. Best for "leads within 20 miles of downtown Denver."
For most cold outreach campaigns, you want a city or county. Here's how to specify Richmond, Virginia as your search area:
[out:json][timeout:60];
area["name"="Richmond"]["admin_level"="8"]->.city;
(
node["amenity"="restaurant"](area.city);
way["amenity"="restaurant"](area.city);
);
out body;
Change restaurant to any business type you want. Common values: hairdresser, dentist, auto_repair, gym, laundry, cafe, hotel, plumber. The full tag reference is at wiki.openstreetmap.org/wiki/Map_features.
Step 2: Run the Query and Get Data
Go to overpass-turbo.eu and paste your query. Hit Run. You'll see results plotted on a map and the raw JSON in the Data tab. For a medium-size city and a common business type, you'll typically get 200–1,000 results.
Each result looks like this:
{
"type": "node",
"id": 4857391234,
"lat": 37.5407,
"lon": -77.4360,
"tags": {
"name": "Blue Ridge Barbershop",
"amenity": "hairdresser",
"addr:street": "Main Street",
"addr:housenumber": "214",
"addr:city": "Richmond",
"addr:state": "VA",
"addr:postcode": "23219",
"phone": "+1-804-555-0192",
"website": "https://blueridgebarbershop.com",
"opening_hours": "Mo-Fr 09:00-18:00"
}
}
Not every entry has every field — OSM data quality varies by city and contributor activity. Urban areas tend to be more complete. Rural areas may have addresses but no phone numbers.
"The businesses with no website field in OSM data are your highest-intent prospects — they're the ones most likely to need exactly what you're selling."
Step 3: Export and Clean the Data
From overpass-turbo, click Export → Data → download as GeoJSON or raw JSON. Then parse it into a spreadsheet. A simple Python script handles this in under 30 lines:
import json, csv
with open('results.json') as f:
data = json.load(f)
rows = []
for el in data['elements']:
t = el.get('tags', {})
rows.append({
'name': t.get('name',''),
'address': f"{t.get('addr:housenumber','')} {t.get('addr:street','')}".strip(),
'city': t.get('addr:city',''),
'state': t.get('addr:state',''),
'zip': t.get('addr:postcode',''),
'phone': t.get('phone',''),
'website': t.get('website',''),
'category': t.get('amenity') or t.get('shop',''),
})
with open('leads.csv', 'w', newline='') as f:
w = csv.DictWriter(f, fieldnames=rows[0].keys())
w.writeheader()
w.writerows(rows)
Run this and you have a clean CSV. Open it in Excel or Google Sheets. Sort by the website column: businesses with no website are your hottest prospects for a website audit pitch. Businesses with no phone are potentially easier to reach by email or direct mail.
Step 4: Score and Prioritize Your List
Raw Overpass data gives you quantity. Prioritization gives you quality. Score each lead on three criteria:
- No website (or obviously broken website): Highest intent signal. They need help.
- Business type match: Focus on industries you serve or where your offer has clear ROI (restaurants, service businesses, salons).
- Operating status: Cross-reference with Google Maps — if OSM says they're open and Google confirms, the lead is valid. OSM data can be 1–3 years stale in some areas.
A quick Google search on each business name takes 30 seconds and instantly validates the lead. For volume, a VA can do this enrichment pass at $5–10/hour.
Step 5: The Cold Outreach Framework
With a clean, scored list, your outreach needs to be direct and specific. Generic "I help businesses grow" messages get deleted. What works:
Email subject: "Quick note about [Business Name]'s online presence"
Body (under 100 words):
"Hi [Owner name] — I was looking for [business type] in [city] and noticed [Business Name] doesn't have a website (or: your site has some speed/conversion issues that are likely costing you customers). I help local businesses fix this. Mind if I send over a free 5-minute audit? No pitch, just the findings."
That's it. Short, specific, offers value first. Follow up once at day 5. If no response, move on. With a list of 500 targeted leads, a 3–5% response rate is realistic — that's 15–25 conversations from free data and an afternoon of work.
Scaling the System
Once you have the basic workflow down, you can automate the entire pipeline. Run Overpass queries weekly to catch new businesses. Auto-filter for missing websites. Push qualified leads to a CRM automatically. Set up email sequences that trigger on import.
You can also expand beyond OSM. The US Census Bureau's Business Register is another free dataset (though it lags by 1–2 years). Google Places API gives you richer data — reviews, photos, hours — but has per-request costs after a free tier. Start with OSM, validate the workflow, then layer in enrichment sources as your volume grows.
The key insight: every city has thousands of local businesses with weak or nonexistent online presence. They're findable, contactable, and genuinely in need of the services most digital agencies and freelancers offer. The barrier isn't data access — it's knowing where to look.