Company Hiring Signals: Careers Pages & ATS Jobs
Pricing
from $2.00 / 1,000 company checkeds
Company Hiring Signals: Careers Pages & ATS Jobs
Check which companies are hiring right now. For each company website: careers page, job board (Greenhouse, Lever, Ashby, Workable, Personio, Recruitee …), open jobs with function and seniority, and sales-ready hiring signals with a 0–100 score.
Pricing
from $2.00 / 1,000 company checkeds
Rating
0.0
(0)
Developer
Benjamin Zsigri
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Find out which companies are hiring right now, and for what. Give it a list of company websites; for every company you get one row with:
- Is it hiring?
true,false(the careers page says there are no openings, or the job board is empty) ornullwhen it could not be told - Careers page and job board (Greenhouse, Lever, Ashby, Workable, Personio, Recruitee, Breezy HR, BambooHR read in full; Workday, SmartRecruiters, Teamtailor, iCIMS, SuccessFactors and others recognised)
- Open jobs: title, department, location, country, remote, employment type, posted date and link, each with a job function (sales, engineering, marketing, finance …) and a seniority level (executive, VP, director, manager, senior, junior, intern …)
- Hiring signals ready for sales and recruiting:
hiring_sales,hiring_engineering,hiring_leadership,high_volume_hiring,recent_postings,remote_roles,multi_country_hiring, your own keywords, and a hiring score from 0 to 100
It reads company websites in any language (English, German, French, Dutch, Spanish, Italian, Portuguese, Polish, Nordic and Hungarian careers pages are understood) and takes the output of Google Maps Scraper, Website Contacts Scraper or any dataset with a website column.
Who it is for
- B2B sales teams: a company that is hiring has budget and new problems. A company hiring five salespeople needs a CRM, sales tools and training; a company hiring engineers needs dev tools and cloud; one hiring its first HR manager needs payroll and HR software. Sort your account list by who is hiring for the role your product serves.
- Recruitment agencies: find the companies that are hiring for the roles you place, with the job links, before your competitors call them.
- Investors and market research: which companies in a sector are growing, and in which functions and countries.
- Agencies and freelancers: a company hiring a marketing manager or a developer is a company that needs that work done now.
How it works
- Each company website is opened at its homepage. The crawler looks for the careers page first (Careers, Jobs, Karriere, Emplois, Vacatures, Werken bij …), and opens nothing else unless it has page budget left.
- If the careers page lives on another domain (e.g.
acme-careers.com), that link is followed. If the site links no careers page at all, the two conventional paths/careersand/jobsare tried. - Every page is checked for a link to a job board (applicant tracking system). When the provider publishes an open job-board feed (the same data its own careers page shows to every visitor), all jobs are read from it.
- Without a readable job board, the jobs come from the careers page itself: schema.org JobPosting data (what Google for Jobs reads), then links that look like individual job ads. A careers page that says "no open positions" makes the row
is_hiring: false. - Every job gets a function and a seniority level, and the row gets its counts, signals and score.
You can also paste a job board URL directly (https://jobs.lever.co/acme, https://boards.greenhouse.io/acme): it is read without crawling a website.
What the Actor does NOT do
- It does not log in anywhere and it does not solve or bypass CAPTCHAs.
- It respects robots.txt, on the company website and on the job board provider's API. A website that disallows crawling is reported as
robots_blockedand is not charged; a job board whose API disallows crawlers (SmartRecruiters, for example) is reported with its URL but not read. - It does not use LinkedIn, Indeed or other job portals. Only the company's own website and its own job board are read.
- It does not guess. A careers page that shows its jobs only after JavaScript runs (Workday and some custom sites) gives
hiring_status: "unknown"with the board's URL, never an invented number.
Input
The simplest input is a list of websites:
{"websites": ["https://www.figma.com", "monzo.com", "https://jobs.lever.co/acme"],"jobTitleKeywords": ["sales", "salesforce"]}
Or point the Actor at a dataset, for example the output of a Google Maps Scraper run:
{"datasetId": "YOUR_DATASET_ID","includeJobs": false}
The website field is detected automatically (website, url, domain, companyWebsite, …) or you can name it in Website field in the dataset. A Google Maps listing link is never taken for the website; items without a website are skipped. Fields such as title, placeId, address, city and countryCode are copied into source_item, so you can join the results back to your list.
| Field | What it does |
|---|---|
websites | Company websites or job board URLs, one per line |
datasetId, datasetUrlField | Import websites from a dataset |
jobTitleKeywords | Words counted in job titles and departments (keyword_matches, keyword_match signal) |
includeJobs | Return the job list (on by default); off gives a compact row with counts and signals only |
maxJobsPerCompany | Caps the job list in a row (default 100); counts and signals always cover all jobs |
maxPagesPerWebsite | Pages read on the company website to find the careers page (default 4) |
maxConcurrency | Companies checked in parallel (default 20) |
proxyConfiguration | Optional proxy for the company websites |
Output
One row per company. Example (shortened):
{"input_url": "https://www.acme-software.co.uk/","domain": "acme-software.co.uk","status": "ok","company_name": "Acme Software","is_hiring": true,"hiring_status": "hiring","careers_url": "https://www.acme-software.co.uk/careers","ats_provider": "Greenhouse","ats_board_url": "https://job-boards.greenhouse.io/acmesoftware","jobs_source": "ats_api","open_jobs_count": 3,"jobs_posted_last_30_days": 2,"newest_job_posted_at": "2026-09-25T10:00:00.000Z","job_functions": { "sales": 2, "engineering": 1 },"seniority_levels": { "director": 1, "mid": 1, "senior": 1 },"leadership_roles_open": 1,"remote_jobs": 1,"hiring_countries": [],"top_locations": [{ "location": "London", "jobs": 1 }],"keyword_matches": { "sales": 2 },"signals": ["hiring", "hiring_sales", "hiring_engineering", "hiring_leadership", "remote_roles", "keyword_match"],"hiring_score": 62,"jobs": [{"title": "Head of Sales, EMEA","department": "Sales","location": "London","remote": null,"posted_at": "2026-09-25T10:00:00.000Z","url": "https://job-boards.greenhouse.io/acmesoftware/jobs/1","function": "sales","seniority": "director"}],"source_item": null,"scraped_at": "2026-10-01T00:00:00.000Z"}
Hiring status
hiring_status | is_hiring | Meaning |
|---|---|---|
hiring | true | At least one open job was found |
not_hiring | false | The job board was read and is empty, or the careers page says there are no openings |
unknown | null | A careers page or job board exists, but its jobs could not be read (JavaScript-only board, or a provider without an open feed) |
no_careers_page_found | null | The website links no careers page and has none at /careers or /jobs |
jobs_source tells you where the jobs came from: ats_api (the job board's feed, complete), structured_data (schema.org on the careers page) or careers_page (job ad links on the careers page).
Signals and score
| Signal | When |
|---|---|
hiring | at least one open job |
hiring_<function> | a job in that function: sales, marketing, engineering, data, customer_success, finance, hr, operations, it, product, design, legal |
hiring_leadership | a director, VP or C-level role is open |
high_volume_hiring | 10 or more open jobs |
recent_postings | 3 or more jobs posted in the last 30 days |
remote_roles | at least one remote job |
multi_country_hiring | jobs in two or more countries |
keyword_match | one of your keywords appears in a job title or department |
hiring_score (0–100) is the sum of four parts, all computed from the jobs in the same row so you can check it:
- volume: 15 × log2(1 + open jobs), at most 45 (1 job = 15, 7 jobs = 45)
- freshness: 6 per job posted in the last 30 days, at most 30
- leadership: 15 if a director, VP or C-level role is open
- breadth: 2.5 per distinct job function, at most 10
Status values
status | Meaning | Charged |
|---|---|---|
ok | The website (or job board) was read | yes |
robots_blocked | The site's robots.txt disallows crawling | no |
blocked | The site refuses automated requests (HTTP 401/403/429) | no |
not_a_company_website | A social profile, directory or marketplace page, not the company's own site | no |
unreachable / http_error / not_html / invalid_url / error | The website could not be read | no |
Pricing
This Actor uses pay per event pricing: you pay for results, not for compute time.
- Company checked: charged once per company whose website or job board answered (
status: ok), whatever the result. - Hiring company found: charged once per company that is hiring (
is_hiring: true), whatever the number of jobs.
Websites that could not be read are listed with the reason, free of charge. The job list never changes the price. The current prices are on the Pricing tab.
The Actor respects your maximum cost per run: when the limit is reached it stops before starting another company, and it never returns hiring details it could not charge for.
Use it with other Actors
- Google Maps Scraper → Company Hiring Signals: find the businesses in a niche and area, then see which of them are hiring. Start this Actor with the Maps run's
datasetId. - Website Contacts Scraper + Company Hiring Signals: run both on the same dataset and join on
input_urlorsource_item.placeId: the hiring companies, with their phone numbers, emails and decision makers.
You can chain the runs automatically with an Apify integration (start this Actor when the previous run succeeds).
Where your list can come from
- Google Maps Scraper: set
datasetIdto its run's dataset. This Actor never searches Google Maps itself; it works on the dataset you bring. - A CSV file or spreadsheet: paste the website column into
websites, one per line. - Your CRM: export the accounts and paste the website column, or push the rows into an Apify dataset with the API and set
datasetIdto it.datasetUrlFieldnames the column when it is not one of the usual names. - Make, n8n, Zapier or Clay: start the Actor through the Apify API (Apify also offers ready-made modules for some of these tools), pass
websitesin the input and read the run's dataset as the output.
Tips
- Large lists: 1,000 companies take a few minutes. Turn off
includeJobsif you only need the signals; the rows get much smaller. - Repeat runs (weekly, monthly) on the same list show who started hiring: compare
open_jobs_countandnewest_job_posted_atbetween runs, or schedule the Actor and send the rows withrecent_postingsto your CRM. - Blocked websites: if many of your websites end as
blocked, try a proxy in the input. Job board feeds never need one. - Resuming: if a run is migrated by the platform, it continues where it stopped without checking or charging the finished companies again.
Is it legal?
The Actor reads only pages and job board feeds that companies publish openly for job seekers, respects robots.txt and does not bypass any login or CAPTCHA. Job postings are company information, not personal data. You are responsible for how you use the results, including the terms of the websites you process and the rules for B2B outreach in your country.
Limitations
- Careers pages and job boards that render their jobs only with JavaScript (Workday, some custom careers sites) give
unknownwith the board's URL. - Job function and seniority are assigned from the job title (and department) with multilingual keyword rules. Unusual titles fall into
other/mid. - The job list on a careers page without a job board feed or structured data is recognised from link text and may miss jobs listed in an unusual layout.
Feedback
Found a company where the result is wrong or incomplete? Open an issue on the Issues tab with the URL. Real examples are the fastest way to improve detection.
Need it done for you?
Want this connected to your CRM or workflow, or adapted to your market? Tribloc, the team behind this Actor, builds these setups. Get in touch at tribloc.co.uk.