# local.ch Scraper - Swiss Business Directory (`crawlerbros/local-ch-scraper`) Actor

Scrape local.ch, Switzerland's leading business directory. Search by category and city/canton, or fetch full business profiles by URL. Get names, addresses, phone numbers, emails, websites, ratings, opening hours, coordinates, and social links.

- **URL**: https://apify.com/crawlerbros/local-ch-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

Scrape **local.ch** — Switzerland's leading business directory. Search any business category in any Swiss city or canton and get names, addresses, phone numbers, ratings, opening status, and websites. Optionally follow through to each business's full profile page for email, website, social links, precise GPS coordinates, structured opening hours, and photos. No login, no cookies, no API key required.

### What this actor does

- **Two modes:** `search` (category + city/canton) and `detail` (direct business profile URLs)
- **75+ curated categories** to pick from, or type any custom category (local.ch matches free text like a keyword search)
- **All 26 Swiss cantons** available as a one-click filter, in addition to free-text city search
- **4 languages** — English, German, French, Italian (same underlying data, localized labels)
- **Sort by** relevance, rating, or name (A-Z)
- **Filter by** "open now" or minimum star rating (1-5)
- **Full Swiss character support** — ü, é, à, ç etc. are handled correctly in both input and output
- **Rich business profiles** — GPS coordinates, structured opening hours, email, website, Facebook/Instagram/LinkedIn/Twitter/YouTube links, photos, logo
- **Empty fields are omitted** — you only ever see fields that were actually found for a business

### Output per business

- `name` — business name
- `subtitle` — short business-provided subtitle shown under the name (sometimes a legal entity name, sometimes a tagline; when profile fetched)
- `category` — primary listed category, `categories[]` — all registered categories (mode=search)
- `rating`, `ratingCount` — average star rating (1-5) and total number of ratings
- `reviewCount` — number of written reviews (when profile fetched; distinct from `ratingCount`, which includes star-only ratings)
- `street`, `zipCode`, `city`, `country`
- `latitude`, `longitude` — precise GPS coordinates (when profile fetched)
- `isOpenNow` — live open/closed status from the search listing
- `openingHours[]` — structured opening hours (`{day, opens, closes}` per slot; when profile fetched and the business publishes schema.org hours)
- `phone`, `email`, `website`
- `facebookUrl`, `instagramUrl`, `linkedinUrl`, `twitterUrl`, `youtubeUrl` — social links the business has published (when profile fetched)
- `thumbnailUrl` — small logo/photo thumbnail shown on the search-results card (mode=search, no `fetchDetails` needed)
- `images[]`, `logoUrl` — business photos and logo (when profile fetched)
- `searchCategory`, `searchLocation`, `language` — the search parameters used (mode=search)
- `sourceUrl` — canonical local.ch profile URL for the business
- `recordType: "business"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string (select) | `search` | `search` (category + city/canton) or `detail` (fetch by URL) |
| `category` | string (select) | `restaurant` | Pick a common category, or `custom` to use `customCategory` (mode=search) |
| `customCategory` | string | – | Any free-text category, overrides `category` (mode=search) |
| `location` | string | `Zurich` | Swiss city or canton name to search in (mode=search) |
| `canton` | string (select) | – | Pick one of the 26 Swiss cantons to search the whole canton instead of `location` |
| `language` | string (select) | `en` | Site language: `en`, `de`, `fr`, `it` |
| `sortBy` | string (select) | `relevance` | `relevance` / `rating` (highest first) / `name` (A-Z) — applied client-side across the fetched batch |
| `openNowOnly` | boolean | `false` | Only return businesses currently open |
| `minRating` | integer | `0` (no minimum) | Only return businesses rated at least 1-5 stars |
| `fetchDetails` | boolean | `false` | Also visit each business's profile page for richer data (slower) |
| `businessUrls` | array | – | local.ch profile URLs to fetch directly (mode=detail) |
| `maxItems` | int | `20` | Hard cap on returned records (1-1000) |

#### Example: search restaurants in Zurich

```json
{
  "mode": "search",
  "category": "restaurant",
  "location": "Zurich",
  "maxItems": 20
}
````

#### Example: highest-rated dentists in Geneva, with full profiles

```json
{
  "mode": "search",
  "category": "dentist",
  "location": "Geneva",
  "sortBy": "rating",
  "fetchDetails": true,
  "maxItems": 30
}
```

#### Example: 4+ star restaurants open right now across all of Ticino canton

```json
{
  "mode": "search",
  "category": "restaurant",
  "canton": "ticino",
  "openNowOnly": true,
  "minRating": 4,
  "maxItems": 50
}
```

