
Personio Job Board Scraper
hipersoft/personio-scraper
Scrape all open jobs from any company's Personio careers page: title, office, department, employment type, seniority, schedule, experience and description. Bulk companies. Public XML feed, no setup.
Total users
1Monthly users
1Total runs
95Per job scraped
$0.001Last rebuilt
Oct 28, 2026Overview
Scrape every open job from any company that hosts its careers page on Personio. Extract job title, office, department, employment type, seniority, schedule, years of experience, created date, full description and apply link into clean JSON, CSV, Excel or XML. Popular across the DACH region and Europe. Pass one company or many in a single run. Fast and reliable.

What does Personio Job Scraper do?
Personio Job Scraper collects the full list of open roles from any Personio-hosted careers page and returns them as structured data. Point it at one or many companies and export the jobs, offices, departments, seniority levels and descriptions you need for aggregation, sourcing or hiring-trend analysis.
What data can you scrape from Personio?
- π’ Company β the Personio subdomain each job belongs to
- π Job details β title, department, recruiting category, occupation
- π Offices β primary office plus all offices the role is open in
- πΌ Role type β employment type, seniority, schedule
- π Experience β years of experience required
- π Full descriptions β combined job-description sections (optional)
- π Apply link β direct URL to apply
- ποΈ Created date β when the role was posted
Use cases
- Job aggregators & boards β feed fresh, structured Personio listings into your own site
- Recruiting & sourcing β monitor which companies are hiring across the DACH region and Europe
- Hiring-trend analysis β track departments, offices, seniority and schedules over time
- ATS & CRM enrichment β keep an internal dataset of open roles up to date
- Lead generation β find companies actively hiring for particular skills
How to scrape Personio job data
- Add Personio Job Scraper to your Apify account.
- Enter one or more companies in
companiesβ a Personio subdomain (e.g.personio) or a full career URL. - Toggle
includeContentto add each job's full description. - Set
maxJobsPerCompanyto cap results per company (0 = all). - Run the Actor and export the results as JSON, CSV, Excel or XML β or pull them via the API.
Input
{
"companies": ["personio", "https://tado.jobs.personio.com"],
"includeContent": true,
"maxJobsPerCompany": 0
}
| Field | Description |
|---|---|
companies |
Personio subdomains or career URLs (e.g. personio or https://tado.jobs.personio.com) β required. |
includeContent |
Include each job's full description. Default true. |
maxJobsPerCompany |
Maximum jobs to return per company. 0 = all. |
proxyConfiguration |
Proxy configuration for the run β leave the default. |
Output

{
"company": "personio",
"jobId": 1834171,
"title": "Staff Software Engineer, Data Platform",
"office": "Munich",
"offices": ["Munich", "Vienna"],
"department": "Product and Tech",
"recruitingCategory": "Engineering",
"employmentType": "permanent",
"seniority": "experienced",
"schedule": "full-time",
"yearsOfExperience": "7-10",
"occupation": "Software Engineer",
"occupationCategory": "IT & Software Development",
"createdAt": "2026-07-10T09:14:00Z",
"applyUrl": "https://personio.jobs.personio.com/job/1834171",
"description": "Your responsibilities⦠(when includeContent is on)"
}
Output schema
| Field | Type | Description |
|---|---|---|
company |
string | Personio subdomain the job belongs to. |
jobId |
integer | Unique Personio job listing ID. |
title |
string | Job title. |
office |
string | Primary office for the role. |
offices |
array | All offices the role is open in. |
department |
string | Department the role sits in. |
recruitingCategory |
string | Recruiting category for the role. |
employmentType |
string | Employment type, e.g. permanent, temporary. |
seniority |
string | Seniority level, e.g. experienced, entry-level. |
schedule |
string | Work schedule, e.g. full-time, part-time. |
yearsOfExperience |
string | Years of experience required. |
occupation |
string | Occupation for the role. |
occupationCategory |
string | Broader occupation category. |
createdAt |
string (ISO date) | When the role was created. |
applyUrl |
string (URL) | URL to apply for the role. |
description |
string | Full job description text (when includeContent is on). |
Need more job data?
Combine Personio with other job sources for wider coverage:
- SmartRecruiters Job Scraper β jobs from SmartRecruiters career sites.
- Ashby Job Board Scraper β jobs from Ashby careers boards.
- Greenhouse Job Board Scraper β jobs from Greenhouse careers boards.
- Arbeitnow Job Scraper β jobs across Europe with tags and descriptions.
FAQ
Where do I find a company's Personio subdomain?
It's in the careers URL β personio.jobs.personio.com β personio. A full URL works too.
Do I need an account or login? No. There's no setup and no login β just add one or more companies and run.
How many jobs can I scrape per run?
Use maxJobsPerCompany to cap results per company, or set 0 for all. Add more companies to companies for wider coverage.
How does billing work? You pay per job you get, plus a small per-request charge β pay only for what you scrape.
What's the output format? Structured JSON β one record per job with title, office, department, employment type, seniority, schedule, dates, links and (optionally) the full description. Export as JSON, CSV, Excel or XML.
Is scraping Personio job boards legal? Only public job data shown to any visitor on a Personio careers page is collected. This is an independent tool, not affiliated with Personio; check Personio's and each company's terms and applicable regulations for your use case.
Can I integrate this with other tools? The Personio Job Scraper can be connected with almost any cloud service or web app thanks to integrations on the Apify platform. It works with Make, Zapier, Slack, Airbyte, GitHub, Google Drive and many more, plus the Apify API, JavaScript/Python clients and MCP. Or use webhooks to trigger an action whenever a run finishes.
Notes
Original clean-room implementation. Returns only public data; you are responsible for compliance with Personio's and each company's terms. Not affiliated with Personio.
Input
| Field | Type | Description |
|---|---|---|
companies requiredCompanies | array | Personio company subdomains or career URLs β e.g. "personio" or https://personio.jobs.personio.com. |
includeContentInclude full description | boolean | Include each job's full description text. Default: true |
maxJobsPerCompanyMax jobs per company | integer | Limit jobs per company. 0 = all. Default: 0 |
proxyConfigurationProxy | object | Proxy configuration. Leave the default β it is tuned for reliable results. Default: {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]} |
API
curl -X POST "https://api.apify.com/v2/acts/hipersoft~personio-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"companies": [
"personio",
"tado"
]
}'from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("hipersoft/personio-scraper").call(run_input={
"companies": [
"personio",
"tado"
]
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('hipersoft/personio-scraper').call({
"companies": [
"personio",
"tado"
]
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);Pricing
| Event | Price | Paid plans from |
|---|---|---|
| Job scraped One job posting scraped. | $0.001 | $0.0005 |
| API request One company feed fetched. | $0.0005 | $0.0005 |
You pay only for what the run returns. Set a maximum cost per run and it stops cleanly at that limit.
Related scrapers
Dribbble Shots Scraper
Scrape public design shots from Dribbble: title, high-res image, tags, likes, views and designer credit. Filter by category or sort, export JSON, CSV or Excel.
359 runs Β· 5 users Β· $0.003 / shot scrapedComputrabajo Scraper
Scrape Computrabajo job listings across Latin America (Mexico, Colombia, Argentina, Chile, Peru and more): title, company, location, salary, posted date and apply URL. Filter by country and keyword. No setup.
206 runs Β· 4 users Β· $0.002 / listing scrapedKraken Market Data Scraper
Fetch Kraken spot market data in bulk: ticker stats (ask, bid, last, 24h high/low/volume/vwap), OHLC candles for any interval, order book depth (top bids/asks), and tradable pair metadata. Fast, clean and cheap.
165 runs Β· 4 users Β· $0.001 / pair scrapedBayt Scraper
Scrape Bayt.com job listings across the Middle East (UAE, Saudi Arabia, Egypt, Qatar and more): title, company, location, posted date and apply URL. Filter by country and keyword.
134 runs Β· 4 users Β· $0.003 / job scrapedGitHub Scraper
Search GitHub and scrape repositories (stars, forks, language, topics, license, dates) or user profiles (name, company, location, bio, followers, public email, repos). Uses the GitHub REST API; optional token for higher rate limits. For developer lead generation, OSS research and recruiting.
131 runs Β· 7 users Β· $0.0008 / item scrapedHacker News Scraper
Scrape Hacker News stories, comments, Ask HN, Show HN, jobs and polls by keyword, points, comments and date range. Sort by relevance or newest. Title, URL, author, points, comment count, text and HN link. Fast clean HTTP via the HN Algolia API, no setup.
130 runs Β· 2 users Β· $0.004 / item scrapedSend the site and the fields. We build it and you get it first.