← Back to site

API operational · data degraded

Service availability: Operational Data quality: 1 dataset degraded

Last check: 1 Nov 00:20 UTC  ·  checks run every ~10 min  ·  page refreshes every 5 min

Dataset degraded: AU racing prices, bookmaker feeds

Data degraded

Bookmaker feeds with no recent price while races are running: BoostBet (no price for 119.3 h); BetGold (no price for 119.3 h).

Measured 1 Nov 2026 00:25 UTC · window last 7 days · the API itself is answering normally · data quality by code

What each measurement covers

Primary indicator, the customer path: 99.59% of external, authenticated runs passed since 13 Oct 2026 — 5391 runs over 18.7 days, with the probe running for 100.0% of that period. A run passes only when the edge check and an authenticated request both pass.

MeasurementRecordResult
Internal service health
On-host probes of the site and the API's /health answer with the expected status. They run inside the production host, so they cannot see a DNS, TLS, nginx or key failure.
from 3 Aug 2026 API 100.00%, 30 days
7 of 7 surfaces up now
External API reachability
From outside the host, the API's edge health check answers HTTP 200 inside three seconds, with no key.
from 18 Oct 202699.60% (3747 of 3762)
Authenticated request success
A real /v1/racing/next-to-go request with a monitoring key returns HTTP 200.
from 18 Oct 2026100.00% (3762 of 3762)
Response validity
That 200 carries a request id and a well-formed race list. Measured over the requests that were answered.
from 18 Oct 2026100.00% (3762 of 3762)
Fresh prices during racing hours
From 09:00 to midnight Sydney time, at least one race carries three or more bookmakers with a quote under five minutes old. Per-book read ages are on data quality.
from 18 Oct 2026, racing-day runs only99.96% (2359 of 2360)
Results completeness
Placings and dividends settle a bet; the full field (every runner placed) comes from a separate source per code.
2026-10-26 to 2026-11-01 full field 99.56% where a source exists
measured 1 Nov 2026 00:24 UTC
by code

The per-measure record starts 18 Oct 2026; earlier external runs kept one pass or fail per run, which is the run-level figure above. None of these is a contractual SLA, and passing all six does not prove every endpoint answers correctly — each row says what it checks.

Every dataset checked for the headline (17)
  • OK GB greyhound full fields · Every collectable race in the window is complete or still inside its settle time (867 races). (measured 1 Nov 2026 00:24 UTC)
  • OK US harness full fields · Every collectable race in the window is complete or still inside its settle time (549 races). (measured 1 Nov 2026 00:24 UTC)
  • Partial AU greyhound full fields, tracks outside Victoria · 5 of 496 races are overdue, under the 25% share at which this page calls the dataset degraded. (measured 1 Nov 2026 00:24 UTC)
  • OK US thoroughbred full fields · Every collectable race in the window is complete or still inside its settle time (486 races). (measured 1 Nov 2026 00:24 UTC)
  • OK AU thoroughbred full fields · Every collectable race in the window is complete or still inside its settle time (285 races). (measured 1 Nov 2026 00:24 UTC)
  • OK AU greyhound full fields, Victorian tracks from 14 October 2026, and races the national pages left empty · Every collectable race in the window is complete or still inside its settle time (271 races). (measured 1 Nov 2026 00:24 UTC)
  • OK AU harness full fields · Every collectable race in the window is complete or still inside its settle time (252 races). (measured 1 Nov 2026 00:24 UTC)
  • OK GB thoroughbred full fields · Every collectable race in the window is complete or still inside its settle time (198 races). (measured 1 Nov 2026 00:24 UTC)
  • OK CA harness full fields · Every collectable race in the window is complete or still inside its settle time (140 races). (measured 1 Nov 2026 00:24 UTC)
  • OK IE greyhound full fields · Every collectable race in the window is complete or still inside its settle time (112 races). (measured 1 Nov 2026 00:24 UTC)
  • OK IE thoroughbred full fields · Every collectable race in the window is complete or still inside its settle time (55 races). (measured 1 Nov 2026 00:24 UTC)
  • OK ZA thoroughbred full fields · Every collectable race in the window is complete or still inside its settle time (52 races). (measured 1 Nov 2026 00:24 UTC)
  • OK NZ thoroughbred full fields · Every collectable race in the window is complete or still inside its settle time (38 races). (measured 1 Nov 2026 00:24 UTC)
  • OK NZ harness full fields · Every collectable race in the window is complete or still inside its settle time (34 races). (measured 1 Nov 2026 00:24 UTC)
  • OK CA thoroughbred full fields · Every collectable race in the window is complete or still inside its settle time (30 races). (measured 1 Nov 2026 00:24 UTC)
  • Degraded AU racing prices, bookmaker feeds · Bookmaker feeds with no recent price while races are running: BoostBet (no price for 119.3 h); BetGold (no price for 119.3 h). (measured 1 Nov 2026 00:25 UTC)
  • OK AU racing prices, freshness on a customer request · The latest racing-day run found a race with fresh prices. (measured 1 Nov 2026 00:25 UTC)

