---
title: "Api Health Providers"
method: GET
path: "/api/health/providers"
---

# Api Health Providers

`GET /api/health/providers`

## Request

- Base URL: `https://www.oxfordledge.com` (the document declares no server; this is the origin it was published from)
- URL: `https://www.oxfordledge.com/api/health/providers`
- Auth: none declared

Public provider quota status — drives the degraded-UX banner.

Response shape (stable; frontend reads this verbatim):
  {
    providers: {
      fmp: {status, calls_today, daily_limit, pct_used},
      finnhub: {status, calls_today?, daily_limit?},
    },
    any_degraded: bool,
    any_exhausted: bool,
  }

Status thresholds (per provider):
  - exhausted: calls_today >= daily_limit (hard 429s expected)
  - degraded:  calls_today >= 0.85 * daily_limit (banner trigger)
  - ok:        below 0.85

## Response `200`

Successful Response

- ProviderQuotaResponse: `/api/health/providers` — public provider quota snapshot. F4 boundary backfill 2026-05-08 (Initiative 6). Powers the FMP-quota- degraded UX banner. Public (no auth). Frontend reads response shape verbatim per the route docstring; that read pattern is exactly what F4 boundary tests are designed to gate.
  - `providers` object, required: Provider name → ProviderQuotaItem. Currently 'fmp' + 'finnhub'.
  - `any_degraded` boolean, required: True if any provider in 'degraded' or 'exhausted' state. Banner trigger.
  - `any_exhausted` boolean, required: True if any provider in 'exhausted' state (over daily limit).

---

[API](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api.md) · [All operations](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api/llms.txt) · [OpenAPI document](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api/revisions/e832a1260f0b?raw)
