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).
- 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.
- 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.
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.