pyUSPTO 0.5.0__tar.gz → 0.5.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. {pyuspto-0.5.0 → pyuspto-0.5.1}/.github/workflows/python-tests.yml +1 -1
  2. {pyuspto-0.5.0 → pyuspto-0.5.1}/PKG-INFO +83 -2
  3. {pyuspto-0.5.0 → pyuspto-0.5.1}/README.md +82 -1
  4. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/clients/index.rst +3 -0
  5. pyuspto-0.5.1/docs/source/api/clients/oa_actions.rst +7 -0
  6. pyuspto-0.5.1/docs/source/api/clients/oa_citations.rst +7 -0
  7. pyuspto-0.5.1/docs/source/api/clients/oa_rejections.rst +7 -0
  8. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/models/index.rst +3 -0
  9. pyuspto-0.5.1/docs/source/api/models/oa_actions.rst +7 -0
  10. pyuspto-0.5.1/docs/source/api/models/oa_citations.rst +7 -0
  11. pyuspto-0.5.1/docs/source/api/models/oa_rejections.rst +7 -0
  12. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/examples/index.rst +3 -0
  13. pyuspto-0.5.1/docs/source/examples/oa_actions.rst +6 -0
  14. pyuspto-0.5.1/docs/source/examples/oa_citations.rst +6 -0
  15. pyuspto-0.5.1/docs/source/examples/oa_rejections.rst +6 -0
  16. {pyuspto-0.5.0 → pyuspto-0.5.1}/examples/enriched_citations_example.py +1 -1
  17. pyuspto-0.5.1/examples/oa_actions_example.py +117 -0
  18. pyuspto-0.5.1/examples/oa_citations_example.py +106 -0
  19. pyuspto-0.5.1/examples/oa_rejections_example.py +63 -0
  20. {pyuspto-0.5.0 → pyuspto-0.5.1}/requirements-dev.txt +7 -7
  21. {pyuspto-0.5.0 → pyuspto-0.5.1}/requirements.txt +1 -1
  22. {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/__init__.py +37 -2
  23. {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/clients/__init__.py +6 -0
  24. {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/clients/base.py +9 -2
  25. pyuspto-0.5.1/src/pyUSPTO/clients/oa_actions.py +238 -0
  26. pyuspto-0.5.1/src/pyUSPTO/clients/oa_citations.py +247 -0
  27. pyuspto-0.5.1/src/pyUSPTO/clients/oa_rejections.py +233 -0
  28. {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/config.py +18 -0
  29. {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/models/__init__.py +29 -0
  30. pyuspto-0.5.1/src/pyUSPTO/models/oa_actions.py +570 -0
  31. pyuspto-0.5.1/src/pyUSPTO/models/oa_citations.py +277 -0
  32. pyuspto-0.5.1/src/pyUSPTO/models/oa_rejections.py +369 -0
  33. {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO.egg-info/PKG-INFO +83 -2
  34. {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO.egg-info/SOURCES.txt +27 -0
  35. pyuspto-0.5.1/tests/clients/test_oa_actions_clients.py +448 -0
  36. pyuspto-0.5.1/tests/clients/test_oa_citations_clients.py +493 -0
  37. pyuspto-0.5.1/tests/clients/test_oa_rejections_clients.py +444 -0
  38. pyuspto-0.5.1/tests/integration/test_oa_actions_integration.py +237 -0
  39. pyuspto-0.5.1/tests/integration/test_oa_citations_integration.py +234 -0
  40. pyuspto-0.5.1/tests/integration/test_oa_rejections_integration.py +190 -0
  41. pyuspto-0.5.1/tests/models/test_oa_actions_models.py +480 -0
  42. pyuspto-0.5.1/tests/models/test_oa_citations_models.py +349 -0
  43. pyuspto-0.5.1/tests/models/test_oa_rejections_models.py +431 -0
  44. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/test_config.py +19 -0
  45. {pyuspto-0.5.0 → pyuspto-0.5.1}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  46. {pyuspto-0.5.0 → pyuspto-0.5.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  47. {pyuspto-0.5.0 → pyuspto-0.5.1}/.github/ISSUE_TEMPLATE/documentation-updates.yml +0 -0
  48. {pyuspto-0.5.0 → pyuspto-0.5.1}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
  49. {pyuspto-0.5.0 → pyuspto-0.5.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  50. {pyuspto-0.5.0 → pyuspto-0.5.1}/.github/dependabot.yml +0 -0
  51. {pyuspto-0.5.0 → pyuspto-0.5.1}/.github/workflows/codeql.yml +0 -0
  52. {pyuspto-0.5.0 → pyuspto-0.5.1}/.github/workflows/publish-docs.yaml +0 -0
  53. {pyuspto-0.5.0 → pyuspto-0.5.1}/.github/workflows/publish-to-test-pypi.yml +0 -0
  54. {pyuspto-0.5.0 → pyuspto-0.5.1}/.gitignore +0 -0
  55. {pyuspto-0.5.0 → pyuspto-0.5.1}/.readthedocs.yaml +0 -0
  56. {pyuspto-0.5.0 → pyuspto-0.5.1}/ADVANCED.md +0 -0
  57. {pyuspto-0.5.0 → pyuspto-0.5.1}/CHANGELOG.md +0 -0
  58. {pyuspto-0.5.0 → pyuspto-0.5.1}/CODE_OF_CONDUCT.md +0 -0
  59. {pyuspto-0.5.0 → pyuspto-0.5.1}/CONTRIBUTING.md +0 -0
  60. {pyuspto-0.5.0 → pyuspto-0.5.1}/LICENSE +0 -0
  61. {pyuspto-0.5.0 → pyuspto-0.5.1}/_version.pyi +0 -0
  62. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/Makefile +0 -0
  63. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/_static/.gitkeep +0 -0
  64. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/advanced.rst +0 -0
  65. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/clients/bulk_data.rst +0 -0
  66. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/clients/enriched_citations.rst +0 -0
  67. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/clients/patent_data.rst +0 -0
  68. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/clients/petition_decisions.rst +0 -0
  69. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/clients/ptab_appeals.rst +0 -0
  70. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/clients/ptab_interferences.rst +0 -0
  71. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/clients/ptab_trials.rst +0 -0
  72. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/config/config.rst +0 -0
  73. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/config/http_config.rst +0 -0
  74. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/config/index.rst +0 -0
  75. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/exceptions.rst +0 -0
  76. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/index.rst +0 -0
  77. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/models/base.rst +0 -0
  78. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/models/bulk_data.rst +0 -0
  79. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/models/enriched_citations.rst +0 -0
  80. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/models/patent_data.rst +0 -0
  81. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/models/petition_decisions.rst +0 -0
  82. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/models/ptab.rst +0 -0
  83. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/models/utils.rst +0 -0
  84. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/warnings.rst +0 -0
  85. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/conf.py +0 -0
  86. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/configuration.rst +0 -0
  87. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/development.rst +0 -0
  88. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/examples/bulk_data.rst +0 -0
  89. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/examples/enriched_citations.rst +0 -0
  90. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/examples/ifw_example.rst +0 -0
  91. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/examples/patent_data.rst +0 -0
  92. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/examples/petition_decisions.rst +0 -0
  93. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/examples/ptab_appeals.rst +0 -0
  94. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/examples/ptab_interferences.rst +0 -0
  95. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/examples/ptab_trials.rst +0 -0
  96. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/index.rst +0 -0
  97. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/installation.rst +0 -0
  98. {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/quickstart.rst +0 -0
  99. {pyuspto-0.5.0 → pyuspto-0.5.1}/examples/bulk_data_example.py +0 -0
  100. {pyuspto-0.5.0 → pyuspto-0.5.1}/examples/error_handling_example.py +0 -0
  101. {pyuspto-0.5.0 → pyuspto-0.5.1}/examples/ifw_example.py +0 -0
  102. {pyuspto-0.5.0 → pyuspto-0.5.1}/examples/patent_data_example.py +0 -0
  103. {pyuspto-0.5.0 → pyuspto-0.5.1}/examples/petition_decisions_example.py +0 -0
  104. {pyuspto-0.5.0 → pyuspto-0.5.1}/examples/ptab_appeals_example.py +0 -0
  105. {pyuspto-0.5.0 → pyuspto-0.5.1}/examples/ptab_interferences_example.py +0 -0
  106. {pyuspto-0.5.0 → pyuspto-0.5.1}/examples/ptab_trials_example.py +0 -0
  107. {pyuspto-0.5.0 → pyuspto-0.5.1}/pyUSPTO.code-workspace +0 -0
  108. {pyuspto-0.5.0 → pyuspto-0.5.1}/pyproject.toml +0 -0
  109. {pyuspto-0.5.0 → pyuspto-0.5.1}/setup.cfg +0 -0
  110. {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/clients/bulk_data.py +0 -0
  111. {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/clients/enriched_citations.py +0 -0
  112. {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/clients/patent_data.py +0 -0
  113. {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/clients/petition_decisions.py +0 -0
  114. {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/clients/ptab_appeals.py +0 -0
  115. {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/clients/ptab_interferences.py +0 -0
  116. {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/clients/ptab_trials.py +0 -0
  117. {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/exceptions.py +0 -0
  118. {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/http_config.py +0 -0
  119. {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/models/base.py +0 -0
  120. {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/models/bulk_data.py +0 -0
  121. {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/models/enriched_citations.py +0 -0
  122. {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/models/patent_data.py +0 -0
  123. {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/models/petition_decisions.py +0 -0
  124. {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/models/ptab.py +0 -0
  125. {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/models/utils.py +0 -0
  126. {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/py.typed +0 -0
  127. {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/utils/__init__.py +0 -0
  128. {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/warnings.py +0 -0
  129. {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO.egg-info/dependency_links.txt +0 -0
  130. {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO.egg-info/requires.txt +0 -0
  131. {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO.egg-info/top_level.txt +0 -0
  132. {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO.egg-info/zip-safe +0 -0
  133. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/__init__.py +0 -0
  134. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/clients/__init__.py +0 -0
  135. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/clients/test_base.py +0 -0
  136. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/clients/test_bulk_data_clients.py +0 -0
  137. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/clients/test_enriched_citation_clients.py +0 -0
  138. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/clients/test_patent_data_clients.py +0 -0
  139. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/clients/test_petition_decision_clients.py +0 -0
  140. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/clients/test_ptab_appeals_client.py +0 -0
  141. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/clients/test_ptab_interferences_client.py +0 -0
  142. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/clients/test_ptab_trials_client.py +0 -0
  143. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/conftest.py +0 -0
  144. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/integration/__init__.py +0 -0
  145. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/integration/conftest.py +0 -0
  146. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/integration/test_bulk_data_integration.py +0 -0
  147. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/integration/test_enriched_citations_integration.py +0 -0
  148. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/integration/test_patent_data_integration.py +0 -0
  149. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/integration/test_petition_decisions_integration.py +0 -0
  150. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/integration/test_ptab_appeals_integration.py +0 -0
  151. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/integration/test_ptab_interferences_integration.py +0 -0
  152. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/integration/test_ptab_trials_integration.py +0 -0
  153. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/models/__init__.py +0 -0
  154. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/models/test_bulk_data_models.py +0 -0
  155. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/models/test_enriched_citation_models.py +0 -0
  156. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/models/test_patent_data_models.py +0 -0
  157. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/models/test_petition_decision_models.py +0 -0
  158. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/models/test_ptab_models.py +0 -0
  159. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/models/test_utils.py +0 -0
  160. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/test_edge_cases.py +0 -0
  161. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/test_exceptions.py +0 -0
  162. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/test_http_config.py +0 -0
  163. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/test_init.py +0 -0
  164. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/test_version.py +0 -0
  165. {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/utils/__init__.py +0 -0
  166. {pyuspto-0.5.0 → pyuspto-0.5.1}/tox.ini +0 -0
@@ -32,7 +32,7 @@ jobs:
32
32
  pytest tests/ --cov=src/pyUSPTO
33
33
 
34
34
  - name: Upload coverage report
35
- uses: codecov/codecov-action@v5
35
+ uses: codecov/codecov-action@v6
36
36
  with:
37
37
  fail_ci_if_error: false
38
38
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyUSPTO
3
- Version: 0.5.0
3
+ Version: 0.5.1
4
4
  Summary: A Modern Python client for accessing the United States Patent and Trademark Office (USPTO) Open Data Portal (ODP) APIs.
5
5
  Author-email: Andrew Piechocki <apiechocki@dunlapcodding.com>
6
6
  License-Expression: MIT
@@ -75,7 +75,7 @@ Dynamic: license-file
75
75
 
76
76
  A Python client library for interacting with the United Stated Patent and Trademark Office (USPTO) [Open Data Portal](https://data.uspto.gov/home) APIs.
77
77
 
78
- This package provides clients for interacting with the USPTO Bulk Data API, Patent Data API, Final Petition Decisions API, and PTAB (Patent Trial and Appeal Board) APIs.
78
+ This package provides clients for interacting with the USPTO Bulk Data API, Patent Data API, Final Petition Decisions API, PTAB (Patent Trial and Appeal Board) APIs, Enriched Citations API, Office Action Text Retrieval API, Office Action Rejections API, and Office Action Citations API.
79
79
 
80
80
  > [!IMPORTANT]
81
81
  > The USPTO is in the process of moving their Developer API. This package is only concerned with the new API. The [old API](https://developer.uspto.gov/) was officially retired at the end of 2025; however, some products have not yet been fully transitioned to the Open Data Portal API. The USPTO expects the remaining products to be transitioned to the Open Data Portal in early 2026.
@@ -123,6 +123,10 @@ Then use it in your Python code:
123
123
  ```python
124
124
  from pyUSPTO import (
125
125
  BulkDataClient,
126
+ EnrichedCitationsClient,
127
+ OAActionsClient,
128
+ OACitationsClient,
129
+ OARejectionsClient,
126
130
  PatentDataClient,
127
131
  FinalPetitionDecisionsClient,
128
132
  PTABTrialsClient,
@@ -140,6 +144,10 @@ petition_client = FinalPetitionDecisionsClient(config=config)
140
144
  trials_client = PTABTrialsClient(config=config)
141
145
  appeals_client = PTABAppealsClient(config=config)
142
146
  interferences_client = PTABInterferencesClient(config=config)
147
+ citations_client = EnrichedCitationsClient(config=config)
148
+ oa_client = OAActionsClient(config=config)
149
+ oa_citations_client = OACitationsClient(config=config)
150
+ rejections_client = OARejectionsClient(config=config)
143
151
  ```
144
152
 
145
153
  ### Direct API Key
@@ -302,6 +310,79 @@ print(f"Found {response.count} interference decisions since 2023")
302
310
 
303
311
  See [`examples/ptab_interferences_example.py`](examples/ptab_interferences_example.py) for detailed examples including searching by party name and outcome.
304
312
 
313
+ ### Enriched Citations API
314
+
315
+ ```python
316
+ from pyUSPTO import EnrichedCitationsClient, USPTOConfig
317
+
318
+ config = USPTOConfig(api_key="your_api_key_here")
319
+ client = EnrichedCitationsClient(config=config)
320
+
321
+ # Search for enriched citations by technology center
322
+ response = client.search_citations(
323
+ tech_center_q="1700",
324
+ rows=5,
325
+ )
326
+ print(f"Found {response.count} citations from TC 1700")
327
+ ```
328
+
329
+ See [`examples/enriched_citations_example.py`](examples/enriched_citations_example.py) for detailed examples including searching by application number and citation category.
330
+
331
+ ### Office Action Text Retrieval API
332
+
333
+ ```python
334
+ from pyUSPTO import OAActionsClient, USPTOConfig
335
+
336
+ config = USPTOConfig(api_key="your_api_key_here")
337
+ client = OAActionsClient(config=config)
338
+
339
+ # Search for office actions by technology center
340
+ response = client.search(
341
+ tech_center_q="1700",
342
+ rows=5,
343
+ )
344
+ print(f"Found {response.count} office actions from TC 1700")
345
+ ```
346
+
347
+ See [`examples/oa_actions_example.py`](examples/oa_actions_example.py) for detailed examples including searching by document code and paginating results.
348
+
349
+ ### Office Action Rejections API
350
+
351
+ ```python
352
+ from pyUSPTO import OARejectionsClient, USPTOConfig
353
+
354
+ config = USPTOConfig(api_key="your_api_key_here")
355
+ client = OARejectionsClient(config=config)
356
+
357
+ # Search for rejections by application number
358
+ response = client.search(
359
+ patent_application_number_q="12190351",
360
+ rows=5,
361
+ )
362
+ print(f"Found {response.count} rejection records for application 12190351")
363
+ ```
364
+
365
+ See [`examples/oa_rejections_example.py`](examples/oa_rejections_example.py) for detailed examples including searching by document code and inspecting rejection flags.
366
+
367
+ ### Office Action Citations API
368
+
369
+ ```python
370
+ from pyUSPTO import OACitationsClient, USPTOConfig
371
+
372
+ config = USPTOConfig(api_key="your_api_key_here")
373
+ client = OACitationsClient(config=config)
374
+
375
+ # Search for citations by legal section code
376
+ response = client.search(
377
+ legal_section_code_q="103",
378
+ tech_center_q="2800",
379
+ rows=5,
380
+ )
381
+ print(f"Found {response.count} section 103 citations in tech center 2800")
382
+ ```
383
+
384
+ See [`examples/oa_citations_example.py`](examples/oa_citations_example.py) for detailed examples including searching by examiner-cited indicator and paginating results.
385
+
305
386
  ## Documentation
306
387
 
307
388
  Full documentation may be found on [Read the Docs](https://pyuspto.readthedocs.io/).
@@ -8,7 +8,7 @@
8
8
 
9
9
  A Python client library for interacting with the United Stated Patent and Trademark Office (USPTO) [Open Data Portal](https://data.uspto.gov/home) APIs.
10
10
 
11
- This package provides clients for interacting with the USPTO Bulk Data API, Patent Data API, Final Petition Decisions API, and PTAB (Patent Trial and Appeal Board) APIs.
11
+ This package provides clients for interacting with the USPTO Bulk Data API, Patent Data API, Final Petition Decisions API, PTAB (Patent Trial and Appeal Board) APIs, Enriched Citations API, Office Action Text Retrieval API, Office Action Rejections API, and Office Action Citations API.
12
12
 
13
13
  > [!IMPORTANT]
14
14
  > The USPTO is in the process of moving their Developer API. This package is only concerned with the new API. The [old API](https://developer.uspto.gov/) was officially retired at the end of 2025; however, some products have not yet been fully transitioned to the Open Data Portal API. The USPTO expects the remaining products to be transitioned to the Open Data Portal in early 2026.
@@ -56,6 +56,10 @@ Then use it in your Python code:
56
56
  ```python
57
57
  from pyUSPTO import (
58
58
  BulkDataClient,
59
+ EnrichedCitationsClient,
60
+ OAActionsClient,
61
+ OACitationsClient,
62
+ OARejectionsClient,
59
63
  PatentDataClient,
60
64
  FinalPetitionDecisionsClient,
61
65
  PTABTrialsClient,
@@ -73,6 +77,10 @@ petition_client = FinalPetitionDecisionsClient(config=config)
73
77
  trials_client = PTABTrialsClient(config=config)
74
78
  appeals_client = PTABAppealsClient(config=config)
75
79
  interferences_client = PTABInterferencesClient(config=config)
80
+ citations_client = EnrichedCitationsClient(config=config)
81
+ oa_client = OAActionsClient(config=config)
82
+ oa_citations_client = OACitationsClient(config=config)
83
+ rejections_client = OARejectionsClient(config=config)
76
84
  ```
77
85
 
78
86
  ### Direct API Key
@@ -235,6 +243,79 @@ print(f"Found {response.count} interference decisions since 2023")
235
243
 
236
244
  See [`examples/ptab_interferences_example.py`](examples/ptab_interferences_example.py) for detailed examples including searching by party name and outcome.
237
245
 
246
+ ### Enriched Citations API
247
+
248
+ ```python
249
+ from pyUSPTO import EnrichedCitationsClient, USPTOConfig
250
+
251
+ config = USPTOConfig(api_key="your_api_key_here")
252
+ client = EnrichedCitationsClient(config=config)
253
+
254
+ # Search for enriched citations by technology center
255
+ response = client.search_citations(
256
+ tech_center_q="1700",
257
+ rows=5,
258
+ )
259
+ print(f"Found {response.count} citations from TC 1700")
260
+ ```
261
+
262
+ See [`examples/enriched_citations_example.py`](examples/enriched_citations_example.py) for detailed examples including searching by application number and citation category.
263
+
264
+ ### Office Action Text Retrieval API
265
+
266
+ ```python
267
+ from pyUSPTO import OAActionsClient, USPTOConfig
268
+
269
+ config = USPTOConfig(api_key="your_api_key_here")
270
+ client = OAActionsClient(config=config)
271
+
272
+ # Search for office actions by technology center
273
+ response = client.search(
274
+ tech_center_q="1700",
275
+ rows=5,
276
+ )
277
+ print(f"Found {response.count} office actions from TC 1700")
278
+ ```
279
+
280
+ See [`examples/oa_actions_example.py`](examples/oa_actions_example.py) for detailed examples including searching by document code and paginating results.
281
+
282
+ ### Office Action Rejections API
283
+
284
+ ```python
285
+ from pyUSPTO import OARejectionsClient, USPTOConfig
286
+
287
+ config = USPTOConfig(api_key="your_api_key_here")
288
+ client = OARejectionsClient(config=config)
289
+
290
+ # Search for rejections by application number
291
+ response = client.search(
292
+ patent_application_number_q="12190351",
293
+ rows=5,
294
+ )
295
+ print(f"Found {response.count} rejection records for application 12190351")
296
+ ```
297
+
298
+ See [`examples/oa_rejections_example.py`](examples/oa_rejections_example.py) for detailed examples including searching by document code and inspecting rejection flags.
299
+
300
+ ### Office Action Citations API
301
+
302
+ ```python
303
+ from pyUSPTO import OACitationsClient, USPTOConfig
304
+
305
+ config = USPTOConfig(api_key="your_api_key_here")
306
+ client = OACitationsClient(config=config)
307
+
308
+ # Search for citations by legal section code
309
+ response = client.search(
310
+ legal_section_code_q="103",
311
+ tech_center_q="2800",
312
+ rows=5,
313
+ )
314
+ print(f"Found {response.count} section 103 citations in tech center 2800")
315
+ ```
316
+
317
+ See [`examples/oa_citations_example.py`](examples/oa_citations_example.py) for detailed examples including searching by examiner-cited indicator and paginating results.
318
+
238
319
  ## Documentation
239
320
 
240
321
  Full documentation may be found on [Read the Docs](https://pyuspto.readthedocs.io/).
@@ -6,6 +6,9 @@ Clients
6
6
 
7
7
  bulk_data
8
8
  enriched_citations
9
+ oa_actions
10
+ oa_citations
11
+ oa_rejections
9
12
  patent_data
10
13
  petition_decisions
11
14
  ptab_appeals
@@ -0,0 +1,7 @@
1
+ OA Actions Client
2
+ =================
3
+
4
+ .. automodule:: pyUSPTO.clients.oa_actions
5
+ :members:
6
+ :undoc-members:
7
+ :show-inheritance:
@@ -0,0 +1,7 @@
1
+ OA Citations Client
2
+ ===================
3
+
4
+ .. automodule:: pyUSPTO.clients.oa_citations
5
+ :members:
6
+ :undoc-members:
7
+ :show-inheritance:
@@ -0,0 +1,7 @@
1
+ Office Action Rejections Client
2
+ ===============================
3
+
4
+ .. automodule:: pyUSPTO.clients.oa_rejections
5
+ :members:
6
+ :undoc-members:
7
+ :show-inheritance:
@@ -7,6 +7,9 @@ Models
7
7
  base
8
8
  bulk_data
9
9
  enriched_citations
10
+ oa_actions
11
+ oa_citations
12
+ oa_rejections
10
13
  patent_data
11
14
  petition_decisions
12
15
  ptab
@@ -0,0 +1,7 @@
1
+ OA Actions Models
2
+ =================
3
+
4
+ .. automodule:: pyUSPTO.models.oa_actions
5
+ :members:
6
+ :undoc-members:
7
+ :show-inheritance:
@@ -0,0 +1,7 @@
1
+ OA Citations Models
2
+ ===================
3
+
4
+ .. automodule:: pyUSPTO.models.oa_citations
5
+ :members:
6
+ :undoc-members:
7
+ :show-inheritance:
@@ -0,0 +1,7 @@
1
+ Office Action Rejections Models
2
+ ================================
3
+
4
+ .. automodule:: pyUSPTO.models.oa_rejections
5
+ :members:
6
+ :undoc-members:
7
+ :show-inheritance:
@@ -6,6 +6,9 @@ Examples
6
6
 
7
7
  bulk_data
8
8
  enriched_citations
9
+ oa_actions
10
+ oa_citations
11
+ oa_rejections
9
12
  patent_data
10
13
  ifw_example
11
14
  petition_decisions
@@ -0,0 +1,6 @@
1
+ OA Actions Example
2
+ ==================
3
+
4
+ .. literalinclude:: ../../../examples/oa_actions_example.py
5
+ :language: python
6
+ :linenos:
@@ -0,0 +1,6 @@
1
+ OA Citations Example
2
+ ====================
3
+
4
+ .. literalinclude:: ../../../examples/oa_citations_example.py
5
+ :language: python
6
+ :linenos:
@@ -0,0 +1,6 @@
1
+ Office Action Rejections Examples
2
+ ==================================
3
+
4
+ .. automodule:: examples.oa_rejections_example
5
+ :members:
6
+ :undoc-members:
@@ -111,7 +111,7 @@ print("-" * 40)
111
111
 
112
112
  max_items = 30
113
113
  count = 0
114
- for citation in client.paginate_citations(
114
+ for _ in client.paginate_citations(
115
115
  tech_center_q="2800", rows=10
116
116
  ):
117
117
  count += 1
@@ -0,0 +1,117 @@
1
+ """Example usage of pyUSPTO for Office Action Text Retrieval.
2
+
3
+ Demonstrates the OAActionsClient for searching full-text office action
4
+ documents, filtering by various criteria, inspecting section data,
5
+ and paginating through results.
6
+ """
7
+
8
+ import os
9
+
10
+ from pyUSPTO import OAActionsClient, USPTOConfig
11
+
12
+ # --- Client Initialization ---
13
+ api_key = os.environ.get("USPTO_API_KEY", "YOUR_API_KEY_HERE")
14
+ if api_key == "YOUR_API_KEY_HERE":
15
+ raise ValueError("API key is not set. Set the USPTO_API_KEY environment variable.")
16
+ config = USPTOConfig(api_key=api_key)
17
+ client = OAActionsClient(config=config)
18
+
19
+ print("-" * 40)
20
+ print("Example 1: Search by application number")
21
+ print("-" * 40)
22
+
23
+ response = client.search(patent_application_number_q="11363598")
24
+ print(f"Found {response.num_found} office actions for application 11363598.")
25
+ for record in response.docs[:3]:
26
+ print(f"\n Doc Code: {record.legacy_document_code_identifier}")
27
+ print(f" Submission Date: {record.submission_date}")
28
+ print(f" Art Unit: {record.group_art_unit_number}")
29
+ if record.section:
30
+ if record.section.section_102_rejection_text:
31
+ print(" Has § 102 rejection text.")
32
+ if record.section.section_103_rejection_text:
33
+ print(" Has § 103 rejection text.")
34
+
35
+ print("-" * 40)
36
+ print("Example 2: Search by document code (CTNF) and tech center")
37
+ print("-" * 40)
38
+
39
+ response = client.search(
40
+ tech_center_q="2800",
41
+ legacy_document_code_identifier_q="CTNF",
42
+ rows=5,
43
+ )
44
+ print(f"Found {response.num_found} CTNF office actions in tech center 2800.")
45
+ for record in response.docs:
46
+ print(
47
+ f" App {record.patent_application_number}: "
48
+ f"AU {record.group_art_unit_number}, "
49
+ f"submitted {record.submission_date}"
50
+ )
51
+
52
+ print("-" * 40)
53
+ print("Example 3: Search by submission date range")
54
+ print("-" * 40)
55
+
56
+ response = client.search(
57
+ submission_date_from_q="2010-01-01",
58
+ submission_date_to_q="2010-12-31",
59
+ rows=5,
60
+ )
61
+ print(f"Found {response.num_found} office actions submitted in 2010.")
62
+
63
+ print("-" * 40)
64
+ print("Example 4: Search with sort")
65
+ print("-" * 40)
66
+
67
+ response = client.search(
68
+ tech_center_q="1700",
69
+ sort="submissionDate desc",
70
+ rows=5,
71
+ )
72
+ print(f"Found {response.num_found} office actions in tech center 1700 (newest first).")
73
+ for record in response.docs:
74
+ print(f" {record.submission_date}: {record.invention_title}")
75
+
76
+ print("-" * 40)
77
+ print("Example 5: Inspect section data")
78
+ print("-" * 40)
79
+
80
+ response = client.search(
81
+ criteria='id:"9c27199b54dc83c9a6f643b828990d0322071461557b31ead3428885"',
82
+ rows=1,
83
+ )
84
+ if response.docs:
85
+ record = response.docs[0]
86
+ print(f"Record: {record.id}")
87
+ print(f" Patent Number: {record.patent_number}")
88
+ print(f" Invention Title: {record.invention_title}")
89
+ if record.section:
90
+ print(" Section 102 text (first 200 chars):")
91
+ for text in record.section.section_102_rejection_text:
92
+ if text:
93
+ print(f" {text[:200]}...")
94
+
95
+ print("-" * 40)
96
+ print("Example 6: Paginate through results")
97
+ print("-" * 40)
98
+
99
+ max_items = 30
100
+ count = 0
101
+ for _ in client.paginate(tech_center_q="1700", rows=10):
102
+ count += 1
103
+ if count >= max_items:
104
+ print(f" ... (stopping at {max_items} items)")
105
+ break
106
+
107
+ print(f"Retrieved {count} office action records via pagination.")
108
+
109
+ print("-" * 40)
110
+ print("Example 7: Get available fields")
111
+ print("-" * 40)
112
+
113
+ fields_response = client.get_fields()
114
+ print(f"API Status: {fields_response.api_status}")
115
+ print(f"Field Count: {fields_response.field_count}")
116
+ print(f"Last Updated: {fields_response.last_data_updated_date}")
117
+ print(f"Sample fields: {fields_response.fields[:5]}")
@@ -0,0 +1,106 @@
1
+ """Example usage of pyUSPTO for Office Action Citations.
2
+
3
+ Demonstrates the OACitationsClient for searching citation data from
4
+ Office Actions, filtering by various criteria, and paginating through results.
5
+ """
6
+
7
+ import os
8
+
9
+ from pyUSPTO import OACitationsClient, USPTOConfig
10
+
11
+ # --- Client Initialization ---
12
+ api_key = os.environ.get("USPTO_API_KEY", "YOUR_API_KEY_HERE")
13
+ if api_key == "YOUR_API_KEY_HERE":
14
+ raise ValueError("API key is not set. Set the USPTO_API_KEY environment variable.")
15
+ config = USPTOConfig(api_key=api_key)
16
+ client = OACitationsClient(config=config)
17
+
18
+ print("-" * 40)
19
+ print("Example 1: Search by application number")
20
+ print("-" * 40)
21
+
22
+ response = client.search(patent_application_number_q="17519936")
23
+ print(f"Found {response.num_found} citations for application 17519936.")
24
+ for record in response.docs[:3]:
25
+ print(f"\n Legal Section: {record.legal_section_code}")
26
+ print(f" Action Type: {record.action_type_category}")
27
+ print(f" Reference: {record.reference_identifier}")
28
+ print(f" Examiner Cited: {record.examiner_cited_reference_indicator}")
29
+
30
+ print("-" * 40)
31
+ print("Example 2: Search by legal section code and tech center")
32
+ print("-" * 40)
33
+
34
+ response = client.search(
35
+ tech_center_q="2800",
36
+ legal_section_code_q="103",
37
+ rows=5,
38
+ )
39
+ print(f"Found {response.num_found} section 103 citations in tech center 2800.")
40
+ for record in response.docs:
41
+ print(
42
+ f" App {record.patent_application_number}: "
43
+ f"AU {record.group_art_unit_number}, "
44
+ f"ref {record.parsed_reference_identifier}"
45
+ )
46
+
47
+ print("-" * 40)
48
+ print("Example 3: Search by examiner-cited indicator")
49
+ print("-" * 40)
50
+
51
+ response = client.search(
52
+ examiner_cited_reference_indicator_q=True,
53
+ tech_center_q="1700",
54
+ rows=5,
55
+ )
56
+ print(f"Found {response.num_found} examiner-cited references in tech center 1700.")
57
+ for record in response.docs:
58
+ print(f" {record.reference_identifier}")
59
+
60
+ print("-" * 40)
61
+ print("Example 4: Search by create date range")
62
+ print("-" * 40)
63
+
64
+ response = client.search(
65
+ create_date_time_from_q="2025-07-01",
66
+ create_date_time_to_q="2025-07-04",
67
+ rows=5,
68
+ )
69
+ print(f"Found {response.num_found} citations created 2025-07-01 to 2025-07-04.")
70
+
71
+ print("-" * 40)
72
+ print("Example 5: Search with sort")
73
+ print("-" * 40)
74
+
75
+ response = client.search(
76
+ tech_center_q="2800",
77
+ sort="createDateTime desc",
78
+ rows=5,
79
+ )
80
+ print(f"Found {response.num_found} citations in tech center 2800 (newest first).")
81
+ for record in response.docs:
82
+ print(f" {record.create_date_time}: {record.patent_application_number}")
83
+
84
+ print("-" * 40)
85
+ print("Example 6: Paginate through results")
86
+ print("-" * 40)
87
+
88
+ max_items = 30
89
+ count = 0
90
+ for _ in client.paginate(tech_center_q="2800", rows=10):
91
+ count += 1
92
+ if count >= max_items:
93
+ print(f" ... (stopping at {max_items} items)")
94
+ break
95
+
96
+ print(f"Retrieved {count} citation records via pagination.")
97
+
98
+ print("-" * 40)
99
+ print("Example 7: Get available fields")
100
+ print("-" * 40)
101
+
102
+ fields_response = client.get_fields()
103
+ print(f"API Status: {fields_response.api_status}")
104
+ print(f"Field Count: {fields_response.field_count}")
105
+ print(f"Last Updated: {fields_response.last_data_updated_date}")
106
+ print(f"Sample fields: {fields_response.fields[:5]}")
@@ -0,0 +1,63 @@
1
+ """Examples for the OARejectionsClient.
2
+
3
+ This module demonstrates how to use the OARejectionsClient to search for
4
+ rejection-level data from USPTO Office Actions.
5
+ """
6
+
7
+ from pyUSPTO import OARejectionsClient, USPTOConfig
8
+
9
+ config = USPTOConfig.from_env()
10
+ client = OARejectionsClient(config=config)
11
+
12
+ # --- Example 1: Search by application number ---
13
+ response = client.search(patent_application_number_q="12190351")
14
+ print(f"Found {response.count} records for application 12190351")
15
+ for record in response.docs:
16
+ print(f" {record.id}: {record.legacy_document_code_identifier}")
17
+
18
+ # --- Example 2: Search by document code and date range ---
19
+ response = client.search(
20
+ legacy_document_code_identifier_q="CTNF",
21
+ submission_date_from_q="2020-01-01",
22
+ submission_date_to_q="2020-12-31",
23
+ rows=5,
24
+ )
25
+ print(f"\nFound {response.count} CTNF rejections in 2020")
26
+
27
+ # --- Example 3: Search with a direct criteria string ---
28
+ response = client.search(
29
+ criteria="hasRej103:1 AND groupArtUnitNumber:1713",
30
+ rows=5,
31
+ )
32
+ print(f"\nFound {response.count} 103-rejection records in art unit 1713")
33
+
34
+ # --- Example 4: Inspect rejection flags ---
35
+ response = client.search(patent_application_number_q="12190351", rows=1)
36
+ if response.docs:
37
+ record = response.docs[0]
38
+ print(f"\nRecord: {record.id}")
39
+ print(f" 101 rejection: {record.has_rej_101}")
40
+ print(f" 102 rejection: {record.has_rej_102}")
41
+ print(f" 103 rejection: {record.has_rej_103}")
42
+ print(f" 112 rejection: {record.has_rej_112}")
43
+ print(f" Alice indicator: {record.alice_indicator}")
44
+ print(f" Claims: {record.claim_number_array_document}")
45
+
46
+ # --- Example 5: Search with POST body ---
47
+ response = client.search(
48
+ post_body={"criteria": "patentApplicationNumber:12190351", "rows": 10}
49
+ )
50
+ print(f"\nFound {response.count} records via POST body")
51
+
52
+ # --- Example 6: Paginate through results ---
53
+ count = 0
54
+ for _ in client.paginate(
55
+ legal_section_code_q="103",
56
+ submission_date_from_q="2020-01-01",
57
+ submission_date_to_q="2020-01-31",
58
+ rows=25,
59
+ ):
60
+ count += 1
61
+ if count >= 50:
62
+ break
63
+ print(f"\nIterated through {count} records")