Greenhouse, Lever & Ashby Jobs Feed: $1/1K avatar

Greenhouse, Lever & Ashby Jobs Feed: $1/1K

Pricing

from $1.00 / 1,000 job returneds

Go to Apify Store
Greenhouse, Lever & Ashby Jobs Feed: $1/1K

Greenhouse, Lever & Ashby Jobs Feed: $1/1K

Paste careers page URLs, slugs or company names and get open jobs from Greenhouse, Lever and Ashby in one clean schema, with salary when published, remote flag and apply link. Monitor mode returns only new jobs; seen jobs are free. A bad URL never fails the run. $1 per 1,000 jobs.

Pricing

from $1.00 / 1,000 job returneds

Rating

0.0

(0)

Developer

moo_iscool

moo_iscool

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

12 days ago

Last modified

Security

Limited permissions

Share

Greenhouse, Lever & Ashby Jobs Feed

Paste careers pages. Get every open job in one clean feed. This actor reads the public job boards that companies host on Greenhouse, Lever, and Ashby, and returns their open jobs in one normalized schema: title, location, remote flag, department, posted date, salary when the board publishes one, and the apply link. Export as JSON, CSV, or Excel, or send to Google Sheets or a webhook. No API key, no login, no browser.

  • Who it's for: recruiters and talent teams watching a fixed set of employers, sales and research teams using hiring as a signal, job seekers tracking target companies, and developers who need Greenhouse, Lever, and Ashby jobs in the same fields.
  • Any input format: a careers URL, a board slug, or a company name. A bad line becomes a free error row, and the rest of the run still finishes.
  • Monitor mode: with only new jobs since last run, a daily schedule returns only jobs you haven't seen, and seen jobs are not charged.
  • Price: $1.00 per 1,000 jobs, plus a small per-run start fee. Error rows are free.

Quick example

Input (this is the prefilled form):

{
"companies": [
"https://job-boards.greenhouse.io/stripe",
"jobs.lever.co/palantir",
"https://jobs.ashbyhq.com/ramp"
],
"keywords": ["engineer"],
"maxJobsPerCompany": 25,
"maxResults": 100
}

Sample output rows (from a real run on 25 October 2026; a full record is shown further down):

companyprovidertitlelocationsalary
rampashbySoftware Engineer, Forward DeployedNew York, NY (HQ)$168K – $285K • Offers Equity
StripegreenhouseStaff Software Engineer, Payments IntelligenceSeattle, New York, San Francisco–
palantirleverForward Deployed Software Engineer, New Grad - Warp SpeedNew York, NY$135,000 - $145,000

Limits, up front

  • Public Greenhouse, Lever, and Ashby boards only. Companies on Workday, iCIMS, SmartRecruiters, or a custom careers site are not covered; such a line comes back as a free error row.
  • Live snapshot, not a database. Each run reads the boards at that moment. There is no historical archive of closed jobs.
  • Salary only when published. Many Greenhouse boards publish no pay range; then salary is read from the posting text when possible, or left null.
  • company is the board's display name on Greenhouse and the lowercase board token (for example ramp) on Lever and Ashby.

How to scrape Greenhouse jobs, plus Lever and Ashby job postings

The actor calls the official public JSON endpoints that the career pages themselves use (boards-api.greenhouse.io, api.lever.co, api.eu.lever.co, api.ashbyhq.com). A bad URL or an unknown name becomes a free error row, and the run succeeds even when every company fails.

Get only new jobs since last run

Only-new mode remembers jobs you have already collected, which is what you want on a daily schedule. Jobs you have already seen are not saved again and are not charged. See Tips below for how the memory works.

What data you get

Each open job is one dataset item with type set to job. A company that cannot be resolved or fetched is one free item with type set to error. Closed items appear only when you turn on both only new jobs and include closed jobs. A closed item has the id and the company, and the other fields are null because the board no longer returns them.