A dataset is degraded when at least a quarter of its collectable races are overdue, when its source refuses our collector and placings or dividends are missing too, when a served bookmaker has gone dark, or when two consecutive racing-day external runs find no fresh prices. A refusing full-field source with placings and dividends intact is a scoped limitation, named with its tracks in its own notice. Partial, limited and not-assessed rows do not change the headline; a row whose measurement is older than its cadence is not current, never OK. Also in /status.json under datasets.

Services

API — external, authenticated Off-host, with a key Operational

Runs from outside the production host with a dedicated monitoring key; asserts the response structure and, during the Australian racing day, that fresh prices are present. Latency is from the runner's location.

The API answered an authenticated request from outside. Last run 1 Nov 00:25 UTC (1 min ago) from runner home-au; counted as stale after 30 min.

19 days agoToday
7d 99.70%2012 checks · 100.0% coverage
Since 13 Oct 2026 99.59%5391 checks · 100.0% coverage

External record since 13 Oct 2026 · 5391 runs recorded · probe running for 100.0% of that period. Uptime here counts the edge health check and the authenticated request; a run is up only if both passed. Windows longer than this record are omitted rather than assumed.

Website External probe Operational

GET https://puntersedge.online → expects HTTP 200

89 days agoToday
7d 100.00%1008 checks · 100.0% coverage
30d 99.98%4319 checks · 100.0% coverage
90d 99.97%14994 checks · 100.0% coverage
Since 3 Aug 2026 99.97%14996 checks · 100.0% coverage
Last check: 1 Nov 00:20 UTC (200)

Monitoring since 3 Aug 2026 · 14996 checks recorded · monitor running for 100.0% of that period.

API Platform External probe Operational

GET https://puntersedge.online/api → expects HTTP 200

77 days agoToday
7d 100.00%1008 checks · 100.0% coverage
30d 99.98%4319 checks · 100.0% coverage
Since 16 Aug 2026 99.96%11161 checks · 100.0% coverage
Last check: 1 Nov 00:20 UTC (200)

Monitoring since 16 Aug 2026 · 11161 checks recorded · monitor running for 100.0% of that period. Windows longer than that record are omitted rather than assumed.

Legacy redirect External probe Operational

GET https://puntersedge.online/api-platform → expects HTTP 200

63 days agoToday
7d 100.00%1008 checks · 100.0% coverage
30d 99.98%4319 checks · 100.0% coverage
Since 30 Aug 2026 99.98%8939 checks · 100.0% coverage
Last check: 1 Nov 00:20 UTC (200)

Monitoring since 30 Aug 2026 · 8939 checks recorded · monitor running for 100.0% of that period. Windows longer than that record are omitted rather than assumed.

Pricing External probe Operational

GET https://puntersedge.online/api/pricing → expects HTTP 200

77 days agoToday
7d 100.00%1008 checks · 100.0% coverage
30d 99.98%4319 checks · 100.0% coverage
Since 16 Aug 2026 99.96%11161 checks · 100.0% coverage
Last check: 1 Nov 00:20 UTC (200)

Monitoring since 16 Aug 2026 · 11161 checks recorded · monitor running for 100.0% of that period. Windows longer than that record are omitted rather than assumed.

Telegram Bot External probe Operational

GET bot health endpoint → expects HTTP 200

89 days agoToday
7d 100.00%1008 checks · 100.0% coverage
30d 100.00%4319 checks · 100.0% coverage
90d 99.99%14994 checks · 100.0% coverage
Since 3 Aug 2026 99.99%14996 checks · 100.0% coverage
Last check: 1 Nov 00:20 UTC (200)

Monitoring since 3 Aug 2026 · 14996 checks recorded · monitor running for 100.0% of that period.

Odds API Internal probe Operational