#### Example: lawyers across the whole of Switzerland, A-Z, in French

```json
{
  "mode": "search",
  "category": "attorneys-at-law",
  "location": "Switzerland",
  "language": "fr",
  "sortBy": "name",
  "maxItems": 100
}
```

#### Example: fetch specific business profiles

```json
{
  "mode": "detail",
  "businessUrls": [
    { "url": "https://www.local.ch/en/d/zurich/8001/restaurant/george-bar-grill-E2FE14_t_A8FFW9_xUkXBQ" }
  ]
}
```

### Use cases

- **Local lead generation** — build a prospect list of Swiss businesses by trade and city/canton for B2B outreach
- **Market research** — measure business density and average ratings for a category across Swiss regions
- **Directory aggregation** — feed structured Swiss business data into your own local-search product
- **Competitor mapping** — see who else operates in a category and area, with ratings and contact info
- **Franchise & site-selection analysis** — evaluate service-business coverage across cantons and cities

### Limitations

- **Deep pagination on very broad searches.** local.ch enforces a per-IP rate limit on its search-results pages of roughly 9 page requests before returning 403s (confirmed via testing: this triggers at a fixed request count, not a request-rate/time window). In practice this caps a single run at roughly 150-180 records for very broad, single-category-nationwide searches (e.g. `category: "restaurant"`, `location: "Switzerland"`). The actor automatically rotates through Apify's free AUTO proxy to recover from this where possible and always returns every record it collected before the limit hit (never an empty/failed run). For larger volumes, run multiple smaller searches (e.g. one per city or canton) instead of one very broad nationwide pull — city- and canton-scoped searches rarely reach this limit.
- **`sortBy` is applied client-side.** local.ch's search-results pages don't honor a server-side sort parameter (verified: `?sort=rating` returns results in the same order as no sort parameter), so `rating`/`name` sorting is applied across the batch of records this run actually fetched, not the entire category.
- **`openNowOnly` and `minRating` are applied client-side.** A business with no open/closed badge or no rating on local.ch is only excluded by `minRating` (which requires a rating to compare against); it is *not* excluded by `openNowOnly`, since an unknown status is treated as "don't filter this one out" rather than "closed".

### FAQ

**What data source does this actor use?**
It reads the publicly available search and business-profile pages on local.ch, Switzerland's leading business directory. No account or API key is needed.

**Is this affiliated with local.ch?**
No. This is an independent, third-party actor that reads publicly accessible pages.

**Why do some businesses have no rating, phone, or website?**
local.ch only shows a rating once a business has received at least one review, and only shows contact/social details a business itself provided. Fields with no data are simply omitted from the record rather than shown as empty or null.

**What's the difference between `ratingCount` and `reviewCount`?**
`ratingCount` is the total number of star ratings a business has received. `reviewCount` is the (usually smaller) number of ratings that include a written review. Both come directly from local.ch's own aggregate rating data.

**Can I search a whole canton instead of a single city?**
Yes — set `canton` to any of the 26 Swiss cantons; it takes priority over `location`. You can also just type a canton name (e.g. `"Vaud"`) directly into `location`.

**Can I search all of Switzerland at once?**
Yes — set `location` to `"Switzerland"` (or leave both `location`/`canton` and just rely on the default) for a nationwide search.

**How accurate are the GPS coordinates?**
`latitude`/`longitude` come directly from the business's own local.ch profile page (only available with `fetchDetails: true` in search mode, or always in `detail` mode).

**Why is `fetchDetails` off by default?**
Fetching each business's full profile page requires one extra request per result, which is slower. Turn it on when you need email, website, social links, coordinates, structured opening hours, or photos.

**Does this actor need a proxy or login?**
No — local.ch's search and profile pages are served without any anti-bot challenge, so this actor runs entirely on Apify's free plan with no proxy and no credentials.

**What does `subtitle` mean?**
local.ch lets businesses show a short line under their name. For registered companies this is often their legal entity name (e.g. `"Selnau Gastro AG"`); for others it can be a marketing tagline or keyword list. It's included as-is since we can't reliably tell the two apart.

# Actor input Schema

## `mode` (type: `string`):

What to fetch: search a category + city/canton, or fetch full business profiles from direct local.ch URLs.

## `category` (type: `string`):

Business category to search for. Pick a common category, or choose 'Custom category' and type your own below (mode=search).

## `customCategory` (type: `string`):

Free-text category not in the curated list above, e.g. 'Locksmith' or 'IT services' (mode=search). Takes priority over 'Category' when set. local.ch matches this like a keyword search, so most English/German/French/Italian business terms work.

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

