Local.ch Swiss Business Leads Scraper avatar

Local.ch Swiss Business Leads Scraper

Pricing

$1.50 / 1,000 valid swiss business leads

Go to Apify Store
Local.ch Swiss Business Leads Scraper

Local.ch Swiss Business Leads Scraper

Find Swiss businesses by keyword and location. Export clean, deduplicated leads with phones, emails, websites, addresses, contactability metrics and AI-ready summaries for CRM, sales and automation.

Pricing

$1.50 / 1,000 valid swiss business leads

Rating

0.0

(0)

Developer

Matis Monnin

Matis Monnin

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

16 hours ago

Last modified

Categories

Share

Local.ch Swiss Business Leads

Find Swiss businesses by category and location and export clean, deduplicated leads with phone numbers, emails, websites, addresses, contactability metrics, and AI-ready summaries.

You do not need to build a local.ch URL. Enter a keyword such as plumber and a place such as Lausanne, then start the run.

Find Swiss businesses and get clean, deduplicated, CRM-ready and AI-ready leads.

Why use this Actor?

  • Built for Switzerland: Lausanne, Geneva, Zürich, Bern, Basel, Lugano, Vaud, Valais, Ticino and other cities or cantons
  • Simple keyword + location search, including several keywords and locations in one run
  • Designed for business listings: skips entries that local.ch explicitly marks as PERSON. This is not a guaranteed private-person filter; review localChUrl before outreach
  • Global deduplication across searches, with matchedSearches kept on the surviving row
  • CRM-ready fields: E.164 phones, normalized emails/websites, full address, canton, country
  • Deterministic contactability and completeness scores — not a commercial lead score
  • Deterministic ai_summary Markdown, with no external LLM
  • Advertising preference signal when local.ch publishes it (refusesAdvertising)
  • French, German, Italian and English search pages
  • Pay Per Event is designed to charge only for valid dataset rows

Try it in 30 seconds

{
"searchTerms": ["plumber"],
"locations": ["Lausanne"],
"maxResultsPerSearch": 100
}

Start the Actor. Open the default dataset when the run finishes. If nothing is found, the log explains: No businesses found. Try a broader category or location.

What data do you get?

FieldDescription
nameBusiness name
category, categoriesMain and additional categories
street, postalCode, city, canton, fullAddressAddress parts plus a combined address
countryAlways Switzerland when a record is saved
phone, normalizedPhoneOriginal phone and E.164 when conversion is certain
email, normalizedEmailOriginal email and lowercase email
website, normalizedWebsiteOriginal website and normalized URL
facebook, instagram, linkedin, otherSocialLinksPublic social links when requested
rating, reviewCountPublic rating summary when present
latitude, longitudeCoordinates when present
openingHoursStructured hours when detail crawl is enabled
refusesAdvertisingSource signal, or null if unknown
contactabilityScore0–100 channel availability score
dataCompleteness0–100 share of essential fields present
localChUrlPublic local.ch profile URL for verification
matchedSearchesWhich keyword/location pairs found this business
ai_summaryDeterministic Markdown summary

Missing values stay null. The Actor does not invent data.

Example output

{
"name": "Example Sanitär GmbH",
"category": "Plumbing",
"city": "Lausanne",
"canton": "VD",
"country": "Switzerland",
"fullAddress": "Rue Example 12, 1000 Lausanne, VD",
"phone": "021 000 00 00",
"normalizedPhone": "+41210000000",
"email": "info@example.ch",
"normalizedEmail": "info@example.ch",
"website": "www.example.ch",
"normalizedWebsite": "https://www.example.ch",
"contactabilityScore": 95,
"dataCompleteness": 100,
"refusesAdvertising": null,
"localChUrl": "https://www.local.ch/fr/d/lausanne/1000/sanitaire/example-sanitar-gmbh-abcdefghijklmnopqrs",
"matchedSearches": [{ "query": "plumber", "location": "Lausanne" }],
"ai_summary": "## Example Sanitär GmbH\n\nSwiss business located in Lausanne, VD.\n\n- Category: Plumbing\n- Address: Rue Example 12, 1000 Lausanne, VD\n- Phone: 021 000 00 00\n- Email: info@example.ch\n- Website: www.example.ch\n- Contactability: 95/100",
"source": "local.ch"
}

CRM-ready leads

Use normalizedPhone, normalizedEmail, normalizedWebsite and fullAddress for HubSpot, Salesforce, Google Sheets or a CRM import.

contactabilityScore only answers: how many useful contact channels are available?

  • normalized email: +35
  • normalized phone: +30
  • normalized website: +20
  • full address: +10
  • at least one social link: +5
  • maximum: 100

It is not a conversion score, solvency score or company-value score.

