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