How to Scrape JustDial Business Listings in Python (Phone, Address, Ratings)
JustDial is India's largest local business directory with no public API. Learn how to extract business names, phone numbers, addresses, geo-coordinates, and review data by city and category as structured JSON.
The actor referenced in this article. Pay only for results delivered.
JustDial lists over 30 million businesses across India and is the primary discovery platform for local services. With no public API, scraping is the only way to extract structured listing data at scale. Here is how to do it.
What JustDial data contains
Each listing returns:
- Business name and primary phone number
- Full address broken into street, area, city, and PIN code
- Business category and sub-category
- Star rating and number of reviews
- Geo-coordinates (latitude and longitude) where JustDial has them
- Verified listing flag
Common use cases
Lead generation. Extract phone numbers for every plumber, electrician, or pest-control service in a city to build a sales outreach list.
Competitive research. Map every restaurant or salon in a locality with their ratings to understand the competitive landscape before opening a location.
Market sizing. Count businesses by category across cities to estimate the size of a local-services market segment.
Directory building. Aggregate local business data for a city-specific platform or niche vertical directory.
Using the Apify actor
import apify_client
client = apify_client.ApifyClient('YOUR_APIFY_TOKEN')
run_input = {
"searchQuery": "chartered accountants",
"city": "Bangalore",
"maxResults": 100,
}
run = client.actor('themineworks/justdial-business').call(run_input=run_input)
for biz in client.dataset(run['defaultDatasetId']).iterate_items():
print(f"{biz['name']}")
print(f" Phone: {biz.get('phone', 'N/A')}")
print(f" Address: {biz.get('address', 'N/A')}")
print(f" Rating: {biz.get('rating', 'N/A')} ({biz.get('review_count', 0)} reviews)")
print(f" Coords: {biz.get('latitude')}, {biz.get('longitude')}")
Building a lead list for sales outreach
import csv
run_input = {
"searchQuery": "interior designers",
"city": "Hyderabad",
"maxResults": 500,
}
run = client.actor('themineworks/justdial-business').call(run_input=run_input)
results = list(client.dataset(run['defaultDatasetId']).iterate_items())
with open('hyderabad_interior_designers.csv', 'w', newline='') as f:
writer = csv.DictWriter(f, fieldnames=['name', 'phone', 'address', 'rating', 'review_count'])
writer.writeheader()
for biz in results:
writer.writerow({
'name': biz.get('name', ''),
'phone': biz.get('phone', ''),
'address': biz.get('address', ''),
'rating': biz.get('rating', ''),
'review_count': biz.get('review_count', 0),
})
print(f"Exported {len(results)} listings")
Rating analysis by area
Understand which part of a city has the best-rated options for a service:
from collections import defaultdict
import statistics
run_input = {
"searchQuery": "restaurants",
"city": "Mumbai",
"maxResults": 1000,
}
run = client.actor('themineworks/justdial-business').call(run_input=run_input)
results = list(client.dataset(run['defaultDatasetId']).iterate_items())
by_area = defaultdict(list)
for biz in results:
if biz.get('area') and biz.get('rating'):
try:
by_area[biz['area']].append(float(biz['rating']))
except ValueError:
pass
ranked = sorted(
[(area, statistics.mean(ratings), len(ratings)) for area, ratings in by_area.items() if len(ratings) >= 5],
key=lambda x: -x[1]
)
print("Top areas by average restaurant rating in Mumbai:")
for area, avg, count in ranked[:10]:
print(f" {area}: {avg:.2f} ({count} restaurants)")
Mapping listings with geo-coordinates
# Build a GeoJSON file for mapping in any tool
import json
features = []
for biz in results:
lat = biz.get('latitude')
lon = biz.get('longitude')
if lat and lon:
features.append({
"type": "Feature",
"geometry": {"type": "Point", "coordinates": [float(lon), float(lat)]},
"properties": {
"name": biz.get('name'),
"phone": biz.get('phone'),
"rating": biz.get('rating'),
}
})
with open('listings.geojson', 'w') as f:
json.dump({"type": "FeatureCollection", "features": features}, f)
print(f"Mapped {len(features)} locations")
Pricing
Pay per listing returned. No charge on empty searches or failed runs.
Explore the scraper referenced in this article — see inputs, outputs, and pricing, then run it on Apify.
Frequently asked questions
Does JustDial have a public API? +
No. JustDial does not offer a public API for business listings. All programmatic access requires scraping the site.
What data does the JustDial scraper return? +
Business name, phone number, full address, area, city, category, star rating, review count, and geo-coordinates where available.
Can I filter by city and business type? +
Yes. You specify both the city (e.g. Bangalore, Hyderabad, Chennai) and the search category (e.g. restaurants, plumbers, CA firms). The scraper returns all matching listings.
Airbnb Scraper: Listing Prices, Ratings, and Availability Without the API
Airbnb has no public listings API. Here's how to pull nightly price, rating, superhost status and coordinates from Airbnb search results using Python.
Maps Leads: Verified Email Extraction from Google Maps Business Listings
How to pull B2B leads from Google Maps with MX-verified emails, past the official API's 120-result cap, and pay only for contactable businesses.
Realtor.com Scraper: Property and Agent Data Without the MLS Paywall
Scrape Realtor.com listings in Python — price, beds, baths, county, and the listing agent + brokerage office on every record. No login, no API key.