ICTjobs.ch Scraper - Swiss IT & Tech Jobs
Pricing
from $3.00 / 1,000 results
ICTjobs.ch Scraper - Swiss IT & Tech Jobs
Scrapes IT and tech job listings from ICTjobs.ch, Switzerland's dedicated ICT job board. Filter by category, region, and employment type. Exclude recruitment agencies. Optional LLM contact extraction.
Pricing
from $3.00 / 1,000 results
Rating
0.0
(0)
Developer

Alessandro Santamaria
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Ictjobs.ch Job Scraper
Scrapes job listings from ictjobs.ch, the leading IT job portal for Switzerland.
Three Scraping Modes
This scraper supports three distinct modes for different use cases:
| Mode | Input | Output | Use Case |
|---|---|---|---|
| SEARCH MODE | Search query + category + region | Basic job data from listings | Fast discovery of new IT jobs |
| SEARCH + DETAILS MODE | includeJobDetails: true (default) | Full job data with descriptions | Complete data collection in one run |
| DIRECT URLS MODE | directUrls: [...] | Full job data + job_status | Still-alive checks, re-scraping specific jobs |
Features
- WordPress API-based scraping - Uses the official WordPress REST API for fast, reliable data extraction
- JSON-LD schema extraction - Extracts structured data from job detail pages using schema.org JobPosting format
- Category filtering - Filter by IT job categories (Software Development, DevOps, Data Science, etc.)
- Region filtering - Filter by Swiss regions and cantons
- Employment type filter - Filter by full-time, part-time, internship, contract, temporary
- Comprehensive job data - Extracts title, company, location, contact details, and more
- LLM-powered contact extraction - Optional AI-powered extraction of contact person details using Groq or OpenRouter
- HR company filtering - Filter out recruitment agencies to get direct employer postings
- Standardized output - Returns data in the
JobListingschema format - Rate-limited - Respectful 2-second delays between API requests
- Proxy support - Built-in proxy rotation for reliability
Input
| Field | Type | Description | Default |
|---|---|---|---|
directUrls | array | Direct job URLs to scrape (skips search mode) | [] |
searchQuery | string | Job title, skills, or keywords to search for | "" (all jobs) |
category | string | Job category/field (e.g., "Software Development", "DevOps") | "" (all categories) |
region | string | Swiss region or canton (e.g., "Zürich", "Bern", "Basel") | "" (all Switzerland) |
employmentType | string | Employment type: all, full-time, part-time, internship, contract, temporary | all |
maxResults | integer | Maximum number of job listings to scrape | 500 |
includeJobDetails | boolean | Fetch full job descriptions from detail pages (slower but more data) | true |
companyFilter | string | Filter by company type: all, exclude-hr, only-hr | all |
llmApiKey | string | API key for LLM contact extraction (optional, secret) | - |
llmModel | string | LLM model for contact extraction | none |
proxyConfiguration | object | Apify proxy settings | Residential |
Mode 1: SEARCH MODE (Fast)
Quick search without visiting detail pages:
- Use case: Fast IT job discovery, broad collection
- Speed: Fast - only scrapes listing pages
- Output: Basic job data (title, company, location, posted date)
{"searchQuery": "DevOps","region": "Zürich","maxResults": 200,"includeJobDetails": false}
Mode 2: SEARCH + DETAILS MODE (Complete Data)
Default mode with includeJobDetails: true:
- Use case: Complete data collection in one run
- Speed: Moderate - visits detail pages for each job
- Output: Full descriptions, JSON-LD data, contact details
{"searchQuery": "Data Scientist","region": "Zürich","maxResults": 100}
Mode 3: DIRECT URLS MODE (Still Alive Checks)
When directUrls is provided, the scraper operates in direct mode:
- Skips search phase - Goes directly to provided job URLs
- Job status detection - Returns
online,offline,expired, orunknown - Full data extraction - Same as detail page scraping
- Use case: Periodic "still alive" checks, re-scraping specific jobs after deduplication
{"directUrls": ["https://ictjobs.ch/job/senior-software-engineer-zurich-12345/","https://ictjobs.ch/job/devops-engineer-bern-67890/","https://ictjobs.ch/job/data-scientist-geneva-24680/"]}
Direct URLs mode workflow:
- Provide array of Ictjobs.ch job detail URLs
- Scraper visits each URL directly
- Detects if job is still online or has been removed
- Extracts JSON-LD structured data if available
- Returns
job_statusfield indicating availability
Categories
Ictjobs.ch has 157+ job categories including:
- Software Development / Engineering
- DevOps / Cloud / Infrastructure
- Data Science / Analytics / BI
- Cybersecurity / Information Security
- IT Project Management
- System Administration
- Quality Assurance / Testing
- UX/UI Design
- Database Administration
- Network Engineering
- And many more...
Leave the category field empty to get all IT jobs across all categories.
Regions
Filter jobs by Swiss regions or cantons:
- Zürich
- Bern
- Basel
- Ostschweiz (Eastern Switzerland)
- Zentralschweiz (Central Switzerland)
- Romandie (French-speaking Switzerland)
- Ticino
- Individual cantons (ZH, BE, AG, etc.)
HR Company Filtering
Filter jobs by company type to focus on direct employer postings or recruitment agencies:
| Option | Description |
|---|---|
all | Include all companies (default) |
exclude-hr | Remove HR/recruitment agencies |
only-hr | Show only HR/recruitment agency postings |
The filter detects HR companies by matching company names against common patterns like "Personal", "Recruiting", "Staffing", "Job", "Vermittlung", etc.
LLM Contact Extraction (Optional)
The scraper can optionally use an LLM to extract structured contact person details from the raw HTML contact block.
Supported LLM Providers:
- Groq - Use API keys starting with
gsk_(recommended: fast and free tier available) - OpenRouter - Use API keys starting with
sk-or-
Available Models:
| Model ID | Provider | Description |
|---|---|---|
llama-3.1-8b-instant | Groq | Fast, lightweight (default) |
mistral-small-3.1-24b-instruct | OpenRouter | More capable, higher quality |
The LLM extracts:
contact_salutation- "Herr" or "Frau"contact_firstname- First name of contact personcontact_lastname- Last name of contact person
Example Input
Basic Search
{"searchQuery": "DevOps","region": "Zürich","employmentType": "full-time","maxResults": 200}
Category Filter
{"category": "Software Development","region": "Bern","maxResults": 100,"companyFilter": "exclude-hr"}
With LLM Extraction
{"searchQuery": "Data Scientist","region": "Zürich","maxResults": 100,"llmApiKey": "gsk_your_groq_api_key_here","llmModel": "llama-3.1-8b-instant"}
Direct URLs - Still Alive Check
{"directUrls": ["https://ictjobs.ch/job/senior-software-engineer-zurich-12345/","https://ictjobs.ch/job/devops-engineer-bern-67890/"]}
Output
Each job listing follows the standardized JobListing schema:
{"id": "12345","title": "Senior DevOps Engineer (m/w/d)","company": "Tech Innovations AG","location": "Zürich, 8001, ZH","canton": "ZH","job_status": "online","top_listing": null,"employment_type": "full-time","workload_min": null,"workload_max": null,"remote_option": null,"salary_text": null,"description_snippet": "We are looking for an experienced DevOps Engineer...","description_full": "Job Description: ...\n\nRequirements: ...\n\nWe offer: ...","requirements": [],"posted_at": "2024-01-15T00:00:00.000Z","expires_at": "2024-02-28T00:00:00.000Z","source_url": "https://ictjobs.ch/job/senior-devops-engineer-12345","source_platform": "ictjobs.ch","contact_salutation": "Herr","contact_firstname": "Thomas","contact_lastname": "Müller","contact_email": "jobs@techinnovations.ch","contact_phone": "+41442345678","contact_position": null,"contact_raw": "<p>Kontakt: Herr Thomas Müller<br/>E-Mail: jobs@techinnovations.ch<br/>Tel: +41 44 234 56 78</p>","apply_url": "https://ictjobs.ch/job/senior-devops-engineer-12345","apply_email": "jobs@techinnovations.ch","company_url": "https://www.techinnovations.ch","company_description": null,"company_social_urls": null,"company_benefits": null,"scraped_at": "2024-01-16T12:00:00.000Z"}
Output Fields
| Field | Description |
|---|---|
id | Unique job posting ID |
title | Job title |
company | Company name |
location | City/location with postal code and canton |
canton | Swiss canton code (ZH, BE, AG, etc.) |
job_status | Job availability: online, offline, expired, unknown (Direct URLs mode only) |
top_listing | Boolean - if job is a paid promotion (always null for ictjobs.ch) |
employment_type | full-time, part-time, contract, temporary, internship |
workload_min | Minimum workload percentage (extracted from title if available) |
workload_max | Maximum workload percentage (extracted from title if available) |
remote_option | remote, hybrid, or null |
salary_text | Salary as displayed (if available) |
description_snippet | First 500 characters of description |
description_full | Complete job description |
requirements | Array of job requirements (usually empty) |
posted_at | Publication date |
expires_at | Expiration date (from JSON-LD if available) |
source_url | Link to job posting |
source_platform | Always "ictjobs.ch" |
contact_salutation | "Herr" or "Frau" - extracted by LLM if API key provided |
contact_firstname | First name - extracted by LLM if API key provided |
contact_lastname | Last name - extracted by LLM if API key provided |
contact_email | Email address - extracted via regex |
contact_phone | Phone number - extracted via regex |
contact_position | Contact person's position (usually null) |
contact_raw | Raw HTML/text contact block from the job posting |
apply_url | Application URL (usually same as source_url) |
apply_email | Application email address |
company_url | Company website (from JSON-LD if available) |
company_description | Company description (usually null) |
company_social_urls | Social media URLs (usually null) |
company_benefits | Array of benefits (usually null) |
scraped_at | Timestamp when job was scraped |
Notes on job_status field:
- Only populated in Direct URLs mode (Mode 3)
- In Search modes (Mode 1 & 2), this field is
nullsince jobs from search results are assumed to be online - Values:
online- Job page loaded successfully with contentoffline- Job page returns 404 or "not found"expired- Job explicitly marked as expiredunknown- Unable to determine status (page loaded but no clear job data)
Usage
Via Apify Console
- Go to the actor page
- Configure input parameters
- Click "Start"
- Download results from the Dataset tab (JSON, CSV, Excel)
Via API
curl -X POST "https://api.apify.com/v2/acts/santamaria~ictjobs-ch-scraper/runs" \-H "Authorization: Bearer YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"searchQuery": "Python Developer","region": "Zürich","maxResults": 100}'
Via Apify SDK (Node.js)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('santamaria/ictjobs-ch-scraper').call({searchQuery: 'Cloud Engineer',region: 'Zürich',employmentType: 'full-time',maxResults: 150,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(`Found ${items.length} jobs`);
Technical Details
Data Sources
This actor uses HTML scraping with CheerioCrawler:
-
Main Listing Page (
https://ictjobs.ch/)- Job cards in
div.offer.publishelements - Pagination via
/page/N/URL pattern - Search support via
?fs=queryparameter - Extracts: title, company, location, posted date
- Job cards in
-
JSON-LD Schema.org (from job detail pages)
- Structured JobPosting data
- More detailed company information
- Better date/location formatting
- Employment type information
When includeJobDetails is enabled (default), the scraper visits detail pages for complete data.
Supported Employment Types
full-time- Vollzeit positionspart-time- Teilzeit positionsinternship- Praktikumcontract- Vertrag/Contractortemporary- Temporär/Befristet
Search Mode (Modes 1 & 2)
- Uses WordPress pagination structure (
/page/2/,/page/3/, etc.) - Optionally applies search query via
?fs=parameter - Optionally filters by category via
/stellen-kategorie/{category}/ - Extracts job cards from each listing page
- Optionally visits detail pages for full data
- Respects
maxResultslimit
Direct URLs Mode (Mode 3)
- Skips search phase entirely
- Goes directly to provided job URLs
- Checks for 404/offline indicators
- Extracts JSON-LD structured data if available
- Extracts contact details from HTML
- Returns
job_statusfield for monitoring
Performance
- Speed: ~50-100 jobs/minute (with detail fetching enabled)
- Cost: ~0.02-0.04 CU per 500 jobs
- Reliability: Built-in retry logic and error handling
Coverage
Ictjobs.ch focuses on IT jobs across all of Switzerland:
| Region | Major Cities |
|---|---|
| Zürich | Zürich, Winterthur |
| Bern | Bern, Thun |
| Basel | Basel, Liestal |
| Romandie | Geneva, Lausanne, Fribourg |
| Ostschweiz | St. Gallen, Chur |
| Ticino | Lugano, Bellinzona |
Common Use Cases
- IT job market analysis: Track hiring trends in the Swiss IT sector
- Competitive intelligence: Monitor competitors' IT hiring
- Job aggregation: Build specialized IT job search platforms
- Still-alive monitoring: Check if previously scraped jobs are still active (Direct URLs mode)
- Post-deduplication enrichment: Scrape basic data first, then fetch details for new jobs only
- Tech talent sourcing: Find IT candidates via company postings
- Salary research: Analyze compensation ranges for IT roles
Data Source
This actor scrapes data from the leading Swiss IT job portal:
- Website: ictjobs.ch
- API: WordPress REST API
- Coverage: All of Switzerland, IT jobs only
- Jobs: 157+ categories, thousands of active listings
Legal Notice
This actor accesses publicly available job listings through the WordPress API and public web pages. Please ensure your use case complies with the ictjobs.ch terms of service.
Part of the Santamaria Job Scrapers Suite - Professional-grade job data for the DACH region and beyond. Need help with integration, aggregation, or custom scraping solutions? Contact us at contact@alessandrosantamaria.com