Sulekha Business Directory Scraper
Pricing
from $1.79 / 1,000 business exporteds
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
Maintained by CommunityActor 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
- Copy a public Sulekha category/city URL, such as
https://www.sulekha.com/plumbers/chennai. - Add it to Directory or profile URLs.
- Start with ten businesses and one directory page.
- Run the Actor and inspect both its status and dataset.
- 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
| Field | Behavior |
|---|---|
startUrls | Required, 1–20 HTTPS Sulekha directory or profile URL strings. |
maxItems | Global unique business-row limit after deduplication; default 10, minimum 1, maximum 100. No zero/unlimited mode. |
maxPages | Directory-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
| Field | Meaning |
|---|---|
businessName | Public profile name. |
phone | First visible tel: link, or null; may be a source routing number. |
address | Joined public address components; may be partial or null. |
streetAddress | Structured street address, unchanged except whitespace. |
locality, region | Listed address locality and region, independently nullable. |
postalCode, country | Listed postal code and country, independently nullable. |
category, city | Discovery directory slugs; direct profiles have null category and may use public areaServed city. |
sourceUrl | Final profile URL used for extraction. |
directoryUrl | Supplied discovery directory, or null for direct profiles. |
phoneSource | visible_tel_link when a phone is returned, otherwise null. |
observedAt | UTC 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 osfrom apify_client import ApifyClientclient = 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.
Related Actors
For a different source, see Google Maps Business Directory Scraper. Its coverage and access behavior are separate; neither product guarantees the other's listings.