v0.1.0 · Open source · GPL-3.0

API monitoring
that doesn't
get in your way

Add one call to your FastAPI or Flask app. Get latency percentiles, per-route error rates, status distribution, and weekly AI-generated anomaly reports — self-hosted, no agents, no SaaS bill.

reqly.instrument(app, service_name="checkout-api") — that's it
reqly / checkout-api ● live
Latency
p50
42 ms
p95
187 ms
p99
312 ms
Error rate
0.8%
↓ within baseline
Requests / min
247
p50 · p95 · p99
Latency percentiles per route, per minute
Per-route
Error rates with z-score anomaly baseline
2xx – 5xx
Status distribution per service per hour
Weekly AI
Anomaly reports via Groq (Llama 3.3-70b)

Everything you need. Nothing you don't.

Built specifically for FastAPI and Flask — not a generic agent that ships 50 MB of overhead and a $400/month bill.

Zero-code instrumentation
One instrument() call. No decorators, no manual spans, no config files. Auto-detects FastAPI vs Flask.
import reqly from fastapi import FastAPI app = FastAPI() reqly.instrument( app, service_name="checkout-api", collector_url="http://localhost:8000", api_key="your_key" ) # Every route is now tracked.
Fail-open SDK
SDK errors never reach your app. Instrumentation disables itself on failure. A dead collector adds zero latency — all shipping is on a background thread with strict timeouts.
Background thread shipping
Queue capped at 2 000 events
Route templates, never raw paths
Latency percentiles
p50, p95, p99 per route per minute via TimescaleDB continuous aggregates.
p50
42ms
p95
187ms
p99
312ms
Error rate tracking
Per-route hourly error rates. 5xx responses and unhandled exceptions both captured.
0.8%
error rate · /checkout · last hour
Weekly AI anomaly reports
Z-score anomaly detection first — Groq writes the narrative last. The LLM never sees raw events; only the structured anomaly JSON.
"route": "/auth", "day_of_week": "Monday", "hour_range": "08:00–10:00", "observed_error_rate": 0.18, "baseline_error_rate": 0.02, "z_score": 3.4
"Your /auth endpoint degrades every Monday morning — error rate 18% vs. 2% baseline, p95 at 1850ms vs. 320ms."
No Groq key? Plain-text statistical summary generated instead.
Self-hostable
One docker compose up. TimescaleDB + Collector + Dashboard. Your data, your infra.
Status distribution
2xx / 3xx / 4xx / 5xx breakdown per service, per hour.

How data flows

Every component is yours — no phone-home, no shared infrastructure.

data flow
[Your FastAPI / Flask app]
  + Reqly SDK  ──►  POST /v1/ingest  (batched, background thread)
                             │  X-Reqly-Key auth · rate-limited
                     [Collector — FastAPI + asyncpg]
                             │  bulk insert
                     [TimescaleDB]
                      ├── request_events      (hypertable · 14-day retention)
                      └── continuous aggregates (no cron — auto-refresh):
                           ├── route_latency_1min      (p50 / p95 / p99 per minute)
                           ├── route_errors_1hour      (error rate per hour)
                           └── route_status_dist_1hour (status codes per hour)
                             
             ┌──────────────┴──────────────────────┐
                                                  
      [Dashboard]                  [APScheduler / Lambda]
   React 19 reads               Sunday 23:00 UTC:
   GET /v1/metrics/*             1. Pull 8w route_errors_1hour
                                2. Build dow × hour baseline
                                3. Z-score flag top anomalies
                                4. POST anomaly JSON → Groq
                                5. Store report → dashboard

Deliberate technology choices

Every layer has a reason. No bloat, no magic.

LayerTechnology & reason
SDKPython — threading, httpx, pure ASGI middleware (no Starlette BaseHTTPMiddleware overhead)
CollectorFastAPI + asyncpg + APScheduler + slowapi — async throughout, no ORM overhead
DatabaseTimescaleDB — hypertables + continuous aggregates auto-refresh; sub-ms dashboard queries
DashboardReact 19, Vite 8, Tailwind CSS 4, recharts 3, TanStack Query 5
AIGroq API · Llama 3.3-70b-versatile — statistics first, LLM writes narrative only
AWS (optional)Lambda + EventBridge + S3, deployed via SAM — same job as APScheduler, cloud-native cron

See Reqly in the wild

EventFlow — a real Flask event management app — is instrumented with Reqly. Browse the live metrics or explore the source.

Try EventFlow Live Metrics Dashboard EventFlow Source

To view metrics: login as Administrator on EventFlow (admin@eventhub.com / Admin@123) → click Metrics in the nav.