Alpha.ch + Topjobs.ch Scraper - Swiss JobCloud Vertical Boards avatar

Alpha.ch + Topjobs.ch Scraper - Swiss JobCloud Vertical Boards

Pricing

from $2.49 / 1,000 job search results

Go to Apify Store
Alpha.ch + Topjobs.ch Scraper - Swiss JobCloud Vertical Boards

Alpha.ch + Topjobs.ch Scraper - Swiss JobCloud Vertical Boards

Scrape Swiss job listings from alpha.ch or topjobs.ch (JobCloud/Netiva family, shared inventory ~4,700 jobs). 41 fields: title, company, canton, coordinates, workload, salary, contact, apply URL, full description in 4 formats. DE/FR/IT/EN. Pay-per-result.

Pricing

from $2.49 / 1,000 job search results

Rating

0.0

(0)

Developer

NanoScrape

NanoScrape

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Alpha.ch + Topjobs.ch Scraper — Swiss JobCloud Vertical Boards

Scrape job listings from Alpha.ch or Topjobs.ch — two Swiss vertical job boards operated by JobCloud AG on the shared Netiva backend. Both sites share the same inventory (~4,700 active listings), the same API, and the same job IDs — the difference is UI branding only. Pick either surface with the host input parameter.

Returns 41 fields: title, company, canton, coordinates, workload, salary (CHF), recruiter contact person / email / phone, external apply URL, and full description in 4 formats (plain text, snippet, HTML, markdown). Multi-language (DE / FR / IT / EN).

Cost-effective: uses the public JSON API + /GetById detail endpoint. No login required, no anti-bot friction (JobCloud endpoints work from datacenter proxies).


Why one actor for two hosts?

Phase 0 verification (2026-09-03) confirmed alpha.ch and topjobs.ch are one platform:

  • Same Netiva backend (jobboard-api.netiva.ch proxied by tenant subdomains api.alpha.ch / api.topjobs.ch)
  • Same Next.js frontend (identical buildId)
  • Same job IDs, same ordering, byte-identical SERP responses
  • Same result count (~4,735 across both hosts on the same probe)

Building two separate actors would produce duplicate output. Instead, one actor with the host input parameter lets you pick which branding surface to attribute the listings to.


Features

  • 4 input modes: searchQueries (keywords) · searchUrls (paste any alpha.ch / topjobs.ch SERP URL) · startUrls (alias) · directUrls (single-job re-scrape / still-alive checks)
  • Multi-language: DE, FR, IT, EN
  • Sort by newest (default; recommended for scheduled scrapes) or relevance (default when a search query is supplied)
  • Filter by JobCloud category tags (categoryTags: ["632"] = Informatik, ["638"] = Medizin/Pflege, etc.), region IDs (regionIds: ["103"] = Stadt Zürich, ["105"] = Deutschschweiz), and workload range (workload: "80-100")
  • Fleet-canonical field names: job_url, title, company_name, postal_code, posted_at_datetime, valid_through, employment_type, workload_min/max, salary_min/max, remote_type, apply_url, contact_email, contact_phone, contact_person_name, etc.
  • Description quartet: description_full (plain text), description_snippet (300-char preview), description_html (cleaned HTML), description_md (markdown for LLM ingestion)
  • Rich tag taxonomy: 6 categories exposed as separate fields (employment type, position, region, industry, profession, company size)
  • Detail-page enrichment via /Api/JobsPublic/GetById/{id} — full JobCloud record with tags, coordinates, valid-through date, contact person, external apply URL (usually the JobCloud sibling jobs.ch/stellenangebote/detail/{jcJobId})
  • Multilingual requirements / benefits extraction: scans DE/FR/IT/EN section headers (Anforderungen / Votre profil / Requisiti / Requirements etc.)
  • Salary extraction from Swiss CHF patterns (CHF 80'000 - 120'000 par an)
  • Fast SERP-only mode: includeJobDetails: false returns baseline fields at ~10 items/sec, no PPE detail charge
  • Concurrent detail fetching (default 8 workers)
  • 3-tier proxy fallback (user proxy → auto → direct) for resilience
  • 128 MB memory, ~$0.001 base charge per run

Sample input

{
"host": "alpha.ch",
"searchQueries": ["informatik", "buchhalter"],
"language": "de",
"sortBy": "newest",
"includeJobDetails": true,
"maxResultsPerQuery": 50,
"maxResults": 100,
"maxConcurrency": 8,
"proxyConfiguration": { "useApifyProxy": true }
}

