List an experiment's results
The stored verdict: one row per arm per slice. IT SERVES THE LAST COMPUTED SNAPSHOT AND RECOMPUTES NOTHING, so computed_at is the whole measure of how current the answer is and the merchant’s dashboard is what refreshes it. Recomputing would be a write, and this family holds no write grant. DECIDE ON always_valid_p_value, not on p_value. The second is only honest at a pre-declared sample size, and a client polling this endpoint is monitoring continuously by definition. All three statistics are null on the control arm, which carries no test result by construction; reading a null as zero calls a winner on the baseline. CHECK srm_ok FIRST. False means the arms did not receive the traffic they were allocated, which invalidates every other number in the row. It is computed within the slice, and per-slice SRM is noisy on thin cells, so treat a false on a country row as a reason to distrust that row rather than the test. revenue_minor, profit_minor, ppv_minor and aov_minor are MINOR UNITS WITH NO CURRENCY: the rollup does not group by currency, so on a multi-currency store they sum more than one. That is valid for COMPARING arms, which are randomly assigned and therefore carry the same currency mix, and it is not a money value. Do not render either as a price. An unknown experiment id is a 404 rather than an empty page, so a typo can never be read as “this test produced nothing”. An experiment that has never been analysed answers an empty page, which is a real state.
Authorizations
A secret API key. Publishable keys cannot reach this API. A key may carry an expiry, and an expired key is refused exactly like an unknown one, with a 401 that names no reason; check the key's expires_at in the dashboard rather than inferring it from a response. When a merchant rolls a key's secret they choose a grace window of up to 3 days, and for its duration BOTH the new secret and the one it replaced authenticate, so an integration moves over on its own deploy schedule instead of at the instant the button is pressed. Move before the window closes: after it, the old secret is refused. Nothing else about this contract moves with a roll. The key keeps its id and its scopes, so the only thing an integration updates is the credential itself.
Path Parameters
Query Parameters
One slice of the verdict. overall is the whole experiment, device:mobile, device:desktop and device:tablet are the device classes, and country:XX is an ISO alpha-2 country. Omit it for every row, in which case the overall rows sort first. Anything outside this vocabulary is a 400 rather than an empty page, so a typo is never read as "this slice has no data".
Rows per page. Out of range is a 400 rather than a silent clamp, so a client asking for more than 100 learns it did not get it.
1 <= x <= 100The next_cursor from the previous page. Opaque: decode nothing from it and construct nothing by hand, since its encoding is not part of this contract. Omit it to read the first page.
