# Local.ch Scraper - Swiss Business Directory Leads (`studio-amba/local-ch-scraper`) Actor

Extract Swiss business leads from local.ch. Search by keyword and location for company name, phone, email, website, full address, category and rating. Data comes from the results page. The site caps each query at ~180 results, so pass one or more cities to segment. Export CSV, JSON, Excel.

- **URL**: https://apify.com/studio-amba/local-ch-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 88.9% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $12.00 / 1,000 result scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Local.ch Scraper — Swiss Business Directory Leads

Extract business leads from [local.ch](https://www.local.ch), Switzerland's leading online business directory and phone book. Search by keyword and city and get company name, phone, email, website, full address, category and rating — straight from the results pages.

### Why use this actor?

Local.ch is the Swiss equivalent of the yellow pages, covering every trade in German, French and Italian-speaking Switzerland. It is an excellent lead source: the results already carry phone, email and website for most listings. This actor turns any keyword and city into a structured list of Swiss businesses with contact details, ready for sales, research or directory building.

### How to scrape Local.ch data

1. Enter a **search query** in German, French or Italian — a business type such as `restaurant`, `sanitär`, `coiffeur` or `garage`.
2. Enter one or more **cities**, comma-separated (for example `Zurich, Bern, Geneva`). A location is needed because local.ch caps each city search at about 180 results — see below.
3. Set **max results**.
4. Click **Start**. The actor reads the structured data embedded in each results page, de-duplicates by business, and returns one clean row per business.
5. Download as **CSV, JSON, Excel** or via the API.

The optional **Fetch details** toggle opens each business page for full weekly opening hours, description, fax and social links.

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `searchQuery` | String | No | Keyword or business type (default: `restaurant`) |
| `location` | String | No | One or more cities, comma-separated (default: `Zurich`). Segment big searches by city |
| `fetchDetails` | Boolean | No | Visit each business page for full hours, description and social links. Slower. Default `false` |
| `maxResults` | Integer | No | Maximum number of businesses to return (default: 100) |
| `proxyConfiguration` | Object | No | Apify proxy settings. Swiss residential proxies are used by default |

#### Example input

```json
{
    "searchQuery": "restaurant",
    "location": "Zurich, Bern, Geneva",
    "maxResults": 300,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "CH"
    }
}
```

### Output

Each result contains:

| Field | Type | Example |
|-------|------|---------|
| `businessName` | String | `"Bar Rossi"` |
| `category` | String | `"Bar"` |
| `address` | String | `"Sihlhallenstrasse 3"` |
| `city` | String | `"Zürich"` |
| `postalCode` | String | `"8004"` |
| `region` | String | canton code when published |
| `phone` | String | `"+41432438025"` |
| `website` | String | `"https://www.bar-rossi.ch/"` |
| `email` | String | `"info@bar-rossi.ch"` |
| `registrationNumber` | String | `""` |
| `extraFields` | Object | `{ "rating": 4.5, "coordinates": { "latitude": 47.37, "longitude": 8.52 }, "social": [...] }` |
| `url` | String | Business page URL |
| `scrapedAt` | String | ISO timestamp |

#### Example output

```json
{
    "businessName": "Bar Rossi",
    "category": "Bar",
    "address": "Sihlhallenstrasse 3",
    "city": "Zürich",
    "postalCode": "8004",
    "region": "",
    "phone": "+41432438025",
    "website": "https://www.bar-rossi.ch/",
    "email": "info@bar-rossi.ch",
    "registrationNumber": "",
    "extraFields": {
        "rating": 4.5,
        "coordinates": { "latitude": 47.379591, "longitude": 8.527295 },
        "isPremium": true,
        "social": [
            { "provider": "INSTAGRAM", "url": "https://www.instagram.com/barrossizuerich/" }
        ]
    },
    "url": "https://www.local.ch/en/d/zurich/8004/bar/bar-rossi-fCFDtKGhok9htNCZvQhQgA",
    "scrapedAt": "2026-07-13T09:35:52.000Z"
}
```

### The 180-per-city cap and why location matters

Local.ch serves 20 businesses per page but blocks pagination past page 9, so a single city search returns at most about 180 businesses. To cover a whole trade nationwide, pass several cities in the `location` field (comma-separated) and the actor walks each one, de-duplicating businesses that appear in more than one search. That is why a location is expected rather than optional — it is how you get complete coverage.

Switzerland's directory blocks datacenter IP addresses, so the actor uses Swiss residential proxies by default. Leave the proxy setting as-is unless you know you need something different.

### Cost estimate

The actor uses plain HTTP (no browser), so it is fast: one request returns 20 businesses. Residential proxy traffic is the main cost driver. Expect roughly a few hundred to a couple of thousand leads per US dollar of Apify usage depending on your plan. `fetchDetails` adds one request per business.

### Limitations

- **~180 results per city.** Segment by passing multiple cities.
- **Datacenter IPs are blocked** — Swiss residential proxies are used by default.
- **Registration numbers are not published** on local.ch.
- Phone and email coverage is high but not 100%; the actor returns every field the site exposes.

### Related Scrapers

- [Panoramafirm.pl Scraper](https://apify.com/jelle.desramaults/panoramafirm-pl-scraper) — Polish business directory leads
- [Allabolag.se Scraper](https://apify.com/jelle.desramaults/allabolag-se-scraper) — Swedish company data, revenue and leads
- [Firmy.cz Scraper](https://apify.com/jelle.desramaults/firmy-cz-scraper) — Czech business directory leads
- [Companies House Scraper](https://apify.com/jelle.desramaults/companies-house-scraper) — UK company registry data
- [KRS Scraper](https://apify.com/jelle.desramaults/krs-scraper) — Polish National Court Register company data
- [Pappers Scraper](https://apify.com/jelle.desramaults/pappers-scraper) — French company registry data

### FAQ

**Do I need a Local.ch account or cookies?**
No. Everything comes from public results pages.

**Why do I have to provide a city?**
Because local.ch caps each search at about 180 results. Searching city by city is how you get past that limit and build complete lists.

**Why residential proxies?**
Local.ch returns 403 to datacenter IP addresses. Swiss residential proxies pass cleanly and are set by default.

# Actor input Schema

## `searchQuery` (type: `string`):

Keyword or business type to search for, in German/French/Italian (e.g. 'restaurant', 'sanitar', 'coiffeur').

## `location` (type: `string`):

One or more cities to search, comma-separated (e.g. 'Zurich, Bern, Geneva'). Required — local.ch caps each city query at ~180 results, so segment by city to cover more.

## `fetchDetails` (type: `boolean`):

Visit each business page for extra data: full weekly opening hours, description, fax and social links. Slower: one extra request per business. Resumable if interrupted.

## `maxResults` (type: `integer`):

Maximum number of businesses to return across all cities.

## `proxyConfiguration` (type: `object`):

Apify proxy settings. local.ch blocks datacenter IPs, so Swiss residential proxies are used by default.

## Actor input object example

```json
{
  "searchQuery": "restaurant",
  "location": "Zurich",
  "fetchDetails": false,
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "CH"
  }
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQuery": "restaurant",
    "location": "Zurich",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "CH"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/local-ch-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQuery": "restaurant",
    "location": "Zurich",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "CH",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/local-ch-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQuery": "restaurant",
  "location": "Zurich",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "CH"
  }
}' |
apify call studio-amba/local-ch-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=studio-amba/local-ch-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/9WToHJWkz2yZpF4JH/builds/iSXyPX3SL8U4SQ7SR/openapi.json
