Why Recruitee boards are worth scraping
Recruitee is a popular ATS for mid-market companies across Europe, and every employer running their careers page on it — {company}.recruitee.com — is quietly serving the entire job board from one public JSON endpoint. That's genuinely useful: unlike ATS platforms that paginate or gate descriptions behind a second call, Recruitee's list endpoint already inlines the full HTML description, salary fields, and location data in a single response.
The catch, as with every ATS scraping job, is doing this reliably across more than one or two companies. I run a small fleet of ATS-specific Actors under Devil Scrapes, and Recruitee was a clean gap: solid data density, salary fields when published, and no dedicated coverage on the Apify Store worth the price it charged.
What the data looks like
Here's one real row from the dataset:
{
"job_id": 2680730,
"guid": "dl9ua",
"slug": "data-architect",
"title": "Data Architect",
"company_id": "auditdata",
"company_name": "Auditdata",
"department": "R&D",
"category_code": "information_technology",
"employment_type_code": "fulltime_permanent",
"experience_code": "experienced",
"education_code": "bachelor_degree",
"city": "remote",
"country": "Poland",
"country_code": "PL",
"remote": true,
"hybrid": false,
"on_site": false,
"salary_min": null,
"salary_max": null,
"salary_period": null,
"salary_currency": null,
"description_html": "<h4>...</h4><p>... HTML string ...</p>",
"careers_url": "https://auditdata.recruitee.com/o/data-architect",
"careers_apply_url": "https://auditdata.recruitee.com/o/data-architect/c/new",
"published_at": "2026-07-21T07:48:42+00:00",
"updated_at": "2026-07-21T07:48:42+00:00",
"scraped_at": "2026-07-26T15:00:00+00:00"
}
Salary fields are null here because this employer didn't publish a band — when they do, salary_min/salary_max come back as clean floats instead of Recruitee's raw numeric strings.
The naive approach and why it gets messy fast
Recruitee's list endpoint is genuinely convenient — one request per company gets you everything, no second call for descriptions. That said, going from "I found the endpoint in devtools" to "I have a reliable pipeline" still runs into real friction:
-
Recruitee's own schema is inconsistently populated.
salarysometimes arrives as a nested object withnullfields,departmentis sometimes missing entirely — you need to normalize these into stable nullable fields rather than crashing on aKeyErrorthe third time you hit a company that omitted a field. - A 404 on a bad company ID isn't a real failure. If you type a company subdomain wrong or an employer's board is currently empty, that's zero postings — not a crash. Getting that distinction right across a large batch matters more than it sounds.
- Fingerprinting. A bare Python HTTP client doesn't replicate the TLS handshake a real browser sends, and once you're firing requests across many companies in a loop, that starts to matter.
The Actor
Recruitee Jobs Scraper does the one-call-per-company fetch for you, handles Recruitee's inconsistent nested objects, and treats a per-company zero-result response as a normal outcome rather than a run-ending error. We rotate browser TLS fingerprints on every request and retry transient failures with backoff, so a batch of fifty companies doesn't die because one hiccuped.
Python SDK example:
from apify_client import ApifyClient
client = ApifyClient("APIFY_TOKEN")
run = client.actor("DevilScrapes/recruitee-jobs-scraper").call(run_input={
"companyIds": ["auditdata"],
"maxResultsPerCompany": 50,
"includeDescription": True,
"proxyConfiguration": {"useApifyProxy": True},
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["title"], item["city"], item["salary_min"])
Or paste the same JSON straight into the Apify Console input form if you just want a quick pull without writing a script.
What you'd actually use this for
- Recruiting & talent intelligence — track what a target Recruitee-hosted employer is hiring for, by department and location.
- Hiring-intent signal for BD/SDR teams — open reqs, especially a sudden cluster in one department, are a decent proxy for growth before it's public news.
- Job-board aggregation — Recruitee coverage slots next to our Ashby, Workday, SmartRecruiters, and Multi-ATS scrapers into one hiring-intel pipeline.
- Compensation research — where employers publish salary bands, this is one of the few ATS platforms that gives you clean numeric fields for it instead of freeform text.
- ATS data pipelines — wire structured rows straight into a CRM, dashboard, or n8n/Make workflow on a schedule.
Pricing, honestly
$0.005 per run as a flat warm-up fee, plus $0.0015 per posting written to your dataset. A 1,000-posting pull runs $1.51 total. Nothing is charged for a company that returns zero postings beyond the warm-up. Apify's $5 free credit for new accounts covers roughly 3,300 postings before you'd spend anything out of pocket.
The interesting part
The fiddly engineering here isn't the HTTP call, it's the schema cleanup. Recruitee's API returns null-riddled nested objects inconsistently — a salary object with all-null children, a department that's sometimes a string and sometimes absent entirely. Turning that into stable, always-present nullable fields (rather than crashing on the third company that structures things slightly differently) is most of what makes this reliable across an arbitrary batch of employers you've never scraped before.
Honest limitations
This only covers publicly published boards, not authenticated internal views. You supply company IDs (the subdomain from the careers URL), not display names — "Auditdata" the brand and auditdata the subdomain aren't guaranteed to match. And every sampled company we've tested returns its full board in one response with no pagination — an unusually large board comes back as-is, whatever that single response contains.
Try it
Recruitee Jobs Scraper is live on the Apify Store at $1.50 per 1,000 results, with Apify's standard $5 free trial credit and no card required to start. It's one Actor in a growing ATS-coverage fleet under Devil Scrapes — BambooHR, Ashby, Personio, and Breezy HR are covered too.
Got a Recruitee board that behaves differently from what's documented here? Drop it in the comments — that's exactly the kind of edge case we fix fast.
Top comments (0)