api-request
api-request is an API-first Python project for executing batched HTTP requests with:
- async request orchestration
- optional SQLite-backed caching
- configurable rate limiting
- JSON in / JSON out workflows
It includes a simple CLI for running request batches from stdin or files, and a Python API for integrating the same behavior in application code.
Project Status
- Package manager:
uv - Distribution: source-only for now (no PyPI release yet)
- Python:
>=3.14
Installation
Clone the repository and sync dependencies with uv:
uv sync
This creates/updates the local .venv and installs app + dev dependencies.
Quick Start (CLI)
Show CLI help:
uv run api-request --help
Run a batch from stdin and print plain JSON to stdout:
cat requests.json | uv run api-request --from - --to - --plain --indent 2
Run from file and write to file:
uv run api-request --from requests.json --to responses.json --overwrite --indent 2
Show version and resolved runtime directories:
uv run api-request --version
Input JSON Shape
The CLI expects a JSON object keyed by request UUID. Each value is a request definition.
Minimal example:
{
"00000000-0000-0000-0000-000000000001": {
"url": "https://esi.evetech.net/status/",
"method": "GET"
}
}
Supported request fields include:
url(required)method(required)headers(optional map)body(optional)parameters(optional query param map)cache_key(optional UUID)rate_key(optional string)
Output JSON Shape
The CLI returns a JSON object with:
successful: map of request UUID -> responsefailed: map of request UUID -> failed response
Python API Usage
import asyncio
from uuid import uuid4
from api_request import ApiRequester, Request
from api_request.cache import InMemoryCache
from api_request.rate_limit import AiolimiterRateLimiterFactory
async def main() -> None:
request = Request(
request_key=uuid4(),
method="GET",
url="https://esi.evetech.net/status/",
cache_key=uuid4(),
rate_key="esi-status",
)
async with ApiRequester(
cache_factory=InMemoryCache,
rate_limiter_factory=AiolimiterRateLimiterFactory(
max_rate=50.0,
time_period=60.0,
),
) as requester:
responses = await requester.process_requests({request.request_key: request})
print(responses)
if __name__ == "__main__":
asyncio.run(main())
Configuration
Runtime settings use environment variables with the API_REQUEST_ prefix.
API_REQUEST_APPLICATION_DIRECTORY: overrides the app directory used for cache and logs.
You can also set this from the CLI with --application-directory.
Development
Common commands:
uv sync
uv run ruff format
uv run ruff check
uv run pytest
Repository Layout
src/api_request/: package sourcesrc/api_request/cli/: Typer CLI entrypointssrc/api_request/request/: request orchestration and modelssrc/api_request/cache/: cache implementations and protocolstests/: test suite
License
MIT. See LICENSE.
Metadata
Release files for pfmsoft-api-request 0.1.9
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| pfmsoft_api_request-0.1.9.tar.gz | 30.9 kB | With provenance | Details for pfmsoft_api_request-0.1.9.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| pfmsoft_api_request-0.1.9-py3-none-any.whl | Python 3 | none | any | Details for pfmsoft_api_request-0.1.9-py3-none-any.whl |
Total release size: 76.9 kB
Release files / pfmsoft_api_request-0.1.9.tar.gz
| Download URL | pfmsoft_api_request-0.1.9.tar.gz |
|---|---|
| Size | 30.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
eb2f35c81080e587b52f161a5a139d93e8fa3f63c7de30fea5d390703cbb9a45
|
|
BLAKE2b-256 checksum How to use checksums |
01f6719ebc96c282e3eecafb87cccd7e4d510902c1fe9681a8649f6cda48ef71
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 29, 2026.
Transparency logRelease files / pfmsoft_api_request-0.1.9-py3-none-any.whl
| Download URL | pfmsoft_api_request-0.1.9-py3-none-any.whl |
|---|---|
| Size | 46.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5e91894dc8ea7f3d31911296931b7befa799c41e01dba25a69ba53964aa8d6cb
|
|
BLAKE2b-256 checksum How to use checksums |
0c6d310e7d3eb75df4939ef083e5db30b3adaa4a33428eae3036969a100103ed
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 29, 2026.
Transparency logSecurity for pfmsoft-api-request 0.1.9
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for pfmsoft_api_request-0.1.9.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 29, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.