Company Jobs API: Greenhouse, Lever, Ashby & More
Pricing
from $0.80 / 1,000 job returneds
Company Jobs API: Greenhouse, Lever, Ashby & More
Live job postings from company boards on Greenhouse, Lever, Ashby, Workable, Recruitee and Personio. One clean schema with salaries, keyword filters and a new-or-changed jobs monitor.
Pricing
from $0.80 / 1,000 job returneds
Rating
0.0
(0)
Developer
OpenFeeds
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
2 days ago
Last modified
Categories
Share
What does Company Jobs API do?
Company Jobs API fetches every open job from a company's own job board on Greenhouse, Lever, Ashby, Workable, Recruitee or Personio and returns them in one clean, flat schema. It reads the vendors' official public job-board APIs (for example the Greenhouse Job Board API, the Lever Postings API and the Ashby public job posting API), so you get live jobs without scraping careers pages.
You enter companies (job-board URLs, careers-page URLs, domains, company names or ats:slug), and you get each job with title, department, normalised location, workplace type, employment type, salary (where the company publishes it), the description as Markdown or clean HTML, ISO dates and the source URL.
An optional monitoring mode returns only jobs that are new or changed since the last run, plus free closed notices.
It is not a keyword search over millions of pre-scraped jobs, and it does not touch LinkedIn, Indeed or Glassdoor. It never collects recruiter or contact data.
Why use Company Jobs API?
- 📈 Hiring signals for sales (GTM): monitor 50–500 target accounts and get alerted when they open roles you sell into.
- 🧑💼 Recruiting and sourcing: track openings at client and target companies, filtered by department and location.
- 🗂️ Niche job boards and aggregators: ingest jobs from a curated company list, with
uniqueIdfor deduplication and Markdown descriptions. - 💶 Salary and labour-market research: structured pay ranges from Greenhouse, Lever, Ashby, Recruitee and Personio, plus ranges parsed from description text.
- 🤖 AI agents (Apify MCP): answer "is company X hiring for Y?" with a small, cheap output.
Features
- Six job-board systems in one schema: Greenhouse, Lever, Ashby, Workable, Recruitee and Personio.
- Auto-detection from board URLs, careers pages, domains or company names:
- Names: a board is used only when it has open jobs and its published company name matches the name you entered, so a board that merely uses the same slug but belongs to a differently named company is rejected.
- Domains and careers pages: the job board the site redirects to or links to is used. When a page links several companies' boards (for example an investor's portfolio jobs page), a board is used only if its company name matches the site name or domain, its Ashby company website is that domain, or its board name equals the domain name. Otherwise the Actor looks for boards named after the domain and checks them like names.
- For common names, paste the board URL.
- Filters before you pay: keywords, excluded words, locations, workplace types, departments, posting date. You pay only for jobs that pass.
- Salary from the job board's pay fields or parsed from the description (
salarySourcetells you which). - Monitoring mode with
changedFieldsand free closed-job notices. - No personal data: contact details in descriptions are removed by default.
- Apify platform extras: scheduling, API access, integrations (Make, Zapier, Slack and webhooks), datasets in JSON/CSV/Excel, and use from AI agents via the Apify MCP server.
What data does Company Jobs API return?
| Field | Example | Description |
|---|---|---|
companyName | GitLab | Company name as published on the job board |
ats | greenhouse | Job-board system: greenhouse, lever, ashby, workable, recruitee, personio |
title | Senior Software Engineer, Security Factory: Code Security | Job title |
department / team | Sec Engineering | Department and team, where the job board has them |
location / locations | Remote, Canada; Remote, United States | Primary location and all listed locations |
countryCodes | ["CA", "US"] | ISO country codes from the job board's country field or, for Greenhouse and Personio, from a country named in the location text |
workplaceType / isRemote | remote / true | remote, hybrid or onsite |
employmentType | FULL_TIME | FULL_TIME, PART_TIME, CONTRACT, TEMPORARY, INTERNSHIP, APPRENTICESHIP, OTHER |
salaryMin / salaryMax / salaryCurrency / salaryPeriod | 139200 / 235200 / USD / YEAR | Published pay range |
salarySource / salaryText | structured / United States Salary Range: 139,200–235,200 USD | Where the salary came from, and the text as published |
descriptionMarkdown / descriptionHtml | GitLab is the intelligent… | Description as Markdown and/or clean HTML |
jobUrl / applyUrl | https://job-boards.greenhouse.io/gitlab/jobs/8738179002 | Job posting and application page |
publishedAt / updatedAt | 2026-10-10T00:31:32.000Z | UTC ISO 8601 dates (Workable: date only) |
uniqueId | greenhouse:gitlab:8738179002 | Stable key for deduplication: ats:boardSlug:jobId |
changeType / changedFields | changed / ["salary"] | Monitoring mode only: new, changed or closed |
Fields a job board does not provide are null (lists are []), so every item has the same 35 fields.
How to get jobs from Greenhouse, Lever, Ashby and other job boards
- Open the Actor and paste your companies, one per line (board URLs are best).
- Optionally set filters (keywords, locations, workplace types, departments, posted within N days) and limits.
- Click Start.
- Download the jobs as JSON, CSV, Excel or HTML, or read them through the API.
Monitoring recipe (new-job alerts): turn on Only new or changed jobs, give the monitor a state store name (e.g. sales-accounts), create a daily schedule, and connect a Slack, email or webhook integration. Each run then delivers only what changed.
How much does it cost to get company jobs?
The Actor uses pay-per-event pricing. You pay per job returned after your filters:
| Apify plan | Price per job | Per 1,000 jobs |
|---|---|---|
| Free | $0.0015 | $1.50 |
| Starter | $0.0012 | $1.20 |
| Scale | $0.0010 | $1.00 |
| Business | $0.0008 | $0.80 |
Plus $0.00005 per run (the standard Actor start fee).
Examples:
- 20 jobs from 3 companies ≈ $0.03 on the Free plan.
- The default example (3 companies × 20 jobs = 60 jobs) ≈ $0.09 on the Free plan, $0.072 on Starter.
- Monitoring 100 accounts daily with about 30 new or changed jobs per day ≈ 900 jobs per month ≈ $1.08 per month on Starter.
Not charged: jobs removed by your filters, closed-job notices, empty job boards, companies not found or unsupported, failed fetches, and repeat entries for a job board that is already in your list. The run stops cleanly at your spending limit.
Input
See the Input tab for every option. Accepted company formats:
| Format | Example |
|---|---|
| Greenhouse board | https://boards.greenhouse.io/gitlab, https://job-boards.greenhouse.io/gitlab |
| Lever board | https://jobs.lever.co/spotify (EU-hosted boards: https://jobs.eu.lever.co/…) |
| Ashby board | https://jobs.ashbyhq.com/linear |
| Workable board | https://apply.workable.com/huggingface/ |
| Recruitee board | https://bunq.recruitee.com |
| Personio board | https://1komma5grad.jobs.personio.de (or .jobs.personio.com) |
ats:slug | greenhouse:stripe, lever:spotify, lever-eu:… (jobs.eu.lever.co), ashby:openai, workable:huggingface, recruitee:bunq, personio:1komma5grad, personio-com:… (….jobs.personio.com) |
| Careers page or domain | https://linear.app/careers, stripe.com |
| Company name | Hugging Face |
Tip: board URLs and ats:slug are the fastest and most reliable. For names, the Actor checks the systems in Job-board systems to check and accepts a board only when it has open jobs and its published company name matches. For domains and careers pages it uses the board the site links to; when a page links several companies' boards, only a board that matches the site's name or domain is used.
Same board twice: entries that point to the same job board (for example https://jobs.ashbyhq.com/linear, ashby:linear, Linear and linear.app) are returned and charged once (repeated board URLs and ats:slug entries are not even fetched again). The extra entries appear in the COMPANIES record, in input order, with the note "Same job board as entry …"; lines repeated with different capitalisation get "Repeat of entry …".
Reusing a board: the COMPANIES record has each board's exact boardUrl, which you can paste as input. ats:boardSlug from the dataset works too, except for EU-hosted Lever boards (lever-eu:boardSlug) and Personio boards on ….jobs.personio.com (personio-com:boardSlug); the jobUrl host shows which.
Example input:
{"companies": ["https://boards.greenhouse.io/gitlab","https://jobs.ashbyhq.com/linear","https://jobs.lever.co/spotify"],"keywords": ["engineer"],"locations": ["Remote", "Germany"],"maxJobsPerCompany": 20,"descriptionFormat": "markdown"}
Filters: keywords match the job title (and optionally the description), ignoring case and accents. Locations match the location text, the country name or a two-letter ISO code (DE). A two-letter code needs a country on the job: Ashby, Lever, Workable and Recruitee publish one, Greenhouse jobs get one when the location text names a country ("Remote, Germany"), but Personio boards list city names only, so filter Personio jobs by city (Berlin, München) instead of DE. Workplace-type filters exclude jobs whose board does not state a workplace type.
Personio language: by default you get each job ad in the company's own language. Choosing a language in Personio language drops the descriptions the company did not write in that language.
Output
You can download the dataset in various formats such as JSON, HTML, CSV or Excel. A Greenhouse job with a published pay range (description shortened):
{"companyInput": "https://boards.greenhouse.io/gitlab","companyName": "GitLab","ats": "greenhouse","boardSlug": "gitlab","jobId": "8738179002","uniqueId": "greenhouse:gitlab:8738179002","title": "Senior Software Engineer, Security Factory: Code Security","department": "Sec Engineering","team": null,"location": "Remote, Canada; Remote, United States","locations": ["Remote, Canada; Remote, United States", "Canada", "United States of America"],"countryCodes": ["CA", "US"],"workplaceType": "remote","isRemote": true,"employmentType": null,"employmentTypeRaw": null,"seniority": null,"salaryMin": 139200,"salaryMax": 235200,"salaryCurrency": "USD","salaryPeriod": "YEAR","salarySource": "structured","salaryText": "United States Salary Range: 139,200–235,200 USD","descriptionMarkdown": "GitLab is the intelligent orchestration platform for DevSecOps. GitLab enables organizations to increase developer productivity, improve operational efficiency,…","descriptionHtml": null,"jobUrl": "https://job-boards.greenhouse.io/gitlab/jobs/8738179002","applyUrl": "https://job-boards.greenhouse.io/gitlab/jobs/8738179002","publishedAt": "2026-10-10T00:31:32.000Z","updatedAt": "2026-10-10T00:31:32.000Z","sourceUrl": "https://boards-api.greenhouse.io/v1/boards/gitlab/jobs?content=true&pay_transparency=true","scrapedAt": "2026-10-13T00:30:47.603Z","changeType": null,"changedFields": null,"firstSeenAt": null,"lastSeenAt": null}
A Lever job whose salary was parsed from the description (fields shortened):
{"companyName": "Spotify","ats": "lever","title": "Senior Program Analyst - GTM Ops","department": "Advertising","team": "Advertising Sales - Emerging and Scaled Sales","location": "New York, NY","countryCodes": ["US"],"workplaceType": "hybrid","employmentType": "FULL_TIME","employmentTypeRaw": "Permanent","salaryMin": 92293,"salaryMax": 131847,"salaryCurrency": "USD","salaryPeriod": "YEAR","salarySource": "description","salaryText": "$92,293 - 131,847","jobUrl": "https://jobs.lever.co/spotify/ed409ff1-a241-4c2c-96ea-c988ca131671","publishedAt": "2026-10-09T13:26:45.620Z"}
A monitoring-mode item for a job whose pay range changed (fields shortened):
{"companyName": "GitLab","title": "Senior Software Engineer, Security Factory: Code Security","salaryMin": 139200,"salaryMax": 235200,"jobUrl": "https://job-boards.greenhouse.io/gitlab/jobs/8738179002","changeType": "changed","changedFields": ["salary"],"firstSeenAt": "2026-10-13T00:28:18.505Z","lastSeenAt": "2026-10-13T00:31:12.446Z"}
Per-company summary. The run's key-value store holds a COMPANIES record with one entry per input: the status (OK, NO_OPEN_JOBS, NOT_FOUND, NOT_DETECTED, UNSUPPORTED_ATS, BOARD_GONE, BLOCKED, ERROR, SKIPPED_LIMIT), the detected job board, job counts and a message:
{"input": "https://boards.greenhouse.io/gitlab","status": "OK","ats": "greenhouse","boardSlug": "gitlab","companyName": "GitLab","boardUrl": "https://job-boards.greenhouse.io/gitlab","apiUrl": "https://boards-api.greenhouse.io/v1/boards/gitlab/jobs?content=true&pay_transparency=true","jobsOnBoard": 221,"jobsMatched": 221,"jobsOutput": 20,"jobsCharged": 20,"closedOutput": 0,"jobsSkippedErrors": 0,"alternatives": [],"message": "Limited to 20 newest jobs (maxJobsPerCompany).","durationMs": 553}
The Output tab also has three table views: Overview, Changes (monitoring mode) and Salaries.
Monitoring mode explained
- State store: with Only new or changed jobs on, the Actor remembers the jobs of each job board in a named key-value store in your account (default
company-jobs-state). Use a different State store name for each separate monitor, e.g.sales-accountsandclient-a. - First run: every current job is returned as
new(and charged once). - Later runs: only
newjobs andchangedjobs (withchangedFields: title, location, details, salary, description) are returned and charged. Jobs that disappeared are returned once asclosednotices, free of charge, if Include closed jobs is on. - Safety: a company whose job board could not be fetched (network error, block, timeout) is never compared, so jobs are never marked closed because of an outage. If a job board returns "not found" but the monitor has stored jobs for it, the company gets the status
BOARD_GONEand no closed notices; delete its record from the state store to confirm. - Reset: delete the state store (or use a new name) to start over.
Use with AI agents and MCP
For agents, keep the output small with descriptionFormat: "none":
{"companies": ["stripe"],"keywords": ["data engineer"],"descriptionFormat": "none","maxJobsPerCompany": 10}
Tips
- Cut costs: use keyword, location and department filters and Max jobs per company. You pay only for jobs that pass.
- Speed up: use board URLs or
ats:slug, and narrow Job-board systems to check when you enter names or domains. - Large monitors: run them daily rather than hourly. Lever allows about one request per second, so very Lever-heavy lists take longer.
- Long lists and the run timeout: shortly before the run timeout the Actor stops starting new companies, marks the rest
SKIPPED_LIMITin the COMPANIES record and finishes successfully. Run those companies again, or raise the timeout. Board URLs are much faster than names. - Proxy: not needed. Only set one if your runs report
BLOCKED.
FAQ
Is it legal to get jobs from these job boards?
The Actor uses the public job-board APIs that Greenhouse, Lever, Ashby, Workable, Recruitee and Personio document for publishing job ads. No login is used. robots.txt is respected, including Lever's crawl delay, and careers pages you enter are only read where robots.txt allows it. Job ads are business information that employers publish for wide distribution. You remain responsible for how you use the data; this is not legal advice.
Does it collect personal data?
No recruiter or contact data is collected, and Remove contact details from descriptions (on by default) removes email addresses, phone numbers, personal LinkedIn profile links, "contact person: name" lines and contact intros such as "Ihre Ansprechpartnerin Frau …" from descriptions. This is best effort, because descriptions are free text: a name mentioned in an ordinary sentence can remain.
Our Actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our Actors, when used for ethical purposes by Apify users, are safe. However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.
Can I use the jobs to train AI models?
Some job boards signal that their content must not be used for AI training (for example Workable's robots.txt). Do not use the output to train AI models. Using it as search results or as input for an AI agent is fine.
Why are SmartRecruiters and Workday not supported?
SmartRecruiters' API host disallows crawlers in robots.txt and requires API keys, and Workday has no documented public job-board API. Those companies get the status UNSUPPORTED_ATS and are free.
Why was my company "not found"?
Name matching needs a job board with open jobs whose published company name matches. Paste the job-board URL instead. A domain whose site only links other companies' boards (for example a portfolio jobs page) gets NOT_DETECTED, and an expired job-board link (for example a Workable /j/… link) gets NOT_FOUND; neither is charged. The same applies to common names: the check cannot tell apart two companies with the same name, so if a name returns another company's jobs, use the board URL. Known limits: Recruitee boards on a custom domain (use the ….recruitee.com address) and EU-hosted Greenhouse boards (job-boards.eu.greenhouse.io, which have no public API).
How fresh is the data?
Live: every run reads the job boards at run time. There is no database delay.
Can I get jobs from all companies on Greenhouse?
No. Company Jobs API fetches the companies you list; it is not a search engine over all job boards.
Where do I report a problem?
Use the Issues tab. You can also call the Actor from your own code through the API tab.
Changelog
- 1.0 (2026-10-13): first release. Six job-board systems (Greenhouse, Lever, Ashby, Workable, Recruitee, Personio), name detection with company-name verification, domain detection from the site's own links (with a company check when a page links several companies' boards), filters before charging, salaries, Markdown and clean HTML descriptions, monitoring mode with free closed notices; a job board named by several entries is returned and charged once.