Company Career Site Jobs Scraper (Europe)
Search open jobs on 8,600 company career sites: Personio, Recruitee, Teamtailor, Greenhouse, Lever, Ashby, SmartRecruiters, Workable.
Search open jobs on 8,600 company career sites: Personio, Recruitee, Teamtailor, Greenhouse, Lever, Ashby, SmartRecruiters, Workable. Daily refresh, job alerts, no recruiter data.
$3.00 / 1,000 · 100.0% success over 29 public runs in the last 30 days.
Run it on Apify → Free to try - runs bill per result on your own account.
What you give it
Every field is optional unless marked; sensible defaults do the rest.
| Field | Type | What it does | Default |
|---|---|---|---|
keywords |
array | A job matches when its title contains one of these at the start of a word, ignoring case and accents: maler finds "Maler/in" and "Malermeister". Write them in the language the jobs are posted in. |
["data engineer"] |
locations |
array | Keep jobs whose posted location contains one of these (München, Remote). A country name (Germany, Deutschland) also matches jobs whose system publishes that country. |
["Berlin"] |
countries |
array | Two-letter codes, e.g. DE, NL. Personio and Greenhouse publish no country, so their jobs are left out by this filter; use Locations to reach them. |
- |
systems |
array | Only these systems. Empty means all of them. | - |
postedWithinDays |
integer | Uses the posting date, or when the job first appeared on its board for systems without one. | - |
onlyNewJobs |
boolean | Deliver only jobs that were not there on this search's previous run. Schedule it daily for a job alert; the first run delivers everything that matches. | False |
resetState |
boolean | With Only new jobs: start over and deliver everything that matches. | False |
companies |
array | One entry per company as system:token: greenhouse:stripe, lever:spotify, personio:acme, recruitee:acme, teamtailor:acme, ashby:acme, smartrecruiters:acme, workable:acme. A bare token like stripe is tried on Greenhouse and Lever. The token is the company's name in its careers URL, e.g. acme.jobs.personio.de or jobs.lever.co/acme. |
- |
scrapeDetails |
boolean | Include the full posting text. When searching, it is fetched live for the jobs delivered, so a large search takes longer with it on. | True |
maxItems |
integer | Stop after this many jobs. A search delivers the newest first. | 1000 |
reportFailures |
boolean | When a run fails, send the developer the actor name and build, an error category, the error message (truncated) and a one-way hash of your input - so a bug can be fixed without anyone asking you to reproduce it. Your input itself, your results and your identity are never sent, and successful runs send nothing at all. Switch this off and the actor behaves exactly the same. | True |
What you get back
One JSON object per result, with exactly these fields - no seller identities, no contact data, ever.
A real result row from a recent run:
{
"commitment": "Full-time",
"companyName": "ABOUT YOU SE & Co. KG",
"companyToken": "aboutyougmbh",
"country": "DE",
"department": "Product & Tech",
"firstSeenAt": "2026-10-17T03:00:27.302Z",
"jobId": "744000156033409",
"lastSeenAt": "2026-10-17T03:00:27.302Z",
"location": "Berlin, , Germany",
"office": "Engineering",
"postedAt": "2026-10-16T15:31:04.999Z",
"salary": null,
"source": "smartrecruiters",
"title": "Senior Data Engineer - Shop Analytics (all genders)",
"updatedAt": null,
"url": "https://jobs.smartrecruiters.com/ABOUTYOUGmbH/744000156033409",
"workplaceType": "hybrid"
}
| Field | Type | Meaning |
|---|---|---|
jobId |
string | The ATS's own job id. |
source |
string | Which ATS it came from. |
companyToken |
string | The company's board token. |
companyName |
string | Employer name. |
title |
string | Job title. |
url |
string | Public job posting URL. |
location |
['string', 'null'] | Location as posted. |
department |
['string', 'null'] | Department / function. |
office |
['string', 'null'] | Office or team grouping. |
postedAt |
['string', 'null'] | First published (ISO). |
updatedAt |
['string', 'null'] | Last updated (Greenhouse; ISO). |
workplaceType |
['string', 'null'] | onsite/hybrid/remote (Lever). |
commitment |
['string', 'null'] | Employment commitment (Lever). |
country |
['string', 'null'] | Two-letter country code, where the system publishes one (not Personio or Greenhouse). |
salary |
['string', 'null'] | Salary as the company published it. |
firstSeenAt |
['string', 'null'] | When the job first appeared in the daily snapshot (ISO); null when read live from companies. |
lastSeenAt |
string | The snapshot the row comes from, or the run time for companies read live (ISO). |
description |
['string', 'null'] | Full posting text, markup stripped (scrapeDetails). |
Health
100.0% success over 29 public runs in the last 30 days. Live record, failures included: status page.
Full documentation, examples and the AI-assistant prompt live on the store page.
The history behind this tool
This tool answers what a source shows today. Its output also feeds a series recorded every day and kept: Hiring history from company career sites. A run gives you the current market; the series is the part that cannot be reconstructed afterwards, because the source overwrites it.