GET /health on the odds API service → expects HTTP 200  ·  loopback: this probe does not traverse DNS, TLS or nginx

89 days agoToday
7d 100.00%1008 checks · 100.0% coverage
30d 100.00%4319 checks · 100.0% coverage
90d 99.95%14994 checks · 100.0% coverage
Since 3 Aug 2026 99.95%14996 checks · 100.0% coverage
Last check: 1 Nov 00:20 UTC (200)

Monitoring since 3 Aug 2026 · 14996 checks recorded · monitor running for 100.0% of that period.

Stripe Webhooks Internal probe Operational

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

89 days agoToday
7d 100.00%1008 checks · 100.0% coverage
30d 100.00%4319 checks · 100.0% coverage
90d 99.99%14994 checks · 100.0% coverage
Since 3 Aug 2026 99.99%14996 checks · 100.0% coverage
Last check: 1 Nov 00:20 UTC (405)

Monitoring since 3 Aug 2026 · 14996 checks recorded · monitor running for 100.0% of that period.

Outbound email

Operational

Outbound email is sending.

Checked 2 min ago. The transport answered a reachability probe. Last successful send 1 Nov 00:09 UTC (18 min ago).

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.

Latency, yesterday (UTC) · errors per path

2026-10-31 · external callers, successful responses, measured at the application (excludes edge time). The roll-up covers 23 of that day's 24 hours, so these figures are partial.

PathRequestsp50p95p995xx4xx
/v1/racing/next-to-go32,619211.5 ms1855.6 ms2888.5 ms00.00%5,63214.08%
/v1/racing/changes30,75854.7 ms426.2 ms1693.4 ms00.00%220.07%
/v1/racing/results16,632163.2 ms1035.0 ms2623.8 ms00.00%3732.19%
/v1/sports/{k}/odds6,831275.5 ms2960.0 ms5431.7 ms00.00%821.19%
/v1/racing/horses/form5,537704.6 ms4463.0 ms6428.7 ms1282.26%20.04%
/v1/usage5,11170.8 ms607.2 ms1968.5 ms00.00%210.41%
All 168 /v1 paths166,403all responses1280.08%39,72123.87%

On a narrow screen, swipe the table sideways for p99, 5xx and 4xx.

The hourly roll-up keeps percentiles, not raw timings, so the day's figures are combined from the hourly ones with each hour's requests counted at the top of their percentile band. They lean high rather than low. Requests and latency count successful responses only; the six busiest paths by that count, plus any other path that returned a server error. Errors are counted over every response the same external callers got on that path that day, from the same hourly roll-up. 5xx is a server error. 4xx is a client error: 402 is out of credits, 429 is rate limited, and the roll-up keeps 401, 403, 404 and other 4xx together as one class. Client errors include customers' own mistakes and exhausted credits, so they are not a measure of our availability; server errors are. Also in /status.json under latency.

Second, independent probe

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. Note what it reaches: the public host's nginx routes /ping to the API process, so this probe exercises DNS, TLS, nginx routing and the API process itself — but it carries no key and makes no database or data assertion. A pass means the API process answers, not that prices are flowing. The /v1/uptime endpoint is backed by this same file.

100.00% over the last 30 days (8640 checks, monitor running for 100.0% of the window). Buffer holds the most recent 8640 checks, spanning 30.0 days from 2 Oct 2026; last check 1 Nov 00:24 UTC.

How we measure — and what we do not promise

The checks

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.

The exception is API — external, authenticated: it runs on a machine outside the production host, presents a dedicated monitoring key, and checks what a customer's request gets back. Its card is grey whenever no result newer than 30 minutes exists — a missing check is never shown as a passing one.

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.

The percentages

Service availability and data quality

The headline answers two questions separately. Service availability is whether the site, the API and outbound email answer, from the checks on this page. Data quality is whether each dataset those answers carry is complete and current: race results with full fields per code, the bookmaker feeds, and fresh prices on a customer request. A degraded dataset is named in its own notice, with the date it began, what still works and what is missing, and it never marks the whole service degraded. A source we do not control that refuses one part of a dataset while the rest is intact, such as a full-field source while placings and dividends still arrive, is a scoped limitation: it gets its own notice listing the tracks, and the headline stays operational. A check whose last measurement is older than its expected cadence is shown as not current, never as healthy.

Data freshness

How fresh the odds inside a response are is 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.

What happens during an outage

What is not guaranteed

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.

Machine-readable

/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.