Sulekha Business Directory Scraper avatar

Sulekha Business Directory Scraper

Pricing

from $1.79 / 1,000 business exporteds

Go to Apify Store
Sulekha Business Directory Scraper

Sulekha Business Directory Scraper

Refresh Sulekha city business lists: discover category/city listings, enrich public profiles, and export names, nullable displayed phones, addresses and source URLs. No hidden contacts or Justdial.

Pricing

from $1.79 / 1,000 business exporteds

Rating

0.0

(0)

Developer

Automation Lab

Automation Lab

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Categories

Share

Refresh a Sulekha business directory from supplied Indian city/category URLs. Discover linked businesses and enrich their public profiles into names, publicly displayed telephone links when available, physical address components and source provenance.

Built for local-market researchers and agencies maintaining recurring city business lists. Phones can be null, addresses can be partial, and the Actor does not promise every business in a city.

Who is it for?

Local-market researchers and agencies refreshing public Indian city business directories. This is a source-attributed list export, not a verified sales-contact database.

What does this Actor do?

  • Accepts Sulekha category/city directories and public business profile URLs.
  • Reads public HTML and structured business address markup.
  • Enriches discovered profiles, rather than exporting directory summary cards as full addresses.
  • Deduplicates canonical profile URLs across the run.
  • Follows actual next-page links within a directory when supplied by the source.
  • Exports typed rows to the default dataset for JSON, CSV and Excel downloads.

It does not scrape Justdial, purchase leads, submit enquiry forms, reveal hidden contacts, or access accounts.

Why use it?

A contact list is more useful when each row includes where it came from and when it was observed. Keep sourceUrl as the join key in your own refresh pipeline and compare later snapshots downstream. No built-in change history, alerts or cross-source deduplication is implied.

Getting started

  1. Copy a public Sulekha category/city URL, such as https://www.sulekha.com/plumbers/chennai.
  2. Add it to Directory or profile URLs.
  3. Start with ten businesses and one directory page.
  4. Run the Actor and inspect both its status and dataset.
  5. Export the dataset using the Console's JSON, CSV or Excel download options.
{
"startUrls": ["https://www.sulekha.com/plumbers/chennai"],
"maxItems": 10,
"maxPages": 1
}

Inputs

FieldBehavior
startUrlsRequired, 1–20 HTTPS Sulekha directory or profile URL strings.
maxItemsGlobal unique business-row limit after deduplication; default 10, minimum 1, maximum 100. No zero/unlimited mode.
maxPagesDirectory-page cap per supplied directory; default 1, range 1–5. Direct profiles ignore this setting.

Only page query parameters are supported. Fragments and trailing slashes are normalized. Login, enquiry and unrelated URLs are unsupported. There are no keyword matching or phone-presence filters.

Each directory contributes businesses in source order until the global row limit is reached. Duplicate URLs are skipped; distinct source URLs for the same real-world company may remain separate. If the same business is discovered twice, its first discovery determines directoryUrl and category/city context.

Extracted fields

FieldMeaning
businessNamePublic profile name.
phoneFirst visible tel: link, or null; may be a source routing number.
addressJoined public address components; may be partial or null.
streetAddressStructured street address, unchanged except whitespace.
locality, regionListed address locality and region, independently nullable.
postalCode, countryListed postal code and country, independently nullable.
category, cityDiscovery directory slugs; direct profiles have null category and may use public areaServed city.
sourceUrlFinal profile URL used for extraction.
directoryUrlSupplied discovery directory, or null for direct profiles.
phoneSourcevisible_tel_link when a phone is returned, otherwise null.
observedAtUTC extraction time, not the business's last-update time.

Output example

The following public business was observed during local verification. Source content can change.

{
"businessName": "Saira Electricals And Plumbing Works",
"phone": "08048051027",
"address": "No-44/1,Karunanidhi 1st Street, Nandhavana mettur, Thiruvallur, Avadi, Chennai - 600054, Chennai, 600054, IN",
"streetAddress": "No-44/1,Karunanidhi 1st Street, Nandhavana mettur, Thiruvallur, Avadi, Chennai - 600054",
"locality": "Chennai",
"region": null,
"postalCode": "600054",
"country": "IN",
"category": "plumbers",
"city": "chennai",
"sourceUrl": "https://www.sulekha.com/profile/saira-electricals-and-plumbing-works-avadi-chennai",
"directoryUrl": "https://www.sulekha.com/plumbers/chennai",
"phoneSource": "visible_tel_link",
"observedAt": "2026-10-27T15:04:48.695Z"
}

How much does it cost to extract Sulekha businesses?

Pay per event: one start event per valid run plus one item event per unique exported business. There is no separate event for directory pages, requests or address fields. Duplicate and failed profiles are not charged as business rows.

Current BRONZE price: $0.001 per run plus $0.002989 per business. Ten businesses cost $0.03089 and 100 cost $0.2999. Per-business prices are FREE $0.0034373, BRONZE $0.002989, SILVER $0.0023314, and GOLD/PLATINUM/DIAMOND $0.0017934. Spend tiers follow qualifying aggregate monthly Store spend, not a per-Actor volume schedule; the Store pricing panel shows the applicable price. These are Actor charges, not infrastructure-cost estimates. A failed run may retain its start charge and charges for already exported rows. Set a suitable total-charge limit in Console.

