local.ch · Swiss Business Leads by Category or URL avatar

local.ch · Swiss Business Leads by Category or URL

Pricing

from $1.40 / 1,000 business profile retrieveds

Go to Apify Store
local.ch · Swiss Business Leads by Category or URL

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

Corentin Robert

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

3 days ago

Last modified

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=).

MethodPathRequestResponse
GET / POST/lookupficheUrl or url (/d/ profile only, max 5){ items, count, failed, budgetExhausted, cap }
GET/Header x-apify-container-server-readiness-probeOK

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 goalSuggested setup
Swiss SDR / outboundCall list in one cityCategory dentiste · City geneve · Max 25
Agency / local SEOTerritory mapCategory + several cities as extra search URLs
CRM opsRefresh numbers on known linksProfile URLs mode
Healthcare BDPractitioners + treatmentsCategory dentiste / chirurgien · Contacts view
Market researchCoverage by cantonNationwide 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

  1. Leave What do you need? on Search.
  2. Keep Category on Dentist and City geneve (or pick Lawyer, Restaurant, …).
  3. 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)

ExampleBest for
Dentists in GenevaHealthcare outbound · GE
Restaurants in ZurichHospitality · ZH
Lawyers in BernProfessional services · BE
Enrich local.ch profile URLsCRM 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.

ModeWhat it does
SearchCategory + city (or pasted listing URL) → paginated results → full profiles
Profile URLsOnly 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?

CategoryFields
IdentityName, subtitle, primary specialty, categories
ContactsPhone, email, website, WhatsApp, social URLs, booking URLs
GeoStreet, city, postal code, GPS, map URL
ProfileLanguages, treatments, payment methods, opening hours, description
ReputationRating, rating count, online booking flag
Linklocal.ch profile URL

How it works

  1. Build or reuse a local.ch search (category + city, or a pasted listing URL).
  2. Walk result pages and collect profile links.
  3. Open each public profile and flatten contacts into one row.
  4. 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.

ScenarioRows billedFREEBronzeSilverGold
25 businesses (Try)25~$0.05~$0.05~$0.04~$0.04
250 businesses250~$0.50~$0.45~$0.40~$0.35
1,000 businesses1,000$2.00$1.80$1.60$1.40

Row prices fall on higher Apify plans. Residential proxy is not required by default.


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

FieldConsoleDescription
scrapeModeYesSearch or Profile URLs
categoryYesDropdown: dentiste, avocat, restaurant, … or custom
customCategoryIf OtherFree local.ch slug (osteopathe, …)
locationYesCity or canton slug; blank = nationwide
languageYesfr / de / it / en
searchUrlsYesOptional pasted /s/ listing URLs
profileUrlsYes/d/ profile links (Profile URLs mode)
maxItemsYesRow cap; 0 = no numerical cap
requirePhone / requireEmailYesKeep only rows with that contact
startUrlsAPILegacy 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 install
npm test
apify 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