# USPTO PTAB Trial Tracker — IPR/PGR/CBM API (`malonestar/ptab-trial-tracker`) Actor

Track USPTO PTAB AIA trials (IPR, PGR, CBM) from the Open Data Portal: search by party, patent, type or date; a new-petition delta feed; a petitioner<->patent-owner graph; and an institution-rate score (instituted/decided). Needs a free USPTO ODP API key.

- **URL**: https://apify.com/malonestar/ptab-trial-tracker.md
- **Developed by:** [Kyle Maloney](https://apify.com/malonestar) (community)
- **Categories:** Developer tools, Lead generation, Agents
- **Stats:** 2 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.40 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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.

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

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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 PTAB Trial Tracker — IPR / PGR / CBM API

Turn the USPTO Patent Trial and Appeal Board (PTAB) AIA-trial docket into a clean,
structured feed. Search **inter partes review (IPR)**, **post-grant review (PGR)**,
**covered business method (CBM)** and **derivation (DER)** proceedings by party,
patent, type or date — then go beyond a flat dump with three transforms:

- **Delta mode** — only the *new petitions* since a date or since your last run (a ready-made new-IPR alert).
- **Graph mode** — a **petitioner ↔ patent-owner** edge list (or per-party rollup) so you can see who is challenging whom.
- **Institution-rate score** — `instituted / decided` per petitioner or patent owner, the number litigators actually care about.

Data comes straight from the **USPTO Open Data Portal (ODP) PTAB Trials API** (`api.uspto.gov`). Official, first-party, no scraping.

### Who it's for
- **Patent litigators & PTAB practitioners** — monitor new petitions against a client's patents; benchmark a petitioner's institution rate before filing.
- **IP-risk & competitive-intelligence analysts** — track which competitors are attacking which portfolios.
- **NPE / licensing & patent-monetization teams** — spot patents under AIA challenge and gauge validity risk.
- **Litigation-finance & insurance underwriters** — score institution likelihood across a book of patents.

### You need a free USPTO ODP API key
The USPTO **decommissioned the old keyless PTAB API on 2026-01-06**. The current ODP API is free but key-gated. Register in a few minutes (video ID verification) at **https://data.uspto.gov/apis/getting-started**, then paste the key into the `apiKey` field. It is sent only to `api.uspto.gov` as the `X-API-KEY` header.

### Example input
```json
{
  "apiKey": "YOUR_FREE_USPTO_ODP_KEY",
  "mode": "search",
  "proceedingType": "IPR",
  "sinceDate": "2025-01-01",
  "maxResults": 500
}
````

New-petition alert (schedule it daily):

```json
{ "apiKey": "YOUR_FREE_USPTO_ODP_KEY", "mode": "delta", "proceedingType": "IPR", "sinceDate": "2026-06-01" }
```

Institution-rate leaderboard by petitioner:

```json
{ "apiKey": "YOUR_FREE_USPTO_ODP_KEY", "mode": "graph", "graphBy": "petitioner", "proceedingType": "IPR", "maxResults": 2000 }
```

### Output fields (search / delta)

| Field | Description |
|---|---|
| `proceeding_number` | PTAB trial number (e.g. IPR2024-00001) |
| `proceeding_type` | IPR / PGR / CBM / DER |
| `subproceeding_type` | Raw USPTO trialTypeCode |
| `filing_date` | Petition filing date (YYYY-MM-DD) |
| `status` | USPTO trial status category |
| `institution_decision` | instituted / denied / pending / unknown |
| `institution_decision_date` | Date institution decision issued |
| `petitioner` | Petitioner (challenger) real party in interest |
| `patent_owner` | Patent owner / respondent |
| `patent_number` | Challenged patent number |
| `inventor` | Named inventor |
| `technology_center` | USPTO technology center |
| `source_url` | Canonical ODP API URL for the proceeding |
| `retrieved_at` | Fetch timestamp (ISO 8601) |

### Output fields (graph mode)

`petitioner`, `patent_owner`, `proceeding_count`, `instituted_count`, `denied_count`, `pending_count`, `institution_rate` (0–1, `instituted / decided`).

### Use as an MCP tool

This actor is callable by AI agents (Claude, Cursor, etc.) via **mcp.apify.com**. The input and every output field are described in the schema, so an agent can chain it: resolve a patent or company, pull its PTAB trials, then compute the institution rate — no glue code.

### FAQ

**How do I get a USPTO PTAB API key?** Free at https://data.uspto.gov/apis/getting-started (a few minutes, one-time video verification). Paste it into `apiKey`.

**What is a PTAB IPR institution rate?** The share of a petitioner's (or patent owner's) trials that were *instituted* out of those *decided* (instituted + denied). Graph mode computes it per party.

**Can I monitor new IPR petitions automatically?** Yes — run `mode: "delta"` on a schedule; the actor keeps a rolling seen-set and emits only newly filed petitions.

**How do I find every PTAB trial against a patent?** Set `patentNumber` (e.g. `US9876543B2`) in `search` mode.

**Which proceedings are covered?** AIA trials: IPR, PGR, CBM, and derivation (DER). Appeals and interferences are separate USPTO datasets.

**Is this official data?** Yes — first-party USPTO Open Data Portal PTAB Trials API, no scraping.

# Actor input Schema

## `apiKey` (type: `string`):

Your FREE USPTO Open Data Portal (ODP) API key, sent as the X-API-KEY header. Register in minutes at https://data.uspto.gov/apis/getting-started (video ID verification). Required: the USPTO decommissioned the old keyless PTAB API on 2026-01-06.

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

search = list matching proceedings; delta = only NEW petitions (since a date and/or not seen in a prior run); graph = petitioner<->patent-owner edge list / rollup with institution-rate scores.

## `party` (type: `string`):

Optional free-text party name (petitioner or patent owner), e.g. 'Apple' or 'Intel Corporation'. Matched across the proceeding's searchable fields.

## `patentNumber` (type: `string`):

Optional patent number under challenge, e.g. US9876543B2. Returns the PTAB trials filed against that patent.

## `proceedingType` (type: `string`):

Restrict to a PTAB trial type: IPR (inter partes review), PGR (post-grant review), CBM (covered business method), or DER (derivation). Empty = all types.

## `sinceDate` (type: `string`):

Only return proceedings whose petition was filed on or after this date. Drives the delta/monitoring window. Empty = no lower bound.

## `priorItems` (type: `array`):

Delta mode: the previous run's results (or a list of proceeding\_number strings). Any proceeding already present is treated as seen and excluded, leaving only new petitions. The actor also keeps its own rolling seen-set in the key-value store for scheduled runs.

## `graphBy` (type: `string`):

Graph mode grouping: edge = one row per petitioner->patent-owner pair; petitioner = per-petitioner rollup; patentOwner = per-patent-owner rollup. Each row carries proceeding\_count and the institution-rate score.

## `maxResults` (type: `integer`):

Maximum number of proceedings to fetch before delta/graph processing.

## Actor input object example

```json
{
  "mode": "search",
  "party": "Apple",
  "proceedingType": "IPR",
  "priorItems": [],
  "graphBy": "edge",
  "maxResults": 100
}
```

# Actor output Schema

## `results` (type: `string`):

The default dataset with PTAB proceeding / delta / graph rows.

# 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 = {
    "party": "Apple",
    "proceedingType": "IPR",
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("malonestar/ptab-trial-tracker").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 = {
    "party": "Apple",
    "proceedingType": "IPR",
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("malonestar/ptab-trial-tracker").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 '{
  "party": "Apple",
  "proceedingType": "IPR",
  "maxResults": 100
}' |
apify call malonestar/ptab-trial-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=malonestar/ptab-trial-tracker",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "USPTO PTAB Trial Tracker — IPR/PGR/CBM API",
        "description": "Track USPTO PTAB AIA trials (IPR, PGR, CBM) from the Open Data Portal: search by party, patent, type or date; a new-petition delta feed; a petitioner<->patent-owner graph; and an institution-rate score (instituted/decided). Needs a free USPTO ODP API key.",
        "version": "1.0",
        "x-build-id": "Bhts3PV1jPzCTmeWA"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/malonestar~ptab-trial-tracker/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-malonestar-ptab-trial-tracker",
                "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/malonestar~ptab-trial-tracker/runs": {
            "post": {
                "operationId": "runs-sync-malonestar-ptab-trial-tracker",
                "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/malonestar~ptab-trial-tracker/run-sync": {
            "post": {
                "operationId": "run-sync-malonestar-ptab-trial-tracker",
                "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",
                "properties": {
                    "apiKey": {
                        "title": "USPTO ODP API key",
                        "type": "string",
                        "description": "Your FREE USPTO Open Data Portal (ODP) API key, sent as the X-API-KEY header. Register in minutes at https://data.uspto.gov/apis/getting-started (video ID verification). Required: the USPTO decommissioned the old keyless PTAB API on 2026-01-06."
                    },
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "search",
                            "delta",
                            "graph"
                        ],
                        "type": "string",
                        "description": "search = list matching proceedings; delta = only NEW petitions (since a date and/or not seen in a prior run); graph = petitioner<->patent-owner edge list / rollup with institution-rate scores.",
                        "default": "search"
                    },
                    "party": {
                        "title": "Party name",
                        "type": "string",
                        "description": "Optional free-text party name (petitioner or patent owner), e.g. 'Apple' or 'Intel Corporation'. Matched across the proceeding's searchable fields."
                    },
                    "patentNumber": {
                        "title": "Challenged patent number",
                        "type": "string",
                        "description": "Optional patent number under challenge, e.g. US9876543B2. Returns the PTAB trials filed against that patent."
                    },
                    "proceedingType": {
                        "title": "Proceeding type",
                        "enum": [
                            "",
                            "IPR",
                            "PGR",
                            "CBM",
                            "DER"
                        ],
                        "type": "string",
                        "description": "Restrict to a PTAB trial type: IPR (inter partes review), PGR (post-grant review), CBM (covered business method), or DER (derivation). Empty = all types.",
                        "default": ""
                    },
                    "sinceDate": {
                        "title": "Petition filed since (YYYY-MM-DD)",
                        "type": "string",
                        "description": "Only return proceedings whose petition was filed on or after this date. Drives the delta/monitoring window. Empty = no lower bound."
                    },
                    "priorItems": {
                        "title": "Prior items (delta mode)",
                        "type": "array",
                        "description": "Delta mode: the previous run's results (or a list of proceeding_number strings). Any proceeding already present is treated as seen and excluded, leaving only new petitions. The actor also keeps its own rolling seen-set in the key-value store for scheduled runs.",
                        "default": []
                    },
                    "graphBy": {
                        "title": "Graph grouping (graph mode)",
                        "enum": [
                            "edge",
                            "petitioner",
                            "patentOwner"
                        ],
                        "type": "string",
                        "description": "Graph mode grouping: edge = one row per petitioner->patent-owner pair; petitioner = per-petitioner rollup; patentOwner = per-patent-owner rollup. Each row carries proceeding_count and the institution-rate score.",
                        "default": "edge"
                    },
                    "maxResults": {
                        "title": "Max results",
                        "minimum": 1,
                        "maximum": 100000,
                        "type": "integer",
                        "description": "Maximum number of proceedings to fetch before delta/graph processing.",
                        "default": 1000
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