dataCompleteness is the percentage of these essential fields that are present: name, category, fullAddress, phone, email, website, canton, coordinates.

AI-ready leads

ai_summary is generated locally from fields that actually exist. No LLM API is called. Enable or disable it with includeAiSummary. The summary language follows the selected local.ch language.

Multiple searches in one run

{
"searchTerms": ["plumber", "electrician"],
"locations": ["Lausanne", "Geneva"]
}

This queues four combinations:

  • plumber / Lausanne
  • plumber / Geneva
  • electrician / Lausanne
  • electrician / Geneva

Set maxResultsPerSearch per combination and maxTotalResults for the whole run. When deduplicateResults is true, one business appears once, with every matching search stored in matchedSearches.

Switzerland coverage

Works with Swiss cities, cantons, regions and postal-code style locations, including Lausanne, Geneva, Zürich, Bern, Basel, Lugano, Vaud, Valais and Ticino. Language auto picks French, German or Italian from the location; you can force fr, de, it or en.

How much does it cost?

This Actor uses Pay Per Event pricing.

  • $1.50 per 1,000 valid business leads
  • Equivalent to $0.0015 per valid business-result
  • Duplicates, invalid rows, empty searches and failed requests are not billed

Platform usage is included in the Actor price.

Examples:

  • 100 valid leads: $0.15
  • 1,000 valid leads: $1.50
  • 5,000 valid leads: $7.50
  • 10,000 valid leads: $15.00

Apify Proxy standard datacenter is enabled by default for reliable access to Local.ch.

API

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('USERNAME/local-ch-swiss-business-leads').call({
searchTerms: ['plumber'],
locations: ['Lausanne'],
maxResultsPerSearch: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Python:

from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')
run = client.actor('USERNAME/local-ch-swiss-business-leads').call(run_input={
'searchTerms': ['plumber'],
'locations': ['Lausanne'],
'maxResultsPerSearch': 100,
})
items = client.dataset(run['defaultDatasetId']).list_items().items

curl:

curl "https://api.apify.com/v2/acts/USERNAME~local-ch-swiss-business-leads/runs?token=YOUR_TOKEN" ^
-X POST -H "Content-Type: application/json" ^
-d "{\"searchTerms\":[\"plumber\"],\"locations\":[\"Lausanne\"],\"maxResultsPerSearch\":100}"

Replace USERNAME with your Apify account name after publishing.

Integrations

Use the Apify API, webhooks, or Apify integrations such as n8n, Make and Zapier where Apify provides a connector. MCP / agent users can read the default dataset and the RUN_SUMMARY key-value record.

FAQ

How to scrape Local.ch?

Provide searchTerms and locations. The Actor builds local.ch search URLs, paginates from the public result count, and writes one dataset row per business.

How to get Swiss business leads?

Run a keyword such as dentist, fiduciary or restaurant with a Swiss city or canton. Export JSON, CSV or Excel from the dataset.

Can I export Local.ch businesses to Excel?

Yes. Download the default dataset as CSV or Excel from Apify Console.

Can I get email addresses from Local.ch?

Yes, when the public listing includes an email. Coverage varies by category and by result page. Missing emails stay null.

Can I search businesses by canton?

Yes. Use a canton name or code in locations, for example Vaud, Ticino or VD.

Does it collect private persons?

The Actor is designed for business listings. When local.ch publishes an entry type such as PERSON, that row is skipped. If the type is missing, the Actor does not guess from the name. This has not been proven on a mixed phone-book SERP, so it is not a guarantee that every row is a company. Review localChUrl before outreach.

How much does it cost to scrape Local.ch?

The Actor costs $1.50 per 1,000 valid business leads.

You are charged only for valid business-result rows written to the dataset. Duplicates, invalid rows, empty searches and failed requests are not billed.

Can I use it with AI agents?

Yes. Each row includes ai_summary, localChUrl and a run summary at key RUN_SUMMARY. No LLM is required to produce the summary.

Responsible use

This Actor collects public business information from local.ch. You are responsible for complying with applicable laws, local.ch terms, and your own outreach rules. refusesAdvertising is a source-published signal, not a legal guarantee. This README is not legal advice.

Advanced options

  • includeDetails: visit profile pages for descriptions and opening hours
  • includeOpeningHours: fill openingHours from profile JSON-LD
  • includeSocialLinks: keep Facebook, Instagram, LinkedIn and other public social URLs
  • maxConcurrency / requestDelayMs: keep traffic polite (defaults 5 and 400 ms)
  • proxyConfiguration: Apify Proxy standard datacenter is on by default. Without it, Local.ch returns an HTTP 200 anti-bot page with no listings. Use residential groups only if standard proxy stays blocked.

Support

Use the Issues tab on the Actor page.