1"""Example usage of the pyUSPTO module for PTAB Interferences API.
2
3This example demonstrates how to use the PTABInterferencesClient to interact with the USPTO PTAB
4(Patent Trial and Appeal Board) Interferences API. It shows how to search for interference
5decisions using various search criteria.
6
7PTAB Interferences are proceedings to determine priority of invention when two or more parties
8claim the same patentable invention.
9"""
10
11import os
12
13from pyUSPTO import PTABInterferencesClient
14from pyUSPTO.config import USPTOConfig
15
16# --- Initialization ---
17# Initialize the client with direct API key
18print("Initialize with direct API key")
19api_key = os.environ.get("USPTO_API_KEY", "YOUR_API_KEY_HERE")
20if api_key == "YOUR_API_KEY_HERE":
21 raise ValueError(
22 "WARNING: API key is not set. Please replace 'YOUR_API_KEY_HERE' or set USPTO_API_KEY environment variable."
23 )
24config = USPTOConfig(api_key=api_key)
25client = PTABInterferencesClient(config=config)
26
27print("\nBeginning PTAB Interferences API requests with configured client:")
28
29# =============================================================================
30# 1. Search Interference Decisions
31# =============================================================================
32
33print("\n" + "=" * 80)
34print("1. Searching for interference decisions")
35print("=" * 80)
36
37try:
38 # Search for recent interference decisions
39 response = client.search_decisions(
40 decision_date_from_q="2023-01-01",
41 limit=5,
42 )
43
44 print(f"\nFound {response.count} interference decisions since 2023")
45 print(f"Displaying first {len(response.patent_interference_data_bag)} results:")
46
47 for decision in response.patent_interference_data_bag:
48 print(f"\n Interference Number: {decision.interference_number}")
49
50 if decision.interference_meta_data:
51 meta = decision.interference_meta_data
52 print(f" Style Name: {meta.interference_style_name}")
53 print(f" Last Modified: {meta.interference_last_modified_date}")
54
55 if decision.senior_party_data:
56 senior = decision.senior_party_data
57 print(f" Senior Party: {senior.patent_owner_name}")
58 if senior.patent_number:
59 print(f" Senior Patent: {senior.patent_number}")
60
61 if decision.junior_party_data:
62 junior = decision.junior_party_data
63 print(f" Junior Party: {junior.patent_owner_name}")
64 if junior.publication_number:
65 print(f" Junior Publication: {junior.publication_number}")
66
67 if decision.document_data:
68 doc = decision.document_data
69 print(f" Outcome: {doc.interference_outcome_category}")
70 print(f" Decision Type: {doc.decision_type_category}")
71
72except Exception as e:
73 print(f"Error searching interference decisions: {e}")
74
75# =============================================================================
76# 2. Search by Interference Outcome
77# =============================================================================
78
79print("\n" + "=" * 80)
80print("2. Searching for decisions by outcome")
81print("=" * 80)
82
83try:
84 # Search for decisions with specific outcomes
85 response = client.search_decisions(
86 interference_outcome_category_q="Final Decision",
87 decision_date_from_q="2012-01-01",
88 limit=3,
89 )
90
91 print(f"\nFound {response.count} final decisions since 2012")
92 print(f"Displaying first {len(response.patent_interference_data_bag)} results:")
93
94 for decision in response.patent_interference_data_bag:
95 print(f"\n Interference Number: {decision.interference_number}")
96
97 if decision.senior_party_data:
98 print(f" Senior Party: {decision.senior_party_data.patent_owner_name}")
99 print(
100 f" Senior Application: {decision.senior_party_data.application_number_text}"
101 )
102
103 if decision.junior_party_data:
104 print(f" Junior Party: {decision.junior_party_data.patent_owner_name}")
105
106 if decision.document_data:
107 print(f" Outcome: {decision.document_data.interference_outcome_category}")
108 print(f" Decision Date: {decision.document_data.decision_issue_date}")
109
110except Exception as e:
111 print(f"Error searching by outcome: {e}")
112
113# =============================================================================
114# 3. Search by Party Name
115# =============================================================================
116
117print("\n" + "=" * 80)
118print("3. Searching for decisions by party name")
119print("=" * 80)
120
121try:
122 # Search for decisions involving a specific senior party
123 response = client.search_decisions(
124 senior_party_name_q="*Corp*", # Any company with "Corp" in the name
125 limit=3,
126 )
127
128 print(f"\nFound {response.count} decisions with 'Corp' in senior party name")
129 print(f"Displaying first {len(response.patent_interference_data_bag)} results:")
130
131 for decision in response.patent_interference_data_bag:
132 print(f"\n Interference Number: {decision.interference_number}")
133
134 if decision.senior_party_data:
135 senior = decision.senior_party_data
136 print(f" Senior Party: {senior.patent_owner_name}")
137 if senior.counsel_name:
138 print(f" Senior Counsel: {senior.counsel_name}")
139
140 if decision.junior_party_data:
141 junior = decision.junior_party_data
142 print(f" Junior Party: {junior.patent_owner_name}")
143 if junior.counsel_name:
144 print(f" Junior Counsel: {junior.counsel_name}")
145
146except Exception as e:
147 print(f"Error searching by party name: {e}")
148
149# =============================================================================
150# 4. Search by Application Numbers
151# =============================================================================
152
153print("\n" + "=" * 80)
154print("4. Searching for decisions by application numbers")
155print("=" * 80)
156
157try:
158 # Search for decisions involving specific application numbers
159 response = client.search_decisions(
160 senior_party_application_number_q="12*", # Applications starting with 12/
161 limit=3,
162 )
163
164 print(
165 f"\nFound {response.count} decisions with senior applications starting with '12'"
166 )
167 print(f"Displaying first {len(response.patent_interference_data_bag)} results:")
168
169 for decision in response.patent_interference_data_bag:
170 print(f"\n Interference Number: {decision.interference_number}")
171
172 if decision.senior_party_data:
173 print(
174 f" Senior Application: {decision.senior_party_data.application_number_text}"
175 )
176
177 if decision.junior_party_data:
178 print(
179 f" Junior Publication: {decision.junior_party_data.publication_number}"
180 )
181
182 if decision.document_data:
183 print(f" Decision Type: {decision.document_data.decision_type_category}")
184
185except Exception as e:
186 print(f"Error searching by application numbers: {e}")
187
188# =============================================================================
189# 5. Pagination Example
190# =============================================================================
191
192print("\n" + "=" * 80)
193print("5. Paginating through interference decisions")
194print("=" * 80)
195
196try:
197 print("\nIterating through first 5 interference decisions from 2023...")
198 count = 0
199 for decision in client.paginate_decisions(
200 decision_date_from_q="2023-01-01",
201 limit=3, # Fetch 3 per page
202 ):
203 count += 1
204 outcome = (
205 decision.document_data.interference_outcome_category
206 if decision.document_data
207 else "N/A"
208 )
209 print(f"{count}. {decision.interference_number} - {outcome}")
210
211 if count >= 5: # Stop after 5 results for this example
212 break
213
214 print(f"\nDisplayed {count} decisions using pagination")
215
216except Exception as e:
217 print(f"Error paginating decisions: {e}")
218
219# =============================================================================
220# 6. Advanced Search with Multiple Criteria
221# =============================================================================
222
223print("\n" + "=" * 80)
224print("6. Advanced search with multiple criteria")
225print("=" * 80)
226
227try:
228 # Search with multiple convenience parameters
229 response = client.search_decisions(
230 decision_type_category_q="Decision",
231 decision_date_from_q="2020-01-01",
232 decision_date_to_q="2023-12-31",
233 sort="documentData.decisionIssueDate desc",
234 limit=3,
235 )
236
237 print(f"\nFound {response.count} Decisions between 2020-2023")
238 print(f"Displaying first {len(response.patent_interference_data_bag)} results:")
239
240 for decision in response.patent_interference_data_bag:
241 print(f"\n Interference Number: {decision.interference_number}")
242
243 if decision.interference_meta_data:
244 print(f" Style: {decision.interference_meta_data.interference_style_name}")
245
246 if decision.document_data:
247 print(f" Decision Type: {decision.document_data.decision_type_category}")
248 print(f" Decision Date: {decision.document_data.decision_issue_date}")
249 print(f" Outcome: {decision.document_data.interference_outcome_category}")
250
251 # Show additional parties if present
252 if decision.additional_party_data_bag:
253 print(f" Additional Parties: {len(decision.additional_party_data_bag)}")
254 for party in decision.additional_party_data_bag:
255 print(f" - {party.additional_party_name}")
256
257except Exception as e:
258 print(f"Error with advanced search: {e}")
259
260# =============================================================================
261# 7. Direct Query String Example
262# =============================================================================
263
264print("\n" + "=" * 80)
265print("7. Using direct query string for complex searches")
266print("=" * 80)
267
268try:
269 # Use a direct query string for more complex searches
270 response = client.search_decisions(
271 query='documentData.interferenceOutcomeCategory:"Final Decision"',
272 limit=3,
273 )
274
275 print(f"\nFound {response.count} final decisions.")
276 print(f"Displaying first {len(response.patent_interference_data_bag)} results:")
277
278 for decision in response.patent_interference_data_bag:
279 print(f"\n Interference Number: {decision.interference_number}")
280
281 if decision.document_data:
282 print(f" Outcome: {decision.document_data.interference_outcome_category}")
283
284except Exception as e:
285 print(f"Error with direct query: {e}")
286
287print("\n" + "=" * 80)
288print("PTAB Interferences API example completed successfully!")
289print("=" * 80)