Skip to main content

PureAPI

PyPI version PyPI Python Versions Documentation Status License Package status

English | 简体中文

PureAPI is a lightweight, intuitive, zero-runtime-dependency Python web API framework.

Features

  • Typed routing with automatic conversion, such as /users/{user_id:int}.
  • Standard WSGI application interface.
  • Automatic JSON responses for dict and list return values.
  • Request object with query parameters, headers, body, JSON, form data, and URL helpers.
  • Built-in OpenAPI generation at /openapi.json.
  • Built-in API documentation with Scalar API Reference by default, plus Swagger UI and ReDoc.
  • Zero runtime dependencies in the core framework.

Requirements

PureAPI supports Python 3.11 and newer.

Installation

Install from PyPI:

pip install pureapi

Install for local development:

git clone https://github.com/MarkHoo/pureapi.git
cd pureapi
python -m pip install -e ".[dev]"

Run the test suite:

python -m pytest

Quick Start

Create app.py:

from pureapi import PureAPI, Request, HTTPException

app = PureAPI(
    title="Task API",
    version="1.0.0",
    description="A small task management API built with PureAPI.",
)

tasks = {
    1: {"id": 1, "title": "Write documentation", "done": False},
}


@app.get("/", summary="API home", tags=["system"])
def home():
    """Return basic service information."""
    return {
        "name": "Task API",
        "docs": "/docs",
        "openapi": "/openapi.json",
    }


@app.get("/tasks", summary="List tasks", tags=["tasks"])
def list_tasks():
    """Return all tasks."""
    return {"items": list(tasks.values()), "count": len(tasks)}


@app.get("/tasks/{task_id:int}", summary="Get task", tags=["tasks"])
def get_task(task_id: int):
    """Return one task by ID."""
    task = tasks.get(task_id)
    if task is None:
        raise HTTPException(status_code=404, detail="Task not found")
    return task


@app.post("/tasks", summary="Create task", tags=["tasks"])
def create_task(request: Request):
    """Create a task from a JSON request body."""
    data = request.json or {}
    title = str(data.get("title", "")).strip()
    if not title:
        raise HTTPException(status_code=400, detail="title is required")

    task_id = max(tasks.keys(), default=0) + 1
    task = {"id": task_id, "title": title, "done": False}
    tasks[task_id] = task
    return task


if __name__ == "__main__":
    app.run(host="127.0.0.1", port=8000, debug=True)

Start the application:

python app.py

Open:

Documentation Routes

PureAPI registers documentation routes automatically:

Path Description
/docs Scalar API Reference, the default documentation UI
/swagger Swagger UI
/redoc ReDoc
/openapi.json OpenAPI 3.0 JSON

Customize them when creating the app:

app = PureAPI(
    title="My API",
    version="1.0.0",
    docs_url="/docs",
    scalar_url="/reference",
    swagger_url="/swagger",
    redoc_url="/redoc",
    openapi_url="/openapi.json",
)

Production

Run with Gunicorn:

gunicorn myapp:app -w 4 -b 0.0.0.0:8000

Run with uWSGI:

uwsgi --http :8000 --wsgi-file myapp.py --callable app

License

PureAPI is released under the MIT License. See LICENSE.

Metadata

Release files for pureapi 0.2.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pureapi 0.2.1
File Size Uploaded
pureapi-0.2.1.tar.gz 15.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pureapi 0.2.1
File Interpreter ABI Platform
pureapi-0.2.1-py3-none-any.whl Python 3 none any Details

Total release size: 29.1 kB

Release files / pureapi-0.2.1.tar.gz

Download URL pureapi-0.2.1.tar.gz
Size 15.6 kB
Tags Source
SHA-256 checksum
How to use checksums
7139dae5fb58f8a4a3c50736ca4a0f09551853a3176076ae96f9122b00302084
BLAKE2b-256 checksum
How to use checksums
df1887dbf3f4e94b06ff529aab87d04e610823d6420b6686766a605ef414c3ea
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 4, 2026.

Transparency log

Release files / pureapi-0.2.1-py3-none-any.whl

Download URL pureapi-0.2.1-py3-none-any.whl
Size 13.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e5a2a7001fb55cad969b490bc73f35258bf5ab746b00cd2b0703590e43dcfc05
BLAKE2b-256 checksum
How to use checksums
d121542c437d3f3e57ed2545be829e710d2ba4eef8cdb88c0e8bf8468c094163
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 4, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.2.1 This release

2 release files

0.2.0

2 release files

0.1.1

2 release files

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