# Grotal India Business Scraper for Leads: City and Category Data (`getascraper/grotal-business-directory-scraper`) Actor

Collect public Grotal business listings by Indian city and category. Get names, addresses, phones, directory emails, websites, ratings, descriptions, detail URLs, typed filters, and safe change monitoring. Export clean records to Apify datasets and lead workflows at $0.00176 per business record.

- **URL**: https://apify.com/getascraper/grotal-business-directory-scraper.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.32 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Grotal India Business Scraper for Leads: City and Category Data

<table width="100%">
<tr>
<td style="padding:24px 28px;background:#eff6ff;border:1px solid #bfdbfe;border-top:4px solid #2563eb;border-radius:12px">
<span style="font-size:23px;font-weight:800;color:#1e3a8a;line-height:1.3">Build cleaner Indian business lead lists from Grotal</span><br>
<span style="font-size:15px;color:#334155;line-height:1.6">Collect public city and category listings with phones, emails when listed, websites, ratings, and change signals.</span>
</td>
</tr>
</table>

<table width="100%">
<tr>
<td style="padding:14px 12px;width:25%;background:#ffffff;border:1px solid #bfdbfe;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#1d4ed8">Public business contacts</span><br>
<span style="font-size:12px;color:#334155">Names, addresses, phones, emails, websites, and source links.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#ffffff;border:1px solid #bfdbfe;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#1d4ed8">City and category targeting</span><br>
<span style="font-size:12px;color:#334155">Use verified Grotal pages or city and area helpers.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#ffffff;border:1px solid #bfdbfe;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#1d4ed8">Change-ready output</span><br>
<span style="font-size:12px;color:#334155">Compare scheduled snapshots with factual change states.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#ffffff;border:1px solid #bfdbfe;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#1d4ed8">Clean lead records</span><br>
<span style="font-size:12px;color:#334155">Typed fields and absent values omitted automatically.</span>
</td>
</tr>
</table>

### 🔍 What does this Actor do?

Grotal India Business Scraper turns public Grotal directory pages into structured business leads. Use it for city prospecting, category research, local market analysis, or scheduled listing checks.

It fetches the public category card and its public business detail page. The result includes source-backed names, categories, addresses, phone numbers, directory emails, websites, descriptions, ratings, review counts, images, and links.

The default run starts with Delhi AC repair listings. Change the source URLs or use the city and category helpers for another Indian market.

### 👥 Who is it for?

- Sales teams building Indian SMB prospect lists by city and service.
- Agencies researching local suppliers, competitors, and service coverage.
- Directory builders that need public business records with traceable source links.
- Operations teams that want to see new, changed, unchanged, and removed listings on a schedule.

### ⚙️ How it works

<table width="100%">
<tr>
<td style="padding:16px 14px;width:33%;background:#eff6ff;border:1px solid #bfdbfe;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#2563eb;letter-spacing:1px">STEP 1</span><br>
<span style="font-size:14px;font-weight:700;color:#1e3a8a">Choose sources</span><br>
<span style="font-size:12px;color:#334155">Paste verified Grotal category pages, or enter city and category terms.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#eff6ff;border:1px solid #bfdbfe;border-left:none;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#2563eb;letter-spacing:1px">STEP 2</span><br>
<span style="font-size:14px;font-weight:700;color:#1e3a8a">Enrich public details</span><br>
<span style="font-size:12px;color:#334155">The Actor combines category cards with public business detail pages.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#eff6ff;border:1px solid #bfdbfe;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#2563eb;letter-spacing:1px">STEP 3</span><br>
<span style="font-size:14px;font-weight:700;color:#1e3a8a">Use the dataset</span><br>
<span style="font-size:12px;color:#334155">Filter lead fields, export records, or schedule the same state for change tracking.</span>
</td>
</tr>
</table>

### 🧾 Input

