# Justdial Business Scraper - Phone, Email & Leads (`memo23/justdial-business-scraper`) Actor

Scrape Justdial business listings — name, decoded phone, WhatsApp, email, full address, GPS, rating, reviews, category, working hours, year & turnover. Search by category + city, or paste listing/business URLs. Auto-handles Justdial's block. JSON, CSV or Excel out

- **URL**: https://apify.com/memo23/justdial-business-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Lead generation, AI, Agents
- **Stats:** 4 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $30.00 / 1,000 business records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## 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 Business Scraper

Turn any [Justdial](https://www.justdial.com) category into a clean, structured business list. Search by **category + city**, paste a **category listing URL**, or drop **direct business URLs** — and get one flat row per business with name, decoded phone, WhatsApp, email, full address, GPS, rating, reviews, working hours and more.

Built for lead generation, local-market research and competitor mapping across **1,000+ Indian cities**.

#### How it works

![How the Justdial Business Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-justdial.png)

#### ✨ Why use this scraper?

- **Decoded contact details** — phone, WhatsApp and email pulled straight from each business profile, not just what's on the listing card.
- **Three ways in** — category + city, category listing URLs, or direct business (`_BZDET`) URLs. Mix them in one run.
- **Beats Justdial's block** — Justdial silently serves a 14-byte stub to scrapers; this actor routes every request through an India-geo unlocker chain with automatic fallback, so you get real pages.
- **Rich, self-contained rows** — every row carries listing + profile data merged together (address components, GPS, year established, employee band, turnover, services, hours, images).
- **No brittle DOM scraping** — reads Justdial's embedded `__NEXT_DATA__` JSON, so the output stays stable when the page layout changes.
- **JSON, CSV, Excel or API** — pipe results straight into your CRM, sheet or data pipeline. Billed per business row.

#### 🎯 Use cases

| You are a… | Use it to… |
|---|---|
| Sales / lead-gen team | Build targeted call & WhatsApp lists for any trade in any Indian city |
| Local marketing agency | Map every competitor in a category, with ratings and contact details |
| Market researcher | Measure category density, average ratings and geographic spread |
| Directory / data product | Seed or refresh a local-business database with structured rows |
| Recruiter / B2B vendor | Find and contact businesses by category, area and size |

#### 📥 Supported inputs

| Input | Example | What it does |
|---|---|---|
| City + Category | `city: "Mumbai"`, `search: "Furniture Contractors"` | Builds and paginates the matching Justdial listing |
| Category listing URL | `https://www.justdial.com/Mumbai/Furniture-Contractors/nct-10219641` | Paginates that listing (with or without the `/nct-…` id) |
| Direct business URL | `https://www.justdial.com/Mumbai/RK-Carpenter…U1E1_BZDET` | Scrapes that single business profile |

**Not supported:** Justdial reviews-only exports, B2B product catalogues, movie/event ticketing pages, and anything behind a Justdial login. The actor scrapes only public business listing and profile pages.

#### ⚙️ How it works

1. **Match** every input — a category + city is resolved to the exact Justdial category; pasted URLs are sorted into listings vs business profiles, and duplicate listings are merged.
2. **Fetch** listing pages through an India-geo unlocker chain (with automatic provider fallback) so you get the real page instead of Justdial's 14-byte block stub, following the `/page-2`, `/page-3` … sequence automatically up to your limit.
3. **Parse** each page's embedded `__NEXT_DATA__` JSON into one row per business — no brittle DOM scraping, so output stays stable across layout changes.
4. **Enrich** each business (when *Scrape business detail pages* is on) with phone, WhatsApp, email, full address, GPS, hours, year, turnover and services — via a fast contact lookup, falling back to the full profile page when needed.
5. **Stream** one flat, self-contained row per business to the dataset *as it's scraped*, so even a partial or interrupted run keeps everything found so far.

#### ⚙️ Input parameters

| Field | Type | Default | Description |
|---|---|---|---|
| `city` | string | — | City for category + city search (e.g. `Mumbai`). |
| `search` | string | — | Category / keyword (e.g. `Furniture Contractors`). |
| `startUrls` | array | — | Category listing URLs and/or direct business URLs. Auto-classified. |
| `scrapeDetails` | boolean | `true` | Fetch each business's profile page for phone / address / website / email / hours / GPS. Turn off for a faster, cheaper listing-only run. |
| `enrichEmails` | boolean | `false` | Discover a contact email from the business website or name (billed per email found). |
| `useMobileApi` | boolean | `true` | Fast contact lookup — resolves phone, email and address through Justdial's quick contact endpoint, with automatic fallback. Leave on for the fastest, most reliable runs. |
| `maxItems` | integer | `1000` | Max business rows **per listing URL** (Justdial serves ≤ ~100 per category × city). |
| `maxConcurrency` | integer | `4` | Parallel requests. Keep low — Justdial is rate-reactive. |
| `maxRequestRetries` | integer | `12` | Retry budget per URL on transient failures. |
| `proxy` | object | Apify Residential IN | Used only by the optional email-enrichment step. |

#### 📊 Output overview

Each dataset record is **one business**, with listing-level fields (name, rating, review count, area, pincode, category, verified flag, listing position) merged together with profile-level fields (decoded phone, WhatsApp, email, website, full address + components, GPS, working hours, year established, legal name, employee band, turnover, services and images). Direct-business-URL rows contain the profile fields only.

#### 📦 Output sample

```json
{
  "rowType": "business",
  "docId": "022PXX22.XX22.220428142504.U1E1",
  "businessUrl": "https://www.justdial.com/Mumbai/RK-Carpenter-Contractor-Works-Near-By-Bhoomi-Park-Jankalyan-Nagar-Malad-West/022PXX22-XX22-220428142504-U1E1_BZDET",
  "name": "RK Carpenter Contractor Works",
  "rating": 4.7,
  "ratingCount": 79,
  "category": "Furniture Contractors",
  "categories": ["Carpenters"],
  "services": ["Cupboard", "Sofa", "Computer Table", "Window", "Designer Furniture"],
  "verified": true,
  "jdVerified": true,
  "position": 1,
  "phone": "9972574484",
  "phones": ["9972574484"],
  "whatsapp": "9006638840",
  "email": "harkeshkushwaha80@gmail.com",
  "website": "https://youtu.be/dpqkv9ZTM5E",
  "address": "7 A, Jay Prakash Nagar, Near By Bhoomi Park, Jankalyan Nagar, Marve Road, Malad West, Mumbai-400095, Maharashtra",
  "street": "Marve Road",
  "landmark": "Near By Bhoomi Park, Jankalyan Nagar",
  "area": "Malad West",
  "pincode": "400095",
  "city": "Mumbai",
  "state": "Maharashtra",
  "latitude": 19.1894378,
  "longitude": 72.8056008,
  "workingHours": [
    { "day": "Mon - Thu", "hours": "10:00 am - 11:00 pm" },
    { "day": "Sat - Sun", "hours": "10:00 am - 11:00 pm" }
  ],
  "openNow": false,
  "yearEstablished": "2014",
  "legalName": "RK Carpenter Contractor Works",
  "noEmployees": "Less than 10",
  "turnover": "11 - 25 Lakhs",
  "images": ["https://content.jdmagicbox.com/v2/comp/mumbai/.../catalogue/...jpg"],
  "listingUrl": "https://www.justdial.com/Mumbai/Furniture-Contractors/nct-10219641",
  "scrapedAt": "2026-06-22T19:30:22.117Z"
}
````

#### 🗂 Key output fields

| Field | Type | Notes |
|---|---|---|
| `name` | string | Business display name |
| `phone` / `phones` | string / string\[] | Primary decoded phone + all numbers found |
| `whatsapp` | string | null | WhatsApp number when listed |
| `email` | string | null | Contact email from the profile |
| `website` | string | null | Business's own listed link (may be a social/video link) |
| `rating` / `ratingCount` | number | Average star rating + number of ratings |
| `address` | string | Full street address |
| `street` / `landmark` / `area` / `pincode` / `city` / `state` | string | Address components |
| `latitude` / `longitude` | number | GPS coordinates |
| `category` / `categories` | string / string\[] | Searched category + the business's own categories |
| `services` | string\[] | Service / specialisation tags from the profile |
| `verified` / `jdVerified` | boolean | Justdial verified + JD-Verified flags |
| `workingHours` / `workingHoursText` | array / string | Parsed per-day hours + the raw string |
| `yearEstablished` / `legalName` / `noEmployees` / `turnover` | string | Business-details block, when listed |
| `images` | string\[] | Profile / catalogue image URLs |
| `businessUrl` / `docId` | string | Canonical profile URL + Justdial document id |
| `contactLocked` / `notice` | boolean / string | Free plan only — present when a row's phone/email are masked (see FAQ) |

#### ❓ FAQ

**Is the phone number real?** It's the contact number Justdial displays on the business profile (its `VNumber`). For many businesses this forwards to their real line — it's the number a customer would call from Justdial.

**Why is `website` sometimes a YouTube or social link?** That's exactly what the business entered as their "website" on Justdial. The actor reports it verbatim; turn on **enrichEmails** to additionally discover a real website/email from the business name.

**How many results can I get per category?** Justdial caps a category × city at roughly 100 visible businesses, even when thousands exist. To go wider, run several nearby cities or related categories.

**What do I get on the free plan vs paid?** A free run returns the **first 5 businesses in full** — real phone, WhatsApp and email — plus up to 25 more rows with the contact fields **partially masked** (e.g. `99••••••75`, `sh•••@gmail.com`) so you can judge the volume and quality first. Those masked rows are **not charged**. On a paid plan every row comes back in full.

**Do I need to configure proxies or an unlocker?** No. Justdial's anti-bot handling is built in and India-routed. Just give it a category + city or some URLs.

**Can I get just the cheap listing data?** Yes — turn off **Scrape business detail pages** for a fast, low-cost run with name, rating, area, pincode, category and verified flag (no phone/address).

#### 💬 Support

Found a bug or need an extra field? Open an issue on the [actor's Issues tab](https://apify.com/memo23/justdial-business-scraper/issues) and it'll be looked at quickly.

#### 🛠 Additional services

Need a custom field, a different directory site, or a scheduled feed into your CRM/warehouse? Custom scraping and data-pipeline work is available on request.

#### 🔎 Explore more scrapers

Looking for more India / business-data sources? Check out the other directory, jobs and company scrapers in the same publisher's collection on the Apify Store.

***

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Justdial Limited or any of its subsidiaries or affiliates. All trademarks mentioned are the property of their respective owners.

The scraper accesses only publicly available Justdial business listing and profile pages — no authenticated endpoints, no login-only content. Users are responsible for ensuring their use complies with Justdial's Terms of Service, applicable data-protection law (including India's DPDP Act, GDPR and CCPA where relevant) and any contractual obligations of their own organisation. Use scraped personal data (such as phone numbers and emails) lawfully and honour opt-out / do-not-contact requirements.

***

### SEO Keywords

justdial scraper, scrape justdial, justdial business scraper, justdial leads extractor, justdial phone number extractor, justdial data extraction, justdial api, justdial email scraper, india business directory scraper, indian local business data, b2b lead generation india, justdial contractors scraper, justdial company details, local business leads india, justdial listing scraper, scrape indian businesses, justdial alternative api, apify justdial, business contact scraper india, justdial mumbai delhi bangalore

# Actor input Schema

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

City to search in, e.g. `Mumbai`, `Delhi`, `Bangalore`, `New Delhi`. Used together with the Category field below.

## `search` (type: `string`):

Business category or keyword, e.g. `Furniture Contractors`, `Interior Designers`, `Plumbers`, `Restaurants`. Used together with the City field above.

## `startUrls` (type: `array`):

Paste any mix of:
• Category listing URL — `https://www.justdial.com/Mumbai/Furniture-Contractors/nct-10219641` (with or without the `/nct-…` id)
• Direct business profile URL — `https://www.justdial.com/Mumbai/.../<docid>_BZDET`

Listing URLs are paginated automatically; business URLs are scraped directly.

## `scrapeDetails` (type: `boolean`):

When on (default), the actor opens each business's profile page to add the decoded phone number, full street address, website, email, working hours and GPS coordinates. Turn off for a faster, cheaper listing-only run (name, rating, review count, area, pincode, category, verified flag) without contact details.

## `enrichEmails` (type: `boolean`):

If enabled, finds a contact email for each business from its own website (or by discovering it from the business name). Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Billed per contact email found; only charged when an email is returned, never for misses.

## `useMobileApi` (type: `boolean`):

Resolve phone, email and address through Justdial's fast contact endpoint, which returns ready-to-use numbers directly. Falls back automatically when a business isn't available that way. Leave on for the fastest, most reliable runs; turn off to force the legacy page-by-page method.

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

Maximum business rows emitted **per listing URL** (and a hard cap on direct business URLs processed). Note: Justdial serves at most ~100 results per category × city. Each row is one paid `business-record` event. Default 1000. Free-tier users are additionally capped at 25 total rows across the whole run.

## `maxConcurrency` (type: `integer`):

Parallel HTTP requests. Justdial is aggressively rate-reactive — keep this low (3–4) so the rate limiter isn't tripped. Higher values risk the silent block stub and slower overall runs.

## `maxRequestRetries` (type: `integer`):

Per-URL retry budget on the silent block stub, network errors and proxy CONNECT failures. Each retry rotates to a fresh India residential session with exponential backoff. Default 12.

## `proxy` (type: `object`):

Justdial is India-only and serves real content only to India-egress residential IPs (direct connections and non-IN proxies get a 14-byte block stub). The actor routes through India residential proxies automatically; this setting is kept for compatibility.

## Actor input object example

```json
{
  "city": "Mumbai",
  "search": "Furniture Contractors",
  "startUrls": [
    "https://www.justdial.com/Mumbai/Furniture-Contractors/nct-10219641"
  ],
  "scrapeDetails": true,
  "enrichEmails": false,
  "useMobileApi": true,
  "maxItems": 1000,
  "maxConcurrency": 4,
  "maxRequestRetries": 12,
  "proxy": {
    "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 = {
    "city": "Mumbai",
    "search": "Furniture Contractors",
    "startUrls": [
        "https://www.justdial.com/Mumbai/Furniture-Contractors/nct-10219641"
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "IN"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/justdial-business-scraper").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 = {
    "city": "Mumbai",
    "search": "Furniture Contractors",
    "startUrls": ["https://www.justdial.com/Mumbai/Furniture-Contractors/nct-10219641"],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "IN",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/justdial-business-scraper").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 '{
  "city": "Mumbai",
  "search": "Furniture Contractors",
  "startUrls": [
    "https://www.justdial.com/Mumbai/Furniture-Contractors/nct-10219641"
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "IN"
  }
}' |
apify call memo23/justdial-business-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Justdial Business Scraper - Phone, Email & Leads",
        "description": "Scrape Justdial business listings — name, decoded phone, WhatsApp, email, full address, GPS, rating, reviews, category, working hours, year & turnover. Search by category + city, or paste listing/business URLs. Auto-handles Justdial's block. JSON, CSV or Excel out",
        "version": "0.1",
        "x-build-id": "0cL0ruuRLUYV4DRP8"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~justdial-business-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-justdial-business-scraper",
                "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/memo23~justdial-business-scraper/runs": {
            "post": {
                "operationId": "runs-sync-memo23-justdial-business-scraper",
                "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/memo23~justdial-business-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-justdial-business-scraper",
                "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",
                "properties": {
                    "city": {
                        "title": "City",
                        "type": "string",
                        "description": "City to search in, e.g. `Mumbai`, `Delhi`, `Bangalore`, `New Delhi`. Used together with the Category field below."
                    },
                    "search": {
                        "title": "Category / keyword",
                        "type": "string",
                        "description": "Business category or keyword, e.g. `Furniture Contractors`, `Interior Designers`, `Plumbers`, `Restaurants`. Used together with the City field above."
                    },
                    "startUrls": {
                        "title": "Justdial URLs",
                        "type": "array",
                        "description": "Paste any mix of:\n• Category listing URL — `https://www.justdial.com/Mumbai/Furniture-Contractors/nct-10219641` (with or without the `/nct-…` id)\n• Direct business profile URL — `https://www.justdial.com/Mumbai/.../<docid>_BZDET`\n\nListing URLs are paginated automatically; business URLs are scraped directly.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "scrapeDetails": {
                        "title": "Scrape business detail pages (phone, address, website, hours, GPS)",
                        "type": "boolean",
                        "description": "When on (default), the actor opens each business's profile page to add the decoded phone number, full street address, website, email, working hours and GPS coordinates. Turn off for a faster, cheaper listing-only run (name, rating, review count, area, pincode, category, verified flag) without contact details.",
                        "default": true
                    },
                    "enrichEmails": {
                        "title": "Enrich with contact emails (experimental, billed per email)",
                        "type": "boolean",
                        "description": "If enabled, finds a contact email for each business from its own website (or by discovering it from the business name). Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Billed per contact email found; only charged when an email is returned, never for misses.",
                        "default": false
                    },
                    "useMobileApi": {
                        "title": "Fast contact lookup (recommended)",
                        "type": "boolean",
                        "description": "Resolve phone, email and address through Justdial's fast contact endpoint, which returns ready-to-use numbers directly. Falls back automatically when a business isn't available that way. Leave on for the fastest, most reliable runs; turn off to force the legacy page-by-page method.",
                        "default": true
                    },
                    "maxItems": {
                        "title": "Max businesses per listing URL",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum business rows emitted **per listing URL** (and a hard cap on direct business URLs processed). Note: Justdial serves at most ~100 results per category × city. Each row is one paid `business-record` event. Default 1000. Free-tier users are additionally capped at 25 total rows across the whole run.",
                        "default": 1000
                    },
                    "maxConcurrency": {
                        "title": "Max parallel requests",
                        "minimum": 1,
                        "maximum": 8,
                        "type": "integer",
                        "description": "Parallel HTTP requests. Justdial is aggressively rate-reactive — keep this low (3–4) so the rate limiter isn't tripped. Higher values risk the silent block stub and slower overall runs.",
                        "default": 4
                    },
                    "maxRequestRetries": {
                        "title": "Max request retries",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Per-URL retry budget on the silent block stub, network errors and proxy CONNECT failures. Each retry rotates to a fresh India residential session with exponential backoff. Default 12.",
                        "default": 12
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Justdial is India-only and serves real content only to India-egress residential IPs (direct connections and non-IN proxies get a 14-byte block stub). The actor routes through India residential proxies automatically; this setting is kept for compatibility.",
                        "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
