Skills › Research & Science › Research assistant
Uspto Database
"Access USPTO APIs for patent/trademark searches, examination history (PEDS), assignments, citations, office actions, TSDR, for IP analysis and prior art searches."
Tools: uspto-opendata-python,requests,xml
The full skill
—
name: uspto-database
description: "Access USPTO APIs for patent/trademark searches, examination history (PEDS), assignments, citations, office actions, TSDR, for IP analysis and prior art searches."
—
# USPTO Database
## Overview
USPTO provides specialized APIs for patent and trademark data. Search patents by keywords/inventors/assignees, retrieve examination history via PEDS, track assignments, analyze citations and office actions, access TSDR for trademarks, for IP analysis and prior art searches.
## When to Use This Skill
This skill should be used when:
– **Patent Search**: Finding patents by keywords, inventors, assignees, classifications, or dates
– **Patent Details**: Retrieving full patent data including claims, abstracts, citations
– **Trademark Search**: Looking up trademarks by serial or registration number
– **Trademark Status**: Checking trademark status, ownership, and prosecution history
– **Examination History**: Accessing patent prosecution data from PEDS (Patent Examination Data System)
– **Office Actions**: Retrieving office action text, citations, and rejections
– **Assignments**: Tracking patent/trademark ownership transfers
– **Citations**: Analyzing patent citations (forward and backward)
– **Litigation**: Accessing patent litigation records
– **Portfolio Analysis**: Analyzing patent/trademark portfolios for companies or inventors
## USPTO API Ecosystem
The USPTO provides multiple specialized APIs for different data needs:
### Core APIs
1. **PatentSearch API** – Modern ElasticSearch-based patent search (replaced legacy PatentsView in May 2025)
– Search patents by keywords, inventors, assignees, classifications, dates
– Access to patent data through June 30, 2025
– 45 requests/minute rate limit
– **Base URL**: `https://search.patentsview.org/api/v1/`
2. **PEDS (Patent Examination Data System)** – Patent examination history
– Application status and transaction history from 1981-present
– Office action dates and examination events
– Use `uspto-opendata-python` Python library
– **Replaced**: PAIR Bulk Data (PBD) – decommissioned
3. **TSDR (Trademark Status & Document Retrieval)** – Trademark data
– Trademark status, ownership, prosecution history
– Search by serial or registration number
– **Base URL**: `https://tsdrapi.uspto.gov/ts/cd/`
### Additional APIs
4. **Patent Assignment Search** – Ownership records and transfers
5. **Trademark Assignment Search** – Trademark ownership changes
6. **Enriched Citation API** – Patent citation analysis
7. **Office Action Text Retrieval** – Full text of office actions
8. **Office Action Citations** – Citations from office actions
9. **Office Action Rejection** – Rejection reasons and types
10. **PTAB API** – Patent Trial and Appeal Board proceedings
11. **Patent Litigation Cases** – Federal district court litigation data
12. **Cancer Moonshot Data Set** – Cancer-related patents
## Quick Start
### API Key Registration
All USPTO APIs require an API key. Register at:
**https://account.uspto.gov/api-manager/**
Set the API key as an environment variable:
“`bash
export USPTO_API_KEY="your_api_key_here"
“`
### Helper Scripts
This skill includes Python scripts for common operations:
– **`scripts/patent_search.py`** – PatentSearch API client for searching patents
– **`scripts/peds_client.py`** – PEDS client for examination history
– **`scripts/trademark_client.py`** – TSDR client for trademark data
## Task 1: Searching Patents
### Using the PatentSearch API
The PatentSearch API uses a JSON query language with various operators for flexible searching.
#### Basic Patent Search Examples
**Search by keywords in abstract:**
“`python
from scripts.patent_search import PatentSearchClient
client = PatentSearchClient()
# Search for machine learning patents
results = client.search_patents({
"patent_abstract": {"_text_all": ["machine", "learning"]}
})
for patent in results['patents']:
print(f"{patent['patent_number']}: {patent['patent_title']}")
“`
**Search by inventor:**
“`python
results = client.search_by_inventor("John Smith")
“`
**Search by assignee/company:**
“`python
results = client.search_by_assignee("Google")
“`
**Search by date range:**
“`python
results = client.search_by_date_range("2024-01-01", "2024-12-31")
“`
**Search by CPC classification:**
“`python
results = client.search_by_classification("H04N") # Video/image tech
“`
#### Advanced Patent Search
Combine multiple criteria with logical operators:
“`python
results = client.advanced_search(
keywords=["artificial", "intelligence"],
assignee="Microsoft",
start_date="2023-01-01",
end_date="2024-12-31",
cpc_codes=["G06N", "G06F"] # AI and computing classifications
)
“`
#### Direct API Usage
For complex queries, use the API directly:
“`python
import requests
url = "https://search.patentsview.org/api/v1/patent"
headers = {
"X-Api-Key": "YOUR_API_KEY",
"Content-Type": "application/json"
}
query = {
"q": {
"_and": [
{"patent_date": {"_gte": "2024-01-01"}},
{"assignee_organization": {"_text_any": ["Google", "Alphabet"]}},
{"cpc_subclass_id": ["G06N", "H04N"]}
]
},
"f": ["patent_number", "patent_title", "patent_date", "inventor_name"],
"s": [{"patent_date": "desc"}],
"o": {"per_page": 100, "page": 1}
}
response = requests.post(url, headers=headers, json=query)
results = response.json()
“`
### Query Operators
– **Equality**: `{"field": "value"}` or `{"field": {"_eq": "value"}}`
– **Comparison**: `_gt`, `_gte`, `_lt`, `_lte`, `_neq`
– **Text search**: `_text_all`, `_text_any`, `_text_phrase`
– **String matching**: `_begins`, `_contains`
– **Logical**: `_and`, `_or`, `_not`
**Best Practice**: Use `_text_*` operators for text fields (more performant than `_contains` or `_begins`)
### Available Patent Endpoints
– `/patent` – Granted patents
– `/publication` – Pregrant publications
– `/inventor` – Inventor information
– `/assignee` – Assignee information
– `/cpc_subclass`, `/cpc_at_issue` – CPC classifications
– `/uspc` – US Patent Classification
– `/ipc` – International Patent Classification
– `/claims`, `/brief_summary_text`, `/detail_description_text` – Text data (beta)
### Reference Documentation
See `references/patentsearch_api.md` for complete PatentSearch API documentation including:
– All available endpoints
– Complete field reference
– Query syntax and examples
– Response formats
– Rate limits and best practices
## Task 2: Retrieving Patent Examination Data
### Using PEDS (Patent Examination Data System)
PEDS provides comprehensive prosecution history including transaction events, status changes, and examination timeline.
#### Installation
“`bash
uv pip install uspto-opendata-python
“`
#### Basic PEDS Usage
**Get application data:**
“`python
from scripts.peds_client import PEDSHelper
helper = PEDSHelper()
# By application number
app_data = helper.get_application("16123456")
print(f"Title: {app_data['title']}")
print(f"Status: {app_data['app_status']}")
# By patent number
patent_data = helper.get_patent("11234567")
“`
**Get transaction history:**
“`python
transactions = helper.get_transaction_history("16123456")
for trans in transactions:
print(f"{trans['date']}: {trans['code']} – {trans['description']}")
“`
**Get office actions:**
“`python
office_actions = helper.get_office_actions("16123456")
for oa in office_actions:
if oa['code'] == 'CTNF':
print(f"Non-final rejection: {oa['date']}")
elif oa['code'] == 'CTFR':
print(f"Final rejection: {oa['date']}")
elif oa['code'] == 'NOA':
print(f"Notice of allowance: {oa['date']}")
“`
**Get status summary:**
“`python
summary = helper.get_status_summary("16123456")
print(f"Current status: {summary['current_status']}")
print(f"Filing date: {summary['filing_date']}")
print(f"Pendency: {summary['pendency_days']} days")
if summary['is_patented']:
print(f"Patent number: {summary['patent_number']}")
print(f"Issue date: {summary['issue_date']}")
“`
#### Prosecution Analysis
Analyze prosecution patterns:
“`python
analysis = helper.analyze_prosecution("16123456")
print(f"Total office actions: {analysis['total_office_actions']}")
print(f"Non-final rejections: {analysis['non_final_rejections']}")
print(f"Final rejections: {analysis['final_rejections']}")
print(f"Allowed: {analysis['allowance']}")
print(f"Responses filed: {analysis['responses']}")
“`
### Common Transaction Codes
– **CTNF** – Non-final rejection mailed
– **CTFR** – Final rejection mailed
– **NOA** – Notice of allowance mailed
– **WRIT** – Response filed
– **ISS.FEE** – Issue fee payment
– **ABND** – Application abandoned
– **AOPF** – Office action mailed
### Reference Documentation
See `references/peds_api.md` for complete PEDS documentation including:
– All available data fields
– Transaction code reference
– Python library usage
– Portfolio analysis examples
## Task 3: Searching and Monitoring Trademarks
### Using TSDR (Trademark Status & Document Retrieval)
Access trademark status, ownership, and prosecution history.
#### Basic Trademark Usage
**Get trademark by serial number:**
“`python
from scripts.trademark_client import TrademarkClient
client = TrademarkClient()
# By serial number
tm_data = client.get_trademark_by_serial("87654321")
# By registration number
tm_data = client.get_trademark_by_registration("5678901")
“`
**Get trademark status:**
“`python
status = client.get_trademark_status("87654321")
print(f"Mark: {status['mark_text']}")
print(f"Status: {status['status']}")
print(f"Filing date: {status['filing_date']}")
if status['is_registered']:
print(f"Registration #: {status['registration_number']}")
print(f"Registration date: {status['registration_date']}")
“`
**Check trademark health:**
“`python
health = client.check_trademark_health("87654321")
print(f"Mark: {health['mark']}")
print(f"Status: {health['status']}")
for alert in health['alerts']:
print(alert)
if health['needs_attention']:
print("â ï¸ This mark needs attention!")
“`
#### Trademark Portfolio Monitoring
Monitor multiple trademarks:
“`python
def monitor_portfolio(serial_numbers, api_key):
"""Monitor trademark portfolio health."""
client = TrademarkClient(api_key)
results = {
'active': [],
'pending': [],
'problems': []
}
for sn in serial_numbers:
health = client.check_trademark_health(sn)
if 'REGISTERED' in health['status']:
results['active'].append(health)
elif 'PENDING' in health['status'] or 'PUBLISHED' in health['status']:
results['pending'].append(health)
elif health['needs_attention']:
results['problems'].append(health)
return results
“`
### Common Trademark Statuses
– **REGISTERED** – Active registered mark
– **PENDING** – Under examination
– **PUBLISHED FOR OPPOSITION** – In opposition period
– **ABANDONED** – Application abandoned
– **CANCELLED** – Registration cancelled
– **SUSPENDED** – Examination suspended
– **REGISTERED AND RENEWED** – Registration renewed
### Reference Documentation
See `references/trademark_api.md` for complete trademark API documentation including:
– TSDR API reference
– Trademark Assignment Search API
– All status codes
– Prosecution history access
– Ownership tracking
## Task 4: Tracking Assignments and Ownership
### Patent and Trademark Assignments
Both patents and trademarks have Assignment Search APIs for tracking ownership changes.
#### Patent Assignment API
**Base URL**: `https://assignment-api.uspto.gov/patent/v1.4/`
**Search by patent number:**
“`python
import requests
import xml.etree.ElementTree as ET
def get_patent_assignments(patent_number, api_key):
url = f"https://assignment-api.uspto.gov/patent/v1.4/assignment/patent/{patent_number}"
headers = {"X-Api-Key": api_key}
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.text # Returns XML
assignments_xml = get_patent_assignments("11234567", api_key)
root = ET.fromstring(assignments_xml)
for assignment in root.findall('.//assignment'):
recorded_date = assignment.find('recordedDate').text
assignor = assignment.find('.//assignor/name').text
assignee = assignment.find('.//assignee/name').text
conveyance = assignment.find('conveyanceText').text
print(f"{recorded_date}: {assignor} â {assignee}")
print(f" Type: {conveyance}\n")
“`
**Search by company name:**
“`python
def find_company_patents(company_name, api_key):
url = "https://assignment-api.uspto.gov/patent/v1.4/assignment/search"
headers = {"X-Api-Key": api_key}
data = {"criteria": {"assigneeName": company_name}}
response = requests.post(url, headers=headers, json=data)
return response.text
“`
### Common Assignment Types
– **ASSIGNMENT OF ASSIGNORS INTEREST** – Ownership transfer
– **SECURITY AGREEMENT** – Collateral/security interest
– **MERGER** – Corporate merger
– **CHANGE OF NAME** – Name change
– **ASSIGNMENT OF PARTIAL INTEREST** – Partial ownership
## Task 5: Accessing Additional USPTO Data
### Office Actions, Citations, and Litigation
Multiple specialized APIs provide additional patent data.
#### Office Action Text Retrieval
Retrieve full text of office actions using application number. Integrate with PEDS to identify which office actions exist, then retrieve full text.
#### Enriched Citation API
Analyze patent citations:
– Forward citations (patents citing this patent)
– Backward citations (prior art cited)
– Examiner vs. applicant citations
– Citation context
#### Patent Litigation Cases API
Access federal district court patent litigation records:
– 74,623+ litigation records
– Patents asserted
– Parties and venues
– Case outcomes
#### PTAB API
Patent Trial and Appeal Board proceedings:
– Inter partes review (IPR)
– Post-grant review (PGR)
– Appeal decisions
### Reference Documentation
See `references/additional_apis.md` for comprehensive documentation on:
– Enriched Citation API
– Office Action APIs (Text, Citations, Rejections)
– Patent Litigation Cases API
– PTAB API
– Cancer Moonshot Data Set
– OCE Status/Event Codes
## Complete Analysis Example
### Comprehensive Patent Analysis
Combine multiple APIs for complete patent intelligence:
“`python
def comprehensive_patent_analysis(patent_number, api_key):
"""
Full patent analysis using multiple USPTO APIs.
"""
from scripts.patent_search import PatentSearchClient
from scripts.peds_client import PEDSHelper
results = {}
# 1. Get patent details
patent_client = PatentSearchClient(api_key)
patent_data = patent_client.get_patent(patent_number)
results['patent'] = patent_data
# 2. Get examination history
peds = PEDSHelper()
results['prosecution'] = peds.analyze_prosecution(patent_number)
results['status'] = peds.get_status_summary(patent_number)
# 3. Get assignment history
import requests
assign_url = f"https://assignment-api.uspto.gov/patent/v1.4/assignment/patent/{patent_number}"
assign_resp = requests.get(assign_url, headers={"X-Api-Key": api_key})
results['assignments'] = assign_resp.text if assign_resp.status_code == 200 else None
# 4. Analyze results
print(f"\n=== Patent {patent_number} Analysis ===\n")
print(f"Title: {patent_data['patent_title']}")
print(f"Assignee: {', '.join(patent_data.get('assignee_organization', []))}")
print(f"Issue Date: {patent_data['patent_date']}")
print(f"\nProsecution:")
print(f" Office Actions: {results['prosecution']['total_office_actions']}")
print(f" Rejections: {results['prosecution']['non_final_rejections']} non-final, {results['prosecution']['final_rejections']} final")
print(f" Pendency: {results['prosecution']['pendency_days']} days")
# Analyze citations
if 'cited_patent_number' in patent_data:
print(f"\nCitations:")
print(f" Cites: {len(patent_data['cited_patent_number'])} patents")
if 'citedby_patent_number' in patent_data:
print(f" Cited by: {len(patent_data['citedby_patent_number'])} patents")
return results
“`
## Best Practices
1. **API Key Management**
– Store API key in environment variables
– Never commit keys to version control
– Use same key across all USPTO APIs
2. **Rate Limiting**
– PatentSearch: 45 requests/minute
– Implement exponential backoff for rate limit errors
– Cache responses when possible
3. **Query Optimization**
– Use `_text_*` operators for text fields (more performant)
– Request only needed fields to reduce response size
– Use date ranges to narrow searches
4. **Data Handling**
– Not all fields populated for all patents/trademarks
– Handle missing data gracefully
– Parse dates consistently
5. **Combining APIs**
– Use PatentSearch for discovery
– Use PEDS for prosecution details
– Use Assignment APIs for ownership tracking
– Combine data for comprehensive analysis
## Important Notes
– **Legacy API Sunset**: PatentsView legacy API discontinued May 1, 2025 – use PatentSearch API
– **PAIR Bulk Data Decommissioned**: Use PEDS instead
– **Data Coverage**: PatentSearch has data through June 30, 2025; PEDS from 1981-present
– **Text Endpoints**: Claims and description endpoints are in beta with ongoing backfilling
– **Rate Limits**: Respect rate limits to avoid service disruptions
## Resources
### API Documentation
– **PatentSearch API**: https://search.patentsview.org/docs/
– **USPTO Developer Portal**: https://developer.uspto.gov/
– **USPTO Open Data Portal**: https://data.uspto.gov/
– **API Key Registration**: https://account.uspto.gov/api-manager/
### Python Libraries
– **uspto-opendata-python**: https://pypi.org/project/uspto-opendata-python/
– **USPTO Docs**: https://docs.ip-tools.org/uspto-opendata-python/
### Reference Files
– `references/patentsearch_api.md` – Complete PatentSearch API reference
– `references/peds_api.md` – PEDS API and library documentation
– `references/trademark_api.md` – Trademark APIs (TSDR and Assignment)
– `references/additional_apis.md` – Citations, Office Actions, Litigation, PTAB
### Scripts
– `scripts/patent_search.py` – PatentSearch API client
– `scripts/peds_client.py` – PEDS examination data client
– `scripts/trademark_client.py` – Trademark search client