| Field | Type | Required | Description |
|---|---|---:|---|
| `startUrls` | array of URLs | No | Public Grotal city and category pages. The default is a Delhi AC repair page. |
| `searchTerms` | array of strings | No | Category or service terms used with selected cities. |
| `locations` | array of strings | No | Indian city names resolved from Grotal's public city list. |
| `areas` | array of strings | No | Optional city areas resolved from Grotal's public area list. |
| `categoryContains` | string | No | Keep records whose public categories contain this text. |
| `cityContains` | string | No | Keep records whose source city contains this text. |
| `areaContains` | string | No | Keep records whose public area contains this text. |
| `minRating` | number | No | Minimum source-backed rating from 0 to 5. |
| `minReviewCount` | integer | No | Minimum source-backed review count. |
| `requirePublicPhone` | boolean | No | Keep only records with a public phone number. |
| `requirePublicEmail` | boolean | No | Keep only records with a directory or opt-in website email. |
| `requireWebsite` | boolean | No | Keep only records with a source-linked website. |
| `requireDescription` | boolean | No | Keep only records with a public description. |
| `proxyConfiguration` | object | No | Direct access is the default. Apify Proxy is optional. |
| `includeImages` | boolean | No | Include a source-backed business image when available. |
| `includePublicWebsiteContacts` | boolean | No | Check linked business websites for visible business emails and social links. |
| `maxWebsiteRequests` | integer | No | Maximum optional website checks. |
| `maxItems` | integer | No | Maximum emitted businesses, from 1 to 500. |
| `maxPages` | integer | No | Maximum discovered pages per source, from 1 to 25. |
| `outputMode` | enum | No | `snapshot`, `snapshotAndChanges`, or `changesOnly`. |
| `stateName` | string | No | Stable label for scheduled snapshots. |

#### Example input

```json
{
  "startUrls": [
    { "url": "https://www.grotal.com/Delhi/AC-Repair-C44/" }
  ],
  "maxItems": 20,
  "outputMode": "snapshotAndChanges",
  "stateName": "delhi-ac-repair"
}
```

#### Search helper example

```json
{
  "searchTerms": ["AC Repair", "Refrigerator Repair"],
  "locations": ["Delhi", "Mumbai"],
  "areas": [],
  "maxItems": 20
}
```

Helper searches use Grotal's public city and area options. Unknown values are reported as warnings instead of being guessed.

### 📊 Data table

| Field | Type | Description |
|---|---|---|
| `businessName` | string | Public business name. |
| `listingId` | string | Numeric Grotal listing ID when exposed. |
| `categoryNames` | array | Public category memberships. |
| `city`, `area`, `streetAddress`, `postalCode`, `state`, `country` | string | Public location fields when available. |
| `phoneNumbers` | array | Public phone numbers from the directory. |
| `directoryEmail` | string | Email listed on the public Grotal detail page. |
| `websiteUrl`, `websiteDomain` | string | Public business website when explicitly linked. |
| `description` | string | Public business description. |
| `ratingValue`, `reviewCount` | number | Source-backed aggregate rating fields. |
| `websiteEmails`, `publicSocialLinks` | array | Opt-in public website contacts. |
| `publicContactChannels` | array | Factual channels present in the record. |
| `leadCompletenessScore` | number | Deterministic score based on public field presence. |
| `sourceUrl`, `profileUrl` | string | Traceable Grotal source links. |
| `changeType` | enum | `new`, `changed`, `unchanged`, or `removed`. |
| `changedFields` | array | Factual fields that changed since the previous complete run. |

The dataset has three views:

- `🔍 Business leads` for prospecting records.
- `☎️ Contact coverage` for public contact completeness.
- `🔄 Listing changes` for scheduled monitoring.

### 🔄 Monitoring and change states

Use the same `stateName` for scheduled runs. The first complete run marks records as `new`. Identical records become `unchanged`. Factual updates become `changed`. A listing becomes `removed` only after a complete, uncapped source run confirms it is absent.

Partial, failed, capped, or pagination-incomplete runs never infer removals. Diagnostics are available in the `RUN_SUMMARY` key-value record.

