PTAB Appeals Example

  1"""Example usage of pyUSPTO for PTAB ex parte appeals.
  2
  3Demonstrates the PTABAppealsClient for searching appeal decisions
  4by technology center, decision type, and application number.
  5"""
  6
  7import os
  8
  9from pyUSPTO import PTABAppealsClient, 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 = PTABAppealsClient(config=config)
 19
 20print("-" * 40)
 21print("Example 1: Search by technology center")
 22print("-" * 40)
 23
 24# Search for decisions from Technology Center 3600 (Business Methods/Software)
 25response = client.search_decisions(
 26    technology_center_number_q="3600",
 27    decision_date_from_q="2023-01-01",
 28    decision_date_to_q="2023-12-31",
 29    limit=5,
 30)
 31
 32print(f"\nFound {response.count} appeal decisions from TC 3600 in 2023")
 33print(f"Displaying first {len(response.patent_appeal_data_bag)} results:")
 34
 35for decision in response.patent_appeal_data_bag:
 36    print(f"\n  Appeal Number: {decision.appeal_number}")
 37
 38    if decision.appeal_meta_data:
 39        meta = decision.appeal_meta_data
 40        print(f"  Application Type: {meta.application_type_category}")
 41        print(f"  Filing Date: {meta.appeal_filing_date}")
 42
 43    if decision.appellant_data:
 44        appellant = decision.appellant_data
 45        print(f"  Application Number: {appellant.application_number_text}")
 46        print(f"  Technology Center: {appellant.technology_center_number}")
 47
 48        if appellant.inventor_name:
 49            print(f"  Inventor: {appellant.inventor_name}")
 50
 51    if decision.decision_data:
 52        dec = decision.decision_data
 53        print(f"  Decision Type: {dec.decision_type_category}")
 54        print(f"  Decision Date: {dec.decision_issue_date}")
 55
 56print("-" * 40)
 57print("Example 2: Search by decision type")
 58print("-" * 40)
 59
 60response = client.search_decisions(
 61    decision_type_category_q="Decision",
 62    decision_date_from_q="2024-01-01",
 63    limit=5,
 64)
 65
 66print(f"\nFound {response.count} 'Decision's since 2024")
 67print(f"Displaying first {len(response.patent_appeal_data_bag)} results:")
 68
 69for decision in response.patent_appeal_data_bag:
 70    print(f"\n  Appeal Number: {decision.appeal_number}")
 71
 72    if decision.appellant_data:
 73        print(f"  Application: {decision.appellant_data.application_number_text}")
 74        print(f"  Inventor: {decision.appellant_data.inventor_name or 'N/A'}")
 75
 76    if decision.decision_data:
 77        print(f"  Decision: {decision.decision_data.decision_type_category}")
 78        print(f"  Outcome: {decision.decision_data.appeal_outcome_category}")
 79        print(f"  Date: {decision.decision_data.decision_issue_date}")
 80
 81print("-" * 40)
 82print("Example 3: Search by application number")
 83print("-" * 40)
 84
 85# Search for decisions related to applications starting with "15"
 86response = client.search_decisions(
 87    application_number_text_q="15*",
 88    decision_date_from_q="2023-01-01",
 89    limit=3,
 90)
 91
 92print(f"\nFound {response.count} decisions for applications starting with '15/'")
 93print(f"Displaying first {len(response.patent_appeal_data_bag)} results:")
 94
 95for decision in response.patent_appeal_data_bag:
 96    print(f"\n  Appeal Number: {decision.appeal_number}")
 97
 98    if decision.appellant_data:
 99        print(f"  Application: {decision.appellant_data.application_number_text}")
100        print(f"  TC Number: {decision.appellant_data.technology_center_number}")
101
102    if decision.document_data:
103        doc = decision.document_data
104        print(f"  Document Name: {doc.document_name}")
105        if doc.file_download_uri:
106            print(f"  Download URL: {doc.file_download_uri}")
107
108print("-" * 40)
109print("Example 4: Paginate through decisions")
110print("-" * 40)
111
112max_items = 10
113count = 0
114for decision in client.paginate_decisions(
115    decision_date_from_q="2024-01-01",
116    limit=5,
117):
118    count += 1
119    decision_type = (
120        decision.decision_data.decision_type_category
121        if decision.decision_data
122        else "N/A"
123    )
124    print(f"  {count}. {decision.appeal_number} - {decision_type}")
125
126    if count >= max_items:
127        print(f"  ... (stopping at {max_items} items)")
128        break
129
130print(f"Retrieved {count} decisions via pagination")
131
132print("-" * 40)
133print("Example 5: Advanced search with multiple criteria")
134print("-" * 40)
135
136response = client.search_decisions(
137    technology_center_number_q="2100",
138    decision_type_category_q="Decision",
139    decision_date_from_q="2023-01-01",
140    decision_date_to_q="2023-12-31",
141    sort="decisionData.decisionIssueDate desc",
142    limit=3,
143)
144
145print(f"\nFound {response.count} Decisions from TC 2100 (Electronics) in 2023")
146print(f"Displaying first {len(response.patent_appeal_data_bag)} results:")
147
148for decision in response.patent_appeal_data_bag:
149    print(f"\n  Appeal Number: {decision.appeal_number}")
150
151    if decision.appellant_data:
152        print(f"  Application: {decision.appellant_data.application_number_text}")
153
154    if decision.decision_data:
155        print(f"  Decision: {decision.decision_data.decision_type_category}")
156        print(f"  Date: {decision.decision_data.decision_issue_date}")
157
158print("-" * 40)
159print("Example 6: Direct query string")
160print("-" * 40)
161
162# Use a direct query string for more complex searches
163response = client.search_decisions(
164    query="appellantData.technologyCenterNumber:3600 AND decisionData.appealOutcomeCategory:(Affirmed OR Reversed)",
165    limit=10,
166)
167
168print(f"\nFound {response.count} Affirmed/Reversed decisions from TC 3600")
169print(f"Displaying first {len(response.patent_appeal_data_bag)} results:")
170
171for decision in response.patent_appeal_data_bag:
172    print(f"\n  Appeal Number: {decision.appeal_number}")
173
174    if decision.appellant_data:
175        print(f"  Application: {decision.appellant_data.application_number_text}")
176
177    if decision.decision_data:
178        print(f"  Decision: {decision.decision_data.decision_type_category}")
179        print(f"  Outcome: {decision.decision_data.appeal_outcome_category}")