# Changelog of ATS Jobs API: Workday, Greenhouse, Lever & 12 more (`steadybyte/ats-jobs-feed`) Actor

- **URL**: https://apify.com/steadybyte/ats-jobs-feed/changelog.md
- **Full Actor documentation**: https://apify.com/steadybyte/ats-jobs-feed.md

## Changelog

### 1.4.7 (31 Oct 2026)

- On a 512 MB run (1/8 of a CPU), large boards are less likely to fail with a timeout: the 30-second limit now covers waiting for the server to answer, and downloading a board may take up to 3 minutes. Greenhouse and Ashby boards are converted in small steps so other downloads keep moving.

### 1.4.6 (31 Oct 2026)

**Reliability**

- Runs no longer run out of memory at the default 512 MB. Node sized its heap from the host machine, not the run's memory, so several large Greenhouse boards with HTML descriptions could crash a 512 MB run. The heap is now capped at 55% of the run's memory and 3 boards are read at a time (was 5). A 512 MB-equivalent local run with 14 large Greenhouse boards, NVIDIA's Workday board, Spotify (Lever) and OpenAI (Ashby), 300 jobs per board with HTML (4,697 jobs), peaked at 383 MB.
- Errors such as 401 or 403 are not retried. A request with no answer within 30 s is tried at most 3 times (was 4), and the warning names the URL.
- After a hard crash in monitoring mode, at most 30 jobs (was 50) can be delivered again.

**Input**

- One job's URL returns only that job, and only that job is charged, on Greenhouse, Lever, Ashby, Workable, Workday and SmartRecruiters (also a careers-page link with `?gh_jid=` when the page shows its Greenhouse board). Before, it returned the whole board. The board is listed until the job is found; a closed job is reported as "Job … is not open". Job URLs from other ATS still read the whole board.

**Data**

