PTAB Interferences Example

  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)