# LinkedIn & ATS Scraper — Zero-Cookie Jobs & Decision Emails (`aperture/linkedin-ats-b2b-buying-signal-scraper`) Actor

Extract B2B hiring signals from LinkedIn Guest Jobs & direct ATS feeds (Greenhouse, Lever, Personio) across 9 countries without cookies. Includes City-Split 1,000-result bypass, root-domain resolution, Impressum crawling & verified named-contact emails.

- **URL**: https://apify.com/aperture/linkedin-ats-b2b-buying-signal-scraper.md
- **Developed by:** [Aperture](https://apify.com/aperture) (community)
- **Categories:** Lead generation, Jobs, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 linkedin / ats hiring buying signal scraped (basic mode + free role email fallback)s

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

![Aperture — Global B2B Buying-Signal & Statutory Enrichment Suite](https://api.apify.com/v2/key-value-stores/j5l13XT1d0O0NQmTI/records/aperture-suite-banner.png)

![Strict Named-Contact $0.008](https://api.apify.com/v2/key-value-stores/j5l13XT1d0O0NQmTI/records/badge-strict-named-contact.svg) ![Zero-Proxy HTTP/2 <5s](https://api.apify.com/v2/key-value-stores/j5l13XT1d0O0NQmTI/records/badge-zero-proxy-http2.svg) ![LIMITED_PERMISSIONS • MCP Ready](https://api.apify.com/v2/key-value-stores/j5l13XT1d0O0NQmTI/records/badge-mcp-skyfire-ready.svg)

<p align="center">
  <a href="https://apify.com/aperture/linkedin-ats-b2b-buying-signal-scraper">
    <img src="https://api.apify.com/v2/key-value-stores/j5l13XT1d0O0NQmTI/records/linkedin-ats-signals.png" width="64" height="64" alt="LinkedIn Jobs & Multi-ATS B2B Buying-Signal Scraper" />
  </a>
</p>

### LinkedIn Jobs & Multi-ATS B2B Buying-Signal Scraper

### Find Companies Hiring on LinkedIn & Direct ATS Feeds — With Verified Decision-Maker Emails

Extract live B2B hiring signals from public **LinkedIn** Jobs (guest endpoints) and direct applicant tracking systems (**Greenhouse**, **Lever**, **Personio**) straight into your **Clay** tables, n8n workflows, or outbound CRM sequences. Instead of paying for brittle browser automations or risking account bans, this Actor operates entirely over guest endpoints and public ATS job feeds across 9 countries (`US`, `UK`, `DE`, `FR`, `NL`, `BE`, `AT`, `AU`, `NZ`). It resolves the hiring company's **real corporate website domain**, visits legal Impressum and contact pages, and extracts verified corporate contact emails and phone numbers in one pass. Runs in the cloud without requiring your LinkedIn cookies or browser login.

#### Fair Pricing Guarantee: Only Pay for Named People

- **`$0.002` per signal (`$2.00 / 1,000`) — `job-signal-scraped`:** Get the hiring company name, resolved website domain, role title, seniority band, workplace type (`remote`, `hybrid`, `on-site`), direct application or job URL, location, geo, direct corporate phone number, and free fallback inbox if present.
- **`$0.008` per named contact (`$8.00 / 1,000`) — `buying-signal-enriched`:** You only pay the enriched rate when we deliver a verified **`firstname.lastname@company.com`** email (`email_verification_status: "ok"`).
- **Generic `info@` & `contact@` Inboxes Are Free:** If a company only lists a generic department address (`info@`, `contact@`, `jobs@`, `careers@`, `hello@`), we still include it in your `contact_email` column **at no extra charge** (`email_verification_status: "role_fallback"`) and automatically bill you the **`$0.002`** basic rate (`job-signal-scraped`).

#### Built for Clay, n8n & Weekly Outbound Schedules

- **Instant First-Run Preview:** Click **Start** to test with your 25-lead free trial—enriched email discovery (`enriched_with_email`, `maxItems: 5`) is enabled by default so you see verified contacts on your very first run.
- **Never Pay Twice for the Same Job:** Turn on **"Only New Signals" (`onlyNewSignals`)** for weekly delta schedules. We remember every job listing identifier you have already pulled and skip duplicates before you are charged.
- **Skip Existing Customers & Competitors Free:** Paste your `blacklistDomains` list to filter out competitors, legacy partners, or current clients at `$0.00` cost. Unbilled pre-fetch exclusion filters (`excludeCompanyKeywords`, `excludeLocations`, `excludeStaffingAgencies`) drop unwanted recruitment agencies and companies at `$0.00` before domain resolution or website crawling.

#### Sample Output (What Lands in Your Clay Table)

*Illustrative output shape — run the Actor for live records*

| Company | Domain | Signal / Role | Contact Email | Verification Status | PPE Event Triggered | Price Billed |
| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
| **Example Enterprise Inc.** | `example.com` | `Enterprise Account Executive — Remote US` | `sarah.jenkins@example.com` | `ok` *(Named Person)* | `buying-signal-enriched` | **$0.008** |
| **Example Systems GmbH** | `example.de` | `Senior Customer Success Manager — Munich` | `jobs@example.de` | `role_fallback` *(Free Bonus)* | `job-signal-scraped` | **$0.002** |

#### Advanced B2B Signal Features

- **City-Split 1,000-Result Bypass (`splitByCity: true`):** LinkedIn guest search limits total pagination to 1,000 results per query. When `splitByCity: true` is enabled, the scraper automatically fans out into major metropolitan clusters (e.g. London, Manchester, Berlin, Munich, Paris, New York, San Francisco, Sydney, Melbourne), pulling comprehensive market coverage and bypassing the 1,000-result hard cap.
- **Natural-Language Intent Query Rewriting (`workplaceType`, `seniorityFilter`):** Intelligently rewrites queries to target specific buying intent—filter by workplace mode (`remote`, `hybrid`, `on-site`) and seniority tiers (`director`, `vp`, `cxo`, `senior`, `lead`, `entry`) to isolate strategic software and tech buyers before they purchase.
- **Direct ATS Feeds (`Greenhouse`, `Lever`, `Personio`):** In addition to LinkedIn Guest Jobs, pulls live job feeds directly from company ATS boards including Greenhouse, Lever, Personio, Workday, Ashby, and SmartRecruiters. Captures unlisted openings and authentic hiring signals directly from applicant tracking systems with zero middleman noise.
- **Unbilled Pre-Fetch Exclusion Shield (`excludeStaffingAgencies`, `excludeCompanyKeywords`, `excludeLocations`):** Filter out staffing agencies, recruitment headhunters, unwanted locations, and competitor domains upfront. These leads are dropped at `$0.00` cost before domain resolution or website crawl passes, preserving your run budget exclusively for high-intent B2B accounts.

### How much will it cost to scrape LinkedIn Guest Jobs & Direct ATS Feeds (Greenhouse, Lever, Personio)?

Aperture uses transparent **Pay-Per-Event (PPE)** pricing with a strict **Named-Contact Guarantee (`role_fallback`)**. $0.008 (scrapers) / $0.009 (aggregator) only when a literal named contact is extracted from the live Impressum/contact page and its domain passes DNS MX verification; generic info@ fallbacks are billed at the $0.002 / $0.003 base rate ($0.000 extra):

| Billing Component | Event Key / Metric | Unit Price (USD) | Cost per 1,000 Results | When It Fires |
| :--- | :--- | :---: | :---: | :--- |
| **Actor Start (One-Time)** | `apify-actor-start` | `$0.00005` | `$0.05` (per 1k runs) | Charged once when the container initializes. |
| **Base Signal Tier** | `job-signal-scraped` | **`$0.002`** | **`$2.00 / 1,000`** | Every normalized signal, **including free `role_fallback` inboxes (`info@`, `contact@`)**. |
| **Verified Named Contact Tier** | `buying-signal-enriched` | **`$0.008`** | **`$8.00 / 1,000`** | Strictly when `email_verification_status === "ok"` **AND** a named person (`firstname.lastname@`) is verified. |
| **Unbilled Pre-Fetch Shield** | `shouldExcludePreFetch` | **`$0.000`** | **`$0.00 / 1,000`** | Rows matching `excludeCompanyKeywords`, `excludeLocations`, or `blacklistDomains` are dropped before enrichment. |
| **Platform Compute (Pure HTTP/2)** | Apify Compute Units (CU) | `~$0.00018` | `~$0.18 / 1,000` | Lightweight `256MB–512MB` HTTP/2 execution with zero headless browser overhead. |

**Typical Run Cost Formula:**

- **100 leads (50% verified named decision-makers `ok`, 50% `role_fallback`):** `50 × $0.002 + 50 × $0.008 + $0.00005 start ≈ $0.53 total`.
- **Free-Tier Apify Plan Protection:** Apify free-plan runs are automatically capped at **25 leads per run** so you can test live quality for pennies without surprise charges.
- **Bytewells Multi-Client Agency License (`$99/mo`):** Outbound agencies running 10–20+ client workspaces with zero per-row metering can license this zero-cookie LinkedIn & ATS hiring engine on **[Bytewells](https://bytewells.com)** for **`$99/mo`** (or transit-capped passes: `$3` 1h Flash / `$12` 24h Burst / `$29` 7d Sprint) with `$0.00` per-event fees. Or license the complete 10-Actor portfolio via the **`$249/mo` Founding Agency License** (~`$12.45`/client/mo across 20 clients).

### Known Limitations & Compliance

- **Zero-Cookie Public Guest & ATS Scope:** Operates 100% over unauthenticated LinkedIn Guest Job endpoints and public ATS APIs (`Greenhouse`, `Lever`, `Personio`) without requiring your LinkedIn cookies or browser login. It does not access private member profiles behind LinkedIn login walls.
- **LinkedIn 1,000-Result Pagination Cap Bypass:** Public LinkedIn guest search caps pagination at 1,000 results per query. Enable `splitByCity: true` to automatically fan queries out across major metropolitan hubs (`Berlin`, `München`, `London`, `Paris`, `New York`, `Sydney`) and bypass the cap.
- **ATS Subdomain Stripping:** Direct ATS boards (`boards.greenhouse.io/company`, `jobs.lever.co/company`, `company.jobs.personio.de`) are automatically mapped back to the employer’s true corporate root domain before `/impressum` and `/contact` email enrichment.

### Complete Aperture B2B Buying Signal Suite

Combine regional signal scrapers with our cross-dataset 5D ICP scoring engine and Bytewells unlimited passes to run a unified outbound pipeline across Europe, the UK, North America, and APAC:

![Aperture Multi-Region Buying-Signal & ICP Aggregation Architecture](https://api.apify.com/v2/key-value-stores/j5l13XT1d0O0NQmTI/records/aperture-architecture.png)

| # | Actor | Markets (`geo`) | Signal Types | Primary Sources | Apify PPE (Basic / Enriched) | Bytewells Agency License |
| :-: | :--- | :---: | :--- | :--- | :--- | :--- |
| **1** | **[Stepstone DACH & Benelux Scraper](https://apify.com/aperture/stepstone-dach-buying-signal-scraper)** (`stepstone-dach-buying-signal-scraper`) | `DE`, `AT`, `BE`, `NL` | `jobs` | Stepstone (`.de`, `.at`, `.be`, `.nl`) + `/impressum` emails | `$0.002` / `$0.008` | `$99/mo` Unlimited |
| **2** | **[Seek Australia & NZ Scraper](https://apify.com/aperture/seek-anz-buying-signal-scraper)** (`seek-anz-buying-signal-scraper`) | `AU`, `NZ` | `jobs` | Seek (`seek.com.au`, `seek.co.nz`) + corporate `/contact` emails | `$0.002` / `$0.008` | `$99/mo` Unlimited |
| **3** | **[France Travail & Maddyness Scraper](https://apify.com/aperture/france-buying-signal-scraper)** (`france-buying-signal-scraper`) | `FR` | `jobs`, `funding` | France Travail jobs + Maddyness funding + `/mentions-legales` | `$0.002` / `$0.008` | `$99/mo` Unlimited |
| **4** | **[5D B2B Buying-Signal ICP Aggregator](https://apify.com/aperture/b2b-buying-signal-icp-aggregator)** (`b2b-buying-signal-icp-aggregator`) | `All 9 Geos` | `5D Multi-Signal` | Cross-dataset deduplicator, `0–100` ICP scorer, 28 tech tags & hooks | `$0.003` / `$0.009` | `$129/mo` Unlimited |
| **5** | **[EU & UK Public Procurement Scraper](https://apify.com/aperture/eu-uk-procurement-award-signal-scraper)** (`eu-uk-procurement-award-signal-scraper`) | `UK`, `FR`, `DE`, `NL`, `BE`, `AT` | `contract_award` | UK Find a Tender (OCDS) + France BOAMP + EU TED v3 awards | `$0.002` / `$0.008` | `$99/mo` Unlimited |
| **6** | **[EU & UK Executive & Incorporation Scraper](https://apify.com/aperture/eu-uk-executive-incorporation-signal-scraper)** (`eu-uk-executive-incorporation-signal-scraper`) | `FR`, `UK`, `DE`, `AT` | `executive_change` | France BODACC + UK Companies House + GLEIF new directors | `$0.002` / `$0.008` | `$99/mo` Unlimited |
| **7** | **[Biotech Clinical Trial & Grant Scraper](https://apify.com/aperture/biotech-clinical-trial-buying-signal-scraper)** (`biotech-clinical-trial-buying-signal-scraper`) | `US`, `UK`, `DE`, `FR`, `NL`, `BE`, `AT` | `clinical_trial`, `research_grant` | US ClinicalTrials.gov v2 + EU EMA CTIS + CORDIS + NIH SBIR | `$0.002` / `$0.008` | `$149/mo` Unlimited |
| **8** | **[LinkedIn & Direct ATS Buying-Signal Scraper](https://apify.com/aperture/linkedin-ats-b2b-buying-signal-scraper)** (`linkedin-ats-b2b-buying-signal-scraper`) | `All 9 Geos` | `jobs` | Zero-Cookie LinkedIn Guest Jobs + Greenhouse, Lever & Personio | `$0.002` / `$0.008` | `$99/mo` Unlimited |
| **9** | **[European Impressum Bulk Enricher](https://apify.com/aperture/european-impressum-contact-bulk-enricher)** (`european-impressum-contact-bulk-enricher`) | `DE`, `AT`, `CH`, `FR`, `UK`, `NL`, `BE` | `impressum_enrichment` | Bulk domain -> `/impressum` & `/mentions-legales` named contacts, VAT & HRB | `$0.001` / `$0.006` | `$39/mo` Unlimited |
| **10** | **[Global 5D B2B Signal Suite Unlimited](https://apify.com/aperture/global-b2b-signal-suite-unlimited)** (`global-b2b-signal-suite-unlimited`) | `All 10 Geos` | `All 5D Signals` | All-in-one whale orchestrator (Jobs, Tenders, Directors, Trials & Grants) | `$0.003` / `$0.009` | `$249/mo` Founding Agency License |

#### Two-Door Store Positioning: Apify Store (Self-Serve PPE) vs. Bytewells Multi-Client Agency License

| Execution Tier | Best For | Pricing Model | Agency Economics & Metering | Autonomous Agent / MCP Support |
| :--- | :--- | :--- | :--- | :--- |
| **Apify Store (Pay-Per-Event)** | Single-team tests, POCs & variable weekly on-demand runs | `$0.002` basic / `$0.008` verified named buyer | Pay only for what you extract (~`$0.0032`/row blended at 20% department buyer hit rate; free `role_fallback` inboxes at base rate) | Native `@apify/actors-mcp-server` |
| **Bytewells (`bytewells.com`)** | Outbound agencies running 10–20+ client workspaces & autonomous AI agents | **`$39–$149/mo` Single-Engine** or **`$249/mo` All-In-One 5D Global Suite** (Passes: `$3–$9` Flash, `$9–$29` Burst, `$19–$69` Sprint) | Zero per-row metering (~`$12.45`/client/mo across 20 clients; daily refresh on 3 core regions + weekly on 5 remaining regions) | Native **HTTP 402 Agentic Auto-Buy** (`x402` / Bytewells MCP) |

When processing more than **8,300 verified enriched rows per month**, switching to a **Bytewells Flat Rental (`$49/mo`)** eliminates per-event charges entirely, delivering unlimited runs with zero platform markup. Autonomous AI agents can also fund and execute runs programmatically via the **Bytewells HTTP 402 (`x402`)** agentic auto-buy standard, enabling machine-to-machine micropayments and frictionless execution without pre-provisioned API keys.

***

<details>
<summary><strong>Technical, API, Clay HTTP Column & Claude MCP Specifications (Click to Expand)</strong></summary>

#### Dataset Schema (22 Fields)

| Field Name | Type | Description |
| :--- | :--- | :--- |
| `detected_at` | `string` | ISO 8601 UTC timestamp when the job posting was scraped (`2026-11-02T02:00:00Z`). |
| `company` | `string` | Hiring company legal or operational name (`Example Enterprise Inc.`). |
| `domain` | `string` | Cleansed corporate root domain (`example.com`), stripped of job board or ATS domains. |
| `role_title` | `string` | Cleaned job title listed on LinkedIn or the direct ATS feed (`Enterprise Account Executive`). |
| `seniority_band` | `string` | Standardized seniority tier (`cxo`, `vp`, `director`, `senior`, `mid`, `entry`). |
| `location` | `string` | City, province, or workplace location (`New York, NY`, `Berlin`, `London`, `Remote`). |
| `geo` | `string` | Normalized country ISO code (`US`, `UK`, `DE`, `FR`, `NL`, `BE`, `AT`, `AU`, `NZ`). |
| `posted_date` | `string` | Job posting publication date or delta timestamp. |
| `signal_type` | `string` | Canonical signal classification (`"jobs"`). |
| `signal_detail` | `string` | Human-readable brief (`Job: Enterprise Account Executive — Remote US [Full-time]`). |
| `signal_source_actor` | `string` | Source Actor identifier (`linkedin-ats-b2b-buying-signal-scraper`). |
| `signal_date` | `string` | ISO date (`YYYY-MM-DD`) compatible with aggregation pipelines. |
| `evidence_url` | `string` | Canonical live URL to the LinkedIn or ATS job listing. |
| `contact_email` | `string` | Discovered decision-maker email (`sarah.jenkins@example.com`) or free role fallback. |
| `contact_phone` | `string` | Direct corporate phone number extracted at $0 extra charge. |
| `salary_band` | `string` | Disclosed compensation or salary indicator if provided. |
| `contract_type` | `string` | Standardized employment type (`Full-time`, `Contract`, `Permanent`). |
| `email_verification_status` | `string` | Deliverability status: `ok` (verified named contact), `role_fallback` (free role inbox), `mx_only`, `invalid`, `unverified`, or `not_requested`. |
| `mx_provider` | `string` | Fingerprinted mail server (`Google Workspace`, `Microsoft 365`, etc.). |
| `ppe_event_charged` | `string` | Pay-Per-Event billing tier billed (`job-signal-scraped`, `buying-signal-enriched`, or `none`). |
| `notes` | `string` | Provenance metadata, ATS provider tags, and MX verification notes. |
| `error` | `string \| null` | Error description if extraction failed, or `null`. |

#### Pure HTTP/2 Architecture & ATS Feed Direct Resolution

- **No LinkedIn Account or Cookies Required:** Queries public guest endpoints and ATS job board APIs directly. Zero browser emulation, zero login session risks, and lightweight memory consumption (512 MB).
- **Direct ATS Feeds:** Automatically handles Greenhouse, Lever, Personio, Workday, Ashby, and SmartRecruiters job board schemas, resolving hiring entities and candidate pages directly.
- **Root Domain Waterfall:** Strips ATS subdomains (`boards.greenhouse.io/company` -> `company.com`) and queries company website footers for authentic corporate identifiers.
- **Statutory Impressum & Contact Crawler:** Navigates legal `/impressum`, `/contact`, `/mentions-legales`, and `/team` pages to uncover authentic corporate communication channels.

#### Clay HTTP API Integration (`POST run-sync-get-dataset-items`)

Import live LinkedIn and ATS hiring signals directly into your Clay table using an **HTTP API (Enrichment / Action)** column:

**Endpoint:**

```http
POST https://api.apify.com/v2/acts/aperture~linkedin-ats-b2b-buying-signal-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN&maxTotalChargeUsd=2.00
Content-Type: application/json
```

**Request Body:**

```json
{
  "keywords": ["Account Executive", "Head of Sales"],
  "country": "US",
  "location": "New York",
  "workplaceType": "remote",
  "splitByCity": true,
  "maxItems": 5,
  "scraperMode": "enriched_with_email",
  "onlyNewSignals": true
}
```

#### Claude Desktop, Cursor & Antigravity MCP Server Configuration

Connect [`@apify/actors-mcp-server`](https://www.npmjs.com/package/@apify/actors-mcp-server) in `claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "apify": {
      "command": "npx",
      "args": [
        "-y",
        "@apify/actors-mcp-server",
        "--actors",
        "aperture/stepstone-dach-buying-signal-scraper,aperture/seek-anz-buying-signal-scraper,aperture/france-buying-signal-scraper,aperture/b2b-buying-signal-icp-aggregator,aperture/eu-uk-procurement-award-signal-scraper,aperture/eu-uk-executive-incorporation-signal-scraper,aperture/biotech-clinical-trial-buying-signal-scraper,aperture/linkedin-ats-b2b-buying-signal-scraper,aperture/european-impressum-contact-bulk-enricher,aperture/global-b2b-signal-suite-unlimited"
      ],
      "env": {
        "APIFY_TOKEN": "YOUR_APIFY_TOKEN"
      }
    }
  }
}
```

#### Full JSON Sample Output

*Illustrative output shape — run the Actor for live records*

```json
[
  {
    "detected_at": "2026-11-02T02:00:00Z",
    "company": "Example Enterprise Inc.",
    "domain": "example.com",
    "role_title": "Enterprise Account Executive",
    "seniority_band": "senior",
    "location": "New York, NY",
    "geo": "US",
    "posted_date": "2026-11-01T15:30:00Z",
    "signal_type": "jobs",
    "signal_detail": "Job: Enterprise Account Executive — Remote US [Full-time]",
    "signal_source_actor": "linkedin-ats-b2b-buying-signal-scraper",
    "signal_date": "2026-11-01",
    "evidence_url": "https://www.linkedin.com/jobs/view/4059182390",
    "contact_email": "sarah.jenkins@example.com",
    "contact_phone": "+1 800-555-0199",
    "salary_band": "$140,000 - $180,000 USD",
    "contract_type": "Full-time",
    "email_verification_status": "ok",
    "mx_provider": "Google Workspace",
    "ppe_event_charged": "buying-signal-enriched",
    "notes": "Verified named email via corporate domain mx records.",
    "error": null
  },
  {
    "detected_at": "2026-11-02T02:00:00Z",
    "company": "Example Systems GmbH",
    "domain": "example.de",
    "role_title": "Senior Customer Success Manager",
    "seniority_band": "senior",
    "location": "Munich, Germany",
    "geo": "DE",
    "posted_date": "2026-11-01T12:00:00Z",
    "signal_type": "jobs",
    "signal_detail": "Job: Senior Customer Success Manager — Munich [Full-time]",
    "signal_source_actor": "linkedin-ats-b2b-buying-signal-scraper",
    "signal_date": "2026-11-01",
    "evidence_url": "https://jobs.example.de/job/109283",
    "contact_email": "jobs@example.de",
    "contact_phone": "+49 89 000000",
    "salary_band": "€ 65.000 - € 85.000 EUR",
    "contract_type": "Full-time",
    "email_verification_status": "role_fallback",
    "mx_provider": "Google Workspace",
    "ppe_event_charged": "job-signal-scraped",
    "notes": "Generic departmental role email provided free at basic rate.",
    "error": null
  }
]
```

</details>

# Actor input Schema

## `keywords` (type: `array`):

Target job titles or B2B intent search terms (e.g., \['Account Executive', 'VP Sales', 'Head of Engineering', 'Data Engineer']).

## `countries` (type: `array`):

Select target ISO country codes for job posting searches across LinkedIn Guest and ATS boards.

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

Specific city, metropolitan area, or regional location filter (e.g., 'Berlin', 'London', 'Paris', 'San Francisco').

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

Only retrieve jobs posted or updated within the last N days (1 = last 24h, 7 = past week, 30 = past month).

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

Maximum number of normalized buying-signal records to output (default: 20). Free-tier Apify runs are capped at 25 items per run; paid Apify plans support unlimited runs.

## `atsBoardTokens` (type: `array`):

Optional board tokens/subdomains for direct company ATS scraping (e.g., \['celonis', 'figma'] for Greenhouse, \['mistral'] for Lever, \['wandelbots'] for Personio).

## `signalSources` (type: `array`):

Select hiring signal data sources: 'linkedin_guest' (Zero-Cookie LinkedIn Guest Jobs API), 'greenhouse' (direct Greenhouse board feeds), 'lever' (direct Lever job site feeds), and 'personio' (direct Personio XML feeds).

## `workplaceType` (type: `string`):

Filter jobs by workplace arrangement: 'any' (all postings), 'remote' (remote only), 'hybrid' (hybrid only), or 'onsite' (on-site only).

## `seniorityFilter` (type: `array`):

Filter postings by seniority band: 'entry', 'mid', 'senior', 'manager', 'director', 'vp', 'cxo'. Leave empty to include all seniority levels.

## `splitByCity` (type: `boolean`):

When enabled, expands each target country into separate queries across top tier-1 metro hubs (e.g., DE into Berlin, Munich, Hamburg, Frankfurt, Cologne) to bypass LinkedIn's 1,000-result search limit.

## `scraperMode` (type: `string`):

Choose 'basic' ($0.002/signal) to extract job details and resolve corporate root domains without website email crawling. Choose 'enriched_with_email' ($0.008 strictly when a verified named contact email is discovered; generic role emails like info@/contact@/jobs@ are included free as 'role_fallback' and billed at $0.002).

## `strictBuyerMatchOnly` (type: `boolean`):

When enabled (true), emits ONLY signals where a non-HR department/role decision-maker (role_matched or department_matched) with a verified named email (ok), non-empty verbatim title, and live corporate contact_source_url was discovered on the company's own website. Filters out recruiter contacts, statutory Impressum legal officers, generic info@ inboxes, and unmatched rows.

## `icpScoringPreset` (type: `string`):

Select the target client industry preset to automatically calibrate 0–100 account ICP scoring without hand-writing JSON. Pure account & signal fit (0% contact provenance penalty) so contact_confidence and $0.008/$0.002 PPE billing remain strictly orthogonal.

## `icpTargetSeniority` (type: `string`):

Choose which hiring or signal role seniority tier receives the maximum +25 pt seniority weight for this client workspace.

## `icpBoostKeywords` (type: `array`):

Type any industry, product, or niche keywords that matter to this client workspace (e.g. 'cybersecurity', 'chemicals', 'industrial insurance'). Matching accounts automatically receive an +18 pt ICP boost.

## `icpRecencyPriority` (type: `string`):

Control how strongly fresh signals (posted <=3 days ago) are prioritized over older signals in the 0–100 account ICP score.

## `icpWeights` (type: `object`):

Optional configurable 0–100 account ICP scoring weights (signalTypes, roleSeniority, geos, industryKeywords regex-to-points map, and recency brackets). Pure account & signal fit (0% contact provenance penalty) so you can customize account scoring per client workspace without affecting contact_confidence or $0.008/$0.002 PPE billing.

## `blacklistDomains` (type: `array`):

Company root domains or employer names to skip at $0 before enrichment and PPE charging.

## `excludeCompanyKeywords` (type: `array`):

Case-insensitive keywords matched against employer names BEFORE domain resolution, website crawling, or PPE charging. Matching records are dropped at $0.00.

## `excludeLocations` (type: `array`):

Case-insensitive city, state, or country substrings dropped BEFORE domain resolution, website crawling, or PPE charging ($0.00 cost).

## `excludeStaffingAgencies` (type: `boolean`):

When enabled (default), drops postings from third-party staffing agencies and job boards (Hays, PageGroup, Michael Page, Randstad, Adecco, etc.) before domain resolution or PPE billing.

## `onlyNewSignals` (type: `boolean`):

When enabled, persists seen job posting IDs in a named Apify Key-Value Store (monitorScopeName) and skips previously emitted signals at $0.

## `monitorScopeName` (type: `string`):

Named Apify Key-Value Store used to persist seen signal keys across scheduled runs when onlyNewSignals is enabled.

## `customEmailVerifierApiKey` (type: `string`):

Optional MillionVerifier / ZeroBounce / Reacher compatible API key for real-time SMTP mailbox verification during enriched_with_email runs.

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

LinkedIn Guest Jobs and direct ATS feeds operate over pure HTTP/2 with zero proxy overhead by default. Optional proxy settings are used only when crawling rate-limited corporate websites during enriched_with_email mode.

## Actor input object example

```json
{
  "keywords": [
    "Account Executive",
    "VP Sales",
    "Head of Engineering"
  ],
  "countries": [
    "DE",
    "UK",
    "FR",
    "US",
    "NL",
    "AT",
    "BE",
    "AU",
    "NZ"
  ],
  "location": "Berlin",
  "postedWithinDays": 30,
  "maxItems": 20,
  "atsBoardTokens": [
    "celonis",
    "personio",
    "mistral"
  ],
  "signalSources": [
    "linkedin_guest",
    "greenhouse",
    "lever",
    "personio"
  ],
  "workplaceType": "any",
  "seniorityFilter": [],
  "splitByCity": false,
  "scraperMode": "enriched_with_email",
  "strictBuyerMatchOnly": false,
  "icpScoringPreset": "b2b_saas_cyber_tech",
  "icpTargetSeniority": "director_vp_first",
  "icpBoostKeywords": [
    "cybersecurity",
    "cloud",
    "enterprise"
  ],
  "icpRecencyPriority": "fresh_first",
  "icpWeights": {
    "signalTypes": {
      "multi_signal": 45,
      "contract_award": 35,
      "clinical_trial": 35,
      "funding": 35,
      "jobs": 30,
      "executive_change": 25
    },
    "roleSeniority": {
      "director_vp_global": 25,
      "manager_kam_territory": 18,
      "specialist_ic": 10
    },
    "geos": {
      "DE": 15,
      "AT": 12,
      "CH": 15,
      "UK": 15,
      "FR": 15,
      "NL": 14,
      "BE": 14,
      "AU": 14,
      "NZ": 12,
      "US": 15
    },
    "industryKeywords": {
      "cybersecurity|security|software|cloud|it|saas": 18,
      "chemicals|industrial|automation|manufacturing|entry systems": 12,
      "insurance|versicherung|finanz|logistics": 8,
      "testing|instruments|actuators|sensors": 6
    },
    "recency": {
      "days_0_3": 15,
      "days_4_7": 11,
      "days_8_14": 6,
      "days_15_plus": 0
    }
  },
  "blacklistDomains": [
    "competitor.com"
  ],
  "excludeCompanyKeywords": [
    "Hays",
    "PageGroup",
    "Randstad"
  ],
  "excludeLocations": [
    "Staffing"
  ],
  "excludeStaffingAgencies": true,
  "onlyNewSignals": false,
  "monitorScopeName": "buying-signal-dedup-store",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Dataset containing normalized LinkedIn Guest Jobs and direct ATS (Greenhouse, Lever, Personio) hiring signals with resolved corporate root domains and verified named contact emails.

## `state` (type: `string`):

Key-value store record persisting crawl progress, zero-contact domain diagnostics, and graceful shutdown checkpoints.

# 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 = {
    "keywords": [
        "Account Executive",
        "VP Sales",
        "Head of Engineering"
    ],
    "countries": [
        "DE",
        "UK",
        "FR",
        "US",
        "NL",
        "AT",
        "BE",
        "AU",
        "NZ"
    ],
    "location": "Berlin",
    "postedWithinDays": 30,
    "maxItems": 20,
    "atsBoardTokens": [
        "celonis",
        "personio",
        "mistral"
    ],
    "signalSources": [
        "linkedin_guest",
        "greenhouse",
        "lever",
        "personio"
    ],
    "workplaceType": "any",
    "scraperMode": "enriched_with_email",
    "icpScoringPreset": "b2b_saas_cyber_tech",
    "icpBoostKeywords": [
        "cybersecurity",
        "cloud",
        "enterprise"
    ],
    "blacklistDomains": [
        "competitor.com"
    ],
    "excludeCompanyKeywords": [
        "Hays",
        "PageGroup",
        "Randstad"
    ],
    "excludeLocations": [
        "Staffing"
    ],
    "monitorScopeName": "buying-signal-dedup-store"
};

// Run the Actor and wait for it to finish
const run = await client.actor("aperture/linkedin-ats-b2b-buying-signal-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 = {
    "keywords": [
        "Account Executive",
        "VP Sales",
        "Head of Engineering",
    ],
    "countries": [
        "DE",
        "UK",
        "FR",
        "US",
        "NL",
        "AT",
        "BE",
        "AU",
        "NZ",
    ],
    "location": "Berlin",
    "postedWithinDays": 30,
    "maxItems": 20,
    "atsBoardTokens": [
        "celonis",
        "personio",
        "mistral",
    ],
    "signalSources": [
        "linkedin_guest",
        "greenhouse",
        "lever",
        "personio",
    ],
    "workplaceType": "any",
    "scraperMode": "enriched_with_email",
    "icpScoringPreset": "b2b_saas_cyber_tech",
    "icpBoostKeywords": [
        "cybersecurity",
        "cloud",
        "enterprise",
    ],
    "blacklistDomains": ["competitor.com"],
    "excludeCompanyKeywords": [
        "Hays",
        "PageGroup",
        "Randstad",
    ],
    "excludeLocations": ["Staffing"],
    "monitorScopeName": "buying-signal-dedup-store",
}

# Run the Actor and wait for it to finish
run = client.actor("aperture/linkedin-ats-b2b-buying-signal-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 '{
  "keywords": [
    "Account Executive",
    "VP Sales",
    "Head of Engineering"
  ],
  "countries": [
    "DE",
    "UK",
    "FR",
    "US",
    "NL",
    "AT",
    "BE",
    "AU",
    "NZ"
  ],
  "location": "Berlin",
  "postedWithinDays": 30,
  "maxItems": 20,
  "atsBoardTokens": [
    "celonis",
    "personio",
    "mistral"
  ],
  "signalSources": [
    "linkedin_guest",
    "greenhouse",
    "lever",
    "personio"
  ],
  "workplaceType": "any",
  "scraperMode": "enriched_with_email",
  "icpScoringPreset": "b2b_saas_cyber_tech",
  "icpBoostKeywords": [
    "cybersecurity",
    "cloud",
    "enterprise"
  ],
  "blacklistDomains": [
    "competitor.com"
  ],
  "excludeCompanyKeywords": [
    "Hays",
    "PageGroup",
    "Randstad"
  ],
  "excludeLocations": [
    "Staffing"
  ],
  "monitorScopeName": "buying-signal-dedup-store"
}' |
apify call aperture/linkedin-ats-b2b-buying-signal-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,aperture/linkedin-ats-b2b-buying-signal-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/xu4m0ZTpjPnOnlZHg/builds/jToyJIYuL5ro3hp2L/openapi.json
