# Biotech Clinical Trial & R\&D Grant Buying-Signal Scraper (`aperture/biotech-clinical-trial-buying-signal-scraper`) Actor

Extract B2B clinical trial and R\&D grant buying signals across US ClinicalTrials.gov v2, EU EMA CTIS, EU CORDIS Horizon Europe, and US NIH SBIR/STTR. Resolves sponsor root domains and verifies named study director/PI emails. Pay $0.008 only for verified firstname.lastname@ contacts; generic info@ in

- **URL**: https://apify.com/aperture/biotech-clinical-trial-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 biotech trial / grant 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/biotech-clinical-trial-buying-signal-scraper">
    <img src="https://api.apify.com/v2/key-value-stores/j5l13XT1d0O0NQmTI/records/biotech-clinical-trials.png" width="64" height="64" alt="Biotech Clinical Trial & Grant Buying-Signal Scraper" />
  </a>
</p>

### Biotech Clinical Trial & Grant Buying-Signal Scraper

### Find Life-Sciences Companies Launching Clinical Trials & Winning R\&D Grants — With Verified Decision-Maker Emails

Extract live commercial biotech and life-sciences buying signals from **US ClinicalTrials.gov** API v2, EU EMA **CTIS** (Clinical Trials Information System), EU **CORDIS** Horizon Europe, and US **NIH** RePORTER (SBIR/STTR commercial awards) straight into your **Clay** tables, n8n workflows, or outbound CRM sequences. Commercial biotech sponsors and R\&D grant winners actively procure contract research organizations (CROs), CDMOs, lab automation tools, and specialized consulting services. Instead of manual registry crawling or dealing with unformatted academic notices, this Actor filters for commercial sponsors, resolves the sponsor or grantee's **real website domain**, crawls corporate and legal Impressum pages (`/impressum`, `/mentions-legales`, `/contact`), 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 commercial sponsor or grantee legal name, resolved corporate website domain, trial headline or grant title (`role_title`), target seniority (`seniority_band`), trial phase or grant mechanism (`contract_type`), grant award value or trial budget indicator (`salary_band`), direct corporate phone number (`contact_phone`), location, geo, and canonical registry evidence link.
- **`$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 or registry entry only lists a generic department address (`info@`, `contact@`, `clinicaltrials@`, `grants@`, `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 Trial or Grant:** Turn on **"Only New Signals" (`onlyNewSignals`)** for weekly schedules. We remember every clinical trial and grant identifier you have already pulled and skip duplicates before you are charged.
- **`>= 2025` Recency Guard:** Built-in recency filtering (`minSignalYear: 2025`, `postedWithinDays: 180`, and `StudyFirstPostDate:desc` sorting) drops legacy 2017–2024 trials at `$0.00` before domain resolution or PPE charging.
- **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` and `excludeLocations`) drop unwanted academic institutions and geographic regions 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 Therapeutics Inc.** | `example-bio.com` | `Clinical Trial Sponsor (PHASE1): Study Director` | `sarah.chen@example-bio.com` | `ok` *(Named Person)* | `buying-signal-enriched` | **$0.008** |
| **Example Biosystems SAS** | `example-bio.fr` | `EU CORDIS Horizon Europe Grant (€2,499,831 EUR)` | `info@example-bio.fr` | `role_fallback` *(Free Bonus)* | `job-signal-scraped` | **$0.002** |
| **Example Diagnostics Ltd** | `example-dx.com` | `Clinical Trial (PHASE2)` | `contact@example-dx.com` | `role_fallback` *(Free Bonus)* | `job-signal-scraped` | **$0.002** |

### How much will it cost to scrape ClinicalTrials.gov, EU EMA CTIS, CORDIS & NIH SBIR?

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 (`$149/mo`):** Life-sciences CROs and BD agencies running 10–20+ client workspaces with zero per-row metering can license this clinical trial and R\&D grant engine on **[Bytewells](https://bytewells.com)** for **`$149/mo`** (or transit-capped passes: `$5` 1h Flash / `$19` 24h Burst / `$49` 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

- **Commercial Sponsors vs. Academic Medical Centers:** By default, `commercialSponsorsOnly: true` drops university, hospital, and academic-sponsored trials at `$0.00` before domain resolution so you only pay for commercial biotech/pharma sponsors and SBIR/CORDIS grant winners.
- **220 KB Multi-Language Dossier Pruning:** Raw EU EMA CTIS dossiers frequently exceed 220 KB of multi-language regulatory text. This Actor prunes translation arrays in-stream to keep container memory below 512 MB and output payloads `< 2,000` chars for LLM/MCP context windows.
- **`>= 2025` Hard Recency Guard:** Enforces `minSignalYear: 2025` and `StudyFirstPostDate:desc` sorting so legacy historical trials are filtered out at `$0.00`.

### 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) |

***

<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 clinical trial or research grant signal was extracted (`2026-11-02T00:00:00Z`). |
| `company` | `string` | Commercial biotech/pharma trial sponsor or R\&D grant recipient legal name (`Example Therapeutics Inc.`). |
| `domain` | `string` | Resolved corporate root domain of the sponsor/grantee (`example-bio.com`), cleansed of registry portals. |
| `role_title` | `string` | Normalized decision-maker or study/grant headline (`Clinical Trial Sponsor (PHASE1): Study Director`). |
| `seniority_band` | `string` | Decision-maker seniority band associated with trial leadership or PI role (`director`, `vp`, `cxo`). |
| `location` | `string` | Sponsor headquarters or primary trial/grant location (`Boston, MA, US`). |
| `geo` | `string` | Normalized portfolio country code (`US`, `UK`, `DE`, `FR`, `NL`, `BE`, `AT`, `AU`, `NZ`). |
| `posted_date` | `string` | Official trial update, authorization, or grant award notice timestamp (`2026-10-28T00:00:00Z`). |
| `signal_type` | `string` | Canonical signal category (`clinical_trial` or `research_grant`). |
| `signal_detail` | `string` | Pruned human-readable summary of the clinical trial or R\&D grant, phase, conditions, and NCT/CTIS cross-reference. |
| `signal_source_actor` | `string` | Identifier of this Apify Actor (`biotech-clinical-trial-buying-signal-scraper`). |
| `signal_date` | `string` | Trial update or grant award date normalized as YYYY-MM-DD (`2026-10-28`). |
| `evidence_url` | `string` | Canonical URL to the official clinical trial or grant registry record. |
| `contact_email` | `string` | Verified corporate contact email of the sponsor/grantee (`sarah.chen@example-bio.com` or free role fallback). |
| `contact_phone` | `string` | Direct corporate or registry contact phone number extracted at $0 extra cost. |
| `salary_band` | `string` | Formatted R\&D grant award value or trial phase budget indicator (`€2,499,831 EUR`, `$1,415,720 USD`). |
| `contract_type` | `string` | Standardized trial phase or grant mechanism classification (`Clinical Trial PHASE1`, `Horizon Europe Grant`). |
| `email_verification_status` | `string` | Deliverability classification: `ok` (verified named contact), `role_fallback` (free generic inbox), `mx_only`, `invalid`, `unverified`, or `not_requested`. |
| `mx_provider` | `string` | Resolved MX mail infrastructure provider (`Microsoft 365`, `Google Workspace`). |
| `ppe_event_charged` | `string` | Pay-Per-Event billing tier charged for this record (`job-signal-scraped` @ $0.002, `buying-signal-enriched` @ $0.008, or `none`). |
| `notes` | `string` | Enrichment provenance metadata (registry sources, NCT/CTIS cross-link, PI name, MX host). |
| `error` | `string \| null` | Error description if extraction failed, or `null`. |

#### Cross-Registry NCT Join, 220 KB Translation Pruner & Pure HTTP/2 Architecture

- **Cross-Registry NCT Join**: Automatically cross-indexes ClinicalTrials.gov NCT identifiers with EU EMA CTIS numbers (e.g., `CTIS 2023-506539-14-00` cross-linked with `NCT05983432`) to eliminate duplicate alerts and prevent redundant scraping across US and EU portals.
- **`>= 2025` Recency Guard & `StudyFirstPostDate:desc` Sorting**: Built-in recency guard enforces `minSignalYear: 2025`, `postedWithinDays: 180`, and `StudyFirstPostDate:desc` sorting by default to drop legacy 2017–2024 trials at `$0.00` before domain resolution or PPE charging.
- **220 KB Multi-Language Translation Pruner**: Multi-language registry dossiers (often exceeding 220 KB in French, German, or Dutch) are pruned into compact, high-signal English CRM briefs (<2,000 characters) preserving study objectives, endpoints, phase, and study director metadata for fast LLM/MCP context windows.
- **Pure HTTP/2 Architecture**: ClinicalTrials.gov v2, EU EMA CTIS, EU CORDIS, and US NIH RePORTER APIs operate over pure HTTP/2 with zero proxy overhead by default.
- **Statutory Disclosure & Impressum Crawler**: In `enriched_with_email` mode, crawls corporate `/impressum`, `/mentions-legales`, `/kontakt`, and `/contact` pages across the US and Europe.

#### Ready-to-Copy Integration Recipes

##### 1. Scheduled Monday Delta Monitoring (`onlyNewSignals: true` + `commercialSponsorsOnly: true`)

```json
{
  "signalSources": ["clinicaltrials_us", "eu_ctis", "eu_cordis", "nih_sbir"],
  "countries": ["US", "UK", "DE", "FR"],
  "keywords": ["oncology", "immunotherapy", "AI"],
  "phases": ["PHASE1", "PHASE2", "PHASE3"],
  "commercialSponsorsOnly": true,
  "minSignalYear": 2025,
  "postedWithinDays": 180,
  "onlyNewSignals": true,
  "monitorScopeName": "weekly-biotech-clinical-signals",
  "scraperMode": "enriched_with_email",
  "blacklistDomains": ["academic-partner.edu", "competitor.com"],
  "maxItems": 100
}
```

##### 2. Clay HTTP API Column Setup (`POST run-sync-get-dataset-items`)

Import live biotech clinical trial and R\&D grant signals directly into Clay:

- **Method:** `POST`
- **URL:** `https://api.apify.com/v2/acts/aperture~biotech-clinical-trial-buying-signal-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN&maxTotalChargeUsd=5.00`
- **Headers:** `Content-Type: application/json`
- **Body:**

