Jobs.ch Lookup: Swiss Job Postings by Keyword and Region avatar

Jobs.ch Lookup: Swiss Job Postings by Keyword and Region

Pricing

from $0.90 / 1,000 job posting returneds

Go to Apify Store
Jobs.ch Lookup: Swiss Job Postings by Keyword and Region

Jobs.ch Lookup: Swiss Job Postings by Keyword and Region

Jobs.ch scraper without login: search jobs.ch, Switzerland's largest job board, by keyword and region and get one row per posting: title, company, place, canton, workload, link. Monitor mode returns only new postings since the last run. Pay per posting returned; empty searches are free.

Pricing

from $0.90 / 1,000 job posting returneds

Rating

0.0

(0)

Developer

Adriana Voss

Adriana Voss

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Get Swiss job postings from jobs.ch by keyword and region, one row per posting, no login. Each row has the job title, company, place, canton where jobs.ch gives one, workload range, publication date and the posting link. Turn on monitoring mode and run it on a schedule to get only the postings that are new since your last run.

Who uses it: recruiters and sourcers tracking who is hiring in Switzerland, sales teams selling to companies that are growing a team, job-board aggregators, and labour-market analysts. Run it from n8n, Make, Clay or Google Sheets, or let an AI agent call it.

Price: $1.80 per 1,000 job postings returned on the free plan, less on paid Apify plans. A search with no postings and a run with nothing new cost only the $0.003 start fee.

How to use

  1. In the Apify Console. Open the actor page and click Start — the searches field is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found.
  2. Via the API. Call it directly with a POST request — no Console needed once you have an API token:
    curl "https://api.apify.com/v2/acts/accountable_eel~jobs-ch-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
    -X POST \
    -H "Content-Type: application/json" \
    -d '{"searches":["python"]}'
  3. On a schedule. Save this actor as an Apify Task with the input you want, then add a Schedule (hourly, daily, weekly) so it runs on its own — no server of your own required.

Input

{
"searches": [
"python"
]
}

One search per line. Write it as "keywords @ location", or just the keywords and set a location below. Accepted formats: data engineer @ Zürich, Pflegefachperson, python @ Basel.

Write each search as keywords @ location (for example data engineer @ Zürich), or just keywords and set a default location. jobs.ch shows 20 postings per page; the actor reads up to 10 pages (200 postings) per search. Keyword filters on title and company run before anything is billed or remembered.

Output

One row per job posting, for example:

{
"jobId": "ee70758e-a666-4b6b-8c76-e213b7943f3e",
"title": "Data Scientist - Recommender Systems (w/m) 80-100%",
"companyName": "NZZ",
"location": "Zürich",
"canton": "ZH",
"workloadMinPercent": 80,
"workloadMaxPercent": 100,
"publishedAt": "2026-09-08T16:32:24+02:00",
"jobUrl": "https://www.jobs.ch/en/vacancies/detail/ee70758e-a666-4b6b-8c76-e213b7943f3e/"
}

Every row also carries the search it came from, isNew and firstSeenAt (set when monitoring or a watchlist name is on, null otherwise) and scrapedAt. A value jobs.ch does not give is null, never 0 or an empty string. canton and postalCode come from the posting's address block, which jobs.ch only fills for some postings (about half in a 40-posting check), so they are null for the rest; location is always the place name jobs.ch prints.

queryfoundstatussearchKeywordssearchLocationjobCounttotalAvailabletruncatedjobsjobIdtitlecompanyNamelocationcantonpostalCodeworkloadMinPercentworkloadMaxPercentpublishedAtfirstPublishedAtpostedAgojobUrlisNewfirstSeenAtscrapedAt
pythontrueOK<all postings found (full list)><jobs.ch job id><workload from (%)><workload to (%)><posted (as jobs.ch words it)><is this posting new?>1970-01-01T00:00:00.000Z

A search jobs.ch answers with no postings comes back as a row with "found": false and is never charged. jobs.ch search is fuzzy, so even a nonsense word usually returns its closest matches; read totalAvailable to see how many postings matched.

Pricing

  • Job posting returned: $1.8 per 1,000 job postings

Plus a $0.003 start fee per run. Each event above is billed independently, only when it actually returns data — misses (found:false) are never charged.

Use it from Clay, n8n, Make, or an AI agent

This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.

curl "https://api.apify.com/v2/acts/accountable_eel~jobs-ch-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
-X POST \
-H "Content-Type: application/json" \
-d '{"searches":["python"]}'

n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~jobs-ch-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"searches":["python"]} (swap in an expression from an earlier node for a real value).

Clay. Add an "HTTP API" column: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~jobs-ch-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body {"searches":["{{search}}"]}, mapping the row's search into the searches array.

MCP. In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "jobs.ch scraper" — the agent will find and run this actor.

Example runs

Paste any of these into the Input tab and press Start. All three return rows with no key, no token and no account of your own beyond an Apify login.

Python jobs anywhere in Switzerland. The default shape.

{
"searches": ["python"],
"maxJobsPerQuery": 40
}

Data engineer roles in Zürich, without internships.

{
"searches": ["data engineer @ Zürich"],
"excludeTitleKeywords": ["praktikum", "intern", "werkstudent"],
"maxJobsPerQuery": 40
}

Daily new-postings monitor for several roles. Run it on a schedule; the first run returns everything and remembers it, later runs return only postings it has not returned before.

{
"searches": ["devops engineer @ Basel", "devops engineer @ Bern"],
"onlyNewSinceLastRun": true,
"deltaName": "devops-basel-bern"
}