# B2B Buying-Signal & ICP Lead Aggregator (EU, UK & APAC) (`aperture/b2b-buying-signal-icp-aggregator`) Actor

Aggregate, deduplicate, and ICP-score B2B hiring, funding & public contract award signals across 8 countries (DE, AT, BE, NL, FR, UK, AU, NZ). Extracts 28+ tech-stack tags, boosts multi-signal leads to 100/100, and enforces strict named-contact PPE billing.

- **URL**: https://apify.com/aperture/b2b-buying-signal-icp-aggregator.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 $3.00 / 1,000 single-signal or multi-signal icp lead scored (includes free role emails)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

<p align="center">
  <a href="https://apify.com/aperture/b2b-buying-signal-icp-aggregator">
    <img src="https://api.apify.com/v2/key-value-stores/j5l13XT1d0O0NQmTI/records/b2b-icp-aggregator.png" width="64" height="64" alt="B2B Buying-Signal ICP Aggregator & Multi-Signal Scorer" />
  </a>
</p>

### What does B2B Buying-Signal ICP Aggregator & Multi-Signal Scorer do?

**B2B Buying-Signal ICP Aggregator** ([`aperture/b2b-buying-signal-icp-aggregator`](https://apify.com/aperture/b2b-buying-signal-icp-aggregator)) is a **Zero-Proxy, Sub-2-Second Post-Processing & ICP Scoring Engine** by **[Aperture — Data Aggregation Solutions](https://apify.com/aperture)** that merges raw buying signals across **8 countries: Germany (`DE`), Austria (`AT`), Belgium (`BE`), the Netherlands (`NL`), France (`FR`), the United Kingdom (`UK`), Australia (`AU`), and New Zealand (`NZ`)** into a single deduplicated, ranked outbound lead feed.

Designed as the orchestration hub of the **Aperture Global B2B Buying-Signal Suite** (and 100% compatible with Apify's official `apify-buying-signal-detection` workflow), it ingests Apify Datasets (`datasetIds`) and/or inline JSON arrays (`rawSignals`) across **3 intent signal dimensions (`jobs`, `funding`, and public procurement `contract_award` -> `multi_signal`)**. It strips 40+ non-company job-board/ATS hosts, filters out blacklisted domains at **$0.00**, merges multiple signals for the same company, scans for 28 canonical B2B tech-stack tools, computes a deterministic **`icp_score` (`0–100`)**, and generates a ready-to-send **`outreach_hook`** icebreaker citing the exact live evidence!

- **$0.00 Proxy Overhead & Ultra-Light Memory (`128 MB – 512 MB`)**: Pure in-memory TypeScript normalization and scoring (`256 MB` default RAM) — processes thousands of signals in `<2 seconds`.
- **Two-Way Entity Resolution (Domain + Normalized Company Name)**: Automatically merges `"Pennylane SAS"` (`pennylane.com` funding round on Maddyness) with `"Pennylane"` (`https://www.pennylane.com/fr/carrieres` hiring on France Travail) or public tender winners into a single high-conviction `multi_signal` account while retaining the highest-verified corporate email and highest-seniority role.
- **Limited Permissions (`LIMITED_PERMISSIONS`) Certified**: Ready for **Claude Desktop (MCP)**, **Cursor**, **Clay**, **n8n**, **Make**, and **Skyfire** autonomous agent workflows.

***

### Why RevOps & Outbound Teams Switch to Aperture

| Feature / Metric | Manual Clay / Spreadsheet Dedup | Aperture B2B Buying-Signal ICP Aggregator |
| :--- | :--- | :--- |
| **Multi-Signal Intersection Scoring** | Flat unranked rows without cross-dataset correlation. | **Composite 0–100 ICP Score (`100/100` when `contract_award` + `jobs`, or `funding` + `jobs` intersect)** with first-seen-wins `evidence_url` attribution. |
| **28-Tool B2B Tech-Stack Scanner** | Blind to tech mentions; requires complex prompt engineering or third-party scraping. | **Automatic `tech_stack` Extraction** (`Salesforce`, `HubSpot`, `SAP`, `Snowflake`, `Databricks`, `AWS`, `Azure`, `GCP`, `Kubernetes`, `Terraform`, `Workday`, `Personio`, `ServiceNow`, `NetSuite`, `Dynamics 365`, `Marketo`, `Braze`, `Segment`, `Stripe`, `Okta`, `CrowdStrike`, `Power BI`, `Tableau`, `Looker`, `Odoo`, `Datev`, `Pennylane`, `PayFit`) woven directly into `outreach_hook`. |
| **Pricing Fairness** | Expensive per-row enrichment credits even on bad or competitor data. | **Universal Strict Named-Contact Billing**: `$0.003` for single-signal scored leads and multi-signal leads with free role fallback (`role_fallback`); `$0.009` strictly when a verified named individual contact (`firstname.lastname@`, `email_verification_status === "ok"`) is delivered; `$0.00` for blacklisted or filtered domains. |
| **8-Country Normalization** | Breaks on `.co.uk`, `.org.uk`, `.uk`, `.com.au`, `.co.nz`, `.nl`, `.de`, `.fr` or job-board redirect URLs. | **40+ `NON_COMPANY_HOSTS` Stripper (`stepstone.nl`, `seek.com.au`, `francetravail.fr`, `maddyness.com`, `service.gov.uk`, `ted.europa.eu`) + Multi-Part TLD Root Domain Normalizer**. |

***

### 5-Actor Global B2B Buying-Signal Suite (`aperture`)

> **Strict Named-Contact Enriched Guarantee:** Across the entire Aperture suite, single-signal and multi-signal leads only trigger the premium tier ($0.009) when a **verified named individual contact** (`firstname.lastname@`, `email_verification_status: "ok"`) is attached. Generic or departmental role inboxes (`info@`, `hello@`, `contact@`, `office@`, `tenders@`, `sales@`, `people@`, `jobs@`) remain populated in `contact_email` for free with `email_verification_status: "role_fallback"` and automatically bill at the basic `icp-lead-scored` rate ($0.003).

Published by **[Aperture](https://apify.com/aperture)** — run any combination of our regional zero-cookie signal scrapers on a weekly schedule, then pass their Dataset IDs into **[`aperture/b2b-buying-signal-icp-aggregator`](https://apify.com/aperture/b2b-buying-signal-icp-aggregator)** to deduplicate, score, and generate outreach hooks across **8 countries (`DE`, `AT`, `BE`, `NL`, `FR`, `UK`, `AU`, `NZ`)** and **3 signal dimensions (`jobs`, `funding`, `contract_award` -> `multi_signal`)**:

| Actor | Markets (`geo`) | Signal Types | Primary Sources | PPE Pricing (Basic / Enriched) |
| :--- | :---: | :--- | :--- | :--- |
| <img src="https://api.apify.com/v2/key-value-stores/j5l13XT1d0O0NQmTI/records/stepstone-dach.png" width="22" height="22" style="vertical-align: middle; margin-right: 4px;" /> **[`aperture/stepstone-dach-buying-signal-scraper`](https://apify.com/aperture/stepstone-dach-buying-signal-scraper)** | `DE`, `AT`, `BE`, `NL` | `jobs` | Stepstone Germany, Austria, Belgium & Netherlands + statutory `/impressum` emails | $2.00 / $8.00 per 1k |
| <img src="https://api.apify.com/v2/key-value-stores/j5l13XT1d0O0NQmTI/records/seek-anz.png" width="22" height="22" style="vertical-align: middle; margin-right: 4px;" /> **[`aperture/seek-anz-buying-signal-scraper`](https://apify.com/aperture/seek-anz-buying-signal-scraper)** | `AU`, `NZ` | `jobs` | Seek Australia & New Zealand JSON/GraphQL + ANZ corporate `/contact` & `/privacy` emails | $2.00 / $8.00 per 1k |
| <img src="https://api.apify.com/v2/key-value-stores/j5l13XT1d0O0NQmTI/records/france-signals.png" width="22" height="22" style="vertical-align: middle; margin-right: 4px;" /> **[`aperture/france-buying-signal-scraper`](https://apify.com/aperture/france-buying-signal-scraper)** | `FR` | `jobs`, `funding` | France Travail B2B Hiring + Maddyness Startup Funding Rounds + `/mentions-legales` emails | $2.00 / $8.00 per 1k |
| <img src="https://api.apify.com/v2/key-value-stores/j5l13XT1d0O0NQmTI/records/eu-uk-procurement.png" width="22" height="22" style="vertical-align: middle; margin-right: 4px;" /> **[`aperture/eu-uk-procurement-award-signal-scraper`](https://apify.com/aperture/eu-uk-procurement-award-signal-scraper)** | `UK`, `FR`, `DE`, `NL`, `BE`, `AT` | `contract_award` | UK Contracts Finder & Find a Tender OCDS + France BOAMP Open Data v2.1 + EU TED Search v3 | $2.00 / $8.00 per 1k |
| <img src="https://api.apify.com/v2/key-value-stores/j5l13XT1d0O0NQmTI/records/b2b-icp-aggregator.png" width="22" height="22" style="vertical-align: middle; margin-right: 4px;" /> **[`aperture/b2b-buying-signal-icp-aggregator`](https://apify.com/aperture/b2b-buying-signal-icp-aggregator)** *(This Actor)* | `DE`, `AT`, `BE`, `NL`, `FR`, `UK`, `AU`, `NZ` | `jobs`, `funding`, `contract_award`, `multi_signal` | Zero-proxy cross-dataset deduplicator, multi-signal ICP scorer (`0–100`), 28-tool tech-stack extractor, and cold outreach hook engine | $3.00 / $9.00 per 1k |

***

### How the Deterministic ICP Scoring Engine (`0–100`) Works

Every deduplicated company account receives a transparent `icp_score` (`0` to `100`, sorted descending):

1. **Base Signal Conviction**: `55` points for fresh startup `funding` signals; `50` points for verified public procurement `contract_award` wins; `45` points for active B2B `jobs` hiring signals.
2. **Multi-Signal Intersection Boost (`100/100` Maximum Conviction)**: Awarded when a company exhibits **2+ distinct signal types**. When a public contract award (`contract_award`) coincides with active commercial hiring (`jobs`) or fresh funding (`funding`), the score is instantly boosted to **`100/100`**! Any other multi-signal combination receives a `+25` point boost (`signal_type: "multi_signal"`).
3. **Signal Velocity Boost (up to `+15` pts)**: `+5` points per additional distinct buying signal (`(signal_count - 1) * 5`, capped at `+15`).
4. **Role Seniority Boost (`+3` to `+12` pts)**: `+12` for `cxo`/`vp`, `+10` for `director`/`manager`, `+8` for `senior`, `+5` for `mid`, `+3` for `entry`.
5. **Deliverable Contact & Domain Hygiene Boost (`+5` to `+15` pts)**: `+10` when a **verified named individual contact** (`email_verification_status === "ok"`, e.g. `malte.fenger@stackfuel.com`, `linda.woodham@udtrucks.co.nz`, `brendan.mooney@kainos.com`) is attached, `+6` for a verified corporate role inbox (`email_verification_status === "role_fallback"`, e.g. `contact@`, `info@`, `tenders@`, `recrutement@`), `+4` for `mx_only`, and `+5` for a resolved corporate root domain. When merging multiple signals for the same company, verified named contacts (`ok`) always outrank generic role emails (`role_fallback`).

***

### Pay-Per-Event (PPE) Pricing (Universal Strict Named-Contact Policy)

| PPE Event Tier | PPE Event Name | Target Price | When Applied |
| :--- | :--- | :--- | :--- |
| **Scored Lead (Basic Tier)** | `icp-lead-scored` | **$3.00 / 1,000 leads** ($0.003 / lead) | Deduplicated company lead passing all `icpConfig` filters, `minIcpScore`, and `blacklistDomains` checks — **including** single-signal and multi-signal leads with a free fallback role inbox (`info@`, `contact@`, `tenders@`, `people@`, `jobs@` -> `email_verification_status: "role_fallback"`) or no email. |
| **Named-Contact Enriched Lead (Premium Tier)** | `icp-multi-signal-enriched` | **$9.00 / 1,000 leads** ($0.009 / lead) | High-intent company lead carrying a **verified NAMED individual contact** (`email_verification_status === "ok"`, e.g., `malte.fenger@stackfuel.com`, `brendan.mooney@kainos.com`). **Strict Named-Contact Guarantee: Leads with generic role inboxes (`role_fallback`) or unverified emails NEVER trigger the $0.009 tier, even if they have multiple signals!** They automatically bill at the basic `icp-lead-scored` rate ($0.003). |

- **$0.00 for Blacklisted, Duplicate, or Filtered Signals**: Raw signals matching `blacklistDomains`, failing `icpConfig` (`allowedGeos`, `maxSignalAgeDays`, `minIcpScore`), or collapsing into an existing company group are never charged.
- **25-Lead Free-Tier Cap & `ACTOR_MAX_TOTAL_CHARGE_USD` Guard**: Free-tier runs cap cleanly at 25 scored leads; paid runs respect `maxTotalChargeUsd` to the exact cent.

***

### Copy-Paste Recipes: Multi-Dataset Aggregation, Clay & MCP

#### 1. Multi-Dataset Weekly Aggregation (`datasetIds` across Stepstone DACH/NL, Seek ANZ, France, and EU/UK Procurement)

Run this via the Apify Console, API, or automated Apify Schedule every Monday morning to merge all regional scrapers into one ranked list:

```json
{
  "datasetIds": [
    "stepstone_dach_nl_default_dataset_id",
    "seek_anz_default_dataset_id",
    "france_signals_default_dataset_id",
    "eu_uk_procurement_awards_default_dataset_id"
  ],
  "icpConfig": {
    "allowedGeos": ["DE", "AT", "BE", "NL", "FR", "UK", "AU", "NZ"],
    "allowedSignalTypes": ["jobs", "funding", "contract_award", "multi_signal"],
    "allowedSeniorityBands": ["mid", "senior", "manager", "director", "vp", "cxo"],
    "minIcpScore": 55,
    "maxSignalAgeDays": 30
  },
  "blacklistDomains": ["competitor-one.de", "competitor-two.fr", "existing-client.co.uk", "existing-client.com.au"],
  "maxItems": 250
}
```

#### 2. Clay HTTP API Integration (`POST /v2/acts/aperture~b2b-buying-signal-icp-aggregator/run-sync-get-dataset-items`)

In Clay, add an **HTTP API** enrichment column to trigger synchronous deduplication and fetch the ranked leads directly into your table:

- **Method**: `POST`
- **URL**: `https://api.apify.com/v2/acts/aperture~b2b-buying-signal-icp-aggregator/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN`
- **Headers**:
  - `Content-Type: application/json`
- **Body**:

```json
{
  "datasetIds": ["/{{stepstoneDatasetId}}", "/{{seekDatasetId}}", "/{{franceDatasetId}}", "/{{procurementDatasetId}}"],
  "icpConfig": {
    "allowedGeos": ["DE", "AT", "BE", "NL", "FR", "UK", "AU", "NZ"],
    "minIcpScore": 60,
    "maxSignalAgeDays": 45
  },
  "blacklistDomains": ["salesforce.com", "hubspot.com"],
  "maxItems": 500
}
```

**Recommended Clay Field Mapping:**

- `company` -> Company Name
- `domain` -> Company Website
- `tech_stack` -> Tech Stack Tags
- `icp_score` -> Lead Score / Tier
- `contact_email` -> Primary Contact Email
- `contact_phone` -> Primary Contact Phone
- `outreach_hook` -> Cold Email Icebreaker / LinkedIn Note
- `evidence_url` -> Source Evidence Link

#### 3. Claude Desktop & Cursor MCP Server Configuration (`@apify/actors-mcp-server`)

Empower autonomous coding agents and LLMs to query and aggregate buying signals on demand using Apify's official MCP server.

**For Claude Desktop (`claude_desktop_config.json`) and Cursor (`mcp.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/eu-uk-procurement-award-signal-scraper,aperture/b2b-buying-signal-icp-aggregator"
      ],
      "env": {
        "APIFY_TOKEN": "YOUR_APIFY_TOKEN"
      }
    }
  }
}
```

***

### Sample output

```json
[
  {
    "detected_at": "2026-10-31T19:05:00Z",
    "company": "Kainos Software Ltd",
    "domain": "kainos.com",
    "role_title": "Public Tender Winner: Cloud Modernisation & Digital Services",
    "seniority_band": "director",
    "location": "London",
    "geo": "UK",
    "posted_date": "2026-10-31T12:34:39Z",
    "signal_type": "multi_signal",
    "signal_detail": "Contract Award: Cloud Modernisation — Awarded by Ministry of Justice [£5,242,203 GBP] | Job: Senior Cloud Architect — London [Permanent]",
    "signal_source_actor": "eu-uk-procurement-award-signal-scraper",
    "signal_date": "2026-10-31",
    "evidence_url": "https://www.contractsfinder.service.gov.uk/Notice/240e3451-d90e-4f1a-88bc-316d48ffbce4",
    "contact_email": "brendan.mooney@kainos.com",
    "contact_phone": "+44 28 9057 1100",
    "salary_band": "£5,242,203 GBP",
    "contract_type": "Public Tender Award",
    "email_verification_status": "ok",
    "mx_provider": "Microsoft 365",
    "ppe_event_charged": "icp-multi-signal-enriched",
    "notes": "source=UK_CF; buyer=Ministry of Justice; tech=AWS, Kubernetes, Terraform",
    "error": null,
    "icp_score": 100,
    "signal_count": 2,
    "signal_types_matched": ["contract_award", "jobs"],
    "source_actors": ["eu-uk-procurement-award-signal-scraper", "stepstone-dach-buying-signal-scraper"],
    "evidence_urls": [
      "https://www.contractsfinder.service.gov.uk/Notice/240e3451-d90e-4f1a-88bc-316d48ffbce4",
      "https://www.stepstone.de/stellenangebote--Senior-Cloud-Architect--12345.html"
    ],
    "tech_stack": ["AWS", "Kubernetes", "Terraform"],
    "outreach_hook": "Congratulations to Kainos Software Ltd on the recent public contract award for Cloud Modernisation [£5,242,203 GBP]! Noticing this momentum while actively scaling team capacity in London (stack: AWS, Kubernetes, Terraform), are you evaluating technology solutions to support delivery?"
  },
  {
    "detected_at": "2026-10-31T19:05:00Z",
    "company": "Pennylane SAS",
    "domain": "pennylane.com",
    "role_title": "Senior Account Executive Mid-Market",
    "seniority_band": "senior",
    "location": "Paris",
    "geo": "FR",
    "posted_date": "2026-10-30T10:00:00Z",
    "signal_type": "multi_signal",
    "signal_detail": "Funding: Pennylane raises 40M€ (Serie C) — French FinTech SaaS | Job: Senior Account Executive Mid-Market — Paris (75) [CDI]",
    "signal_source_actor": "france-buying-signal-scraper",
    "signal_date": "2026-10-30",
    "evidence_url": "https://www.maddyness.com/2026/10/29/pennylane-levee-de-fonds/",
    "contact_email": "contact@pennylane.com",
    "contact_phone": "+33 1 42 68 55 00",
    "salary_band": "65k€ - 85k€",
    "contract_type": "CDI",
    "email_verification_status": "role_fallback",
    "mx_provider": "Google Workspace",
    "ppe_event_charged": "icp-lead-scored",
    "notes": "source=mentions-legales; mx=Google Workspace; tech=Salesforce, Snowflake",
    "error": null,
    "icp_score": 100,
    "signal_count": 2,
    "signal_types_matched": ["funding", "jobs"],
    "source_actors": ["france-buying-signal-scraper"],
    "evidence_urls": [
      "https://www.maddyness.com/2026/10/29/pennylane-levee-de-fonds/",
      "https://candidat.francetravail.fr/offres/recherche/detail/214VGZB"
    ],
    "tech_stack": ["Salesforce", "Snowflake"],
    "outreach_hook": "Saw that Pennylane SAS recently secured new funding while actively hiring for a Senior Account Executive Mid-Market in Paris (stack: Salesforce, Snowflake). Given this rapid growth, would you be open to exploring how we can help accelerate your key initiatives?"
  }
]
```

***

### Support & Portfolio Attribution

Built and maintained by **[Aperture — Data Aggregation Solutions](https://apify.com/aperture)**. Explore all regional B2B buying-signal scrapers and post-processing tools at **[apify.com/aperture](https://apify.com/aperture)**.

# Actor input Schema

## `datasetIds` (type: `array`):

List of Apify Dataset IDs (e.g., from Stepstone DACH/Benelux, Seek AU/NZ, or France Jobs + Funding runs) or public Apify Dataset items URLs to fetch and merge under LIMITED_PERMISSIONS.

## `rawSignals` (type: `array`):

Inline BuyingSignalRecord objects passed directly from n8n, Make, Clay, or Claude MCP workflows (merged alongside any datasetIds).

## `icpConfig` (type: `object`):

Configure target ISO geos (DE, AT, BE, NL, FR, UK, AU, NZ), allowed signal types (jobs, funding, contract_award, multi_signal), allowed seniority bands, optional role keyword filters, max signal age in days, and minimum ICP score threshold (0-100).

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

Optional list of company root domains or company names (existing customers, competitors, agencies) to exclude at $0 before scoring and charging.

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

Maximum number of deduplicated, top-scoring ICP company leads to output (sorted by icp_score descending). Free-tier Apify runs are capped at 25 leads per run.

## Actor input object example

```json
{
  "datasetIds": [],
  "rawSignals": [
    {
      "detected_at": "2026-10-31T19:00:00Z",
      "company": "StackFuel GmbH",
      "domain": "stackfuel.com",
      "role_title": "Sales Development Representative (SDR) B2B (m/w/d)",
      "seniority_band": "entry",
      "location": "Berlin",
      "geo": "DE",
      "posted_date": "2026-10-28T09:00:00Z",
      "signal_type": "jobs",
      "signal_detail": "Job: Sales Development Representative (SDR) B2B (m/w/d) — Berlin [Full-time, Hybrid, HubSpot & Salesforce CRM]",
      "signal_source_actor": "stepstone-dach-buying-signal-scraper",
      "signal_date": "2026-10-28",
      "evidence_url": "https://www.stepstone.de/stellenangebote--SDR-B2B-Berlin-StackFuel-GmbH--14571042-inline.html",
      "contact_email": "malte.fenger@stackfuel.com",
      "contact_phone": "",
      "salary_band": "",
      "contract_type": "Full-time",
      "email_verification_status": "ok",
      "mx_provider": "Google Workspace",
      "ppe_event_charged": "buying-signal-enriched",
      "notes": "source=impressum; mx=Google Workspace",
      "error": null
    },
    {
      "detected_at": "2026-10-31T19:05:00Z",
      "company": "Pennylane SAS",
      "domain": "pennylane.com",
      "role_title": "",
      "seniority_band": "",
      "location": "Paris",
      "geo": "FR",
      "posted_date": "2026-10-29T08:00:00Z",
      "signal_type": "funding",
      "signal_detail": "Funding: Pennylane raises 40M€ (Serie C) — French FinTech SaaS",
      "signal_source_actor": "france-buying-signal-scraper",
      "signal_date": "2026-10-29",
      "evidence_url": "https://www.maddyness.com/2026/10/29/pennylane-levee-de-fonds/",
      "contact_email": "contact@pennylane.com",
      "contact_phone": "",
      "salary_band": "",
      "contract_type": "",
      "email_verification_status": "role_fallback",
      "mx_provider": "Google Workspace",
      "ppe_event_charged": "job-signal-scraped",
      "notes": "source=mentions-legales; mx=Google Workspace",
      "error": null
    },
    {
      "detected_at": "2026-10-31T19:06:00Z",
      "company": "Pennylane",
      "domain": "https://www.pennylane.com/fr/carrieres",
      "role_title": "Senior Account Executive Mid-Market",
      "seniority_band": "senior",
      "location": "Paris (75)",
      "geo": "FR",
      "posted_date": "2026-10-30T10:00:00Z",
      "signal_type": "jobs",
      "signal_detail": "Job: Senior Account Executive Mid-Market — Paris (75) [CDI, Salesforce, Snowflake]",
      "signal_source_actor": "france-buying-signal-scraper",
      "signal_date": "2026-10-30",
      "evidence_url": "https://candidat.francetravail.fr/offres/recherche/detail/214VGZB",
      "contact_email": "",
      "contact_phone": "+33 1 42 68 55 00",
      "salary_band": "",
      "contract_type": "CDI",
      "email_verification_status": "not_requested",
      "mx_provider": "",
      "ppe_event_charged": "job-signal-scraped",
      "notes": "",
      "error": null
    }
  ],
  "icpConfig": {
    "allowedGeos": [
      "DE",
      "AT",
      "BE",
      "NL",
      "FR",
      "UK",
      "AU",
      "NZ"
    ],
    "allowedSignalTypes": [
      "jobs",
      "funding",
      "contract_award",
      "multi_signal"
    ],
    "allowedSeniorityBands": [],
    "titleKeywords": [],
    "minIcpScore": 0,
    "maxSignalAgeDays": 180
  },
  "blacklistDomains": [],
  "maxItems": 100
}
```

# Actor output Schema

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

Dataset containing deduplicated, ICP-scored B2B accounts sorted by icp_score descending.

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

Key-value store record persisting aggregation statistics and PPE charge counters.

# 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 = {
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("aperture/b2b-buying-signal-icp-aggregator").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 = { "maxItems": 100 }

# Run the Actor and wait for it to finish
run = client.actor("aperture/b2b-buying-signal-icp-aggregator").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 '{
  "maxItems": 100
}' |
apify call aperture/b2b-buying-signal-icp-aggregator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,aperture/b2b-buying-signal-icp-aggregator"
        }
    }
}
```

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/3fd4tjQONIb0mSwaG/builds/A0MHK7SZjhF0HkEGX/openapi.json
