jobup.ch Jobs Scraper
Pricing
from $0.84 / 1,000 results
jobup.ch Jobs Scraper
Swiss job listings from jobup.ch: search by keyword and location, with full job details on request — description, salary, benefits, required skills, employer overview and precise canton/postcode location.
Pricing
from $0.84 / 1,000 results
Rating
0.0
(0)
Developer
Ibnu Adzim
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
12 days ago
Last modified
Categories
Share
Scrapes job listings from jobup.ch, one of Switzerland's largest job boards. Search by keyword and canton/city, then optionally pull the full job detail: description, salary, benefits, required skills, employer overview and precise canton/postcode location.
What you get
One JOB row per posting, plus a SEARCH_SUMMARY row per query.
From the search page (always)
jobId · title · url · description (short, generic) · datePosted ·
employmentType · companyName · companyUrl · locationCountry
From the detail page (includeJobDetails, on by default)
description (full HTML job ad) · disambiguatingDescription ·
jobStartDate · jobImmediateStart · workHours · employmentUnit ·
totalJobOpenings · locationRegion (canton) · locationPostalCode ·
locationStreetAddress · industry · occupationalCategory ·
baseSalary · jobBenefits · skills · employerOverview ·
applicationContact · directApply
Input
{"queries": [{ "term": "developer", "location": "zürich" }],"includeJobDetails": true,"maxItemsPerQuery": 50}
Each entry in queries needs at least a term or a location.
term is fuzzy relevance search, not exact matching
A nonsense term returns a small, genuinely related result set (not zero, not the whole catalogue) — normal search-engine behaviour, documented as-is rather than defended against.
location is free text, and that's safe here
Real values are Swiss place-name slugs (zürich, bern, basel,
genève, lausanne, luzern, winterthur, zug, st. gallen, and
others not listed). There's no lookup endpoint to validate against — but
unlike most location filters in this portfolio, an unrecognised value here
is honest: it answers a genuinely empty result (totalMatches: 0), not
a silent fallback to the unfiltered baseline. A typo costs you nothing
misleading.
Read this before trusting a large maxItemsPerQuery
Pagination clamps back to page 1 past the real last page. jobup.ch's
own pages walk honestly and with zero overlap up to the true end of a
query's results — but one page further, it re-serves page 1's exact result
list, byte-for-byte, instead of an empty page or an error. The actor's stop
condition is "this page contributed zero new job ids", never "the page was
empty", so this is handled correctly and the summary row reports
paginationClampHit: true when it happens — but it means you cannot detect
a mid-crawl failure by watching for an empty page; watch paginationClampHit
and jobsReturned vs totalMatches instead.
Known limits
1. Job descriptions are raw HTML, not plain text — passed through
verbatim (raw passthrough) rather than stripped, since stripping would lose
formatting some consumers want (lists of requirements, headed sections).
On a small number of postings, title carries stray HTML too —
confirmed live on a cloud run: a recruiting agency's own CMS export leaked
<div class=C_PTITLEHTML><h1>...</h1></div> markup straight into the
title field, not just description. This is upstream data quality, not
a parsing defect (verified against the raw JSON-LD jobup.ch itself serves)
— passed through as-is rather than "cleaned," for the same raw-passthrough
reason as point 1.
2. baseSalary is often an empty shell. The MonetaryAmount/
QuantitativeValue structure is present on essentially every job, but the
actual value/minValue/maxValue numbers are only filled in when the
employer chose to disclose a salary. An empty object is a genuine "not
disclosed", not a parse failure.
3. Aggregation-based location counts don't have to match the actor's own
totals exactly. jobup.ch's own facet sidebar (e.g. "Bern: 24" for one
measured query) reflects a slightly different scope than filtering
directly by that location (location=bern on the same query measured
10) — both are genuine site behaviour, not a bug in this actor.
Anti-bot posture
None observed. 8/8 TLS profiles clean on BOTH the search and detail pages during recon — the cleanest surface measured anywhere in this portfolio (most targets need at least a narrowed profile pool). The actor still ships a rotating profile pool, a retry ladder and challenge-marker detection, and paces requests by default, since a target being clean locally has not always meant the same from Apify's cloud egress elsewhere in this portfolio.
Policy
robots.txt (User-agent: *, mirrored for Googlebot) names no
ClaudeBot/anthropic-ai/GPTBot group. It disallows /api/,
/api_proxy/, the login/register/auth flows, the apply flow
(/*/application/*), and a feat= query parameter — none of which overlap
/en/jobs/ search or /en/jobs/detail/, the two surfaces this actor
fetches. SemrushBot gets a blanket Disallow: /, which is irrelevant
here.