- A major city on its own sets `country` and matches a country filter (`London` → `GB`, `10245 Berlin` → `DE`); about 140 cities, leaving out names shared with well-known places elsewhere (Vancouver, Cambridge, Portland).
- Greenhouse and Gem office names that are legal entities ("IONOS SE", "Acme GmbH") are no longer listed in `locations`.
- `url` is never the text "null": without one from the ATS it falls back to the apply URL, or for Greenhouse to the public job page.
- HTML entities in titles are decoded ("R\&D" → "R\&D").
- `companySlug` is lower case, like `id` (except Workday, which keeps the site's own spelling).
- When a limit stops a board that was already fully listed, the summary says how many open jobs the board has ("Stopped early (Max jobs in total): 3 open jobs on the board, 1 delivered.") instead of "listed so far".

### 1.4.4 and 1.4.5 (31 Oct 2026)

- README only: intro, supported ATS near the top, link to Greenhouse Jobs Scraper.

### 1.4.3 (27 Oct 2026)

- Companies that can't be read (board not found, input not recognised, a board that returns errors) are warnings, not a failed run. The run ends as Succeeded with the jobs from the companies that worked. `RUN_SUMMARY` adds `ok` and `failedCompanies` (company, board, status, reason). Skipped companies are never charged.
- An empty `companies` list (for example only blank lines) ends with a warning and 0 jobs instead of an input error.

### 1.4.2 (27 Oct 2026)

- Runs need at least 512 MB of memory (the default). At 128 MB a run ran out of memory and failed within seconds.

### 1.4 (27 Oct 2026)

**Filters**

- Country entries match places in that country only: `Mexico` no longer matches "New Mexico", `Ireland` no longer matches "Northern Ireland", `Guinea` no longer matches "Papua New Guinea", and `US` no longer matches "North America" or "Latin America". A job whose `country` is another country never matches by text.
- `Georgia` (the country) no longer returns US jobs in the state of Georgia ("Atlanta, Georgia", "Remote - Georgia").
- Keywords match whole words plus plain endings ("engineer" → "Engineers", "Engineering"), not longer words: `sales` no longer matches "Salesforce", `data` "Database", `product` "Production", `java` "JavaScript", `react` "Reactive".
- The `Washington DC` location entry also matches "Washington, DC".

**Data quality**

- `country` is set only when every location names the same country. Locations that name no country ("Remote", "Hybrid", "EMEA") are ignored; "Remote Ireland" and "Remote - Washington D.C." are read. A job in Dublin and Berlin, or in "Remote, KSA" and "Remote, UAE", now has `country: null` instead of one of them. "Remote (BE, DE)" is read as two country codes, not as Delaware.

**Workday**

- Capped boards are split by a facet that counts each job once. Accenture was split by Skills, whose part counts add up to 1.8 times the board, so many jobs were fetched more than once (each was still delivered once); it is now split by Area of Work. The full board still takes more than 20 minutes (about 24,000 of 42,000 jobs listed in the first 20).
- The listing progress shows the board's real size ("of 42,176 jobs"), not the sum of the split facet.

**Docs**

- README: the crash bound in monitoring mode is stated exactly (at most 50 jobs re-sent after a hard crash); keyword, country and location rules updated.
- Status wording for one skipped job ("its details").

### 1.3 (27 Oct 2026)

**Workday**

- Big boards list in minutes instead of timing out: boards that page past 2,000 jobs are paged normally (CVS Health, ~19,600 jobs listed in under 3 minutes); capped boards are split by the facet with the fewest parts that covers them, 4 requests at a time (Target, ~14,200 jobs in about 4.5 minutes; NVIDIA in under a minute).
- One part that can't be read no longer stops the rest of the board; the company is marked `partial` and says which parts failed.
- "Posted within N days" skips detail requests for jobs the list already shows are older.
- The run's status message shows listing progress on large boards.

**Billing**

- A job whose detail request fails after retries is no longer delivered with empty fields: it is skipped, not charged, not remembered by monitoring, and counted in the summary (`detailsFailed`). A board stops after 10 such failures in a row.

**Data quality**

- `country` is always an ISO 3166-1 code or null, from standard ISO data: France is `FR` (was `FX`), Russia `RU`, Serbia `RS`; "European Union" becomes null; more names and 3-letter codes are recognised.
- When the ATS gives no country, it is taken from the locations if they all name the same one ("Austin, TX" → `US`).
- Greenhouse salary is filled from the board's pay ranges (`salaryMin` / `salaryMax` / `salaryCurrency` / `salaryText`).
- `isRemote` looks at every location, not just the first, when the ATS has no workplace type. Titles starting with "Remote" plus a role ("Remote Customer Support Agent"), "(Hybrid/Remote)" and "Homeoffice" locations count as remote.
- `salaryPeriod`: "biweekly", "2 WEEKS", "Semi-monthly" and similar are kept as written instead of being read as one week or month. A salary of 0 is null.
- Leftover double-encoded entities in descriptions (`&#39;`, `&amp;`, `&#xa;`) are decoded.
- SmartRecruiters: when paging returns fewer jobs than the board reports, it pages once more to recover the missing ones.

**Filters**

- Location `US` / `USA` / `United States` also finds US jobs written "City, State" without a country.
- Two-letter location entries that are country codes mean the country (`CA` = Canada, `IN` = India); US states by name or `US-CA`; "Georgia" is the country (`US-GA` for the state). The run log explains ambiguous entries.
- Location phrases ignore dash style and spacing ("Remote - Europe" = "Remote–Europe").
- Keywords: `c` no longer matches "C++", "C#" or "Objective-C"; `.net` matches "ASP.NET"; `full-stack` matches "Full Stack". Terms with no letters or digits are ignored.

**Runs and input**

- Status message: "from N boards" counts boards that delivered; boards read and "not recognised" inputs are reported separately. A board stopped by a limit says "Stopped early" in its summary.
- `-eu` is only accepted for Lever (ignored with a warning elsewhere, so a board is no longer read twice).
- `monitorId` must be text; counts given as text must be plain digits ("0x10" and "1e3" are rejected).
- README: Greenhouse salary, country, location and Workday sections corrected.

### 1.2 (27 Oct 2026)

**Billing and limits**

- Max jobs, max jobs per company and max cost per run now hold exactly, even with many companies in parallel.
- Each job is delivered and charged once per run: duplicate rows, repeated pages and repeated inputs are dropped first.
- At the max cost per run, only jobs actually stored count as delivered.

**Monitoring**

- Delivered jobs are saved as they go, and progress is saved before a platform migration, so a crash or restart doesn't resend the feed.
- Jobs still on their board are never forgotten. Jobs gone for 120 days are.
- Job IDs are lower-case and stable across input forms. Different Monitor IDs never share state. State from 1.1 is read as before.

**Coverage and speed**

- Workday boards over 2,000 jobs are read in full (split by category or location).
- Delivery starts with the first page and stops listing once limits are hit.
- SmartRecruiters fetches descriptions only for jobs that pass filters and limits.
- A page that fails no longer throws away the pages already read.
- New: `myworkdaysite.com` and 2-letter-locale Workday URLs, Lever EU in name lookup, names with spaces.

**Data quality**

- Remote: no more "Distributed" or "Remote Sensing" false positives; the ATS's workplace type wins.
- Locations: US / USA / United States, UK / United Kingdom, NY / New York and other common spellings match the same jobs. `country` is an ISO code.
- Exclude words no longer drop "Internal" for "intern".
- Greenhouse departments are filled even without descriptions.
- `employmentType` and `salaryPeriod` use small, consistent values.
- Cleaner descriptions and titles. SmartRecruiters always has an apply link.

**Runs**

- A clear status message on every run; the run fails when no company could be read.
- Retry waits are capped at 30 seconds. Input is validated in code too.
- Default memory lowered to 512 MB.
- README: the robots.txt sentence was not accurate for SmartRecruiters and is removed.

### 1.1 (27 Oct 2026)

- 9 more ATS: Workday, BambooHR, Personio, Teamtailor, Breezy HR, Rippling, Pinpoint, JazzHR, Gem.

### 1.0 (26 Oct 2026)

- First release: Greenhouse, Lever, Ashby, Workable, Recruitee, SmartRecruiters; filters; monitoring mode.
