1"""Example usage of pyUSPTO for Final Petition Decisions.
2
3Demonstrates the FinalPetitionDecisionsClient for searching decisions,
4downloading decision data, and paginating results.
5"""
6
7import json
8import os
9
10from pyUSPTO import FinalPetitionDecisionsClient, PetitionDecisionDownloadResponse, USPTOConfig
11
12DEST_PATH = "./notes/download-example"
13
14# --- Client Initialization ---
15api_key = os.environ.get("USPTO_API_KEY", "YOUR_API_KEY_HERE")
16if api_key == "YOUR_API_KEY_HERE":
17 raise ValueError(
18 "API key is not set. Set the USPTO_API_KEY environment variable."
19 )
20config = USPTOConfig(api_key=api_key)
21client = FinalPetitionDecisionsClient(config=config)
22
23print("-" * 40)
24print("Example 1: Basic search")
25print("-" * 40)
26
27response = client.search_decisions(limit=5)
28print(f"Found {response.count} total petition decisions.")
29print(f"Displaying first {len(response.petition_decision_data_bag)} decisions:")
30
31for decision in response.petition_decision_data_bag:
32 print(f"\n Decision ID: {decision.petition_decision_record_identifier}")
33 print(f" Application Number: {decision.application_number_text}")
34 print(f" Decision Type: {decision.decision_type_code}")
35 print(f" Decision Date: {decision.decision_date}")
36 print(f" Technology Center: {decision.technology_center}")
37
38 if decision.first_applicant_name:
39 print(f" Applicant: {decision.first_applicant_name}")
40
41 if decision.patent_number:
42 print(f" Patent Number: {decision.patent_number}")
43
44 if decision.inventor_bag:
45 print(f" Inventors ({len(decision.inventor_bag)}):")
46 for inventor in decision.inventor_bag[:3]:
47 print(f" - {inventor}")
48
49 if decision.document_bag:
50 print(f" Documents: {len(decision.document_bag)}")
51
52print("-" * 40)
53print("Example 2: Search with custom query")
54print("-" * 40)
55
56response = client.search_decisions(query="decisionTypeCode:C", limit=3)
57print(f"Found {response.count} decisions with C type.")
58print(f"Showing {len(response.petition_decision_data_bag)} results:")
59
60for decision in response.petition_decision_data_bag:
61 print(
62 f" - {decision.petition_decision_record_identifier}: {decision.decision_type_code}"
63 )
64
65print("-" * 40)
66print("Example 3: Search with convenience parameters")
67print("-" * 40)
68
69# Search by date range
70print("\nSearching by date range...")
71response = client.search_decisions(
72 decision_date_from_q="2023-01-01", decision_date_to_q="2023-12-31", limit=5
73)
74print(f"Found {response.count} decisions from 2023.")
75
76# Search by technology center
77print("\nSearching by technology center...")
78response = client.search_decisions(technology_center_q="2600", limit=3)
79print(f"Found {response.count} decisions from Technology Center 2600.")
80
81print("-" * 40)
82print("Example 4: Get specific decision by ID")
83print("-" * 40)
84
85# Get a decision ID from search results
86response = client.search_decisions(limit=1)
87if response.count > 0:
88 decision_id = response.petition_decision_data_bag[
89 0
90 ].petition_decision_record_identifier
91 if decision_id:
92 print(f"Retrieving decision: {decision_id}")
93 decision = client.get_decision_by_id(decision_id)
94 if decision:
95 print("\nDecision Details:")
96 print(f" ID: {decision.petition_decision_record_identifier}")
97 print(f" Application: {decision.application_number_text}")
98 print(f" Patent: {decision.patent_number}")
99 print(f" Decision Type: {decision.decision_type_code}")
100 print(f" Decision Date: {decision.decision_date}")
101 print(f" Technology Center: {decision.technology_center}")
102 print(f" Group Art Unit: {decision.group_art_unit_number}")
103
104 if decision.rule_bag:
105 print(f"\n Rules Cited ({len(decision.rule_bag)}):")
106 for rule in decision.rule_bag[:5]:
107 print(f" - {rule}")
108
109 if decision.statute_bag:
110 print(f"\n Statutes Cited ({len(decision.statute_bag)}):")
111 for statute in decision.statute_bag[:5]:
112 print(f" - {statute}")
113
114 if decision.document_bag:
115 print(f"\n Associated Documents ({len(decision.document_bag)}):")
116 for doc in decision.document_bag[:3]:
117 print(f" - Doc ID: {doc.document_identifier}")
118 print(f" Date: {doc.official_date}")
119 print(f" Doc. Code: {doc.document_code_description_text}")
120 print(f" Direction: {doc.direction_category}")
121 if doc.download_option_bag:
122 print(
123 f" Download Options: {len(doc.download_option_bag)}"
124 )
125 for mime in doc.download_option_bag:
126 print(f" Mime Type: {mime.mime_type_identifier}")
127 print(f" Pages: {mime.page_total_quantity}")
128
129print("-" * 40)
130print("Example 5: Download petition decisions data")
131print("-" * 40)
132
133# Download as JSON (returns response object)
134print("\nDownloading decisions as JSON...")
135response = client.download_decisions(
136 format="json", decision_date_from_q="2023-01-01", limit=5, overwrite=True
137)
138if isinstance(response, PetitionDecisionDownloadResponse):
139 print(
140 f"Downloaded JSON with {len(response.petition_decision_data)} decision records"
141 )
142 print(json.dumps(response.to_dict(), indent=2))
143
144# Download as CSV (automatically saves to file)
145print("\nDownloading decisions as CSV...")
146csv_path = client.download_decisions(
147 format="csv",
148 decision_date_from_q="2023-01-01",
149 limit=10,
150 destination=DEST_PATH,
151 overwrite=True,
152)
153print(f"Downloaded CSV to: {csv_path}")
154
155print("-" * 40)
156print("Example 6: Paginate through results")
157print("-" * 40)
158
159max_items = 30
160count = 0
161for decision in client.paginate_decisions(
162 limit=10, query="decisionDate:[2023-01-01 TO 2023-12-31]"
163):
164 count += 1
165 if count >= max_items:
166 print(f" ... (stopping at {max_items} items)")
167 break
168
169print(f"Retrieved {count} decisions via pagination")
170
171print("-" * 40)
172print("Example 7: Download petition document")
173print("-" * 40)
174
175# Find a decision with downloadable documents
176response = client.search_decisions(limit=20)
177
178document_found = False
179for decision in response.petition_decision_data_bag:
180 d = client.get_decision_by_id(
181 decision.petition_decision_record_identifier, include_documents=True
182 )
183 print(
184 f"Getting docs for patent: {d.invention_title} with id: {d.petition_decision_record_identifier}"
185 ) # type: ignore
186 if d and d.document_bag:
187 for doc in d.document_bag:
188 if doc.download_option_bag and len(doc.download_option_bag) > 0:
189 download_option = doc.download_option_bag[0]
190
191 print("Found downloadable document:")
192 print(f" Document ID: {doc.document_identifier}")
193 print(f" MIME Type: {download_option.mime_type_identifier}")
194 print(f" Pages: {download_option.page_total_quantity}")
195 print(f" URL: {download_option.download_url}")
196
197 print("\nDownloading document...")
198 file_path = client.download_petition_document(
199 download_option=download_option,
200 destination=DEST_PATH,
201 )
202 print(f"Downloaded to: {file_path}")
203
204 document_found = True
205 break
206
207 if document_found:
208 break
209
210if not document_found:
211 print("No downloadable documents found in the first 20 results")
212
213print("-" * 40)
214print("Example 8: Advanced search with multiple criteria")
215print("-" * 40)
216
217response = client.search_decisions(
218 application_number_q="16*",
219 decision_date_from_q="2020-01-01",
220 technology_center_q="2600",
221 limit=10,
222)
223
224print("Search criteria:")
225print(" - Application numbers starting with '16'")
226print(" - Decision date from 2020-01-01")
227print(" - Technology Center 2600")
228print(f"\nFound {response.count} matching decisions")
229
230if response.count > 0:
231 print(f"Showing first {len(response.petition_decision_data_bag)} results:")
232 for decision in response.petition_decision_data_bag:
233 print(
234 f" - App: {decision.application_number_text}, "
235 f"TC: {decision.technology_center}, "
236 f"Date: {decision.decision_date}"
237 )