
Global Sources Supplier Scraper
scrape.ly/store/cornerledger/globalsources-scraperLead generationE-commerce
2 monthly users

Scrape Swiss job listings from jobs.ch and jobup.ch: title, company, workload %, contract type, location and canton, salary when published, full description, apply link and contact. Search by keyword, URL or company with filters.
Get Swiss job listings from jobs.ch, Switzerland's largest job board, and its French-speaking sister site jobup.ch. Search by keyword, paste any search, job or company URL, or type an employer's name, and get clean rows with title, company, workload (Pensum), contract type, canton, salary when published, the full description, apply link and contact person. No login and no browser: 1,000 complete listings take well under a minute.
Software Engineer, Pflegefachfrau, comptable), or paste jobs.ch / jobup.ch URLs, or enter company names.Zürich, ZG, 3011), workload %, contract type, posted within N days and more.| Field | What it does |
|---|---|
searchQueries | Keywords; each one runs as its own search, results are deduplicated. Empty = all jobs matching the filters. |
startUrls | jobs.ch or jobup.ch search URLs (their filters are used), single job URLs or company pages. |
companyNames | All open jobs of these employers. |
maxResults / maxResultsPerQuery | Total cap (0 = no limit, up to 100,000) and an optional cap per search. |
locations, regions | Cities, postal codes or canton codes; jobs.ch regions. |
workloadMin / workloadMax | Workload (Pensum) range in percent. |
contractTypes, positionLevels | Permanent, temporary, freelance, internship, apprenticeship, side job; executive, specialist, employee. |
postedWithinDays | Only jobs first published in the last N days. |
occupationalFields, industries, companyTypes, excludeAgencies | Narrow by field, industry or employer type. |
workFromHome, requiredLanguages | Home office jobs only; jobs asking for German, French, English or Italian. |
titleKeywords / excludeTitleKeywords | Keep or drop jobs by words in the title (filtered jobs are free). |
site, sortBy, semanticSearch | jobs.ch, jobup.ch or both; relevance or newest; the site's AI search. |
includeDetails, includeCompanyDetails, includeHtml, language | What to load and the language of the links. |
{
"searchQueries": ["Software Engineer", "Data Engineer"],
"locations": ["Zürich", "ZG"],
"workloadMin": 80,
"contractTypes": ["permanent"],
"postedWithinDays": 7,
"excludeAgencies": true,
"sortBy": "newest",
"maxResults": 200
}
One row per job.
| Field | Description |
|---|---|
title, company, companyLogo, companyProfileUrl | Job title, employer, logo and jobs.ch company page. |
location, street, postalCode, city, canton, country, latitude, longitude, regions | Workplace details. |
workload, workloadMin, workloadMax, isFullTime | Pensum, for example 80–100%. |
commitment, contractTypes, level, occupationalFields, industry, profession | Contract type, position level and classification. |
salaryMin, salaryMax, salaryCurrency, salaryPeriod, salaryText | Pay, only when the employer publishes it (rare on jobs.ch). |
postedAt, firstPostedAt, lastOnlineDate, isActive | Dates and status. |
jobUrl, applyUrl, applyEmail, applicationMethod, easyApply | Where and how to apply. |
contactName, contactPhone, contactEmail, contactAddress | Contact person when the listing names one. |
descriptionText, lists, descriptionHtml | Full description, bullet lists as {title, items}, optional HTML. |
languageSkills, skills, workFromHome, isPromoted | Required languages with level, skills, home office, paid listing. |
companyWebsite, companyIndustry, companyEmployees, companyRating, companyReviewCount, companyJobCount, … | Company profile (with includeCompanyDetails). |
source, searchQuery, scrapedAt | Board, the keyword that found the job, scrape time. |
Example (trimmed, sample data):
{
"id": "0b6f3c1e-5a2d-4c8e-9f11-2d7a6b3c9e40",
"title": "Senior Software Engineer (80–100%)",
"company": "Alpenblick Software AG",
"location": "Zürich",
"street": "Seestrasse 12",
"postalCode": "8002",
"canton": "ZH",
"regions": ["German part of Switzerland", "Region of Zurich / Schaffhausen"],
"workload": "80–100%",
"workloadMin": 80,
"workloadMax": 100,
"commitment": "Permanent position",
"level": "Specialist",
"occupationalFields": ["Information Technology / Telecom.", "Software Development"],
"salaryMin": 110000,
"salaryMax": 135000,
"salaryCurrency": "CHF",
"salaryPeriod": "year",
"salaryText": "CHF 110'000–135'000 per year",
"postedAt": "2026-10-13T07:12:40Z",
"jobUrl": "https://www.jobs.ch/en/vacancies/detail/0b6f3c1e-5a2d-4c8e-9f11-2d7a6b3c9e40/",
"applyUrl": "https://careers.example.ch/jobs/1234/apply",
"contactName": "Anna Muster",
"languageSkills": [{"language": "de", "level": "Fluent"}, {"language": "en", "level": "Fluent"}],
"lists": [{"title": "Your tasks", "items": ["Design and build our booking platform", "Mentor two junior engineers"]}],
"descriptionText": "Senior Software Engineer (80–100%)\n\nAlpenblick builds booking software for Swiss mountain resorts…",
"source": "jobs.ch",
"searchQuery": "Software Engineer"
}
You pay $2.00 per 1,000 saved jobs ($0.002 per job), and that price already includes full details and, if you turn it on, the company profile. Platform usage (compute and datacenter proxy) is billed on top but is tiny for this actor: a 1,000-job run with full details uses well under one cent of it.
Example: 1,000 jobs with full descriptions ≈ $2.01 in total. Jobs dropped by your title filters are never charged.
Is it legal to scrape jobs.ch? The actor only reads public job listings that anyone can open without an account. Contact names and phone numbers are personal data: process them in line with the Swiss FADP and GDPR, and check the site's terms for your use case.
Do I need a login or my own proxy? No. Datacenter proxies (the default) work well.
How many jobs can I get? All of them. jobs.ch serves at most 10,000 matches per search, so for bigger searches the actor splits the search by publication date automatically and keeps going (the AI search mode is limited to the first 10,000 matches).
Why are some fields empty? Fields are filled only when the listing has them. Salary in particular is published on only a small share of jobs.ch listings; contact persons appear on roughly one in five.
Can I schedule it or use the API? Yes. Schedule it (for example daily with sortBy: newest and postedWithinDays: 1) and read the results via the API, webhooks or integrations.
Does it cover jobup.ch? Yes, set Job board to jobup.ch or both, or paste jobup.ch URLs.
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.
searchQueriesarrayOptionalSearch keywords
Job titles, skills or keywords, as you would type them into the jobs.ch search box (for example Software Engineer, Pflegefachfrau, comptable). Each keyword runs as its own search; duplicates across searches are saved once. Leave empty to list all jobs that match the filters.
startUrlsarrayOptionaljobs.ch / jobup.ch URLs
Paste search result pages with filters already set (https://www.jobs.ch/en/vacancies/?term=python&location=Zürich), single job pages (…/detail//), company pages (https://www.jobs.ch/de/firmen/3545-v-zug-ag/) or jobup.ch links. Filters inside a search URL are used as they are.
companyNamesarrayOptionalCompany names
Get every open job of these employers, for example V-ZUG AG or Swisscom. Exact names work best; otherwise all companies whose name contains the word are used.
maxResultsintegerOptionaldefault 20Max results
Maximum number of jobs to save in total. Use 0 for no limit (up to 100,000).
maxResultsPerQueryintegerOptionalMax results per search
Optional cap for each keyword, URL or company. 0 or empty means no per-search cap.
All filters are optional and combine with AND; within one filter any value matches. They apply to keywords and company searches, not to search URLs (which carry their own filters).
locationsarrayOptionalLocations
Cities, postal codes or canton codes, for example Zürich, Lausanne, 3011 or ZG. Several locations are combined with OR.
regionsarrayOptionalRegions
jobs.ch job regions, for example Region of Zurich / Schaffhausen or Western Switzerland.
contractTypesarrayOptionalContract types
Keep only these contract types.
workloadMinintegerOptionalWorkload from (%)
Minimum workload (Pensum) in percent, for example 60.
workloadMaxintegerOptionalWorkload up to (%)
Maximum workload (Pensum) in percent, for example 80 for part-time jobs.
postedWithinDaysintegerOptionalPosted within (days)
Only jobs first published in the last N days (1 = last 24 hours). Empty or 0 means any time.
positionLevelsarrayOptionalPosition
Keep only these position levels.
occupationalFieldsarrayOptionalOccupational fields
jobs.ch occupational fields, for example Information Technology / Telecom.
industriesarrayOptionalIndustries
Industry of the hiring company.
companyTypesarrayOptionalCompany types
Keep only jobs from these kinds of employers.
excludeAgenciesbooleanOptionaldefault falseExclude recruitment agencies
Only direct employers: drops jobs posted by staffing and recruitment agencies.
workFromHomebooleanOptionaldefault falseOnly jobs with home office
Keep only jobs that offer working from home.
requiredLanguagesarrayOptionalRequired languages
Keep jobs that ask for any of these language skills.
titleKeywordsarrayOptionalTitle must contain
Keep only jobs whose title contains any of these words (case-insensitive), for example Senior, Lead. Checked before details are loaded, so filtered jobs cost nothing.
excludeTitleKeywordsarrayOptionalTitle must not contain
Drop jobs whose title contains any of these words, for example Praktikum, intern.
siteenumOptionaldefault "jobs.ch"Job board
Which board to search with keywords and company names. URLs always use the board they come from.
sortByenumOptionaldefault "relevance"Sort by
Newest first is best for daily or hourly monitoring.
semanticSearchbooleanOptionaldefault falseAI (semantic) search
Use the site's semantic search, which also finds related terms (for example nodejs finds Node.js). It returns fewer, more relevant matches; the default keyword search returns more.
includeDetailsbooleanOptionaldefault trueInclude full job details
Load each job's full description, bullet lists, apply link and email, contact, address, language skills and skills. Turn off for faster listing-only results.
includeCompanyDetailsbooleanOptionaldefault falseInclude company profile
Add the employer's website, industry, size, rating, review count, open jobs, address, description and social links (one extra request per company).
includeHtmlbooleanOptionaldefault falseInclude description HTML
Also save the description as HTML (descriptionHtml).
languageenumOptionaldefault "en"Link language
Language of the job and company page links. Job texts stay in the language they were written in.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Datacenter proxies work well for jobs.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 | Job id |
| title | string | null | Job title |
| company | string | null | Hiring company |
| companyId | string | null | jobs.ch company id |
| companySlug | string | null | jobs.ch company slug |
| companyLogo | string | null | Company logo URL |
| companyProfileUrl | string | null | Company page on jobs.ch |
| location | string | null | Workplace as shown on the listing |
| allLocations | array | All workplace cities |
| street | string | null | Street of the workplace |
| postalCode | string | null | Postal code |
| city | string | null | City |
| canton | string | null | Canton code, for example ZH |
| country | string | null | Country code |
| latitude | number | null | Latitude |
| longitude | number | null | Longitude |
| regions | array | jobs.ch regions |
| workFromHome | boolean | null | Home office offered |
| commitment | string | null | Main contract type |
| contractTypes | array | All contract types |
| workloadMin | integer | null | Minimum workload in percent |
| workloadMax | integer | null | Maximum workload in percent |
| workload | string | null | Workload, for example 80–100% |
| isFullTime | boolean | null | 100% workload possible |
| level | string | null | Position level |
| occupationalFields | array | Occupational fields |
| industry | string | null | Industry |
| profession | string | null | Normalized profession |
| salaryMin | number | null | Lowest published salary |
| salaryMax | number | null | Highest published salary |
| salaryCurrency | string | null | Salary currency |
| salaryPeriod | string | null | Salary period (year, month, hour) |
| salaryText | string | null | Salary as text |
| postedAt | string | null | Publication date |
| firstPostedAt | string | null | First listed on the board |
| isPromoted | boolean | null | Paid / promoted listing |
| easyApply | boolean | null | Quick apply available |
| jobUrl | string | null | Job page |
| source | string | null | jobs.ch or jobup.ch |
| searchQuery | string | null | Keyword that found the job |
| applyUrl | string | null | Application link |
| applyEmail | string | null | Application email |
| applicationMethod | string | null | How to apply |
| companyWebsite | string | null | Company website |
| contactName | string | null | Contact person |
| contactPhone | string | null | Contact phone |
| contactEmail | string | null | Contact email |
| contactAddress | string | null | Contact address |
| languageSkills | array | Required languages and levels |
| skills | array | Skills |
| lastOnlineDate | string | null | Last day seen online |
| isActive | boolean | null | Listing is online |
| descriptionText | string | null | Full description as text |
| lists | array | Bullet lists with their headings |
| descriptionHtml | string | null | Full description as HTML |
| companyIndustry | string | null | Company industry |
| companyType | string | null | Company type |
| companyEmployees | integer | null | Employees |
| companyFoundedYear | integer | null | Founded |
| companyRating | number | null | Average employee rating (1–5) |
| companyReviewCount | integer | null | Number of reviews |
| companyJobCount | integer | null | Open jobs of the company |
| companyAddress | string | null | Company address |
| companyDescription | string | null | Company description |
| companySocialUrls | object | null | Social media links |
| companyBenefits | array | Company benefits |
| scrapedAt | string | null | Time of scraping |
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 |
|---|---|---|
| Job | One saved job listing, including full details and the company profile when enabled. | $0.002 |
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('openrole/jobs-ch-scraper').call({
"searchQueries": [
"Software Engineer"
],
"startUrls": [],
"companyNames": [],
"maxResults": 20,
"locations": [],
"titleKeywords": [],
"excludeTitleKeywords": [],
"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 openrole/jobs-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=openrole/jobs-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.
Search jobs.ch by keyword and city.
Jobs from jobup.ch with full details.
Jobs filtered by workload with details.
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.