Methodology

As of 2026-10-27, SwissAIJob tracks 526 active AI and machine learning roles across 131 Swiss employers. This page documents how that dataset is built and kept current.

Where the data comes from

Every listing is scraped from a public employer-owned source: a company's own careers page, a university or research-institute job portal, or the applicant-tracking system (Ashby, Greenhouse, Lever, Workable, SmartRecruiters, Personio, SuccessFactors, and others) that employer uses. Each employer has its own dedicated scraper. We never pull from LinkedIn, Indeed, Glassdoor, jobs.ch, or any third-party aggregator, so every URL points to the employer's source of truth, not a re-post. The one exception is a listing marked "Hiring partner", which the employer gives us directly. It sits at the top of the Newest list and is otherwise filtered and ranked like any other role.

How often it updates

Scrapers run every day, adding new roles, re-confirming existing ones, and taking down those that have left the employer's job list. Each posting carries a dateModified timestamp that is refreshed every time the scraper re-confirms it is still live, so freshness is verifiable rather than assumed.

What counts as an AI role

Each scraped listing is scored against a curated list of about 50 AI and machine learning keywords, in English and German, then passed through a title gate. Industry roles need an AI or ML term in the title, or several keyword hits in the description, to qualify. At AI-native companies one keyword in the role's own text is enough. University and research-institute roles use a more lenient gate, since an academic posting often describes AI-heavy work under a generic title. Text an employer repeats across most of its postings, such as an About paragraph, doesn't count, so a sales or finance role at an AI company isn't listed on the strength of the company description. Back-office roles (finance, HR, recruiting, office support and the like) need an AI term in the title. An opening the employer posts several times under different links is listed once. Coverage spans three sectors: universities and Hochschulen (Academia), research-first institutions like Idiap, CSEM, Empa and PSI (Research Institutes), and for-profit companies (Industry), including non-tech employers such as banks, insurers, and pharma that hire for AI.

How salaries are estimated

Most Swiss employers don't publish salaries, so the range shown on each listing is estimated, not employer-quoted. A large language model reads the job's title, company, sector, role, location, and description, anchors against explicit Swiss market benchmarks (FAANG vs. mid-size tech vs. consulting vs. startup vs. academia) and seniority adjustments, rounds the lower bound to the nearest CHF 5,000, and adds CHF 20,000 for the upper bound. If the listing itself states a salary or a doctoral pay scale, that figure is used instead. Treat every estimate as a rough signal, not a commitment. The salaries page aggregates these estimates by role and city.

How closed roles are removed

A role stays listed while the employer's own job list shows it, and comes down in the first daily run that no longer finds it there. If a job list comes back much shorter than the day before, each missing role is first checked with the employer's job platform, and one the platform still lists stays up. If a scraper can't read a job list on a given day, its roles are checked one by one with the job platform or the job's own page, and a scraped role that nothing has confirmed for three weeks comes down regardless. The goal is that a role you click is a role you can still apply to. For 24 hours after a role closes it stays visible with a "Recently taken down" marker, then drops out entirely. A role that reappears on the employer's list returns as the same listing, not as a new one.

Limitations

Salary figures are model estimates and can be wrong. Coverage depends on an employer having a scrapable public careers page; a company hiring only through a closed portal or a channel we don't yet cover won't appear until a scraper is added. Locations are normalized to a Swiss city, so a genuinely remote role is shown under its posting city. Job titles are cleaned up once, when a role is first listed, so a title the employer changes later can lag behind. This is a single-developer, largely agent-run project; scrapers are added and repaired continuously, so coverage expands over time rather than being complete on any given day.

Contact

contact@swissaijob.ch