Competitor Hiring Tracker: Open Roles by Company
Pricing
from $10.00 / 1,000 company reports
Competitor Hiring Tracker: Open Roles by Company
Hiring signals per company from its own career site: open roles, new and closed roles, posting velocity, function, seniority, location and remote mix, salary. Look up by name, domain or careers URL, or discover who's hiring. Daily history for trends.
Pricing
from $10.00 / 1,000 company reports
Rating
0.0
(0)
Developer
SteadyScrape
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Security
Limited permissionsShare
Company Hiring Signals: Open Roles & Hiring Trends by Company
Get a hiring report for any company, built from the company's own career site rather than job-board reposts. Give it company names, domains or careers URLs and you get back one row per company: how many roles are open, how many were posted in the last 7, 30 and 90 days, which functions, seniority levels, locations and countries the company is hiring for, how many roles are remote, disclosed salary ranges, and day-over-day changes (new and closed roles, growth trend) from our daily history.
You can also discover companies without a list, for example "companies with the most open engineering roles in Germany posted in the last 30 days".
Data comes from a daily index of 1.2 million+ open jobs on 31,000+ company career sites (Greenhouse, Lever, Ashby, Workday, Workable, BambooHR, Recruitee, Personio and Rippling). Boards that aren't indexed yet are read live, and that includes SmartRecruiters.
- 🏢 Company in, signals out: names, domains, careers pages or ATS board URLs. Companies are matched through a curated directory, then the index, then the company's own website
- 📈 Hiring velocity: roles posted in the last 7/30/90 days, postings per week, plus new and closed roles and open-role change over 1, 7, 30 and 90 days as daily history builds up
- 🧭 Hiring mix: functions (Engineering, Sales, Data & AI…), raw departments, seniority, top locations and countries, remote/hybrid/on-site, employment types
- 💰 Salary: share of roles with a posted range, plus the median annual midpoint
- ✨ Highlights: short readable lines such as "21 Engineering roles in Seattle, US"
- 🔎 Discovery mode: rank companies by matching roles, recent postings, total openings, or growth once enough history exists
- 🔔 Weekly alerts:
changesOnlymode outputs only the companies that changed since the last run, with their new and closed roles, and you're not charged for unchanged companies - 💸 Pay only for companies found. Inputs that can't be matched are returned for free so you can see what was missed
Who uses this
- Sales and GTM teams: find accounts that are hiring for the team you sell to, for example companies adding data engineers or growing their sales team in a region
- Investors and analysts: follow headcount momentum across a portfolio or watchlist
- Recruiters and agencies: see who is hiring fastest in your niche and location
- Job seekers: check whether a company is growing or shrinking before you apply
Quick start
{"companies": ["Stripe", "datadoghq.com", "https://jobs.lever.co/palantir", "Anthropic", "nvidia.com"]}
Discovery, which needs no company list:
{"discoverFunctions": ["Engineering"],"discoverCountries": ["DE"],"discoverPostedWithinDays": 30,"maxCompanies": 25}
More examples:
- Companies hiring remote data roles in the US:
{"discoverKeywords": ["data engineer", "analytics engineer"], "discoverRemoteOnly": true, "discoverCountries": ["US"]} - Fastest-growing sales teams, once 7 days of history exist:
{"discoverFunctions": ["Sales"], "discoverSortBy": "growth7d"}
Output
You get one item per company. The Console's overview view shows the headline fields. Key fields:
| Field | Example |
|---|---|
company, atsPlatform, boardUrl | "Stripe", greenhouse, https://job-boards.greenhouse.io/stripe |
openRoles, openRolesIsLowerBound | 715, false |
postedLast7Days, postedLast30Days, postedLast90Days, postingsPerWeekLast30Days | 50, 203, 532, 47.4 |
trend | growing / shrinking / stable / not_enough_history |
openRolesChange | {"7d": {"since": "2026-11-02", "from": 690, "to": 715, "change": 25, "changePct": 3.6}, ...} |
newRolesSinceLastSnapshot, closedRolesSinceLastSnapshot | 12, 7 |
newRolesLast7Days, closedRolesLast7Days, newRolesLast30Days, closedRolesLast30Days | filled once the window is covered |
hiringHighlights | ["23 Sales roles in Dublin, IE", ...] |
functions, departments | [{"function": "Engineering", "openRoles": 178, "share": 0.249, "change": null}, ...] |
topLocations, countries, countryCount | [{"location": "San Francisco, US", "openRoles": 65}] |
seniorityMix, seniorityShare | {"SENIOR": 120, "MID": 300, ...} |
workplaceMix, remoteShare | {"remote": 110, "hybrid": 40, "onsite": 300, "unspecified": 265}, 0.154 |
salaryDisclosedShare, salary | 0.62, {"currency": "USD", "medianAnnualMidpoint": 182000, "rolesWithSalary": 410} |
recentRoles, recentClosedRoles | newest roles with title, department, location, posted date and URL |
history | {"trackedSince": "2026-10-26", "snapshotDays": 1, "windowsAvailable": [], "openRolesSeries": [...]} |
dataNotes | caveats for this row, for example Workday limits |
status, statusDetail, resolvedVia, matchConfidence | ok (charged), or free: not_found, no_open_roles, uncertain_match, error; directory, board_url, index_name_match, careers_page, discovery; high / medium |
The run summary is saved as OUTPUT in the key-value store. It has counts, how inputs were matched, index freshness, and which history windows exist.
History and trends: what exists today
Daily company snapshots started on October 26, 2026. Each night, after the index refresh, we record every company's open-role count, its function, location and seniority mix, and the IDs of new and closed roles. The trend fields fill in as that history builds up:
| Field | Available from |
|---|---|
openRolesChange.1d, newRolesSinceLastSnapshot, closedRolesSinceLastSnapshot | the second daily snapshot (about Oct 27, 2026) |
openRolesChange.7d, newRolesLast7Days, trend, growth7d sort | about Nov 2, 2026 |
openRolesChange.30d, newRolesLast30Days, growth30d sort | about Nov 25, 2026 |
openRolesChange.90d | about Jan 24, 2027 |
Until a window exists its field is null, and history.windowsAvailable lists the windows you can use. You don't need history for postedLast7Days, postedLast30Days and postedLast90Days, because they come from the posting dates on roles that are open now. Roles that were posted and then filled before today aren't counted.
Weekly alerts / changes only
Want a weekly "what changed" report for a watchlist instead of the full report every time? Turn on changesOnly and give the list a monitorId:
{"companies": ["Stripe", "datadoghq.com", "https://jobs.lever.co/palantir", "Figma", "Okta"],"changesOnly": true,"monitorId": "weekly-saas-accounts"}
How it works:
- First run = baseline. Each company gets its normal full report, marked
changeType: "baseline", and its current open roles are saved. If you setemitBaseline: false, the baseline is saved silently instead: nothing is output and nothing is charged. - Later runs output only companies that changed since the last run with the same
monitorId. Unchanged companies are left out and aren't charged. - A change row is the company's full current report plus:
changeType:changed,status_changed,baselineorcheck_failedchangesSince: when the previous state was savedchangeSummary: lines you can read at a glance, e.g."Open roles up 12 (+15.0%): 80 -> 92","7 new role(s), 2 closed","New department: Robotics (2 roles)","Now hiring in France (1 role)"newRolesCount,closedRolesCount,openRolesDeltachanges:openRoles{from, to, change, changePct},velocityAlert(up/down/ null),newRolesandclosedRoles(title, function, department, location, posted date, plus a URL for new roles),functionChanges,newDepartments/closedDepartments,newLocations/closedLocations,newCountries/droppedCountries, andpostedLast30Daysfrom/to
- The Changes view in the Console shows the headline fields.
When is a company reported?
| Option | Default | Meaning |
|---|---|---|
alertMinChangedRoles | 1 | Report when at least this many roles were added plus closed. Smaller changes keep adding up and are reported once they reach the threshold |
alertMinChangePct + alertMinChangeRoles | 10 % and 3 | velocityAlert fires when open roles move by at least 10 % and at least 3 roles. Set the percent to 0 to use the role count only. The same rule marks a functionChanges entry as notable |
changedRolesLimit | 25 | How many new and closed roles are listed per company. The counts are always complete |
resetBaseline | false | Start this monitor again from a fresh baseline |
A status change (for example a company whose roles all close) and a new or dropped department or country are always reported. A company that can't be checked on a run (check_failed) is reported free of charge, and its saved state is kept so the next run still compares against the last good check. If a run reaches your maximum charge, the changes that weren't delivered are reported on the next run.
State storage: the saved state lives in your own Apify account, in the key-value store company-hiring-signals-monitors (one record per company per monitor). Different monitorIds don't affect each other. If you run without a monitorId, the ID defaults to the saved task's ID, or to default. Giving each watchlist its own ID is clearer. Companies you add to the list later get a baseline row the first time they appear. Changes only works with a Companies list, not with discovery.
Example schedule (weekly, Monday 8:00)
- In the Console, open this Actor, enter the input above and click Save as a new task (for example "Weekly hiring alerts: SaaS accounts").
- Go to Schedules > Create new, set the cron expression to
0 8 * * 1and pick your timezone. Under Add, choose the task you just saved. - Optional: add an integration on the task (email, Slack, webhook, Zapier or Make) that runs when a run succeeds. It sends you the
changesview link, for examplehttps://api.apify.com/v2/datasets/{defaultDatasetId}/items?view=changes.
Because the job index refreshes once a day, running a monitor more than once a day won't show anything new. Weekly or daily schedules work best.
Good to know
- Workday: a career site lists at most 2,000 roles in the index, or 1,000 when read live. Very large employers are marked
openRolesIsLowerBound: true. Workday shows posting dates only up to 30 days, sopostedLast90Daysis a lower bound there. - Several boards per company: some companies run more than one career site. The main one is reported, and the others are listed in
otherBoards. - Functions and seniority are worked out from job titles and departments. Roles that don't fit a function are counted as
Other. - Matching by name uses the company names in the index. For ambiguous names, give a domain or the careers URL instead.
- Only public job postings are read. No personal data is collected.
Pricing
Pay per event: you're charged per company reported with status: ok. These are free: companies that aren't found, matched career sites with no open roles, uncertain name matches and errors. A run stops cleanly at your maximum charge.
Price per company report: $0.015 on the Apify Free plan, $0.013 on Starter (Bronze), $0.012 on Scale (Silver) and $0.010 on Business (Gold). Example: 50 companies cost $0.75 on the Free plan, or $0.50 on Business.
In changes only mode you pay the same per-company price, but only for companies that are output: baseline reports on the first run, then companies that changed. Unchanged companies cost nothing.
Related Actors
- Career Site Jobs Search: search the jobs themselves, with full filters and descriptions
- Remote Jobs API: remote jobs with eligibility and time-zone detection
- ATS Job Feed: every job from a list of company career sites
Questions or a missing company? Open an issue on the Actor page. SteadyScrape (steady-scrape)