Workable, Recruitee, Personio & Teamtailor Jobs API
Pricing
from $2.00 / 1,000 job scrapeds
Workable, Recruitee, Personio & Teamtailor Jobs API
Every open job on the Workable, Recruitee, Personio and Teamtailor career sites you list, one row per job: title, company, location, remote flag, department, posted date, apply URL, ATS and dedup key; description on request. Company names or careers URLs in. Public feeds only, no login.
Pricing
from $2.00 / 1,000 job scrapeds
Rating
0.0
(0)
Developer
Atarivo Enterprises Inc.
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
13 hours ago
Last modified
Categories
Share
Workable, Recruitee, Personio, Teamtailor & SmartRecruiters Jobs API returns every open job on the company career sites you list, as clean rows with the same fields whichever of these five applicant tracking systems (ATS) the company uses: title, company, location, remote flag, department, posted date, apply URL, ATS and a dedup key. It is built for job aggregators, recruiters, labour-market researchers and AI agents that need fresh European and global postings straight from the source. To try it, keep the sample input and press Start. The sample reads one public career site per ATS and finishes in a few seconds.
What does the Workable, Recruitee, Personio, Teamtailor and SmartRecruiters Jobs API do?
- Returns one dataset row per open job in one normalised schema, so Workable jobs,
Recruitee jobs, Personio jobs, Teamtailor jobs and SmartRecruiters jobs go into the same
table without any mapping. The schema is the same as our Greenhouse, Lever & Ashby Actor's,
so you can merge both. SmartRecruiters rows also carry
employment_typeandexperience_level. - Accepts company names or careers URLs:
apply.workable.com/<account>,<company>.recruitee.com,<company>.jobs.personio.de,<company>.teamtailor.com,jobs.smartrecruiters.com/<identifier>(orcareers.smartrecruiters.com/<identifier>), the matching feed URLs,ats:name(e.g.recruitee:acme,smartrecruiters:Acme), or a bare name that it tries on Workable, then Recruitee, then Personio, then Teamtailor. A bare name is not tried on SmartRecruiters, because its API answers an unknown company with an empty list instead of "not found": givesmartrecruiters:<identifier>or the URL. - Optionally adds the job description as plain text (
includeDescription). - Removes duplicates within a run by
dedup_key(ats:job_id), so the same site listed twice is charged once per job. - Calls only the vendors' public job-feed hosts:
apply.workable.com,api.smartrecruiters.com, and one company subdomain ofrecruitee.com,jobs.personio.deorteamtailor.comper site. It sends an honest User-Agent that names this Actor, reads each host's robots.txt (and obeys it everywhere exceptapi.smartrecruiters.com, see "Is it legal?"), honoursCrawl-delay, sends at most 2 requests per second per vendor, and retries a failed request once. One request per career site in most cases (SmartRecruiters: one per 100 jobs, plus one per job when you ask for descriptions). - No login, no credential, no circumvention. No account, API key, cookie or proxy; no CAPTCHA solving; one honest User-Agent that never changes. If a vendor refuses a request (HTTP 403 or 429), the site gets an uncharged error row and the Actor does not try another route. It reads job postings that the employers publish for anyone to see, and does not look for or extract recruiter or candidate contact details; a description is returned as the employer published it.
- Does not read BambooHR, Workday, Indeed, LinkedIn,
jobs.workable.com(Workable's cross-employer job search) or any other aggregator. Those inputs are refused with a clear message before anything is fetched or charged.
How to use the Workable, Recruitee, Personio, Teamtailor and SmartRecruiters jobs API
- Put one career site per line in Career sites. Copy the address from the company's careers page, or type the company name. Up to 200 sites per run.
- Optionally tick Include the job description text, and set Max jobs per career site (default 1,000).
- Press Start. Open the Output tab for the jobs table, or read the dataset through the
API in JSON, CSV or Excel. The
RUN_SUMMARYrecord in the key-value store says, per site, which ATS answered and how many jobs were found.
Calling it from an AI agent: {"boards": ["workable:acme", "https://acme.teamtailor.com"]}. The
description above is also the Actor's tool description in the Apify MCP server.
Run it on a schedule and compare dedup_key values between runs to see which jobs are new and
which were closed.
Pricing
| Event | What you pay for | Price |
|---|---|---|
job-scraped | One job returned as a row | $0.0020 |
Each run also has a start fee of $0.001. A career site that does not exist (HTTP 404 on every
ATS tried) or that did not answer after a retry costs one job-scraped event for its error
row. A site skipped because of robots.txt, or a response this Actor could not read, is never
charged. Duplicates are never charged. Set Max cost per run to cap a run; the Actor stops
cleanly at the cap and says so in its status message. Platform usage is included (no "+usage"
charges).
Input
| Field | Type | Required | Notes |
|---|---|---|---|
boards | array of strings | yes | 1 to 200 entries: careers URLs, ats:name, or bare names (not tried on SmartRecruiters). Aggregator, BambooHR, Workday and other ATS URLs are refused, and so are Teamtailor career sites on a company's own domain (use <company>.teamtailor.com). |
includeDescription | boolean | no | Default false. Adds description_text. Same price. |
maxJobsPerBoard | integer | no | 1 to 10,000; default 1,000. Caps the jobs (and the cost) per site. |
{"boards": ["https://personio-gmbh.jobs.personio.de", "https://career.teamtailor.com","https://kaizo.recruitee.com", "https://apply.workable.com/blueground","https://jobs.smartrecruiters.com/BoschGroup"],"includeDescription": false,"maxJobsPerBoard": 5}
Output
One row per job:
{"title": "Senior Data Engineer","company": "Acme","location": "Amsterdam, Noord-Holland, Netherlands","remote": false,"department": "Engineering","posted_at": "2026-10-01T14:30:00Z","apply_url": "https://acme.recruitee.com/o/senior-data-engineer/c/","ats": "recruitee","board": "acme","job_id": "1000001","dedup_key": "recruitee:1000001"}
remote is true or false when the ATS says so and null when it does not. posted_at is
ISO 8601 in UTC. company is the name the feed gives (Workable account name, Recruitee
company name, Personio subcompany, Teamtailor hiring organization, SmartRecruiters company
name), else the site name. Teamtailor's public feed has no department, so department is
null for Teamtailor rows. employment_type (e.g. "Full-time") and experience_level (e.g.
"Mid-Senior Level") come from SmartRecruiters only and are absent from other rows. A
SmartRecruiters company identifier that does not exist gives no rows (the API answers it with
an empty list), so check the identifier in jobs.smartrecruiters.com/<identifier>.
A site that failed gives one row with error, message, tried and charged instead. Run
storage is kept for your plan's data-retention period, then deleted by Apify.
Other Actors by Atarivo
Every Atarivo Actor follows the same rules: limited permissions, no "+usage" pricing, charges only after results are saved, and at least one result row per run.
- ATS Jobs API: Greenhouse, Lever & Ashby: the same job rows from Greenhouse, Lever and Ashby job boards, at the same price. Use both to cover most startup and scale-up career sites.
- PDF, Image & Word to Text and Markdown (OCR): returns the text, Markdown, tables and page facts of a PDF, PNG, JPEG, TIFF or Word .docx file, one dataset row per page, plus RAG chunks with page spans. OCR runs only on scanned or unreadable pages. First page free.
FAQ, disclaimers and support
Is it legal? It reads only the public, unauthenticated job feeds that each vendor provides for showing a company's open jobs, with rate limits, and robots.txt honoured everywhere except the one host explained below (all read on 2026-10-30/31). The hard rule: no login, no credential, no circumvention. A vendor's terms and robots.txt are weighed per source as a recorded risk, not ignored:
- Workable:
GET https://apply.workable.com/api/v1/widget/accounts/<account>[?details=true]. Workable's help article "Using the Workable API to create a careers page" lists this as a public endpoint: "to get the list of your published jobs only, you can try in your terminal the below public endpoints: ...https://www.workable.com/api/accounts/{subdomain}?details=true" (that address redirects to the widget endpoint above). robots.txt ofapply.workable.comdisallows nothing. - Recruitee:
GET https://<company>.recruitee.com/api/offers/. Recruitee's Careers Site API docs: "The Recruitee Careers Site API allows to view company's jobs ... Common usage of this API would be, for example, to display a list of job offers". - Personio:
GET https://<company>.jobs.personio.de/xml. Personio's developer docs ("Retrieving open positions"): "Current open job postings can be retrieved in XML format under myaccount.jobs.personio.de/xml." robots.txt:Allow: /. - Teamtailor:
GET https://<company>.teamtailor.com/jobs.json, the career site's public job feed in JSON Feed 1.1 format (the feed names itself infeed_url; Teamtailor's help centre documents the same feed as/jobs.rss). robots.txt allows/jobs.json. - SmartRecruiters:
GET https://api.smartrecruiters.com/v1/companies/<identifier>/postings?limit=100&offset=N(and/postings/<id>for a description). SmartRecruiters' developer docs ("Posting API"): "Posting API allows for access to a job posting that was previously made public using SmartRecruiters application. Whenever a smartrecruiters.com user posts a job, a posting would become accessible via the Posting API." No key is needed for public postings, and this Actor sends none. robots.txt ofapi.smartrecruiters.comreadsthenUser-agent: LinkedInBot / Allow: /v1/companies/User-agent: * / Disallow: /. This Actor treats that file as advisory for this host only: it is written for search-engine crawlers, while the same host publishes and documents this API for exactly this use (listing a company's public jobs). The Actor still fetches robots.txt on every run, records its verdict in the run summary (robots_advisory_hosts) and the log, and keeps the same rate limit and honest User-Agent.
The vendors' terms and conditions are contracts with their customers (the employers); none of
them forbids reading these public feeds. Workable and Teamtailor publish the robots.txt
content signal ai-train=no: do not use their rows to train AI models. You are responsible for
how you use the data, including any terms of the employers whose postings you republish.
Why no BambooHR or Workday? BambooHR's terms of service forbid using "any robot, spider, other automated device, or manual process to monitor or copy any content from the Service", and its careers JSON is undocumented. Workday's terms were read on 2026-10-30 and Workday stays out. Both are refused before anything is fetched or charged.
Why is my career site "not found"? Check the company name in its careers address. A
Teamtailor site on the company's own domain must be given as <company>.teamtailor.com.
Why are some fields null? The ATS did not publish them for that job.
Is it affiliated with Workable, Recruitee, Personio, Teamtailor or SmartRecruiters? No. The names describe the data source only.
Something is wrong. Open an issue on the Issues tab with the run ID. Issues are answered within 14 days.
This Actor is provided as is, under Apify's Standard Actor Contract. It is not affiliated with or endorsed by Workable, Recruitee (Tellent), Personio, Teamtailor or SmartRecruiters (SAP).