Open jobs from any of 9 applicant tracking systems
ats_jobsAggregates and normalizes job postings from company career pages across multiple ATS platforms, enabling filtering by salary, location, seniority, and remote work.
Instructions
Open jobs from company career pages on Greenhouse, Lever, Ashby, Workday, Workable, Recruitee and Teamtailor (Polymer and HireHive by URL), normalised into one schema. Use it when you have a mix of companies or do not know which ATS a company uses; pass board URLs or careers pages in companies. Also filters by salary, seniority, work arrangement and staffing agencies. Filter with keywords, excludeKeywords, locations, remoteOnly and postedWithinDays. Full descriptions are off by default here to save tokens; set includeDescription to true to get them. Not affiliated with any ATS vendor. Cost, charged to your own Apify account: $0.002 per job returned. Each call is capped at maxCostUsd (default $0.25). Defaults applied by this server when omitted: maxTotalJobs=25, includeDescription=false. Runs Apify Actor fecklesspleb/ats-jobs-scraper (https://apify.com/fecklesspleb/ats-jobs-scraper).
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| dedupeBy | No | Remove duplicate jobs. Drop duplicates inside this run before they are output, so you never pay for them. None: every job is output (as before). Same job: a job with the same company, title and first location as one already output in this run is dropped (the dedupeKey field). Same company and title (merge locations): jobs of one company with the same title are output as one record whose locations list holds all their locations, with duplicateCount and mergedUids; such records are output when the company's board has been read. Duplicates of jobs output by earlier runs are not affected (use Only new jobs for that). Values: none = None; job = Same job (company + title + location); companyTitle = Same company and title (merge locations). | none |
| keywords | No | Title keywords (any). Keep jobs whose title contains at least one of these words (case-insensitive). Leave empty to keep all. | |
| companies | No | Companies (career board URLs or slugs). One entry per company. Accepts: a board URL (https://boards.greenhouse.io/airbnb, https://jobs.lever.co/leverdemo, https://jobs.ashbyhq.com/ramp, https://apply.workable.com/huggingface, https://bunq.recruitee.com, https://proxima.teamtailor.com, https://jobs.polymer.co/practice, https://hirehive-testing-account.hirehive.com, https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite or https://wd5.myworkdaysite.com/recruiting/qvc/QRG), an explicit 'ats:slug' such as 'greenhouse:airbnb' or 'polymer:practice', a bare slug such as 'stripe' (the Actor tries each ATS except Polymer and HireHive, which need their URL or prefix), or a company careers page that embeds one of these boards. Leave empty, with the directory off, for a demo run: up to 4 sample jobs from https://boards.greenhouse.io/airbnb at the normal per-job price. If no entry can be read, the run fails with an error. The form is prefilled with this sample board and 'Max jobs in total' 4, which runs the same small demo (4 x $0.002 = $0.008); replace it with your own boards and clear or raise 'Max jobs in total' for a real run. | |
| hasSalary | No | Only jobs with a salary. Return only jobs that state a salary, from the ATS's pay field or a range in the description (any currency or period). Jobs without one are dropped before they are output, so they are never charged. | |
| locations | No | Locations (any). Keep jobs whose location contains one of these strings, for example 'London', 'United States', 'Remote'. | |
| seniority | No | Seniority. Keep jobs with one of these seniority levels (derived from the title). Jobs whose title shows no level are left out when this is set. Empty by default (no change). | |
| timeRange | No | Posted within (fixed window). Optional. Only jobs whose ATS publish or update date falls in this window, as in career-site-jobs-feed. When set it replaces 'Posted within days'; 'Any time' turns the date limit off. Undated jobs follow 'Include undated jobs'. Empty by default (no change). Values: 1h = Last hour; 24h = Last 24 hours; 7d = Last 7 days; 30d = Last 30 days; all = Any time. | |
| maxCostUsd | No | Most this call may charge your Apify account, in US dollars. Default 0.25, maximum 5. Passed to Apify as maxTotalChargeUsd, the most Apify will charge for this run. | |
| remoteOnly | No | Remote jobs only. Keep only jobs marked remote by the ATS or with 'remote' in the location. | |
| departments | No | Departments or teams (any). Keep jobs whose department or team contains one of these strings, for example 'Engineering'. Workday jobs have no department field, so this filter removes all Workday jobs. | |
| onlyNewJobs | No | Only new jobs (monitoring mode). Return only jobs not returned by a previous run with this option on. State is kept in a named key-value store, so scheduled runs give you a clean feed of new postings and you pay only for new ones. | |
| maxTotalJobs | No | Max jobs in total. Stop the whole run after this many jobs. 0 means no limit (the value used when the field is empty). The run also stops at your 'Maximum cost per run'. The form is prefilled with 4 for a cheap sample run (4 x $0.002 = $0.008); clear it or raise it for real runs. | |
| includeExpired | No | Report expired jobs. On scheduled runs, add a free record with status 'expired' for each job an earlier run returned that its board no longer lists. Only boards read completely in this run are checked (not when 'Max jobs per company', 'Max total jobs' or the cost limit stopped the read, or when a Workday site has rows past its 2,000-row cap that could not be reached). Job records get status 'active' while this is on. Uses the state store. | |
| maxConcurrency | No | Companies in parallel. How many companies to scrape at the same time. Requests to each host are rate limited regardless. | |
| redactContacts | No | Remove contact details from descriptions. Replace e-mail addresses, phone numbers and 'Your recruiter: ' lines in job descriptions with placeholders. On by default; the Actor never outputs recruiter or hiring-manager fields. | |
| stateStoreName | No | State store name. Named key-value store used by 'Only new jobs'. Use different names for independent monitors. | ats-jobs-scraper-state |
| trackFirstSeen | No | Track first-seen dates. Keep firstSeenAt across runs (in the same named key-value store) without dropping jobs you already got. 'Only new jobs' turns this on automatically. | |
| employmentTypes | No | Employment type. Keep jobs whose normalised employment type is one of these. Jobs whose ATS gives no type are left out when this is set. Empty by default (no change). | |
| excludeAgencies | No | Exclude recruiting agencies. Leave out jobs that look like they were posted by a staffing or recruitment agency: the company name (e.g. Randstad, Hays, "… Staffing", "… Recruitment", "Personalberatung") or wording such as "on behalf of our client" or "für unseren Kunden suchen wir" in the description. It is a heuristic, so check the isAgency field before relying on it. Every job carries isAgency whether or not this is on; excluded jobs are never output or charged. | |
| excludeKeywords | No | Exclude title keywords. Drop jobs whose title contains any of these words, for example 'intern' or 'senior'. | |
| searchDirectory | No | Search the built-in company directory. Also scrape every board in the Actor's built-in directory of verified public career boards (startups and tech companies, refreshed with each Actor version). Combine with keyword, location and date filters to search across companies without listing them yourself. | |
| visaSponsorship | No | Visa sponsorship. Filter on visaSponsorship, read from the description text (yes / no / not stated). Pattern-based, not a legal statement by the employer. When on, job details are fetched (slower runs) and visaSponsorship / visaSponsorshipEvidence are added to each record; the description itself is still only output when 'Include description' is on. Values: any = Any; yes = Mentions sponsorship is offered; not_no = Exclude jobs that say no sponsorship. | any |
| workArrangement | No | Work arrangement. Keep jobs with one of these arrangements (derived from the ATS field, location and title). Jobs with no detectable arrangement are left out when this is set. Empty by default (no change). | |
| postedWithinDays | No | Posted within last N days. Keep only jobs first published in the last N days. Empty keeps all. | |
| descriptionFormat | No | Description format. Plain text, HTML, or both. Values: text = Plain text; html = HTML; both = Both. | text |
| maxJobsPerCompany | No | Max jobs per company. Stop after this many matching jobs per company. 0 means no limit. | |
| includeDescription | No | Include description. Include the full job description. Workday detail pages are always read, so locations, requisition ID and company come back filled in. This setting only controls whether the description text is included. | |
| includeUndatedJobs | No | Keep jobs without a posting date. When 'Posted within last N days' is set, keep jobs whose ATS does not expose a date. | |
| maxAnnualSalaryUsd | No | Maximum annual salary (USD). Keep jobs whose annual USD salary starts at or below this amount (the bottom of the range, or its only figure). Same conversion and handling of jobs without a convertible salary as the minimum. | |
| maxYearsExperience | No | Max years of experience required. Drop jobs whose description asks for more years than this (e.g. 2 for early-career). Jobs that state no number are kept. When set, job details are fetched (slower runs) and yearsExperienceMin / yearsExperienceMax are added to each record. | |
| minAnnualSalaryUsd | No | Minimum annual salary (USD). Keep jobs whose annual salary in US dollars reaches this amount (the top of the range, or its only figure, is at least this). Salaries are annualised (hour x 2,080, day x 260, week x 52, month x 12) and converted with a fixed rate table bundled with the Actor (rough reference rates, see salaryAnnualUsdMin). Jobs whose salary cannot be converted (none given, no pay period, or an unlisted currency) are dropped unless 'Keep jobs without a salary' is on. | |
| searchInDescription | No | Match keywords in description too. Also match 'Title keywords' against the job description. Requires 'Include description', except on Workday, where detail pages are always read. | |
| maxDirectoryCompanies | No | Max directory companies. Use only the N largest boards from the directory. 0 means all. | |
| includeJobsWithoutSalary | No | Keep jobs without a salary. With a minimum or maximum annual USD salary set, also keep jobs whose salary is missing or cannot be converted. Ignored when 'Only jobs with a salary' is on (jobs with no salary are dropped) and when no USD bound is set. |