### 🛡️ Public data boundaries

This Actor collects anonymous public business pages only. It does not access accounts, private portals, payment paths, or private APIs. Contact-person names, reviewer names, and review bodies are not included. Missing values are omitted rather than replaced with placeholders.

### 💰 Pricing

Pricing is pay per result. Empty runs cost nothing, and there are no subscriptions. Review the current Store pricing before running a large job.

### ⭐ Enjoying Grotal India Business Scraper for Leads: City and Category Data?

<table width="100%">
<tr>
<td style="padding:20px 24px 14px;background:#eff6ff;border:1px solid #bfdbfe;border-left:5px solid #2563eb;border-radius:10px 10px 0 0">
<span style="font-size:20px;letter-spacing:4px">⭐ ⭐ ⭐ ⭐ ⭐</span><br>
<span style="font-size:17px;font-weight:800;color:#1e3a8a">Run it on a schedule and check the listing changes view after your next snapshot.</span><br>
<span style="font-size:14px;color:#334155">A 5-star rating takes 10 seconds and helps other sales and research teams find this actor. Your feedback also tells us what to build next.</span>
</td>
</tr>
<tr>
<td style="padding:0;background:#2563eb;border:1px solid #bfdbfe;border-top:none;border-radius:0 0 10px 10px;text-align:center">
<a href="https://apify.com/getascraper/grotal-business-directory-scraper/reviews" style="display:block;padding:13px 16px;color:#ffffff;text-decoration:none;font-weight:800;font-size:15px;letter-spacing:0.3px">★&nbsp;&nbsp;Rate this Actor on Apify</a>
</td>
</tr>
</table>

### ❓ FAQ

#### Can I use a Grotal category URL directly?

Yes. Use a public city and category page such as the default Delhi AC repair URL. Profile URLs are fetched automatically from category cards and should not be used as source inputs.

#### Can I search by city and category without crafting URLs?

Yes. Enter `searchTerms` and `locations`. The Actor resolves Grotal's public city IDs and verifies each generated page before collecting records.

#### Does it collect private-person information?

No. The output is limited to public business fields. Contact-person names, reviewer identities, review text, credentials, and private pages are excluded.

#### How do change records work?

Use a stable `stateName`. Complete repeated runs compare factual business fields. Partial or capped runs do not infer removals.

### 🔗 Other actors

