FastAPI

Status page and uptime monitoring for FastAPI apps

Monitor FastAPI endpoints and async workers. JSON-path assertions map naturally to FastAPI health schemas. Hosted or headless status page.

Three ways to ship a status page for FastAPI

Pick the level of control you need — zero-code, low-code, or full headless.

Hosted

Add your FastAPI endpoint, point a CNAME at status.yourdomain.com, done. Works in 5 minutes.

Headless

Use our public API to build your own UI inside your FastAPI app. Full control over design and branding.

See the API

Embedded badges

Drop SVG uptime and status badges into your README or landing page. Auto-updates every 5 minutes.

Drop this health endpoint into your FastAPI app

Copy, paste, point PulseAPI at the URL. Returns 200 when healthy, 503 when degraded.

app/health.py
from fastapi import APIRouter, Response
from sqlalchemy import text
from .db import engine
from .redis import redis

router = APIRouter()


@router.get("/health")
async def health(response: Response) -> dict:
    checks: dict[str, str] = {}
    try:
        async with engine.connect() as conn:
            await conn.execute(text("SELECT 1"))
        checks["database"] = "ok"
    except Exception:
        checks["database"] = "fail"
    try:
        pong = await redis.ping()
        checks["cache"] = "ok" if pong else "fail"
    except Exception:
        checks["cache"] = "fail"
    healthy = all(v == "ok" for v in checks.values())
    response.status_code = 200 if healthy else 503
    return {"status": "healthy" if healthy else "degraded", **checks}

Mount the router on your main app. Return 503 on partial failure so PulseAPI marks the service degraded. JSON-path assertions work natively on the returned schema.

What breaks in FastAPI apps — and how to catch it

Async deadlocks

A forgotten `await` or sync call inside async context can lock the event loop. Response-time spikes surface this immediately.

Pydantic v1→v2 migration bugs

Model validation changes silently break endpoints. Body assertions on JSON catch schema regressions.

Upstream outages

Dependencies go down and endpoints return 502s. PulseAPI catches this and alerts before users report it.

Headless angle

Don't like our status page? Build your own in FastAPI.

Our API returns the same data our hosted UI consumes. Full OpenAPI spec documented at api.pulseapi.tech/docs.

FastAPI endpoint that proxies our status data into your own /status.
import httpx
from fastapi import APIRouter

router = APIRouter()


@router.get("/status")
async def status():
    async with httpx.AsyncClient(timeout=5) as client:
        r = await client.get("https://api.pulseapi.tech/status/acme")
        r.raise_for_status()
        return r.json()

FastAPI monitoring — FAQ

Does it work with FastAPI, Starlette, and Quart?

Yes. All three expose standard HTTP and are monitored the same way.

Can I monitor background workers (Dramatiq, Arq, Celery)?

Yes. Expose a health endpoint that round-trips a task through the worker. Return 503 if it fails or times out.

How do I handle Pydantic v1 vs v2 responses?

PulseAPI does not care — it asserts on the final JSON. Your schema can change between versions as long as asserted fields remain.

Can I render the status page inside FastAPI?

Yes. Fetch the API and render with Jinja2 or return JSON to a frontend. Shape is in our OpenAPI spec.

Start monitoring your FastAPI app in 5 minutes

Free tier. No credit card. Add your endpoint and get alerts when it breaks.