ICTjobs.ch Scraper - Swiss IT & Tech Jobs avatar
ICTjobs.ch Scraper - Swiss IT & Tech Jobs

Pricing

from $3.00 / 1,000 results

Go to Apify Store
ICTjobs.ch Scraper - Swiss IT & Tech Jobs

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

Alessandro Santamaria

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

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:

ModeInputOutputUse Case
SEARCH MODESearch query + category + regionBasic job data from listingsFast discovery of new IT jobs
SEARCH + DETAILS MODEincludeJobDetails: true (default)Full job data with descriptionsComplete data collection in one run
DIRECT URLS MODEdirectUrls: [...]Full job data + job_statusStill-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 JobListing schema format
  • Rate-limited - Respectful 2-second delays between API requests
  • Proxy support - Built-in proxy rotation for reliability

Input

FieldTypeDescriptionDefault
directUrlsarrayDirect job URLs to scrape (skips search mode)[]
searchQuerystringJob title, skills, or keywords to search for"" (all jobs)
categorystringJob category/field (e.g., "Software Development", "DevOps")"" (all categories)
regionstringSwiss region or canton (e.g., "Zürich", "Bern", "Basel")"" (all Switzerland)
employmentTypestringEmployment type: all, full-time, part-time, internship, contract, temporaryall
maxResultsintegerMaximum number of job listings to scrape500
includeJobDetailsbooleanFetch full job descriptions from detail pages (slower but more data)true
companyFilterstringFilter by company type: all, exclude-hr, only-hrall
llmApiKeystringAPI key for LLM contact extraction (optional, secret)-
llmModelstringLLM model for contact extractionnone
proxyConfigurationobjectApify proxy settingsResidential

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, or unknown
  • 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:

  1. Provide array of Ictjobs.ch job detail URLs
  2. Scraper visits each URL directly
  3. Detects if job is still online or has been removed
  4. Extracts JSON-LD structured data if available
  5. Returns job_status field 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:

OptionDescription
allInclude all companies (default)
exclude-hrRemove HR/recruitment agencies
only-hrShow 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 IDProviderDescription
llama-3.1-8b-instantGroqFast, lightweight (default)
mistral-small-3.1-24b-instructOpenRouterMore capable, higher quality

The LLM extracts:

  • contact_salutation - "Herr" or "Frau"
  • contact_firstname - First name of contact person
  • contact_lastname - Last name of contact person

Example Input

{
"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

FieldDescription
idUnique job posting ID
titleJob title
companyCompany name
locationCity/location with postal code and canton
cantonSwiss canton code (ZH, BE, AG, etc.)
job_statusJob availability: online, offline, expired, unknown (Direct URLs mode only)
top_listingBoolean - if job is a paid promotion (always null for ictjobs.ch)
employment_typefull-time, part-time, contract, temporary, internship
workload_minMinimum workload percentage (extracted from title if available)
workload_maxMaximum workload percentage (extracted from title if available)
remote_optionremote, hybrid, or null
salary_textSalary as displayed (if available)
description_snippetFirst 500 characters of description
description_fullComplete job description
requirementsArray of job requirements (usually empty)
posted_atPublication date
expires_atExpiration date (from JSON-LD if available)
source_urlLink to job posting
source_platformAlways "ictjobs.ch"
contact_salutation"Herr" or "Frau" - extracted by LLM if API key provided
contact_firstnameFirst name - extracted by LLM if API key provided
contact_lastnameLast name - extracted by LLM if API key provided
contact_emailEmail address - extracted via regex
contact_phonePhone number - extracted via regex
contact_positionContact person's position (usually null)
contact_rawRaw HTML/text contact block from the job posting
apply_urlApplication URL (usually same as source_url)
apply_emailApplication email address
company_urlCompany website (from JSON-LD if available)
company_descriptionCompany description (usually null)
company_social_urlsSocial media URLs (usually null)
company_benefitsArray of benefits (usually null)
scraped_atTimestamp 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 null since jobs from search results are assumed to be online
  • Values:
    • online - Job page loaded successfully with content
    • offline - Job page returns 404 or "not found"
    • expired - Job explicitly marked as expired
    • unknown - Unable to determine status (page loaded but no clear job data)

Usage

Via Apify Console

  1. Go to the actor page
  2. Configure input parameters
  3. Click "Start"
  4. 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:

  1. Main Listing Page (https://ictjobs.ch/)

    • Job cards in div.offer.publish elements
    • Pagination via /page/N/ URL pattern
    • Search support via ?fs=query parameter
    • Extracts: title, company, location, posted date
  2. 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 positions
  • part-time - Teilzeit positions
  • internship - Praktikum
  • contract - Vertrag/Contractor
  • temporary - 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 maxResults limit

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_status field 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:

RegionMajor Cities
ZürichZürich, Winterthur
BernBern, Thun
BaselBasel, Liestal
RomandieGeneva, Lausanne, Fribourg
OstschweizSt. Gallen, Chur
TicinoLugano, Bellinzona

Common Use Cases

  1. IT job market analysis: Track hiring trends in the Swiss IT sector
  2. Competitive intelligence: Monitor competitors' IT hiring
  3. Job aggregation: Build specialized IT job search platforms
  4. Still-alive monitoring: Check if previously scraped jobs are still active (Direct URLs mode)
  5. Post-deduplication enrichment: Scrape basic data first, then fetch details for new jobs only
  6. Tech talent sourcing: Find IT candidates via company postings
  7. 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

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