Ostjob.ch Scraper - Eastern Switzerland Job Board
Pricing
from $3.00 / 1,000 results
Ostjob.ch Scraper - Eastern Switzerland Job Board
Scrapes job listings from Ostjob.ch, the leading job portal for Eastern Switzerland (St. Gallen, Thurgau, Appenzell, Graubünden). Filter by canton, workload, and company type. Includes optional LLM-powered 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
Ostjob.ch Job Scraper
Scrapes job listings from ostjob.ch, the leading job portal for Eastern Switzerland (Ostschweiz).
Three Scraping Modes
This actor supports three distinct scraping modes for different use cases:
1. SEARCH MODE (Default)
Search for jobs using query/location filters. Returns job listings matching your search criteria.
Use case: Regular job scraping, finding new opportunities
Example input:
{"searchQuery": "Informatiker","location": "St. Gallen","maxResults": 200}
2. DIRECT URL MODE
Check if specific job URLs are still online (still alive checks). Fetches jobs by their URLs directly from the API.
Use case: Monitoring if previously scraped jobs are still available, updating job status in your database
Example input:
{"directUrls": ["https://www.ostjob.ch/job/software-entwickler/12345","https://www.ostjob.ch/job/projekt-manager/67890","https://www.ostjob.ch/job/verkaufsberater/54321"]}
Output: Each job will have a job_status field:
"online"- Job is still available, full data extracted"offline"- Job not found (404) or removed
3. SEARCH+DETAILS MODE
Search for jobs AND fetch full details. Same as SEARCH MODE but with includeJobDetails: true.
Use case: Get comprehensive job data including full descriptions
Example input:
{"searchQuery": "Pflege","location": "Thurgau","maxResults": 100,"includeJobDetails": true}
Features
- API-based scraping - Uses the official Ostjob API for fast, reliable data extraction
- Smart location filtering - Enter any canton, district, or city name - auto-resolves via API
- Sort by date - Get newest jobs first for job monitoring use cases
- Workload filter - Filter by Pensum percentage (e.g., 40-60% for part-time)
- Regional focus - Specializes in jobs from St. Gallen, Thurgau, Appenzell, Graubünden, and surrounding areas
- Comprehensive job data - Extracts title, company, location, workload, contact details, and more
- Company enrichment - Includes company description, social media URLs, and benefits when available
- LLM-powered contact extraction - Optional AI-powered extraction of contact person details (salutation, first name, last name) using Groq or OpenRouter
- HR company filtering - Filter out recruitment agencies to get direct employer postings, or filter to only show HR agencies
- Still alive checks - Verify if specific job URLs are still active
- Standardized output - Returns data in the
JobListingschema format - Rate-limited - Respectful 4-second delays between API requests
- Proxy support - Built-in proxy rotation for reliability
Input
| Field | Type | Description | Default |
|---|---|---|---|
directUrls | array | List of job URLs to scrape directly (for still alive checks) | [] |
searchQuery | string | Job title, skills, or keywords to search for | "" (all jobs) |
location | string | Canton, district, or city name (e.g., "St. Gallen", "Thurgau", "Zürich 8001"). Auto-resolves location type via API. | "" (all Eastern Switzerland) |
maxResults | integer | Maximum number of job listings to scrape | 500 |
sortOrder | string | Sort order: by_relevance (best match) or by_date (newest first) | by_relevance |
workloadMin | integer | Minimum workload/Pensum percentage (0-100) | - |
workloadMax | integer | Maximum workload/Pensum percentage (0-100) | - |
includeJobDetails | boolean | Fetch full job descriptions | 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 |
Sort Order
Control how job results are sorted:
| Option | Description |
|---|---|
by_relevance | Best matches to your search query first (default) |
by_date | Newest jobs first - recommended for job monitoring |
Use by_date when you want to monitor for new job postings or get the latest opportunities.
Workload Filter (Pensum)
Filter jobs by workload percentage (Pensum in Swiss German):
| Example | Description |
|---|---|
workloadMin: 80 | Jobs with at least 80% workload |
workloadMax: 60 | Part-time jobs up to 60% |
workloadMin: 40, workloadMax: 60 | Part-time jobs between 40-60% |
This is useful for finding part-time positions or full-time only jobs.
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 (e.g., HP Job, Universal-Job, Adecco) |
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", "Zeitarbeit", etc.
Use cases:
- Job seekers often prefer direct employer postings for more detailed job information
- Recruiters may want to analyze competitor agency postings
LLM Contact Extraction (Optional)
The scraper can optionally use an LLM to extract structured contact person details from the raw HTML contact block. This is useful because many job postings embed the contact person's name in unstructured HTML.
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" (only if gender is clearly indicated)contact_firstname- First name of contact personcontact_lastname- Last name of contact person
Example Inputs
SEARCH MODE - Basic Search
{"searchQuery": "Informatiker","location": "St. Gallen","maxResults": 200}
SEARCH MODE - Job Monitoring (Newest First)
{"searchQuery": "","location": "Thurgau","maxResults": 100,"sortOrder": "by_date"}
SEARCH MODE - Part-Time Jobs (40-60%)
{"searchQuery": "Buchhaltung","location": "St. Gallen","workloadMin": 40,"workloadMax": 60,"maxResults": 50}
SEARCH MODE - Exclude HR Agencies
{"searchQuery": "Elektriker","location": "St. Gallen","maxResults": 100,"companyFilter": "exclude-hr"}
SEARCH MODE - With LLM Extraction
{"searchQuery": "Elektriker","location": "St. Gallen","maxResults": 100,"llmApiKey": "gsk_your_groq_api_key_here","llmModel": "llama-3.1-8b-instant"}
DIRECT URL MODE - Still Alive Checks
{"directUrls": ["https://www.ostjob.ch/job/software-entwickler/12345","https://www.ostjob.ch/job/projekt-manager/67890","https://www.ostjob.ch/job/verkaufsberater/54321","https://www.ostjob.ch/job/pflegefachfrau/11111"]}
Output
Each job listing follows the standardized JobListing schema:
{"id": "12345","title": "Software Entwickler (m/w/d)","company": "Tech Solutions AG","location": "St. Gallen, 9000, SG","canton": "SG","job_status": "online","employment_type": "full-time","workload_min": 80,"workload_max": 100,"remote_option": null,"description_snippet": "Wir suchen einen erfahrenen Entwickler...","description_full": "Tätigkeit: ...\n\nAnforderungen: ...\n\nWir bieten: ...","requirements": ["3+ Jahre Erfahrung in Java"],"posted_at": "2024-01-15T00:00:00.000Z","expires_at": "2024-02-28T00:00:00.000Z","source_url": "https://www.ostjob.ch/job/software-entwickler/12345","source_platform": "ostjob.ch","contact_salutation": "Herr","contact_firstname": "Thomas","contact_lastname": "Müller","contact_email": "jobs@techsolutions.ch","contact_phone": "+41712345678","contact_raw": "<strong>Kontakt:</strong><br/>Herr Thomas Müller<br/>E-Mail: jobs@techsolutions.ch<br/>Tel: +41 71 234 56 78","apply_url": "https://careers.techsolutions.ch/apply","apply_email": "jobs@techsolutions.ch","company_url": "https://www.techsolutions.ch","company_description": "Tech Solutions AG ist ein führender IT-Dienstleister...","company_social_urls": {"linkedin": "https://linkedin.com/company/techsolutions","xing": "https://xing.com/companies/techsolutions"},"company_benefits": ["Flexible Arbeitszeiten", "Home Office", "Weiterbildung"],"scraped_at": "2024-01-16T12:00:00.000Z"}
Output Fields
| Field | Description |
|---|---|
job_status | Job availability status: "online" (still available), "offline" (removed/404). Only set in DIRECT URL mode. |
contact_raw | Raw HTML/text contact block from the job posting (always populated) |
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 (no LLM needed) |
contact_phone | Phone number - extracted via regex (no LLM needed) |
company_description | Company about/description text (HTML stripped) |
company_social_urls | Object with social media links (linkedin, xing, facebook, etc.) |
company_benefits | Array of company benefits/perks (e.g., "Flexible Arbeitszeiten") |
Job Status Values (DIRECT URL Mode)
When using directUrls, each job will have a job_status field:
| Value | Description |
|---|---|
"online" | Job is still available on ostjob.ch, full data extracted |
"offline" | Job not found (404) or removed, minimal data returned |
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~ostjob-ch-scraper/runs" \-H "Authorization: Bearer YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"searchQuery": "Pflege","location": "Thurgau","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/ostjob-ch-scraper').call({searchQuery: 'Buchhaltung',location: 'St. Gallen',maxResults: 150,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(`Found ${items.length} jobs`);
Still Alive Checks via API
// Check if previously scraped jobs are still onlineconst run = await client.actor('santamaria/ostjob-ch-scraper').call({directUrls: ['https://www.ostjob.ch/job/software-entwickler/12345','https://www.ostjob.ch/job/projekt-manager/67890',]});const { items } = await client.dataset(run.defaultDatasetId).listItems();items.forEach(job => {console.log(`Job ${job.id}: ${job.job_status}`);// Output: "Job 12345: online" or "Job 67890: offline"});
Covered Regions
Ostjob.ch specializes in jobs from Eastern Switzerland:
| Canton | Major Cities |
|---|---|
| SG | St. Gallen, Rapperswil, Wil |
| TG | Frauenfeld, Kreuzlingen, Arbon |
| AR | Herisau, Teufen |
| AI | Appenzell |
| GR | Chur, Davos, St. Moritz |
| GL | Glarus |
Performance
- Speed: ~100-200 jobs/minute (limited by respectful rate limiting)
- Cost: ~0.01-0.03 CU per 500 jobs
- Reliability: Built-in retry logic and error handling
- Direct URL mode: ~1-2 seconds per URL check (4-second rate limit between requests)
Data Source
This actor scrapes data from the leading Eastern Switzerland job portal:
- Website: ostjob.ch
- API: Public vacancy search API (
https://api.ostjob.ch/public/vacancy/) - Coverage: Eastern Switzerland (Ostschweiz)
Legal Notice
This actor accesses publicly available job listings through the API. Please ensure your use case complies with the ostjob.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