How to Monitor Competitor Careers Pages for Hiring Signals
What a competitor hires for shows where it is investing: engineers for a new product, account executives for a new region, a finance team before a funding round. The NanoScrape Website Job Extractor on Apify reads a list of careers pages into one table, so you can count roles by company, team and location, and run it again every week to see what is new.
In this tutorial
What you get
The Website Job Extractor takes a careers page (or a company homepage) and returns one dataset row per open role. When the page runs on a supported applicant tracking system such as Greenhouse, Workday, Lever or Personio, it reads the system's own job list, so the rows are complete and consistent. Other careers pages are read with an AI model.
- One row per role:
title,location,job_url,posted_at,ats_system, and, where the page gives them,department,employment_type, salary and a description. - A summary row per company (
_type: job_extraction_done) with how many jobs the site reports and how many were pushed, so you can check that nothing was cut off. - Filters for
keywords,locationandpostedWithinDays, applied before you are charged.
Careers pages are public job ads, so this is company data, not personal data. Keep it that way: do not collect the names or contact details of recruiters or hiring managers unless you have a legal basis under GDPR/DSGVO (in Switzerland: nDSG), and check the careers page's terms of use.
List the careers pages
Open each competitor's careers page in your browser and copy the address of the page that lists the jobs. If it is hosted on an applicant tracking system (for example job-boards.greenhouse.io/company or company.wd1.myworkdayjobs.com), use that address. Pass it as career_urls. If you only know the homepage, pass it as website_url and the actor looks for the careers page itself, but a direct address is faster and more reliable.
Configure and run
Create a free Apify account, open the actor and fill in the Input tab, or paste JSON like this (a shortened version of the example below):
{
"companies": [
{
"company_id": "fivetran",
"company_name": "Fivetran",
"career_urls": [
"https://job-boards.greenhouse.io/fivetran"
]
}
],
"maxResultsPerCompany": 0,
"includeJobDetails": false
}maxResultsPerCompany: 0means all open jobs (the default is 200 per company).includeJobDetails: falseskips the per-job detail pages. That is faster and enough for counting roles; leave it out if you need full descriptions.- No AI key is needed for supported systems. For other careers pages add your own Gemini, Groq or OpenRouter key, or leave the key fields empty to use the managed model at the higher job price.
Click Start. When the run shows SUCCEEDED, open the Dataset tab and export JSON or CSV.
Count roles by team, location and remote
Group the rows with a spreadsheet pivot, a short script or Claude (prompt below). Three groupings answer most questions:
- Roles per company: who is growing fastest. Use the
jobs_total_reported_by_sitevalue on the summary row as a cross-check. - Roles per team: use
departmentwhen the page provides it. When it is empty, group by keywords intitle(engineer, account executive, marketing, accountant). - Roles per location and remote share: from
locationandworkplace_type. A new office city in the list is often the first public sign of a new market.
Repeat on a schedule
In Apify Console open Schedules, create a weekly schedule and attach the saved input. Every run creates a new dataset. To find the new openings, compare the job_url values of the latest dataset with the previous one: URLs only in the new run are new roles, URLs only in the old run were filled or withdrawn. Use job_url rather than job_id: on some boards the id field holds a requisition code that is not unique per posting. This prompt does the comparison for you:
Use the Apify MCP server. Look at the two most recent runs of santamaria-automations/website-job-extractor on my account. Compare the job_url values: list the roles that are in the newer run but not in the older one, grouped by company and team, and list how many roles disappeared per company.Example: what seven database companies are hiring for
Situation: you sell to data teams and want to know where seven database and data-integration vendors are putting their headcount: engineering, sales, or support, and in which regions.
We ran the actor on the Greenhouse careers pages of Fivetran, Neo4j, SingleStore, Starburst, Cockroach Labs, Yugabyte and PlanetScale, with all jobs per company and no detail pages. The run returned 351 job rows and 7 summary rows. Every company's pushed count matched the number its board reports. We dropped 5 rows that are not real openings (3 "talent community" entries and 2 "general application" entries), which leaves 346 open roles. These are the findings:
- Size: Fivetran 175 roles, Neo4j 60, SingleStore 41, Starburst 31, Cockroach Labs 14, Yugabyte 14, PlanetScale 11. There are 251 distinct company and title pairs: the same title posted in several cities counts once per city.
- Teams (grouped by keywords in the job title): Engineering 142 (41%), Sales 84 (24%), finance, people, legal and IT 43, solutions engineering and support 30, product and design 22, marketing 16, other 9. Neo4j is the most engineering-heavy with 36 of its 60 roles. Fivetran has 36 finance, people and legal roles, 21% of its list, the largest back-office share.
- Regions (from the location text): US 198 (57%), Europe and Middle East 81, India and Asia-Pacific 55, Canada 7, 5 unclear. Neo4j is the European outlier: 41 of its 60 roles are in Europe, mostly London and Malmö.
- Remote: 60 of 346 roles (17%) name Remote in the location: Fivetran 31, Neo4j 20, PlanetScale 5, Cockroach Labs 2, Yugabyte 2, SingleStore and Starburst none. PlanetScale has the highest share, 5 of 11.
- Freshness (
posted_atis the board's first-published date): 50 roles were first published in the 14 days before the run and 113 in the last 30 days. Fivetran accounts for 57 of those 113. The median role is 52 days old; Yugabyte's median is 101 days, so its list is mostly long-open roles.
How the numbers were made: the department field was empty on all seven boards, so the team labels come from our own keyword rules on the job title and will misplace some roles. Regions come from the location text. The counts were computed from the dataset with a script, not by hand. Data collected on 2026-10-21.
Cost for this run: 351 job rows and 7 companies. With your own AI key that is 351 × $0.004 + 7 × $0.01 + the actor start fee of $0.00005 = about $1.47. With no key (managed model) the job price is $0.012, so 351 × $0.012 + 7 × $0.01 = about $4.28. Prices are the current Apify Store prices, checked on 2026-10-21.
Input used (one company object per careers page):
{
"companies": [
{
"company_id": "fivetran",
"company_name": "Fivetran",
"career_urls": [
"https://job-boards.greenhouse.io/fivetran"
]
},
{
"company_id": "neo4j",
"company_name": "Neo4j",
"career_urls": [
"https://job-boards.greenhouse.io/neo4j"
]
},
{
"company_id": "singlestore",
"company_name": "SingleStore",
"career_urls": [
"https://job-boards.greenhouse.io/singlestore"
]
},
{
"company_id": "starburst",
"company_name": "Starburst",
"career_urls": [
"https://job-boards.greenhouse.io/starburst"
]
},
{
"company_id": "cockroach-labs",
"company_name": "Cockroach Labs",
"career_urls": [
"https://job-boards.greenhouse.io/cockroachlabs"
]
},
{
"company_id": "yugabyte",
"company_name": "Yugabyte",
"career_urls": [
"https://job-boards.greenhouse.io/yugabyte"
]
},
{
"company_id": "planetscale",
"company_name": "PlanetScale",
"career_urls": [
"https://job-boards.greenhouse.io/planetscale"
]
}
],
"maxResultsPerCompany": 0,
"includeJobDetails": false
}Claude prompt (set up the MCP server as in Connect to AI agents via MCP):
Use the Apify MCP server. Run the actor santamaria-automations/website-job-extractor with these seven careers pages (company_id, name, URL): fivetran https://job-boards.greenhouse.io/fivetran, neo4j https://job-boards.greenhouse.io/neo4j, singlestore https://job-boards.greenhouse.io/singlestore, starburst https://job-boards.greenhouse.io/starburst, cockroach-labs https://job-boards.greenhouse.io/cockroachlabs, yugabyte https://job-boards.greenhouse.io/yugabyte, planetscale https://job-boards.greenhouse.io/planetscale. Pass each URL as career_urls of its company, set maxResultsPerCompany to 0 and includeJobDetails to false.
Before you start the run, tell me what it will cost and wait for my OK.
When it's done, ignore the rows with a _type field and the talent community or general application rows. Then give me: (1) open roles per company; (2) roles per team, grouping by keywords in the job title (Engineering, Sales, Solutions and support, Product and design, Marketing, Finance/People/Legal/IT, Other), in total and per company; (3) roles per region (US, Europe, India/APAC, Canada) from the location text; (4) how many locations say Remote; (5) how many roles were first posted in the last 14 and 30 days (posted_at). Finish with three sentences on where each company is investing.For your own market, replace the seven companies with 5 to 10 competitors, keep maxResultsPerCompany at 0 and read the jobs_total_reported_by_site value on each summary row to check that the full list came back. Companies that run on Workday or another large system can have thousands of roles: add keywords or location there.
Connect to AI agents via MCP
The actor is available as an MCP (Model Context Protocol) tool. Paste this server URL into any MCP-compatible client (Claude Desktop, Claude.ai, Cursor, VS Code):
https://mcp.apify.com?tools=santamaria-automations/website-job-extractorThe client then fills in the input from plain English. The prompt in the example asks Claude to tell you the cost first and wait for your OK before it starts a run.
What it costs
The actor uses pay-per-event billing on Apify. These are the current Store prices:
- Job extracted (
job-result): $0.004 per job when you bring your own AI key. - Job extracted, managed model (
job-result-managed): $0.012 per job when you give no key. - Company processed (
company-enriched): $0.01 per company, charged once per company. - Actor start: $0.00005 per run.
- With
includeJobDetails: true, jobs read from an employer's own site add a detail event on top; jobs from supported systems do not.
A weekly watch on 7 companies like the example costs about $1.47 per run with your own key. The Apify free plan includes monthly credit that covers several such runs.
Key output fields
company_id/company_name: the values from your input.title,location,workplace_type: the role, where it is, and remote when the location says so.posted_at: first-published date where the system gives one.job_url/application_url: the posting and the apply link.department,employment_type,salary_range: filled when the page provides them, otherwise null.ats_system/ats_url: which job system the rows were read from._type: job_extraction_done: the per-company summary row; skip it when you count roles.
FAQ
Which careers pages does it work on?
Pages that sit on a supported applicant tracking system (the README lists 19, among them Greenhouse, Workday, Lever, Personio and SmartRecruiters) are read through the system's own job list. Other company career pages are read with an AI model. Pages that only show jobs after JavaScript runs need the optional browser fallback.
Do I need an AI key for this?
Not for the Greenhouse boards in the example: their rows come straight from the job list. Career pages that are not on a supported system use an AI model. Without your own Gemini, Groq or OpenRouter key the actor uses its managed model, which has its own, higher job price.
How do I see only the new openings after a re-run?
Run the actor on an Apify schedule and compare the job_url values of the new dataset with the previous one. Jobs that are in the new run but not in the old one are new, jobs that are gone were filled or withdrawn. You can also set postedWithinDays to keep only recent postings.
Why is the department column empty in the example?
For these seven Greenhouse boards the job list did not return a department, so the example groups roles by keywords in the job title instead. The team labels are our own rules, not the company's. Check the department field on your own targets first.
Can I limit the run to certain roles or locations?
Yes. keywords keeps jobs whose title contains one of your words, location keeps a city, region or country, and maxResultsPerCompany caps the jobs per company. These filters run before charging, so jobs that do not match are not billed.
What does it cost to watch a competitor list?
One charge per job row and one per company. The example run with 351 jobs from 7 companies costs about $1.47 with your own AI key and about $4.28 without one. See the cost section for the math.
Related resources
- Website Job Extractor actor page: specs, supported job systems and pricing.
- Scrape Fortune 500 company jobs: the same actor on large Workday, Oracle and iCIMS career sites.
- How to scrape Workday jobs: when a competitor's careers page is a Workday site.
- How to scrape every job online: job boards and careers pages compared.
- Website Job Extractor on Apify: full documentation and all input parameters.
- All NanoScrape tutorials