Free to search · Data up to October 15, 2026

715K businesses.
One search.

Search 715,559 business listings by city and category, with phone numbers, websites, addresses and ratings, and export the results to CSV. Free, no signup. Built end to end by Mohamed Abdelhalim, from the scraper to the database to this site.

leadsignal.halim.pro/app
Dentists in Dubai 56 listings
The Dome MedDental Clinic|Dental Clinic - Jumeirah Lake Towers, Dubaï
★ 5.0 +97143999772 Website
Rex Dental & Medical Centre I Dental Clinic in Sheikh Zayed Road, Dubai | Dentist in Dubai
★ 5.0 +97143211811 Website
Dubai Sky Clinic (by Trio Dental Center)
★ 4.9 +97143558808 Website
Precision Dental Clinic - Dubai
★ 4.9 +97142756731 Website
Real rows from the database, not a mockup.
715,559
Business listings
83%
Have a phone number
336
Cities
11,067
Indexed list pages
How it's built

From a Maps search
to a clean row

Each run took one city through five stages on GitHub Actions with no manual steps. Collection stopped on October 15, 2026, so the data is frozen, but the whole pipeline still runs on demand.

Scrape

scraper/maps_scraper.py

Selenium with undetected-chromedriver searches every category in a city, scrolls the results and opens each profile. User agents rotate and the browser restarts every few queries.

Clean

cleaner/csv_cleaner.py

Maps URLs collapse to a stable place ID, websites lose tracking parameters, ratings and review counts are parsed, and duplicates are dropped.

Enrich

scraper/phone_enricher.py

Listings without a phone are revisited, and every number is normalized to E.164 using the country of the city that was searched.

Load

db/supabase_push.py

Rows are upserted in batches into Postgres on Supabase, keyed on the profile URL, so a re-run refreshes listings instead of duplicating them.

Serve

app.py

A Flask app on Vercel serves the search tool, a CSV export, and one server-rendered page for every city and category with enough listings.

Python 3.11SeleniumpandasphonenumbersPostgres (Supabase)FlaskVercelGitHub Actionspytest
Engineering decisions

Fast on a
free-tier database

The whole thing runs on a free Postgres instance. These are the choices that made 715,559 rows searchable without paying for a bigger one.

A counts table kept current by a trigger

Never count the big table

A statement-level AFTER INSERT trigger keeps lead_combos up to date with one row per city and category. The city list, the category counts, the stats on this page, and the sitemap all read from it instead of counting hundreds of thousands of rows.

Indexes shaped like the query

Every search is a range scan

Searches match an exact city from a dropdown, never a fuzzy text match, so (category, query_location, rating desc) turns any page of results into a single index range scan.

Idempotent loads

Safe to re-run anything

Upserting on the profile URL means a failed run can simply be repeated, and re-scraping a city updates it in place. The rotation position lives in a database table, so runs never commit to the repo.

Read-only by design

The public key can only read

Row level security is on for every table. The public role can read listings and the aggregate tables and nothing else, and exports are sanitized against spreadsheet formula injection.

What's in a row

The fields you get

Phone number

Normalized to international format, with call and WhatsApp links in the tool.

Website

The business site when the listing has one, with tracking parameters removed.

Address and Maps link

The street address and a direct link to the Google Maps profile.

Rating and reviews

Star rating, plus review count for listings collected or refreshed since October 2026.

Category and city

60 categories across 336 cities, countries and US states.

CSV export

The top 100 rows of any search, with duplicate removal and column picking.

Try it on a city you know

No signup. Pick a city, pick a category, export the list.

Search businesses
FAQ

Common questions

Is it free?
Yes. LeadSignal is a free tool built by Mohamed Abdelhalim. Any search shows the top 100 results by your sort order, and you can export them to CSV with no signup.
Is the data up to date?
Not live. Collection stopped on October 15, 2026 and the data is not being refreshed. Listings were collected at different times before that date, so some are older. Businesses move, close and change phone numbers all the time, so check anything important before you rely on it.
Which cities are covered?
336 locations across the Gulf, Egypt, the UK, Europe, North America and Asia. A few are whole US states or Cairo districts rather than cities, and the search tool labels those. The tool's city list comes straight from the database, so it only offers places that have data.
Is this affiliated with Google?
No. LeadSignal uses publicly available business listing data and is not affiliated with, endorsed by, or connected to Google.
How should I use the data?
For legitimate outreach and research only. Follow the anti-spam and consent rules where you and your recipients are. Listings are removed on request; see the privacy page.
Can I hire the person who built it?
Yes. I build scrapers, data pipelines and automations. Reach me through halim.pro or LinkedIn.