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
 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)