Local.ch Business Directory Scraper
Pricing
Pay per event
Local.ch Business Directory Scraper
Extract Swiss business leads from Local.ch: names, contacts, ratings, addresses, websites, social links, and coordinates.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Stas Persiianenko
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Extract Swiss business leads from Local.ch search results. The actor collects company names, profile URLs, categories, subtitles, addresses, phone numbers, emails, websites, social links, ratings, opening status, coordinates, thumbnails, and premium-listing flags.
What It Does
Local.ch Business Directory Scraper turns Local.ch search pages into clean structured business data. Use it for Swiss lead generation, local market mapping, sales prospecting, recruiting research, location intelligence, and contact enrichment.
Typical Use Cases
- Build lead lists for Swiss restaurants, dentists, agencies, hotels, trades, clinics, and service providers.
- Collect phone, email, website, and social profile coverage for outreach preparation.
- Map local business density by city, region, canton, or postal code.
- Compare Local.ch ratings and review counts across Swiss markets.
- Enrich existing CRM records with Local.ch profile URLs and public contact details.
Who Is It For
This actor is for sales teams, growth agencies, recruiters, local SEO teams, market researchers, founders, and data teams that need structured Swiss business-directory data from Local.ch without manually copying search results.
Input Options
You can run the actor with direct Local.ch URLs, structured searches, or the quick search fields.
Local.ch Search URLs
Paste one or more Local.ch result URLs in startUrls.
{"startUrls": ["https://www.local.ch/en/q?what=Restaurant&where=Zurich"],"maxResults": 50}
Structured Searches
Use searches when you want several category and location combinations in one run.
{"searches": [{ "what": "Restaurant", "where": "Zurich" },{ "what": "Dentist", "where": "Geneva" }],"maxResults": 100}
Quick Search
Use what and where for a single search.
{"what": "Architect","where": "Basel","maxResults": 25}
Pagination
The actor follows Local.ch pagination links and stops when it reaches maxResults, maxPagesPerSearch, or the end of available result pages.
Result Limits
maxResults is the total number of unique businesses saved across all input searches. Duplicate Local.ch business IDs are saved only once per run.
Language
Set language to en, de, fr, or it. This controls the Local.ch path used for generated searches and profile URLs.
Output Fields
Each saved item contains:
search_urlquerycity_or_regionbusiness_nameprofile_urlcategorysubtitlesaddressphoneemailwebsitesocial_linksrating_averagerating_countopening_statuslatitudelongitudethumbnail_urlis_premium
Example Output
{"search_url": "https://www.local.ch/en/q?what=Restaurant&where=Zurich","query": "Restaurant","city_or_region": "Zurich","business_name": "Restaurant Kindli","profile_url": "https://www.local.ch/en/d/zurich/8001/restaurant/restaurant-kindli-CwBn7y7fwlbv85oZUYly1A","category": "restaurant","subtitles": [],"address": "Strehlgasse 24, 8001 Zurich, ZH, CH","phone": "043 888 76 76","email": "restaurant@kindli.ch","website": "https://www.kindli.ch/restaurant","social_links": ["https://www.instagram.com/kindlizuerich/"],"rating_average": 4.5,"rating_count": 10,"opening_status": "OPEN_UNTIL","latitude": 47.372335,"longitude": 8.541026,"thumbnail_url": "https://images.services.local.ch/...","is_premium": true}
Data Source
The actor reads public Local.ch search result pages. It extracts the structured data embedded in the initial HTML response.
Contact Fields
Local.ch may expose several contact types. The actor stores the first phone, first email, first website, and all social media links found in the listing payload.
Ratings
Ratings are included when Local.ch provides a visible rating summary. Listings without ratings return null for rating_average and rating_count.
Coordinates
Latitude and longitude are included when Local.ch provides coordinates in the listing payload. Some listings may not include coordinates.
Premium Listings
is_premium indicates whether Local.ch marks the listing as premium in the search payload.
Costs
The actor charges one run-start event and one result event per saved business listing. BRONZE users pay $0.005 per run plus $0.000039864 per listing. Use small maxResults values while testing.
Pricing
Pricing uses Apify pay-per-event billing. A run has a small start charge, and each saved Local.ch business listing is charged through the result event. Higher Apify tiers receive the standard tier discounts configured on the actor.
Recommended Settings
Start with:
maxResults: 20maxPagesPerSearch: 3- one city and one category
Increase limits after validating that the output matches your workflow.
Swiss Market Examples
Useful searches include:
- Restaurant in Zurich
- Dentist in Geneva
- Plumber in Basel
- Architect in Bern
- Hotel in Lausanne
- Electrician in Lucerne
- Lawyer in Lugano
Export Formats
Apify datasets can be exported as JSON, CSV, Excel, XML, RSS, or HTML table formats.
Automation
Schedule runs to refresh Swiss business lead lists, monitor rating changes, or periodically collect new listings for a category and region.
API Usage
Run the actor from Node.js:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/local-ch-business-directory-scraper').call({what: 'Restaurant',where: 'Zurich',maxResults: 20,maxPagesPerSearch: 1,language: 'en'});console.log(run.defaultDatasetId);
Run the actor from Python:
from apify_client import ApifyClientimport osclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("automation-lab/local-ch-business-directory-scraper").call(run_input={"what": "Restaurant","where": "Zurich","maxResults": 20,"maxPagesPerSearch": 1,"language": "en",})print(run["defaultDatasetId"])
Run the actor with cURL:
curl "https://api.apify.com/v2/acts/automation-lab~local-ch-business-directory-scraper/runs?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"what": "Restaurant","where": "Zurich","maxResults": 20,"maxPagesPerSearch": 1,"language": "en"}'
MCP
Use this actor from MCP clients through the Apify MCP server. The actor-specific MCP endpoint is:
https://mcp.apify.com?tools=automation-lab/local-ch-business-directory-scraper
Claude Code MCP setup
Register the actor-specific Apify MCP server in Claude Code:
claude mcp add local-ch-business-directory-scraper \--transport http \"https://mcp.apify.com?tools=automation-lab/local-ch-business-directory-scraper" \--header "Authorization: Bearer $APIFY_TOKEN"
Claude Desktop MCP setup
Add the Apify MCP server to claude_desktop_config.json:
{"mcpServers": {"local-ch-business-directory-scraper": {"type": "http","url": "https://mcp.apify.com?tools=automation-lab/local-ch-business-directory-scraper","headers": {"Authorization": "Bearer YOUR_APIFY_TOKEN"}}}}
Cursor and VS Code MCP setup
Use the same HTTP server configuration in .cursor/mcp.json, .vscode/mcp.json, or the MCP settings file used by your client:
{"mcpServers": {"local-ch-business-directory-scraper": {"type": "http","url": "https://mcp.apify.com?tools=automation-lab/local-ch-business-directory-scraper","headers": {"Authorization": "Bearer ${APIFY_TOKEN}"}}}}
MCP prompts
Example prompt 1:
Run automation-lab/local-ch-business-directory-scraper for restaurants in Zurich with maxResults 20. Return business_name, phone, website, city_or_region, and rating.
Example prompt 2:
Use the Local.ch business directory scraper with {"startUrls":["https://www.local.ch/en/q?what=Dentist&where=Geneva"],"maxResults":25,"maxPagesPerSearch":2,"language":"en"} and summarize the saved listings by city_or_region.
Example prompt 3:
Find Swiss accounting firms in Basel with Local.ch, limit the run to 30 listings, and return only records that include a website or phone number.
For MCP workflows, pass the same input schema fields (startUrls, searches, what, where, maxResults, maxPagesPerSearch, language, maxRequestRetries).
Data Quality Notes
Local.ch decides which contacts are public for each listing. Some records have rich contact data, while others may include only a name, category, and locality.
Troubleshooting
If a run returns fewer records than expected, increase maxPagesPerSearch, check that the Local.ch search URL returns results in a browser, and confirm that maxResults is not lower than the number you need.
Privacy
Use the exported data responsibly. Follow applicable privacy, outreach, and marketing rules for Switzerland and your own jurisdiction.
Legality
The actor extracts public Local.ch search result data. You are responsible for using the data lawfully, respecting Local.ch terms, and following applicable privacy, marketing, and data-protection requirements.
Limitations
The actor extracts data available on search result pages. It does not log in, bypass private access controls, or collect non-public information.
FAQ
Can I scrape multiple cities in one run? Yes. Add several objects to searches or several URLs to startUrls.
Does every listing include email and website data? No. Local.ch only exposes contact fields that are public for each listing.
Can I use German, French, or Italian Local.ch pages? Yes. Set language to de, fr, or it.
Why did I get fewer results than Local.ch shows? Increase maxPagesPerSearch and maxResults; Local.ch may also return duplicate or partial entries that the actor deduplicates by ID.
Related scrapers
Other automation-lab business directory and lead-generation scrapers:
- Google Maps Lead Finder
- 11880 Local Business Directory Scraper
- Hotfrog Business Directory Scraper
- PagineGialle Scraper
- Website Contact Finder
Changelog
Initial version extracts public Local.ch business listings from HTTP search result pages.
Support
Open an Apify issue with the run ID, input, and expected Local.ch result page when reporting a problem.
Field Reference
search_url is the source URL used for extraction.
query is the keyword or category supplied by the input or inferred from Local.ch URL parts.
city_or_region is the input location or parsed Local.ch locality.
business_name is the public Local.ch listing title.
profile_url is the Local.ch business profile URL.
category is the main Local.ch URL category slug.
subtitles contains Local.ch subtitle lines.
address is a formatted address string.
phone is the first phone or mobile contact.
email is the first email contact.
website is the first website contact.
social_links contains public social media URLs.
rating_average is the visible average rating.
rating_count is the visible number of ratings.
opening_status is the Local.ch opening status token.
latitude and longitude are listing coordinates when available.
thumbnail_url is a Local.ch logo or thumbnail image URL.
is_premium is the Local.ch premium listing flag.