Greenhouse, Lever & Ashby Job Scraper API | $1.50/1K avatar

Greenhouse, Lever & Ashby Job Scraper API | $1.50/1K

Pricing

from $1.45 / 1,000 job results

Go to Apify Store
Greenhouse, Lever & Ashby Job Scraper API | $1.50/1K

Greenhouse, Lever & Ashby Job Scraper API | $1.50/1K

Scrape public Greenhouse, Lever, and Ashby jobs into structured records with titles, locations, salary, and application links. Run with company slugs or preset lists; no buyer login or API key. Pricing: $0.0015 per returned job on Free.

Pricing

from $1.45 / 1,000 job results

Rating

0.0

(0)

Developer

Vitalii Bondarev

Vitalii Bondarev

Maintained by Community

Actor stats

0

Bookmarked

581

Total users

80

Monthly active users

10 hours ago

Last modified

Features

Limited permissions

Share

ATS Job Scraper API

Scrape public job postings from Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters, and Personio into normalized job rows or hiring-signal reports. The Actor reads public JSON/XML endpoints and needs no buyer login or API key.

  • Normalize postings into consistent rows for job boards, aggregators, and AI pipelines.
  • Extract titles, locations, descriptions, salary, seniority, remote type, and application links.
  • Track newly discovered and closed jobs for recurring hiring-signal feeds.
  • Generate reports with hiring intensity, role families, departments, regions, and outreach suggestions.
  • Start with company slugs, preset lists, or ATS auto-detection.

What you get

Fields are null when the source does not provide them; fields absent for a profile or record type are omitted.

Field familyFieldsTypeWhat it contains
Job identityats, companystringHosting ATS and company slug; always set.
Job identifiersjob_id, global_idstring or nullNative ID and {ats}:{company}:{job_id}; both are null without a source job ID.
Job detailstitle, location, departmentstring or nullPosting title, location, and department.
Work arrangementremote, remote_typeboolean; string or nullRemote flag and remote, hybrid, or onsite; Ashby remote can be null without a signal.
Team and employmentteam, employment_typestring or nullTeam and employment type. Only Lever, Ashby, and Personio fill team; employment_type is null for Greenhouse.
Seniority and payseniority, salarystring or nullSeniority and published salary. Seniority values are executive, vp, director, manager, principal, staff, lead, senior, intern, entry, or mid. Only Ashby and Recruitee set salary.
Links and posting dateurl, apply_url, posted_atstring or nullJob, application, and posting-date values. Greenhouse uses updated_at, falling back to first_published; Lever epoch milliseconds become ISO 8601.
Run timestampscraped_atISO 8601 stringOne scrape timestamp per run; absent from minimal.
Descriptionsdescription_text, description_htmlstring or nullPlain text and HTML when descriptions are enabled and available. compact removes HTML; minimal has neither field.
Change flagsis_new, is_closedbooleanis_new appears only on new-job rows in a delta run; is_closed is true only on closed-job notices.
Record statusrecord_type, chargedstring; booleanjob, closed_job_notice, or hiring_signal_report. Job rows have charged: true; closed notices have false; reports omit it.
Quality signalparse_confidencenumberShare of six non-empty fields—title, company, location, url, posted_at, description_text—rounded to two decimals from 0.0 to 1.0. With descriptions off, the maximum is 0.83.
Report timestampreport_generated_atISO 8601 stringReport generation time. Reports also share company, ats, and record_type.
Report metricstotal_open_roles, hiring_score, hiring_label, remote_shareinteger; integer; string; numberOpen-role count; score 0–100; aggressive_hiring, active_hiring, steady_hiring, low_hiring, or no_signal; and remote share 0.0–1.0, rounded to three decimals and 0.0 with no rows.
Hiring movementhiring_velocity, expansion_signalsobjectVelocity has recent_window_days, net_open_roles_change, and had_previous_run. Expansion has new departments, regions, role families, net change, and is_expanding.
Hiring breakdownspriority_roles, department_signals, region_signals, seniority_mix, keyword_hitsarray of objects; objectRole, department, and region names with counts; priority roles also have role_family, open_roles, and example_titles. seniority_mix counts junior, mid, senior, and leadership; keyword_hits maps terms to counts or {}.
Outreach outputrecommended_outreacharray of stringsOutreach angles based on hiring trends.

