Hiring Signals: Company Job Openings Tracker
Pricing
from $1.08 / 1,000 jobs
Hiring Signals: Company Job Openings Tracker
Job openings tracker and company hiring tracker for a list of companies. Open jobs from each public Greenhouse or Lever job board, with title, location, remote, salary where listed and posting date. Monitor mode returns only new jobs, for new job alerts. Not affiliated with Greenhouse or Lever.
Pricing
from $1.08 / 1,000 jobs
Rating
0.0
(0)
Developer
Data Pulse
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Get the open jobs of a list of companies from their public Greenhouse and Lever job boards, one row per job. In monitor mode the Actor returns only the jobs that were added since the previous run.
Hiring is a useful sales trigger. A company that opens five sales roles in a new city, hires its first marketing lead or starts recruiting data engineers often needs tools, services and agencies soon after. This Actor gives you that list in a structured form, with department, location, remote flag and salary range where the company publishes one.
How it works
You enter companies as domains (stripe.com), board names (stripe), board URLs (https://jobs.lever.co/spotify) or with a prefix (greenhouse:stripe, lever:spotify).
For a domain, the Actor tries the company name and close variants on both job board platforms. A board with open jobs is preferred over an empty one. Use a prefix when you know the board name, because it skips the detection and avoids picking a board with the same name that belongs to another company.
If you turn on scanCareersPage, the Actor first looks for a board link on the company's own /careers and /jobs pages. It reads that site's robots.txt before and skips any page the site disallows. This option is off by default, because those requests go to the company's own website rather than to a job board API.
Jobs are read from the public job board APIs that these platforms provide for career pages. No login, no proxy and no browser. Every request identifies the Actor with its own User-Agent. The Actor keeps at least one second between requests to the same host and never sends more than one request at a time to a host. If a host answers 401 or 403, the Actor does not retry and skips that host for the rest of the run. It does the same after three rate-limit answers in a row.
Companies that cannot be found are listed in the run summary with the reason. They are free and never stop the run.
Input
| Field | Default | Notes |
|---|---|---|
companies | example | Domains, board names, board URLs or prefixed names. Up to 500 per run. Without this field the Actor runs a small example (greenhouse:vercel, up to 20 jobs). |
excludeCompanies | Companies to skip, in the same formats. They are not fetched and not charged. | |
mode | all | all returns every matching open job. monitor returns only jobs that are new since the previous run with the same monitor name. |
departments | Keep jobs whose department or team contains one of these words. | |
keywords | Keep jobs whose title contains one of these words. | |
locations | Keep jobs with a location that contains one of these words. | |
remoteOnly | false | Keep only remote jobs. |
maxJobsPerCompany | 0 | Newest jobs first. 0 means no limit. The input form is prefilled with 20. |
includeCompanySummary | false | Add one row per company with job counts by department. |
monitorName | default | Separate watch lists for monitor mode. |
includeAllOnFirstRun | false | Monitor mode: return all jobs on the first run instead of only saving the baseline. |
scanCareersPage | false | Look for the board link on the company's careers page, after checking its robots.txt. |
pushSummaryToDataset | false | Append the run summary to the dataset. |
Example, sales and marketing roles in the US at four companies:
{"companies": ["stripe.com", "airbnb.com", "lever:palantir", "greenhouse:figma"],"departments": ["sales", "marketing"],"locations": ["united states", "new york", "san francisco", "remote"],"includeCompanySummary": true}
Output
One row per job. The values in this example are fictitious:
{"company": "example.com","companyInput": "example.com","ats": "lever","boardSlug": "example","jobId": "00000000-0000-0000-0000-000000000000","title": "Account Executive","department": null,"team": "Sales","location": "Austin, TX","locations": ["Austin, TX"],"remote": false,"workplaceType": "hybrid","employmentType": "Full-time","salaryMin": 80000,"salaryMax": 110000,"salaryCurrency": "USD","salaryInterval": "year","salarySource": "description","postedAt": "2026-10-01T09:00:00.000Z","updatedAt": null,"url": "https://jobs.lever.co/example/00000000-0000-0000-0000-000000000000","isNew": null,"firstSeenAt": null,"fetchedAt": "2026-10-21T12:00:00.000Z"}
Notes on the fields:
remoteis true when the board marks the job as remote or one of its locations says remote. Hybrid jobs with only office locations are false.salarySourceisstructuredwhen the board has a pay field, anddescriptionwhen the range was read from the job text. Ranges are only taken from the text when they are clearly a salary, so a missing salary does not mean the company does not publish one.postedAtis the first publish date on Greenhouse and the creation date on Lever.updatedAtis only available on Greenhouse.employmentTypeis normalized to Full-time, Part-time, Contract, Internship or Temporary when the board provides it.isNewandfirstSeenAtcome from monitor mode. They are null until a monitor run has saved a baseline for the company.
The output never contains the job description text, and never contains names or e-mail addresses of recruiters, hiring managers or applicants. The description is read only to find a salary range and is dropped right after.
With includeCompanySummary on, each company also gets a row with type: "company-summary": total open jobs, matching jobs, new jobs, remote jobs, jobs with a salary, counts by department, the top locations and the board URL. The dataset has two table views, Jobs and Company summaries.
Monitor mode
Monitor mode keeps a list of the job IDs it has seen per company and monitor name, in a named key-value store in your account. The first run for a company saves that list and returns no jobs, unless includeAllOnFirstRun is on. Later runs return only jobs that were not seen before. Schedule the Actor daily or weekly to get a feed of new openings.
A job that disappears and comes back with the same ID within 30 days is not reported again. An empty or failed fetch never clears the list. Jobs that matched but were not delivered because of the charge limit or maxJobsPerCompany stay new and are returned on the next run. A run in the normal mode only reads this list, so it does not affect your monitor.
Tracking company job openings over time
Most people run this as a saved task with a schedule. Put your companies in companies, set mode to monitor and give the watch list its own monitorName:
{"companies": ["stripe.com", "greenhouse:vercel", "lever:spotify"],"mode": "monitor","monitorName": "saas-sales","departments": ["sales"]}
The first run saves the jobs that are open that day and returns nothing. Every run after that returns only jobs posted since the previous run, so a daily schedule gives you new job alerts for the whole list. A run where nothing new was posted delivers no job row and still costs the $0.03 run start. To get the new rows somewhere else, add a webhook or one of the Apify integrations to the task.
If you know where a company posts its jobs, use the board name instead of the domain. On a Lever job board the name is the last part of the URL, so https://jobs.lever.co/spotify becomes lever:spotify. Greenhouse works the same way with greenhouse:.
For scale: on 22 October 2026 the boards for stripe.com, greenhouse:vercel and lever:spotify had 728, 94 and 80 company job openings, 902 in total, fetched in under 4 seconds. The input form is prefilled with maxJobsPerCompany set to 20, the newest 20 jobs per company, so that run returns 60 rows and costs $0.14. Set it to 0 to get every open job: for these three companies that is 902 rows and $1.65.
Run summary
Each run saves a SUMMARY record in the default key-value store. It lists:
- the board found for each company and how (prefix, board URL, careers page or name match);
- other boards with jobs under the same name;
- companies without open jobs, excluded companies, unresolved companies with the reason, and companies skipped because the maximum charge was reached (
skippedForBudget); - hosts that were skipped after refusing access or rate limiting;
- job counts, charged events and the run time.
If the input has nothing the Actor can use (no valid companies, or a maximum charge per run too low for one job, which is $0.0318), the run ends as succeeded with an empty dataset, nothing is charged, and the status message says what was wrong and how to fix it; the summary status is then invalid_input. A board that fails to load is not counted as invalid input. A run that fetches boards and finds no jobs still pays the run start.
Opting out
Employers and job board providers can ask for their company to be left out by opening an issue on the Issues tab of this Actor's page. I add the company to the Actor's internal exclusion list within 48 hours. From then on it is skipped for every user, before any request is made.
Pricing
Pay per event:
- $0.0018 per job row ($1.80 per 1,000 jobs).
- $0.01 per company summary row, only when
includeCompanySummaryis on and at least one job of that company is delivered in the run. - $0.03 once per run, charged when the run starts fetching job boards, including a monitor run that finds no new jobs. Invalid input is not charged. The smallest maximum charge per run that can deliver one job is $0.0318 (the run start plus one job). A maximum below that is refused before any fetch and pays $0.
These are the prices on the Apify free plan. On paid plans the job row and the company summary cost less, down to $0.00108 per job and $0.007 per company summary on Gold and higher. The run start costs the same on every plan.
Unresolved and excluded companies and jobs removed by your filters are not charged. A monitor run that fetches and finds no new jobs pays the $0.03 run start and no job rows. Companies skipped because the maximum charge was reached are not unresolved, and they are not charged. A long monitor stops and saves its place before compute at 256 MB can cost more than the run has earned, including a run that finds no new jobs. The run finishes succeeded and the status message says progress was saved.
Examples:
- All open jobs at 20 companies with about 200 jobs each: 4,000 rows, $7.20 plus $0.03, $7.23 in total.
- The same 20 companies in monitor mode, 50 new jobs a week, with company summaries: $0.09 plus $0.20 plus $0.03, $0.32 per run.
If you set a maximum charge per run, the Actor stops delivering exactly at that limit, and the jobs it could not deliver stay new for the next monitor run.
Limits
- Only companies that use Greenhouse or Lever are covered. Companies on other systems or their own job site are reported as not found.
- Detection by name can pick a board with the same name that belongs to another company. The summary shows how each board was found; use a prefix for exact control.
- Some companies show salary ranges only on their own site and not on the job board. Those jobs have no salary.
- Greenhouse boards rarely provide a team, workplace type or employment type, so these fields are often empty for Greenhouse jobs.
- Requests to each host are at least one second apart, so a run takes about one second per board lookup. Prefixed names need one lookup per company; a domain or bare name can need up to nine.
Disclaimer
This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Greenhouse, Lever (Employ, Inc.), or any of the employers whose job postings it lists. All company names and trademarks belong to their respective owners and are used only to identify the source of publicly posted jobs. The Actor reads only job postings that employers have published on their public job boards; it does not log in, bypass access controls, or collect applicant data. Job descriptions and personal data are not included in the output. You are responsible for using the results in compliance with applicable laws (including GDPR and CCPA/CPRA) and with the terms of the job board providers.