# Changelog of Company Hiring Signals – Greenhouse, Lever & Ashby Monitor (`furkansmbl/company-hiring-signals`) Actor

- **URL**: https://apify.com/furkansmbl/company-hiring-signals/changelog.md
- **Full Actor documentation**: https://apify.com/furkansmbl/company-hiring-signals.md

## Changelog

### 0.2.1 (2026-10-15)

Store readiness: output schema, permissions, icon.

- Output schema (`.actor/output_schema.json`): the run's Output tab and the run's `output` in the API link to the Company signals view, the Jobs view and the `RUN_SUMMARY` record.
- The dataset schema moved to `.actor/dataset_schema.json` and now describes every signal and job field (type, title, description, example) for the API, MCP clients and AI agents. The platform validates pushed rows against it, so the tests check every row the code builds, plus the README examples.
- Key-value store schema: the `RUN_SUMMARY` record is a named collection.
- `actor.json` uses `inputSchema` and `outputSchema` (the `input` and `output` keys are deprecated).
- Works with Apify's limited permissions: it only uses the run's own storages and the named monitor store it creates per `monitorId`.
- The User-Agent now links to the Store page: `https://apify.com/furkansmbl/company-hiring-signals`. The API example in the README uses the real Actor ID.
- Store icon: `.actor/icon.png` (512 x 512).

### 0.2.0 (2026-10-15)

- **Workday support.** Workday is the career-site platform behind many large enterprises.
  - Reads the career site's own JSON search endpoint, 20 postings per request, at most 1 request per second per tenant.
  - Every Workday tenant's robots.txt is checked for both the site path and the `/wday/cxs/` API path before any request. Disallowed sites get an uncharged row explaining why.
  - Workday sites come from board URLs (`*.myworkdayjobs.com/<site>`, `myworkdaysite.com/recruiting/<tenant>/<site>`), from links on the company's careers pages, or from a small built-in list of tenants verified live (NVIDIA, Salesforce, Adobe, Intel, Cisco, Workday). They are never guessed.
  - `open_jobs` uses Workday's facet counts, because Workday caps its `total` at 2,000.
  - On large sites the newest postings are read up to `maxJobsPerCompany` (minimum 100, maximum 2,000). The signal row reports `jobs_analyzed` and `partial_read`. On partial reads, closed jobs are not reported, because a job that leaves the window may still be open.
  - Posting dates come from "Posted N Days Ago" labels and are flagged with `posted_at_estimated`. With `includeDescriptions`, the job detail gives the description and the exact date.
- The careers-page fallback reads up to 6 pages. It follows same-site careers links (including JSON-embedded ones) from every page, with `jobs.` / `careers.` hosts first.
- Classifier: "Customer Success Manager … (Data, Analytics …)" is no longer classified as data.

### 0.1.1 (2026-10-15)

- SmartRecruiters is no longer supported, because `api.smartrecruiters.com/robots.txt` disallows automated access.
  - It is never probed during detection, and SmartRecruiters board URLs are never fetched.
  - Those companies get an uncharged row: "SmartRecruiters is not supported (their robots.txt disallows automated access)".
  - SmartRecruiters boards cached by 0.1.0 are ignored and detection runs again.
- Six supported ATS: Greenhouse, Lever, Ashby, Workable, Recruitee and Personio.
- Stricter validation: a guessed board whose ATS company name clearly differs from the company is rejected unless the company's domain appears in its postings. This fixes a false match of wise.com to an unrelated "Wise Worksite Field Sales" Greenhouse board.
- Seniority: titles starting with "Manager, …" are classified as manager.
- README: the generic example is marked as illustrative; the output examples are refreshed from a real run.

### 0.1.0 (2026-10-15)

First release.

- Detects each company's public job board on Greenhouse, Lever, Ashby, Workable, SmartRecruiters (removed in 0.1.1), Recruitee and Personio:
  - from a board URL;
  - by guessing the board token, with validation;
  - from the company's careers page, respecting robots.txt.
- Company signal rows:
  - open roles, and new/closed/changed roles since the last run, with net change %;
  - breakdowns by function, seniority and country, plus remote share;
  - top new titles;
  - `sales_hiring`, `eng_hiring` and `hiring_surge` flags.
- Optional job rows:
  - normalised function, seniority, country, workplace type and employment type;
  - salary, when the ATS publishes it or the posting text states a range;
  - status `new` / `existing` / `closed` and `first_seen_at`;
  - optional plain-text descriptions with contact details removed.
- `monitorId` state for scheduled runs:
  - cached board resolution;
  - compact per-company snapshots;
  - `onlyChanges` mode.
- Filters: title keywords, functions, countries, remote only.
- Pay-per-event pricing:
  - events: `company-checked`, `job-row` and `job-description`;
  - honours the run's spending limit;
  - companies without a supported ATS are never charged.
