Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.fact0.io/llms.txt

Use this file to discover all available pages before exploring further.

FastAPI

Install

pip install fact0 fastapi

Async client with lifespan

from contextlib import asynccontextmanager
from fastapi import FastAPI
import fact0

audit: fact0.AsyncClient | None = None

@asynccontextmanager
async def lifespan(app: FastAPI):
    global audit
    audit = fact0.AsyncClient(api_key="alk_live_...")
    yield
    await audit.close()

app = FastAPI(lifespan=lifespan)

Request-level audit middleware

from fact0.integrations.fastapi import AuditMiddleware

app.add_middleware(
    AuditMiddleware,
    client_factory=lambda: audit,
    action_prefix="api",
)
The middleware logs api.request on each request with method, path, status, and duration in metadata.

Manual instrumentation

@app.post("/approve/{invoice_id}")
async def approve(invoice_id: str, user: User = Depends(get_user)):
    await audit.audit.log(
        actor={"id": user.id, "type": "human"},
        action="invoice.approve",
        resource={"id": invoice_id, "type": "invoice"},
        outcome="success",
    )
    ...
Use the same resource.id (often an execution ID) across all steps of one agent run for correlated filtering.