Public data API · v1.0.0

Take the numbers. All of them.

Every measurement Q-Advantage publishes is readable as JSON, without a key, a login, or a rate limit. Responses are prerendered at build time, so they are static files served from the edge — and every measurement carries the URL of the GitHub Actions run that produced it. If a number here cannot be traced to a run, it is a bug, not a rounding.

Base URL
qadvantage.io
Version
v1
Auth
None
Runs available
100
Coverage
2026-05-11 → 2026-08-22
Spec
Quickstart

Discovery first, then the data.

Start at /availability so you are reading identifiers that exist rather than guessing them.

Discover what exists
curl https://qadvantage.io/api/v1/availability
Read the newest run
curl https://qadvantage.io/api/v1/latest
Follow one algorithm over time
curl https://qadvantage.io/api/v1/algorithms/ml-kem-768/history
Inspect the machine-readable contract
curl https://qadvantage.io/openapi.json
Endpoints

7 operations.

Generated from the route handlers themselves — this list cannot document something that does not exist.

EndpointWhat it returns
/api/v1/algorithms/{id}/historyRead an algorithm's measured seriesEvery committed measurement for one algorithm, per operation, oldest first. Measured points only — there is no value between two runs and the series must not be resampled as though it were continuous.
/api/v1/availabilityList what can be asked forDiscovery. Returns the algorithms, operations, protocol tracks, architectures and run-date range actually present, plus the endpoint list. Start here rather than guessing identifiers.
/api/v1/latestRead the newest runThe most recent daily benchmark run in full: every algorithm, every operation, all nine timing fields, with the run's provenance block.
/api/v1/protocolsRead the composed protocol tracksTLS and SSH handshake suites with their phase decomposition, wire sizes, amplification factor and classical baseline, plus the signature, AES-GCM and stateful-signature tracks, per architecture.
/api/v1/reliabilityRead measurement reliabilityPer-run counts of algorithm measurements attempted and succeeded, with CPU steal. Reported as counts rather than a bare percentage — the same rate over two runs and over ninety-four are different claims.
/api/v1/runsList all runsIndex of every committed run, newest first, each with its commit, Actions run URL, CPU-steal figure and a link to the full payload.
/api/v1/runs/{date}Read one runOne run by date (YYYY-MM-DD). Only dates present in the index resolve; anything else is a 404 rather than an empty run.
Conventions

What the fields mean.

Read this before you write a parser.

null is null A field that is absent or null was not measured. It is never zero-filled, defaulted, or carried over from a previous run. A zero timing would read as “instant”, which is a claim the data does not make.

run_url Every measurement-bearing object carries the GitHub Actions run that produced it. This is the point of the whole thing.

units Timings are microseconds (_us), sizes are bytes (_bytes), throughput is operations per second. Dates are YYYY-MM-DD; timestamps are UTC ISO 8601.

additive Fields get added, never repurposed or silently dropped. A breaking change gets a new version prefix.

404 A date or identifier that was never measured returns 404 with an error string — never an empty record that a parser might read as “measured, and it was nothing”.

No interpolation, anywhereOther benchmark publishers interpolate between measured points to offer a value at any operating point you like. We do not, and the history endpoint says so in its own payload. There is no value between two daily runs — if you resample this series as though it were continuous, the numbers you get back are yours, not ours. This is a deliberate limit: the product is that every published figure traces to a run, and an interpolated figure traces to arithmetic instead.
Take the data

Or skip the API entirely.

The underlying result files are committed to the public repository — the API is a convenience over them, not a gate in front of them.