Personio, Softgarden & JOIN Jobs Scraper – DACH ATS avatar

Personio, Softgarden & JOIN Jobs Scraper – DACH ATS

Pricing

from $1.50 / 1,000 jobs

Go to Apify Store
Personio, Softgarden & JOIN Jobs Scraper – DACH ATS

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

ninhothedev

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

5 days ago

Last modified

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?

FieldExample
companytado GmbH
atspersonio / softgarden / join / recruitee / teamtailor / smartrecruiters / workable
job_id2502124
titleTeam Lead Accounting (m/f/d)
departmentFinance
location, city, countryGermany - Munich · Munich · DE
remote, workplace_typefalse · onsite / hybrid / remote
employment_typePermanent, Full-time
seniorityExperienced / Junior / Student …
salary (+ salary_min, salary_max, salary_currency, salary_period)80.000–100.000 EUR / year
posted_at2026-01-22T09:48:25+00:00
url, apply_urlhttps://tado.jobs.personio.de/job/2502124
description_textFull description as plain text
languagede / en
company_slug, category, career_page, scraped_atextra 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

ATSExample input
Personiohttps://acme.jobs.personio.de (or .com)
Softgardenhttps://acme.softgarden.io
JOINhttps://join.com/companies/acme
Recruiteehttps://acme.recruitee.com (custom domains too)
Teamtailorhttps://acme.teamtailor.com (custom domains too)
SmartRecruitershttps://jobs.smartrecruiters.com/Acme
Workablehttps://apply.workable.com/acme
Any websiteacme.de or https://www.acme.com/karriere: the ATS is detected automatically
Bare slugacme: all ATS are probed, or you can set the ATS field

How to use

  1. Add companies: career URLs, slugs or plain websites.
  2. Optionally filter by keywords in the title, location (city, country or ISO code), department or remote only.
  3. 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 ApifyClient
client = 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.