Raw output supports full, compact, and minimal. minimal retains ats, company, title, location, remote, remote_type, seniority, url, posted_at, global_id, and parse_confidence; it has no job_id, scraped_at, or description fields.

Sample output

This shortened sample omits the nonessential description_text and description_html fields. Every shown value is copied from one real dataset record.

{
"ats": "ashby", "company": "openai", "title": "Research Engineer", "location": "San Francisco",
"remote": null, "remote_type": null, "department": "Research", "team": "Research",
"employment_type": "FullTime", "seniority": "mid", "salary": "$250K - $445K",
"url": "https://jobs.ashbyhq.com/openai/240d459b-696d-43eb-8497-fab3e56ecd9b",
"apply_url": "https://jobs.ashbyhq.com/openai/240d459b-696d-43eb-8497-fab3e56ecd9b/application",
"posted_at": "2025-04-05T00:03:20.653+00:00",
"job_id": "240d459b-696d-43eb-8497-fab3e56ecd9b",
"global_id": "ashby:openai:240d459b-696d-43eb-8497-fab3e56ecd9b",
"parse_confidence": 1, "scraped_at": "2026-11-06T16:04:25.025096+00:00",
"record_type": "job", "charged": true
}

Pricing

The Actor uses pay-per-event pricing. job-result is one returned job posting. apify-actor-start is charged when the Actor starts; one event is charged per GB of run memory, with a minimum of one event.

EventPlanPrice per event
job-resultFree$0.0015 per event on Free
job-resultBronze$0.001485 per event on Bronze
job-resultSilver$0.00147 per event on Silver
job-resultGold$0.001455 per event on Gold
job-resultPlatinum$0.00144 per event on Platinum
job-resultDiamond$0.001425 per event on Diamond
apify-actor-startFree$0.00005 per event on Free
apify-actor-startBronze$0.0000495 per event on Bronze
apify-actor-startSilver$0.000049 per event on Silver
apify-actor-startGold$0.0000485 per event on Gold
apify-actor-startPlatinum$0.000048 per event on Platinum
apify-actor-startDiamond$0.0000475 per event on Diamond

For 1,000 job-result events and one apify-actor-start event, the total is $1.50005 on Free; for 10,000 job-result events and one apify-actor-start event, the total is $15.00005 on Free. The Apify Free plan's $5 monthly platform usage credit covers 3,333 job-result events plus one apify-actor-start event at Free prices.

The Free plan caps raw output at 10 job rows per run; paid plans lift this cap. Report mode searches only the first target and returns at most one report on Free. Closed-job notices do not count toward the raw-output cap.

You pay only the events listed above. This Actor does not use Pay per event + usage, so compute, proxy traffic, and storage are not billed separately. Report mode returns hiring-signal reports and does not charge job-result events.

How to use

  1. Choose companies with a slug and optional ATS, or select top-tech, ai-ml, devtools, or fintech.
  2. Omit ats to probe the supported ATS platforms and auto-detect the board.
  3. Set titleKeyword, locationKeyword, or remoteOnly, then choose descriptions and an output profile.
  4. Enable onlyNewSinceLastRun for recurring feeds, or reportMode for one report per successfully fetched company.
  5. Start the run and inspect job rows, reports, failedTargets, and the OUTPUT summary.
  6. Repeat the run through Apify Schedules; daily is a starting point for recurring job-listing and hiring-signal collection.
{
"companies": [{"ats": "greenhouse", "company": "stripe"}],
"titleKeyword": "engineer",
"includeDescriptions": true,
"outputProfile": "compact",
"maxJobsPerCompany": 50,
"onlyNewSinceLastRun": false
}

Export the dataset as JSON or CSV, or read it through the Apify dataset API.

Input parameters

ParameterWhat it doesDefault
companiesCompany references with an ATS enum and slug; omit ats for auto-detection.Empty
presetListsSelects top-tech, ai-ml, devtools, or fintech.Empty
titleKeywordKeeps titles containing a case-insensitive substring.Empty
locationKeywordKeeps locations containing a case-insensitive substring.Empty
remoteOnlyKeeps postings detected as fully remote.false
maxJobsPerCompanyCaps pushed raw rows after filtering; 0 means no per-company cap within other limits.50
includeDescriptionsIncludes plain-text and HTML descriptions; SmartRecruiters adds one detail request per job.true
onlyNewSinceLastRunPersists seen jobs and emits new jobs plus closed notices on later runs.false
outputProfileSelects full, compact, or minimal raw output.full
reportModeReplaces raw rows with one hiring-signal report per company.false
keywordsIn default raw searches, filters titles when no targets and no titleKeyword; in reports, populates keyword_hits.Empty
recentWindowDaysSets the report hiring-velocity window.30
disableUsageStatsTurns off the run summary described in Usage statistics.false

