Skip to main content

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 -> response
  • failed: 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 source
  • src/api_request/cli/: Typer CLI entrypoints
  • src/api_request/request/: request orchestration and models
  • src/api_request/cache/: cache implementations and protocols
  • tests/: 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)

Source distribution for pfmsoft-api-request 0.1.9
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)

Table of built distributions (wheels) for pfmsoft-api-request 0.1.9
File Interpreter ABI Platform Actions
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 log

Release 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 log

Security 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.

Select from 2 files

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 log

A 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.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page