Personio Jobs Lookup — Live Postings by Company avatar

Personio Jobs Lookup — Live Postings by Company

Pricing

from $3.00 / 1,000 successful lookups

Go to Apify Store
Personio Jobs Lookup — Live Postings by Company

Personio Jobs Lookup — Live Postings by Company

Look up any company's live Personio job board and get every open role — title, department, office, employment type, seniority, schedule and apply link. Reads Personio's own public XML feed directly, no scraping. Charged once per company, no matter how many roles are open — misses cost nothing.

Pricing

from $3.00 / 1,000 successful lookups

Rating

0.0

(0)

Developer

Adrian Voss

Adrian Voss

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

You give this actor a Personio subdomain or careers URL and it looks up that company's live Personio job board and returns every open role — title, department, office, employment type, seniority, schedule, posting date, and a direct apply link — as one row per posting (or one row per company, your choice). It reads Personio's own public XML job feed (<subdomain>.jobs.personio.de/xml or .com/xml) directly. No scraping a careers page, no API key, no Personio account required.

Who it's for

The accountable_eel catalogue sells company intelligence columns for outbound. Each actor takes a list of domains or company identifiers and returns one flat, stably-named row per input — firmographics, registry IDs, tech stack, email route, hiring activity — the shape a Clay table, an n8n workflow, or an AI agent can consume without post-processing. Pricing is pay-per-event and per-domain: a few tenths of a cent for a row that was actually found, and nothing for a miss, so a list that doesn't enrich costs you next to nothing. Where an official source exists — VIES, GLEIF, SEC EDGAR, Brønnøysund, PRH, RDAP — it is queried directly instead of scraped. No seat licence, no monthly minimum, no credit system to decode.

This one's column is hiring activity on Personio specifically — the ATS you'll find behind a large share of DACH-region (Germany/Austria/Switzerland) small-and-mid company careers pages.

Why this one

  • Reads Personio's own public XML feed directly — structured, machine-readable data, not a scraped HTML careers page that breaks the moment the company redesigns its site.
  • Handles both Personio domains. Some companies run on jobs.personio.com instead of the older .de, and Personio's own docs confirm there's no redirect between the two. Paste either form (or the bare subdomain) and the actor uses whichever domain your input actually names.
  • You pay per company, never per job. A board with 40 open roles and a board with 2 both cost one charge.
  • Real job filters, not raw technical fields. Title keyword, exclusion keyword, location, remote-only, and posted-after date — combined the same way every actor in this ATS family combines them, so switching between Greenhouse, Workday, and Personio lookups doesn't mean relearning a filter syntax.
  • A delta mode for scheduled watchlists. Turn on onlyNewSinceLastRun and a scheduled run reports only the postings that appeared since the last one — a hiring alert instead of a full re-dump every time.

What you get

