Local.ch Business Directory Scraper avatar

Local.ch Business Directory Scraper

Pricing

Pay per event

Go to Apify Store
Local.ch Business Directory Scraper

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

Stas Persiianenko

Maintained by Community

Actor 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
}

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_url
  • query
  • city_or_region
  • business_name
  • profile_url
  • category
  • subtitles
  • address
  • phone
  • email
  • website
  • social_links
  • rating_average
  • rating_count
  • opening_status
  • latitude
  • longitude
  • thumbnail_url
  • is_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.

Start with:

  • maxResults: 20
  • maxPagesPerSearch: 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 ApifyClient
import os
client = 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.

Other automation-lab business directory and lead-generation scrapers:

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.