Frequently asked questions
Common questions about SwissAIJob, how listings are sourced, how salaries are estimated, and how the Swiss AI job market looks right now.
Why does SwissAIJob exist?
Try this experiment. Pick any job site, Indeed, LinkedIn, jobs.ch, jobup.ch, and search for "machine learning engineer Zürich". You will get a stack of postings, but the experience falls apart fast. Search results are loosely related at best. Half the listings are weeks or months old and the role is long gone. Many of them are reposted by recruitment agencies on behalf of a company they will not name. You hit a signup wall before you can even read the description. Academic positions at ETH, EPFL, and the cantonal universities do not show up at all. And AI roles at companies that are not strictly "tech" but still hire for AI, banks, insurers, pharma, watchmakers, the federal research institutes, are scattered across each employer's own career page where no aggregator looks.
I built SwissAIJob because I wanted a job board I would actually use myself. The rules are simple:
The platform is largely agent-run. AI agents continuously add, maintain, and repair scrapers for new employers as they appear, so coverage keeps expanding without manual upkeep.
I built SwissAIJob because I wanted a job board I would actually use myself. The rules are simple:
- Every AI-related role in Switzerland, across industry and academia, including non-tech employers that happen to hire for AI.
- No stale listings. Scrapers run every 3 days; expired roles are deactivated automatically via HTTP checks, daily content scans, and a 14-day fallback.
- No signup wall, no recruiter middlemen, no scams. Click a job and land directly on the employer's or university's own apply page.
- Sourced exclusively from public company and university career sites. Never from LinkedIn, Indeed, Glassdoor, or any third-party aggregator.
The platform is largely agent-run. AI agents continuously add, maintain, and repair scrapers for new employers as they appear, so coverage keeps expanding without manual upkeep.
Is SwissAIJob free to use?
Yes. Browsing every listing, filtering, and the CV-matching tool are all free. There are no ads, no paid placements, and no signup wall.
Do I need to sign up to apply?
No. Every listing links directly to the employer's own apply page on their career site. SwissAIJob never sits between you and the employer.
How many AI and ML jobs are currently listed?
There are 410 active AI and machine learning listings across 101 Swiss employers, last refreshed 2026-06-25. The full list is on the homepage.
Which Swiss cities have the most AI roles right now?
Zürich leads with 268 active roles, followed by Lausanne (46) and Basel (31). The full per-city breakdown is on the stats page, and each city has a dedicated landing page, for example /jobs/zurich.
What's the typical salary range for AI roles in Switzerland?
Across the 410 listings with salary data, the median lower bound is CHF 120'000 and the median upper bound is CHF 140'000 per year. The salaries page breaks this down by role, sector, and city. Note: most employers don't publish salaries, so these are LLM-estimated from job descriptions and Swiss market benchmarks. Treat them as rough signals, not commitments.
How often are listings updated?
Scrapers run every 3 days and pick up new listings, refresh existing ones, and remove roles that have been taken down. Closed roles are deactivated automatically, confirmed via HTTP checks, daily content scans, and a 14-day fallback safety net.
Where do the listings come from?
Exclusively from public company and university career pages. Each employer has a dedicated scraper. We do not pull from LinkedIn, Indeed, Glassdoor, or any third-party job aggregator.
How are salary ranges estimated?
Most Swiss employers don't publish salaries, so the range shown is LLM-estimated. The model looks at the company, role, seniority, and sector, then guesses a lower bound based on Swiss benchmarks (FAANG vs. mid-size tech vs. consulting vs. startup vs. academia), rounds to the nearest CHF 5,000, and adds CHF 20,000 for the upper bound. Treat estimates as rough signals, not commitments.
Why is it defensible to zero-shot salary estimates with an LLM?
Fair question. Here is exactly what happens: scraper/estimate-salaries.js hands Google's Gemini 2.0 Flash six structured fields (title, company, sector, category, location, employment type) plus the full description text. The system prompt anchors the model with explicit Swiss market benchmarks (FAANG CHF 130–200k senior, mid-size Swiss tech 100–150k, consulting 100–140k, academia 70–100k, PhD fixed at CHF 50k, postdoc 80k) and seniority deltas (−20k junior, +25k senior, +50k staff, +60k principal). The model returns
This is genuinely zero-shot. There are no
The peer-reviewed literature backs this up specifically for numerical and tabular tasks like ours. Brown et al., Language Models are Few-Shot Learners (NeurIPS 2020), is the foundational result that large pretrained models perform downstream tasks from instructions alone, no labeled examples required. Gruver et al., Large Language Models Are Zero-Shot Time Series Forecasters (NeurIPS 2023), is the strongest single citation for our use case: they show LLMs zero-shot extrapolate numerical sequences at a level matching or exceeding purpose-built models trained on the task. And Hegselmann et al., TabLLM: Few-shot Classification of Tabular Data with Large Language Models (AISTATS 2023), demonstrates that feeding structured tabular fields (like title / company / sector / location) to an LLM as plain text yields competitive zero- and few-shot predictions versus tree-based baselines, which is exactly the input format
Caveat: the estimate has no calibration set and we never claim accuracy to the franc. Treat the displayed range the way you would treat a Glassdoor band: a reasonable prior, not a commitment.
salary_min rounded to the nearest CHF 5,000; we add 20,000 for the upper bound. If the description itself states a salary or doctoral scale rate, the prompt instructs the model to use that instead.This is genuinely zero-shot. There are no
(job → salary) example pairs in the prompt, just domain context, and that is defensible for two reasons. One: the signal already lives in the training corpus. Swiss salary ranges are scattered across Glassdoor, levels.fyi, kununu, jobs.ch, lohncomputer.ch, ETH and BFH personnel ordinances, and thousands of news articles and forum threads, all of which the model has seen during pretraining. Asking it to estimate a salary is essentially asking it to summarize what it has memorized about Swiss compensation, conditioned on the role. The benchmarks in the prompt are not training data; they are anchors that pin the distribution to the right tier so the model does not drift toward US numbers. A 60-job A/B test confirmed this: without the anchors, FAANG-tier estimates climb from ~150–170k to 220–230k (US tech defaults), and internships collapse to CHF 0 because the model assumes they might be unpaid. Two: even open salary sites publish ranges, not point estimates. Glassdoor and levels.fyi give bands because compensation depends on experience, team, performance, and negotiation, none of which the listing reveals. A ±CHF 10,000 estimate from an LLM lands in the same ballpark as the interquartile range Glassdoor reports for the same role.The peer-reviewed literature backs this up specifically for numerical and tabular tasks like ours. Brown et al., Language Models are Few-Shot Learners (NeurIPS 2020), is the foundational result that large pretrained models perform downstream tasks from instructions alone, no labeled examples required. Gruver et al., Large Language Models Are Zero-Shot Time Series Forecasters (NeurIPS 2023), is the strongest single citation for our use case: they show LLMs zero-shot extrapolate numerical sequences at a level matching or exceeding purpose-built models trained on the task. And Hegselmann et al., TabLLM: Few-shot Classification of Tabular Data with Large Language Models (AISTATS 2023), demonstrates that feeding structured tabular fields (like title / company / sector / location) to an LLM as plain text yields competitive zero- and few-shot predictions versus tree-based baselines, which is exactly the input format
estimate-salaries.js hands the model.Caveat: the estimate has no calibration set and we never claim accuracy to the franc. Treat the displayed range the way you would treat a Glassdoor band: a reasonable prior, not a commitment.
Do you cover academic positions like PhD and postdoc roles?
Yes. Roles at ETH Zürich, EPFL, the University of Zurich, the University of Basel, HSG, ZHAW, and other Swiss universities and research institutes are all indexed. Browse them at /jobs/sector/academia.
How does CV matching work?
On the CV match page you upload a PDF of your CV. The server extracts the text, generates an OpenAI embedding, and ranks every active listing using a blend of vector similarity (45%), skill overlap (20%), seniority fit (15%), category fit (10%), sector fit (5%), and recency (5%). You get the top 25 matches. Your CV is processed in memory and never stored.
Why don't you list jobs from LinkedIn or other job boards?
LinkedIn's terms prohibit scraping, and third-party boards re-list jobs without verifying they're still open, which is where most "stale listings" problems come from. SwissAIJob only pulls from public employer-owned career pages, so every URL points to the source of truth.
Who runs SwissAIJob?
A single developer in Switzerland who got tired of incomplete and signup-gated AI job boards. The platform is largely agent-run. AI agents continuously add, maintain, and repair scrapers for new employers. Contact: contact@swissaijob.ch.