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