# 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, 83.3% 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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Local.ch Scraper - Swiss Business Directory Leads",
        "description": "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.",
        "version": "0.0",
        "x-build-id": "iSXyPX3SL8U4SQ7SR"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/studio-amba~local-ch-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-studio-amba-local-ch-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/studio-amba~local-ch-scraper/runs": {
            "post": {
                "operationId": "runs-sync-studio-amba-local-ch-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/studio-amba~local-ch-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-studio-amba-local-ch-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchQuery": {
                        "title": "Search Query",
                        "type": "string",
                        "description": "Keyword or business type to search for, in German/French/Italian (e.g. 'restaurant', 'sanitar', 'coiffeur').",
                        "default": "restaurant"
                    },
                    "location": {
                        "title": "City / Location (required)",
                        "type": "string",
                        "description": "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": {
                        "title": "Fetch details (full hours, description)",
                        "type": "boolean",
                        "description": "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.",
                        "default": false
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 1,
                        "maximum": 20000,
                        "type": "integer",
                        "description": "Maximum number of businesses to return across all cities.",
                        "default": 100
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Apify proxy settings. local.ch blocks datacenter IPs, so Swiss residential proxies are used by default.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ],
                            "apifyProxyCountry": "CH"
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
