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.

RunWhen (UTC)Broken invariants
#355342443018162026-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
#455345140900712026-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
#655349190475692026-09-15T01:53:38Z
identity: /api/v1 is a documented path — not in openapi.paths (7 documented)
#729351146330392026-09-16T15:20:12Z
directory: 200 carries a weak ETag — absent
#759351945369872026-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 dayRunsFailedShape
2026-08-1710
2026-08-18300
2026-08-19290
2026-08-20250
2026-08-21290
2026-08-22360
2026-08-23340
2026-08-24240
2026-08-25250
2026-08-26170
2026-08-2730
2026-08-2820
2026-08-2950
2026-08-3060
2026-08-3152
2026-09-0166
2026-09-0266
2026-09-0377
2026-09-0477
2026-09-0588
2026-09-0688
2026-09-071212
2026-09-084729
2026-09-09470
2026-09-10471
2026-09-11470
2026-09-12470
2026-09-13450
2026-09-14460
2026-09-15471
2026-09-16471
2026-09-17461
2026-09-18470
2026-09-19460
2026-09-20110

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.

Weekly Veridion brief

Rating changes, public disclosure activity, methodology notes, and product updates. One email per week. No advertising list resale.