1"""Example usage of pyUSPTO for PTAB ex parte appeals.
2
3Demonstrates the PTABAppealsClient for searching appeal decisions
4by technology center, decision type, and application number.
5"""
6
7import os
8
9from pyUSPTO import PTABAppealsClient, USPTOConfig
10
11# --- Client Initialization ---
12api_key = os.environ.get("USPTO_API_KEY", "YOUR_API_KEY_HERE")
13if api_key == "YOUR_API_KEY_HERE":
14 raise ValueError(
15 "API key is not set. Set the USPTO_API_KEY environment variable."
16 )
17config = USPTOConfig(api_key=api_key)
18client = PTABAppealsClient(config=config)
19
20print("-" * 40)
21print("Example 1: Search by technology center")
22print("-" * 40)
23
24# Search for decisions from Technology Center 3600 (Business Methods/Software)
25response = client.search_decisions(
26 technology_center_number_q="3600",
27 decision_date_from_q="2023-01-01",
28 decision_date_to_q="2023-12-31",
29 limit=5,
30)
31
32print(f"\nFound {response.count} appeal decisions from TC 3600 in 2023")
33print(f"Displaying first {len(response.patent_appeal_data_bag)} results:")
34
35for decision in response.patent_appeal_data_bag:
36 print(f"\n Appeal Number: {decision.appeal_number}")
37
38 if decision.appeal_meta_data:
39 meta = decision.appeal_meta_data
40 print(f" Application Type: {meta.application_type_category}")
41 print(f" Filing Date: {meta.appeal_filing_date}")
42
43 if decision.appellant_data:
44 appellant = decision.appellant_data
45 print(f" Application Number: {appellant.application_number_text}")
46 print(f" Technology Center: {appellant.technology_center_number}")
47
48 if appellant.inventor_name:
49 print(f" Inventor: {appellant.inventor_name}")
50
51 if decision.decision_data:
52 dec = decision.decision_data
53 print(f" Decision Type: {dec.decision_type_category}")
54 print(f" Decision Date: {dec.decision_issue_date}")
55
56print("-" * 40)
57print("Example 2: Search by decision type")
58print("-" * 40)
59
60response = client.search_decisions(
61 decision_type_category_q="Decision",
62 decision_date_from_q="2024-01-01",
63 limit=5,
64)
65
66print(f"\nFound {response.count} 'Decision's since 2024")
67print(f"Displaying first {len(response.patent_appeal_data_bag)} results:")
68
69for decision in response.patent_appeal_data_bag:
70 print(f"\n Appeal Number: {decision.appeal_number}")
71
72 if decision.appellant_data:
73 print(f" Application: {decision.appellant_data.application_number_text}")
74 print(f" Inventor: {decision.appellant_data.inventor_name or 'N/A'}")
75
76 if decision.decision_data:
77 print(f" Decision: {decision.decision_data.decision_type_category}")
78 print(f" Outcome: {decision.decision_data.appeal_outcome_category}")
79 print(f" Date: {decision.decision_data.decision_issue_date}")
80
81print("-" * 40)
82print("Example 3: Search by application number")
83print("-" * 40)
84
85# Search for decisions related to applications starting with "15"
86response = client.search_decisions(
87 application_number_text_q="15*",
88 decision_date_from_q="2023-01-01",
89 limit=3,
90)
91
92print(f"\nFound {response.count} decisions for applications starting with '15/'")
93print(f"Displaying first {len(response.patent_appeal_data_bag)} results:")
94
95for decision in response.patent_appeal_data_bag:
96 print(f"\n Appeal Number: {decision.appeal_number}")
97
98 if decision.appellant_data:
99 print(f" Application: {decision.appellant_data.application_number_text}")
100 print(f" TC Number: {decision.appellant_data.technology_center_number}")
101
102 if decision.document_data:
103 doc = decision.document_data
104 print(f" Document Name: {doc.document_name}")
105 if doc.file_download_uri:
106 print(f" Download URL: {doc.file_download_uri}")
107
108print("-" * 40)
109print("Example 4: Paginate through decisions")
110print("-" * 40)
111
112max_items = 10
113count = 0
114for decision in client.paginate_decisions(
115 decision_date_from_q="2024-01-01",
116 limit=5,
117):
118 count += 1
119 decision_type = (
120 decision.decision_data.decision_type_category
121 if decision.decision_data
122 else "N/A"
123 )
124 print(f" {count}. {decision.appeal_number} - {decision_type}")
125
126 if count >= max_items:
127 print(f" ... (stopping at {max_items} items)")
128 break
129
130print(f"Retrieved {count} decisions via pagination")
131
132print("-" * 40)
133print("Example 5: Advanced search with multiple criteria")
134print("-" * 40)
135
136response = client.search_decisions(
137 technology_center_number_q="2100",
138 decision_type_category_q="Decision",
139 decision_date_from_q="2023-01-01",
140 decision_date_to_q="2023-12-31",
141 sort="decisionData.decisionIssueDate desc",
142 limit=3,
143)
144
145print(f"\nFound {response.count} Decisions from TC 2100 (Electronics) in 2023")
146print(f"Displaying first {len(response.patent_appeal_data_bag)} results:")
147
148for decision in response.patent_appeal_data_bag:
149 print(f"\n Appeal Number: {decision.appeal_number}")
150
151 if decision.appellant_data:
152 print(f" Application: {decision.appellant_data.application_number_text}")
153
154 if decision.decision_data:
155 print(f" Decision: {decision.decision_data.decision_type_category}")
156 print(f" Date: {decision.decision_data.decision_issue_date}")
157
158print("-" * 40)
159print("Example 6: Direct query string")
160print("-" * 40)
161
162# Use a direct query string for more complex searches
163response = client.search_decisions(
164 query="appellantData.technologyCenterNumber:3600 AND decisionData.appealOutcomeCategory:(Affirmed OR Reversed)",
165 limit=10,
166)
167
168print(f"\nFound {response.count} Affirmed/Reversed decisions from TC 3600")
169print(f"Displaying first {len(response.patent_appeal_data_bag)} results:")
170
171for decision in response.patent_appeal_data_bag:
172 print(f"\n Appeal Number: {decision.appeal_number}")
173
174 if decision.appellant_data:
175 print(f" Application: {decision.appellant_data.application_number_text}")
176
177 if decision.decision_data:
178 print(f" Decision: {decision.decision_data.decision_type_category}")
179 print(f" Outcome: {decision.decision_data.appeal_outcome_category}")