Company Hiring Trend Monitor avatar

Company Hiring Trend Monitor

Pricing

from $2.40 / 1,000 company-trend-results

Go to Apify Store
Company Hiring Trend Monitor

Company Hiring Trend Monitor

Monitor public company career pages and ATS boards over repeated runs and detect company-level hiring changes - new roles, removed roles, department growth, location expansion, and remote/hybrid movement. No login or cookies.

Pricing

from $2.40 / 1,000 company-trend-results

Rating

0.0

(0)

Developer

Delowar Munna

Delowar Munna

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Company Hiring Trend Monitor

Monitor public company career pages and ATS boards over repeated runs and detect company-level hiring changes — new roles, removed roles, department growth, location expansion, and remote/hybrid movement. The actor turns repeated job-listing snapshots into a clean, flat, CSV-friendly hiring trend dataset built for sales triggers, recruiting intelligence, market research, and competitor hiring analysis.

Unlike generic job scrapers that only return the current listings, this actor shows what changed across runs, which is what matters for sales timing and competitor growth monitoring.

  • No login, no cookies, no sessions. Public sources only.
  • One flat trend row per company per run.
  • Pay only for valid unique company trend rows (company-trend-result).

How it works

Each run, for every company you supply:

  1. Detect the source from the URL — Greenhouse, Lever, Ashby, Workable, or a generic careers page.
  2. Extract current open roles over HTTP (public JSON endpoints where available, otherwise HTML).
  3. Load the previous snapshot for that company from the Apify Key-Value Store.
  4. Diff current vs previous: new jobs, removed jobs, open-roles delta, department & location growth, remote/hybrid/on-site movement.
  5. Score the change with a transparent 0–100 hiring_trend_score (no AI).
  6. Save the new snapshot for next time (unless saveSnapshot is off).

First run is a baseline

The first time a company is seen there is nothing to compare against, so the row is marked snapshot_status = baseline_created, hiring_trend_label = no_baseline, previous_open_roles = null, and a baseline snapshot is stored. Run the actor again later (e.g. on a schedule) to get real change detection.


Supported sources

SourceExample URLExtraction
Greenhousehttps://boards.greenhouse.io/acmePublic board JSON API
Leverhttps://jobs.lever.co/acmePublic postings JSON API
Ashbyhttps://jobs.ashbyhq.com/acmePublic job-board JSON API
Workablehttps://apply.workable.com/acmePublic widget JSON (best-effort)
Generic careers pagehttps://acme.com/careersJSON-LD JobPosting + link heuristics (best-effort)

Input

Provide at least one of companyUrls or companies.

