# B2B Hiring Signals and Multi-ATS Company Job Scraper (`xenikii/company-career-ats-job-scraper`) Actor

B2B hiring signals and multi-ATS job scraper: turn company domains into hiring velocity, salary data, and open roles across 7 ATS boards.

- **URL**: https://apify.com/xenikii/company-career-ats-job-scraper.md
- **Developed by:** [Xenikii](https://apify.com/xenikii) (community)
- **Categories:** Jobs, Lead generation, Business
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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.

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

## B2B Hiring Signals and Multi-ATS Company Job Scraper

Pass bare **company domains** (`linear.app`, `anthropic.com`, `datadoghq.com`), career page URLs, or direct ATS board URLs to auto-discover each company's applicant tracking system and output either:

1. **1-Row-Per-Company B2B Hiring Signals (`outputMode: "company_signals"`)** — built specifically for **Clay**, **n8n**, **Make**, and outbound lead scoring (`newJobsLast30d`, `isHiringAiMl`, `isHiringSalesGtm`, `isHiringSecurity`, `avgAnnualSalaryMinUsd/MaxUsd`, `departmentsBreakdown`, `sampleOpenRoles`).
2. **Normalized Open Job Postings (`outputMode: "jobs"`)** — structured titles, split multi-office `allLocations`, remote status, parsed pay-transparency salary bands, and plain-text descriptions across **7 ATS platforms + Schema.org JSON-LD** without browsers or residential proxies.

### Why Use This Over Single-ATS Scrapers?

Most ATS scrapers require you to already know whether a prospect uses Greenhouse, Ashby, Lever, or Workday — and return raw job rows that break 1-row-per-company Clay tables. This Actor solves both:

- **Domain-First ATS Auto-Discovery:** Pass `"linear.app"` or `"datadoghq.com"` — the Actor inspects career links, redirects, and public board endpoints across **Greenhouse**, **Ashby**, **Lever**, **Workday** (`wd1`/`wd3`/`wd5`/`wd12`), **SmartRecruiters**, **Workable**, **Recruitee**, and custom `Schema.org/JobPosting` career pages.
- **Native `company_signals` Mode for Clay & RevOps:** Collapses an entire 200-job board into a single enriched company row with 30-day hiring velocity, salary benchmarks, and boolean intent flags (`isHiringAiMl`, `isHiringEngineering`, `isHiringSalesGtm`, `isHiringSecurity`, `isHiringLeadership`).
- **Pay-Transparency Salary & Multi-Location Normalization:** Extracts structured salary metadata (`Greenhouse` cents, `Ashby` compensation tiers, `Lever` ranges, description regex fallback) and splits multi-hub location strings (`"San Francisco, CA | Seattle, WA"`) into clean `allLocations` arrays.

### Who Is This For?

- **Clay, n8n & Outbound GTM Engineers:** Trigger outbound sequences the moment a target account opens its first `AI/ML`, `Security`, or `Account Executive` roles (`newJobsLast30d > 0`).
- **Recruiting & Staffing Agencies:** Monitor client and prospect domains daily for newly published requisitions (`postedWithinDays: 7`) with disclosed salary budgets.
- **Job Aggregators & VC Market Intelligence:** Track headcount expansion and engineering velocity across portfolio companies and watchlists at `$0` proxy cost.

### Input

```json
{
  "targets": [
    "linear.app",
    "anthropic.com",
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ],
  "outputMode": "company_signals",
  "maxJobsPerTarget": 100,
  "remoteOnly": false,
  "includeJobDescriptions": false
}
```

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `targets` *(required)* | `string[]` | `["..."]` | Bare company domains (`"linear.app"`), career URLs (`"https://datadoghq.com/careers"`), or direct Greenhouse/Ashby/Lever/Workday/Workable URLs. |
| `outputMode` | `string` | `"jobs"` | `"company_signals"` (1 B2B summary row per company for Clay/CRM) or `"jobs"` (1 row per open job posting). |
| `maxJobsPerTarget` | `integer` | `50` | Max matching jobs inspected/returned per input domain or ATS board (`1–5000`). |
| `keywordFilter` | `string` | `""` | Optional comma-separated keywords matched against title, department, or description (e.g. `"AI, Machine Learning, Account Executive"`). |
| `departmentFilter` | `string` | `""` | Optional comma-separated departments/teams (e.g. `"Engineering, Sales, Security"`). |
| `locationFilter` | `string` | `""` | Optional comma-separated locations (e.g. `"San Francisco, New York, London, Remote"`). |
| `remoteOnly` | `boolean` | `false` | Filter for remote-eligible roles only. |
| `postedWithinDays` | `integer` | `0` | Return only jobs published within the last `N` days (`0` = any age). |
| `includeJobDescriptions` | `boolean` | `true` | Include clean plain-text job descriptions (`descriptionText`) and parse salary bands from body copy when needed. |
| `concurrency` | `integer` | `8` | Parallel HTTP worker concurrency (`1–25`). |
| `proxyConfiguration` | `object` | `undefined` | Optional proxy settings. Runs proxy-free out of the box (`$0` proxy cost). |

### Output

Results are pushed to the default **Dataset** (`JSON`, `CSV`, `Excel`, `Parquet`), and run totals are saved to `SUMMARY` in the default **Key-Value Store**.

#### Mode 1: `"outputMode": "company_signals"` (1 Row per Company — Ideal for Clay & Outbound)

Untouched live output for `"linear.app"`:

```json
{
  "recordType": "company_signals",
  "target": "linear.app",
  "status": "active_hiring",
  "companyName": "Linear",
  "companyDomain": "linear.app",
  "atsProvider": "ashby",
  "boardUrl": "https://jobs.ashbyhq.com/Linear",
  "totalBoardJobs": 31,
  "matchedJobsCount": 31,
  "remoteJobsCount": 29,
  "newJobsLast30d": 11,
  "salaryDisclosedCount": 15,
  "avgAnnualSalaryMinUsd": 173900,
  "avgAnnualSalaryMaxUsd": 215550,
  "isHiringAiMl": true,
  "isHiringEngineering": true,
  "isHiringSalesGtm": true,
  "isHiringSecurity": true,
  "isHiringLeadership": false,
  "departmentsBreakdown": {
    "Product": 13,
    "GTM": 16,
    "Operations": 2
  },
  "hiringSignalsBreakdown": {
    "engineering": 11,
    "product_design": 6,
    "sales_gtm": 16,
    "ai_ml": 1,
    "marketing": 6,
    "operations_finance": 2,
    "data": 1,
    "security": 1
  },
  "topLocations": [
    "North America",
    "Europe",
    "Singapore",
    "London",
    "Australia"
  ],
  "sampleOpenRoles": [
    {
      "title": "Senior / Staff Fullstack Engineer",
      "department": "Product",
      "location": "Europe",
      "isRemote": true,
      "salaryText": null,
      "publishedAt": "2021-04-27T20:13:45.158+00:00",
      "jobUrl": "https://jobs.ashbyhq.com/Linear/d3bc1ced-3ce4-4086-a050-555055dbb1ff"
    },
    {
      "title": "Senior / Staff Fullstack Engineer",
      "department": "Product",
      "location": "North America",
      "isRemote": true,
      "salaryText": null,
      "publishedAt": "2021-08-18T20:48:26.891+00:00",
      "jobUrl": "https://jobs.ashbyhq.com/Linear/cd5ae036-0223-427a-b038-ba16ef9dcb32"
    },
    {
      "title": "Senior / Staff Product Engineer",
      "department": "Product",
      "location": "Europe",
      "isRemote": true,
      "salaryText": null,
      "publishedAt": "2022-01-22T08:49:37.626+00:00",
      "jobUrl": "https://jobs.ashbyhq.com/Linear/069c4628-88d7-4e4d-b393-c996fc7f3076"
    },
    {
      "title": "Senior / Staff Product Engineer",
      "department": "Product",
      "location": "North America",
      "isRemote": true,
      "salaryText": "$204K – $264K • Offers Equity",
      "publishedAt": "2026-03-04T02:08:44.483+00:00",
      "jobUrl": "https://jobs.ashbyhq.com/Linear/12f8f208-0b9c-4569-bb3d-41c8a197029e"
    },
    {
      "title": "Product Engineer",
      "department": "Product",
      "location": "North America",
      "isRemote": true,
      "salaryText": "$173,500 – $214,250 • Offers Equity",
      "publishedAt": "2026-06-09T18:45:53.014+00:00",
      "jobUrl": "https://jobs.ashbyhq.com/Linear/0c7c2e26-0a98-42cf-a47c-9a3999fb513b"
    },
    {
      "title": "Product Manager",
      "department": "Product",
      "location": "North America",
      "isRemote": true,
      "salaryText": "$204K – $252K • Offers Equity",
      "publishedAt": "2026-01-21T22:22:21.799+00:00",
      "jobUrl": "https://jobs.ashbyhq.com/Linear/b7669c4b-eeca-421d-ba9a-d90203f6fcb2"
    },
    {
      "title": "Product Manager",
      "department": "Product",
      "location": "Europe",
      "isRemote": true,
      "salaryText": "$204K – $252K • Offers Equity",
      "publishedAt": "2026-01-21T22:22:24.412+00:00",
      "jobUrl": "https://jobs.ashbyhq.com/Linear/86abcce0-04b2-405c-9a8e-e0ca84813914"
    },
    {
      "title": "Product Support Specialist, Pacific/Mountain Time",
      "department": "GTM",
      "location": "North America",
      "isRemote": true,
      "salaryText": "$95K – $135K • Offers Equity",
      "publishedAt": "2026-05-28T20:46:41.811+00:00",
      "jobUrl": "https://jobs.ashbyhq.com/Linear/d062065e-05bb-42ce-a47c-ec205695cc2e"
    },
    {
      "title": "Account Executive, Startups",
      "department": "GTM",
      "location": "North America",
      "isRemote": true,
      "salaryText": "$191K – $214.5K • Offers Equity • Offers Commission",
      "publishedAt": "2025-11-14T22:09:45.713+00:00",
      "jobUrl": "https://jobs.ashbyhq.com/Linear/c21af93e-210f-4969-8eaa-90fb16a5b720"
    },
    {
      "title": "Senior / Staff Product Engineer, Applied AI",
      "department": "Product",
      "location": "North America",
      "isRemote": true,
      "salaryText": null,
      "publishedAt": "2025-07-10T19:17:43.653+00:00",
      "jobUrl": "https://jobs.ashbyhq.com/Linear/b4a7764e-c680-4bdf-9956-dc78f2ca94d5"
    }
  ],
  "error": null,
  "scrapedAt": "2026-11-04T09:22:17.631Z"
}
```

#### Mode 2: `"outputMode": "jobs"` (1 Row per Open Job Posting)

Untouched live output for `"anthropic.com"` (`includeJobDescriptions: false`):

```json
{
  "recordType": "job",
  "target": "anthropic.com",
  "status": "scraped",
  "companyName": "Anthropic",
  "companyDomain": "anthropic.com",
  "atsProvider": "greenhouse",
  "boardUrl": "https://boards.greenhouse.io/anthropic",
  "jobId": "5456619008",
  "requisitionId": "REQ-26-1145-01",
  "title": "3P Revenue Accounting & Reporting",
  "department": "Finance",
  "team": null,
  "location": "San Francisco, CA | Seattle, WA",
  "allLocations": [
    "San Francisco, CA",
    "Seattle, WA"
  ],
  "country": null,
  "workplaceType": "onsite",
  "isRemote": false,
  "employmentType": null,
  "salaryMin": 190000,
  "salaryMax": 230000,
  "salaryCurrency": "USD",
  "salaryInterval": "year",
  "salaryText": "USD 190,000 - 230,000",
  "publishedAt": "2026-10-19T11:17:24-04:00",
  "updatedAt": "2026-10-19T11:17:24-04:00",
  "daysOpen": 15,
  "jobUrl": "https://job-boards.greenhouse.io/anthropic/jobs/5456619008",
  "applyUrl": "https://job-boards.greenhouse.io/anthropic/jobs/5456619008",
  "descriptionText": null,
  "hiringSignals": [
    "sales_gtm",
    "operations_finance"
  ],
  "error": null,
  "scrapedAt": "2026-11-04T09:22:20.609Z"
}
```

### Pricing (Pay Per Event)

Domains with zero matching jobs and invalid inputs cost **`$0`**, and **no residential proxy credits are required**.

| Event | Title | Price | Charged When |
| :--- | :--- | :--- | :--- |
| `actor-start` | Actor start | `$0.0005` | Once per run |
| `job-scraped` | Job posting | `$0.0015` (`$1.50 / 1,000`) | Per open job posting returned in `outputMode: "jobs"` (`$0` when 0 jobs match) |
| `company-signal-enriched` | Company hiring profile | `$0.0080` (`$8.00 / 1,000`) | Per company with active open jobs in `outputMode: "company_signals"` (`$0` if 0 jobs) |

- **1,000 open job postings (`outputMode: "jobs"`):** `$1.50` total (`~3,300` jobs/month covered by Apify's `$5` Free plan credit).
- **500 prospect domains enriched with B2B hiring signals (`outputMode: "company_signals"`):** `$4.00` total — regardless of whether each company has 5 or 500 open jobs on its board.
- Respects Apify's **Maximum total charge** cap and stops cleanly when reached.

### API, Clay, n8n & MCP Integration

```bash
curl -X POST "https://api.apify.com/v2/acts/xenikii~company-career-ats-job-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"targets": ["linear.app", "anthropic.com"], "outputMode": "company_signals"}'
```

- **Clay Table Enrichment:** Set `outputMode: "company_signals"` and pass `["{{Domain}}"]` so every prospect row receives a single structured JSON object without blowing up row counts.
- **MCP (`mcp.apify.com`):** Works directly in Claude Desktop, Cursor, and AI recruiting/sales agents as `xenikii/company-career-ats-job-scraper`.

### FAQ & Data Compliance

- **What happens if a company wraps Greenhouse or Ashby behind a custom URL like `careers.company.com/?gh_jid=...`?** The discovery engine scans embedded iframes, script tags, outbound apply links, `__NEXT_DATA__` payloads, and slug probes (`greenhouse`, `ashby`, `lever`, `workable`, `smartrecruiters`, `recruitee`), falling back to `Schema.org/JobPosting` JSON-LD on custom career pages.
- **GDPR & Public Data Compliance:** Extracts **publicly advertised corporate job requisitions and pay-transparency disclosures** published by employers on open career portals. Zero candidate profiles, resumes, or personal employee data (PII) are accessed or stored.

### Other B2B Intelligence Actors

Combine these Actors in **Clay**, **n8n**, **Make**, or **MCP** to build a complete B2B signal and SEO stack:

| Actor | Best For | Pricing |
| :--- | :--- | :--- |
| **[Company Domain, Tech Stack & MX/DNS Enricher](https://apify.com/xenikii/company-domain-tech-stack-enricher)** | Resolve company names to domains, 12-category tech stacks, MX/SPF/DMARC & role contacts | `$2.50 / 1k` enriched domains |
| **[B2B Hiring Signals & Multi-ATS Job Scraper](https://apify.com/xenikii/company-career-ats-job-scraper)** *(This Actor)* | Extract hiring velocity, salary transparency & open roles across 7 ATS platforms | `$1.50 / 1k` job postings |
| **[Google Ads Transparency & Ad Library Scraper](https://apify.com/xenikii/google-ads-transparency-scraper)** | Spy on active Google Search, Display & YouTube creatives, days active & EU reach | `$1.80 / 1k` ad creatives |
| **[Broken Link, Sitemap & AI SEO (`llms.txt`) Auditor](https://apify.com/xenikii/broken-link-sitemap-llms-txt-auditor)** | Audit broken links, XML sitemaps, `GPTBot`/`ClaudeBot` rules & generate `llms.txt` | `$3.00 / 1k` audited websites |
| **[Google Trends Breakout & Comparison Scraper](https://apify.com/xenikii/google-trends-scraper)** | Track `+5,000%` breakout queries, multi-keyword share of search & live news trends | `$2.50 / 1k` keyword trend reports |

# Actor input Schema

## `targets` (type: `array`):

Accepts bare company domains ('anthropic.com', 'linear.app'), career URLs ('https://zoox.com/careers'), or direct ATS URLs (Greenhouse, Ashby, Lever, Workday, SmartRecruiters, Workable, Recruitee).

## `outputMode` (type: `string`):

'jobs' emits one Dataset row per open job posting. 'company_signals' emits one summary row per company with ATS provider, open role counts, salary averages, and AI/Engineering/Sales hiring flags.

## `maxJobsPerTarget` (type: `integer`):

Maximum number of matching open jobs processed per input domain or ATS board (1–5000).

## `keywordFilter` (type: `string`):

Comma-separated keywords matched against title, department, or description (e.g. 'Machine Learning, AI, Account Executive').

## `departmentFilter` (type: `string`):

Comma-separated department or team names (e.g. 'Engineering, Sales, Security').

## `locationFilter` (type: `string`):

Comma-separated cities, states, or countries (e.g. 'San Francisco, New York, London, Germany').

## `remoteOnly` (type: `boolean`):

Return only remote-eligible job postings.

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

Set to e.g. 30 to include only jobs published within the last 30 days (0 disables date filtering).

## `includeJobDescriptions` (type: `boolean`):

Include clean plain-text job descriptions (and extract embedded salary ranges from job text).

## `concurrency` (type: `integer`):

Parallel HTTP worker concurrency for detail lookups (1–25).

## `proxyConfiguration` (type: `object`):

Optional proxy settings. Works proxy-free out of the box across all supported ATS APIs.

## Actor input object example

```json
{
  "targets": [
    "anthropic.com",
    "linear.app",
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ],
  "outputMode": "jobs",
  "maxJobsPerTarget": 50,
  "remoteOnly": false,
  "postedWithinDays": 0,
  "includeJobDescriptions": true,
  "concurrency": 8
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

# 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 = {
    "targets": [
        "anthropic.com",
        "linear.app",
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("xenikii/company-career-ats-job-scraper").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 = { "targets": [
        "anthropic.com",
        "linear.app",
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("xenikii/company-career-ats-job-scraper").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 '{
  "targets": [
    "anthropic.com",
    "linear.app",
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ]
}' |
apify call xenikii/company-career-ats-job-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,xenikii/company-career-ats-job-scraper"
        }
    }
}
```

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/bsDoUkpPSpJZN4DVc/builds/4X0zSdmzhb3yo1Hcw/openapi.json
