Disclosure API / Reliability record
Every time we tested the contract, and every time it broke
A scheduled job walks the live v1 API against production rows twice an hour, at :07 and :37 utc, plus manual dispatches. It asserts the envelope, the cursor, the conditional-request semantics, the documented path list and the quota headers, and it fails if one of them breaks. Below is the whole history: 897 runs between 2026-08-17T23:37:56Z and 2026-09-20T05:41:36Z, the 89 that failed, and the two that are excluded from the denominator with the reason for each.
This is not an uptime number
The canary is a sample of about 48 requests-sets a day from one hosted region against one developer-tier key. It cannot see a caller’s request, so it cannot measure availability as a caller experienced it. A run fails when a single invariant breaks, which is usually a conformance defect on a response that was served normally — and a documented fail-closed refusal is scored as a pass, because refusing is the contract. Those two facts push the figure in opposite directions. Neither of them is uptime, and the rates below must not be quoted as uptime.
Conformance, all runs
90.06%
806 of 895 runs passed every invariant.
Since the break ended
99.08%
537 of 542 runs after run #353.
Availability SLA
Not offered
No availability percentage is published from this sample. The reason is stated below.
One sustained break: 84 consecutive failing runs
From 2026-08-31T19:36:41Z to 2026-09-08T14:23:29Z, runs #270 through #353 all failed. Every run in this span failed. The first and last were read from their job logs and they broke different invariants, so the span is not attributed to a single defect. The 82 runs between them were not individually read. During most of the span the canary was running 5 to 12 times a day rather than the current 48, so the run count understates the duration: it lasted 7 days and 18.8 hours.
- First run of the break
- #270 (run 33431517783) — coverage: 200 — got 400
- Last run of the break
- #353 (run 34237946738) — directory: 304 keeps the version header
Every other failure, with the invariant it broke
5 runs outside the break failed. Each is listed with the exact assertion the API did not satisfy, read from that run’s job log.
| Run | When (UTC) | Broken invariants |
|---|---|---|
| #35534244301816 | 2026-09-08T15:22:12Z | directory: matching If-None-Match is 304 — got 503 directory: 304 echoes the tag it was asked about — null directory: unrecognised If-None-Match is 200, not 304 — got 503 |
| #45534514090071 | 2026-09-10T18:24:04Z | directory: matching If-None-Match is 304 — got 200 directory: 304 echoes the tag it was asked about — echoed a different tag |
| #65534919047569 | 2026-09-15T01:53:38Z | identity: /api/v1 is a documented path — not in openapi.paths (7 documented) |
| #72935114633039 | 2026-09-16T15:20:12Z | directory: 200 carries a weak ETag — absent |
| #75935194536987 | 2026-09-17T07:26:28Z | directory: unrecognised If-None-Match is 200, not 304 — got 503 |
Two runs are excluded from the denominator
897 runs are listed; 895 are counted. The difference is named here rather than dropped, because a denominator a reader cannot reconstruct is not a published figure.
#843 · 2026-09-19T02:28:00Z · The job was never started by GitHub Actions.
The run annotation reads that the job was not started because account payments failed or the spending limit needs raising. No request was made to the API, so counting it as a conformance failure would charge the API for a billing event.
#577 · 2026-09-13T08:44:00Z · The run is listed in a non-terminal state with no annotations.
It records neither a pass nor a failure and carries no job log, so it cannot be scored either way. It is one run in 897 and it is named rather than dropped.
The record, day by day
Runs per UTC day and how many of them failed. The cadence is not flat: the job ran a few times a day through late August and early September before moving to twice an hour, so a day with five runs is five samples, not a quiet day.
| UTC day | Runs | Failed | Shape |
|---|---|---|---|
| 2026-08-17 | 1 | 0 | |
| 2026-08-18 | 30 | 0 | |
| 2026-08-19 | 29 | 0 | |
| 2026-08-20 | 25 | 0 | |
| 2026-08-21 | 29 | 0 | |
| 2026-08-22 | 36 | 0 | |
| 2026-08-23 | 34 | 0 | |
| 2026-08-24 | 24 | 0 | |
| 2026-08-25 | 25 | 0 | |
| 2026-08-26 | 17 | 0 | |
| 2026-08-27 | 3 | 0 | |
| 2026-08-28 | 2 | 0 | |
| 2026-08-29 | 5 | 0 | |
| 2026-08-30 | 6 | 0 | |
| 2026-08-31 | 5 | 2 | |
| 2026-09-01 | 6 | 6 | |
| 2026-09-02 | 6 | 6 | |
| 2026-09-03 | 7 | 7 | |
| 2026-09-04 | 7 | 7 | |
| 2026-09-05 | 8 | 8 | |
| 2026-09-06 | 8 | 8 | |
| 2026-09-07 | 12 | 12 | |
| 2026-09-08 | 47 | 29 | |
| 2026-09-09 | 47 | 0 | |
| 2026-09-10 | 47 | 1 | |
| 2026-09-11 | 47 | 0 | |
| 2026-09-12 | 47 | 0 | |
| 2026-09-13 | 45 | 0 | |
| 2026-09-14 | 46 | 0 | |
| 2026-09-15 | 47 | 1 | |
| 2026-09-16 | 47 | 1 | |
| 2026-09-17 | 46 | 1 | |
| 2026-09-18 | 47 | 0 | |
| 2026-09-19 | 46 | 0 | |
| 2026-09-20 | 11 | 0 |
Why there is no availability SLA
An availability commitment needs a request-outcome log. Every request Veridion serves, with its status, its latency and its caller, retained over a window long enough to compute an error budget. The canary samples the API 48 times a day from one region; it is evidence the contract holds, not a measurement of what callers experienced. No availability percentage is published from it and no availability SLA is offered until the log exists.
What is committed instead is this record: the contract is proven against live production rows on a schedule, every run is retained and linkable, and a conformance regression is treated as a release-blocking defect rather than a known issue. When the request-outcome log exists, the figure computed from it will be published here beside this one, and this one will not be quietly replaced.
How this was measured
Every page of the workflow run list was walked and each run's terminal state read. Job logs were read for the first and last run of the sustained break and for all five isolated failures. Interior runs of the break were not individually read. Each run issues ~24 GET requests, two of them deliberately keyless against https://www.veridionmarkets.com. Measured 2026-09-20T06:05:00Z. Each run is retained in Veridion’s CI with the identifier printed beside it above, so a reader under diligence can pull any run named here and recount every figure on this page against it.