Greenhouse, Lever & Ashby Jobs Scraper: New Jobs Monitor avatar

Greenhouse, Lever & Ashby Jobs Scraper: New Jobs Monitor

Pricing

from $1.50 / 1,000 jobs

Go to Apify Store
Greenhouse, Lever & Ashby Jobs Scraper: New Jobs Monitor

Greenhouse, Lever & Ashby Jobs Scraper: New Jobs Monitor

Scrape Greenhouse, Lever and Ashby careers pages and get only the new jobs since your last run: title, department, location, remote, salary, posted date and apply URL, normalized from official public job board APIs. No login or API key. $1.50 per 1,000 jobs.

Pricing

from $1.50 / 1,000 jobs

Rating

0.0

(0)

Developer

Haniel Azevedo

Haniel Azevedo

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

9 hours ago

Last modified

Share

English · Português (BR)

Paste Greenhouse, Lever or Ashby careers page URLs and get every open job (or only the jobs posted since your last run) as clean, normalized JSON: title, department, location, remote/hybrid, employment type, salary where published, posted date and apply URL. No login, no API key.

One Actor covers the three most common startup and scale-up applicant tracking systems (ATS). It reads each company's official public job board API (the same feeds the companies' own careers pages use), so results are complete, fast and stable: no browser, no proxies, no HTML scraping.

Who it's for

  • Job seekers and job-alert builders who want to hear about new roles at a list of target companies the day they are posted.
  • Recruiters, sales and lead-generation teams who use hiring as a buying signal ("company X just opened 5 data engineering roles").
  • Job boards, newsletters and aggregators that need a clean, deduplicated feed across Greenhouse, Lever and Ashby with one schema.
  • Analysts and investors tracking headcount plans, salary ranges and remote policies across companies.

Try it

Click Start without changing anything. The prefilled input returns the 10 newest jobs from each of Airbnb (Greenhouse), Spotify (Lever) and Linear (Ashby), 30 in total:

{
"companies": [
"https://job-boards.greenhouse.io/airbnb",
"https://jobs.lever.co/spotify",
"https://jobs.ashbyhq.com/linear"
],
"maxResults": 30,
"maxJobsPerCompany": 10
}

It finishes in about a second (three API requests) and costs $0.045. An empty input {} uses the same three companies with a 100-job limit. Then replace the companies with your own list and add filters.

What you can put in "Companies"

One entry per line, mixed freely:

You pasteWhat happens
https://job-boards.greenhouse.io/airbnb, https://boards.greenhouse.io/stripe/jobs/123Greenhouse board detected from the URL
https://jobs.lever.co/spotify, https://jobs.eu.lever.co/acmeLever board (EU instance supported)
https://jobs.ashbyhq.com/linearAshby board
https://www.notion.com/careersThe company's own careers page: the Actor opens it once, finds the Greenhouse, Lever or Ashby board it links to or embeds, and falls back to the domain name (notion)
stripeBare board token: tried on Greenhouse, then Lever, then Ashby
greenhouse:stripe, lever:palantir, ashby:openaiToken with the ATS named, one request

Embed URLs (boards.greenhouse.io/embed/job_board?for=…) and API URLs work too. The same board given twice is fetched once.

How to use it

All (default): every open job that matches your filters, newest first per company.

Monitor: set mode to monitor and schedule the Actor (hourly or daily). It remembers which jobs it has already delivered, in a named key-value store ats-job-boards-monitor that persists between runs (one entry per company list + filters), and delivers only new jobs, marked "changeType": "new". You pay once per job, not once per run. Options:

  • firstRun: "baseline" remembers the current jobs on the first run without delivering or charging them, so you are only alerted about jobs posted later.
  • includeRemoved: true also outputs a free "type": "removed" record when a job you were sent disappears from its board (usually filled or closed).
  • stateKey names the monitor, so you can edit the list without losing its history.

Connect the dataset to Slack, email, Google Sheets or a webhook with Apify integrations to get alerts.