Filter by category + region (no keyword — returns all Zürich IT jobs):

{
"host": "alpha.ch",
"categoryTags": ["632"],
"regionIds": ["103"],
"workload": "80-100",
"maxResults": 100
}

Search URL mode — paste any alpha.ch / topjobs.ch SERP URL:

{
"searchUrls": [
"https://www.alpha.ch/de/jobs?tag=632&region=105",
"https://www.topjobs.ch/fr/jobs?q=developer&region=111"
],
"includeJobDetails": true,
"maxResultsPerQuery": 30
}

Direct URL mode — re-scrape specific jobs:

{
"directUrls": [
"https://www.alpha.ch/de/jobs/14727114",
"https://www.topjobs.ch/de/jobs/14727096"
],
"language": "de"
}

Sample output

{
"id": "14727114",
"job_url": "https://www.alpha.ch/de/jobs/14727114",
"source_host": "alpha.ch",
"title": "Akquisition TU-Submissionen, Gesamtleistungswettbewerbe 80–100%",
"company_name": "e-selection AG",
"company_logo_url": "https://media.jobs.ch/images/05389230-0f42-4c2b-953f-369385f87d72/2067x322.png",
"company_website": "https://www.e-selection.ch",
"location": "Luzern",
"postal_code": "6003",
"region": "Region Zentralschweiz",
"country": "CH",
"latitude": 47.05048,
"longitude": 8.30635,
"posted_at_datetime": "2026-09-03T19:03:27+00:00",
"valid_through": "2026-10-18T21:59",
"employment_type": "permanent",
"employment_position": "specialist",
"workload_min": 80,
"workload_max": 100,
"workload_text": "80 - 100%",
"salary_min": null,
"salary_max": null,
"salary_currency": "CHF",
"salary_period": null,
"remote_type": null,
"language": "de",
"description_full": "In dieser Rolle sind Sie die erste Ansprechperson im Akquisitionsprozess...",
"description_snippet": "In dieser Rolle sind Sie die erste Ansprechperson im Akquisitionsprozess und stehen am Anfang unserer Immobilienprojekte...",
"description_html": "<p>In dieser Rolle sind Sie die erste Ansprechperson im Akquisitionsprozess...</p><p><strong>Ihre Aufgaben</strong></p><ul><li>Ausarbeitung überzeugender Angebote...</li></ul>",
"description_md": "In dieser Rolle sind Sie die erste Ansprechperson...\n\n**Ihre Aufgaben**\n\n- Ausarbeitung überzeugender Angebote...",
"apply_url": "https://www.jobs.ch/de/stellenangebote/detail/f64abc08-a878-42cc-b772-89168f2a4dec/",
"contact_email": null,
"contact_phone": null,
"contact_person_name": "Michael Benjamin",
"requirements": [
"Fachkenntnisse und Erfahrung: abgeschlossene Ausbildung in Architektur oder Bauingenieurwesen...",
"Kundenbeziehung: Kompetenz im Aufbau vertrauensvoller Kundenbeziehungen..."
],
"benefits": [
"Arbeitsplatz mit Gestaltungsspielraum und direktem Einfluss auf nachhaltige Immobilienprojekte.",
"Kollegiales Arbeitsklima mit Förderung von Diversität und Chancengleichheit."
],
"tags": ["Festanstellung", "Fachverantwortung", "Region Zentralschweiz", "Bau / Architektur / Engineering"],
"categories": ["Bau / Architektur / Engineering", "Architektur / Bauplanung / Zeichner"],
"coordinates": [47.05048, 8.30635],
"source_query": "",
"scraped_at": "2026-09-03T21:40:53Z"
}

Pricing

Pay-per-event (PPE). Every SERP result is billed as job-serp-result; every enriched detail is billed as job-detail-result (once per job). A tiny apify-actor-start charge covers the run itself.

Typical cost estimate: ~$0.005 per enriched job at the introductory rate — one of the cheapest ways to build a live Swiss job dataset.



Troubleshooting / Issues

Report issues or request fields via nanoscrape.com/contact or open a GitHub issue.

Changelog

  • 0.1.0 (2026-09-03): Initial build. Phase 0 verified alpha.ch and topjobs.ch share the JobCloud/Netiva backend. Description quartet, applyPrefillDefaults(), sortBy enum, 3-tier proxy fallback, safeCharge PPE billing.