# Career Page Scraper & ATS Jobs API — 17 ATS Platforms, No Proxy (`spool/career-page-jobs-api`) Actor

Every open role from employers' own job boards on 17 ATS platforms: Greenhouse, Ashby, Lever, Workday, Oracle, SuccessFactors, Phenom, Eightfold and more. Whole boards with descriptions, salaries in USD, 190 technologies and hiring profiles. 1,129 verified employers. No proxy, no login.

- **URL**: https://apify.com/spool/career-page-jobs-api.md
- **Developed by:** [Spool](https://apify.com/spool) (community)
- **Stats:** 2 total users, 2 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 job postings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

**Every open role, straight from the employer's own job board.** Name a company, paste a domain or a careers URL, and this Actor finds its public board on one of **17 ATS platforms** (Greenhouse, Ashby, Lever, Workday, Oracle Cloud HCM, SAP SuccessFactors, Phenom, Eightfold, SmartRecruiters and more), reads the board whole and returns every role exactly as the employer published it: full description, department, posting date, direct apply link. **No aggregator in the way, no proxy, no login**, and the rows start arriving in seconds.

```
Staff Machine Learning Engineer        Databricks   $190,000–$285,000   Engineering · lead    greenhouse   San Francisco
Security Engineer, Cloud               Ramp         $175,000–$220,000   Security · mid        ashby        New York
Senior Software Engineer, GPU Systems  Nvidia       $184,000–$287,500   Engineering · senior  workday      Santa Clara
Lead, Systems Engineering              L3Harris     $126,500–$176,500   Engineering · lead    successfactors  Ottawa
```

- **Whole boards, not search snippets** — Stripe's 716 roles, JPMorgan Chase's 7,353, Nvidia's 1,700+, each with the employer's own text.
- **Enriched on the way** — salaries annualised in USD, 190 technologies read from the text, city, region, country and remote/hybrid/onsite, duplicates removed, one hiring profile per company.
- **1,129 verified employers** on tap — ask the largest boards for your keywords without naming anyone.
- **Only what is new** — monitor mode remembers what it delivered and returns just the new openings, run after run.
- **$3.50 per 1,000 roles**, nothing for companies it cannot find.

***

### ⚡ Try it in one minute

1. Press **Try for free** and keep the prefilled input, or paste this:
   ```json
   { "companies": ["stripe.com", "https://jobs.ashbyhq.com/ramp", "Datadog"] }
   ```
2. Press **Start**. Each company is resolved to its board, the board is read in full, and its roles go out the moment that company answers.
3. Open the **Output** tab. The *Jobs*, *Companies* and *Salaries* views show their own columns. Export JSON, CSV or Excel, or read the dataset from the API.

**Measured on the platform, 10 October 2026:** 1,027 roles from Stripe, Ramp and Datadog, every one with a description, 364 with a salary, 3 hiring profiles. First rows at 5 seconds, done at 7, **$3.61**.

***

### 🎯 Who it is for

| You are | Give it | You get |
|---|---|---|
| A recruiter or sourcer | your target companies | every open role with the real posting date, so you see who is hiring for what, today |
| A job board or newsletter | a watch-list and `onlyNew` on a daily schedule | a clean feed of new openings, no duplicates, straight to Sheets, Slack or a webhook |
| Sales or investors reading hiring signals | 50 accounts | a hiring profile per company: open roles, departments, seniority mix, top technologies, salary band |
| An analyst or researcher | keywords and `searchEmployerBoards: 800` | who is hiring *machine learning engineers* across 1,129 verified employers, with salaries |
| An AI agent | the MCP endpoint below | a tool that answers "list every engineering role at Ramp paying over $200k" |

***

### 📦 What you get

Every job row carries the posting as the employer published it, plus what the Actor adds:

- **The posting** — title, company, location, the employer's own description (`descriptionSource: ats`), the department as the employer labels it, posting date and `postedDaysAgo`, the direct apply URL on the employer's site, `atsProvider` and `atsBoardUrl`.
- **Salary, three ways** — as stated, annualised in its currency, annualised in USD. Structured pay fields and pay ranges written in the text are both read (`salarySource: ats` or `description`).
- **Classification** — `department`, `seniority`, `tech` (190 technologies) and `techCategories`, `city`, `region`, `country` (ISO code), `locationType` (onsite, hybrid, remote).
- **Bookkeeping** — `searchTerm` that matched, `dedupeKey`, `firstSeenAt` in monitor mode.

Company rows (`recordType: company`) hold open roles found, the board's total open roles, department and seniority mix, top technologies, salary range in USD and remote share. Notice rows say in plain words why a run returned nothing. The full field list, with types, is on the Output tab.

***

### 🏢 17 platforms, found by name, by URL or through the careers page

| Platform | Found by | Descriptions | Salaries | Measured |
|---|---|---|---|---|
| Greenhouse | name, domain or board URL | in the listing, every role | pay ranges in the text | Stripe 716 roles, Datadog 444, Airbnb, Anthropic |
| Ashby | name, domain or board URL | in the listing | structured compensation | Ramp 158 roles, every one with a description |
| Lever | name or board URL | in the listing | in the text | — |
| SmartRecruiters | name or board URL | one request per role, capped | in the text | paged past 100 roles |
| Workday | careers URL or discovery | one request per role, capped | in the text | Nvidia 1,700+ roles, Capital One, Target |
| Oracle Cloud HCM | careers URL or discovery | one request per role, capped | in the text | JPMorgan Chase 7,353 roles, BNY Mellon 570 |
| SAP SuccessFactors | careers URL or discovery | one request per role, capped | in the text | L3Harris 2,305 roles, ExxonMobil, Skyworks 334, Aflac |
| Phenom career sites | careers URL or discovery | one request per role, capped | in the text | Cisco 715 roles, Snowflake 163, Lowe's |
| Eightfold career sites | careers URL or discovery | one request per role, capped | — | Qualcomm 1,831, Lockheed Martin, Autodesk 379, Kraft Heinz 797 |
| Amazon | name | in the listing | — | 2,112 hits for "software engineer" |
| Rippling, Breezy | name | titles, locations, departments only | — | Rippling 651 roles |
| Personio, Teamtailor, Pinpoint | name | in the listing | Pinpoint compensation fields | Oatly 15, Cazoo 4 |
| BambooHR, Recruitee | careers URL | — | — | reached only from a URL |

**How a company is found.** A name is turned into the slugs the platforms use (`Datadog` → `datadog`; `Welcome to the Jungle` → `welcometothejungle`, `wttj`) and tried on every platform at once. If nothing answers, the Actor does what you would: opens the company's website, follows its careers link and reads which system the careers page hands off to, from the URLs and embed scripts it carries, never from prose, within six requests and ten seconds. A careers URL you paste goes straight to that step. Companies that still cannot be found are listed in `RUN_SUMMARY.companyBoards.notFound` with a reason you can act on, and cost nothing.

**Measured on 1,000 companies** — the S\&P 500 and the 499 largest active YC companies, 9–10 October 2026:

| | Found | Of which |
|---|---|---|
| S\&P 500 | **44%** | mostly Workday, Oracle, SuccessFactors, Phenom and Eightfold, reached through the careers page |
| YC, largest 499 | **52%** | mostly Greenhouse, Ashby and Lever, reached by name |
| All 1,000 | **48%** · 34,382 open roles | 251 companies found only through their careers page; median 7.5 s per company found |

Guessing from the name alone found 27%. What is left: 443 companies whose site did not answer or showed no job board within the budget (many small YC companies have none), and 50 on systems this Actor cannot read yet (iCIMS 21, Paradox 9, Taleo 5, Avature 4, Workable 4, ADP 2, UKG 2, the login-only SuccessFactors portal 3). Those are named in `notFound`, so you know exactly which ones to paste a careers URL for.

***

### 🔎 1,129 verified employers, searchable by keyword

`searchEmployerBoards: 100` asks the hundred largest boards in a bundled, verified list of 1,129 well-known employers on 17 platforms (Lockheed Martin, Capital One, JPMorgan Chase, Nvidia, Databricks, OpenAI, Stripe, Anthropic, Datadog, Airbnb… 68,177 open roles on 9 October 2026) for your keywords, largest board first. `searchEmployerBoards: 800` covers the whole list. A role matches when the whole phrase appears in its title or every word of it does: *machine learning engineer* matches *Senior Engineer, Machine Learning* and not *Engineering Manager*.

```json
{ "searchTerms": ["machine learning engineer"], "searchEmployerBoards": 100 }
```

Measured: 100 boards asked, 100 answered, 46 had matching roles, 232 roles delivered, 228 with a description, 173 with a salary, 46 company profiles, in 33 seconds.

***

### 🚚 Rows arrive company by company

Each company's roles go out the moment its board is read. Measured with Stripe, Ramp and Datadog together: 1,027 roles, the first 161 at 5 seconds and the last at 7, every description scanned for 190 technologies and pay ranges on the way. Boards that cost one request per description (Workday, Oracle, SuccessFactors, Phenom, Eightfold) follow once their descriptions are read, eight at a time. A role that already went out is dropped if it turns up again, not charged twice; `RUN_SUMMARY.waves` lists each wave with its row count and the second it landed.

***

### 🔔 Monitor mode: only what is new since the last run

Turn on `onlyNew` and the run remembers every role it has delivered. On a schedule, each run returns only roles that were not there before: a feed of new openings at the companies you watch, nothing delivered twice, nothing charged twice.

- Memory is one record per input in a key-value store named `career-page-jobs-monitor` **in your own account**. Nothing leaves your storage.
- The record is named from the companies and keywords, so the same input always shares one memory. Set `monitorName` to share memory between inputs or to start over.
- Only rows actually delivered are remembered; roles held back by a spending limit stay new. Roles not seen for 60 days are forgotten, so a closed and reposted role shows up again.

```json
{ "companies": ["stripe.com", "ramp.com", "Datadog"], "searchTerms": ["engineer"], "onlyNew": true }
```

Measured: first run 546 roles from Datadog and Ramp remembered; the same input again minutes later, 0 new, 546 already seen, nothing charged but the Actor start.

**Watch a list of companies in three steps.** Press **Save as task**, set your companies and keywords and turn `onlyNew` on. In the task, open **Schedules** and pick *every day*. Then open **Integrations** and connect Slack, Google Sheets, Airtable or a webhook: each run delivers exactly the new roles, and a day with nothing new costs the Actor start.

***

### 🍳 Recipes

**A named company's whole board**

```json
{ "companies": ["stripe.com", "https://jobs.ashbyhq.com/ramp", "Datadog"] }
```

Measured: 3 boards, 1,325 open roles, 1,027 delivered after deduplication, every one with a description, 364 with a salary, 3 hiring profiles; Ramp's 161 roles landed at 5 seconds, Datadog's 382 at 6, Stripe's 484 at 7.

**Enterprises on Workday, Oracle, SuccessFactors and Eightfold, by name**

```json
{ "companies": ["L3Harris", "autodesk.com", "Skyworks Solutions", "paccar.com", "https://jobs.kraftheinz.com/careers"], "searchTerms": ["engineer"] }
```

Measured: 5 of 5 found through their careers pages (SuccessFactors 3, Eightfold 2), 225 engineering roles delivered, first rows at 3 seconds, done at 8.

**An enterprise on Workday, by careers URL, with more descriptions**

```json
{ "companies": ["https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"], "searchTerms": ["software engineer"], "maxDescriptionsPerBoard": 300 }
```

**Who is hiring data engineers across the employer list**

```json
{ "searchTerms": ["data engineer", "analytics engineer"], "searchEmployerBoards": 200, "requireSalary": true }
```

**Remote senior roles at a watch-list of companies, posted this month**

```json
{ "companies": ["Anthropic", "Figma", "Cloudflare", "Airbnb"], "searchTerms": ["senior"], "location": "Remote", "postedWithinDays": 30 }
```

**Kubernetes roles over $200k on the employer list**

```json
{ "searchTerms": ["engineer"], "searchEmployerBoards": 150, "requireTech": ["Kubernetes"], "minSalaryUsd": 200000 }
```

***

### ⚙️ Every option

| Option | Default | What it does |
|---|---|---|
| **`companies`** | Stripe, Ramp, Datadog | Names, domains or careers URLs, up to 200 |
| **`searchTerms`** | — | Keep only roles whose title matches (whole phrase or every word) |
| `location` | — | Keep roles whose location mentions this text |
| **`searchEmployerBoards`** | `0` | Also ask the N largest boards in the verified list for the keywords (0–800) |
| `discoverCareersPages` | `true` | Read the company's careers page when no board answers to its name |
| `maxJobsPerCompany` | `500` | Cap per company after filters, up to 5,000 |
| `maxDescriptionsPerBoard` | `100` | Descriptions fetched per Workday, Oracle, SuccessFactors, Phenom, Eightfold or SmartRecruiters board, up to 500 |
| `postedWithinDays` | — | Keep roles published or updated within N days |
| `requireSalary` | `false` | Keep only roles with a salary, structured or read from the text |
| `minSalaryUsd` | — | Annualised USD floor |
| `requireTech` | — | Keep only roles naming these technologies |
| `companyRollup` | `true` | One hiring-profile row per company |
| `onlyNew` | `false` | Monitor mode: deliver and charge only roles not delivered before |
| `monitorName` | derived | Name of the memory record; set to share or reset |

***

### 💰 How much does it cost?

Pay per event: per role delivered and, with `companyRollup` on, per company profile. Duplicates, filtered-out roles and companies without a public board cost nothing. Actor start is $0.002 per GB of memory, one event at the default.

| Plan | per role | per company profile |
|---|---|---|
| Free | $0.0035 | $0.005 |
| Bronze | $0.0035 | $0.0045 |
| Silver | $0.00325 | $0.004 |
| Gold | $0.003 | $0.0035 |

- The prefilled run, three whole boards, 1,027 roles and 3 profiles: **$3.61** (Gold: $3.09)
- Five enterprises with the keyword "engineer", 225 roles and 5 profiles: **$0.81**
- 100 employer boards for one keyword, 232 roles and 46 profiles: **$1.04**
- **1,000 roles** = **$3.50**; **10,000** = **$35**
- Monitor mode on a daily schedule: only new roles are charged; a day with nothing new costs the $0.002 start
- The free plan's $5 monthly credit covers roughly **1,400 roles**

Platform usage (compute) is billed by Apify separately and is small: the boards answer with compact JSON and no proxy is used.

***

### 🤖 Use it from an AI agent, the API or an integration

**MCP.** Add the Apify MCP server to Claude, Cursor or any MCP client and the agent can call this Actor as a tool: *"List every open engineering role at Stripe, Ramp and Datadog with a stated salary above $200k."*

```
https://mcp.apify.com/?tools=spool/career-page-jobs-api
```

**API.** `POST https://api.apify.com/v2/acts/spool~career-page-jobs-api/run-sync-get-dataset-items?token=…` with the input as JSON returns the rows in one call. An empty input runs the prefilled companies. **Python and JavaScript:** `client.actor("spool/career-page-jobs-api").call(run_input={...})` with `apify-client`. **Schedules and integrations:** run it daily with `onlyNew` and push the rows to Google Sheets, Airtable, Slack, HubSpot or a webhook from the Integrations tab; filter on `recordType` to route roles and companies separately.

***

### 🧭 Good to know

- **Boards are found by guessing well, then by looking.** A name is tried as the slugs the platforms use, then the company's careers page is read for the system behind it. A company on a system not listed above is reported as not found, with the system named. Give the domain or the careers URL and it is exact.
- **Workday, Oracle, SuccessFactors, Phenom, Eightfold and SmartRecruiters descriptions cost one request each**, so they are capped by `maxDescriptionsPerBoard`; roles past the cap come with title, location, department and apply URL but no text. Greenhouse, Ashby, Lever, Teamtailor and Pinpoint send every description in the listing.
- **Rippling and Breezy list APIs carry no text**: title, location and department only.
- **Workday, Oracle, SuccessFactors, Phenom, Eightfold and Amazon are searched, not listed.** They are asked for your first keyword; without keywords they return their first pages.
- **Keyword matching is by title.** A role whose title does not contain the phrase, or every word of it, is left out rather than guessed; search the board without keywords to see everything.
- **Not read:** Workable (returns nothing to unauthenticated requests), iCIMS, Paradox, Taleo, Avature, ADP and UKG tenants, Jobvite, The Muse. They are recognised and named in `notFound`.
- **This Actor does not read LinkedIn, Indeed or Glassdoor.** For aggregator boards with the employer's posting attached, use [Job Board API](https://apify.com/spool/job-board-api), which shares this engine.
- **If your spending limit cuts a run short**, roles beyond it are not delivered and not charged, a notice row says how many were held back, and in monitor mode they stay new for the next run.
- **Tested.** Offline tests cover row typing against the dataset schema, keyword matching, date and salary filters, the readers' parsers and the engine copy; Apify runs the prefilled input daily.

***

### ⚖️ Is this legal?

Greenhouse, Ashby, Lever, Workday, SmartRecruiters and the other platforms publish these boards through public endpoints intended for exactly this use: the same data the company's careers page renders for any visitor. No login, no candidate or recruiter data, no paywall bypass. Job listings are business information published to be found; handle any personal data a description happens to contain according to the law that applies to you.

***

### ❓ FAQ

**Is this a Greenhouse jobs API, a Lever API or a Workday jobs API?** It is all of them behind one input: give a company and the Actor works out which platform hosts its board and reads it through that platform's public endpoint.

**How is this different from Job Board API?** Job Board API searches LinkedIn, Indeed, Glassdoor and 30 more sources by keyword and attaches the employer's posting where it can. This Actor starts from the employer: you name the companies, it reads their boards whole, with no aggregator in between and no proxy.

**How many companies can one run take?** Up to 200 names, domains or URLs, plus up to 800 boards from the verified list. Boards answer in one or two requests each; a run of 50 companies typically finishes in under a minute.

**Can I get only new openings?** Yes: `onlyNew` remembers what was delivered and returns only new roles on the next run. Put it on a schedule and connect an integration.

**Why was a company not found?** `RUN_SUMMARY.companyBoards.notFound` says so for each one: the careers page uses a system the Actor cannot read yet (iCIMS, Paradox, Taleo, Avature, ADP, UKG and the login-only SuccessFactors portal are recognised and named), the website did not answer, or no careers page was found. Paste the careers URL and the Actor reads what is behind it.

**Do you return salaries?** Where the employer states them: Ashby and Pinpoint as structured fields, the others usually as a pay range in the description, which the Actor reads conservatively into `salaryMin`, `salaryMax`, `salaryCurrency` and the annualised USD fields. Sign-on bonuses and relocation amounts are not mistaken for pay.

**Can I run it with an empty input?** Yes. An empty input, from the form or the API, runs the prefilled companies (Stripe, Ramp, Datadog).

***

### 📜 Changelog

**1.2.1 — 2026-10-10.** An empty input runs the prefilled companies. Company labels: a typed name wins ("Lockheed Martin"), a domain or careers URL becomes the brand ("Kraftheinz"). Salary parser reads "126 500$ - 176 500$" and ignores sign-on bonus, relocation and referral amounts.

**1.2.0 — 2026-10-10.** Oracle Cloud HCM, SAP SuccessFactors and Phenom career sites: three more systems read through their public endpoints, by careers URL or through discovery; JPMorgan Chase and BNY Mellon (Oracle), Snowflake, Cisco and Lowe's (Phenom) measured. SuccessFactors in all three of its layouts: table, tiles and the script-driven sites' own jobs service (L3Harris 2,305 roles, Skyworks 334, Aflac 38). Eightfold's personalised sites (Qualcomm 1,831, Lam Research) and Eightfold sites on a company's own domain (Autodesk 379, Kraft Heinz 797, Fortive 267). The login-only SuccessFactors portal is recognised, so discovery keeps walking to the real careers host (PACCAR, West Pharmaceutical); up to three discovered boards are tried before a company is given up. Workday, Oracle, Phenom, SuccessFactors and Eightfold descriptions are read eight at a time for the first `maxDescriptionsPerBoard` roles. The employer list is rebuilt from the benchmark: 1,129 verified boards on 17 platforms, 68,177 open roles (was 307 boards on 4 platforms); `searchEmployerBoards` goes to 800. Measured on the same 1,000 companies: 478 found (48%), up from 345 (34%) before these readers.

**1.1.0 — 2026-10-10.** Careers-page discovery for companies whose board slug is not their name: website → careers link → the system behind it, 6 requests and 10 seconds at most per company; a reason per company that cannot be found; slug guesses now run on every platform at once instead of one after another; generic words (careers, jobs…) are never guessed as slugs, after one landed on another company's board. Measured on 1,000 companies: 27% found by name, 34% with discovery.

**1.0.0 — 2026-10-10.** First release on the Job Board API engine: fourteen ATS platforms by name or URL, the 307-employer verified list searchable by keyword, company-by-company delivery, monitor mode, salaries in USD, 190 technologies, location fields, hiring profiles.

***

### 💬 Support

Open an issue on the **Issues** tab and you will get a reply, usually the same day. If a platform changes and breaks, say so there; `RUN_SUMMARY` in your run's key-value store shows which boards answered. If the Actor saved you time, a review on this page helps other people find it.

### More from spool

- **[Job Board API — LinkedIn, Indeed, Glassdoor, Workday + 28 More](https://apify.com/spool/job-board-api)** — one search across 33 sources with the employer's posting attached, salaries in USD, monitor mode
- **[Company Tech Stack API — Detected from Job Postings](https://apify.com/spool/company-tech-stack-api)** — a company's technologies read from its own job board
- **[Wellfound Jobs Scraper (AngelList) — Salary & Equity Data](https://apify.com/spool/angellist-jobs-scraper)** — startup roles from Wellfound with salary and equity
- **[SEC Filings API — Who Mentions What in EDGAR](https://apify.com/spool/sec-filings-api)** — SEC filings searched by term, with company and mention counts

# Actor input Schema

## `companies` (type: `array`):

Employers to read straight from their own job board, one per line: a name (`Stripe`), a domain (`ramp.com`) or any careers URL. Greenhouse, Ashby, Lever, SmartRecruiters, Rippling, Breezy, Personio, Teamtailor, Pinpoint and Amazon boards are found by name; Workday, Oracle Cloud HCM, SAP SuccessFactors, Eightfold, Phenom, BambooHR and Recruitee from a careers URL. A plain careers page URL also works: the Actor reads which system is behind it. Up to 200 per run.

## `searchTerms` (type: `array`):

Job titles or keywords, one per line. A role is kept when the whole phrase appears in its title or every word of it does: `machine learning engineer` keeps *Senior Engineer, Machine Learning*. Leave empty to get every open role on the board.

## `location` (type: `string`):

Keep roles whose location mentions this text: `New York`, `London`, `Remote`, `Germany`. Matched against the employer's own location label.

## `searchEmployerBoards` (type: `integer`):

Ask this many boards from the bundled, verified list of 1,129 well-known employers on 17 platforms (Stripe, Airbnb, Figma, Anthropic, Databricks, Nvidia, Lockheed Martin, Capital One, JPMorgan Chase…) for your keywords, largest board first. 0 = off. 100 boards take about 15 seconds; 800 covers the whole list.

## `maxJobsPerCompany` (type: `integer`):

Cap on roles kept per company after the keyword and location filters. Nvidia's Workday board alone holds 1,700+ roles.

## `discoverCareersPages` (type: `boolean`):

When a name cannot be matched to a board directly, open the company's website, follow its careers link and read which system hosts the jobs (Greenhouse, Ashby, Lever, Workday, Oracle, iCIMS and 20 more are recognised). At most 6 requests and 10 seconds per company. Off = names are only tried as board slugs.

## `maxDescriptionsPerBoard` (type: `integer`):

Those platforms need one request per posting for its description; Greenhouse, Ashby and Lever send every description in the listing. 100 keeps a big board under a minute; 500 reads a whole enterprise board with every description.

## `postedWithinDays` (type: `integer`):

Keep roles the employer published or updated within this many days. Empty = all open roles.

## `requireSalary` (type: `boolean`):

Keep rows with a salary from the employer's structured fields or from a pay range stated in the description text.

## `minSalaryUsd` (type: `integer`):

Compared against the annualised USD figure, so an hourly US wage and a monthly EUR salary are judged on one scale.

## `requireTech` (type: `array`):

Keep rows whose text names any of these: `Kubernetes`, `Snowflake`, `Salesforce`, `React`… 190 technologies are recognised; spell them as in the `tech` output field.

## `companyRollup` (type: `boolean`):

One extra row per company: open roles found, the board's total open roles, department and seniority mix, top technologies, salary range in USD, remote share. The lead-generation view.

## `onlyNew` (type: `boolean`):

Remember every role this run has delivered and return only the ones not seen before. Memory is one record per input in a key-value store named `career-page-jobs-monitor` in your own account; roles not seen for 60 days are forgotten. Nothing delivered earlier is charged again.

## `monitorName` (type: `string`):

Name of the memory record. Leave empty and it is derived from the companies and keywords, so the same input always shares one memory. Set a name to share memory between inputs, or change it to start fresh. It is a label, not a credential.

## Actor input object example

```json
{
  "companies": [
    "Anthropic",
    "https://boards.greenhouse.io/airbnb",
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ],
  "searchTerms": [
    "software engineer",
    "account executive"
  ],
  "searchEmployerBoards": 0,
  "maxJobsPerCompany": 500,
  "discoverCareersPages": true,
  "maxDescriptionsPerBoard": 100,
  "requireSalary": false,
  "companyRollup": true,
  "onlyNew": false
}
```

# Actor output Schema

## `jobs` (type: `string`):

Job rows with enrichment (the `jobs` view: title, company, location, seniority, department, salary in USD, boards, apply link).

## `companies` (type: `string`):

One row per company: open roles, boards, ATS, department and seniority mix, top technologies, salary range.

## `salaries` (type: `string`):

Jobs with a stated salary, annualised and converted.

## `runSummary` (type: `string`):

Per-board rows returned, time and errors; ATS lookups; duplicates removed.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "companies": [
        "stripe.com",
        "https://jobs.ashbyhq.com/ramp",
        "Datadog"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("spool/career-page-jobs-api").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "companies": [
        "stripe.com",
        "https://jobs.ashbyhq.com/ramp",
        "Datadog",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("spool/career-page-jobs-api").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "companies": [
    "stripe.com",
    "https://jobs.ashbyhq.com/ramp",
    "Datadog"
  ]
}' |
apify call spool/career-page-jobs-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,spool/career-page-jobs-api"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/qJZzd9xQTPWgoNU99/builds/taCkxwPVqOP7CNdB1/openapi.json
