jobup.ch Jobs Scraper avatar

jobup.ch Jobs Scraper

Pricing

from $0.84 / 1,000 results

Go to Apify Store
jobup.ch Jobs Scraper

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

Ibnu Adzim

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

12 days ago

Last modified

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.