Skip to main content

A command line api request tool with caching and rate limiting.

Project description

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.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pfmsoft_api_request-0.1.3.tar.gz (33.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pfmsoft_api_request-0.1.3-py3-none-any.whl (49.4 kB view details)

Uploaded Python 3

File details

Details for the file pfmsoft_api_request-0.1.3.tar.gz.

File metadata

  • Download URL: pfmsoft_api_request-0.1.3.tar.gz
  • Upload date:
  • Size: 33.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for pfmsoft_api_request-0.1.3.tar.gz
Algorithm Hash digest
SHA256 6e7a7ae89996ccf0e3a42775432ebfc151d6b4013c1474802121879217636e61
MD5 6d6f31394dea7f95ab9891e4ef883c6e
BLAKE2b-256 d0a6d8ac3df3e09e44652b7b51501f8687f18583995109330e6e0bf1c346f9ef

See more details on using hashes here.

Provenance

The following attestation bundles were made for pfmsoft_api_request-0.1.3.tar.gz:

Publisher: pypi-publish.yaml on DonalChilde/pfmsoft-api-request

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pfmsoft_api_request-0.1.3-py3-none-any.whl.

File metadata

File hashes

Hashes for pfmsoft_api_request-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 0c48b02f5b4a2c7204bedb4d57ed0ca601e6b2485f2c7c67019d603a2c137216
MD5 b787faaf85917d2a7ec25ddde93e53d2
BLAKE2b-256 5c3c05c0f95522ee79771e71e987f3385e139eedf4e163a4c36c81cc81914484

See more details on using hashes here.

Provenance

The following attestation bundles were made for pfmsoft_api_request-0.1.3-py3-none-any.whl:

Publisher: pypi-publish.yaml on DonalChilde/pfmsoft-api-request

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page