Stellenanzeigen.de Scraper - German Job Portal
Pricing
from $2.50 / 1,000 job search results
Stellenanzeigen.de Scraper - German Job Portal
Scrapes job listings from Stellenanzeigen.de, one of Germany's Top 3 job portals. Extracts comprehensive job data including title, company, location, salary, requirements, and contact information with support for direct URL checking and search-based scraping.
Pricing
from $2.50 / 1,000 job search results
Rating
0.0
(0)
Developer
NanoScrape
Maintained by CommunityActor stats
2
Bookmarked
45
Total users
11
Monthly active users
5 days ago
Last modified
Categories
Share
Stellenanzeigen.de Job Scraper
Scrapes job listings from Stellenanzeigen.de - one of Germany's Top 3 job portals with over 10,000 active job postings across all industries.
HTTP-only, ultra-lightweight - No browser needed. Runs on just 128 MB of memory for extremely low compute costs.
Three Scraping Modes
| Mode | Input | Output | Use Case |
|---|---|---|---|
| SEARCH MODE | Search query + filters | Basic job data from SERP | Fast discovery of new jobs |
| SEARCH + DETAILS MODE | includeJobDetails: true | 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 |
Use with AI Agents (MCP)
Connect this actor to any MCP-compatible AI client - Claude Desktop, Claude.ai, Cursor, VS Code, LangChain, LlamaIndex, or custom agents.
Apify MCP server URL:
https://mcp.apify.com?tools=santamaria-automations/stellenanzeigen-de-scraper
Example prompt once connected:
"Use
stellenanzeigen-de-scraperto scrape job listings from stellenanzeigen de. Return results as a table."
Clients that support dynamic tool discovery (Claude.ai, VS Code) will receive the full input schema automatically via add-actor.
Features
- Multi-keyword search - Run multiple search queries in a single run, deduplicated across queries
- Germany-wide coverage - Search jobs in any city, region, or Bundesland
- No login required - Uses public HTTP endpoints
- Job status checks - Verify if jobs are still online, expired, or removed
- Rich data extraction - Title, company, location, salary, description, contact email/phone, company logo, and more
- Ultra-low resource usage - HTTP-only, no Chrome browser needed (128 MB)
- German state detection - Automatically detects Bundesland codes from city names
- JSON-LD parsing - Extracts structured JobPosting data from detail pages
- Company logos - Extracts company logo URLs from search results and detail pages
- Contact extraction - Finds application email and phone from job descriptions
- Query tracking - Each result includes the
search_querythat found it - Standardized output - Consistent
JobListingschema across all job scrapers - Pay-per-result pricing - Only pay for results you get
- Rate-limited - Respectful delays between requests
- Proxy support - Built-in proxy rotation for reliability
Pricing
This actor uses pay-per-result pricing. You only pay for the data you receive.
| Event | Price | Description |
|---|---|---|
| SERP result | $0.008 | Each job from search results (search-only mode) |
| Detail result | $0.020 | Each job with full details (detail mode or direct URLs) |
Examples:
- 100 search results = $0.80
- 50 jobs with full details = $1.00
- 200 search results + 50 detailed = $2.60
No monthly fees. No minimum spend. Compute costs are minimal (~$0.001/run).
Input
| Field | Type | Description | Default |
|---|---|---|---|
directUrls | array | Direct job URLs to scrape (skips search mode) | [] |
searchQueries | string[] | One or more search keywords (deduplicated across queries) | ["Software Engineer"] |
searchQuery | string | Single keyword (backward compatible, use searchQueries instead) | "" |
location | string | City or region (Arbeitsort) | "" |
radius | integer | Search radius in km around location (0-200) | 0 |
sortBy | string | Sort order: "newest" (date, maps to ?sort=Datum), "relevance" (platform default, no sort param), "" (platform default) | "newest" |
postedWithinDays | integer | Only include jobs posted in the last N days. Set 0 to disable. Platform natively supports 1, 7, or 30 (other values are accepted but may fall back to nearest supported bucket). | 0 |
maxResultsPerQuery | integer | Max results per keyword | 100 |
maxResults | integer | Total cap across all queries (0 = unlimited) | 0 |
includeJobDetails | boolean | Fetch full job descriptions from detail pages | true |
Mode 1: SEARCH MODE (Fast)
Search for jobs using keywords and filters:
- Use case: Discover new jobs, market analysis, broad searches
- Speed: Very fast - pure HTTP requests
- Output: Basic job data from search cards + company logo
- Cost: $0.008 per result
{"searchQueries": ["Software Engineer"],"location": "Berlin","maxResultsPerQuery": 100,"includeJobDetails": false}
Mode 2: SEARCH + DETAILS MODE (Complete Data)
Search with includeJobDetails: true to fetch full descriptions:
- Use case: Complete data collection in one run
- Speed: Moderate - fetches detail page for each job via HTTP
- Output: Full descriptions, salary, contact info, company data
- Cost: $0.020 per result
{"searchQueries": ["Marketing Manager"],"location": "München","maxResultsPerQuery": 50,"includeJobDetails": true}
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
- Cost: $0.020 per result
{"directUrls": ["https://www.stellenanzeigen.de/job/software-engineer-berlin-12345678/","https://www.stellenanzeigen.de/job/marketing-manager-muenchen-23456789/"]}
Multi-Keyword Search
Search for multiple job types in a single run. Results are deduplicated across queries, and each result includes the search_query that found it.
{"searchQueries": ["Software Engineer","Fullstack Entwickler","DevOps Engineer","Data Scientist"],"location": "Berlin","maxResultsPerQuery": 50,"maxResults": 0,"includeJobDetails": true}
This will search for all 4 keywords, collect up to 50 results per keyword, and deduplicate across queries. Each result will have a search_query field showing which keyword found it first.
Example Input
Basic Search (IT Jobs in Berlin)
{"searchQueries": ["Software Engineer"],"location": "Berlin","maxResultsPerQuery": 100}
Multiple Keywords with Details
{"searchQueries": ["Pflege", "Krankenpfleger", "Altenpfleger"],"location": "München","radius": 50,"maxResultsPerQuery": 100,"includeJobDetails": true}
Jobs Near Munich (50km Radius)
{"searchQueries": ["Data Scientist"],"location": "München","radius": 50,"maxResultsPerQuery": 100,"includeJobDetails": true}
Newest Jobs First
{"searchQueries": ["Fachinformatiker"],"sortBy": "newest","maxResultsPerQuery": 200}
Direct URLs - Still Alive Check
{"directUrls": ["https://www.stellenanzeigen.de/job/software-engineer-berlin-12345678/","https://www.stellenanzeigen.de/job/marketing-manager-muenchen-23456789/"]}
Output
Each job listing follows the standardized JobListing schema:
Search Mode Output
{"id": "16175643","title": "Senior Software Engineer (m/w/d)","company": "Tech GmbH","location": "Berlin","canton": "BE","country": "DE","job_status": "online","top_listing": false,"employment_type": "full-time","company_logo_url": "https://logos.jobstatic.de/g4j/logo/12345.png","company_benefits": ["Homeoffice", "Flexible Arbeitszeiten", "Firmenwagen"],"search_query": "Software Engineer","posted_at": null,"source_url": "https://www.stellenanzeigen.de/job/senior-software-engineer-berlin-16175643/","source_platform": "stellenanzeigen.de","scraped_at": "2026-03-09T08:30:00.000Z"}
Detail Mode Output (additional fields)
{"id": "16175643","title": "Senior Software Engineer (m/w/d)","company": "Tech GmbH","location": "Berlin, Bundesland Berlin","canton": "BE","country": "DE","work_address": "Friedrichstr. 123 10117 Berlin","job_status": "online","employment_type": "full-time","salary_text": "60.000 - 80.000 EUR/YEAR","salary_min": 60000,"salary_max": 80000,"salary_currency": "EUR","description_snippet": "Wir suchen einen erfahrenen Software Engineer...","description_full": "Full job description with all details...","remote_option": "hybrid","posted_at": "2026-03-05T00:00:00.000Z","originally_posted_at": "2026-02-10T00:00:00.000Z","expires_at": "2026-05-05T00:00:00.000Z","contact_email": "bewerbung@company.de","contact_phone": "+49301234567","apply_url": "https://www.stellenanzeigen.de/job/...","company_url": "https://www.stellenanzeigen.de/unternehmen/tech-gmbh/","company_logo_url": "https://logos.jobstatic.de/g4j/logo/12345.png","company_benefits": ["Homeoffice", "Flexible Arbeitszeiten"],"search_query": "Software Engineer","source_url": "https://www.stellenanzeigen.de/job/senior-software-engineer-berlin-16175643/","source_platform": "stellenanzeigen.de","scraped_at": "2026-03-09T08:30:00.000Z"}
Output Fields
Core Fields (always available)
| Field | Description |
|---|---|
id | Stellenanzeigen.de job ID |
title | Job title |
company | Company name |
location | City/location as displayed |
country | Country code (always DE) |
canton | German state code (BW, BY, BE, etc.) |
job_status | Job availability: online, offline, expired, unknown |
top_listing | Whether job is a promoted/premium listing |
is_sponsored | True when the listing is a boosted top job |
employment_type | full-time, part-time, contract, apprenticeship, internship |
company_logo_url | Company logo image URL |
company_benefits | Array of benefits/perks from search card |
search_query | The search keyword that found this job |
source_url | Link to job posting on stellenanzeigen.de |
job_url | Canonical alias of source_url |
company_name | Canonical alias of company |
posted_at_datetime / posted_at_text | Canonical aliases of posted_at (ISO 8601) |
description_html / description_md | Description as HTML and Markdown (detail mode) |
source_platform | Always stellenanzeigen.de |
scraped_at | Timestamp when job was scraped |
Detail Fields (with includeJobDetails: true or Direct URLs mode)
| Field | Description |
|---|---|
work_address | Full work address (street, postal code, city) |
description_snippet | First 500 characters of description |
description_full | Complete job description (cleaned text) |
salary_text | Salary as displayed (e.g., "60.000 - 80.000 EUR/YEAR") |
salary_min | Minimum salary (numeric) |
salary_max | Maximum salary (numeric) |
salary_currency | Currency code (usually EUR) |
remote_option | remote, hybrid, onsite (detected from description) |
posted_at | Current re-listing or refresh date (ISO 8601). This is the date the platform's sort=Datum and postedWithinDays filter operate on. Use this for freshness checks and date-ordered pipelines. |
originally_posted_at | First-ever post date (ISO 8601). When an employer re-lists a job, posted_at advances to the refresh date while originally_posted_at stays at the original publication date. Compare both fields to detect re-listings. |
expires_at | Expiration date (ISO 8601) |
contact_email | Application email from description |
contact_phone | Contact phone from description |
apply_url | Application URL |
company_url | Company profile URL on stellenanzeigen.de |
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~stellenanzeigen-de-scraper/runs" \-H "Authorization: Bearer YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"searchQueries": ["Software Engineer", "DevOps Engineer"],"location": "Berlin","maxResultsPerQuery": 100,"maxResults": 0,"includeJobDetails": true}'
Via Apify SDK (Node.js)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('santamaria-automations/stellenanzeigen-de-scraper').call({searchQueries: ['Data Scientist', 'ML Engineer'],location: 'München',maxResultsPerQuery: 50,maxResults: 0,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(`Found ${items.length} jobs`);items.forEach(job => {console.log(`[${job.search_query}] ${job.title} @ ${job.company}`);});
Still Alive Checks via API
// Check if previously scraped jobs are still onlineconst run = await client.actor('santamaria-automations/stellenanzeigen-de-scraper').call({directUrls: ['https://www.stellenanzeigen.de/job/software-engineer-berlin-12345678/','https://www.stellenanzeigen.de/job/marketing-manager-muenchen-23456789/',]});const { items } = await client.dataset(run.defaultDatasetId).listItems();items.forEach(job => {console.log(`Job ${job.id}: ${job.job_status}`);// Output: "Job 12345678: online" or "Job 23456789: expired"});
Performance
| Metric | Search Mode | Detail Mode |
|---|---|---|
| Speed | ~50-100 jobs/min | ~30-40 jobs/min |
| Memory | 128 MB | 128 MB |
| Compute cost | ~$0.001/run | ~$0.002/run |
- Rate limiting: 2 seconds between search pages, 1 second between detail pages
- Retry logic: Automatic retries with exponential backoff
- Zero browser overhead: Pure HTTP requests with TLS fingerprinting
Proxy
Proxy handling is built in. The actor rotates Apify datacenter proxies automatically, so there is nothing to configure.
Common Use Cases
- German job market analysis - Track hiring trends across Bundeslaender and industries
- Competitive intelligence - Monitor which companies are hiring for specific roles
- Job aggregation - Build job search platforms with German job data
- Still-alive monitoring - Check if previously scraped jobs are still active
- Salary research - Analyze compensation ranges from job postings
- Regional analysis - Compare job markets across German states
- Apprenticeship tracking - Monitor Ausbildung openings by region
- Multi-role search - Search for multiple job titles in one run
How It Works
Technical Architecture
This actor is 100% HTTP-only - no browser automation needed. It uses:
- got-scraping - HTTP client with TLS fingerprinting for browser-like requests
- Cheerio - Fast HTML parser for extracting structured data from search pages
- JSON-LD - Parses
@type: "JobPosting"structured data from detail pages
Search Mode (Modes 1 & 2)
- Loops over each search query keyword
- Queries stellenanzeigen.de search with your filters
- Parses job cards from HTML response (using
data-jobidattribute) - Deduplicates across queries (same job found by multiple keywords is only scraped once)
- Optionally fetches each job's detail page for JSON-LD data
- Validates each job against the schema before saving
- Paginates automatically until per-query or total limit is reached
Direct URLs Mode (Mode 3)
- Fetches job data from each provided URL
- Parses JSON-LD JobPosting data
- Detects job status (online, expired, offline)
- Returns full job data with status field
Limitations
- Stellenanzeigen.de shows promoted/premium listings first in search results, regardless of location filter
- Some fields (salary, contact info) may not be available for all job postings
- Contact information is extracted from description text only (not all jobs include it)
- Cloudflare protection may block requests without proxy - use datacenter proxy for reliability
- German state codes are automatically detected from city names but depend on the city database coverage
sortBysupports two options:"newest"(adds?sort=Datum) and"relevance"(omits the sort param, platform default). No other sort modes exist on this platform.
Legal Notice
This actor scrapes publicly available job listings from stellenanzeigen.de's public job search. It does not access any data behind authentication.
Users are responsible for ensuring their use complies with stellenanzeigen.de's Terms of Service and applicable laws in their jurisdiction.
Related Actors
Working across the German job market? These complement Stellenanzeigen.de:
- StepStone.de Scraper - Germany's #1 general job board (deepest inventory across all industries).
- Stellenmarkt.de Scraper - leading German national job board (peer generalist marketplace).
- Arbeitsagentur.de Scraper - Germany's federal employment agency (Bundesagentur für Arbeit) public listings.
- Jobware.de Scraper - German IT/engineering specialist board.
- Meine Stadt Scraper - German local/regional jobs by city.
- Nicejob.de Scraper - German job board with company-culture focus.
- E-Fellows Scraper - German student/graduate jobs and internships.
DACH neighbours:
- Jobs.ch Scraper - Switzerland's #1 job site.
- Karriere.at Scraper - Austria's leading job board.
Global aggregators:
Enrich your job data
- Website Job Extractor -- Extract jobs directly from company career pages
- Website Contact Extractor -- Get emails and phone numbers from company websites
- Website Email & Phone Scraper -- Fast email and phone extraction (no AI needed)
Feedback & Support
Have a feature request, found a bug, or need help? Open an issue - we actively monitor and respond.
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@nanoscrape.com