Skip to main content
Glama

Open jobs from any of 9 applicant tracking systems

ats_jobs
Read-only

Aggregates 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

NameRequiredDescriptionDefault
dedupeByNoRemove 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
keywordsNoTitle keywords (any). Keep jobs whose title contains at least one of these words (case-insensitive). Leave empty to keep all.
companiesNoCompanies (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.
hasSalaryNoOnly 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.
locationsNoLocations (any). Keep jobs whose location contains one of these strings, for example 'London', 'United States', 'Remote'.
seniorityNoSeniority. 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).
timeRangeNoPosted 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.
maxCostUsdNoMost 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.
remoteOnlyNoRemote jobs only. Keep only jobs marked remote by the ATS or with 'remote' in the location.
departmentsNoDepartments 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.
onlyNewJobsNoOnly 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.
maxTotalJobsNoMax 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.
includeExpiredNoReport 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.
maxConcurrencyNoCompanies in parallel. How many companies to scrape at the same time. Requests to each host are rate limited regardless.
redactContactsNoRemove 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.
stateStoreNameNoState store name. Named key-value store used by 'Only new jobs'. Use different names for independent monitors.ats-jobs-scraper-state
trackFirstSeenNoTrack 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.
employmentTypesNoEmployment 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).
excludeAgenciesNoExclude 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.
excludeKeywordsNoExclude title keywords. Drop jobs whose title contains any of these words, for example 'intern' or 'senior'.
searchDirectoryNoSearch 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.
visaSponsorshipNoVisa 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
workArrangementNoWork 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).
postedWithinDaysNoPosted within last N days. Keep only jobs first published in the last N days. Empty keeps all.
descriptionFormatNoDescription format. Plain text, HTML, or both. Values: text = Plain text; html = HTML; both = Both.text
maxJobsPerCompanyNoMax jobs per company. Stop after this many matching jobs per company. 0 means no limit.
includeDescriptionNoInclude 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.
includeUndatedJobsNoKeep jobs without a posting date. When 'Posted within last N days' is set, keep jobs whose ATS does not expose a date.
maxAnnualSalaryUsdNoMaximum 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.
maxYearsExperienceNoMax 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.
minAnnualSalaryUsdNoMinimum 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.
searchInDescriptionNoMatch keywords in description too. Also match 'Title keywords' against the job description. Requires 'Include description', except on Workday, where detail pages are always read.
maxDirectoryCompaniesNoMax directory companies. Use only the N largest boards from the directory. 0 means all.
includeJobsWithoutSalaryNoKeep 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.

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv0.1.0

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations already covering read-only, non-destructive, open-world behavior, the description adds valuable context: per-job cost, a maxCostUsd cap, token-saving defaults, and the upstream Apify Actor. It still does not describe return record shape or rate-limit behavior, so it is strong but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and usage, then covers filters, defaults, and cost. It is dense for a 34-parameter tool, and although a few filter mentions duplicate schema content, none are seriously wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex multi-ATS scraping tool, it supplies the key operational context: supported boards, usage condition, cost model, and default limits. It does not explain the output job record, but the annotations and full parameter schema carry much of the remaining burden.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the input schema already carries the parameter meaning. The description mentions several filters and defaults, but mostly repeats what the schema says rather than adding new semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Open jobs') and resource ('company career pages') and enumerates the supported ATS platforms. It also distinguishes the tool from single-ATS siblings by telling the agent to use it when there is a mix of companies or the ATS is unknown.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear condition for use: mixed companies or unknown ATS. It implies, but does not explicitly name, the single-ATS alternatives such as greenhouse_jobs or lever_jobs, so the routing guidance is strong but not fully explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.