```json
{
  "signalSources": ["clinicaltrials_us", "eu_ctis", "eu_cordis", "nih_sbir"],
  "countries": ["US", "DE", "FR"],
  "keywords": ["biomarker", "oncology"],
  "phases": ["PHASE1", "PHASE2"],
  "commercialSponsorsOnly": true,
  "minSignalYear": 2025,
  "postedWithinDays": 180,
  "scraperMode": "enriched_with_email",
  "maxItems": 25
}
```

##### 3. Claude Desktop MCP Server Configuration (`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"
      }
    }
  }
}
```

##### 4. Bytewells HTTP 402 Agentic Auto-Buy Configuration (`x402` / Bytewells MCP)

```json
{
  "mcpServers": {
    "bytewells": {
      "command": "npx",
      "args": ["-y", "@bytewells/mcp-server", "--rental-pass", "YOUR_BYTEWELLS_PASS"],
      "env": {
        "BYTEWELLS_API_KEY": "YOUR_BYTEWELLS_API_KEY"
      }
    }
  }
}
```

#### JSON Sample Output

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

```json
[
  {
    "detected_at": "2026-11-02T00:00:00Z",
    "company": "Example Therapeutics Inc.",
    "domain": "example-bio.com",
    "role_title": "Clinical Trial Sponsor (PHASE1): Study Director",
    "seniority_band": "director",
    "location": "Boston, MA, US",
    "geo": "US",
    "posted_date": "2026-10-28T00:00:00Z",
    "signal_type": "clinical_trial",
    "signal_detail": "Clinical Trial [NCT05980000 / CTIS 2023-500000-00-00] (Phase 1): Oncology Study — Sponsor: Example Therapeutics Inc.",
    "signal_source_actor": "biotech-clinical-trial-buying-signal-scraper",
    "signal_date": "2026-10-28",
    "evidence_url": "https://clinicaltrials.gov/study/NCT05980000",
    "contact_name": "Sarah Chen",
    "contact_title": "VP Clinical Development",
    "contact_email": "sarah.chen@example-bio.com",
    "contact_phone": "+1 617 555 0100",
    "salary_band": "",
    "contract_type": "Clinical Trial PHASE1",
    "email_verification_status": "ok",
    "mx_provider": "Microsoft 365",
    "ppe_event_charged": "buying-signal-enriched",
    "notes": "source=eu_ctis+clinicaltrials_us; nct=NCT05980000; ctis=2023-500000-00-00",
    "error": null
  },
  {
    "detected_at": "2026-11-02T00:01:15Z",
    "company": "Example Biosystems SAS",
    "domain": "example-bio.fr",
    "role_title": "Horizon Europe Grantee: Organ-on-a-Chip",
    "seniority_band": "director",
    "location": "Lyon, France",
    "geo": "FR",
    "posted_date": "2026-10-30T14:00:00Z",
    "signal_type": "research_grant",
    "signal_detail": "Grant: EU CORDIS Horizon Europe Organ-on-a-Chip [€2,499,831 EUR] — Coordinator: Example Biosystems SAS",
    "signal_source_actor": "biotech-clinical-trial-buying-signal-scraper",
    "signal_date": "2026-10-30",
    "evidence_url": "https://cordis.europa.eu/project/id/953184",
    "contact_name": null,
    "contact_title": null,
    "contact_email": "info@example-bio.fr",
    "contact_phone": "+33 4 72 00 00 00",
    "salary_band": "€2,499,831 EUR",
    "contract_type": "Horizon Europe Grant",
    "email_verification_status": "role_fallback",
    "mx_provider": "Google Workspace",
    "ppe_event_charged": "job-signal-scraped",
    "notes": "source=cordis; project=953184; verify=mx_fingerprinted_mentions_legales",
    "error": null
  },
  {
    "detected_at": "2026-11-02T00:02:00Z",
    "company": "Example Diagnostics Ltd",
    "domain": "example-dx.com",
    "role_title": "Clinical Trial Sponsor (PHASE2)",
    "seniority_band": "manager",
    "location": "Cambridge, UK",
    "geo": "UK",
    "posted_date": "2026-10-25T11:00:00Z",
    "signal_type": "clinical_trial",
    "signal_detail": "Clinical Trial [NCT05980001] (Phase 2): Point-of-Care Diagnostic Evaluation",
    "signal_source_actor": "biotech-clinical-trial-buying-signal-scraper",
    "signal_date": "2026-10-25",
    "evidence_url": "https://clinicaltrials.gov/study/NCT05980001",
    "contact_name": null,
    "contact_title": null,
    "contact_email": "contact@example-dx.com",
    "contact_phone": "+44 1223 000000",
    "salary_band": "",
    "contract_type": "Clinical Trial PHASE2",
    "email_verification_status": "role_fallback",
    "mx_provider": "Microsoft 365",
    "ppe_event_charged": "job-signal-scraped",
    "notes": "source=clinicaltrials_us; verify=mx_fingerprinted_contact",
    "error": null
  }
]
```

#### Regulatory, Public Registry Data & GDPR Compliance

This Actor extracts publicly disclosed clinical trial protocols and public research grant awards published pursuant to statutory open-science transparency directives (US FDA Modernization Act 42 U.S.C. 282, EU Clinical Trials Regulation EU No 536/2014, EU CORDIS Open Science Framework, and NIH Public Access Policy). Commercial entities sponsoring clinical trials and accepting public R\&D grants are matters of public regulatory record. When processing contact details under GDPR / UK GDPR or CAN-SPAM, ensure you establish legitimate interest for B2B commercial communications.

</details>

# Actor input Schema

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

Optional keywords to filter clinical trials or R\&D grants (e.g., \['oncology', 'immunotherapy', 'AI', 'biomarker', 'cell therapy']). Leave empty to stream the latest commercial trials and grants.

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

Select target ISO country codes for clinical trial sponsors and grant recipients.

## `commercialSponsorsOnly` (type: `boolean`):

When enabled (default), drops academic, university, and hospital-sponsored trials before domain resolution or PPE charging.

## `phases` (type: `array`):

Optional clinical trial phases to target (e.g., \['PHASE1', 'PHASE2', 'PHASE3', 'PHASE4']).

## `minSignalYear` (type: `integer`):

Hard pre-charge recency floor (default 2025). Any clinical trial or R\&D grant with a study first-post date, start date, decision date, or award date earlier than minSignalYear is dropped at $0.00 before domain resolution or PPE charging.

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

Filter clinical trials first posted or grants awarded within the last N days (default 180 days, floored at minSignalYear-01-01).

## `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.