Coverage and pagination

The Actor follows only actual rel=next links and never guesses page numbers. Some directories expose only an initial set of public listings; a high maxPages does not create more results. Load-more forms and hidden pagination APIs are not used. The tested Chennai plumbers directory exposes an initial twenty-item list, not a complete city census.

Residential India HTTP proxy is automatic and required. There are no user-configurable proxy modes or browser fallbacks. Requests are sequential with at least 500 ms spacing, up to three attempts per page, fresh proxy identity after failures and exponential backoff. No images or browser assets are downloaded.

Failures and troubleshooting

A blocked response, changed markup, wrong profile identity or exhausted request fails the run rather than masquerading as an empty directory. Already saved rows are partial when the run fails. A recognized directory explicitly declaring zero items can succeed with an empty dataset.

The SUMMARY key-value record contains request counts, decoded HTML response bytes, retries, directory pages, profiles and saved rows. Its byte count is not compressed/billed proxy transfer. It is written on normal completion. A billing limit can stop output before maxItems.

If a run times out with a large limit, reduce the batch or increase its timeout. Confirm the directory is public and correctly formatted before retrying a failed URL. Persistent challenges or schema changes should be reported with the run link.

Integrations

Schedule recurring executions with Apify schedules, then use a webhook or dataset integration to append rows to a spreadsheet, CRM staging table or data warehouse. Compare sourceUrl keys and observation times in your own pipeline. Verify contact accuracy and consent before any outreach; this Actor does not perform messaging or qualification.

API usage

Use your Apify token securely; do not paste it into shared URLs or logs.

curl -X POST 'https://api.apify.com/v2/acts/automation-lab~sulekha-city-business-directory/runs' \
-H "Authorization: Bearer $APIFY_TOKEN" -H 'Content-Type: application/json' \
-d '{"startUrls":["https://www.sulekha.com/plumbers/chennai"],"maxItems":10}'

JavaScript with apify-client:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/sulekha-city-business-directory').call({
startUrls: ['https://www.sulekha.com/plumbers/chennai'], maxItems: 10,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems({ limit: 10 });

Python with apify-client:

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/sulekha-city-business-directory').call(
run_input={'startUrls': ['https://www.sulekha.com/plumbers/chennai'], 'maxItems': 10})
items = client.dataset(run['defaultDatasetId']).list_items(limit=10).items

MCP usage

For clients supporting authenticated HTTP MCP:

claude mcp add --transport http apify \
"https://mcp.apify.com?tools=automation-lab/sulekha-city-business-directory"

Equivalent client configuration for Claude Desktop, Cursor, and VS Code:

{"mcpServers":{"apify":{"url":"https://mcp.apify.com?tools=automation-lab/sulekha-city-business-directory"}}}

Example prompts: “Export ten Chennai plumber listings with their source URLs” or “Read the first twenty rows from the completed run.”

Discover actual tool names and schemas with tools/list. Actor selection also adds run and dataset tools; it does not expose exactly one tool. Example request: “Extract ten public Sulekha businesses from this Chennai plumbers directory and show their names, nullable phones and source URLs.”

Start once and retain its run and storage IDs. If the call returns before completion, follow that same run using bounded backoff (2, 4, 8 seconds, capped at 10) and a 120-second total deadline. On timeout, check the known run instead of restarting it. At deadline, report pending with the run ID. Failed runs have only partial results.

After success, read dataset pages of twenty rows, at most 100 rows and 64 KiB of serialized UTF-8 results admitted to model context, whichever comes first. Enforce bytes host-side, disclose omissions, track source offsets and report continuation when truncated. If the client cannot intercept oversized pages, do not claim a hard byte ceiling. Full exports remain in storage outside model context. This consumer budget does not change the Actor's collection contract.

Legality and responsible use

Use public business information only for lawful purposes and comply with applicable source terms, privacy, marketing and data-retention requirements. Public availability is not permission for unsolicited marketing. No private accounts, contact-reveal workflows or personal enrichment are supported.

The Actor uses no AI models at runtime. It is independently developed and is not affiliated with or endorsed by Sulekha. Residential proxy and platform costs are paid by the developer through the documented Actor charges; no external account is needed.

Results and logs remain in your Apify run storage according to your account's retention settings; delete datasets and key-value stores from Console when no longer required. No separate business-data cache is maintained. Proxy identities are ephemeral. For support, open a Store issue with the run link, excluding credentials and private data.

Failed operations send sanitized diagnostic input, exceptions and Actor/build/run IDs to our private GlitchTip service for repair. Secret fields and URL queries are removed and reports are retained for 30 days.

FAQ

Why is phone null? The public profile may not display a telephone link. The Actor does not reveal or infer numbers.

Why fewer rows than requested? The public listing set may end, pagination links may be absent, duplicate URLs may be removed, or the charge limit may stop output.

Are numbers verified? No. A displayed number can be a routing number or stale. Verify independently.

Can it scrape Justdial too? No. This product is Sulekha-only and makes no cross-source matching claim.

For a different source, see Google Maps Business Directory Scraper. Its coverage and access behavior are separate; neither product guarantees the other's listings.