Filters (all optional, combined with AND):

  • keywords / excludeKeywords: whole-word, case-insensitive, in the title (or title + description with keywordsIn).
  • locations / excludeLocations: text match on any location or country, e.g. London, United States, Remote.
  • remote: remote, remoteOrHybrid, hybrid or onsite.
  • departments: matches department or team, e.g. Engineering.
  • employmentTypes: FULL_TIME, PART_TIME, CONTRACT, INTERN, TEMPORARY.
  • postedWithinDays: only jobs first published in the last N days.
  • salaryOnly: only jobs that publish a pay range.

Size and limits: maxResults (default 100), maxJobsPerCompany, descriptionFormat (both, text, html or none; descriptions are most of the output size) and descriptionMaxChars.

Get new job alerts in Slack or email (step by step)

  1. In Companies, paste one careers page URL or board token per line (for example https://job-boards.greenhouse.io/airbnb, https://jobs.lever.co/spotify, https://jobs.ashbyhq.com/linear).
  2. Add filters if you want: Keywords, Locations, Workplace (remote, hybrid, onsite) or Departments / teams.
  3. Set Mode to monitor and Monitor: first run to baseline, so the jobs already open are remembered without being delivered or charged.
  4. Click Save as a new task and run it once.
  5. Open Schedules and run the task daily or hourly.
  6. On the task's Integrations tab, add Slack, Gmail, Zapier, Make or a webhook, triggered when a run succeeds.
  7. Each run then delivers only jobs posted since the last run, at $0.0015 per job. Runs with nothing new cost only the $0.00005 start fee.

Use with AI agents (MCP) and Python

MCP: add this Actor as a tool in Claude Desktop, Cursor, VS Code or any MCP client through the Apify MCP server: https://mcp.apify.com?tools=hanielazevedo/greenhouse-lever-ashby-new-jobs-monitor (sign in with your Apify account or pass your API token). The agent sees the input schema and can run the Actor and read the dataset itself.

Python (pip install apify-client):

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("hanielazevedo/greenhouse-lever-ashby-new-jobs-monitor").call(run_input={
"companies": [
"https://jobs.ashbyhq.com/linear",
"stripe"
],
"mode": "monitor",
"keywords": [
"engineer"
],
"remote": "remoteOrHybrid"
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

Sample output

One job (description shortened):

{
"type": "job",
"jobKey": "greenhouse:airbnb:8337229",
"ats": "greenhouse",
"company": "Airbnb",
"companyToken": "airbnb",
"jobId": "8337229",
"title": "Senior Manager, Community Policy",
"department": "Public Policy",
"team": null,
"location": "United States",
"locations": ["United States"],
"country": null,
"workplaceType": "remote",
"isRemote": true,
"employmentType": null,
"employmentTypeRaw": null,
"salary": {
"min": 204000,
"max": 255000,
"currency": "USD",
"interval": "year",
"label": "Pay Range",
"text": "Pay Range: 204,000–255,000 USD",
"ranges": [{ "min": 204000, "max": 255000, "currency": "USD", "interval": "year", "label": "Pay Range" }]
},
"postedAt": "2026-10-30T19:19:06.000Z",
"updatedAt": "2026-10-30T19:19:06.000Z",
"jobUrl": "https://careers.airbnb.com/positions/8337229?gh_jid=8337229",
"applyUrl": "https://careers.airbnb.com/positions/8337229?gh_jid=8337229",
"boardUrl": "https://job-boards.greenhouse.io/airbnb",
"changeType": null,
"scrapedAt": "2026-10-31T21:08:00.540Z",
"descriptionHtml": "<p>Airbnb was born in 2007 when two hosts welcomed three guests…</p>",
"descriptionText": "Airbnb was born in 2007 when two hosts welcomed three guests…"
}

A company that fails produces a free error record instead, and the run continues:

{
"type": "error",
"input": "nonexistentco12345",
"ats": null,
"companyToken": "nonexistentco12345",
"detectedVia": "token",
"errorCode": "BOARD_NOT_FOUND",
"errorMessage": "No public board named \"nonexistentco12345\" on Greenhouse, Lever or Ashby",
"httpStatus": 404,
"url": null,
"scrapedAt": "2026-10-31T21:12:16.000Z"
}

What you get (fields)

FieldNotes
jobKeyats:companyToken:jobId, unique and stable: use it to deduplicate
ats, company, companyToken, jobIdSource ATS, company name (Greenhouse publishes it; for Lever and Ashby it is derived from the board name), board token, the ATS's job ID
title, department, teamAs published
location, locations[], countryPrimary location, all locations, and country when the ATS provides it
workplaceType, isRemoteremote, hybrid, onsite or null. From the ATS field when there is one, otherwise inferred from the location text ("Remote")
employmentType, employmentTypeRawNormalized (FULL_TIME, PART_TIME, CONTRACT, INTERN, TEMPORARY) plus the original label
salarymin, max, currency, interval (year, month, week, day, hour), label, the employer's text summary, and every published range in ranges[] (e.g. per pay zone). Null when the job doesn't publish pay
postedAt, updatedAtISO 8601 UTC. Greenhouse: first published / updated; Lever: created; Ashby: published
jobUrl, applyUrl, boardUrlPosting page, application page, company board
descriptionHtml, descriptionTextFull description (Lever includes the lists and closing sections), optional
changeTypenew in monitor mode, null otherwise

Salary coverage depends on the employer and the law where the job is located: in our tests about 80% of Airbnb's Greenhouse jobs, Ashby boards using compensation tiers, and Lever postings with a salary range published pay. The run's SUMMARY record (key-value store) has per-company counts, detected ATS and token, and error details.

How much does it cost to scrape Greenhouse, Lever and Ashby jobs?

Pay per event:

  • $0.0015 per job delivered ($1.50 per 1,000 jobs).
  • $0.00005 per run (Apify's standard actor-start event).
  • Free: error records, removed-job records, jobs skipped by filters, and jobs already delivered in monitor mode.

Examples:

  • Prefilled run (30 jobs): $0.045.
  • Monitor of 50 companies, checked daily, ~20 new matching jobs a day: about $0.03 a day, under $1 a month.
  • Full snapshot of a 1,000-job board: $1.50.

Set Max cost per run in the run options to cap spending: the Actor stops cleanly at the limit (CHARGE_LIMIT_REACHED), and in monitor mode the jobs it did not deliver are sent next run.

Reliability and error codes

  • Up to 3 boards fetched in parallel (maxConcurrency, max 10), with requests to the same API host spaced out.
  • Retries with exponential backoff on HTTP 429 (honouring Retry-After), 5xx, timeouts and network errors (maxRetries, default 4).
  • One company failing never fails the run. Error records carry one of these codes:
CodeMeaning
BOARD_NOT_FOUNDNo public board with that token (404). Check the spelling, or the company may have moved ATS
ATS_NOT_DETECTEDThe careers page doesn't link to a Greenhouse, Lever or Ashby board (it may use another ATS or load jobs in a way we can't see)
CAREERS_PAGE_UNREACHABLEThe careers page couldn't be loaded and no board matched its domain name
INVALID_COMPANYThe entry is not a URL or a valid token
RATE_LIMITEDStill HTTP 429 after all retries
ACCESS_DENIEDHTTP 401/403 from the ATS
UPSTREAM_ERROR, TIMEOUT, NETWORK_ERRORATS server or network problems after retries
BAD_RESPONSEThe API answered with something that isn't the documented format

Run-level status codes in SUMMARY: NO_RESULTS, MAX_RESULTS_REACHED, CHARGE_LIMIT_REACHED, BASELINE_CREATED, ALL_COMPANIES_FAILED (the run still succeeds, with error records), INVALID_INPUT and STATE_ERROR (the only ones that fail the run).

Data source and terms

The Actor only calls the documented, unauthenticated public job board APIs that each ATS provides for publishing jobs:

  • Greenhouse Job Board API: boards-api.greenhouse.io/v1/boards/{token}/jobs?content=true
  • Lever Postings API: api.lever.co/v0/postings/{company}?mode=json
  • Ashby Job Postings API: api.ashbyhq.com/posting-api/job-board/{name}?includeCompensation=true

It never logs in, never submits applications and only reads jobs that companies have published publicly. Careers pages on company websites are fetched once (a normal page view) to find the board link. Data is live: each run reads the boards at that moment.

Greenhouse vs Lever vs Ashby scrapers: how this one compares

  • Three ATSs, one format. Greenhouse, Lever and Ashby boards go in the same list, and every job comes out with the same fields (title, locations, workplaceType, employmentType, salary, postedAt, applyUrl), so you don't need one scraper and one parser per ATS.
  • Only new jobs. Monitor mode is built in: each job is delivered and charged once, and includeRemoved can flag jobs that were taken down, for free.
  • Official public feeds. It reads each board's public job board API, the same feed the careers page uses. No browser, proxy, login or API key.
  • Price. $1.50 per 1,000 jobs delivered; errors, removed-job records and jobs already sent are free. On 31 Oct 2026, two other ATS job-board Actors in the Apify Store charged $1.50 and $12.00 per 1,000 jobs on the free plan, and the first is cheaper on its paid discount tiers.
  • Limits. Only these three ATSs. Workday, SmartRecruiters, Workable and others are not supported yet.

FAQ

Does it support Workday, SmartRecruiters, Workable or others? Not yet: only Greenhouse, Lever and Ashby. Pages using another ATS return ATS_NOT_DETECTED.

How do I find a company's board token? Paste the careers page URL and the Actor finds it. The token is also the last part of the board URL (jobs.lever.co/spotify). Each job's companyToken and the SUMMARY record show what was detected.

Why is the company name in lowercase or slightly off for Lever/Ashby jobs? Those APIs don't return a company name, so it is derived from the board token (palantir becomes "Palantir").

Why is employmentType null for some Greenhouse jobs? Greenhouse has no standard field for it; the Actor reads it from the board's custom fields when the company provides one.

How does monitor mode know what's new? It compares each job's jobKey with the ones it already delivered for the same companies and filters. A job edited after posting is not resent. A board that fails in one run doesn't make its jobs look removed or new.

Can I run it for hundreds of companies? Yes. Each board is one request (a few seconds for very large boards); a run accepts up to 5,000 entries.

What if a company has boards on two ATSs? Bare tokens stop at the first ATS that has the board. Turn on probeAllAts to collect from every ATS that has one.

Other Actors by Haniel


Português (BR)

Cole URLs de páginas de carreira do Greenhouse, Lever ou Ashby e receba todas as vagas abertas (ou só as publicadas desde a última execução) em JSON limpo e padronizado: título, departamento, local, remoto/híbrido, tipo de contrato, salário quando publicado, data de publicação e link para se candidatar. Sem login, sem chave de API.

Um único Actor cobre os três ATS (sistemas de recrutamento) mais usados por startups e scale-ups. Ele lê a API pública oficial do quadro de vagas de cada empresa (o mesmo feed que a página de carreiras da empresa usa), sem navegador, proxy ou raspagem de HTML.

Para quem é

  • Quem procura emprego e quem cria alertas de vagas: saiba das vagas novas nas empresas-alvo no dia em que são publicadas.
  • Recrutadores, vendas e geração de leads: contratações como sinal de compra ("a empresa X abriu 5 vagas de engenharia de dados").
  • Sites de vagas, newsletters e agregadores: um feed único, sem duplicatas, com o mesmo formato para os três ATS.
  • Analistas e investidores: acompanhe planos de contratação, faixas salariais e política de trabalho remoto.

Experimente

Clique em Start sem mudar nada: o exemplo traz as 10 vagas mais recentes de Airbnb (Greenhouse), Spotify (Lever) e Linear (Ashby), 30 no total, em cerca de um segundo, por US$ 0,045. Uma entrada vazia {} usa as mesmas empresas com limite de 100 vagas.

Como usar

  • Em Companies, uma empresa por linha: URL do quadro (https://jobs.lever.co/spotify), página de carreiras do site da empresa (https://www.notion.com/careers, o Actor encontra o quadro vinculado), token simples (stripe, testado no Greenhouse, Lever e Ashby) ou token com prefixo (lever:palantir).
  • Filtros: palavras-chave (no título ou também na descrição), palavras excluídas, locais, remoto/híbrido/presencial, departamento, tipo de contrato, publicadas nos últimos N dias e só vagas com salário.
  • Modo monitor (mode: "monitor"): agende a execução; o Actor guarda as vagas já entregues no key-value store nomeado ats-job-boards-monitor e entrega só as vagas novas (changeType: "new"). firstRun: "baseline" memoriza as vagas atuais sem entregar nem cobrar; includeRemoved: true avisa (grátis) quando uma vaga sai do ar.
  • descriptionFormat: "none" reduz bastante o tamanho da saída.

Alertas de vagas novas no Slack ou por e-mail (passo a passo)

  1. Em Companies, cole uma URL de página de carreiras ou token por linha.
  2. Adicione filtros se quiser: Keywords, Locations, Workplace ou Departments / teams.
  3. Coloque Mode em monitor e Monitor: first run em baseline (as vagas já abertas são memorizadas sem entrega nem cobrança).
  4. Clique em Save as a new task e rode uma vez.
  5. Em Schedules, agende a task diária ou de hora em hora.
  6. Na aba Integrations da task, adicione Slack, Gmail, Zapier, Make ou um webhook.
  7. Cada execução entrega só as vagas publicadas desde a anterior, a US$ 0,0015 cada.

Exemplo de saída

Veja o JSON de exemplo na seção em inglês: cada vaga traz jobKey, ats, company, title, department, team, locations, workplaceType, employmentType, salary (mín., máx., moeda, período e texto do empregador), postedAt, jobUrl, applyUrl e a descrição em HTML e texto.

Quanto custa raspar vagas do Greenhouse, Lever e Ashby?

  • US$ 0,0015 por vaga entregue (US$ 1,50 por 1.000 vagas) + US$ 0,00005 por execução.
  • Grátis: registros de erro, registros de vaga removida, vagas descartadas pelos filtros e vagas já entregues no modo monitor.
  • Exemplo: monitorar 50 empresas por dia com ~20 vagas novas por dia custa cerca de US$ 0,03 por dia.
  • Use Max cost per run para limitar o gasto; no modo monitor, o que não foi entregue vai na próxima execução.

Códigos de erro

Uma empresa com problema gera um registro gratuito type: "error" e a execução continua: BOARD_NOT_FOUND (token inexistente), ATS_NOT_DETECTED (a página de carreiras não aponta para Greenhouse, Lever ou Ashby), CAREERS_PAGE_UNREACHABLE, INVALID_COMPANY, RATE_LIMITED, ACCESS_DENIED, UPSTREAM_ERROR, TIMEOUT, NETWORK_ERROR, BAD_RESPONSE. Há novas tentativas automáticas com espera exponencial para 429 (respeitando Retry-After), 5xx e falhas de rede.

Perguntas frequentes

Funciona com Workday, Gupy ou outros ATS? Ainda não: só Greenhouse, Lever e Ashby.

Precisa de login? Não. Só são usadas as APIs públicas e documentadas que os ATS oferecem para divulgar vagas; o Actor nunca faz login nem envia candidaturas.

Como o modo monitor sabe o que é novo? Compara o jobKey de cada vaga com as já entregues para a mesma lista de empresas e filtros. Se um quadro falhar numa execução, as vagas dele não aparecem como removidas nem como novas.

Por que o nome da empresa vem do token no Lever e no Ashby? Essas APIs não informam o nome da empresa; ele é derivado do token (palantir vira "Palantir").

Uso com agentes de IA (MCP) e Python

MCP: adicione este Actor como ferramenta no Claude Desktop, Cursor, VS Code ou outro cliente MCP pelo servidor MCP da Apify: https://mcp.apify.com?tools=hanielazevedo/greenhouse-lever-ashby-new-jobs-monitor. O agente lê o schema de entrada, roda o Actor e lê o dataset.

Python (pip install apify-client): veja o exemplo na seção em inglês.

Outros Actors do Haniel