Petition Decisions Example

  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        )