BrokenAI aggregates the official Statuspage.io feeds of each provider and computes a composite reliability score per time window. We do not run independent probes — all numbers reflect what the provider themselves report on their status page.
Each factor is normalised 0–100 over the selected window, then combined:
score = 0.5 × uptime_factor
+ 0.2 × frequency_factor
+ 0.2 × severity_factor
+ 0.1 × mttr_factorLinear rescale of the window's severity- and component-weighted uptime %, with the baseline at 90%:
uptime_factor = clamp(0, 100, (uptime% − 90) ÷ (100 − 90) × 100)
uptime% itself = 100% − Σ(overlap_min × impact_ratio × affected_components / total)
where impact_ratio = 0.2 (minor) · 0.6 (major) · 1 (critical)Why 90% baseline: anything under 90% is functionally broken, so we don't need resolution there. The interesting differences live in the 99.x range.
Exponential decay against the count of incidents in the window. Never reaches zero, so two providers with chatty weeks still rank against each other:
frequency_factor = 100 × exp(−incident_count ÷ e_fold)
where e_fold[30d] = 100, e_fold[7d] = 40, e_fold[1h] = 6Worked examples (30d, e_fold = 100): 20 incidents → 82, 100 incidents → 37, 200 incidents → 14.
Same exponential shape as frequency, but the input is severity-minutes — a duration-and-impact-weighted sum:
severity_minutes = Σ min(duration, 360min cap) × impact_multiplier
where multipliers are minor 0.5, major 2, critical 6
severity_factor = 100 × exp(−severity_minutes ÷ scale)
where scale[30d] = 3000, scale[7d] = 1500, scale[1h] = 400Two design choices worth flagging:
Linear penalty against the median resolution time for the window. Hits zero at 120 minutes:
mttr_factor = max(0, 100 − median_minutes_to_resolve ÷ 1.2)
https://status.claude.com/api/v2/summary.jsonhttps://status.openai.com/api/v2/summary.jsonPolled every 60 seconds by our backend; your browser also fetches live status directly every 30 seconds.