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