The Mine Works
← All posts
tutorial June 22, 2026 · 2 min read Updated June 22, 2026

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.

Try the scraper

The actor referenced in this article. Pay only for results delivered.

View the scraper →

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.

Related Actor

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.