1"""Example usage of pyUSPTO for PTAB interferences.
2
3Demonstrates the PTABInterferencesClient for searching interference decisions
4by outcome, party name, and application number.
5"""
6
7import os
8
9from pyUSPTO import PTABInterferencesClient, 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 = PTABInterferencesClient(config=config)
19
20print("-" * 40)
21print("Example 1: Search interference decisions")
22print("-" * 40)
23
24# Search for recent interference decisions
25response = client.search_decisions(
26 decision_date_from_q="2023-01-01",
27 limit=5,
28)
29
30print(f"\nFound {response.count} interference decisions since 2023")
31print(f"Displaying first {len(response.patent_interference_data_bag)} results:")
32
33for decision in response.patent_interference_data_bag:
34 print(f"\n Interference Number: {decision.interference_number}")
35
36 if decision.interference_meta_data:
37 meta = decision.interference_meta_data
38 print(f" Style Name: {meta.interference_style_name}")
39 print(f" Last Modified: {meta.interference_last_modified_date}")
40
41 if decision.senior_party_data:
42 senior = decision.senior_party_data
43 print(f" Senior Party: {senior.patent_owner_name}")
44 if senior.patent_number:
45 print(f" Senior Patent: {senior.patent_number}")
46
47 if decision.junior_party_data:
48 junior = decision.junior_party_data
49 print(f" Junior Party: {junior.patent_owner_name}")
50 if junior.publication_number:
51 print(f" Junior Publication: {junior.publication_number}")
52
53 if decision.document_data:
54 doc = decision.document_data
55 print(f" Outcome: {doc.interference_outcome_category}")
56 print(f" Decision Type: {doc.decision_type_category}")
57
58print("-" * 40)
59print("Example 2: Search by outcome")
60print("-" * 40)
61
62response = client.search_decisions(
63 interference_outcome_category_q="Final Decision",
64 decision_date_from_q="2012-01-01",
65 limit=3,
66)
67
68print(f"\nFound {response.count} final decisions since 2012")
69print(f"Displaying first {len(response.patent_interference_data_bag)} results:")
70
71for decision in response.patent_interference_data_bag:
72 print(f"\n Interference Number: {decision.interference_number}")
73
74 if decision.senior_party_data:
75 print(f" Senior Party: {decision.senior_party_data.patent_owner_name}")
76 print(
77 f" Senior Application: {decision.senior_party_data.application_number_text}"
78 )
79
80 if decision.junior_party_data:
81 print(f" Junior Party: {decision.junior_party_data.patent_owner_name}")
82
83 if decision.document_data:
84 print(f" Outcome: {decision.document_data.interference_outcome_category}")
85 print(f" Decision Date: {decision.document_data.decision_issue_date}")
86
87print("-" * 40)
88print("Example 3: Search by party name")
89print("-" * 40)
90
91# Search for decisions involving a specific senior party
92response = client.search_decisions(
93 senior_party_name_q="*Corp*",
94 limit=3,
95)
96
97print(f"\nFound {response.count} decisions with 'Corp' in senior party name")
98print(f"Displaying first {len(response.patent_interference_data_bag)} results:")
99
100for decision in response.patent_interference_data_bag:
101 print(f"\n Interference Number: {decision.interference_number}")
102
103 if decision.senior_party_data:
104 senior = decision.senior_party_data
105 print(f" Senior Party: {senior.patent_owner_name}")
106 if senior.counsel_name:
107 print(f" Senior Counsel: {senior.counsel_name}")
108
109 if decision.junior_party_data:
110 junior = decision.junior_party_data
111 print(f" Junior Party: {junior.patent_owner_name}")
112 if junior.counsel_name:
113 print(f" Junior Counsel: {junior.counsel_name}")
114
115print("-" * 40)
116print("Example 4: Search by application number")
117print("-" * 40)
118
119response = client.search_decisions(
120 senior_party_application_number_q="12*",
121 limit=3,
122)
123
124print(
125 f"\nFound {response.count} decisions with senior applications starting with '12'"
126)
127print(f"Displaying first {len(response.patent_interference_data_bag)} results:")
128
129for decision in response.patent_interference_data_bag:
130 print(f"\n Interference Number: {decision.interference_number}")
131
132 if decision.senior_party_data:
133 print(
134 f" Senior Application: {decision.senior_party_data.application_number_text}"
135 )
136
137 if decision.junior_party_data:
138 print(
139 f" Junior Publication: {decision.junior_party_data.publication_number}"
140 )
141
142 if decision.document_data:
143 print(f" Decision Type: {decision.document_data.decision_type_category}")
144
145print("-" * 40)
146print("Example 5: Paginate through decisions")
147print("-" * 40)
148
149max_items = 5
150count = 0
151for decision in client.paginate_decisions(
152 decision_date_from_q="2023-01-01",
153 limit=3,
154):
155 count += 1
156 outcome = (
157 decision.document_data.interference_outcome_category
158 if decision.document_data
159 else "N/A"
160 )
161 print(f" {count}. {decision.interference_number} - {outcome}")
162
163 if count >= max_items:
164 print(f" ... (stopping at {max_items} items)")
165 break
166
167print(f"Retrieved {count} decisions via pagination")
168
169print("-" * 40)
170print("Example 6: Advanced search with multiple criteria")
171print("-" * 40)
172
173response = client.search_decisions(
174 decision_type_category_q="Decision",
175 decision_date_from_q="2020-01-01",
176 decision_date_to_q="2023-12-31",
177 sort="documentData.decisionIssueDate desc",
178 limit=3,
179)
180
181print(f"\nFound {response.count} Decisions between 2020-2023")
182print(f"Displaying first {len(response.patent_interference_data_bag)} results:")
183
184for decision in response.patent_interference_data_bag:
185 print(f"\n Interference Number: {decision.interference_number}")
186
187 if decision.interference_meta_data:
188 print(f" Style: {decision.interference_meta_data.interference_style_name}")
189
190 if decision.document_data:
191 print(f" Decision Type: {decision.document_data.decision_type_category}")
192 print(f" Decision Date: {decision.document_data.decision_issue_date}")
193 print(f" Outcome: {decision.document_data.interference_outcome_category}")
194
195 if decision.additional_party_data_bag:
196 print(f" Additional Parties: {len(decision.additional_party_data_bag)}")
197 for party in decision.additional_party_data_bag:
198 print(f" - {party.additional_party_name}")
199
200print("-" * 40)
201print("Example 7: Direct query string")
202print("-" * 40)
203
204# Use a direct query string for more complex searches
205response = client.search_decisions(
206 query='documentData.interferenceOutcomeCategory:"Final Decision"',
207 limit=3,
208)
209
210print(f"\nFound {response.count} final decisions.")
211print(f"Displaying first {len(response.patent_interference_data_bag)} results:")
212
213for decision in response.patent_interference_data_bag:
214 print(f"\n Interference Number: {decision.interference_number}")
215
216 if decision.document_data:
217 print(f" Outcome: {decision.document_data.interference_outcome_category}")