# USPTO Patent + Trademark Intel - Citations, Co-Assignees (`seibs.co/uspto-patent-intel`) Actor

USPTO patent + trademark intelligence. Co-assignee mapping (partnerships/M\&A intel), CPC tech-cluster analysis, inventor mobility, expiration calendar, family/citation graph, trademark watch. For IP law, R\&D, competitive intel, VC due diligence.

- **URL**: https://apify.com/seibs.co/uspto-patent-intel.md
- **Developed by:** [Seibs.co](https://apify.com/seibs.co) (community)
- **Categories:** Business, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 patent records

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## USPTO Patent + Trademark Intel

USPTO intelligence in eight modes - co-assignee mapping, CPC tech-cluster trends, inventor mobility, expiration calendar, family + citation graphs, trademark watch.

### What does USPTO Patent + Trademark Intel do?

It wraps the free PatentsView API and the keyless TSDR trademark API in eight purpose-built modes that pre-compute the relational intelligence buried in 12M+ patents and millions of trademark filings - co-assignee partnerships (M&A / JV signal), inventor mobility (talent flow), CPC tech-cluster YoY growth, expiration calendars, family and citation graphs, and Nice-class trademark watch.

### Features

- Co-assignee mapping - every co-owner pair across an assignee's filings, with joint patent count and sample patents.
- Tech-cluster analysis - YoY filing growth per CPC code with top assignees and top inventors.
- Inventor mobility - per-inventor assignee history with date ranges and patent counts.
- Expiration calendar - patents expiring inside a configurable window, sorted soonest-first.
- Family lookup - continuations, divisionals, CIPs, foreign equivalents, reissues.
- Citation analysis - forward + backward citation samples per patent.
- Trademark watch - keyword + Nice-class search with applicant, attorney, status, goods/services.
- Patent search - keyword / assignee / inventor / CPC search returning flat patent records.

### Use cases

- IP law firms - competitive landscape briefs, prior-art mapping, freedom-to-operate analyses.
- R&D teams - tracking what competitors are building and with whom.
- VC and corp dev - tech due diligence and acquisition-target spotting via co-assignment graphs.
- Pharma / generics - patent cliff calendar for branded drug expirations.
- Talent intel - inventor mobility flags engineering moves before press releases.
- Brand protection - daily trademark watch in target Nice classes.

### FAQ

**Q: Is this legal?**
A: Yes. USPTO patent and trademark records are public by statute. PatentsView, USPTO PEDS, and the USPTO TSDR / TESS systems are all official US-government public-data interfaces. No login is required to read this data.

**Q: Do I need a PatentsView API key?**
A: Yes. PatentsView (the high-quality bulk patent API the actor uses) requires a free API key. Sign up at https://patentsview.org/apis/keyrequest and the key is issued within minutes. Trademark modes use the USPTO's open TSDR endpoints which do not require a key.

**Q: Why might a run fail?**
A: The three most common failure modes are (1) missing or invalid PatentsView API key, (2) PatentsView rate limits (45 requests/minute per key - the actor auto-throttles but very wide assignee searches can still trip it), and (3) overly broad CPC + keyword combinations that exceed PatentsView's 100,000-record-per-query cap - narrow the date window or split by assignee.

**Q: How fresh is the data?**
A: PatentsView refreshes weekly with USPTO grant publications. Trademark TSDR is real-time. Inventor mobility, co-assignee, and tech-cluster modes are computed on the freshest available PatentsView snapshot at run time.

**Q: Can I schedule this daily or weekly?**
A: Yes. Weekly cron aligns with PatentsView's refresh cadence for patent modes. Daily cron makes sense for trademark watch (TSDR updates daily). Quarterly is appropriate for tech-cluster and expiration-calendar landscape briefs. Apify Schedules + dedupe on `patent_number` or `serial_number` gives clean deltas.

**Q: Does it integrate with my CRM or data tooling?**
A: Yes. Apify webhooks POST every run to HubSpot, Salesforce, Pipedrive, Apollo, or any HTTP endpoint. Zapier, Make.com, and n8n templates available. Dataset exports as JSON / CSV / Excel / XML for IP-management systems (Anaqua, CPA Global, Patsnap) or BI tools.

**Q: How does pricing work?**
A: PAY_PER_EVENT. You pay per patent / trademark record emitted, with surcharges on the analytical rollups (co-assignee maps, tech-cluster analyses, inventor-mobility timelines). You only pay for what the actor actually emits.

### Related Actors

- [sec-edgar-intel](https://apify.com/) - cross-reference patent assignees against SEC filings (8-K M&A activity, 13F position changes) to spot IP-driven acquisitions before they're announced.
- [court-records-intel](https://apify.com/) - pull every patent litigation case (E.D. Tex., D. Del., N.D. Cal.) for a given assignee to surface ongoing IP disputes.
- [b2b-sales-triggers](https://apify.com/) - convert new patent filings, trademark registrations, and inventor-mobility moves into outbound sales triggers.

### Integrations

- Zapier - push to HubSpot/Salesforce/Pipedrive/Apollo
- Make.com - workflow automation
- n8n - self-hosted automation
- Apify webhooks - POST to your endpoint
- API + dataset export (JSON/CSV/Excel/XML)
- MCP / AI agents - call from Claude/GPT/LangChain

### Modes

| Mode | Input | Output |
|---|---|---|
| `patent_search` | keywords, assignees, inventors, CPC | flat patent records |
| `trademark_search` | keywords, Nice classes, applicants | flat trademark records |
| `co_assignee_mapping` | assignees | every co-owner pair + joint patent count + sample |
| `tech_cluster_analysis` | CPC codes or assignees | top CPC clusters, top assignees, top inventors, YoY growth |
| `inventor_mobility` | inventor names | per-inventor assignee history with date ranges |
| `expiration_calendar` | assignees + CPC codes + window months | patents expiring inside the window, sorted soonest-first |
| `family_lookup` | patent numbers | continuations, divisionals, CIPs, foreign equivalents |
| `citation_analysis` | patent numbers | forward + backward citation samples |

### Input

See `.actor/INPUT_SCHEMA.json`. Sample - find Apple's co-assignment partners since 2018:

```json
{
    "mode": "co_assignee_mapping",
    "patentsview_api_key": "YOUR_KEY",
    "assignees": ["Apple Inc."],
    "date_from": "2018-01-01",
    "max_results": 1000
}
````

Pharma patent cliff for the next 18 months:

```json
{
    "mode": "expiration_calendar",
    "patentsview_api_key": "YOUR_KEY",
    "cpc_classes": ["A61K"],
    "expiration_window_months": 18,
    "max_results": 1000
}
```

### Output

**Sample output:** [`.actor/sample-output.json`](./.actor/sample-output.json) — copy-paste-ready preview of real-looking records.

First record inline:

```json
{
  "mode": "patent_search",
  "scraped_at": "2026-05-13T21:30:08Z",
  "available": true,
  "reason": null,
  "patent_number": "11,884,221",
  "patent_id": "11884221",
  "title": "Adaptive battery thermal management system for EV powertrain",
  "abstract": "An adaptive battery thermal management system that dynamically reroutes coolant flow across battery modules based on per-cell temperature delta and predicted load profile from inverter telemetry...",
  "filing_date": "2022-08-14",
  "grant_date": "2026-04-30",
  "publication_date": "2024-02-22",
  "expiration_date": "2042-08-14",
  "days_to_expiration": 5934,
  "status": "active",
  "assignees": [
    {
      "name": "Lucid Group, Inc.",
      "country": "US",
      "type": "US company"
    }
  ],
  "inventors": [
    {
      "name": "Sara Khoury",
      "location": "Newark, CA, US"
    },
    {
      "name": "Devraj Krishnan",
      "location": "Mountain View, CA, US"
    },
    {
      "name": "Thomas A. Whitlock",
      "location": "San Jose, CA, US"
    }
  ],
  "cpc_codes": [
    {
      "code": "H01M10/63",
      "description": "Cooling means specially adapted for batteries",
      "primary": true
    },
    {
      "code": "B60L58/26",
      "description": "Cooling devices for traction batteries",
      "primary": false
    }
  ],
  "ipc_codes": [
    "H01M10/63",
    "B60L58/26"
  ],
  "application_number": "17/887,142",
  "examiner_name": "Sun, Eugenia",
  "claims_count": 22,
  "independent_claims_count": 3,
  "family_id": "F2208140001",
  "family_members": [
    {
      "patent_number": "EP4408888A1",
      "country": "EP",
      "kind_code": "A1",
      "relation": "foreign-equivalent"
    },
    {
      "patent_number": "CN117220444A",
      "country": "CN",
      "kind_code": "A",
      "relation": "foreign-equivalent"
    }
  ],
  "forward_citations": {
    "count": 4,
    "sample": [
      {
        "patent_number": "12,002,118",
        "assignee": "Rivian Automotive LLC",
        "cited_date": "2026-03-12"
      }
    ]
  },
  "backward_citations": {
    "count": 38,
    "sample": [
      {
        "patent_number": "10,541,448",
        "assignee": "Tesla, Inc.",
        "cited_date": "2020-01-21"
      }
    ]
  },
  "serial_number": null,
  "registration_number": null,
  "mark_text": null,
  "mark_image_url": null,
  "status_code": null,
  "status_date": null,
  "registration_date": null,
  "applicant_name": null,
  "applicant_address": null,
  "attorney_name": null,
  "classes": [],
  "goods_services_description": null,
  "co_assignee_pair": null,
  "inventor_mobility": null,
  "tech_cluster": null
}
```

One record per patent / trademark / intelligence aggregation. Sample patent record:

```json
{
    "mode": "patent_search",
    "patent_number": "11,000,000",
    "title": "Method and apparatus for ...",
    "filing_date": "2018-06-12",
    "grant_date": "2021-05-11",
    "expiration_date": "2038-06-12",
    "days_to_expiration": 4412,
    "status": "active",
    "assignees": [{"name": "Apple Inc.", "country": "US", "type": "US company"}],
    "inventors": [{"name": "Jane Doe", "location": "Cupertino, CA, US"}],
    "cpc_codes": [{"code": "G06F1/3231", "primary": true}],
    "claims_count": 24,
    "available": true,
    "scraped_at": "2026-05-14T12:00:00Z"
}
```

Failed lookups still emit a row with `available: false` and a `reason`.

### Pricing

Pay-per-event:

| Event | Price |
|---|---|
| `patent_record` | $0.004 |
| `trademark_record` | $0.004 |
| `citation_enrichment` (per patent) | $0.005 |
| `family_lookup` (per patent) | $0.005 |
| `intelligence_record` (co-assignee pair / inventor profile / cluster) | $0.012 |

Intelligence aggregations cost more because each row is built from multiple PatentsView queries.

### FAQ

**Q: Do I need an API key?**
A: PatentsView is free but key-gated - get one at https://patentsview.org. Paste it into `patentsview_api_key`. TSDR (trademarks) is keyless.

**Q: What's the rate limit?**
A: PatentsView allows 1000 req/min; the actor stays well below this for any realistic run size.

**Q: How is `expiration_date` computed?**
A: Estimated as `filing_date + 20 years` for utility patents. Maintenance-fee lapses, terminal disclaimers, and design-patent terms are not modeled - treat the date as a directional planning input.

**Q: Why doesn't `tech_cluster_analysis` return YoY growth on every CPC?**
A: YoY growth requires at least two years of filings inside the cluster. Sparse clusters return `yoy_growth_pct: null`.

### Support

Open an issue on the actor's GitHub or contact via Apify Store. Include the run ID and input config.

### Changelog

See [CHANGELOG.md](./CHANGELOG.md).

### Found this useful?

If this actor saved you time or money, please consider leaving a quick review on the Apify Store. Reviews help other buyers find work that solves their problem and let me prioritize the features paying customers actually use. Leave a review: https://apify.com/seibs.co/uspto-patent-intel#reviews

# Actor input Schema

## `mode` (type: `string`):

patent\_search = keyword/assignee/inventor/CPC patent search. trademark\_search = TM filings by Nice class/applicant. co\_assignee\_mapping = list every co-assignee pairing for given assignees (reveals JVs, M\&A, partnerships). tech\_cluster\_analysis = top CPC clusters + YoY filing-rate change for a CPC code or assignee. inventor\_mobility = tracks inventors across assignees over time (talent flow). expiration\_calendar = patents expiring within N months. family\_lookup = continuations/divisionals/foreign equivalents for given patents. citation\_analysis = forward + backward citation graph.

## `patentsview_api_key` (type: `string`):

Free key from https://patentsview.org/forms/contact.php (or successor portal). Required for all patent modes. 1000 req/min. Leave empty only when running trademark\_search (TSDR is keyless).

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

Free-text terms searched against patent title+abstract (patent\_search) or mark text + goods/services (trademark\_search). Combined with OR within the list.

## `assignees` (type: `array`):

Company names exactly as they appear in USPTO records, e.g. 'Apple Inc.', 'Google LLC', 'International Business Machines Corporation'. Used in patent\_search, co\_assignee\_mapping, tech\_cluster\_analysis, expiration\_calendar.

## `inventors` (type: `array`):

Inventor names as 'First Last'. Used in patent\_search and inventor\_mobility modes.

## `cpc_classes` (type: `array`):

Cooperative Patent Classification codes. Accepts section level (G), class (G06), subclass (G06F), or group (G06F 17/30). Used in patent\_search, tech\_cluster\_analysis, expiration\_calendar.

## `nice_classes` (type: `array`):

Nice classification integers 1-45 as strings, e.g. '9' (software/electronics), '25' (apparel), '35' (advertising/business), '42' (technology/SaaS). Used in trademark\_search.

## `patent_numbers` (type: `array`):

USPTO patent numbers (utility, design, plant or reissue). Accepts with or without commas. Required for family\_lookup and citation\_analysis modes.

## `date_from` (type: `string`):

Lower bound on filing or grant date depending on mode. Empty = no lower bound.

## `date_to` (type: `string`):

Upper bound on filing or grant date depending on mode. Empty = no upper bound.

## `expiration_window_months` (type: `integer`):

Used only in expiration\_calendar mode. Returns patents whose expected 20-year-from-filing expiry falls within the next N months from today.

## `include_family_members` (type: `boolean`):

When true, enriches each patent record with continuations, divisionals, CIPs, and foreign equivalents. Independently chargeable ($0.005 per resolved family).

## `include_forward_citations` (type: `boolean`):

When true, enriches each patent record with patents that cite this one (downstream impact). Chargeable as citation\_enrichment ($0.005 per patent).

## `include_backward_citations` (type: `boolean`):

When true, enriches each patent record with patents this one cites (prior art). Shares the citation\_enrichment charge ($0.005 per patent) when forward citations are also requested.

## `max_results` (type: `integer`):

Cap on total records returned across pagination. PatentsView caps at 1000 per query; we paginate up to this number.

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

Parallel HTTP workers. PatentsView allows 1000 req/min so 4-8 is safe. TSDR is slower; keep at 2-4 for trademark\_search.

## `use_apify_proxy` (type: `boolean`):

Route requests through Apify Proxy. Off by default; USPTO endpoints don't usually rate-limit by IP. Enable if running back-to-back large jobs.

## Actor input object example

```json
{
  "mode": "trademark_search",
  "keywords": [
    "coffee"
  ],
  "assignees": [],
  "inventors": [],
  "cpc_classes": [],
  "nice_classes": [],
  "patent_numbers": [],
  "date_from": "",
  "date_to": "",
  "expiration_window_months": 18,
  "include_family_members": false,
  "include_forward_citations": false,
  "include_backward_citations": false,
  "max_results": 25,
  "concurrency": 4,
  "use_apify_proxy": false
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

Narrow, token-efficient slice of every record. Consumer: LLM agents (Claude, GPT, LangChain tools), MCP hosts, dashboards. Intel fields: patent #, title, assignee, filing date, grant date, expiration date, status.

## `datasetItemsDetailed` (type: `string`):

All fields for every record. Consumer: humans browsing the dataset in the Apify UI, RAG ingest pipelines, and full backups. Larger payload — not recommended as a direct LLM tool response.

## `datasetItemsUnwind` (type: `string`):

Same records, but each element of the `expiration` array is promoted to its own row. Consumer: Zapier / Make / n8n / Google Sheets users who want one row per item, and LLM agents that prefer flat rows over nested arrays.

## `datasetItemsMcp` (type: `string`):

First 50 overview records as a clean JSON array. Wrap on the agent side in an MCP tool-call response envelope, e.g. `{ "ok": true, "data": <this array>, "meta": { "actor": "uspto-patent-intel", "count": <len>, "view": "overview" } }`. Consumer: MCP servers, Claude Desktop, Cursor, OpenAI Assistants tool calls.

## `datasetItemsCsv` (type: `string`):

Spreadsheet-friendly export of the overview view. Consumer: humans, sales-ops teams, Excel / Google Sheets users.

# 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 = {
    "mode": "trademark_search",
    "keywords": [
        "coffee"
    ],
    "max_results": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("seibs.co/uspto-patent-intel").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 = {
    "mode": "trademark_search",
    "keywords": ["coffee"],
    "max_results": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("seibs.co/uspto-patent-intel").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "trademark_search",
  "keywords": [
    "coffee"
  ],
  "max_results": 25
}' |
apify call seibs.co/uspto-patent-intel --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=seibs.co/uspto-patent-intel",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "USPTO Patent + Trademark Intel - Citations, Co-Assignees",
        "description": "USPTO patent + trademark intelligence. Co-assignee mapping (partnerships/M&A intel), CPC tech-cluster analysis, inventor mobility, expiration calendar, family/citation graph, trademark watch. For IP law, R&D, competitive intel, VC due diligence.",
        "version": "0.1",
        "x-build-id": "wtsywFXyvuKkwOSdV"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/seibs.co~uspto-patent-intel/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-seibs.co-uspto-patent-intel",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/seibs.co~uspto-patent-intel/runs": {
            "post": {
                "operationId": "runs-sync-seibs.co-uspto-patent-intel",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/seibs.co~uspto-patent-intel/run-sync": {
            "post": {
                "operationId": "run-sync-seibs.co-uspto-patent-intel",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "patent_search",
                            "trademark_search",
                            "co_assignee_mapping",
                            "tech_cluster_analysis",
                            "inventor_mobility",
                            "expiration_calendar",
                            "family_lookup",
                            "citation_analysis"
                        ],
                        "type": "string",
                        "description": "patent_search = keyword/assignee/inventor/CPC patent search. trademark_search = TM filings by Nice class/applicant. co_assignee_mapping = list every co-assignee pairing for given assignees (reveals JVs, M&A, partnerships). tech_cluster_analysis = top CPC clusters + YoY filing-rate change for a CPC code or assignee. inventor_mobility = tracks inventors across assignees over time (talent flow). expiration_calendar = patents expiring within N months. family_lookup = continuations/divisionals/foreign equivalents for given patents. citation_analysis = forward + backward citation graph.",
                        "default": "patent_search"
                    },
                    "patentsview_api_key": {
                        "title": "PatentsView API key",
                        "type": "string",
                        "description": "Free key from https://patentsview.org/forms/contact.php (or successor portal). Required for all patent modes. 1000 req/min. Leave empty only when running trademark_search (TSDR is keyless)."
                    },
                    "keywords": {
                        "title": "Keywords",
                        "type": "array",
                        "description": "Free-text terms searched against patent title+abstract (patent_search) or mark text + goods/services (trademark_search). Combined with OR within the list.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "assignees": {
                        "title": "Assignees (companies)",
                        "type": "array",
                        "description": "Company names exactly as they appear in USPTO records, e.g. 'Apple Inc.', 'Google LLC', 'International Business Machines Corporation'. Used in patent_search, co_assignee_mapping, tech_cluster_analysis, expiration_calendar.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "inventors": {
                        "title": "Inventors",
                        "type": "array",
                        "description": "Inventor names as 'First Last'. Used in patent_search and inventor_mobility modes.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "cpc_classes": {
                        "title": "CPC classification codes",
                        "type": "array",
                        "description": "Cooperative Patent Classification codes. Accepts section level (G), class (G06), subclass (G06F), or group (G06F 17/30). Used in patent_search, tech_cluster_analysis, expiration_calendar.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "nice_classes": {
                        "title": "Nice classes (trademark)",
                        "type": "array",
                        "description": "Nice classification integers 1-45 as strings, e.g. '9' (software/electronics), '25' (apparel), '35' (advertising/business), '42' (technology/SaaS). Used in trademark_search.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "patent_numbers": {
                        "title": "Patent numbers",
                        "type": "array",
                        "description": "USPTO patent numbers (utility, design, plant or reissue). Accepts with or without commas. Required for family_lookup and citation_analysis modes.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "date_from": {
                        "title": "Date from (YYYY-MM-DD)",
                        "type": "string",
                        "description": "Lower bound on filing or grant date depending on mode. Empty = no lower bound.",
                        "default": ""
                    },
                    "date_to": {
                        "title": "Date to (YYYY-MM-DD)",
                        "type": "string",
                        "description": "Upper bound on filing or grant date depending on mode. Empty = no upper bound.",
                        "default": ""
                    },
                    "expiration_window_months": {
                        "title": "Expiration window (months)",
                        "minimum": 1,
                        "maximum": 240,
                        "type": "integer",
                        "description": "Used only in expiration_calendar mode. Returns patents whose expected 20-year-from-filing expiry falls within the next N months from today.",
                        "default": 18
                    },
                    "include_family_members": {
                        "title": "Include patent family members",
                        "type": "boolean",
                        "description": "When true, enriches each patent record with continuations, divisionals, CIPs, and foreign equivalents. Independently chargeable ($0.005 per resolved family).",
                        "default": false
                    },
                    "include_forward_citations": {
                        "title": "Include forward citations",
                        "type": "boolean",
                        "description": "When true, enriches each patent record with patents that cite this one (downstream impact). Chargeable as citation_enrichment ($0.005 per patent).",
                        "default": false
                    },
                    "include_backward_citations": {
                        "title": "Include backward citations",
                        "type": "boolean",
                        "description": "When true, enriches each patent record with patents this one cites (prior art). Shares the citation_enrichment charge ($0.005 per patent) when forward citations are also requested.",
                        "default": false
                    },
                    "max_results": {
                        "title": "Max results",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Cap on total records returned across pagination. PatentsView caps at 1000 per query; we paginate up to this number.",
                        "default": 100
                    },
                    "concurrency": {
                        "title": "Concurrency",
                        "minimum": 1,
                        "maximum": 8,
                        "type": "integer",
                        "description": "Parallel HTTP workers. PatentsView allows 1000 req/min so 4-8 is safe. TSDR is slower; keep at 2-4 for trademark_search.",
                        "default": 4
                    },
                    "use_apify_proxy": {
                        "title": "Use Apify Proxy",
                        "type": "boolean",
                        "description": "Route requests through Apify Proxy. Off by default; USPTO endpoints don't usually rate-limit by IP. Enable if running back-to-back large jobs.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
