1"""
2Example usage of the pyUSPTO module for Final Petition Decisions
3
4This example demonstrates how to use the FinalPetitionDecisionsClient to interact with the
5USPTO Final Petition Decisions API. It shows how to search for petition decisions, retrieve
6specific decisions by ID, download decision data, and access detailed information about
7petitions and their associated documents.
8"""
9
10import os
11
12from pyUSPTO.clients import FinalPetitionDecisionsClient
13from pyUSPTO.config import USPTOConfig
14
15# --- Initialization ---
16# Choose one method to initialize the client.
17# For this example, Method 1 is active. Replace "YOUR_API_KEY_HERE" with your actual key.
18
19# Method 1: Initialize the client with direct API key
20print("Method 1: 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 = FinalPetitionDecisionsClient(api_key=api_key)
27
28# Method 2: Initialize the client with USPTOConfig (alternative)
29# print("\nMethod 2: Initialize with USPTOConfig")
30# config_obj = USPTOConfig(
31# api_key="YOUR_API_KEY_HERE", # Replace with your actual API key
32# petition_decisions_base_url="https://api.uspto.gov", # Optional, uses default if not set
33# )
34# client = FinalPetitionDecisionsClient(config=config_obj)
35
36# Method 3: Initialize the client with environment variables (recommended for production)
37# print("\nMethod 3: Initialize with environment variables")
38# # Ensure USPTO_API_KEY is set in your environment
39# config_from_env = USPTOConfig.from_env()
40# client = FinalPetitionDecisionsClient(config=config_from_env)
41
42print("\nBeginning API requests with configured client:")
43
44# Basic search for petition decisions
45try:
46 print("\n" + "=" * 60)
47 print("Example 1: Basic Search for Petition Decisions")
48 print("=" * 60)
49
50 response = client.search_decisions(limit=5)
51 print(f"Found {response.count} total petition decisions.")
52 print(f"Displaying first {len(response.petition_decision_data_bag)} decisions:")
53
54 for decision in response.petition_decision_data_bag:
55 print(f"\n Decision ID: {decision.petition_decision_record_identifier}")
56 print(f" Application Number: {decision.application_number_text}")
57 print(f" Decision Type: {decision.decision_type_code}")
58 print(f" Decision Date: {decision.decision_date}")
59 print(f" Technology Center: {decision.technology_center_number}")
60
61 if decision.applicant_name:
62 print(f" Applicant: {decision.applicant_name}")
63
64 if decision.patent_number:
65 print(f" Patent Number: {decision.patent_number}")
66
67 if decision.inventor_bag:
68 print(f" Inventors ({len(decision.inventor_bag)}):")
69 for inventor in decision.inventor_bag[:3]: # Show first 3
70 name_parts = [
71 part for part in [inventor.first_name, inventor.last_name] if part
72 ]
73 print(f" - {' '.join(name_parts).strip()}")
74
75 if decision.document_bag:
76 print(f" Documents: {len(decision.document_bag)}")
77
78 print("-" * 40)
79
80except Exception as e:
81 print(f"Error in basic search: {e}")
82
83# Search with query parameter
84try:
85 print("\n" + "=" * 60)
86 print("Example 2: Search with Custom Query")
87 print("=" * 60)
88
89 # Search for decisions mentioning specific terms
90 response = client.search_decisions(
91 query="decisionTypeCode:GRANT",
92 limit=3
93 )
94 print(f"Found {response.count} decisions with GRANT type.")
95 print(f"Showing {len(response.petition_decision_data_bag)} results:")
96
97 for decision in response.petition_decision_data_bag:
98 print(f" - {decision.petition_decision_record_identifier}: {decision.decision_type_code}")
99
100except Exception as e:
101 print(f"Error searching with query: {e}")
102
103# Search using convenience parameters
104try:
105 print("\n" + "=" * 60)
106 print("Example 3: Search Using Convenience Parameters")
107 print("=" * 60)
108
109 # Search by application number (if you have a specific one)
110 print("\nSearching by date range...")
111 response = client.search_decisions(
112 decision_date_from_q="2023-01-01",
113 decision_date_to_q="2023-12-31",
114 limit=5
115 )
116 print(f"Found {response.count} decisions from 2023.")
117
118 # Search by technology center
119 print("\nSearching by technology center...")
120 response = client.search_decisions(
121 technology_center_q="2600",
122 limit=3
123 )
124 print(f"Found {response.count} decisions from Technology Center 2600.")
125
126except Exception as e:
127 print(f"Error with convenience parameters: {e}")
128
129# Get a specific decision by ID
130try:
131 print("\n" + "=" * 60)
132 print("Example 4: Get Specific Decision by ID")
133 print("=" * 60)
134
135 # First, get a decision ID from search results
136 response = client.search_decisions(limit=1)
137 if response.count > 0:
138 decision_id = response.petition_decision_data_bag[0].petition_decision_record_identifier
139
140 print(f"Retrieving decision: {decision_id}")
141 decision = client.get_decision_by_id(decision_id)
142
143 print(f"\nDecision Details:")
144 print(f" ID: {decision.petition_decision_record_identifier}")
145 print(f" Application: {decision.application_number_text}")
146 print(f" Patent: {decision.patent_number}")
147 print(f" Decision Type: {decision.decision_type_code}")
148 print(f" Decision Date: {decision.decision_date}")
149 print(f" Technology Center: {decision.technology_center_number}")
150 print(f" Group Art Unit: {decision.group_art_unit_number}")
151 print(f" Examiner: {decision.examiner_name_text}")
152
153 if decision.rule_bag:
154 print(f"\n Rules Cited ({len(decision.rule_bag)}):")
155 for rule in decision.rule_bag[:5]: # Show first 5
156 print(f" - {rule}")
157
158 if decision.statute_bag:
159 print(f"\n Statutes Cited ({len(decision.statute_bag)}):")
160 for statute in decision.statute_bag[:5]: # Show first 5
161 print(f" - {statute}")
162
163 if decision.document_bag:
164 print(f"\n Associated Documents ({len(decision.document_bag)}):")
165 for doc in decision.document_bag[:3]: # Show first 3
166 print(f" - Doc ID: {doc.document_identifier}")
167 print(f" Date: {doc.official_date}")
168 print(f" Direction: {doc.document_direction_category}")
169 if doc.page_total_quantity:
170 print(f" Pages: {doc.page_total_quantity}")
171 if doc.download_option_bag:
172 print(f" Download Options: {len(doc.download_option_bag)}")
173
174except Exception as e:
175 print(f"Error retrieving decision by ID: {e}")
176
177# Download petition decisions data
178try:
179 print("\n" + "=" * 60)
180 print("Example 5: Download Petition Decisions Data")
181 print("=" * 60)
182
183 # Download as JSON (returns response object)
184 print("\nDownloading decisions as JSON...")
185 response = client.download_decisions(
186 format="json",
187 decision_date_from_q="2023-01-01",
188 limit=5
189 )
190 print(f"Downloaded JSON with {len(response.petition_decision_data)} decision records")
191
192 # Download as CSV (automatically saves to file)
193 print("\nDownloading decisions as CSV...")
194 csv_path = client.download_decisions(
195 format="csv",
196 decision_date_from_q="2023-01-01",
197 limit=10,
198 destination_path="./downloads"
199 )
200 print(f"Downloaded CSV to: {csv_path}")
201
202except Exception as e:
203 print(f"Error downloading decisions: {e}")
204
205# Pagination example
206try:
207 print("\n" + "=" * 60)
208 print("Example 6: Paginating Through Results")
209 print("=" * 60)
210
211 page_size = 10
212 max_pages = 3 # Limit to 3 pages for example
213
214 print(f"Paginating through results ({page_size} per page, max {max_pages} pages)...")
215
216 page_count = 0
217 total_decisions = 0
218
219 for page_response in client.paginate_decisions(
220 limit=page_size,
221 query="decisionDate:[2023-01-01 TO 2023-12-31]"
222 ):
223 page_count += 1
224 decisions_in_page = len(page_response.petition_decision_data_bag)
225 total_decisions += decisions_in_page
226
227 print(f" Page {page_count}: {decisions_in_page} decisions")
228
229 if page_count >= max_pages:
230 print(f" (Stopping after {max_pages} pages for example)")
231 break
232
233 print(f"\nTotal decisions retrieved: {total_decisions} across {page_count} pages")
234
235except Exception as e:
236 print(f"Error during pagination: {e}")
237
238# Download a petition document
239try:
240 print("\n" + "=" * 60)
241 print("Example 7: Download Petition Decision Document")
242 print("=" * 60)
243
244 # Find a decision with downloadable documents
245 response = client.search_decisions(limit=20)
246
247 document_found = False
248 for decision in response.petition_decision_data_bag:
249 if decision.document_bag:
250 for doc in decision.document_bag:
251 if doc.download_option_bag and len(doc.download_option_bag) > 0:
252 download_option = doc.download_option_bag[0]
253
254 print(f"Found downloadable document:")
255 print(f" Document ID: {doc.document_identifier}")
256 print(f" MIME Type: {download_option.mime_type_identifier}")
257 print(f" Pages: {download_option.page_total_quantity}")
258 print(f" URL: {download_option.download_url}")
259
260 print(f"\nDownloading document...")
261 file_path = client.download_petition_document(
262 download_option,
263 file_path="./downloads"
264 )
265 print(f"Downloaded to: {file_path}")
266
267 document_found = True
268 break
269
270 if document_found:
271 break
272
273 if not document_found:
274 print("No downloadable documents found in the first 20 results")
275
276except Exception as e:
277 print(f"Error downloading document: {e}")
278
279# Advanced search example
280try:
281 print("\n" + "=" * 60)
282 print("Example 8: Advanced Search with Multiple Criteria")
283 print("=" * 60)
284
285 # Search with multiple parameters
286 response = client.search_decisions(
287 application_number_q="16*", # Applications starting with 16
288 decision_date_from_q="2020-01-01",
289 technology_center_q="2600",
290 limit=10
291 )
292
293 print(f"Search criteria:")
294 print(f" - Application numbers starting with '16'")
295 print(f" - Decision date from 2020-01-01")
296 print(f" - Technology Center 2600")
297 print(f"\nFound {response.count} matching decisions")
298
299 if response.count > 0:
300 print(f"Showing first {len(response.petition_decision_data_bag)} results:")
301 for decision in response.petition_decision_data_bag:
302 print(f" - App: {decision.application_number_text}, "
303 f"TC: {decision.technology_center_number}, "
304 f"Date: {decision.decision_date}")
305
306except Exception as e:
307 print(f"Error in advanced search: {e}")
308
309print("\n" + "=" * 60)
310print("Examples completed!")
311print("=" * 60)