- [BUSINESS.bg scraper: Bulgarian company leads, фирмени контакти](https://apify.com/getascraper/business-bg-company-leads-scraper) ↗: Collect public company leads from a Bulgarian directory.
- [Fonecta scraper for Finnish leads: yrityshaku data in JSON](https://apify.com/getascraper/fonecta-business-leads-scraper) ↗: Build public Finnish business lead lists.
- [Expertise.com MSP lead scraper: providers by city with contacts](https://apify.com/getascraper/expertise-msp-leads-scraper) ↗: Find managed IT providers by city.
- [Bizi.si Slovenia Scraper: Slovenska podjetja for Business Leads](https://apify.com/getascraper/bizi-si-business-scraper) ↗: Collect Slovenian company records and public contacts.

# Changelog

This Actor's version history is a separate document: https://apify.com/getascraper/grotal-business-directory-scraper/changelog.md

# Actor input Schema

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

Choose verified Grotal city and category pages. Detail pages, account pages, payment pages, and other hosts are rejected.

## `searchTerms` (type: `array`):

Optional terms such as AC Repair, restaurants, or plumbers. Each term is combined with every selected city.

## `locations` (type: `array`):

Optional city names resolved from Grotal's public city list. Helper mode needs at least one city.

## `areas` (type: `array`):

Optional area names resolved for each selected city. Leave empty to use Any Area.

## `categoryContains` (type: `string`):

Keep businesses whose public category names contain this text after detail enrichment.

## `cityContains` (type: `string`):

Keep businesses whose source city contains this text.

## `areaContains` (type: `string`):

Keep businesses whose public area value contains this text.

## `minRating` (type: `number`):

Keep only listings with a source-backed rating at or above this value.

## `minReviewCount` (type: `integer`):

Keep only listings with at least this many source-backed reviews.

## `requirePublicPhone` (type: `boolean`):

Keep only businesses with at least one phone number publicly listed by Grotal.

## `requirePublicEmail` (type: `boolean`):

Keep only businesses with a directory email or opt-in public website email.

## `requireWebsite` (type: `boolean`):

Keep only businesses with a source-linked public website.

## `requireDescription` (type: `boolean`):

Keep only businesses with a public source description.

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

Direct HTTP is used by default. Add Apify Proxy only when your workflow needs it.

## `includeImages` (type: `boolean`):

Include a source-backed business image when the detail page exposes one.

## `includePublicWebsiteContacts` (type: `boolean`):

Check publicly linked business websites for visible business emails and social links. No values are inferred.

## `maxWebsiteRequests` (type: `integer`):

Bounds optional public website requests for one run.

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

Maximum deduplicated businesses emitted after enrichment and filters.

## `maxPages` (type: `integer`):

Bounds discovered pagination links for each category source.

## `outputMode` (type: `string`):

Choose whether to emit current records, current records plus safe removals, or only changes.

## `stateName` (type: `string`):

A stable label that keeps snapshots separate for different scheduled workflows.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.grotal.com/Delhi/AC-Repair-C44/"
    }
  ],
  "searchTerms": [],
  "locations": [],
  "areas": [],
  "requirePublicPhone": false,
  "requirePublicEmail": false,
  "requireWebsite": false,
  "requireDescription": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "includeImages": false,
  "includePublicWebsiteContacts": false,
  "maxWebsiteRequests": 20,
  "maxItems": 20,
  "maxPages": 10,
  "outputMode": "snapshotAndChanges",
  "stateName": "default"
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "startUrls": [
        {
            "url": "https://www.grotal.com/Delhi/AC-Repair-C44/"
        }
    ],
    "searchTerms": [],
    "locations": [],
    "areas": [],
    "requirePublicPhone": false,
    "requirePublicEmail": false,
    "requireWebsite": false,
    "requireDescription": false,
    "proxyConfiguration": {
        "useApifyProxy": false
    },
    "includeImages": false,
    "includePublicWebsiteContacts": false,
    "maxWebsiteRequests": 20,
    "maxItems": 20,
    "maxPages": 10,
    "outputMode": "snapshotAndChanges",
    "stateName": "default"
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/grotal-business-directory-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 = {
    "startUrls": [{ "url": "https://www.grotal.com/Delhi/AC-Repair-C44/" }],
    "searchTerms": [],
    "locations": [],
    "areas": [],
    "requirePublicPhone": False,
    "requirePublicEmail": False,
    "requireWebsite": False,
    "requireDescription": False,
    "proxyConfiguration": { "useApifyProxy": False },
    "includeImages": False,
    "includePublicWebsiteContacts": False,
    "maxWebsiteRequests": 20,
    "maxItems": 20,
    "maxPages": 10,
    "outputMode": "snapshotAndChanges",
    "stateName": "default",
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/grotal-business-directory-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.grotal.com/Delhi/AC-Repair-C44/"
    }
  ],
  "searchTerms": [],
  "locations": [],
  "areas": [],
  "requirePublicPhone": false,
  "requirePublicEmail": false,
  "requireWebsite": false,
  "requireDescription": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "includeImages": false,
  "includePublicWebsiteContacts": false,
  "maxWebsiteRequests": 20,
  "maxItems": 20,
  "maxPages": 10,
  "outputMode": "snapshotAndChanges",
  "stateName": "default"
}' |
apify call getascraper/grotal-business-directory-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,getascraper/grotal-business-directory-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/JaikvZiBfSRqJCWdI/builds/PWrcjmIjb5JZJbwPF/openapi.json