FieldTypeDescription
querytextThe input exactly as you supplied it.
foundbooleantrue if a Personio career page was found for this company, false for a miss.
statustextOK on a hit, NOT_FOUND (no career page or nothing currently open), or BAD_FORMAT (input doesn't look like a Personio subdomain or URL).
subdomaintextThe Personio subdomain identified for this company.
jobCountnumberHow many roles matched your filters (or are new, in delta mode) for this row/company.
totalJobCountnumberHow many roles are on the board before any filtering — always the true total, so a filtered jobCount of 0 is never ambiguous.
newJobsnumberHow many postings are new since your last run. null unless onlyNewSinceLastRun is on.
firstRunbooleanWhether this was the baseline run of a delta watchlist. null unless onlyNewSinceLastRun is on.
jobsarrayThe full list of matching postings for this company, each with the fields below nested inside. Present when "One row per job posting" is off; otherwise the per-job fields below are flattened onto the row instead.
titletextJob title.
departmenttextDepartment, as Personio labels it.
officetextOffice/location, Personio's own field name.
locationtextAlias of office — added so filters read the same way across every ATS actor in this family.
employmentTypetexte.g. permanent, contract, as Personio reports it.
senioritytexte.g. experienced, entry_level, as Personio reports it.
scheduletexte.g. full-time, part-time.
createdAtdateISO timestamp Personio recorded when the posting was created.
postedAtdateAlias of createdAt — Personio's feed carries only one date, so there's no separate first-published vs. last-updated distinction to make.
remotebooleanBest-effort read of whether the role is remote — matched off the title/location text (Personio has no dedicated remote flag).
applyUrllinkDirect link to apply for this posting.
scrapedAtdateWhen this actor fetched the data.

A subdomain with no Personio career page, or a feed with zero open positions, is a found: false row with status/message explaining why, and is never charged.

Price

$6.32 per 1,000 companies, plus a $0.0001 start fee. Misses (found:false) are never charged.

You're charged once per company checked — a board with 40 open roles costs the same single item-lookup charge as a board with 2, and a company with no Personio career page at all costs nothing. 1,000 companies through this actor: ~$6.32 if every one is found on Personio, less if some aren't. The same 1,000 rows through a credit-based enrichment platform: $80–$400.

How to use

  1. In the Apify Console. Open the actor page and click Start — the companies field is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found.
  2. Via the API. Call it directly with a POST request — no Console needed once you have an API token:
    curl "https://api.apify.com/v2/acts/accountable_eel~personio-jobs-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
    -X POST \
    -H "Content-Type: application/json" \
    -d '{"companies":["personio"]}'
  3. On a schedule. Save this actor as an Apify Task with the input you want, then add a Schedule (hourly, daily, weekly) so it runs on its own — no server of your own required.

Paste one company per line — the bare Personio subdomain (personio) or a full careers URL (https://personio.jobs.personio.de or the .com equivalent). The subdomain, and domain if your input named one, are extracted automatically.

By default you get every open role on each company's board. To narrow that down, open the 🎯 Job filters section of the Input tab:

InputWhat it does
titleKeywordsKeep only roles whose title contains at least one of these. Case-insensitive, partial words count — "engineer" matches Engineering Manager. Any-match: ["engineer","designer"] keeps both kinds.
excludeTitleKeywordsDrop any role whose title contains one of these — ["intern","contract"]. Applied after titleKeywords, so a role matching both is dropped.
locationsKeep only roles whose location contains one of these — ["Berlin","Munich"]. Case-insensitive, partial matches count, any-match.
remoteOnlyKeep only roles that read as remote. Matches remote, anywhere, work from home, wfh and distributed in the location, and the word remote in the title. Personio has no dedicated "remote" flag, so this is best-effort off the office/title text.
postedAfterKeep only roles Personio first created on or after this date — "2026-06-01", or a full ISO timestamp. Inclusive of the date you give.

Different filters combine with AND (title and location and remote); values inside one filter combine with OR. A company whose roles all get filtered out still gets one found: true row with jobCount: 0 — you asked a question and got a real answer, so it's charged like any other company. totalJobCount always shows how many were on the board before filtering, so a zero row is never ambiguous with a broken run.

Turn off "One row per job posting" to get one row per company instead, with the full job list nested inside jobs.

For a hiring alert instead of a full dump, turn on onlyNewSinceLastRun and put the actor on an Apify schedule. The first run returns everything matching your filters and remembers it; every run after that returns only postings it hasn't shown you before, via newJobs and firstRun. The seen-list lives in a named key-value store (personio-jobs-lookup-state) in your own Apify account — see the FAQ below for how it's scoped and how to reset it.

Input

{
"companies": [
"personio"
]
}

One company per line — paste the Personio subdomain or the full careers page URL. Accepted formats: personio, https://personio.jobs.personio.de, https://personio.jobs.personio.com.

Sample output

By default you get one row per open job posting (turn off "One row per job posting" in the Input tab to get one row per company instead, with the full job list nested inside):

queryfoundstatussubdomainjobCounttotalJobCountnewJobsfirstRunjobstitledepartmentofficelocationemploymentTypeseniorityschedulecreatedAtpostedAtremoteapplyUrlscrapedAt
personiotrueOKpersonio11<all jobs (full list)>Staff Software Engineer, Data PlatformProduct and TechMunichMunichpermanentexperiencedfull-time2024-11-13T14:10:41+00:002024-11-13T14:10:41+00:00falsehttps://personio.jobs.personio.de/job/18341712026-08-24T06:01:17.215Z

A real row looks like:

queryfoundstatussubdomaintitledepartmentofficeapplyUrl
personiotrueOKpersonioSenior Backend EngineerEngineeringMunichhttps://personio.jobs.personio.de/job/482910

Use it from Clay, n8n, Make, or an AI agent

This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.

curl "https://api.apify.com/v2/acts/accountable_eel~personio-jobs-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
-X POST \
-H "Content-Type: application/json" \
-d '{"companies":["personio"]}'

n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~personio-jobs-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"companies":["personio"]} (swap in an expression from an earlier node for a real value).

Clay. Add an "HTTP API" column: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~personio-jobs-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body {"companies":["{{company}}"]}, mapping the row's company into the companies array.

MCP. In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "Personio Jobs Lookup | Apify" — the agent will find and run this actor.

Tips

  • Don't know the bare subdomain? Paste the company's full careers page URL instead — either <subdomain>.jobs.personio.de or <subdomain>.jobs.personio.com works, and the subdomain (and domain) are extracted automatically.
  • A bare subdomain with no domain hint defaults to .de — today's majority. If a company actually runs on .com and you only paste the bare subdomain, paste the full .com URL instead so the actor doesn't guess wrong.
  • Your filters are part of the identity of a delta watchlist. Two schedules with different titleKeywords keep separate seen-lists and won't shadow each other. Editing a filter starts a fresh watchlist, so the next run re-baselines and returns the full matching set once.
  • Don't combine delta mode with "Only keep rows containing" (includeKeywords) — that filter runs on the finished row and can drop the 0 new jobs heartbeat row, which is the one row you want to keep seeing on a quiet week.
  • Adjust concurrency in the Input tab if you're checking a long list and want to control how many requests run against Personio's feed in parallel.

vs. alternatives

What it costsWhat you getTrade-off
This actor (personio-jobs-lookup)$0.00632 per company found (less on paid tiers), $0.0001 actor start, nothing for a missEvery open Personio posting for a company — title, department, office, employment type, seniority, schedule, apply URL — filtered by title keyword, location, remote, or posting date, with onlyNewSinceLastRun for deltasPersonio only. A bare subdomain with no domain hint defaults to .de rather than probing both domains. No salary or full job descriptions — Personio's public feed doesn't carry them.
TheirStack$0.005–$0.03 per companyA job-postings dataset with history, normalised across many ATS platforms and job boardsBroader coverage than one platform, and it keeps history. This reads Personio's own feed live, at the bottom of that price range.
Personio's own feedFreeThe same XMLIt is the same XML. This handles the .de/.com domain question, job-level filtering, delta tracking, and retries — and hands you a flat table.
Clay$0.08–$0.40 per enriched row in credits, on top of a seatA whole enrichment workspace — waterfalls across dozens of providers, plus the table and the sequencing around itIf you want one place that does everything and you're not counting rows, that's Clay. This is one column, priced per column, callable from Clay via its HTTP step.

Prices for third-party tools are their published list prices as of August 2026 and are not tracked here — check the vendor before relying on the comparison.

FAQ

What counts as a "company" input? Either the bare Personio subdomain (e.g. personio) or a full careers URL/hostname containing <subdomain>.jobs.personio.de or .com — the subdomain (and domain) are extracted automatically either way.

Why is a row empty / why does found say false? Either the input doesn't look like a Personio subdomain or URL (status: BAD_FORMAT), or that company doesn't have a Personio career page, or currently has zero open positions (status: NOT_FOUND). Check the message column for the specific reason — either way, the row is free.

Why was I charged for a company that returned 0 jobs? Because its career page exists and has open roles — they just didn't match your filters, or weren't new since your last run. totalJobCount shows how many were actually on the board. A company with no Personio career page, or with nothing open at all, comes back found: false and is never charged.

Does the "new since last run" state cost anything or leak between users? It lives in a named key-value store (personio-jobs-lookup-state) inside your own Apify account, so nobody else can see it and its storage cost is negligible (a list of numeric job IDs per company). Delete that store to reset every watchlist, or change a filter to start a fresh watchlist for just that combination.

Are there rate limits I should worry about? The actor makes one request per company against Personio's own public feed — no API key or rate limit tier applies. If you're checking a very long list, use the Input tab's concurrency setting to control how many requests run in parallel.

Does this touch any personal or candidate data — is it GDPR-safe? This actor reads only Personio's public job-postings XML feed: job title, department, office, employment type, seniority, schedule, and a posting date. It doesn't read applications, candidate records, or anything behind a login inside Personio's recruiting system — nothing here is personal data about a candidate.

Can I run this on a schedule? Yes — set it up as an Apify scheduled task like any other actor. Combine that with onlyNewSinceLastRun for a genuine hiring alert instead of a full re-fetch every time.

Can an AI agent call this directly? Yes — it's registered with the Apify MCP server, so an agent in Claude, Cursor, or any MCP client can find and run it by name ("Personio Jobs Lookup"). See the integrations section above.

Does this cover every company, or just ones in a particular region? Only companies you point it at that actually use Personio as their ATS. Personio is common among small-and-mid-size companies in Germany, Austria, and Switzerland specifically — it isn't a global ATS the way Greenhouse or Workday are, so if your list is mostly US or UK companies, expect a lower hit rate. This actor doesn't discover which companies use Personio; you supply the list.