FieldTypeDefaultPurpose
companyUrlsstring[][]Raw career/ATS URLs to monitor
companiesobject[][]Structured { companyName, careersUrl, companyWebsite }
maxCompaniesinteger100Cap on companies processed (1–1000)
maxJobsPerCompanyinteger250Cap on jobs per company (1–1000)
outputModestringcompany_trends_onlycompany_trends_only or company_and_jobs
onlyChangedCompaniesbooleanfalseKeep only companies with detected changes
minChangeCountinteger0Min new + removed jobs to keep a company
departmentKeywordsstring[][]Keep only companies hiring in these departments
locationKeywordsstring[][]Keep only companies hiring in these locations
remoteFilterstringanyany, remote_only, hybrid_or_remote, onsite_only
snapshotKeyPrefixstringhiring-trendNamespace for stored snapshots
saveSnapshotbooleantrueSet false for dry-run (compare, don't overwrite)
deduplicateJobsbooleantrueRemove duplicate jobs before comparison
proxyConfigurationobject{ "useApifyProxy": true }See proxy policy below
debugModebooleanfalseExtra logs

No field accepts login credentials, cookies, session tokens, authorization headers, or private API keys.

Sample input — structured companies

{
"companies": [
{
"companyName": "Acme SaaS",
"companyWebsite": "https://acme.com",
"careersUrl": "https://jobs.lever.co/acme"
},
{
"companyName": "Acme AI",
"companyWebsite": "https://acme.ai",
"careersUrl": "https://boards.greenhouse.io/acmeai"
}
],
"outputMode": "company_trends_only",
"onlyChangedCompanies": true,
"minChangeCount": 1,
"saveSnapshot": true
}

Sample input — raw URLs + filters

{
"companyUrls": [
"https://boards.greenhouse.io/figma",
"https://jobs.ashbyhq.com/openai",
"https://jobs.lever.co/leverdemo"
],
"departmentKeywords": ["engineering", "sales"],
"locationKeywords": ["remote", "london"],
"remoteFilter": "hybrid_or_remote",
"maxJobsPerCompany": 250
}

Output

Company Hiring Trend Monitor output — all fields, table view

One flat company_trend row per company. Key fields:

FieldDescription
company_name, company_website, careers_url, source_type, company_keyIdentity & source
snapshot_statusbaseline_created, changed, unchanged, or failed
current_open_roles, previous_open_roles, open_roles_deltaRole counts
new_jobs_count, removed_jobs_count, unchanged_jobs_count, changed_job_titlesJob-level diff
top_departments, department_growth_signalsDepartment mix & growth
top_locations, location_growth_signalsLocation mix & growth
remote_jobs_count, hybrid_jobs_count, onsite_jobs_count, remote_deltaWorkplace mix
hiring_trend_score, hiring_trend_label, reason_tagsTransparent 0–100 score
first_seen_at, previous_snapshot_at, current_snapshot_atTimestamps
filtered_match, source_error, scraped_atStatus

When outputMode = company_and_jobs, additional flat job_snapshot rows are pushed for each current job (these are not charged).

Sample company_trend row (from a live run)

{
"record_type": "company_trend",
"input_url": "https://boards.greenhouse.io/figma",
"company_name": "Figma",
"company_website": null,
"careers_url": "https://boards.greenhouse.io/figma",
"source_type": "greenhouse",
"company_key": "figma-5888e4",
"snapshot_status": "unchanged",
"current_open_roles": 167,
"previous_open_roles": 167,
"open_roles_delta": 0,
"new_jobs_count": 0,
"removed_jobs_count": 0,
"unchanged_jobs_count": 167,
"changed_job_titles": "",
"top_departments": "Sales: 64; Engineering: 30; Marketing: 15; Business Operations: 14; Weavy - Figma Weave: 9",
"top_locations": "San Francisco, CA, New York, NY, United States: 88; London, England: 14; Tokyo, Japan: 11; Paris, France: 8; San Francisco, CA: 7",
"remote_jobs_count": 1,
"hybrid_jobs_count": 0,
"onsite_jobs_count": 166,
"remote_delta": 0,
"hiring_trend_score": 50,
"hiring_trend_label": "stable",
"reason_tags": "large_employer; no_change_detected",
"first_seen_at": "2026-06-09T04:19:12.939Z",
"previous_snapshot_at": "2026-06-09T04:37:28.443Z",
"current_snapshot_at": "2026-06-09T04:39:00.293Z",
"filtered_match": true,
"source_error": null,
"scraped_at": "2026-06-09T04:39:00.293Z"
}

The first run for any company is a baseline (snapshot_status: baseline_created, deltas null). The delta fields above populate from the second run onward — for example a growing company returns snapshot_status: changed, new_jobs_count: 11, open_roles_delta: 8, changed_job_titles: "NEW: Senior Data Engineer; …", department_growth_signals: "Engineering +5; Sales +3", and a higher hiring_trend_score/fast_growing label.

Sample job_snapshot row (outputMode = company_and_jobs)

{
"record_type": "job_snapshot",
"company_name": "Figma",
"company_key": "figma-5888e4",
"source_type": "greenhouse",
"job_id": "6789012",
"job_title": "Senior Software Engineer, Platform",
"department": "Engineering",
"location": "San Francisco, CA",
"workplace_type": "onsite",
"job_url": "https://boards.greenhouse.io/figma/jobs/6789012",
"posted_at": "2026-06-02T00:00:00.000Z",
"is_new_since_previous": true,
"was_removed": false,
"current_snapshot_at": "2026-06-09T04:39:00.293Z",
"scraped_at": "2026-06-09T04:39:00.293Z"
}

A RUN_SUMMARY object (companies processed, baselines created, changed/unchanged counts, duplicates removed, charged events, per-source counts, runtime) is written to the default Key-Value Store.


Pricing

This actor uses Pay Per Event. You are charged the company-trend-result event once per valid unique company trend row that passes your filters and is saved. Failed inputs, duplicates, filtered-out companies, and optional job_snapshot rows are never charged. The per-run spending limit you set on Apify is respected — the actor stops pushing once the cap is reached.

🚦 Proxy policy

Use Apify Datacenter proxy or no proxy for normal runs — both work reliably for public career pages and ATS APIs at this actor's conservative concurrency.

Apify Residential proxy is not supported. The actor will fail at startup if apifyProxyGroups includes RESIDENTIAL. Reason: in pay-per-event actors, residential bandwidth (charged per GB) is billed to the developer, not the run user, so a single bandwidth-heavy run could exceed the per-result event revenue.

If you genuinely need residential routing, supply your own residential provider via the proxy editor's Custom proxy URLs field — that traffic goes through your provider, not Apify, and is unaffected:

http://user:pass@proxy.iproyal.com:12321
http://user:pass@proxy.brightdata.com:22225
http://user:pass@proxy.oxylabs.io:7777

Tips

  • Schedule it. Trend detection needs at least two runs. Use Apify Schedules (e.g. weekly) with the same snapshotKeyPrefix to build a hiring-movement history.
  • Separate streams with different snapshotKeyPrefix values (e.g. competitors, prospects).
  • Dry-run with saveSnapshot: false to compare without overwriting your stored baseline.