---
title: "Outcomes, rates and time to result for a period, beside the period before it"
method: GET
path: "/v1/stats/summary"
tags: ["Stats"]
---

# Outcomes, rates and time to result for a period, beside the period before it

`GET /v1/stats/summary`

## Request

- Base URL: `https://api.tessio.eu`
- URL: `https://api.tessio.eu/v1/stats/summary`
- Auth: HTTP bearer

Exactly the days asked for, and the period of equal length just before them, so a client can show a change without a second request. Rates are over the checks that ended (passed, under age, failed, expired), so a check still pending moves no rate; each is null when nothing ended. `p50Seconds` and `p95Seconds` run from creation to completion, over completed checks only. `retention` says from which day the plan keeps every check. Under a project's key, over its project; under an organisation's key, over every project in it, or one with `project_id`. UTC days. Any key may call it, of either scope; each key spends its own budget.

## Query parameters

- `from` string, date
- `to` string, date
- `mode` 'all' | 'live' | 'test'
- `project_id` string, uuid

## Response `200`

OK

- AgeCheckStatsSummary
  - `mode` 'all' | 'live' | 'test'
  - `current` StatsPeriod
    - `from` string, date: First UTC day, inclusive.
    - `to` string, date: Last UTC day, inclusive.
    - `outcomes` StatsOutcomes: Checks created in the period, by where they are now. `passed`, `underAge`, `failed`, `expired` and `pending` add up to `total`; `noAnswer` is a part of `expired`, not a sixth state.
      - `total` integer
      - `passed` integer: Completed and old enough.
      - `underAge` integer: Completed and not old enough.
      - `failed` integer: A presentation verified but carried no readable answer about age.
      - `expired` integer: Ran out of time: no wallet answered, or every answer was refused or never redeemed.
      - `pending` integer
      - `noAnswer` integer: Of `expired`, those no wallet answered at all: no refused attempt and no presentation held for the browser. A held presentation is read from the check's timeline, which the plan keeps for less time than the check (`retention.eventsFrom`), so before that day such a check is counted here.
    - `passRate` number, nullable: passed / ended, 0 to 1, where ended is total minus pending. Null when nothing ended.
    - `failRate` number, nullable: (underAge + failed) / ended.
    - `noAnswerRate` number, nullable: noAnswer / ended.
    - `p50Seconds` number, nullable: Median seconds from creation to completion, over completed checks. For a same device check this includes the browser's return, because a check completes when the browser redeems the answer.
    - `p95Seconds` number, nullable: The 95th percentile of the same.
  - `previous` StatsPeriod
    - `from` string, date: First UTC day, inclusive.
    - `to` string, date: Last UTC day, inclusive.
    - `outcomes` StatsOutcomes: Checks created in the period, by where they are now. `passed`, `underAge`, `failed`, `expired` and `pending` add up to `total`; `noAnswer` is a part of `expired`, not a sixth state.
      - `total` integer
      - `passed` integer: Completed and old enough.
      - `underAge` integer: Completed and not old enough.
      - `failed` integer: A presentation verified but carried no readable answer about age.
      - `expired` integer: Ran out of time: no wallet answered, or every answer was refused or never redeemed.
      - `pending` integer
      - `noAnswer` integer: Of `expired`, those no wallet answered at all: no refused attempt and no presentation held for the browser. A held presentation is read from the check's timeline, which the plan keeps for less time than the check (`retention.eventsFrom`), so before that day such a check is counted here.
    - `passRate` number, nullable: passed / ended, 0 to 1, where ended is total minus pending. Null when nothing ended.
    - `failRate` number, nullable: (underAge + failed) / ended.
    - `noAnswerRate` number, nullable: noAnswer / ended.
    - `p50Seconds` number, nullable: Median seconds from creation to completion, over completed checks. For a same device check this includes the browser's return, because a check completes when the browser redeems the answer.
    - `p95Seconds` number, nullable: The 95th percentile of the same.
  - `retention` StatsRetention: The first UTC day the purge has left whole, from what it recorded it may have deleted: after an upgrade the longer plan does not bring back days the shorter one already took. It may understate, never overstate: a day it calls whole is. A range that starts earlier counts only what is still held, so read the older days as partial, not as "no checks". Null where no purge has run for the org, so nothing was deleted.
    - `recordsFrom` string, date, nullable: For the checks: every read.
    - `eventsFrom` string, date, nullable: For what is read from each check's timeline: failures, the funnel's step for a fetched request under `eudiw`, held presentations (part of the funnel's `responseReceived`) and `noAnswer`, which leaves out a check whose presentation was held.

## Other responses

- `400`: The range is refused as for every chart (invalid_from, invalid_to, range_inverted, range_too_old, range_too_long), or invalid_mode, invalid_metric, invalid_group_by or invalid_project_id. Checked before the plan, so a malformed request is never answered with an upgrade.
- `401`: No key, or one that is unknown or revoked
- `403`: plan_feature_unavailable. The org's plan does not include this read. Every plan reads the summary, Starter adds the time series, Growth and above read all five.
- `429`: rate_limited: this key's budget is spent.

---

[API](https://skmtc.dev/tessio/apis/tessio-cloud-api.md) · [All operations](https://skmtc.dev/tessio/apis/tessio-cloud-api/llms.txt) · [OpenAPI document](https://skmtc.dev/tessio/apis/tessio-cloud-api/revisions/536b3f4769fb?raw)
