1"""Example usage of the pyUSPTO module for PTAB Trials API.
2
3This example demonstrates how to use the PTABTrialsClient to interact with the USPTO PTAB
4(Patent Trial and Appeal Board) Trials API. It shows how to search for trial proceedings,
5documents, and decisions using various search criteria.
6
7PTAB Trials include:
8- IPR (Inter Partes Review)
9- PGR (Post-Grant Review)
10- CBM (Covered Business Method)
11- DER (Derivation) proceedings
12"""
13
14import os
15
16from pyUSPTO import PTABTrialsClient
17from pyUSPTO.config import USPTOConfig
18
19# --- Initialization ---
20# Initialize the client with direct API key
21print("Initialize with direct API key")
22api_key = os.environ.get("USPTO_API_KEY", "YOUR_API_KEY_HERE")
23if api_key == "YOUR_API_KEY_HERE":
24 raise ValueError(
25 "WARNING: API key is not set. Please replace 'YOUR_API_KEY_HERE' or set USPTO_API_KEY environment variable."
26 )
27
28config = USPTOConfig(api_key=api_key)
29client = PTABTrialsClient(config=config)
30
31print("\nBeginning PTAB Trials API requests with configured client:")
32
33# =============================================================================
34# 1. Search Trial Proceedings
35# =============================================================================
36
37print("\n" + "=" * 80)
38print("1. Searching for IPR trial proceedings")
39print("=" * 80)
40
41try:
42 # Search for IPR proceedings filed in 2023
43 response = client.search_proceedings(
44 trial_type_code_q="IPR",
45 petition_filing_date_from_q="2023-01-01",
46 petition_filing_date_to_q="2023-12-31",
47 limit=5,
48 )
49
50 print(f"\nFound {response.count} IPR proceedings filed in 2023")
51 print(f"Displaying first {len(response.patent_trial_proceeding_data_bag)} results:")
52
53 for proceeding in response.patent_trial_proceeding_data_bag:
54 print(f"\n Trial Number: {proceeding.trial_number}")
55
56 if proceeding.trial_meta_data:
57 meta = proceeding.trial_meta_data
58 print(f" Trial Type: {meta.trial_type_code}")
59 print(f" Status: {meta.trial_status_category}")
60 print(f" Filing Date: {meta.petition_filing_date}")
61
62 if proceeding.patent_owner_data:
63 print(f" Patent Owner: {proceeding.patent_owner_data.patent_owner_name}")
64 print(f" Patent Number: {proceeding.patent_owner_data.patent_number}")
65
66 if proceeding.regular_petitioner_data:
67 print(
68 f" Petitioner: {proceeding.regular_petitioner_data.real_party_in_interest_name}"
69 )
70
71except Exception as e:
72 print(f"Error searching proceedings: {e}")
73
74# =============================================================================
75# 2. Search Trial Documents
76# =============================================================================
77
78print("\n" + "=" * 80)
79print("2. Searching for trial documents")
80print("=" * 80)
81
82try:
83 # Search for documents in a specific trial
84 # Using the new convenience parameters for petitioner and patent owner
85 response = client.search_documents(
86 trial_number_q="IPR2025-01319",
87 limit=10,
88 )
89
90 print(f"\nFound {response.count} documents")
91 print(f"Displaying first {len(response.patent_trial_document_data_bag)} results:")
92
93 for item in response.patent_trial_document_data_bag:
94 print(f"\n Trial Number: {item.trial_number}")
95
96 if item.document_data:
97 doc = item.document_data
98 print(f" Document Type: {doc.document_type_description_text}")
99 print(f" Filing Date: {doc.document_filing_date}")
100
101 if doc.file_download_uri:
102 print(f" Download URL: {doc.file_download_uri}")
103
104except Exception as e:
105 print(f"Error searching documents: {e}")
106
107# =============================================================================
108# 3. Search Trial Decisions with New Convenience Parameters
109# =============================================================================
110
111print("\n" + "=" * 80)
112print("3. Searching for trial decisions with new parameters")
113print("=" * 80)
114
115try:
116 # Using all the new convenience parameters
117 response = client.search_decisions(
118 trial_type_code_q="IPR",
119 decision_type_category_q="Decision",
120 patent_owner_name_q="*",
121 trial_status_category_q="Terminated",
122 decision_date_from_q="2023-01-01",
123 limit=5,
124 )
125
126 print(f"\nFound {response.count} Decisions in IPR proceedings")
127 print(f"Displaying first {len(response.patent_trial_document_data_bag)} results:")
128
129 for item in response.patent_trial_document_data_bag:
130 print(f"\n Trial Number: {item.trial_number}")
131
132 if item.trial_meta_data:
133 print(f" Trial Type: {item.trial_meta_data.trial_type_code}")
134 print(f" Status: {item.trial_meta_data.trial_status_category}")
135
136 if item.decision_data:
137 decision = item.decision_data
138 print(f" Decision Type: {decision.decision_type_category}")
139 print(f" Decision Date: {decision.decision_issue_date}")
140
141except Exception as e:
142 print(f"Error searching decisions: {e}")
143
144# =============================================================================
145# 4. Pagination Example
146# =============================================================================
147
148print("\n" + "=" * 80)
149print("4. Paginating through proceedings")
150print("=" * 80)
151
152try:
153 print("\nIterating through first 10 IPR proceedings from 2024...")
154 count = 0
155 for proceeding in client.paginate_proceedings(
156 trial_type_code_q="IPR",
157 petition_filing_date_from_q="2024-01-01",
158 limit=5, # Fetch 5 per page
159 ):
160 count += 1
161 print(f"{count}. {proceeding.trial_number}")
162
163 if count >= 10: # Stop after 10 results for this example
164 break
165
166 print(f"\nDisplayed {count} proceedings using pagination")
167
168except Exception as e:
169 print(f"Error paginating proceedings: {e}")
170
171# =============================================================================
172# 5. Advanced Query with Additional Parameters
173# =============================================================================
174
175print("\n" + "=" * 80)
176print("5. Advanced search with additional query parameters")
177print("=" * 80)
178
179try:
180 # Search using additional_query_params for custom filters
181 response = client.search_proceedings(
182 trial_type_code_q="PGR",
183 trial_status_category_q="Terminated",
184 sort="trialMetaData.petitionFilingDate desc",
185 fields="trialNumber,lastModifiedDateTime",
186 limit=3,
187 )
188
189 print(f"\nFound {response.count} Instituted PGR proceedings")
190 print(f"Displaying first {len(response.patent_trial_proceeding_data_bag)} results:")
191
192 for proceeding in response.patent_trial_proceeding_data_bag:
193 print(f"\n Trial Number: {proceeding.trial_number}")
194 print(f" Last Modified: {proceeding.last_modified_date_time}")
195
196except Exception as e:
197 print(f"Error with advanced search: {e}")