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.

Difficulty: Beginner
Time: 10 minutes
Cost: $0.004 per job with your own AI key, $0.012 per job without; $0.01 per company
Tools: Apify, NanoScrape Website Job Extractor
Open the Website Job Extractor on Apify See the example

In this tutorial

  1. What you get
  2. Step 1: List the careers pages
  3. Step 2: Configure and run
  4. Step 3: Count roles by team, location and remote
  5. Step 4: Repeat on a schedule
  6. Example: seven database companies
  7. Connect to AI agents via MCP
  8. What it costs
  9. Key output fields
  10. FAQ

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.

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.

STEP 1

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.

STEP 2

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
}

Click Start. When the run shows SUCCEEDED, open the Dataset tab and export JSON or CSV.

STEP 3

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:

STEP 4

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:

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.

About the AI model. For these seven boards no AI model reads the job lists: the rows come from the Greenhouse job list. Our test run was started on a local machine with a local model configured only because the actor requires some provider setting. The hosted actor uses its managed OpenRouter model (deepseek/deepseek-chat-v3-0324) when you give no key, or your own Gemini, Groq or OpenRouter key.

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-extractor

The 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:

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

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

Open the Website Job Extractor on Apify Browse all actors