Last check: 6 Oct 04:30 UTC · checks run every ~10 min · page refreshes every 5 min
GET https://puntersedge.online → expects HTTP 200
Monitoring since 8 Jul 2026 · 18714 checks recorded · monitor running for 100.0% of that period. Windows longer than that record are omitted rather than assumed.
GET https://puntersedge.online/api → expects HTTP 200
Monitoring since 16 Aug 2026 · 7442 checks recorded · monitor running for 100.0% of that period. Windows longer than that record are omitted rather than assumed.
GET https://puntersedge.online/api-platform → expects HTTP 200
Monitoring since 30 Aug 2026 · 5220 checks recorded · monitor running for 100.0% of that period. Windows longer than that record are omitted rather than assumed.
GET https://puntersedge.online/api/pricing → expects HTTP 200
Monitoring since 16 Aug 2026 · 7442 checks recorded · monitor running for 100.0% of that period. Windows longer than that record are omitted rather than assumed.
GET bot health endpoint → expects HTTP 200
Monitoring since 8 Jul 2026 · 18714 checks recorded · monitor running for 100.0% of that period. Windows longer than that record are omitted rather than assumed.
GET /health on the odds API service → expects HTTP 200 · loopback: this probe does not traverse DNS, TLS or nginx
Monitoring since 8 Jul 2026 · 18714 checks recorded · monitor running for 100.0% of that period. Windows longer than that record are omitted rather than assumed.
GET webhook listener endpoint (POST-only; 405 on GET proves it answers) → expects HTTP 405 · loopback: this probe does not traverse DNS, TLS or nginx
Monitoring since 8 Jul 2026 · 18714 checks recorded · monitor running for 100.0% of that period. Windows longer than that record are omitted rather than assumed.
Outbound email is sending.
Checked 42s ago. The transport answered a reachability probe. Last successful send 6 Oct 04:33 UTC (82s ago).
gmail_outbox —
reachable (HTTP 200 in 291ms)Measured by a separate monitor that reads the delivery result of every message the API sends and probes whether the configured transport is reachable — it never sends a test message to anyone. This page only reads what that monitor last wrote, which is why the time of its last run is published above: if the monitor stops, that timestamp stops moving, and no figure here can quietly go on looking healthy. Recipient addresses are masked and no message subject is published. Also available as JSON at /status.json.
A separate process on the API host polls https://puntersedge.online/ping on its own
schedule. It is a useful cross-check because it shares no scheduler and no code path with the
monitor above — but note what it targets: it probes the website, not
api.puntersedge.online. The /v1/uptime endpoint is backed by this
same file, so read its number as website availability measured from the API box.
100.00% over the last 30 days (8639 checks, monitor running for 100.0% of the window). Buffer holds the most recent 8640 checks, spanning 30.0 days from 6 Sep 2026; last check 6 Oct 04:34 UTC.
A process on the same DigitalOcean droplet as the services issues one HTTP request per surface and records the response code and whether it matched the expected code. The measured interval between checks over the last 24 hours is 10 minutes — measured from the history file rather than read off the scheduler, because the two have disagreed before. Each service card shows the exact URL probed and the code it expects.
2 of the 7 probes are loopback requests on the box itself. They confirm the application process is answering; they cannot detect a DNS, TLS, nginx or network failure that would take the service down for every customer. They are labelled Internal probe above and you should read them as narrower evidence than the external ones.
This page is about service availability. It says nothing about how fresh the odds inside a response are — that is a separate, separately measured thing, published with its own p50/p90/max figures on the coverage page under “Data refresh rates”. Those numbers live in one place so they cannot drift apart; they are not restated here.
Every quote the API returns carries its own age. On sports responses the quality
object gives score, status, age_seconds and
stale_after_seconds, and a market flips to stale once its
age_seconds passes that threshold, currently 30 minutes.
Racing quotes carry a per-book age_seconds, and each race carries
data_age_seconds — deliberately the age of the worst contributing
book, not the best — alongside freshest_age_seconds. Read those rather than
assuming a fixed panel of bookmakers is always quoting: overnight, when the Australian card
has finished, far fewer books are.
There is no contractual uptime SLA. Everything on this page is observed measurement of what has happened, published so you can judge it yourself. It is not a commitment about what will happen, there is no credit or refund schedule attached to it, and nothing here should be read as one. If you need a contractual availability commitment, ask — it is a conversation, not a published number.
This is not real-time tick data, and it is not suitable for latency-sensitive trading. Refresh rates depend on upstream bookmaker availability and rate limits.
/uptime.json — availability per surface, each figure with its window, check count and coverage. /status.json — current up/down per service. Both carry the same caveats as fields, so a consumer that never reads this page still gets them.