# SEC EDGAR · Pharma Licensing Deals · By Company List (`corent1robert/sec-edgar-licensing-deals-scraper`) Actor

Export pharma/biotech licensing, collaboration and M\&A exhibits from SEC EDGAR. Paste tickers or use the built-in top list — company, filing, exhibit title, document URL. No API key

- **URL**: https://apify.com/corent1robert/sec-edgar-licensing-deals-scraper.md
- **Developed by:** [Corentin Robert](https://apify.com/corent1robert) (community)
- **Categories:** Developer tools, Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$10.00 / 1,000 deal exhibit exporteds

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## SEC EDGAR · Pharma Licensing Deals Scraper

Export **licensing, collaboration, and M\&A exhibits** for pharma / biotech companies from the U.S. SEC EDGAR archive — company, partner, deal type, dates, financial hints, and direct document links.

**No login. No API key. No EDGAR account.**

### Who is this for?

| You are… | Typical goal | Suggested setup |
|----------|--------------|-----------------|
| Biotech BD / competitive intel | Track peer licensing and collabs | Paste tickers · 8-K + 10-K |
| Equity / sell-side research | Deal appendix with SEC sources | Your tickers · `dateFrom` last 5–10y |
| Academic / student project | Public deal corpus | Paste a universe · Excel/CSV export |
| Data / ops | Recurring universe refresh | Same company list on a Schedule |
| Partnering / outbound teams | Who signed with whom | Research export view + document URLs |

**What you get by default** — one row per filtered deal exhibit: company identity, partner, deal type, signing/announcement dates, financial hints when disclosed, territory flags when stated, SEC document URL.

**Honest coverage** — only SEC registrants appear. Some foreign ADR / Level-I issuers resolve on EDGAR but have **no licensing exhibit stream** (F-6 / ownership only). Financial terms are often redacted (`[***]`).

### Quick start

1. Open the Actor in Apify Console.
2. Paste tickers in **Companies** (e.g. `PFE`, `BMY`, `ZLAB`).
3. Optionally set a date window and **Max deal rows** for a first test.
4. Click **Start** → open the **Overview** dataset view → Export Excel/CSV.

### Ready-made examples (published tasks)

| Example | Best for |
|---------|----------|
| Top US big pharma smoke test | First run / QA |
| China / Asia ADRs in the list | Asia focus |
| Single ticker deep history | One-company research |
| Research export columns | Spreadsheet handoff |

*(Publish the four tasks in Console to activate Store Examples URLs.)*

### What it extracts

| Category | Fields |
|----------|--------|
| Company | `company_name`, `ticker`, `cik`, `country`, `former_names` |
| Deal identity | `deal_id`, `deal_family_id`, `deal_type`, `is_amendment`, `partner` |
| Dates | `signing_date`, `effective_date`, `closing_date`, `announcement_date` (≈ filing date), `filing_date` |
| Economics | `upfront`, `milestones`, `royalties`, `total_deal_value`, `currency`, `financials_redacted` |
| Rights | `exclusive`, `co_commercialization`, `option_to_license`, `worldwide_rights`, `china_rights`, `us_rights`, `eu_rights`, `japan_rights` |
| Science hints | `asset_hint`, `therapeutic_area`, `clinical_phase`, `modality` (sparse — often absent from exhibits) |
| Source | `filing_form`, `exhibit_type`, `exhibit_title`, `document_url`, `index_url`, `source` |

### Important / limitations

- Only **SEC registrants** appear (U.S. filers and foreign issuers via 20-F / 6-K / ADRs). Pure home-market listings with no EDGAR footprint are skipped or return zero deals.
- Manual CIK map for common OTC ADRs (Roche→Genentech, Daiichi, Bayer, etc.) and keeps **Merck Group (KGaA) ≠ Merck & Co**.
- Dollar amounts are frequently **redacted** under confidential treatment.
- Product / phase / modality fields are **best-effort** and often empty — exhibit titles rarely carry full scientific detail.
- Employment, lease, credit-facility and stock-plan exhibits are filtered when deal-keyword filtering is ON.
- Respect SEC fair-access rules (identify with a User-Agent email; ~10 requests/second). The Actor throttles automatically.

### Input

| Field | Type | Default | Notes |
|-------|------|---------|-------|
| `companies` | string\[] | — | **Required.** Tickers or `Name\|TICKER\|Country` |
| `forms` | string\[] | 8-K, 10-K, 10-Q, 20-F, 6-K, … | Filing types to open |
| `dateFrom` / `dateTo` | date | — | YYYY-MM-DD |
| `maxFilingsPerCompany` | integer | `120` | Newest first; `0` = all |
| `maxDeals` | integer | `0` | Row ceiling; `0` = no cap |
| `requireDealKeywords` | boolean | `false` | ON = stricter license/collab/M\&A titles only |
| `peekExhibitTitles` | boolean | `true` | Read document head when title thin |
| `harvestExhibitIndex` | boolean | `true` | Item 15 exhibit list |
| `resolveIncorporated` | boolean | `true` | Follow incorporated-by-reference |
| `dedupeMode` | string | `keep_base_and_latest` | Amendment grouping |
| `extractFields` | boolean | `true` | Partner / dates / financials / rights |
| `asiaRelatedOnly` | boolean | `false` | Keep Asia-flagged rows only |

**API-only** (omit from Console — pass via JSON / API):

| Field | Default | Notes |
|-------|---------|-------|
| `writeLocalCsv` | `true` locally | Write `output.csv` outside cloud |
| `useDefaultCompanies` | `false` | Opt-in curated ~35 list when `companies` empty (API only) |
| `maxCompanies` | `0` | Cap company count (`0` = all) — API only |
| `writeFilingsInventory` | `true` locally | Progressive `archive/filings.csv` |
| `downloadDealDocuments` | `true` locally | Save exhibits under `archive/documents/{TICKER}/` |
| `appendArchive` / `archiveDir` | — | Catch-up / custom archive folder |
| `llmApiKey` / `llmModel` / `llmBaseUrl` | — | Optional OpenAI-compatible field refinement |
| `userAgent` | built-in | Override SEC contact User-Agent |
| `verboseLogs` | `false` | Extra debug lines |
| `proxyConfiguration` | Apify proxy on cloud | Rarely needed for EDGAR |

#### Example input

```json
{
  "useDefaultCompanies": false,
  "companies": ["PFE", "BMY", "ZLAB"],
  "dateFrom": "2020-01-01",
  "maxFilingsPerCompany": 80,
  "requireDealKeywords": true,
  "peekExhibitTitles": true,
  "extractFields": true
}
```

### How it works

1. Load the SEC company ticker directory (+ manual CIK map for OTC ADRs).
2. Resolve each input company to a CIK.
3. Download the registrant’s submissions history (including paginated archives).
4. Optionally harvest 10-K Item 15 and resolve incorporated-by-reference exhibits.
5. Scan filing indexes for EX-10 / EX-2 / EX-99 deal-like exhibits.
6. Deduplicate amendment chains; extract structured fields heuristically.
7. Push one dataset row per kept deal (+ optional local archive).

### Output sample

```json
{
  "deal_id": "0000078003-0000078003-24-000123-EX-10.1-3",
  "company_name": "PFIZER INC",
  "ticker": "PFE",
  "cik": "0000078003",
  "partner": "BioNTech SE",
  "deal_type": "collaboration",
  "signing_date": "2020-03-17",
  "announcement_date": "2020-03-20",
  "filing_form": "8-K",
  "filing_date": "2020-03-20",
  "exhibit_type": "EX-10.1",
  "exhibit_title": "Collaboration Agreement",
  "document_url": "https://www.sec.gov/Archives/edgar/data/78003/…/ex101.htm",
  "financials_redacted": true,
  "asia_related": false,
  "match_reason": "keyword_match"
}
```

### How much does it cost to scrape SEC EDGAR deals?

Pay-per-event (PPE) — HTTP-only, no residential proxy required. List prices (FREE tier):

| Event | FREE | Bronze | Silver | Gold | Platinum / Diamond |
|-------|------|--------|--------|------|--------------------|
| Actor start | **Free** | Free | Free | Free | Free |
| Deal exhibit row | $0.02 | $0.018 | $0.015 | $0.012 | $0.01 |

| Scenario | Deals | FREE tier total (rows only) |
|----------|------:|----------------------------:|
| Smoke test (2–3 companies) | ~30 | **~$0.60** |
| Mid run (10 companies) | ~150 | **~$3.00** |
| Full custom list (~35 tickers) | ~500 | **~$10.00** |
| 1,000 deal rows | 1,000 | **~$20.00** |

Apify platform compute is separate and usually small on this Actor (no browser). Full-history runs on large filers can take longer — use `dateFrom` / `maxFilingsPerCompany` for cheaper tests.

### Is it legal to scrape SEC EDGAR?

This Actor only accesses data the SEC makes **publicly available** under its fair-access policy (identify yourself with a User-Agent; stay under the published rate guidance). As with any dataset that may include personal names inside contracts, ensure your use complies with applicable law (including GDPR where relevant).

### Local development

```bash
cd sec-edgar-licensing-deals-scraper
npm install
npm test
apify run --input-file=./input.json
```

- Default KV input: `.actor/INPUT.json` (Console Try mirror).
- Repo `input.json` merges when not on cloud (KV/CLI overrides).
- Results: `storage/datasets/default/`, local `output.csv`, optional `archive/` (filings + deals + documents).

### Support

Contact <corentin@outreacher.fr> if you need a custom SEC pipeline (deeper field extraction, schedules, private universes).

### Related Actors

These Actors cover the same job or the next step in the workflow. Apify’s automatic recommendations stay inside one category — this list is the rest of the toolkit.

| Actor | Use it when |
|---|---|
| [Doctolib Practitioner Scraper](https://apify.com/corent1robert/doctolib-practitioner-scraper) | Doctolib practitioner directory |
| [Drhouse Conseillers Scraper](https://apify.com/corent1robert/drhouse-conseillers-scraper) | Drhouse Conseillers Scraper |
| [Fhf Annuaire Scraper](https://apify.com/corent1robert/fhf-annuaire-scraper) | Fhf Annuaire Scraper |
| [International Schools Scraper · Export Fees, CV & Contacts](https://apify.com/corent1robert/international-schools-database-scraper) | International Schools Scraper |
| [local.ch scraper · Swiss business directory & local leads](https://apify.com/corent1robert/local-ch-scraper) | local.ch scraper |
| [OneDoc.ch scraper · Swiss dentists, doctors & healthcare leads](https://apify.com/corent1robert/onedoc-dentist-scraper) | OneDoc.ch scraper |
| [French Companies · Search & SIREN Enrich](https://apify.com/corent1robert/recherche-entreprises-scraper) | French companies: search and SIREN enrich |
| [SW Website Rankings Scraper](https://apify.com/corent1robert/similarweb-scraper) | Rank the website / domain after you have the URL |

# Actor input Schema

## `companies` (type: `array`):

One ticker or name per line. Formats: `PFE` · `Pfizer` · `Pfizer|PFE`.

## `dateFrom` (type: `string`):

Only filings on or after this date (YYYY-MM-DD). Empty = no lower bound.

## `dateTo` (type: `string`):

Only filings on or before this date (YYYY-MM-DD). Empty = no upper bound.

## `maxFilingsPerCompany` (type: `integer`):

Newest filings first. 40 is a good first-run default. 0 = full history in the date window.

## `maxDeals` (type: `integer`):

Stop after this many deal rows. Handy for tests. 0 = no row ceiling.

## `forms` (type: `array`):

SEC forms to open. 8-K = new deals; 10-K / 10-Q = material contracts; 20-F / 6-K = foreign issuers.

## `requireDealKeywords` (type: `boolean`):

ON: only license / collaboration / M\&A-style titles. OFF: keep EX-10 / EX-2 / EX-99 except employment, leases, credit facilities and stock plans.

## `peekExhibitTitles` (type: `boolean`):

When the filing index only says EX-10.3, read the document head to recover “License Agreement …”. More accurate.

## `harvestExhibitIndex` (type: `boolean`):

Richest source of historical contracts (titles, partners, dates), including incorporated-by-reference deals.

## `resolveIncorporated` (type: `boolean`):

Resolve Item 15 references to the original exhibit URL so you get a real document link.

## `extractFields` (type: `boolean`):

Fill partner, signing/effective dates, upfront/milestones/royalties when disclosed (marks redacted when \[\*\*\*]).

## `dedupeMode` (type: `string`):

Group amendments of the same underlying deal into one family.

## `asiaRelatedOnly` (type: `boolean`):

Keep rows that mention China, Japan, Korea or broader Asia (or company HQ).

## `includePressExhibits` (type: `boolean`):

OFF by default — press releases often mention deals without being the contract.

## Actor input object example

```json
{
  "companies": [
    "PFE",
    "BMY",
    "REGN"
  ],
  "maxFilingsPerCompany": 40,
  "maxDeals": 50,
  "forms": [
    "8-K",
    "8-K/A",
    "10-K",
    "10-K/A",
    "10-Q",
    "6-K",
    "S-4"
  ],
  "requireDealKeywords": false,
  "peekExhibitTitles": true,
  "harvestExhibitIndex": true,
  "resolveIncorporated": true,
  "extractFields": true,
  "dedupeMode": "keep_base_and_latest",
  "asiaRelatedOnly": false,
  "includePressExhibits": false
}
```

# Actor output Schema

## `deals` (type: `string`):

One row per filtered exhibit (license, collaboration, M\&A, …).

## `overview` (type: `string`):

Slim columns for quick review.

## `outreachCrm` (type: `string`):

Company + title + URL columns for research tables.

## `runLog` (type: `string`):

Plain-text run log.

# 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 = {
    "companies": [
        "PFE",
        "BMY",
        "REGN"
    ],
    "maxFilingsPerCompany": 40,
    "maxDeals": 50,
    "forms": [
        "8-K",
        "8-K/A",
        "10-K",
        "10-K/A",
        "10-Q",
        "6-K",
        "S-4"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("corent1robert/sec-edgar-licensing-deals-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 = {
    "companies": [
        "PFE",
        "BMY",
        "REGN",
    ],
    "maxFilingsPerCompany": 40,
    "maxDeals": 50,
    "forms": [
        "8-K",
        "8-K/A",
        "10-K",
        "10-K/A",
        "10-Q",
        "6-K",
        "S-4",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("corent1robert/sec-edgar-licensing-deals-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 '{
  "companies": [
    "PFE",
    "BMY",
    "REGN"
  ],
  "maxFilingsPerCompany": 40,
  "maxDeals": 50,
  "forms": [
    "8-K",
    "8-K/A",
    "10-K",
    "10-K/A",
    "10-Q",
    "6-K",
    "S-4"
  ]
}' |
apify call corent1robert/sec-edgar-licensing-deals-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,corent1robert/sec-edgar-licensing-deals-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/KFcOxRnTFdKYBBxL3/builds/sD9eVt0iaoCO7ZXFq/openapi.json
