# Changelog of BambooHR Careers Scraper — Company Hiring Signals (`foxlabs/bamboohr-ats-scraper`) Actor

- **URL**: https://apify.com/foxlabs/bamboohr-ats-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/foxlabs/bamboohr-ats-scraper.md

## Changelog

### Cross-link — 2026-10-20

- README: links the cross-platform [Job Postings Database](https://apify.com/foxlabs/job-postings-database), for searches that span every ATS at once. No code, input, output or pricing change.

### Index refresh — 2026-10-14

- Company index refreshed from the latest public web-archive snapshots: no new careers sites found, 1,323 that no longer exist removed (checked live on 2026-10-14); the index now holds 7,510 careers sites, 7,509 of them answering and 1 temporarily unreachable (kept).

### 0.2.0 — 2026-10-14

- `_reportBoards` (internal input used only by the monthly index refresh, `tools/ats-index-refresh.mjs`): saves which indexed boards answered, were gone or unreachable to the run's key-value store as `BOARD_HEALTH`, so dead companies can be dropped from the index. Normal runs are unaffected. An HTTP 403 from a careers site is now retried and reported as unreachable instead of counted as "not a BambooHR tenant".
- Search fee code (`keyword-search`): charged once per search line that delivers at least one job, after its rows are written — never for an empty search, never twice after a restart. The event has no price yet, so nothing is charged until the price record starts.
- Prefill search is `sales` (200 jobs in 126 s on latest, run so1RVruToPSJTiPAk) instead of `account manager` (303 s, run ZFUhawwuBFDeSgX6x), so a first trial run finishes quickly.
- Restart-safe: when Apify migrates a run to another host, the actor starts again with the same dataset. It now reads the jobs already delivered (`companyBoard` + `jobId`), never writes or charges them again, and tops each query up to its cap only (beta run PpDnVESHJoXf6J2Db was migrated after 7,417 rows and started over).
- New: job-title search across thousands of BambooHR companies (`searchQueries`) — no subdomain needed. BambooHR has no cross-company search, so the actor walks a bundled index of BambooHR careers sites (`src/boards.txt`, discovered from Common Crawl), reads each site's `/careers/list` live, filters title/location/department/workplace/employment type on the list record, and makes the detail call only for matches. Stops as soon as `maxResultsPerQuery` matches are found. `postedWithinDays` filters on the detail record's date.
- Real company display names and logos from each careers page (`companyName` used to be the title-cased subdomain). New fields: `companyLogo`, `companyJobsUrl`, `workplace` (BambooHR location type 0/1/2 → on_site/remote/hybrid).
- Remote roles now carry their location from `atsLocation` (it is empty in `location` for remote jobs).
- A job found by several keywords is delivered and charged once per run; each careers site is read once per run however many keywords run.
- `queries` (company sites) works as before and is now optional.
- Index: 8,833 BambooHR careers-site subdomains from five Common Crawl snapshots (2026-21 … 2026-39), built with `tools/ats-board-index.mjs`; a full walk at 25 parallel reads found 6,090 live of the earlier 7,089 (beta run k1eNWLmUjeIqT0gRW, 0 unreachable).
- Location filter: on-site list records carry no country, so a country filter (e.g. `United States`) is decided on the detail record instead of dropping those jobs (beta B3 run matched only remote roles before this fix).
- Careers-site reads retry on HTTP 429/5xx and timeouts (backoff 2–16 s) instead of counting the company as dead; every walk logs live / not-a-tenant / unreachable counts and warns when more than 2% could not be read. (Beta run gZlHXa7DdmJQ9UUsq at 100 parallel reads lost ~500 live companies silently.)

### 0.1.0 — 2026-10-11

- Initial release. Scrapes every open role from any company's BambooHR careers site via the public careers API (`{company}.bamboohr.com/careers/list` + `/careers/{id}/detail`), no API key.
- Accepts company subdomains and `{company}.bamboohr.com/careers` URLs.
- Maps title, department, location (city/state/country), remote flag, employment type, seniority (minimum experience), salary (where published), posted date, HTML-stripped description and apply URL.
- Shares the B2B hiring-signal core (`core.js`) with the Greenhouse/Workable/Lever/… series: same row schema (join key `companyName` + `companyBoard`), pay-per-posting, concurrent queries, empty/failed queries returned as non-billable rows.
