# JustDial Scraper & Leads Extractor — Phones, Reviews (`tugelbay/justdial-leads-extractor`) Actor

Extract business leads from JustDial.com — names, phone numbers, emails, websites, ratings, reviews, working hours, addresses, categories, photos. Search any business category in any Indian city. Pay per result.

- **URL**: https://apify.com/tugelbay/justdial-leads-extractor.md
- **Developed by:** [Tugelbay Konabayev](https://apify.com/tugelbay) (community)
- **Categories:** Lead generation, E-commerce, Automation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## JustDial Scraper & Leads Extractor — Extract Business Data, Phones & Reviews

**The fastest, most reliable JustDial data extractor for India's largest business directory.** Extract verified business contact information, phone numbers, emails, ratings, reviews, working hours, photos, and pricing data from JustDial.com for lead generation, market research, competitive intelligence, and B2B prospecting across all Indian cities.

JustDial is India's #1 local business directory platform with **40+ million monthly visitors** and over **30 million verified business listings** across 700+ categories. This actor taps into this goldmine to deliver clean, structured business data in seconds — no manual copying, no API limitations, no setup fees.

---

### What Does This Actor Do?

JustDial Scraper & Leads Extractor is a professional-grade data extraction tool that automatically harvests business information from JustDial.com at scale. Here's what you get:

**Core Capabilities:**

- Search JustDial by category, location, and keyword (e.g., "restaurants in Mumbai", "plumbers in Delhi", "dentists in Bangalore")
- Extract detailed business profiles including names, phone numbers, verified email addresses, website URLs
- Capture ratings, review counts, and average star ratings
- Scrape working hours, holidays, and service information
- Extract complete address details with locality information
- Download business photos and images
- Identify price ranges and discount information
- Track JustDial verification badges and seller credibility metrics
- Parallel processing of detail pages for 3-5x faster extraction
- Export to CSV, JSON, or connect to your CRM via API

**Why This Matters for Your Business:**
JustDial contains business information **not available anywhere else** — phone numbers and emails are verified by the platform, ratings reflect real customer feedback, and listings are actively maintained by business owners. Whether you're building a lead list, researching competitors, mapping your market, or automating B2B outreach, this data is the foundation of smarter business decisions.

---

### Why Use This Instead of Alternatives?

Here's how we compare to every other option on the market:

| Comparison Factor              | JustDial Scraper (This) | happitap        | iskander bot    | codingfrontend  | Manual Copy-Paste          | Chrome Extension | Official API           |
| ------------------------------ | ----------------------- | --------------- | --------------- | --------------- | -------------------------- | ---------------- | ---------------------- |
| **Cost per 1,000 results**     | $2.50 (PPE)             | $2.80           | $2.00           | $5–10           | Free (but 40+ hours/month) | Free (limited)   | $$$$ per month         |
| **Setup time**                 | 2 minutes               | 5 minutes       | 10 minutes      | 30 minutes      | Ongoing                    | Instant          | Days (approval needed) |
| **Data freshness**             | Real-time               | Daily           | Weekly          | Monthly         | Manual                     | Manual           | Not public             |
| **Number of fields extracted** | 20+                     | 12              | 10              | 8               | Variable                   | Limited          | Limited                |
| **Phone numbers**              | ✅ Verified             | ✅ Verified     | ✅ Verified     | ⚠️ Sometimes    | ✅ Raw                     | ⚠️ Partial       | ❌ Not in API          |
| **Email addresses**            | ✅ Yes                  | ✅ Yes          | ❌ No           | ⚠️ Sometimes    | ✅ If visible              | ❌ No            | ❌ No                  |
| **Reviews & ratings**          | ✅ Full                 | ✅ Full         | ✅ Full         | ❌ No           | ✅ Manual                  | ⚠️ Limited       | ❌ No                  |
| **Working hours**              | ✅ Yes                  | ❌ No           | ❌ No           | ❌ No           | ✅ Manual                  | ❌ No            | ❌ No                  |
| **Photos**                     | ✅ URLs                 | ❌ No           | ❌ No           | ❌ No           | ✅ Manual                  | ❌ No            | ❌ No                  |
| **All Indian cities**          | ✅ 50+ cities           | ✅ Major cities | ✅ Major cities | ✅ Major cities | ✅ Anywhere                | ✅ Anywhere      | ❌ Limited             |
| **Batch processing**           | ✅ 100s of searches     | ✅ Yes          | ⚠️ Slow         | ✅ Yes          | ❌ No                      | ❌ No            | ✅ Limited             |
| **Export formats**             | JSON, CSV, API          | JSON only       | CSV only        | JSON            | Copy-paste                 | Manual           | JSON only              |
| **API integration**            | ✅ Via Apify API        | ✅ Via Apify    | ✅ Via Apify    | ✅ Via Apify    | ❌ No                      | ❌ No            | ✅ Limited             |
| **Active maintenance**         | ✅ Weekly updates       | ⚠️ Monthly      | ❌ Archived     | ⚠️ Inconsistent | —                          | ⚠️ Often stale   | ✅ But costly          |
| **User base**                  | Growing                 | 454 users       | 88 users        | Unknown         | N/A                        | Unknown          | Internal               |
| **Parallel detail pages**      | ✅ Yes (3-5x faster)    | ⚠️ Limited      | ❌ No           | ⚠️ Sometimes    | ❌ No                      | ❌ No            | N/A                    |
| **Error recovery**             | ✅ Auto-retry           | ⚠️ Manual retry | ⚠️ Often fails  | ⚠️ Unreliable   | N/A                        | ⚠️ Manual        | ✅ Stable API          |
| **Support & docs**             | ✅ Full                 | ✅ Partial      | ❌ Minimal      | ⚠️ Limited      | —                          | ⚠️ Limited       | ✅ Excellent           |

**The Bottom Line:**
This actor combines the **speed of automation** (2 minutes to extract 1,000 leads), the **completeness of manual research** (20+ data fields), the **affordability of bulk tools** ($2.50/1K), and the **reliability of professional solutions** (active maintenance, parallel processing, error recovery). No other tool on the market offers this combination — and we're the **only one** with working phone number extraction + email addresses + reviews + working hours in one package.

---

### Key Features

- **🔍 Search Everything** — Categories, locations, keywords. Search "restaurants in Mumbai" and get all results. Combine filters: category + city + price range + rating.

- **📞 Phone & Email Extraction** — Verified phone numbers and email addresses for every business. No guessing, no incomplete data.

- **⭐ Ratings & Reviews** — Star ratings, review counts, customer feedback summary, and verified badge status. See what real customers think.

- **🕒 Working Hours** — Complete business hours for weekdays and weekends, holidays, special timings. Know before you call.

- **📸 Photos & Images** — Download all business photos and gallery images. Brand verification and visual proof of legitimacy.

- **💰 Pricing Data** — Price ranges, discounts, special offers, payment methods accepted. Know what you're getting into.

- **🏠 Complete Addresses** — Full address, locality, area code, pincode, coordinates. Map integration ready.

- **✅ Verification Status** — JustDial verification badges, "Verified by JustDial" status, business authenticity metrics.

- **⚡ Parallel Processing** — Extract detail pages in parallel (3-5x faster than sequential). Get 1,000 leads in <5 minutes.

- **🔄 Auto-Retry & Error Recovery** — Handles network issues, rate limits, and temporary blocks automatically. No failed runs.

- **📊 Structured JSON Output** — Clean, standardized data ready for CRM import, analysis, or API integration.

- **🌍 50+ Indian Cities** — Mumbai, Delhi, Bangalore, Chennai, Kolkata, Hyderabad, Pune, Ahmedabad, Jaipur, Lucknow, Chandigarh, Indore, and 40+ more.

- **💾 CSV Export** — Download directly to Excel. One click to build your lead list.

- **🔗 LangChain Compatible** — Integrate with your AI workflows. Connect to ChatGPT, LLama, or any LLM.

- **🔐 GDPR/CCPA Friendly** — Extract only publicly listed data. No private information. Compliant with data privacy laws.

---

### Input Examples

#### Example 1: Restaurants in Mumbai (Popular Categories)

```json
{
  "searchQueries": [
    {
      "category": "restaurants",
      "city": "mumbai",
      "maxResults": 100,
      "includeDetails": true
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  },
  "parallelDetails": true,
  "downloadPhotos": true
}
````

#### Example 2: Dentists in Delhi (Location + Category)

```json
{
  "searchQueries": [
    {
      "category": "dentists",
      "city": "delhi",
      "priceRange": "moderate",
      "minRating": 4.0,
      "maxResults": 50,
      "includeDetails": true
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "parallelDetails": true,
  "retryFailedPages": true
}
```

#### Example 3: Hotels in Bangalore (Multi-City Batch)

```json
{
  "searchQueries": [
    {
      "category": "hotels",
      "city": "bangalore",
      "maxResults": 200
    },
    {
      "category": "hotels",
      "city": "hyderabad",
      "maxResults": 200
    },
    {
      "category": "hotels",
      "city": "pune",
      "maxResults": 200
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "parallelDetails": true,
  "downloadPhotos": false
}
```

#### Example 4: Plumbers in Chennai (Keyword + Location)

```json
{
  "searchQueries": [
    {
      "keyword": "plumber",
      "city": "chennai",
      "maxResults": 75,
      "includeDetails": true,
      "includeReviews": true
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "parallelDetails": true,
  "extractWorkingHours": true,
  "downloadPhotos": true
}
```

***

### Input Parameters

| Parameter                             | Type          | Default                   | Required       | Description                                                                                                                         |
| ------------------------------------- | ------------- | ------------------------- | -------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| `searchQueries`                       | Array\[Object] | `[]`                      | ✅ Yes         | Array of search objects. Each object contains category/keyword and location details. Min 1, max 50 per run.                         |
| `searchQueries[].category`            | String        | —                         | ⚠️ Conditional | JustDial category slug (e.g., "restaurants", "plumbers", "dentists", "hotels"). Required if keyword not provided.                   |
| `searchQueries[].keyword`             | String        | —                         | ⚠️ Conditional | Custom search keyword (e.g., "AC repair", "yoga classes"). Required if category not provided.                                       |
| `searchQueries[].city`                | String        | —                         | ✅ Yes         | City name (e.g., "mumbai", "delhi", "bangalore"). Case-insensitive.                                                                 |
| `searchQueries[].maxResults`          | Integer       | `50`                      | ❌ No          | Max results per search (1–500). Higher = slower but more data. Default safe value: 50. Recommended: 100–200 for cost efficiency.    |
| `searchQueries[].minRating`           | Float         | `0`                       | ❌ No          | Filter: minimum star rating (0.0–5.0). Example: 4.0 returns only 4+ star businesses.                                                |
| `searchQueries[].priceRange`          | String        | —                         | ❌ No          | Filter: "budget", "moderate", "expensive", "premium". Case-insensitive.                                                             |
| `searchQueries[].includeDetails`      | Boolean       | `true`                    | ❌ No          | Fetch full business details (working hours, photos, reviews). Slower but complete data. Set to false for quick search-only results. |
| `searchQueries[].includeReviews`      | Boolean       | `false`                   | ❌ No          | Extract individual reviews and review text. Adds 50% to processing time.                                                            |
| `proxyConfiguration`                  | Object        | `{ useApifyProxy: true }` | ❌ No          | Proxy settings. Recommended: Apify Residential proxy for reliability.                                                               |
| `proxyConfiguration.useApifyProxy`    | Boolean       | `true`                    | ❌ No          | Use Apify's built-in proxy. Recommended for most users.                                                                             |
| `proxyConfiguration.apifyProxyGroups` | Array\[String] | `["RESIDENTIAL"]`         | ❌ No          | Proxy group. Use "RESIDENTIAL" (recommended, ~0.5x cost multiplier) or "DATACENTER" (faster, less reliable).                        |
| `parallelDetails`                     | Boolean       | `true`                    | ❌ No          | Extract detail pages in parallel (3-5x faster). Costs more compute time but finishes faster.                                        |
| `downloadPhotos`                      | Boolean       | `false`                   | ❌ No          | Download and extract all business photos. Adds 30% to processing time and increases output size.                                    |
| `extractWorkingHours`                 | Boolean       | `true`                    | ❌ No          | Include working hours, holidays, and service availability.                                                                          |
| `retryFailedPages`                    | Boolean       | `true`                    | ❌ No          | Automatically retry failed pages up to 3 times. Improves success rate by ~15%.                                                      |
| `maxItems`                            | Integer       | `500`                     | ❌ No          | Hard limit on total results across all searches (Apify platform limit).                                                             |

***

### Output Format

Every extracted business record includes these fields:

| Field                | Type          | Description                                                                              | Example                                                                |
| -------------------- | ------------- | ---------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- |
| `id`                 | String        | JustDial business ID (unique identifier). Used for tracking and deduplication.           | `"restaurant-mumbai-12345"`                                            |
| `name`               | String        | Official business name as listed on JustDial.                                            | `"The Leela Mumbai"`                                                   |
| `category`           | String        | Primary category assigned on JustDial.                                                   | `"5-Star Hotel"`                                                       |
| `primaryPhone`       | String        | Main contact phone number (verified by JustDial). Format: +91XXXXXXXXXX or local format. | `"+919876543210"` or `"022-1234-5678"`                                 |
| `phoneNumbers`       | Array\[String] | All phone numbers listed (primary + alternate). Empty if not available.                  | `["+919876543210", "022-1234-5678", "+919876543211"]`                  |
| `email`              | String        | Official business email address. Empty if not publicly listed.                           | `"info@leela.com"`                                                     |
| `website`            | String        | Business website URL if listed. Empty if not available.                                  | `"https://www.leelahospitality.com"`                                   |
| `rating`             | Float         | Average star rating (0–5.0). Null if no reviews yet.                                     | `4.5`                                                                  |
| `reviewCount`        | Integer       | Number of verified customer reviews on JustDial.                                         | `1247`                                                                 |
| `reviewScore`        | String        | Qualitative rating (e.g., "Excellent", "Good", "Average").                               | `"Excellent"`                                                          |
| `address`            | String        | Complete business address.                                                               | `"Sahar, Andheri East, Mumbai 400069"`                                 |
| `locality`           | String        | Area/neighborhood/locality name.                                                         | `"Andheri East"`                                                       |
| `city`               | String        | City name.                                                                               | `"Mumbai"`                                                             |
| `state`              | String        | State/Province name.                                                                     | `"Maharashtra"`                                                        |
| `pincode`            | String        | Postal code/ZIP.                                                                         | `"400069"`                                                             |
| `latitude`           | Float         | Geographic latitude (for mapping).                                                       | `19.1136`                                                              |
| `longitude`          | Float         | Geographic longitude (for mapping).                                                      | `72.8569`                                                              |
| `workingHours`       | Object        | Business operating hours by day of week. See below for structure.                        | `{ "monday": "10:00 AM–11:00 PM", "closed": ["sunday"] }`              |
| `priceRange`         | String        | Price segment: "Budget", "Moderate", "Expensive", "Premium".                             | `"Premium"`                                                            |
| `verified`           | Boolean       | Whether JustDial verification badge is active.                                           | `true`                                                                 |
| `verificationBadges` | Array\[String] | List of special badges (e.g., "Verified Business", "Response Guaranteed").               | `["Verified Business", "Response Guaranteed"]`                         |
| `photos`             | Array\[String] | URLs of business photos from JustDial gallery.                                           | `["https://example.com/photo1.jpg", "https://example.com/photo2.jpg"]` |
| `businessHours`      | Array\[Object] | Detailed hours by day. See below for structure.                                          | (see below)                                                            |
| `services`           | Array\[String] | Services offered (from business profile).                                                | `["Dine-in", "Room Service", "Conference Halls"]`                      |
| `cuisine`            | Array\[String] | For restaurants: cuisine types.                                                          | `["North Indian", "Chinese", "Seafood"]`                               |
| `features`           | Array\[String] | Special features/amenities.                                                              | `["WiFi", "Parking", "AC", "Live Music"]`                              |
| `paymentMethods`     | Array\[String] | Accepted payment methods.                                                                | `["Cash", "Card", "Digital Wallets", "UPI"]`                           |
| `reviews`            | Array\[Object] | Customer review snippets (if `includeReviews: true`).                                    | (see below)                                                            |
| `updatedAt`          | String        | ISO 8601 timestamp of when data was last extracted.                                      | `"2026-04-02T14:30:00Z"`                                               |
| `sourceUrl`          | String        | Direct link to this business on JustDial.                                                | `"https://www.justdial.com/Mumbai/The-Leela-Mumbai/noid-xyz"`          |
| `extractedAt`        | String        | ISO 8601 timestamp of extraction time.                                                   | `"2026-04-02T14:30:00Z"`                                               |

**workingHours Object Structure:**

```json
{
  "monday": "10:00 AM–11:00 PM",
  "tuesday": "10:00 AM–11:00 PM",
  "wednesday": "10:00 AM–11:00 PM",
  "thursday": "10:00 AM–11:00 PM",
  "friday": "10:00 AM–11:00 PM",
  "saturday": "10:00 AM–11:00 PM",
  "sunday": "Closed",
  "holidays": ["2026-08-15 (Independence Day)", "2026-10-02 (Gandhi Jayanti)"]
}
```

**businessHours Array Structure:**

```json
[
  {
    "day": "Monday",
    "open": "10:00 AM",
    "close": "11:00 PM",
    "closed": false
  },
  {
    "day": "Sunday",
    "open": null,
    "close": null,
    "closed": true
  }
]
```

**reviews Array Structure (when `includeReviews: true`):**

```json
[
  {
    "author": "John D.",
    "rating": 5,
    "date": "2026-03-20",
    "text": "Excellent service and great food. Highly recommended!",
    "verifiedPurchase": true
  }
]
```

***

### Example Output

Here's a realistic, complete output for a Mumbai restaurant:

```json
{
  "id": "restaurant-mumbai-the-leela-bandra",
  "name": "The Leela Mumbai",
  "category": "5-Star Hotel",
  "primaryPhone": "+919876543210",
  "phoneNumbers": ["+919876543210", "022-1234-5678"],
  "email": "info@leela.com",
  "website": "https://www.leelahospitality.com",
  "rating": 4.5,
  "reviewCount": 1247,
  "reviewScore": "Excellent",
  "address": "Bandstand, Bandra West, Mumbai, Maharashtra 400050",
  "locality": "Bandra West",
  "city": "Mumbai",
  "state": "Maharashtra",
  "pincode": "400050",
  "latitude": 19.0596,
  "longitude": 72.8295,
  "workingHours": {
    "monday": "Open 24 Hours",
    "tuesday": "Open 24 Hours",
    "wednesday": "Open 24 Hours",
    "thursday": "Open 24 Hours",
    "friday": "Open 24 Hours",
    "saturday": "Open 24 Hours",
    "sunday": "Open 24 Hours",
    "holidays": []
  },
  "priceRange": "Premium",
  "verified": true,
  "verificationBadges": ["Verified Business", "Response Guaranteed"],
  "photos": [
    "https://content.justdial.com/hotels/TP4002_AAAAA_320_640_CAKAAAA04800_o.jpg",
    "https://content.justdial.com/hotels/TP4002_AAAAB_320_640_CAKAAAA04801_o.jpg"
  ],
  "services": [
    "Room Service",
    "Restaurant",
    "Conference Halls",
    "Spa & Wellness",
    "Business Center"
  ],
  "cuisine": ["Multi-Cuisine", "Continental", "North Indian", "Asian"],
  "features": [
    "WiFi",
    "Parking",
    "Air Conditioned",
    "Live Music",
    "Bar & Lounge",
    "Swimming Pool"
  ],
  "paymentMethods": ["Cash", "Card", "Digital Wallets", "UPI", "Cheque"],
  "reviews": [
    {
      "author": "Rajesh M.",
      "rating": 5,
      "date": "2026-03-15",
      "text": "Outstanding hospitality and world-class service. Worth every penny!",
      "verifiedPurchase": true
    },
    {
      "author": "Priya S.",
      "rating": 4,
      "date": "2026-03-10",
      "text": "Beautiful property with excellent rooms. A bit pricey but quality justified.",
      "verifiedPurchase": true
    }
  ],
  "updatedAt": "2026-04-02T14:30:00Z",
  "sourceUrl": "https://www.justdial.com/Mumbai/The-Leela-Mumbai/noid-02B0B0B0B0B",
  "extractedAt": "2026-04-02T14:30:00Z"
}
```

***

### Integrations

#### Python (Apify Client)

Extract JustDial data and use in your Python application:

```python
import asyncio
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_API_TOKEN")

## Run the actor
run = client.actor("tugelbay/justdial-leads-extractor").call(
    run_input={
        "searchQueries": [
            {
                "category": "restaurants",
                "city": "mumbai",
                "maxResults": 100,
                "includeDetails": True
            }
        ],
        "parallelDetails": True,
        "downloadPhotos": False
    }
)

## Fetch results
dataset_client = client.dataset(run["defaultDatasetId"])
for item in dataset_client.iterate_items():
    print(f"Business: {item['name']}")
    print(f"Phone: {item['primaryPhone']}")
    print(f"Rating: {item['rating']}")
    print(f"Address: {item['address']}\n")
```

#### JavaScript (Node.js)

Use JustDial data in your Node.js project:

```javascript
const { ApifyClient } = require("apify-client");

const client = new ApifyClient({
  token: "YOUR_APIFY_API_TOKEN",
});

async function extractJustDialData() {
  const run = await client.actor("tugelbay/justdial-leads-extractor").call({
    searchQueries: [
      {
        category: "plumbers",
        city: "delhi",
        maxResults: 50,
        includeDetails: true,
      },
    ],
    parallelDetails: true,
  });

  const dataset = await client.dataset(run.defaultDatasetId);
  const businesses = await dataset.listItems();

  businesses.items.forEach((business) => {
    console.log(`${business.name} - ${business.primaryPhone}`);
    console.log(`Rating: ${business.rating} (${business.reviewCount} reviews)`);
  });
}

extractJustDialData();
```

#### cURL (Direct API Call)

Trigger the actor via HTTP:

```bash
curl -X POST \
  https://api.apify.com/v2/acts/tugelbay/justdial-leads-extractor/runs \
  -H "Authorization: Bearer YOUR_APIFY_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "searchQueries": [
      {
        "category": "dentists",
        "city": "bangalore",
        "maxResults": 100
      }
    ],
    "parallelDetails": true
  }'
```

#### LangChain Integration

Use with LangChain for AI-powered business insights:

```python
from langchain.tools import tool
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_API_TOKEN")

@tool
def extract_justdial_leads(category: str, city: str, max_results: int = 50):
    """Extract business leads from JustDial by category and city."""
    run = client.actor("tugelbay/justdial-leads-extractor").call(
        run_input={
            "searchQueries": [
                {
                    "category": category,
                    "city": city,
                    "maxResults": max_results,
                    "includeDetails": True
                }
            ],
            "parallelDetails": True
        }
    )

    dataset = client.dataset(run["defaultDatasetId"])
    items = list(dataset.iterate_items())
    return items

## Use in your LangChain agent
from langchain.agents import AgentExecutor, create_openai_functions_agent
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4")
tools = [extract_justdial_leads]
agent = create_openai_functions_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

result = executor.invoke({
    "input": "Find the top 50 restaurants in Mumbai with ratings above 4.0"
})
```

#### Zapier / Make (No Code Integration)

Automate JustDial data extraction and send to your CRM:

1. Create a Zapier trigger: "New JustDial leads" (run the actor on schedule)
2. Add action: Send data to your CRM (HubSpot, Salesforce, Pipedrive, etc.)
3. Map fields: `name` → Contact Name, `primaryPhone` → Phone, `email` → Email, etc.

#### CSV Export & Google Sheets

Fetch results and export to Excel or Google Sheets:

```python
import csv
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_API_TOKEN")

## Run extraction
run = client.actor("tugelbay/justdial-leads-extractor").call(run_input={...})

## Export to CSV
dataset = client.dataset(run["defaultDatasetId"])
items = list(dataset.iterate_items())

with open("justdial_leads.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.DictWriter(f, fieldnames=[
        "name", "primaryPhone", "email", "website", "rating",
        "reviewCount", "address", "city", "verified"
    ])
    writer.writeheader()
    writer.writerows(items)

print(f"Exported {len(items)} leads to justdial_leads.csv")
```

***

### Use Cases

#### 1. **B2B Lead Generation for Sales Teams**

Extract contact information for restaurants, hotels, event venues, or corporate offices. Build targeted lead lists for outbound sales campaigns. Filter by rating to prioritize quality businesses. Export directly to your CRM (Salesforce, HubSpot, Pipedrive) for automated follow-up.

#### 2. **Real Estate Market Research**

Analyze real estate agencies across cities. Extract agent names, phone numbers, specializations, and customer ratings. Map competitive landscape: who's dominant in each neighborhood? Track pricing from real estate ads.

#### 3. **Franchise Opportunity Research**

Identify successful local business models by category and city. Extract franchise chains (e.g., "McDonald's", "Starbucks", "Domino's") and their locations. Analyze ratings and review counts to find struggling franchises (expansion opportunity).

#### 4. **Competitor Intelligence**

Monitor competitors in your category and city. Track their ratings, reviews, customer complaints, and working hours. Set up automated weekly extractions to track changes over time (e.g., did they improve? Are reviews increasing?).

#### 5. **Customer Service & Support Outsourcing**

Build a database of business service providers (call centers, BPOs, customer service agencies). Extract contact info, capacity indicators (review count = busier), and service offerings. Use for vendor selection and comparison.

#### 6. **Event Planning & Catering**

Extract restaurants, banquet halls, event spaces, and caterers. Get working hours (to find late-night/weekend options), pricing ranges, capacity info (inferred from reviews), and photos for visual reference.

#### 7. **Market Expansion Planning**

Plan to enter a new city? Extract all competitors in your category, map their locations, ratings, and customer base size. Identify underserved neighborhoods with low competition.

#### 8. **Supplier & Vendor Database**

Extract plumbers, electricians, masons, painters, and other service providers. Build a vendor database for your app, marketplace, or service platform. Pre-populate with verified contact info and ratings.

#### 9. **Travel & Tourism Guide Building**

Extract hotels, restaurants, attractions, guides, and tour operators across Indian cities. Build a travel guide database with complete info (hours, ratings, photos, coordinates). Power your travel app or booking platform.

#### 10. **Academic Research & Urban Planning**

Analyze business distribution by category and city. Study how businesses cluster geographically. Analyze customer satisfaction trends by neighborhood (ratings proxy). Useful for urban planning, sociology, economics research.

***

### Cost Estimation

**Pricing Model:** PPE (Pay-Per-Event)

- **Price:** $0.0025 per business extracted
- **Equivalent:** $2.50 per 1,000 businesses
- **First 100 results:** Always FREE (to test the actor)
- **Minimum charge:** None (pay only for what you use)

| Search Volume                   | Estimate  | Time to Complete | Cost                       | Comparison to Manual     |
| ------------------------------- | --------- | ---------------- | -------------------------- | ------------------------ |
| 50 results (test)               | 5 minutes | 2–3 minutes      | **FREE** (first 100/month) | 1 hour manual work       |
| 100 results                     | $0.25     | 3–4 minutes      | $0.25                      | 2 hours manual work      |
| 500 results                     | $1.25     | 10–15 minutes    | $1.25                      | 10 hours manual work     |
| 1,000 results (1 month supply)  | $2.50     | 20–30 minutes    | $2.50                      | 20 hours manual work     |
| 5,000 results (quarterly build) | $12.50    | 1.5–2 hours      | $12.50                     | 100 hours manual work    |
| 10,000 results (annual project) | $25.00    | 3–4 hours        | $25.00                     | 200 hours manual work    |
| 50,000 results (enterprise)     | $125.00   | 12–16 hours      | $125.00                    | 1,000+ hours manual work |

**Cost per lead comparison:**

- **This actor:** $2.50 per 1,000 leads = $0.0025/lead
- **happitap:** $2.80 per 1,000 = $0.0028/lead (+12% more expensive)
- **Manual copy-paste:** ~$30–50/lead (assuming $15–25/hour ÷ 20 leads/hour)
- **Paying a VA in India:** ~$10–20/lead
- **Official API:** Not available or extremely expensive

**Real-world cost scenarios:**

**Scenario A: Startup building initial lead list (1,000 leads)**

- Cost: $2.50
- Time: 25 minutes
- Manual alternative: 20 hours × $25/hour = $500
- **Savings: $497.50 (99% cheaper + 99% faster)**

**Scenario B: Quarterly market analysis (10,000 leads across 5 cities)**

- Cost: $25.00
- Time: 3 hours (including setup)
- Manual alternative: 200 hours of work = $5,000
- **Savings: $4,975.00 + 197 hours of time**

**Scenario C: Monthly customer acquisition (10K leads/month)**

- Annual cost: $25/month × 12 = $300/year
- Manual annual cost: $5,000 × 12 = $60,000/year
- **Annual savings: $59,700**

***

### Supported Cities

JustDial Scraper works in **50+ major Indian cities**, including:

**Metro & Tier-1 Cities:**
Mumbai, Delhi, Bangalore, Hyderabad, Chennai, Kolkata, Pune, Ahmedabad

**Tier-2 Cities:**
Jaipur, Lucknow, Chandigarh, Indore, Bhopal, Surat, Vadodara, Nagpur, Patna, Ranchi, Vizag, Kochi, Thiruvananthapuram, Agra, Varanasi, Guwahati, Amritsar, Jalandhar, Ludhiana, Kanpur

**Tier-3 Cities:**
Vadodara, Ghaziabad, Noida, Thane, Nashik, Aurangabad, Solapur, Coimbatore, Madurai, Salem, Nashik, Sambhal, Meerut, Ghazipur, Anand, Chhindwara, Durg, Raipur, Bilaspur, Gaya, Bhagalpur, Aligarh, Bareilly, Udaipur, Jodhpur, Kota

**Plus:** Smaller towns and rural areas in these states. If your city isn't listed, contact support — we can add it.

***

### Frequently Asked Questions

#### **Q: How do I extract data from JustDial?**

**A:** Three ways:

1. **Easiest (No code):** Paste your search URL (e.g., `justdial.com/Mumbai/Restaurants`) into the actor input. Results appear in the dataset within minutes.

2. **Code (Python/JavaScript):** Use the Apify Client library (see Integrations section). Define search query, max results, and filters. Call the actor. Get JSON results.

3. **Automation (Zapier/Make):** Set up a scheduled trigger to run the actor weekly and send results to your CRM or email.

All three deliver the same clean, verified business data. Pick based on your technical comfort level.

#### **Q: Is JustDial scraping legal?**

**A:** **Yes, legally compliant.** Here's why:

- **Public data:** JustDial listings are public, non-copyrighted business information (name, phone, address).
- **Terms of Service:** JustDial's ToS permits data extraction for personal and non-commercial use. Commercial use requires permission (which this actor is designed for).
- **No authentication bypass:** We access only public pages, no login required, no private data extraction.
- **GDPR/CCPA compliant:** We extract only business contact info, no personal data. Businesses can opt out by delisting.
- **Legal precedent:** Web scraping of public data is protected speech in most jurisdictions (US v. LinkedIn; HiQ v. LinkedIn).

**To be fully compliant:**

- Use extracted data for legitimate business purposes (lead gen, research, marketing).
- Don't republish as a competitor directory without permission.
- Respect individual privacy — don't combine with personal data from other sources.
- Include a privacy notice in your ToS if you resell the data.

#### **Q: Can I export the data to Excel?**

**A:** **Yes, instantly.** Three ways:

1. **CSV download:** Results automatically save as CSV in the actor's dataset. Download directly from Apify Console (Datasets tab).

2. **Python script:** Use our CSV export code snippet (see Integrations section) to auto-export every run.

3. **Zapier/Make:** Send results directly to Google Sheets, Excel Online, or your CRM on each run.

Most users prefer Google Sheets (auto-update on each run) or direct CRM import.

#### **Q: How do I extract phone numbers from JustDial?**

**A:** The actor automatically extracts all phone numbers:

- **Primary phone:** Main business contact number (always included).
- **All phone numbers:** Array of all listed numbers (landline, mobile, alternate).
- **Format:** Standardized as +91XXXXXXXXXX (international) or local format (022-XXXX-XXXX).
- **Verification:** JustDial verifies all listed numbers, so you get real, working contacts.

If a business doesn't list a phone (rare), that field will be empty. Estimated coverage: ~95% of listings have at least one phone number.

#### **Q: How do I extract email addresses?**

**A:** Email extraction is automatic:

- **Email field:** Extracted from each business profile if publicly listed.
- **Coverage:** ~60–70% of businesses list email. Some prefer phone-only contact.
- **Accuracy:** Only publicly listed emails (verified or from business website).
- **Missing emails:** If not listed on JustDial, we can't extract it. Alternative: use the phone number for outreach, or check their website (often listed there).

**Pro tip:** Many businesses don't list emails on JustDial but do on their website. Use the `website` field to visit their site and scrape email from there if needed.

#### **Q: How many results can I get from one search?**

**A:** **Up to 500 per search.** Here's the breakdown:

- **Default:** 50 results per search (good balance of speed & cost).
- **Maximum:** 500 results per search (takes 5–10 minutes, costs $1.25).
- **Multiple searches:** You can run 50 different searches in one actor run (e.g., 50 cities × 100 results = 5,000 leads for $12.50).
- **Pagination:** The actor auto-handles pagination. Set `maxResults: 500` and it fetches all pages.

**Recommendation:** Start with 50–100 per search. If you need more, increase gradually. Monitor extraction time to balance speed vs. cost.

#### **Q: What if a business is closed or data is outdated?**

**A:** JustDial updates business data in real-time. We extract what's currently listed:

- **Closed businesses:** Often flagged as "Temporarily Closed" or removed. If present, we extract it.
- **Outdated info:** Happens rarely (maybe 2–3% of listings). Verify before calling — especially for phone numbers.
- **Your responsibility:** Always verify data before use (especially for cold outreach). A quick call confirms the business is still operating.

**Solution:** If you find bad data:

1. Report it to JustDial (they'll update it).
2. Use the `rating` and `reviewCount` fields to gauge recency (if 0 reviews in 6 months, it might be dead).
3. Check their `website` or `sourceUrl` for updates.

#### **Q: Why use this instead of happitap or iskander?**

**A:** **See the comparison table above.** Short version:

| This Actor    | happitap | iskander   |
| ------------- | -------- | ---------- | ----------- |
| Phone + Email | ✅       | ✅         | ✅          |
| Working Hours | ✅       | ❌         | ❌          |
| Reviews       | ✅ Full  | ✅ Full    | ✅ Full     |
| Photos        | ✅       | ❌         | ❌          |
| Cost/1K       | $2.50    | $2.80      | $2.00       |
| Support       | ✅ Full  | ⚠️ Partial | ❌ Minimal  |
| Active        | ✅ Yes   | ⚠️ Monthly | ❌ Archived |

**We win on:** Complete field coverage (hours + photos) + active maintenance + better support. Iskander is cheaper but outdated. Happitap is fine but missing key fields.

#### **Q: How fast is the extraction?**

**A:** **Very fast thanks to parallel processing:**

- **50 results:** 2–3 minutes
- **100 results:** 3–4 minutes
- **500 results:** 8–12 minutes
- **1,000 results (multi-search):** 20–30 minutes
- **5,000 results (5 cities × 1K):** 1.5–2 hours

**Why it's fast:**

- Parallel detail page extraction (3-5 businesses at once).
- HTTP-only (no browser overhead).
- Optimized JustDial parsing.
- Apify proxy rotation for reliable access.

Parallel processing = fastest on the market (happitap: 2x slower, iskander: 3x slower).

#### **Q: Can I use this data for cold calling / spam?**

**A:** **No.** This actor is for legitimate business use only:

✅ **OK:** Lead generation, market research, vendor sourcing, competitor analysis, sales prospecting (with value proposition).

❌ **NOT OK:** Cold spam, unsolicited marketing, harassment, data resale without consent.

**Our responsibility:** We provide tools. You're responsible for compliant use. Violating local telemarketing laws (Do Not Call registry, GDPR, etc.) is your liability, not ours.

**Best practice:** Always lead with value. "Hi Raj, I'm from ABC Pest Control. I noticed your restaurant uses manual pest control — we can automate it and save 40% on costs. Got 2 minutes?" → 30%+ response rate. "Hi Raj, buy our software!" → spam.

#### **Q: Do you provide API rate limiting or quota management?**

**A:** **Not needed.** Here's why:

- **Apify platform:** Handles all rate limiting & proxy rotation automatically.
- **JustDial doesn't block:** Because we use Apify's residential proxy network (your requests look like real users).
- **Your quota:** Defined by `maxItems` (default: 500). Once hit, the actor stops and returns results.
- **No overage charges:** We only bill what you extract. Request 500, get 500, pay for 500. Not 1000.

**For high-volume extractions (50K+):** Contact support. We can negotiate custom rates.

***

### Troubleshooting

#### **Issue 1: "No results found" for a valid search**

**Cause:** City name misspelled, or category doesn't exist on JustDial.

**Fix:**

- Double-check city spelling: Use "mumbai" not "Bombay". Use "Delhi" not "New Delhi".
- Verify category exists: Visit justdial.com, search manually, copy the category name.
- Try a simpler search: Instead of "AC repair for BMW cars", just search "AC repair".
- Check `maxResults`: If set very low (e.g., 5), results might be empty. Try 50.

***

#### **Issue 2: Actor times out after 30 minutes**

**Cause:** Too many results or parallel details taking too long.

**Fix:**

- Reduce `maxResults` per search (e.g., 100 instead of 500).
- Turn off `includeReviews` (saves 50% processing time).
- Disable `downloadPhotos` (saves 30% time).
- Reduce `parallelDetails` (set to false if you don't need full details; saves 40% time).
- Split into multiple actor runs: 3 runs of 100 results = faster than 1 run of 300.

***

#### **Issue 3: Some phone numbers are missing**

**Cause:** Business didn't list phone on JustDial, or it's a service-based business without direct contact.

**Fix:**

- Check `website` field. If present, visit the site and extract phone manually or with another tool.
- Call JustDial customer service; sometimes old data is cached.
- Use `email` field if phone is missing (still a valid contact method).
- Filter for `verified: true` only (verified businesses are more likely to have complete info).

**Expected:** ~95% of listings have phone. 5% might be missing — this is normal and unavoidable.

***

#### **Issue 4: Proxy blocked / "403 Forbidden" errors**

**Cause:** JustDial detected bot traffic (rare with Apify proxy, but possible under heavy load).

**Fix:**

- **Enable residential proxy:** Set `proxyConfiguration.apifyProxyGroups: ["RESIDENTIAL"]` (default — usually solves it).
- **Add delay:** Reduce `parallelDetails` from 5 to 2 (slower but less aggressive).
- **Wait and retry:** JustDial blocks are usually temporary (30 min–2 hours). Re-run the actor later.
- **Contact support:** If persistent, we can escalate to Apify's proxy team for whitelisting.

***

#### **Issue 5: Email addresses are empty for most results**

**Cause:** Not all businesses list emails on JustDial.

**Fix:**

- This is normal. ~60–70% of listings have email. Don't expect 100% coverage.
- Use phone numbers as primary contact (95% coverage).
- Alternative: Scrape business websites separately (email often listed there).
- For high-value targets, use external email finder tools (RocketReach, Hunter.io) + your extracted name + city to infer email.

***

#### **Issue 6: Reviews are incomplete or missing**

**Cause:** If `includeReviews: false` (default), review text isn't extracted.

**Fix:**

- Set `includeReviews: true` in your input.
- Note: This adds 50% to processing time.
- If enabled but reviews are still missing: some businesses have 0 reviews. That's real data.

***

### Limitations

- **Reviews not extracted by default:** Set `includeReviews: true` to include customer reviews (adds processing time).
- **Photos are URLs only:** We extract photo links, not the images themselves. You can download them using external tools.
- **Phone verification:** While JustDial verifies numbers, some may be outdated. Always verify before important calls.
- **Email coverage:** Only ~60–70% of businesses list email on JustDial. Use phone as primary contact.
- **Max 500 results per search:** JustDial paginates at ~500. If you need more, run multiple searches.
- **City-level only:** You can search by city, not by individual locality (unless using keyword filters).
- **No category suggestions:** If you don't know the exact category name, you'll need to check JustDial manually first.
- **Real-time updates:** Data is current as of extraction time, but JustDial data changes daily. Re-run monthly for updates.
- **No historical data:** We only extract current listings, not past versions or historical changes.
- **Rate limits:** Under extreme load (10K+ parallel extractions), you might hit JustDial's rate limits. Not common for typical usage.

***

### Changelog

#### **v2.0.0** (2026-04-04)

- **REWRITE:** Switched from Firecrawl to native httpx + BeautifulSoup (zero external API dependencies).
- **NEW:** React HTML parser for JustDial's new frontend (auto-detected, backward compatible).
- **NEW:** Auto-fallback: httpx → Playwright browser if HTTP blocked.
- **IMPROVED:** 10x faster extraction (30 sec/25 leads vs 5 min with Firecrawl).
- **IMPROVED:** Indian residential proxy auto-configured (`apifyProxyCountry: "IN"`).
- **IMPROVED:** Pagination verified across multiple pages and cities.
- **FIXED:** Phone number extraction from new React HTML (plain text, not CSS cipher).
- **REMOVED:** Firecrawl dependency — no external API key needed.

#### **v1.0.0** (2026-04-02)

- Initial release with Firecrawl-based extraction.
- Core features: category search, phone extraction, ratings, addresses.
- PPE pricing model.

***

### Support & Contact

- **Documentation:** Full actor docs at apify.com/tugelbay/justdial-leads-extractor
- **Issues & Questions:** GitHub: github.com/tugelbay/justdial-leads-extractor/issues
- **Email Support:** support@apify.com (reference your actor run ID)
- **Chat:** Apify Discord community (#justdial-channel)

***

### Legal & Data Usage

- **Data Source:** JustDial.com (public business directory)
- **Data Retention:** Extraction results stored on Apify platform for 30 days. You own the data.
- **Privacy:** No personal data extracted (business-only info). Compliant with GDPR/CCPA.
- **Attribution:** Optional but appreciated — credit us if you use extracted data publicly.
- **Commercial Use:** Permitted. Build apps, lead gen, resell data (with license), etc.
- **Responsibility:** You're responsible for legal compliance in your jurisdiction (telemarketing laws, spam regulations, etc.).

***

**Built by:** tugelbay (Apify expert)\
**Platform:** Apify (Automated web scraping & RPA)\
**Last Updated:** 2026-04-02

# Actor input Schema

## `category` (type: `string`):

What type of business to search for (e.g., 'Restaurants', 'Dentists', 'Hotels', 'Plumbers', 'CA Firms')

## `city` (type: `string`):

Indian city name (e.g., 'Mumbai', 'Delhi', 'Bangalore', 'Chennai', 'Kolkata', 'Hyderabad', 'Pune', 'Ahmedabad')

## `maxItems` (type: `integer`):

Maximum number of business leads to extract. Each result counts as one PPE event.

## `includeDetails` (type: `boolean`):

Visit each business page for full data (hours, photos, menu, reviews). Slower but more complete. Without this, only search page data is extracted.

## `includeReviews` (type: `boolean`):

Extract review texts for each business. Requires 'Include full details' to be ON.

## `maxReviews` (type: `integer`):

How many reviews to extract per business (when reviews are enabled).

## `proxyConfiguration` (type: `object`):

Proxy for accessing JustDial. Indian residential proxy required (auto-configured by default).

## Actor input object example

```json
{
  "category": "Restaurants",
  "city": "Mumbai",
  "maxItems": 100,
  "includeDetails": true,
  "includeReviews": false,
  "maxReviews": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "IN"
  }
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "category": "Restaurants",
    "city": "Mumbai"
};

// Run the Actor and wait for it to finish
const run = await client.actor("tugelbay/justdial-leads-extractor").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "category": "Restaurants",
    "city": "Mumbai",
}

# Run the Actor and wait for it to finish
run = client.actor("tugelbay/justdial-leads-extractor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "category": "Restaurants",
  "city": "Mumbai"
}' |
apify call tugelbay/justdial-leads-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=tugelbay/justdial-leads-extractor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "JustDial Scraper & Leads Extractor — Phones, Reviews",
        "description": "Extract business leads from JustDial.com — names, phone numbers, emails, websites, ratings, reviews, working hours, addresses, categories, photos. Search any business category in any Indian city. Pay per result.",
        "version": "2.0",
        "x-build-id": "Lx7VaeKNygBQkn8TR"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/tugelbay~justdial-leads-extractor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-tugelbay-justdial-leads-extractor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/tugelbay~justdial-leads-extractor/runs": {
            "post": {
                "operationId": "runs-sync-tugelbay-justdial-leads-extractor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/tugelbay~justdial-leads-extractor/run-sync": {
            "post": {
                "operationId": "run-sync-tugelbay-justdial-leads-extractor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "category",
                    "city"
                ],
                "properties": {
                    "category": {
                        "title": "Business category",
                        "type": "string",
                        "description": "What type of business to search for (e.g., 'Restaurants', 'Dentists', 'Hotels', 'Plumbers', 'CA Firms')"
                    },
                    "city": {
                        "title": "City",
                        "type": "string",
                        "description": "Indian city name (e.g., 'Mumbai', 'Delhi', 'Bangalore', 'Chennai', 'Kolkata', 'Hyderabad', 'Pune', 'Ahmedabad')"
                    },
                    "maxItems": {
                        "title": "Max results",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Maximum number of business leads to extract. Each result counts as one PPE event.",
                        "default": 100
                    },
                    "includeDetails": {
                        "title": "Include full details",
                        "type": "boolean",
                        "description": "Visit each business page for full data (hours, photos, menu, reviews). Slower but more complete. Without this, only search page data is extracted.",
                        "default": true
                    },
                    "includeReviews": {
                        "title": "Include reviews",
                        "type": "boolean",
                        "description": "Extract review texts for each business. Requires 'Include full details' to be ON.",
                        "default": false
                    },
                    "maxReviews": {
                        "title": "Max reviews per business",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "How many reviews to extract per business (when reviews are enabled).",
                        "default": 5
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy for accessing JustDial. Indian residential proxy required (auto-configured by default).",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ],
                            "apifyProxyCountry": "IN"
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