FieldMeaning
typejob or error
jobIdId from the source board
jobKeyprovider:companyToken:jobId
providergreenhouse, lever, or ashby
companyBoard display name when the API sends one, otherwise the token
companyTokenToken used in the API URL
titleJob title
urlPublic job page
applyUrlApply link. On Greenhouse this is the job page
locationPrimary location
locationsPrimary location plus offices or secondary locations
isRemoteTrue when the workplace type is remote, false for hybrid, on-site, in-office, and office, and when the workplace type is missing or unspecified the board's remote flag is used, then location text that contains "remote"
workplaceTypeWorkplace label when the board sends one
departmentDepartment names
teamTeam, when the board has one
employmentTypeLever commitment or Ashby employment type. Null for Greenhouse
postedAtGreenhouse first published, with updated time as a fallback. Lever created time. Ashby published time
updatedAtGreenhouse update time. Null for Lever and Ashby
salaryPay range from the board when it publishes one, otherwise a range read from the description
requisitionIdGreenhouse requisition id, or null
descriptionPlain text. Null when descriptions are turned off, and on closed records
statusopen, changed, or closed
sourceAPI URL used for that company
scrapedAtTime this run read the board
inputThe company line, on error rows
errorNOT_FOUND, INVALID_INPUT, HTTP_ERROR, or TIMEOUT
errorMessageWhy that company line failed

salary.source is ats when the number came from the board, and description when it was read from the posting text. Greenhouse requests pay transparency and converts pay_input_ranges from cents. Lever uses salaryRange. Ashby uses structured compensation when the board sends it, then the compensation summary, then the description. salary.text is the board's own line or the snippet that was parsed. min and max are numbers when they can be read. A dot used as a thousands separator, as in €60.000, is handled. Odd formats stay null rather than guessed.

The Jobs view lists postings. The Errors view lists company lines that failed.

How to use

  1. Add one company per line. A careers URL is the safest input. A slug or a company name works too.
  2. Add keywords, locations, or a posted-within window if you do not want the whole board. Use posted within hours for a window such as the last 24 hours.
  3. Set max results if you want a cap. The default is 1,000 jobs across all companies.
  4. Run the actor. Open the dataset for the jobs, and the key-value store key SUMMARY for per-company counts, the board that was chosen, and errors.
  5. For a daily feed, turn on only new jobs since last run, keep the same state key, and schedule the task.

Remote only keeps a job when the workplace type is remote, drops hybrid, on-site, in-office, and office jobs, and when the workplace type is missing or unspecified uses the board's remote flag, then location text that contains "remote".

How to find a company

Paste the careers URL as it appears in the browser. These all work, including uppercase, a missing https://, a trailing slash, a job id in the path, and a query string.

Greenhouse:

  • https://boards.greenhouse.io/stripe
  • https://job-boards.greenhouse.io/stripe
  • https://job-boards.eu.greenhouse.io/stripe
  • https://boards.greenhouse.io/embed/job_board?for=stripe
  • greenhouse:stripe

Lever:

  • https://jobs.lever.co/palantir
  • https://jobs.eu.lever.co/aavelabs reads the EU API directly
  • lever:spotify

Ashby:

  • https://jobs.ashbyhq.com/ramp
  • A job URL such as https://jobs.ashbyhq.com/ramp/JOB_ID/application still uses the board name ramp
  • ashby:ramp

You can also pass a slug such as stripe, or a company name such as Ramp or Palantir Technologies. Auto mode builds a few slug variants, asks Greenhouse, Lever, and Ashby in parallel, and keeps the board with the most listed jobs. The run log and the resolvedFrom field on SUMMARY record the choice. Ramp resolves to Ashby, because that board lists far more jobs than the small Greenhouse board that uses the same slug.

If two lines resolve to the same provider and token, the board is fetched once.

Some companies put a custom domain in front of the board, such as careers.example.com. Search the page source for boards-api.greenhouse.io, api.lever.co, api.eu.lever.co, or api.ashbyhq.com. The token is the path segment on that request. You can paste the API URL itself.

Set Default provider when a bare slug should stay on one system. A full URL always stays on the system in that URL.

Jobs with isListed set to false on Ashby are skipped. They are not on the public board.

Input example

{
"companies": [
"https://job-boards.greenhouse.io/stripe",
"jobs.lever.co/palantir",
"https://jobs.ashbyhq.com/ramp"
],
"keywords": ["engineer"],
"includeDescription": false,
"maxJobsPerCompany": 25,
"maxResults": 100,
"onlyNew": false
}

Output example