## `includeFullAbstract` (type: `boolean`):

Default false keeps payloads compact (<2,000 chars) for fast LLM/MCP context windows. Enable to include full CORDIS/NIH project objective abstracts.

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

Select which public life-sciences & grant registries to query: 'clinicaltrials_us' (US ClinicalTrials.gov API v2 INDUSTRY sponsors), 'eu_ctis' (EU EMA Clinical Trials Information System), 'eu_cordis' (EU CORDIS Horizon Europe / EIC grants), and 'nih_sbir' (US NIH RePORTER SBIR/STTR commercial awards).

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

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

## `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 sponsor names to skip at $0 before enrichment and PPE charging.

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

Case-insensitive keywords matched against sponsor/company 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).

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

When enabled, persists seen NCT/CTIS/CORDIS/NIH identifiers 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`):

ClinicalTrials.gov v2, EU EMA CTIS, EU CORDIS, and US NIH RePORTER APIs 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": [
    "oncology",
    "immunotherapy",
    "biomarker"
  ],
  "countries": [
    "US",
    "UK",
    "DE",
    "FR"
  ],
  "commercialSponsorsOnly": true,
  "phases": [
    "PHASE1",
    "PHASE2",
    "PHASE3"
  ],
  "minSignalYear": 2025,
  "postedWithinDays": 180,
  "maxItems": 20,
  "includeFullAbstract": false,
  "signalSources": [
    "clinicaltrials_us",
    "eu_ctis",
    "eu_cordis",
    "nih_sbir"
  ],
  "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-biotech.com"
  ],
  "excludeCompanyKeywords": [
    "University",
    "Hospital",
    "CHU",
    "Universitätsklinikum"
  ],
  "excludeLocations": [
    "Academic Medical Center"
  ],
  "onlyNewSignals": false,
  "monitorScopeName": "buying-signal-dedup-store",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Dataset containing normalized US ClinicalTrials.gov v2, EU EMA CTIS, EU CORDIS Horizon Europe, and US NIH RePORTER SBIR/STTR buying signals with resolved corporate 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": [
        "oncology",
        "immunotherapy",
        "biomarker"
    ],
    "countries": [
        "US",
        "UK",
        "DE",
        "FR"
    ],
    "phases": [
        "PHASE1",
        "PHASE2",
        "PHASE3"
    ],
    "minSignalYear": 2025,
    "postedWithinDays": 180,
    "maxItems": 20,
    "signalSources": [
        "clinicaltrials_us",
        "eu_ctis",
        "eu_cordis",
        "nih_sbir"
    ],
    "scraperMode": "enriched_with_email",
    "icpScoringPreset": "b2b_saas_cyber_tech",
    "icpBoostKeywords": [
        "cybersecurity",
        "cloud",
        "enterprise"
    ],
    "blacklistDomains": [
        "competitor-biotech.com"
    ],
    "excludeCompanyKeywords": [
        "University",
        "Hospital",
        "CHU",
        "Universitätsklinikum"
    ],
    "excludeLocations": [
        "Academic Medical Center"
    ],
    "monitorScopeName": "buying-signal-dedup-store"
};

// Run the Actor and wait for it to finish
const run = await client.actor("aperture/biotech-clinical-trial-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": [
        "oncology",
        "immunotherapy",
        "biomarker",
    ],
    "countries": [
        "US",
        "UK",
        "DE",
        "FR",
    ],
    "phases": [
        "PHASE1",
        "PHASE2",
        "PHASE3",
    ],
    "minSignalYear": 2025,
    "postedWithinDays": 180,
    "maxItems": 20,
    "signalSources": [
        "clinicaltrials_us",
        "eu_ctis",
        "eu_cordis",
        "nih_sbir",
    ],
    "scraperMode": "enriched_with_email",
    "icpScoringPreset": "b2b_saas_cyber_tech",
    "icpBoostKeywords": [
        "cybersecurity",
        "cloud",
        "enterprise",
    ],
    "blacklistDomains": ["competitor-biotech.com"],
    "excludeCompanyKeywords": [
        "University",
        "Hospital",
        "CHU",
        "Universitätsklinikum",
    ],
    "excludeLocations": ["Academic Medical Center"],
    "monitorScopeName": "buying-signal-dedup-store",
}

# Run the Actor and wait for it to finish
run = client.actor("aperture/biotech-clinical-trial-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": [
    "oncology",
    "immunotherapy",
    "biomarker"
  ],
  "countries": [
    "US",
    "UK",
    "DE",
    "FR"
  ],
  "phases": [
    "PHASE1",
    "PHASE2",
    "PHASE3"
  ],
  "minSignalYear": 2025,
  "postedWithinDays": 180,
  "maxItems": 20,
  "signalSources": [
    "clinicaltrials_us",
    "eu_ctis",
    "eu_cordis",
    "nih_sbir"
  ],
  "scraperMode": "enriched_with_email",
  "icpScoringPreset": "b2b_saas_cyber_tech",
  "icpBoostKeywords": [
    "cybersecurity",
    "cloud",
    "enterprise"
  ],
  "blacklistDomains": [
    "competitor-biotech.com"
  ],
  "excludeCompanyKeywords": [
    "University",
    "Hospital",
    "CHU",
    "Universitätsklinikum"
  ],
  "excludeLocations": [
    "Academic Medical Center"
  ],
  "monitorScopeName": "buying-signal-dedup-store"
}' |
apify call aperture/biotech-clinical-trial-buying-signal-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,aperture/biotech-clinical-trial-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/WRg36MK6xCFrciz1y/builds/8c5WcYO7f5udw8Olk/openapi.json