If both companies and presetLists are empty, all four preset lists are searched with duplicate companies removed. The current expansion contains 16 unique companies. A slug is the relevant path or subdomain value from the public careers URL, such as stripe in boards.greenhouse.io/stripe or ramp in jobs.ashbyhq.com/ramp.

Limits and edge cases

ConditionWhat the buyer seesWhat to do
Free-plan raw runAt most 10 job rows are delivered; paid plans lift the cap.Use the returned slice or a paid plan.
Free-plan report run with more than one targetOnly the first target is searched and at most one report is returned.Use a smaller batch or a paid plan.
maxJobsPerCompany is reachedMore matching rows are not pushed, but scanning continues and their IDs enter change-detection state.Raise the value or set it to 0.
First onlyNewSinceLastRun runMatching jobs are returned as new and billed, subject to the per-company and Free-plan limits; no closed notices appear.Keep companies and filters for later delta runs.
Later delta run finds changesOnly unseen IDs and closed-job notices are returned; closed notices are not limited by the Free cap.Keep the same companies and filters.
Delta state is storedSEEN_JOBS in the named multi-ats-job-state store persists between runs and records every fetched ID, including filtered or capped jobs. It is one set per account.Use the same account, companies, and filters. Omitted companies can appear closed; failed or skipped targets retain earlier IDs.
Target is stale, invalid, unsupported, empty, or unreachableIt appears in failedTargets with not_found_or_empty or the error text; reports contain company and reason.Check the public-board slug, provide the ATS, or retry later.
No rows are returnedOUTPUT and the status message explain possible empty boards, unmatched slugs, unreachable boards, filters, or no new jobs. Nothing was charged.Check OUTPUT, status, failedTargets, targets, and filters.
No usable targets are producedOUTPUT contains error: "no targets" and a message.Provide companies or a valid presetLists value.
Rows are delivered during a runRows are pushed company by company and charged after each push; OUTPUT and delta state are written after all companies finish.Wait for completion before relying on the summary or state.
Run is aborted, times out, or fails mid-runCompleted-company rows remain delivered and charged; no OUTPUT summary or delta-state update is written.The next delta run lists those jobs as new again.
60 seconds or less remain before timeoutNo new company fetch starts. Remaining companies appear in OUTPUT.skippedTargets; delta mode does not mark them closed.Retry the run.
Charge call failsRows are still delivered and the failure is logged.Check the run logs.
reportMode is enabledThe dataset contains reports instead of raw rows; companies with no fetched postings receive no report, and job-result events are not charged.Set reportMode to false for listing rows.

FAQ

How much does it cost to scrape job postings?

job-result costs $0.0015 per event on Free, and apify-actor-start costs $0.00005 per event on Free. For 1,000 job results plus one start event, the total is $1.50005 on Free; see Pricing for all plan prices.

What happens if no jobs are returned?

The Actor reports whether the board was empty, no target matched a supported board, filters excluded jobs, or no jobs were new. Check OUTPUT, the status message, and failedTargets.

Why is a company target not working?

Use the slug from its public careers URL and optionally provide the ATS. Without ats, the Actor probes Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters, and Personio. Stale or invalid targets appear in failedTargets.

Does the Actor require a login or API key?

No buyer login or API key is required. The Actor reads the supported ATS platforms' public JSON/XML job-board endpoints; your Apify account runs it and accesses the dataset.

The Actor's source is public job-board data from supported ATS endpoints. Source terms and applicable law depend on your use case, so review the relevant terms and requirements before using the data; public availability is not a legal guarantee.

Usage statistics

This Actor creates a small, content-free summary at the end of each run, used only to monitor reliability and improve this Actor. No input values, credentials or scraped data are sent.

A copy of the exact record for your run is saved as USAGE_STATS in your own Apify key-value store.

To opt out, set disableUsageStats to true in the input. Nothing is sent then.

Full list of collected fields