local.ch · Swiss Business Leads by Category or URL
Pricing
from $1.40 / 1,000 business profile retrieveds
local.ch · Swiss Business Leads by Category or URL
Export Swiss businesses from local.ch — phone, email, website, address, GPS, ratings. Search by category and city or paste a listing URL. One row per business. No login.
Pricing
from $1.40 / 1,000 business profile retrieveds
Rating
0.0
(0)
Developer
Corentin Robert
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
local.ch · Swiss Business Leads
Build contact-ready lists of Swiss businesses from local.ch — phone, email, website, address, GPS and ratings when the profile publishes them.
Pick a category + city, or paste a listing URL. One row per business. CSV, Excel, or JSON.
No login. No API key. No account on local.ch.
Built for outbound, agencies, and CRM ops — see Who is this for? below.
Standby lookup (HTTP)
Console Start is unchanged: pick a category + city (or paste listing URLs), run, download the dataset.
Need one local.ch fiche (or a few) in n8n, Make, or your own app? Use the Standby tab hostname. Authenticate with Authorization: Bearer <APIFY_TOKEN> (or ?token=).
| Method | Path | Request | Response |
|---|---|---|---|
GET / POST | /lookup | ficheUrl or url (/d/ profile only, max 5) | { items, count, failed, budgetExhausted, cap } |
GET | / | Header x-apify-container-server-readiness-probe | OK |
Hard cap: 5 profiles per request. Category and search crawls stay on Start. Same PPE as a dataset row. First byte timeout: 5 minutes.
curl -H "Authorization: Bearer $APIFY_TOKEN" \"https://<user>--local-ch-scraper.apify.actor/lookup?ficheUrl=https://www.local.ch/fr/d/geneve-ge/1201/dentiste/example-id"
Standby memory 2048 MB, idle 60 s (Console → Actor → Standby).
Who is this for?
| You are… | Typical goal | Suggested setup |
|---|---|---|
| Swiss SDR / outbound | Call list in one city | Category dentiste · City geneve · Max 25 |
| Agency / local SEO | Territory map | Category + several cities as extra search URLs |
| CRM ops | Refresh numbers on known links | Profile URLs mode |
| Healthcare BD | Practitioners + treatments | Category dentiste / chirurgien · Contacts view |
| Market research | Coverage by canton | Nationwide category (city blank) · Max 0 |
What you get by default: name, category, phone, email when published, website (WhatsApp stored separately), address, GPS, ratings, languages, treatments, opening hours, profile URL.
Typical fill (10 Geneva dentist profiles, May 2026 sample): ~100% phone, ~100% email, ~70% real website, ~100% address. Unclaimed or generic listings elsewhere fill lower — empty email is expected, not a scrape miss.
Quick start
- Leave What do you need? on Search.
- Keep Category on Dentist and City
geneve(or pick Lawyer, Restaurant, …). - Click Start — export from the Dataset tab.
Set Max businesses to 0 for an uncapped listing.
Already searched on local.ch?
Paste /fr/s/… or /de/s/… URLs into local.ch search URL(s). Combined with category + city when both are set.
Ready-made examples (published tasks)
| Example | Best for |
|---|---|
| Dentists in Geneva | Healthcare outbound · GE |
| Restaurants in Zurich | Hospitality · ZH |
| Lawyers in Bern | Professional services · BE |
| Enrich local.ch profile URLs | CRM refresh |
What does this Actor do?
local.ch is Switzerland’s main business directory. This Actor lists matching profiles, opens each public page, and flattens contacts into one export row.
| Mode | What it does |
|---|---|
| Search | Category + city (or pasted listing URL) → paginated results → full profiles |
| Profile URLs | Only the /d/ links you paste |
French, German, Italian and English listing URLs are supported (/fr/s/, /de/s/, /it/s/, /en/s/).
What data does it extract?
| Category | Fields |
|---|---|
| Identity | Name, subtitle, primary specialty, categories |
| Contacts | Phone, email, website, WhatsApp, social URLs, booking URLs |
| Geo | Street, city, postal code, GPS, map URL |
| Profile | Languages, treatments, payment methods, opening hours, description |
| Reputation | Rating, rating count, online booking flag |
| Link | local.ch profile URL |
How it works
- Build or reuse a local.ch search (category + city, or a pasted listing URL).
- Walk result pages and collect profile links.
- Open each public profile and flatten contacts into one row.
- Optional filters keep only rows with a phone or an email (skipped rows are not billed).
How much does it cost to scrape local.ch?
Pay per exported business row, plus a tiny actor-start charge. Swiss datacenter proxy is applied automatically on cloud runs.
| Scenario | Rows billed | FREE | Bronze | Silver | Gold |
|---|---|---|---|---|---|
| 25 businesses (Try) | 25 | ~$0.05 | ~$0.05 | ~$0.04 | ~$0.04 |
| 250 businesses | 250 | ~$0.50 | ~$0.45 | ~$0.40 | ~$0.35 |
| 1,000 businesses | 1,000 | $2.00 | $1.80 | $1.60 | $1.40 |
Row prices fall on higher Apify plans. Residential proxy is not required by default.
Is it legal to scrape local.ch?
This Actor only reads public local.ch profile pages. Rows may include names, phones and emails. Ensure your use complies with Swiss FADP / GDPR and local.ch terms.
Input
| Field | Console | Description |
|---|---|---|
scrapeMode | Yes | Search or Profile URLs |
category | Yes | Dropdown: dentiste, avocat, restaurant, … or custom |
customCategory | If Other | Free local.ch slug (osteopathe, …) |
location | Yes | City or canton slug; blank = nationwide |
language | Yes | fr / de / it / en |
searchUrls | Yes | Optional pasted /s/ listing URLs |
profileUrls | Yes | /d/ profile links (Profile URLs mode) |
maxItems | Yes | Row cap; 0 = no numerical cap |
requirePhone / requireEmail | Yes | Keep only rows with that contact |
startUrls | API | Legacy alias |
Example — dentists in Geneva, 25 rows
{"scrapeMode": "full","category": "dentiste","location": "geneve","language": "fr","maxItems": 25}
Output example
{"name": "Clinique dentaire Cornavin","medicalSpecialty": "Clinique dentaire","phone": "+41 22 557 93 79","email": "dentistecornavin@gmail.com","websiteUrl": "https://www.dentiste-cornavin.ch","whatsappUrl": null,"socialUrls": [],"bookingUrls": [],"address": "Rue de Cornavin 5, 1201 Genève","city": "Genève","zipCode": "1201","openingHours": [{ "day": "Monday", "opens": "08:00", "closes": "19:00" }],"openingHoursText": "Mon 08:00–19:00","ratingValue": null,"profileUrl": "https://www.local.ch/fr/d/geneve/1201/clinique-dentaire/clinique-dentaire-cornavin-waGXhz8QOBLB3z84YDo88A"}
Missing contacts, hours, or ratings are null or [] — never "-".
Dataset views: Overview, Contacts, Business profiles.
FAQ
Why is email empty? Many listings publish a phone but no mailbox. Turn on Only rows with an email if you need a mail-ready list.
Why is website empty when I see WhatsApp? WhatsApp links (wa.me) are stored in whatsappUrl, not as the company website.
Do I need a local.ch account? No.
French and German searches? Yes — set Language or paste a /de/s/… URL.
Local development
npm installnpm testapify run --input-file=./input.json.example
Also available
OneDoc practitioner scraper — Swiss medical booking profiles (specialties, expertises, booking flags).
Ameli Health Directory — French practitioners by specialty and city.
Many teams run local.ch + OneDoc and merge in the CRM.
Support
Custom Swiss watches or CRM push: corentin@outreacher.fr