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.
- {pyuspto-0.5.0 → pyuspto-0.5.1}/.github/workflows/python-tests.yml +1 -1
- {pyuspto-0.5.0 → pyuspto-0.5.1}/PKG-INFO +83 -2
- {pyuspto-0.5.0 → pyuspto-0.5.1}/README.md +82 -1
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/clients/index.rst +3 -0
- pyuspto-0.5.1/docs/source/api/clients/oa_actions.rst +7 -0
- pyuspto-0.5.1/docs/source/api/clients/oa_citations.rst +7 -0
- pyuspto-0.5.1/docs/source/api/clients/oa_rejections.rst +7 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/models/index.rst +3 -0
- pyuspto-0.5.1/docs/source/api/models/oa_actions.rst +7 -0
- pyuspto-0.5.1/docs/source/api/models/oa_citations.rst +7 -0
- pyuspto-0.5.1/docs/source/api/models/oa_rejections.rst +7 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/examples/index.rst +3 -0
- pyuspto-0.5.1/docs/source/examples/oa_actions.rst +6 -0
- pyuspto-0.5.1/docs/source/examples/oa_citations.rst +6 -0
- pyuspto-0.5.1/docs/source/examples/oa_rejections.rst +6 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/examples/enriched_citations_example.py +1 -1
- pyuspto-0.5.1/examples/oa_actions_example.py +117 -0
- pyuspto-0.5.1/examples/oa_citations_example.py +106 -0
- pyuspto-0.5.1/examples/oa_rejections_example.py +63 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/requirements-dev.txt +7 -7
- {pyuspto-0.5.0 → pyuspto-0.5.1}/requirements.txt +1 -1
- {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/__init__.py +37 -2
- {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/clients/__init__.py +6 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/clients/base.py +9 -2
- pyuspto-0.5.1/src/pyUSPTO/clients/oa_actions.py +238 -0
- pyuspto-0.5.1/src/pyUSPTO/clients/oa_citations.py +247 -0
- pyuspto-0.5.1/src/pyUSPTO/clients/oa_rejections.py +233 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/config.py +18 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/models/__init__.py +29 -0
- pyuspto-0.5.1/src/pyUSPTO/models/oa_actions.py +570 -0
- pyuspto-0.5.1/src/pyUSPTO/models/oa_citations.py +277 -0
- pyuspto-0.5.1/src/pyUSPTO/models/oa_rejections.py +369 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO.egg-info/PKG-INFO +83 -2
- {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO.egg-info/SOURCES.txt +27 -0
- pyuspto-0.5.1/tests/clients/test_oa_actions_clients.py +448 -0
- pyuspto-0.5.1/tests/clients/test_oa_citations_clients.py +493 -0
- pyuspto-0.5.1/tests/clients/test_oa_rejections_clients.py +444 -0
- pyuspto-0.5.1/tests/integration/test_oa_actions_integration.py +237 -0
- pyuspto-0.5.1/tests/integration/test_oa_citations_integration.py +234 -0
- pyuspto-0.5.1/tests/integration/test_oa_rejections_integration.py +190 -0
- pyuspto-0.5.1/tests/models/test_oa_actions_models.py +480 -0
- pyuspto-0.5.1/tests/models/test_oa_citations_models.py +349 -0
- pyuspto-0.5.1/tests/models/test_oa_rejections_models.py +431 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/test_config.py +19 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/.github/ISSUE_TEMPLATE/documentation-updates.yml +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/.github/dependabot.yml +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/.github/workflows/codeql.yml +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/.github/workflows/publish-docs.yaml +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/.github/workflows/publish-to-test-pypi.yml +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/.gitignore +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/.readthedocs.yaml +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/ADVANCED.md +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/CHANGELOG.md +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/CODE_OF_CONDUCT.md +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/CONTRIBUTING.md +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/LICENSE +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/_version.pyi +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/Makefile +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/_static/.gitkeep +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/advanced.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/clients/bulk_data.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/clients/enriched_citations.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/clients/patent_data.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/clients/petition_decisions.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/clients/ptab_appeals.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/clients/ptab_interferences.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/clients/ptab_trials.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/config/config.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/config/http_config.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/config/index.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/exceptions.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/index.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/models/base.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/models/bulk_data.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/models/enriched_citations.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/models/patent_data.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/models/petition_decisions.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/models/ptab.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/models/utils.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/api/warnings.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/conf.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/configuration.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/development.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/examples/bulk_data.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/examples/enriched_citations.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/examples/ifw_example.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/examples/patent_data.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/examples/petition_decisions.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/examples/ptab_appeals.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/examples/ptab_interferences.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/examples/ptab_trials.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/index.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/installation.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/docs/source/quickstart.rst +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/examples/bulk_data_example.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/examples/error_handling_example.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/examples/ifw_example.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/examples/patent_data_example.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/examples/petition_decisions_example.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/examples/ptab_appeals_example.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/examples/ptab_interferences_example.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/examples/ptab_trials_example.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/pyUSPTO.code-workspace +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/pyproject.toml +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/setup.cfg +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/clients/bulk_data.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/clients/enriched_citations.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/clients/patent_data.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/clients/petition_decisions.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/clients/ptab_appeals.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/clients/ptab_interferences.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/clients/ptab_trials.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/exceptions.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/http_config.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/models/base.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/models/bulk_data.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/models/enriched_citations.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/models/patent_data.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/models/petition_decisions.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/models/ptab.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/models/utils.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/py.typed +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/utils/__init__.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO/warnings.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO.egg-info/dependency_links.txt +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO.egg-info/requires.txt +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO.egg-info/top_level.txt +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/src/pyUSPTO.egg-info/zip-safe +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/__init__.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/clients/__init__.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/clients/test_base.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/clients/test_bulk_data_clients.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/clients/test_enriched_citation_clients.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/clients/test_patent_data_clients.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/clients/test_petition_decision_clients.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/clients/test_ptab_appeals_client.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/clients/test_ptab_interferences_client.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/clients/test_ptab_trials_client.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/conftest.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/integration/__init__.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/integration/conftest.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/integration/test_bulk_data_integration.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/integration/test_enriched_citations_integration.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/integration/test_patent_data_integration.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/integration/test_petition_decisions_integration.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/integration/test_ptab_appeals_integration.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/integration/test_ptab_interferences_integration.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/integration/test_ptab_trials_integration.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/models/__init__.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/models/test_bulk_data_models.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/models/test_enriched_citation_models.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/models/test_patent_data_models.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/models/test_petition_decision_models.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/models/test_ptab_models.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/models/test_utils.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/test_edge_cases.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/test_exceptions.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/test_http_config.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/test_init.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/test_version.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tests/utils/__init__.py +0 -0
- {pyuspto-0.5.0 → pyuspto-0.5.1}/tox.ini +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyUSPTO
|
|
3
|
-
Version: 0.5.
|
|
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,
|
|
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,
|
|
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/).
|
|
@@ -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")
|