{
"type": "job",
"jobId": "29a5da77-37f0-402a-92bc-072778e77ed8",
"jobKey": "ashby:ramp:29a5da77-37f0-402a-92bc-072778e77ed8",
"provider": "ashby",
"company": "ramp",
"companyToken": "ramp",
"title": "Software Engineer, Forward Deployed",
"url": "https://jobs.ashbyhq.com/ramp/29a5da77-37f0-402a-92bc-072778e77ed8",
"applyUrl": "https://jobs.ashbyhq.com/ramp/29a5da77-37f0-402a-92bc-072778e77ed8/application",
"location": "New York, NY (HQ)",
"locations": ["New York, NY (HQ)", "San Francisco, CA"],
"isRemote": false,
"workplaceType": "Hybrid",
"department": "Engineering",
"team": "Engineering",
"employmentType": "FullTime",
"postedAt": "2026-10-22T19:20:16.077Z",
"updatedAt": null,
"salary": {
"min": 168000,
"max": 285000,
"currency": "USD",
"interval": "year",
"text": "$168K – $285K • Offers Equity",
"source": "ats"
},
"requisitionId": null,
"description": null,
"status": "open",
"source": "https://api.ashbyhq.com/posting-api/job-board/ramp?includeCompensation=true",
"scrapedAt": "2026-10-24T22:30:03.326Z"
}

An unknown company looks like this. It is not charged.

{
"type": "error",
"input": "not-a-real-company-zzzz",
"provider": null,
"companyToken": null,
"error": "NOT_FOUND",
"errorMessage": "No Greenhouse, Lever, or Ashby board listed jobs for \"not-a-real-company-zzzz\". Tried notarealcompanyzzzz, not-a-real-company-zzzz, not."
}

How much does it cost?

$1.00 per 1,000 jobs ($0.001 per job) plus a small per-run start fee. Error rows and jobs you've already seen are never charged.

That is $0.001 per job pushed with the job event. A remembered job whose title, location, department, salary text, or update time changed is charged when you turn on include changed jobs, and its status is changed. Closed records are free. Companies that return nothing, and jobs dropped by filters, are not charged. If the run has a max charge set, pushing stops when that limit is reached and the log says so. The run still succeeds.

Tips

Schedule the task once a day with only new jobs since last run turned on. Keep the state key stable. Seen jobs live in the named key-value store ats-job-feed-state, under a key that starts with SEEN_. That store is kept indefinitely, including on the free plan. A different state key is a different saved search, so an engineering feed and a design feed do not share memory.

Each remembered job also stores a short hash of the title, location, department, salary text, and update time. Turn on include changed jobs to receive a row when that hash changes. Those rows are charged as jobs. The hash is updated on every run that sees the job, so a later run only reports a change that happened after the last check. The first run after this hash was added records the current text and does not mark every old job as changed.

Jobs are remembered only after they pass the filters and are actually pushed. A later run with wider keywords can still pick up a role the earlier filter hid. Entries that have not matched for 90 days are dropped, and the map is capped at 300,000 jobs.

Include closed jobs when you want a record that a previously returned role left the board. That flag does nothing unless only-new mode is on. A tight max jobs per company can leave older roles out of the window, so their last-seen time is not refreshed. They are not marked closed while they remain on the board, and they age out of memory after 90 days.

Descriptions are off unless you turn them on. Leave them off for a large board. The actor reads one company at a time per worker and drops the description text when you did not ask for it.

Posted within days and posted within hours can be set together. The stricter window wins. Greenhouse dates use first published, then updated time.

Export jobs to Google Sheets

Apify can send the dataset to Google Sheets, Slack, or a webhook from the task's integrations. The run stops at your max results.

The default timeout is 10 minutes. The default memory is 256 MB, and a run can use from 256 MB to 1024 MB. Raise the timeout if you add a long list of large boards.

FAQ

The actor sends a normal GET request to the public JSON endpoints Greenhouse, Lever, and Ashby publish for career pages. The response is the same information a visitor sees on the job board. There is no login and no applicant data. Your use of the results, including who you contact, is yours to judge.

Why is a job missing?

The company may not use these three systems. Check the Errors view for NOT_FOUND or HTTP_ERROR. Keyword, location, department, remote, and posted-within filters drop roles that do not match. Ashby hides posts marked unlisted. Only-new mode hides jobs already stored for that state key. A role that moved to Workday or a custom site will not appear here.

How often is the data updated?

The actor shows the board as it is at the moment you run it. It does not refresh itself in the background. Companies update their own postings on their own schedule. Run it on the cadence you want. Daily is the usual choice with only-new mode.

Does it work with Workday or other ATS?

No. Only Greenhouse, Lever, and Ashby public boards are supported. Other systems return a free error row.

What am I charged for?

Each job row saved with the job event costs $0.001 ($1.00 per 1,000), plus a small start fee per run. Error rows, closed records, jobs dropped by your filters, and jobs already seen in only-new mode are free. Changed jobs are charged only when you turn on include changed jobs.

Support

Questions, or a board URL that should have worked: use the feedback tab on this actor's Apify Store page.