PTAB Trials Example

  1"""Example usage of the pyUSPTO module for PTAB Trials API.
  2
  3This example demonstrates how to use the PTABTrialsClient to interact with the USPTO PTAB
  4(Patent Trial and Appeal Board) Trials API. It shows how to search for trial proceedings,
  5documents, and decisions using various search criteria.
  6
  7PTAB Trials include:
  8- IPR (Inter Partes Review)
  9- PGR (Post-Grant Review)
 10- CBM (Covered Business Method)
 11- DER (Derivation) proceedings
 12"""
 13
 14import os
 15
 16from pyUSPTO import PTABTrialsClient
 17
 18# --- Initialization ---
 19# Initialize the client with direct API key
 20print("Initialize with direct API key")
 21api_key = os.environ.get("USPTO_API_KEY", "YOUR_API_KEY_HERE")
 22if api_key == "YOUR_API_KEY_HERE":
 23    raise ValueError(
 24        "WARNING: API key is not set. Please replace 'YOUR_API_KEY_HERE' or set USPTO_API_KEY environment variable."
 25    )
 26client = PTABTrialsClient(api_key=api_key)
 27
 28print("\nBeginning PTAB Trials API requests with configured client:")
 29
 30# =============================================================================
 31# 1. Search Trial Proceedings
 32# =============================================================================
 33
 34print("\n" + "=" * 80)
 35print("1. Searching for IPR trial proceedings")
 36print("=" * 80)
 37
 38try:
 39    # Search for IPR proceedings filed in 2023
 40    response = client.search_proceedings(
 41        trial_type_code_q="IPR",
 42        petition_filing_date_from_q="2023-01-01",
 43        petition_filing_date_to_q="2023-12-31",
 44        limit=5,
 45    )
 46
 47    print(f"\nFound {response.count} IPR proceedings filed in 2023")
 48    print(f"Displaying first {len(response.patent_trial_proceeding_data_bag)} results:")
 49
 50    for proceeding in response.patent_trial_proceeding_data_bag:
 51        print(f"\n  Trial Number: {proceeding.trial_number}")
 52
 53        if proceeding.trial_meta_data:
 54            meta = proceeding.trial_meta_data
 55            print(f"  Trial Type: {meta.trial_type_code}")
 56            print(f"  Status: {meta.trial_status_category}")
 57            print(f"  Filing Date: {meta.petition_filing_date}")
 58
 59        if proceeding.patent_owner_data:
 60            print(f"  Patent Owner: {proceeding.patent_owner_data.patent_owner_name}")
 61            print(f"  Patent Number: {proceeding.patent_owner_data.patent_number}")
 62
 63        if proceeding.regular_petitioner_data:
 64            print(
 65                f"  Petitioner: {proceeding.regular_petitioner_data.real_party_in_interest_name}"
 66            )
 67
 68except Exception as e:
 69    print(f"Error searching proceedings: {e}")
 70
 71# =============================================================================
 72# 2. Search Trial Documents
 73# =============================================================================
 74
 75print("\n" + "=" * 80)
 76print("2. Searching for trial documents")
 77print("=" * 80)
 78
 79try:
 80    # Search for documents in a specific trial
 81    # Using the new convenience parameters for petitioner and patent owner
 82    response = client.search_documents(
 83        trial_number_q="IPR2025-01319",
 84        limit=10,
 85    )
 86
 87    print(f"\nFound {response.count} documents")
 88    print(f"Displaying first {len(response.patent_trial_document_data_bag)} results:")
 89
 90    for item in response.patent_trial_document_data_bag:
 91        print(f"\n  Trial Number: {item.trial_number}")
 92
 93        if item.document_data:
 94            doc = item.document_data
 95            print(f"  Document Type: {doc.document_type_description_text}")
 96            print(f"  Filing Date: {doc.document_filing_date}")
 97
 98            if doc.file_download_uri:
 99                print(f"  Download URL: {doc.file_download_uri}")
100
101except Exception as e:
102    print(f"Error searching documents: {e}")
103
104# =============================================================================
105# 3. Search Trial Decisions with New Convenience Parameters
106# =============================================================================
107
108print("\n" + "=" * 80)
109print("3. Searching for trial decisions with new parameters")
110print("=" * 80)
111
112try:
113    # Using all the new convenience parameters
114    response = client.search_decisions(
115        trial_type_code_q="IPR",
116        decision_type_category_q="Decision",
117        patent_owner_name_q="*",
118        trial_status_category_q="Terminated",
119        decision_date_from_q="2023-01-01",
120        limit=5,
121    )
122
123    print(f"\nFound {response.count} Decisions in IPR proceedings")
124    print(f"Displaying first {len(response.patent_trial_document_data_bag)} results:")
125
126    for item in response.patent_trial_document_data_bag:
127        print(f"\n  Trial Number: {item.trial_number}")
128
129        if item.trial_meta_data:
130            print(f"  Trial Type: {item.trial_meta_data.trial_type_code}")
131            print(f"  Status: {item.trial_meta_data.trial_status_category}")
132
133        if item.decision_data:
134            decision = item.decision_data
135            print(f"  Decision Type: {decision.decision_type_category}")
136            print(f"  Decision Date: {decision.decision_issue_date}")
137
138except Exception as e:
139    print(f"Error searching decisions: {e}")
140
141# =============================================================================
142# 4. Pagination Example
143# =============================================================================
144
145print("\n" + "=" * 80)
146print("4. Paginating through proceedings")
147print("=" * 80)
148
149try:
150    print("\nIterating through first 10 IPR proceedings from 2024...")
151    count = 0
152    for proceeding in client.paginate_proceedings(
153        trial_type_code_q="IPR",
154        petition_filing_date_from_q="2024-01-01",
155        limit=5,  # Fetch 5 per page
156    ):
157        count += 1
158        print(f"{count}. {proceeding.trial_number}")
159
160        if count >= 10:  # Stop after 10 results for this example
161            break
162
163    print(f"\nDisplayed {count} proceedings using pagination")
164
165except Exception as e:
166    print(f"Error paginating proceedings: {e}")
167
168# =============================================================================
169# 5. Advanced Query with Additional Parameters
170# =============================================================================
171
172print("\n" + "=" * 80)
173print("5. Advanced search with additional query parameters")
174print("=" * 80)
175
176try:
177    # Search using additional_query_params for custom filters
178    response = client.search_proceedings(
179        trial_type_code_q="PGR",
180        trial_status_category_q="Terminated",
181        sort="trialMetaData.petitionFilingDate desc",
182        fields="trialNumber,lastModifiedDateTime",
183        limit=3,
184    )
185
186    print(f"\nFound {response.count} Instituted PGR proceedings")
187    print(f"Displaying first {len(response.patent_trial_proceeding_data_bag)} results:")
188
189    for proceeding in response.patent_trial_proceeding_data_bag:
190        print(f"\n  Trial Number: {proceeding.trial_number}")
191        print(f"  Last Modified: {proceeding.last_modified_date_time}")
192
193except Exception as e:
194    print(f"Error with advanced search: {e}")