Personio, Softgarden & JOIN Jobs Scraper – DACH ATS
Pricing
from $1.50 / 1,000 jobs
Personio, Softgarden & JOIN Jobs Scraper – DACH ATS
Scrape jobs from Personio, Softgarden, JOIN, Recruitee, Teamtailor, SmartRecruiters & Workable career pages. Auto-detects the ATS from any company URL. For recruiters, staffing & sales teams.
Pricing
from $1.50 / 1,000 jobs
Rating
0.0
(0)
Developer
ninhothedev
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
5 days ago
Last modified
Categories
Share
Scrape job postings from the career pages of the applicant-tracking systems German, Austrian and Swiss companies actually use: Personio, Softgarden, JOIN, Recruitee, Teamtailor, SmartRecruiters and Workable. Paste career URLs, slugs or just company websites. The actor detects the ATS, reads its public job feed and returns clean, flat job data: title, department, location, country, remote flag, employment type, seniority, salary, posting date, apply link and full description text. You don't need an API key, login or proxy, and you pay per job.
LinkedIn and Indeed only show part of the market, and the data arrives late. Most DACH SMEs and scale-ups publish every opening first on their own Personio or Softgarden page. This actor reads those pages directly.
What data can you extract?
| Field | Example |
|---|---|
company | tado GmbH |
ats | personio / softgarden / join / recruitee / teamtailor / smartrecruiters / workable |
job_id | 2502124 |
title | Team Lead Accounting (m/f/d) |
department | Finance |
location, city, country | Germany - Munich · Munich · DE |
remote, workplace_type | false · onsite / hybrid / remote |
employment_type | Permanent, Full-time |
seniority | Experienced / Junior / Student … |
salary (+ salary_min, salary_max, salary_currency, salary_period) | 80.000–100.000 EUR / year |
posted_at | 2026-01-22T09:48:25+00:00 |
url, apply_url | https://tado.jobs.personio.de/job/2502124 |
description_text | Full description as plain text |
language | de / en |
company_slug, category, career_page, scraped_at | extra context |
Field names match our ATS Jobs Scraper (Greenhouse & Lever) wherever the two overlap, so you can merge the datasets.
Supported ATS and accepted inputs
| ATS | Example input |
|---|---|
| Personio | https://acme.jobs.personio.de (or .com) |
| Softgarden | https://acme.softgarden.io |
| JOIN | https://join.com/companies/acme |
| Recruitee | https://acme.recruitee.com (custom domains too) |
| Teamtailor | https://acme.teamtailor.com (custom domains too) |
| SmartRecruiters | https://jobs.smartrecruiters.com/Acme |
| Workable | https://apply.workable.com/acme |
| Any website | acme.de or https://www.acme.com/karriere: the ATS is detected automatically |
| Bare slug | acme: all ATS are probed, or you can set the ATS field |
How to use
- Add companies: career URLs, slugs or plain websites.
- Optionally filter by keywords in the title, location (city, country or ISO code), department or remote only.
- Click Start and download the results as JSON, CSV or Excel, or fetch them via the API.
{"companies": ["https://tado.jobs.personio.de", "feri.softgarden.io", "join.com/companies/pflegia", "amperecloud.com"],"keyword": "engineer, entwickler, sales","location": "Berlin, München, AT, CH","remoteOnly": false,"includeDescription": true,"maxJobsPerCompany": 0,"maxItems": 500}
Output example
Real item from a test run:
{"company": "tado GmbH","ats": "personio","job_id": "2502124","title": "Team Lead Accounting (m/f/d)","department": "Finance","location": "Germany - Munich","city": "Munich","country": "DE","remote": false,"employment_type": "Permanent, Full-time","seniority": "Experienced","salary": "80.000–100.000 EUR / year","posted_at": "2026-01-22T09:48:25+00:00","url": "https://tado.jobs.personio.de/job/2502124","apply_url": "https://tado.jobs.personio.de/job/2502124","description_text": " …","language": "","company_slug": "tado","workplace_type": "","salary_min": 80000,"salary_max": 100000,"salary_currency": "EUR","salary_period": "year","category": "People & Culture","career_page": "https://tado.jobs.personio.de","scraped_at": "2026-10-15T18:57:56+00:00"}
A RUN_SUMMARY record in the key-value store lists, for each input, the detected ATS, how it was detected, jobs listed and saved, and any error.
Pricing
Pay per result: $1.50 per 1,000 jobs, plus a tiny start fee. 1,000 jobs cost about $1.50. Use maxItems to cap the cost. Runs are plain HTTP requests (no browser, no proxy), so they are fast and cheap. 100 companies usually finish in a few minutes.
Use cases
- Recruiters and staffing agencies: monitor the career pages of target clients and find new openings before they reach job boards.
- Sales teams: use hiring signals as buying intent. A company hiring "Head of Finance" or 10 engineers is a lead.
- HR-tech and job boards: aggregate DACH jobs from the ATS sources directly, normalised into one schema.
- Market and salary research: compare salary ranges (Personio, JOIN, Recruitee) and remote shares across companies.
- Competitive intelligence: track which teams competitors are building.
- Investors: watch headcount growth in portfolio or pipeline companies.
Integrations
Use the actor via the Apify API, schedules, webhooks, or connect it to Make, Zapier, n8n, Google Sheets, Airtable, Slack and others.
from apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("ninhothedev/dach-ats-jobs-scraper").call(run_input={"companies": ["https://tado.jobs.personio.de", "grohe"], "keyword": "engineer"})for job in client.dataset(run["defaultDatasetId"]).iterate_items():print(job["company"], job["title"], job["url"])
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<APIFY_TOKEN>' });const run = await client.actor('ninhothedev/dach-ats-jobs-scraper').call({ companies: ['join.com/companies/pflegia'] });const { items } = await client.dataset(run.defaultDatasetId).listItems();
FAQ
Is this legal? The actor reads only public job postings that companies publish so applicants can find them, using the feeds the ATS provides for career pages. No personal data or logins are involved.
How does auto-detection work? For a website, the actor loads the homepage and the careers pages and looks for links to a supported ATS. It also recognises boards on custom domains (Recruitee, Teamtailor, Softgarden). If nothing turns up, it tries the brand name as a slug on every ATS. Companies whose job widget loads only through JavaScript may still need their ATS URL.
Why do some fields stay empty? Each ATS publishes different data. Salary appears only if the company publishes it. Personio feeds sometimes omit descriptions. Softgarden lists no department.
Do I need proxies? No. All sources are public, light-weight feeds.
Can I schedule it? Yes. Use an Apify schedule (for example daily) and a webhook or integration to push new jobs to your CRM or Google Sheet.
Something broken or an ATS missing? Open an issue on the actor page. We usually respond within 24 h.