
Congress Stock Trades Scraper
scrape.ly/store/querystone/congress-trades-scraperNewsBusiness
3 monthly users

Scrape local.ch, Switzerland's business directory, by keyword and city or from local.ch links. Get names, phones, emails, websites, social links, addresses, categories, opening hours, attributes, ratings and reviews.
Turn local.ch, Switzerland's business directory, into a clean lead list. Search by keyword and city (or paste any local.ch link) and get every listing's phones, emails, website, social links, address, opening hours, attributes, rating and reviews. No login, no browser, results in seconds.
Zahnarzt, Restaurant, plombier) and optional locations (e.g. Bern, Genève, 8001), or paste local.ch URLs.| Field | What it does | Example |
|---|---|---|
searchTerms | What to look for, one per line | ["Zahnarzt"] |
locations | Optional cities, postcodes or cantons | ["Bern"] |
startUrls | local.ch search (/s/, /q/) or listing (/d/) links | [{"url": "https://www.local.ch/en/q/zurich/restaurant"}] |
maxItems | Max listings per search (0 = all, the site shows up to 3,000 per search) | 20 |
entryType | all, business or person | business |
onlyWithPhone / onlyWithEmail / onlyWithWebsite | Keep only listings with that contact | true |
minRating | Minimum average stars | 4 |
scrapeDetails | Load full profiles (on by default) | true |
maxReviews | Reviews per listing | 10 |
language | en, de, fr, it | de |
sortBy | relevance, alphanum, rating, distance | rating |
{
"searchTerms": ["Zahnarzt"],
"locations": ["Bern"],
"maxItems": 20,
"entryType": "business",
"onlyWithEmail": true,
"language": "de"
}
| Field | Description |
|---|---|
title, subtitle | Business or person name and subtitle |
mainCategory, categories | Categories in the chosen language |
phone, phones, mobile, whatsapp, fax | Phone numbers in international format |
email, emails | Email addresses |
website, websites, facebook, instagram, linkedin, twitter, youtube, tiktok, socialLinks | Web and social links |
street, zipCode, city, cantonCode, country, latitude, longitude | Address and coordinates |
averageRating, ratingCount, reviewCount, reviews | Ratings and the reviews shown on the profile |
openingHours, openingHoursInfo, opensAt, openStatus | Weekly hours, holiday notes and current status |
attributes, attributeGroups | Languages, payment methods, services, location tags, ... |
description, logo, images, bookingUrl, menuUrl | Profile content |
url, id, lastModified, scrapedAt | Listing link, id and timestamps |
Example (one listing, trimmed; names and contacts are fictional):
{
"id": "aB3dEfGhIjKlMnOpQrStUv",
"title": "Zahnarztpraxis Muster AG",
"subtitle": "eidg. dipl. Zahnarzt",
"entryType": "BUSINESS",
"mainCategory": "Dentist",
"categories": ["Dentist", "Dental hygiene", "Implantology"],
"phone": "+41310000000",
"phones": ["+41310000000"],
"email": "info@zahnarzt-muster.ch",
"website": "https://www.zahnarzt-muster.ch",
"street": "Musterstrasse 6",
"zipCode": 3011,
"city": "Bern",
"cantonCode": "BE",
"country": "CH",
"latitude": 46.9468,
"longitude": 7.4387,
"averageRating": 4.8,
"ratingCount": 12,
"openingHours": ["MONDAY: 07:30-18:00", "TUESDAY: 07:30-18:00", "WEDNESDAY: 07:30-18:00", "THURSDAY: 07:30-18:00", "FRIDAY: 07:30-17:00", "SATURDAY: closed", "SUNDAY: closed"],
"attributes": ["English", "French", "German", "Close to public transport", "Wheelchair-accessible"],
"url": "https://www.local.ch/en/d/bern/3011/dentist/zahnarztpraxis-muster-ag-aB3dEfGhIjKlMnOpQrStUv",
"detailsScraped": true
}
You pay $1.40 per 1,000 listings ($0.0014 per listing saved), plus the run's platform usage (compute and proxy traffic), which is shown on every run.
Is it legal to scrape local.ch? The actor only collects data local.ch shows publicly to every visitor, without logging in. You are responsible for how you use it: Swiss and EU data protection rules apply to personal data, and some listings are marked as not wanting advertising.
Do I need a local.ch account or a proxy? No account. The Scrapely datacenter proxy is set by default and the run moves to Swiss residential exits on its own if it is refused.
How many results can I get? local.ch shows at most 3,000 listings per search. For more, split the search by city, postcode or canton, or use several terms; duplicates across searches are removed.
Why is a field empty? Listings only show what the business published. Many have no email or social links, and private phone book entries have no website or hours. Use the filters to keep only listings with the contacts you need.
Can I schedule it or use the API? Yes. Save a task, schedule it daily or weekly, and fetch results through the API or integrations.
scrapeDetails on.Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
searchTermsarrayOptionalSearch terms
What to look for, one per line, in German, French, Italian or English, e.g. 'Restaurant', 'Zahnarzt', 'plombier', 'Treuhand'. Each term is searched in every location below. A term can also hold the place, e.g. 'Coiffeur Luzern'.
locationsarrayOptionalLocations
Optional Swiss cities, towns, postcodes or cantons to search in, one per line, e.g. 'Zürich', 'Genève', '3011', 'Ticino'. Leave empty to search all of Switzerland.
startUrlsarrayOptionallocal.ch URLs
Paste local.ch links instead of (or as well as) search terms: search result pages with any filters and sorting applied (https://www.local.ch/en/s/Restaurant%20Basel?filter_facet=attr_services_offer%3Aaperitif, https://www.local.ch/de/q/zurich/zahnarzt) or single listing pages (https://www.local.ch/en/d/...). Every search link is its own search.
maxItemsintegerOptionaldefault 20Max results per search
How many listings to save for each search term x location or search URL. 0 = everything the search has (local.ch shows at most 3,000 per search, so split big searches by city).
Keep only the listings you want. Listings that fail a filter are skipped and never charged.
minRatingnumberOptionalMinimum rating
Keep only listings with an average rating of at least this many stars (1 to 5). Listings without ratings are skipped when this is set.
entryTypeenumOptionaldefault "all"Listing type
local.ch also lists private phone book entries. Choose businesses only for lead lists.
onlyWithPhonebooleanOptionaldefault falseOnly listings with a phone number
Skip listings that show no phone or mobile number.
onlyWithEmailbooleanOptionaldefault falseOnly listings with an email
Skip listings that show no email address.
onlyWithWebsitebooleanOptionaldefault falseOnly listings with a website
Skip listings that show no website.
scrapeDetailsbooleanOptionaldefault trueFull profiles
Open each listing's profile for every phone, email, website and social link, opening hours, attributes (languages, payment, services), the description and reviews. Turn off for the search-card fields only (name, address, category, rating, some contacts), which is faster.
maxReviewsintegerOptionaldefault 10Max reviews per listing
How many of the reviews shown on a listing's profile to include (0 = none).
languageenumOptionaldefault "en"Language
Language of category names, attributes, opening-hours notes and translated descriptions. Links you paste keep their own language.
sortByenumOptionaldefault "relevance"Sort by
Order of the results, which decides which listings come first when the maximum is lower than the number of matches. Links that already have a sorting keep it.
Datacenter exits work for local.ch; the run moves to Swiss residential exits on its own if they get refused.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy
Proxy for the requests to local.ch.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| id | string | null | local.ch listing id |
| title | string | null | Business or person name |
| subtitle | string | null | Subtitle: company name, specialty or slogan |
| entryType | string | null | BUSINESS or PERSON |
| placeType | string | null | Schema.org place type |
| mainCategory | string | null | Main category |
| categories | array | null | All categories |
| phone | string | null | First phone number (international format) |
| phones | array | null | All phone and mobile numbers |
| mobile | string | null | Mobile number |
| string | null | WhatsApp number | |
| fax | string | null | Fax number |
| string | null | First email | |
| emails | array | null | All emails |
| website | string | null | First website |
| websites | array | null | All websites |
| string | null | Facebook page | |
| string | null | Instagram profile | |
| string | null | LinkedIn page | |
| string | null | X / Twitter profile | |
| youtube | string | null | YouTube channel |
| tiktok | string | null | TikTok profile |
| socialLinks | object | null | All social media links by network |
| street | string | null | Street and number |
| houseAdditionalText | string | null | Address addition |
| zipCode | number | null | Postcode |
| city | string | null | City |
| cantonCode | string | null | Canton code, e.g. ZH |
| country | string | null | Country code |
| poBoxZipCode | number | null | PO box postcode |
| poBoxCity | string | null | PO box city |
| latitude | number | null | Latitude |
| longitude | number | null | Longitude |
| averageRating | number | null | Average rating (0-5) |
| ratingCount | number | null | Number of ratings |
| reviewCount | number | null | Number of written reviews |
| displayAverageRating | boolean | null | Whether local.ch shows the average |
| reviews | array | null | Reviews shown on the profile |
| openingHours | array | null | Weekly opening hours, one line per day |
| openingHoursInfo | array | null | Holiday closures and notes |
| opensAt | string | null | Next opening or closing time |
| openStatus | string | null | OPEN_UNTIL, OPENS_AT, ... |
| attributes | array | null | All attributes |
| attributeGroups | object | null | Attributes by group (languages, payment, services, ...) |
| description | string | null | Profile description (plain text) |
| descriptionTitle | string | null | Description heading |
| descriptionLanguage | string | null | Language of the description |
| descriptionOriginalLanguage | string | null | Original language of the description |
| hasMachineTranslatedDescription | boolean | null | Description was machine translated |
| logo | string | null | Logo image URL |
| images | array | null | Image URLs |
| bookingUrl | string | null | Online booking or ordering link |
| menuUrl | string | null | Menu link |
| isPremium | boolean | null | Premium listing |
| professionalTitle | string | null | Professional title (persons) |
| provider | string | null | Data provider |
| language | string | null | Listing language |
| lastModified | string | null | Last update of the listing |
| url | string | null | local.ch listing URL |
| detailsScraped | boolean | null | Full profile was loaded |
| searchUrl | string | null | Search the listing came from |
| scrapedAt | string | null | When it was scraped |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Listing | One saved local.ch listing. | $0.0014 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('cornerledger/local-ch-scraper').call({
"searchTerms": [
"Zahnarzt"
],
"locations": [
"Bern"
],
"maxItems": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run cornerledger/local-ch-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=cornerledger/local-ch-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Companies only, each with an email address, sorted by rating.
Names, addresses, phones, websites and ratings straight from the search results, without opening each profile.
Paste any local.ch search link with its filters and get full profiles of the matching listings.
Full profiles from Ticino with Italian categories and descriptions.
Every contact, opening hours, attributes, description and reviews of a single business.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.