How this page works
This page shows the health of OpenWAF: the edge network that proxies your sites, authoritative DNS, the dashboard and the API. It is measured from outside our own infrastructure, so it keeps working when we don't.
How we measure
- Every minute, probes on Cloudflare's network, outside our infrastructure, check each component the way a client would.
- Edge nodes also send heartbeats. A node that stops sending them is flagged even if the probes can still reach it.
- A component only changes status when 2 of 3 checks see the failure, and the same goes for recovery. One lost packet does not turn a bar red.
- This page is hosted on Cloudflare Pages, apart from our fleet. If our servers go down, this page stays up and says so.
How uptime is calculated
Every minute has one status per component. Uptime for a day is:
uptime = 1 − (major outage + 0.3 × partial outage) / measured minutes
Minutes of degraded performance and planned maintenance do not count as downtime. They still show in each day's details.
The 30- and 90-day figures use the same formula over every measured minute in the period. Minutes without measurements are left out; they don't count as up.
Day colours
Weighted minutes = major outage minutes + 0.3 × partial outage minutes.
- No downtime
- Degraded performance, no downtime
- Maintenance only
- 1 to 20 weighted minutes down
- 21 to 40 weighted minutes down
- More than 40 weighted minutes down
- No measurements
MTTR and MTBF
- MTTR (mean time to recovery): the average time from the start of an outage to full recovery, over the last 90 days.
- MTBF (mean time between failures): the average time a component runs between the end of one outage and the start of the next, over the last 90 days.
- Both count partial and major outages only. The API has them per component, in
metrics.
Use the data
Everything on this page is available to tools. No account or key needed.
API
| Path | What it returns |
|---|---|
/api/v2/summary.json | Overall status, components, open incidents and active maintenance |
/api/v2/status.json | Overall status only |
/api/v2/components.json | Every component and its status |
/api/v2/incidents.json | Recent incidents |
/api/v2/incidents/unresolved.json | Incidents not yet resolved |
/api/v2/scheduled-maintenances.json | Maintenance (also /upcoming.json and /active.json) |
/api/v1/page.json | What this page uses: 90 days of daily uptime, MTTR and MTBF |
/api/v1/history.json | Monthly history, with component and kind filters |
The /api/v2 endpoints follow the Statuspage format, so integrations that already read Statuspage pages work unchanged. CORS is open for GET.
Feeds
- Atom:
/history.atom| RSS:/history.rss - Maintenance calendar (iCal):
/maintenance.ics - One Atom feed per incident:
/incidents/<id>.atom
For agents and LLMs
/index.md is this page in Markdown, and /llms.txt lists what is available. Requests to / with Accept: text/markdown get Markdown too.
Badges
Paths: /badge/status.svg, /badge/<component>/status.svg, /badge/<component>/uptime-30d.svg, /badge/<component>/uptime-90d.svg and /badge/<component>/sla-99.9.svg. Component ids are in /api/v2/components.json.
Markdown
[](https://status.openwaf.dev)
HTML
<a href="https://status.openwaf.dev"><img src="https://status.openwaf.dev/badge/status.svg" alt="OpenWAF status"></a>
Widget
One line on your site. It stays out of sight while everything works; during an incident or maintenance it shows a small notice in the bottom-right corner. It runs in its own shadow DOM, so it doesn't touch your styles.
<script src="https://status.openwaf.dev/widget.js" async></script>
If your site has a CSP, add https://status.openwaf.dev to script-src and connect-src.
Notifications
There are no email subscriptions. Follow the feeds, or get updates in Slack, Discord, Microsoft Teams or your own webhook from Subscribe.