# ATS Jobs Scraper (`boncross/ats-jobs`) Actor

Scrape jobs from any company careers page. It recognises Greenhouse, Lever, Ashby, Workday, Oracle HCM, SuccessFactors, Taleo, Mercury xRM and SmartRecruiters from the URL. Get title, location, department, dates and the full advert. Export to CSV, JSON or Excel.

- **URL**: https://apify.com/boncross/ats-jobs.md
- **Developed by:** [BonCross API](https://apify.com/boncross) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 job-details

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

## ATS Jobs Scraper

### What is ATS Jobs Scraper?

You have a list of companies and you want their open jobs. Some run Greenhouse, some Workday, one has a careers site with its own branding and no clue what's underneath. ATS Jobs Scraper takes the careers page URL for each, works out which of nine recruitment platforms is behind it, and returns the jobs in one shape whichever platform they came from.

So you paste the page you'd send a candidate to, and you never have to know which system an employer uses.

Why it earns its place:

- **Nine platforms, one row shape.** Greenhouse, Lever, Ashby, Workday, Oracle HCM, SAP SuccessFactors, Oracle Taleo, Mercury xRM and SmartRecruiters. A pipeline written for one reads them all.
- **It reads whole boards.** 16 careers pages across all nine platforms, taken in full with every advert, returned 6,110 rows in about 9 minutes with none missing.
- **It handles long lists.** 110 careers pages at 20 jobs each returned 1,875 rows in 116 seconds, about 970 rows a minute.
- **The advert text has been checked at the source.** In our release run, 18 of 18 checkable adverts matched the employers' own pages.
- **A page it can't read doesn't sink the run.** You get a row saying the page wasn't recognised, and the other companies carry on.

**BonCross Verified** means we tested this actor against the live site before release and kept the record:

- 42 of 42 live checks on its inputs and filters passed on 7 October 2026
- 16 boards run the same day across nine hiring platforms: 167 jobs, 1 error row
- 18 of 18 checkable adverts matched their own pages
- Charges matched the rows: 1 start, 16 boards, 167 jobs

### Which careers pages work?

Paste the careers page as you find it. These are recognised from the URL:

| Platform | A careers page looks like |
|---|---|
| Greenhouse | `job-boards.greenhouse.io/company` |
| Lever | `jobs.lever.co/company` |
| Ashby | `jobs.ashbyhq.com/company` |
| Workday | `company.wd3.myworkdayjobs.com/en-US/Careers` |
| Oracle HCM | `company.fa.em5.oraclecloud.com/hcmUI/CandidateExperience/en/sites/CX_1001/jobs` |
| SAP SuccessFactors | `company.jobs2web.com/search/` |
| Oracle Taleo | `company.taleo.net/careersection/external/jobsearch.ftl` |
| Mercury xRM | `careers.company.com/jobs/vacancy/find/results/` or `careers.company.com/jobs/rss` |
| SmartRecruiters | `careers.smartrecruiters.com/Company` or `jobs.smartrecruiters.com/Company` |

An employer's own branded careers site (for example `jobs.tfl.gov.uk/search/`) is recognised from the page itself where it runs on SAP SuccessFactors, or where it links its adverts to SmartRecruiters, Greenhouse, Ashby or Lever.

If all your companies are on one platform, the single-platform actors have a simpler form: [Greenhouse](https://apify.com/boncross/greenhouse-jobs), [Lever](https://apify.com/boncross/lever-jobs), [Ashby](https://apify.com/boncross/ashby-jobs) and [Workday](https://apify.com/boncross/workday-jobs).

### What data can you extract from a careers page?

| Field | Field |
|---|---|
| 💼 Job title | 🏢 Employer |
| 📍 Location | Department or team |
| 📄 Full advert text | Advert HTML, optional |
| Contract type | Remote flag |
| 📅 Posted date | 🔗 Advert link |
| 💷 Salary from and to | Salary currency and period |
| Job id | Which platform it came from |
| Employer board name | The careers page it came from |
| When the row was collected | Last edited date, where published |
| Posting date as the site wrote it | Every location a job is open in |
| 🏠 On-site, hybrid or remote, where published | |

### How to scrape a careers page

1. [Create a free Apify account](https://console.apify.com/sign-up) and open [ATS Jobs Scraper](https://apify.com/boncross/ats-jobs).
2. Paste one careers page URL per company.
3. Narrow by title, location or work type if you don't want the whole board.
4. Press Start.
5. Download the jobs as Excel, CSV or JSON, with an `ats` column telling you which platform each came from.

### ⬇️ Input

All you have to supply is the URLs. For a long list, use Start URLs to load them from a file or a Google Sheet.

"Max jobs per careers page" caps each employer and "Max jobs for the whole run" caps the run. Both default to 0, which reads each board in full.

**One company**

```json
{
  "careersUrls": ["https://job-boards.greenhouse.io/stripe"],
  "maxItemsPerBoard": 200
}
```

**Several companies, engineering roles only**

```json
{
  "careersUrls": [
    "https://job-boards.greenhouse.io/stripe",
    "https://jobs.lever.co/palantir",
    "https://jobs.ashbyhq.com/ramp"
  ],
  "titleIncludes": ["engineer", "developer"],
  "maxItems": 500
}
```

**Hybrid or remote jobs only**

```json
{
  "careersUrls": ["https://jobs.lever.co/palantir"],
  "workplaceTypes": ["Hybrid", "Remote"],
  "includeUnknownWorkplace": false
}
```

**Remote jobs from the last seven days, adverts included**

```json
{
  "careersUrls": ["https://jobs.ashbyhq.com/ramp"],
  "onlyRemote": true,
  "maxDaysOld": 7,
  "fetchDetails": true
}
```

**A scheduled run that reports only jobs it hasn't reported before**

```json
{
  "careersUrls": ["https://salesforce.wd12.myworkdayjobs.com/External_Career_Site"],
  "onlyNew": true,
  "dedupStoreName": "ats-seen",
  "locationIncludes": ["London"]
}
```

#### How the filters behave on different platforms

Platforms don't all offer the same things, so three inputs need a word.

**Keyword** uses the platform's own job search on Workday, Oracle HCM, Taleo and SuccessFactors search pages. On Greenhouse it matches the title and advert the way the board's search does. On Lever, Ashby, Mercury xRM and SmartRecruiters it matches job titles. If the link you paste already has a search word in it, that word is kept and your keyword then matches titles only.

**Work type** keeps jobs whose `workplaceType` is On-site, Hybrid or Remote. It's applied before any advert is fetched, except on Workday, which states the arrangement on the advert: there each advert is fetched, and billed as a fetched advert, before its job is kept or dropped. A job with no stated arrangement is kept unless you turn off "Keep jobs with no stated work type". If its location or title says remote, it counts as Remote.

**A pre-filtered link keeps its filters.** Filter a Workday, Greenhouse, Lever or Ashby board on its own page (department, office, location, team, category and so on), copy the link, and those filters apply here the way the board applies them.

The others are simpler:

- "Title must contain" and "Title must not contain" keep or drop a job by words in its title, ignoring case.
- "Location must contain" keeps a job only if its location has one of your words, such as "London". Jobs on a platform that publishes no location are dropped by it.
- "Remote jobs only" keeps jobs the employer marked as remote. A job that says nothing about remote working is dropped, not assumed.
- "Posted within (days)" keeps jobs posted in the last N days. 0 keeps everything.
- "Fetch full job adverts" is on by default. Greenhouse, Lever and Ashby return the advert with the listing. On the other six platforms each job is opened to get it.
- "Include advert text" (on) and "Include advert HTML" (off) choose the advert as plain text, as original HTML, or both. HTML makes rows a lot larger.

#### For developers

- Keys: `careersUrls`, `startUrls`, `maxItemsPerBoard`, `maxItems`, `keyword`, `titleIncludes`, `titleExcludes`, `locationIncludes`, `onlyRemote`, `workplaceTypes`, `includeUnknownWorkplace`, `maxDaysOld`, `fetchDetails`, `includeDescription`, `includeDescriptionHtml`, `oracleLocationId`, `onlyNew`, `dedupStoreName`, `maxConcurrency`, `delayMs`.
- `onlyNew` with a `dedupStoreName` skips jobs an earlier run with the same store name returned. Leave the store name empty and nothing is remembered. The store is updated every minute while the run delivers jobs.
- `oracleLocationId` restricts an Oracle HCM board to one place by Oracle's own location id (London is `300000007171591`). Empty means the whole board.
- `maxConcurrency` (default 8) is how many requests run at once across the run. The default is the fastest level we measured clean. Lower it only if a run reports refusals or errors. `delayMs` (default 0) is an optional pause before each request.
- Several careers pages are read at once and adverts on a page are fetched side by side. Very large Workday boards are read at a steady pace the site accepts. Greenhouse boards are read one at a time, about 2 seconds each on average and up to 18 seconds for the largest.
- Workday boards with more than 2,000 jobs are read group by group (by job family or country, whichever the board offers).
- Rows are saved as they're collected. A run that hits its timeout keeps what it delivered, and a run the platform restarts carries on without delivering or charging any job twice.

### ⬆️ Output

One row per job, in the same shape for all nine platforms. The Overview view shows title, employer, location, department, posting date, platform and advert link.

```json
{
  "id": "8172510",
  "url": "https://stripe.com/jobs/search?gh_jid=8172510",
  "title": "Abuse Investigator",
  "company": "Stripe",
  "location": "Seattle, San Francisco, New York City",
  "department": "8611 Security Analytics",
  "employmentType": null,
  "isRemote": null,
  "postedAt": "2026-09-09T14:50:29.000Z",
  "updatedAt": "2026-09-25T20:45:00.000Z",
  "postedText": null,
  "closingAt": null,
  "salaryMin": null,
  "salaryMax": null,
  "salaryCurrency": null,
  "salaryPeriod": null,
  "description": "Who we are\n\nAbout Stripe\n\nStripe is a financial infrastructure platform…",
  "ats": "greenhouse",
  "tenant": "stripe",
  "scrapedAt": "2026-09-26T17:08:44.892Z",
  "careersUrl": "https://job-boards.greenhouse.io/stripe"
}
```

What the less obvious columns mean:

- `description` is the advert as plain text. `descriptionHtml` is the board's original HTML and is present only when you ask for it.
- `workplaceType` is `On-site`, `Hybrid` or `Remote` where the platform publishes it (Ashby, Lever, SmartRecruiters, Workday adverts and Greenhouse boards that publish it) and absent otherwise.
- `isRemote` is true or false only where the platform says so, and null otherwise. A hybrid job isn't remote unless one of its locations is.
- `postedAt` is when the advert was first published, and it's what "Posted within (days)" filters on. `updatedAt` is when the employer last edited it, where the platform reports that. The two are often months apart: a job edited this week can be one first posted in February.
- `postedText` keeps the original wording where a platform gives the date in words ("Posted 3 Days Ago"). `postedAt` is null where the platform gives no date, or only a floor such as "Posted 30+ Days Ago".
- `locations` appears where a platform names more than one location for a job, primary first. "Location must contain" matches against all of them.
- `closingAt` is kept in the shape for all platforms and is empty on all nine today.
- `detailNote` appears on the rare row whose advert page held no advert, and says so.

### How many boards and jobs fit in a run?

It reads a whole careers page unless you cap it. In one run that took five jobs from each of eight careers pages (37 jobs, 23 seconds), the boards behind them held 654 jobs at Stripe, 313 at Palantir, 173 at Freshfields, 147 at Ramp, 64 at Oracle, 57 at Reed Smith and 31 at TfL.

Speed on Apify at default settings, 1 and 2 October 2026:

| Run | Result |
|---|---|
| One careers page, 20 jobs | 20 rows in 1 to 5 seconds (once 13, a slow start) |
| 10 careers pages on all nine platforms, 25 jobs each with adverts | 226 rows in 8 to 11 seconds. Twice 30 to 65 seconds, when one employer's site was that slow to answer a single advert |
| A 1,526-job Workday board, listing only | 1,503 rows in 9 seconds |
| A 1,526-job Workday board with every advert | 1,510 rows in about 6 minutes |
| 16 careers pages in full on all nine platforms, every advert | 6,110 rows in about 9 minutes, none missing |
| 110 careers pages on nine platforms, 20 jobs each with adverts | 1,875 rows in 116 seconds (about 970 rows a minute) |
| Two 2,000+ job Workday boards, 600 adverts each | 1,200 rows in 81 seconds, none refused |

Adding employers adds little time. At the bulk rate, one run inside the default one-hour timeout handles roughly **3,000 careers pages** at 20 jobs each. An input of only Greenhouse boards fits about **1,700 boards** an hour.

The job id, link, title, employer, posting date, advert text and platform were on **every row** of the eight-page run. Location and department depend on the platform, and salary appears only where the employer chose to publish it.

### How much does it cost to scrape careers pages?

| Event | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| `actor-start`, per run | $0.001 | $0.001 | $0.001 | $0.001 |
| `board-scanned`, per careers board read | $0.0002 | $0.0002 | $0.0002 | $0.0002 |
| `job-detail`, per job with the full advert | $0.001 | $0.0009 | $0.0008 | $0.0007 |
| `job-listed`, per job without the full advert | $0.0005 | $0.00045 | $0.0004 | $0.00035 |
| `url-checked`, per page that answered with no supported job board | $0.0005 | $0.0005 | $0.0005 | $0.0005 |

Enterprise plans pay the Business price.

**$1.00 per 1,000 jobs** with the full advert on the Free plan and $0.70 on Business, whichever of the nine platforms they come from. Jobs without the advert are $0.50 per 1,000 on the Free plan, $0.35 on Business. None of these platforms needs a proxy, so there are no proxy charges, and platform usage is included.

- 500 jobs with full adverts from one careers page: $0.001 + $0.0002 + 500 × $0.001 = **$0.5012** ($0.3512 on Business).
- Those 500 jobs without the advert: $0.001 + $0.0002 + 500 × $0.0005 = **$0.2512** ($0.1762 on Business).

How a job is billed, once each:

- `job-detail` when the row has the full advert. On Greenhouse, Lever and Ashby that's whenever advert text or HTML is included (text is on by default). On the other six it's when the job's advert was opened. An opened advert is billed even if "Posted within (days)" then drops the row.
- `job-listed` for a job delivered without its full advert.
- `board-scanned` once per careers board read, and `url-checked` for a page that answered but has no supported job board. A URL that never answers is free.

The $5 of credits Apify's Free plan gives you each month covers about 4,900 jobs with full adverts, at 100 jobs a careers page.

### Limitations

- **Nine platforms, no more.** A careers page built by hand, or on a platform not in the table above, returns a row saying it wasn't recognised.
- **SmartRecruiters boards are per company id.** Some large employers post under several, one per legal entity. Paste the SmartRecruiters page for each one you want. An employer's own branded site is read as the first of its boards that it links to.
- **Location and department are only as good as the employer's listing.** Mercury xRM and Taleo boards often publish no location beside the job list. The advert's text often names one.
- **Some platforms show an advert only in the visitor's browser.** Where the advert isn't available, the row keeps its listing fields and has a `detailNote`.
- **Salary is a minority.** It appears only where the employer published one.
- **Relative dates.** Some platforms give "Posted 3 Days Ago", so the date is derived and the wording kept beside it. "Posted 30+ Days Ago" is a floor, not a date, and leaves `postedAt` empty. A few boards publish no posting date at all.
- **Keyword reach varies.** It matches title and advert text on Workday, Oracle HCM, Taleo, Greenhouse and SuccessFactors (on a board's search page), and job titles on Lever, Ashby, Mercury xRM and SmartRecruiters. SmartRecruiters' own search isn't used: in a check it missed jobs with the word in their title and returned jobs with the word nowhere in title or advert.
- **Work type is known only where it's stated**: Lever, Ashby, SmartRecruiters, Workday adverts that have it, Oracle HCM where set, and Greenhouse boards with a work-type field.
- **Very large Workday boards.** Above 2,000 jobs a board is read group by group, and a job the board files under no group could be missed.
- **No applications.** You can't submit one through this actor.

### FAQ

#### How do I know which platform a company uses?

You don't have to. Paste the careers page and the actor works it out. The `ats` column in the results tells you afterwards.

#### What happens if one of my URLs isn't a supported careers page?

That URL gets a row saying it wasn't recognised and is billed `url-checked` ($0.0005). Your other URLs are unaffected.

#### How do I track new jobs across a list of companies?

Turn on "Only jobs not seen before", give the store a name, and schedule the run in Apify Console. Each run returns what has appeared since the last.

#### Why do most rows have no salary?

Most employers don't publish one. In practice it's Ashby and Lever boards, and Greenhouse boards with a pay-transparency block, that do. Where a salary is advertised you get numbers with currency and period.

#### Why do some jobs have no location?

Some boards, mostly on Mercury xRM and Taleo, leave the location out of their job list.

#### Can I get listings without the adverts to save money?

Turn "Fetch full job adverts" off, and on Greenhouse, Lever and Ashby also turn "Include advert text" off. Rows then bill at the `job-listed` rate, half the price.

#### Do I need a proxy or an account anywhere?

No proxy is needed for any of the nine platforms and no account is used. You configure nothing.

#### Is scraping careers pages legal?

Employers publish these adverts so people will find them, and the actor reads them without logging in to anything. Gathering published job adverts is generally lawful in the UK and EU. How you use the data is your responsibility.

### Connecting it to a board, a CRM or an agent

A company watchlist is the usual build: your list of careers pages in a Google Sheet loaded through Start URLs, a daily schedule with only-new on, and a webhook or the Slack integration announcing the day's openings. Zapier, Make and Airbyte connect the same dataset to a CRM or a warehouse.

For code, Apify's run-sync-get-dataset-items endpoint runs the actor and returns the rows in one call. `apify-client` is published for Python and JavaScript, and the actor's API tab has the reference with your token filled in.

An AI agent can use it through the Apify MCP server (`https://mcp.apify.com`): hand it a company's careers URL and it reads the open roles as structured data, whatever the platform.

### More from BonCross

- [Ashby Jobs Scraper](https://apify.com/boncross/ashby-jobs): Every open job on an Ashby careers board.
- [Greenhouse Jobs Scraper](https://apify.com/boncross/greenhouse-jobs): Every open job from a Greenhouse careers board.
- [Lever Jobs Scraper](https://apify.com/boncross/lever-jobs): A Lever careers board for every open job.
- [Workday Jobs Scraper](https://apify.com/boncross/workday-jobs): Every open job from a Workday careers board.
- [CharityJob Scraper](https://apify.com/boncross/charityjob-jobs): UK charity and non-profit jobs from CharityJob.
- [Glassdoor Job Scraper](https://apify.com/boncross/glassdoor-jobs): Glassdoor job listings for a role and location.

### Your feedback

If a careers page you expected to work came back unrecognised, send us the URL on the Issues tab in Apify Console. Those reports tell us which platforms and branded sites to look at next, and we read every one.

# Changelog

This Actor's version history is a separate document: https://apify.com/boncross/ats-jobs/changelog.md

# Actor input Schema

## `careersUrls` (type: `array`):

One or more company careers pages. Paste the page you would send a candidate to, for example https://job-boards.greenhouse.io/stripe or https://jobs.lever.co/palantir. A page that is not a supported careers board is reported as an error row; after 25 of those in one run, further unrecognised pages are reported without being opened.

## `startUrls` (type: `array`):

The same thing, but able to bulk-load careers pages from a file or a Google Sheet.

## `maxItemsPerBoard` (type: `integer`):

Row limit for each careers page. 0 means no limit.

## `maxItems` (type: `integer`):

Row ceiling across every careers page in the run. 0 means no limit.

## `keyword` (type: `string`):

Search term. Workday, Oracle HCM, Taleo and SuccessFactors boards search on the platform itself, and Greenhouse boards match it the way their own search does (title and advert text); on the other boards it keeps jobs whose title contains it.

## `titleIncludes` (type: `array`):

Keep a job only if its title contains at least one of these words. Case-insensitive.

## `titleExcludes` (type: `array`):

Drop a job if its title contains any of these words. Case-insensitive.

## `locationIncludes` (type: `array`):

Keep a job only if its location contains one of these words, for example "London". Jobs whose platform publishes no location are dropped by this filter.

## `onlyRemote` (type: `boolean`):

Keep only jobs the employer marked as remote. Jobs where the platform says nothing about remote working are dropped, not assumed.

## `workplaceTypes` (type: `array`):

Keep only jobs with these working arrangements, as the employer states them (the workplaceType column). Leave empty for all. Jobs whose board does not say are kept unless you turn off the option below; a job with no stated arrangement whose location or title says remote counts as Remote. On Workday boards the arrangement is stated on the advert, so the job advert is fetched (and billed) before the job can be kept or dropped.

## `includeUnknownWorkplace` (type: `boolean`):

Only used with Work type. On (the default): jobs whose board says nothing about the arrangement are kept, because many employers never state it. Off: only jobs that state one of the chosen arrangements are kept.

## `maxDaysOld` (type: `integer`):

Keep only jobs posted in the last N days. 0 keeps everything.

## `fetchDetails` (type: `boolean`):

Greenhouse, Lever and Ashby return the advert with the listing. For the other six platforms this opens each job to get it. Turn off for a faster listing-only scan.

## `includeDescription` (type: `boolean`):

Include the job advert as plain text.

## `includeDescriptionHtml` (type: `boolean`):

Also include the advert's original HTML. Makes rows considerably larger.

## `oracleLocationId` (type: `string`):

Optional. Restricts an Oracle HCM board to one place using Oracle's own global geography id. London is 300000007171591. Leave empty for the whole board.

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

Skip jobs returned by an earlier run that used the same store name below.

## `dedupStoreName` (type: `string`):

Named key-value store that remembers job ids between runs. Leave empty to remember nothing.

## `maxConcurrency` (type: `integer`):

How many requests run at once across the whole run. The default is the fastest level measured clean; lower it only if a run reports refusals or errors.

## `delayMs` (type: `integer`):

Optional pause before each call, in milliseconds. 0 (the default) runs as fast as the parallel limit allows.

## Actor input object example

```json
{
  "careersUrls": [
    "https://job-boards.greenhouse.io/stripe"
  ],
  "startUrls": [],
  "maxItemsPerBoard": 0,
  "maxItems": 0,
  "keyword": "",
  "titleIncludes": [],
  "titleExcludes": [],
  "locationIncludes": [],
  "onlyRemote": false,
  "workplaceTypes": [],
  "includeUnknownWorkplace": true,
  "maxDaysOld": 0,
  "fetchDetails": true,
  "includeDescription": true,
  "includeDescriptionHtml": false,
  "oracleLocationId": "",
  "onlyNew": false,
  "dedupStoreName": "",
  "maxConcurrency": 8,
  "delayMs": 0
}
```

# Actor output Schema

## `dataset` (type: `string`):

Every job the run returned.

## `stats` (type: `string`):

Counts for the run, including a breakdown by platform.

# 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 = {
    "careersUrls": [
        "https://job-boards.greenhouse.io/stripe"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("boncross/ats-jobs").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 = { "careersUrls": ["https://job-boards.greenhouse.io/stripe"] }

# Run the Actor and wait for it to finish
run = client.actor("boncross/ats-jobs").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 '{
  "careersUrls": [
    "https://job-boards.greenhouse.io/stripe"
  ]
}' |
apify call boncross/ats-jobs --silent --output-dataset

```

## MCP server setup

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

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/brKvzOTNhUucqvEOW/builds/TSXlljE2PEr3veG1f/openapi.json
