API observability & intelligence for FastAPI/Starlette — local-first, privacy-first
Project description
apiforgepy
API observability & intelligence for FastAPI/Starlette — local-first, privacy-first.
Track latency, error rates, and behavioral trends of your APIs. Everything stays on your machine.
Install
pip install apiforgepy
Quick start
from fastapi import FastAPI
from apiforgepy import ApiForgeMiddleware
app = FastAPI()
app.add_middleware(ApiForgeMiddleware)
@app.get("/users/{user_id}")
def get_user(user_id: int):
return {"id": user_id}
# Dashboard auto-starts at http://localhost:4242
Dashboard
Open http://localhost:4242 after starting your app. No configuration needed — the dashboard server starts automatically in the background.
- Health Score (0–100) — global API health at a glance
- Latency percentiles — P50 / P90 / P99 per route
- Error rates — 4xx and 5xx breakdown
- Automatic insights — latency anomalies, dead endpoints, release regressions
- Time series chart — click any route to see its latency over time
Data is stored locally in .apiforge.db (SQLite). Nothing leaves your machine.
Configuration
app.add_middleware(
ApiForgeMiddleware,
db_path=".apiforge.db",
dashboard_port=4242, # set to 0 to disable
env="production",
release="v1.4.0", # enables release regression detection
service="user-service",
sampling=1.0, # 0.0–1.0 sample rate
ignore_paths=["/health", "/favicon.ico"],
)
Cloud mode
Send metrics to the APIForge SaaS platform instead of storing them locally:
app.add_middleware(
ApiForgeMiddleware,
cloud_url=os.environ["APIFORGE_CLOUD_URL"],
api_key=os.environ["APIFORGE_API_KEY"],
service="user-service",
env="production",
release=os.environ.get("APP_VERSION"),
)
In cloud mode, metrics are aggregated in memory for 60 seconds and sent as a single batch — the local dashboard and SQLite database are not used.
Release tracking
Pass your release version to enable before/after deployment comparison:
import os
app.add_middleware(ApiForgeMiddleware, release=os.environ.get("APP_VERSION"))
When a new release is detected, APIForge compares P90 latency before and after and surfaces regressions automatically.
What you get
- Per-route latency — P50, P90, P99 per endpoint, updated every 60 s
- Error rate by route — 2xx / 3xx / 4xx / 5xx breakdown
- API Health Score — a single 0–100 score summarising your API's health
- Ghost route detection — requests that match no declared Starlette/FastAPI route
- Latency anomaly alerts — Z-score detection against a 7-day baseline
- Dead endpoint detection — routes with no traffic for 21+ days
- Release regression analysis — automatic P90 comparison per deploy
- Progressive drift detection — slow latency increases over weeks
- Untracked route detection — declared routes that never received traffic
- Inflight concurrency tracking —
inflight_avgandinflight_maxper route
Graceful shutdown
Cleanup (flush buffer, close dashboard, close SQLite) happens automatically via atexit. For explicit control in long-running processes:
from contextlib import asynccontextmanager
from fastapi import FastAPI
from apiforgepy import ApiForgeMiddleware
forge = None
@asynccontextmanager
async def lifespan(app):
yield
if forge:
forge.shutdown()
app = FastAPI(lifespan=lifespan)
forge = ApiForgeMiddleware(app) # store reference before adding
app.add_middleware(ApiForgeMiddleware)
Privacy by design
The middleware never reads request or response bodies, headers, cookies, or tokens. Route parameters are captured as patterns only (/users/{user_id} — never /users/42). In local mode, zero data leaves your machine.
Requirements
- Python ≥ 3.11
- Starlette ≥ 0.27 (FastAPI ≥ 0.110 includes this)
License
MIT — APIForge Organisation
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file apiforgepy-3.0.0.tar.gz.
File metadata
- Download URL: apiforgepy-3.0.0.tar.gz
- Upload date:
- Size: 44.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
150775649dda9d916d1a7c2de2f1c2b0643a41fd845117ea278d237283f2103b
|
|
| MD5 |
f1234031f56a969fa3e520548f74958a
|
|
| BLAKE2b-256 |
c9c2ae5ad0a98c2aa90c6d0337ab3a3328d7ea6740a1015fe0f78ed280e66f82
|
File details
Details for the file apiforgepy-3.0.0-py3-none-any.whl.
File metadata
- Download URL: apiforgepy-3.0.0-py3-none-any.whl
- Upload date:
- Size: 38.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aaf1c47501e6a086976d341c1bd2cb793d761a6f8e6a5436e43ae7aa0e30f421
|
|
| MD5 |
7a2bf0f964aef35a0ec6b4677cf863d6
|
|
| BLAKE2b-256 |
c353c8fdf1ced6bab49b45b0d9be008a59d6c3f49a44a7b65031c983b8445fec
|