Swiss city, town, or canton to search in, e.g. 'Zurich', 'Geneva', 'Lugano', 'Basel'. Overridden by 'Canton' below when that is set (mode=search).

## `canton` (type: `string`):

Search an entire Swiss canton instead of a single city. Takes priority over 'City or canton' when set (mode=search).

## `language` (type: `string`):

Language edition of local.ch to scrape from. Same underlying business data; affects category/label translations in the raw page (does not change output field names).

## `sortBy` (type: `string`):

How to order search results after fetching (mode=search). local.ch itself only returns relevance order, so 'rating' and 'name' are applied client-side across the fetched batch.

## `openNowOnly` (type: `boolean`):

Only return businesses that are currently open, based on local.ch's own open/closed badge (mode=search).

## `minRating` (type: `integer`):

Only return businesses rated at least this many stars, e.g. 4 for 4.0+ (mode=search). 0 means no minimum. Applied client-side; businesses with no rating are excluded once this is set above 0.

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

For each search result, also visit its business profile page to collect email, website, social links, precise coordinates, full opening hours, and photos. Slower -- one extra request per result (mode=search).

## `businessUrls` (type: `array`):

Direct local.ch business profile URLs to fetch, e.g. https://www.local.ch/en/d/zurich/8001/restaurant/some-business-abc123. Use the 'sourceUrl' field from search results.

## `maxItems` (type: `integer`):

Hard cap on the number of business records to return.

## Actor input object example

```json
{
  "mode": "search",
  "category": "restaurant",
  "location": "Zurich",
  "canton": "",
  "language": "en",
  "sortBy": "relevance",
  "openNowOnly": false,
  "minRating": 0,
  "fetchDetails": false,
  "businessUrls": [],
  "maxItems": 20
}
```

# Actor output Schema

## `businesses` (type: `string`):

Dataset containing all scraped local.ch business listings.

# 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 = {
    "mode": "search",
    "category": "restaurant",
    "location": "Zurich",
    "canton": "",
    "language": "en",
    "sortBy": "relevance",
    "openNowOnly": false,
    "minRating": 0,
    "fetchDetails": false,
    "businessUrls": [],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/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 = {
    "mode": "search",
    "category": "restaurant",
    "location": "Zurich",
    "canton": "",
    "language": "en",
    "sortBy": "relevance",
    "openNowOnly": False,
    "minRating": 0,
    "fetchDetails": False,
    "businessUrls": [],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/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 '{
  "mode": "search",
  "category": "restaurant",
  "location": "Zurich",
  "canton": "",
  "language": "en",
  "sortBy": "relevance",
  "openNowOnly": false,
  "minRating": 0,
  "fetchDetails": false,
  "businessUrls": [],
  "maxItems": 20
}' |
apify call crawlerbros/local-ch-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "local.ch Scraper - Swiss Business Directory",
        "description": "Scrape local.ch, Switzerland's leading business directory. Search by category and city/canton, or fetch full business profiles by URL. Get names, addresses, phone numbers, emails, websites, ratings, opening hours, coordinates, and social links.",
        "version": "1.0",
        "x-build-id": "qXsoEXbkrgVzxyrCt"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/crawlerbros~local-ch-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-crawlerbros-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/crawlerbros~local-ch-scraper/runs": {
            "post": {
                "operationId": "runs-sync-crawlerbros-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/crawlerbros~local-ch-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-crawlerbros-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",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "search",
                            "detail"
                        ],
                        "type": "string",
                        "description": "What to fetch: search a category + city/canton, or fetch full business profiles from direct local.ch URLs.",
                        "default": "search"
                    },
                    "category": {
                        "title": "Category",
                        "enum": [
                            "custom",
                            "restaurant",
                            "bar",
                            "internet-cafe",
                            "bakery-pastry-shop",
                            "butcher",
                            "hotel",
                            "bed-and-breakfast",
                            "campsite",
                            "holiday-apartment",
                            "hairdresser",
                            "beauty-center",
                            "nail-studio",
                            "tattoo",
                            "yoga",
                            "fitness-center",
                            "spa",
                            "dentist",
                            "doctors",
                            "veterinary-practice",
                            "pharmacy",
                            "optician",
                            "physical-therapy",
                            "chiropractor",
                            "orthodontics",
                            "gynaecology-and-obstetrics",
                            "attorneys-at-law",
                            "lawyers-office",
                            "notary-public",
                            "law-firm-notary-public",
                            "tax-advice",
                            "tax-experts",
                            "audit-firm",
                            "accounting",
                            "consulting-office",
                            "architectural-firm",
                            "engineering-firms",
                            "construction-company",
                            "carpenter",
                            "electric-installations",
                            "sanitary-facilities",
                            "car-body-work",
                            "car-dealership",
                            "car-rentals",
                            "real-estate",
                            "insurance",
                            "bank-savings-bank",
                            "cleaning-company",
                            "laundry-service",
                            "international-moving",
                            "employment-agency",
                            "translations",
                            "web-design",
                            "aerial-photography",
                            "boutique",
                            "shoes",
                            "jeweler",
                            "bookstore",
                            "toys",
                            "electronics",
                            "furniture-factory",
                            "garden-center",
                            "hardware",
                            "florist",
                            "confectioners",
                            "ice-cream-parlors",
                            "pizzeria",
                            "casinos",
                            "concerts",
                            "art-school",
                            "language-schools",
                            "automobile-driving-school",
                            "kindergarten",
                            "acupoint-massage",
                            "nightclub",
                            "cinema"
                        ],
                        "type": "string",
                        "description": "Business category to search for. Pick a common category, or choose 'Custom category' and type your own below (mode=search).",
                        "default": "restaurant"
                    },
                    "customCategory": {
                        "title": "Custom category (overrides selection above)",
                        "type": "string",
                        "description": "Free-text category not in the curated list above, e.g. 'Locksmith' or 'IT services' (mode=search). Takes priority over 'Category' when set. local.ch matches this like a keyword search, so most English/German/French/Italian business terms work."
                    },
                    "location": {
                        "title": "City or canton",
                        "type": "string",
                        "description": "Swiss city, town, or canton to search in, e.g. 'Zurich', 'Geneva', 'Lugano', 'Basel'. Overridden by 'Canton' below when that is set (mode=search).",
                        "default": "Zurich"
                    },
                    "canton": {
                        "title": "Canton (overrides city/canton above)",
                        "enum": [
                            "",
                            "zurich",
                            "bern",
                            "lucerne",
                            "uri",
                            "schwyz",
                            "obwalden",
                            "nidwalden",
                            "glarus",
                            "zug",
                            "fribourg",
                            "solothurn",
                            "basel-stadt",
                            "basel-landschaft",
                            "schaffhausen",
                            "appenzell-ausserrhoden",
                            "appenzell-innerrhoden",
                            "st-gallen",
                            "graubuenden",
                            "aargau",
                            "thurgau",
                            "ticino",
                            "vaud",
                            "valais",
                            "neuchatel",
                            "geneva",
                            "jura"
                        ],
                        "type": "string",
                        "description": "Search an entire Swiss canton instead of a single city. Takes priority over 'City or canton' when set (mode=search).",
                        "default": ""
                    },
                    "language": {
                        "title": "Site language",
                        "enum": [
                            "en",
                            "de",
                            "fr",
                            "it"
                        ],
                        "type": "string",
                        "description": "Language edition of local.ch to scrape from. Same underlying business data; affects category/label translations in the raw page (does not change output field names).",
                        "default": "en"
                    },
                    "sortBy": {
                        "title": "Sort order",
                        "enum": [
                            "relevance",
                            "rating",
                            "name"
                        ],
                        "type": "string",
                        "description": "How to order search results after fetching (mode=search). local.ch itself only returns relevance order, so 'rating' and 'name' are applied client-side across the fetched batch.",
                        "default": "relevance"
                    },
                    "openNowOnly": {
                        "title": "Open now only",
                        "type": "boolean",
                        "description": "Only return businesses that are currently open, based on local.ch's own open/closed badge (mode=search).",
                        "default": false
                    },
                    "minRating": {
                        "title": "Minimum rating",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Only return businesses rated at least this many stars, e.g. 4 for 4.0+ (mode=search). 0 means no minimum. Applied client-side; businesses with no rating are excluded once this is set above 0.",
                        "default": 0
                    },
                    "fetchDetails": {
                        "title": "Fetch full business profiles",
                        "type": "boolean",
                        "description": "For each search result, also visit its business profile page to collect email, website, social links, precise coordinates, full opening hours, and photos. Slower -- one extra request per result (mode=search).",
                        "default": false
                    },
                    "businessUrls": {
                        "title": "Business profile URLs (mode=detail)",
                        "type": "array",
                        "description": "Direct local.ch business profile URLs to fetch, e.g. https://www.local.ch/en/d/zurich/8001/restaurant/some-business-abc123. Use the 'sourceUrl' field from search results.",
                        "items": {
                            "type": "object",
                            "properties": {
                                "url": {
                                    "title": "URL",
                                    "type": "string",
                                    "description": "local.ch business profile URL."
                                }
                            }
                        },
                        "default": []
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Hard cap on the number of business records to return.",
                        "default": 20
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
