---
title: "List the project's age checks"
method: GET
path: "/v1/age-checks"
tags: ["Age Verification"]
---

# List the project's age checks

`GET /v1/age-checks`

## Request

- Base URL: `https://api.tessio.eu`
- URL: `https://api.tessio.eu/v1/age-checks`
- Auth: HTTP bearer

Newest first, keyset paginated, with optional status, method and billable filters. No request url, and no name, date of birth, document or photo from the credential. Several filters narrow to their intersection.

The cursor is a position in one fixed order that every filter shares, so paging on from a check the filter excludes is well defined and continues from where that check sits.

## Query parameters

- `limit` integer
- `startingAfter` string, uuid
- `status` 'pending' | 'completed' | 'expired' | 'failed'
- `method` 'eudiw' | 'av' | 'demo' | 'simulated'
- `billable` boolean

## Response `200`

OK

- AgeCheckList
  - `data` AgeCheckSummary[]
    - `id` string, uuid
    - `status` 'pending' | 'completed' | 'expired' | 'failed'
    - `minAge` integer
    - `meetsMinAge` boolean, nullable
    - `method` string, nullable
    - `transport` 'openid4vp' | 'dcapi' | 'null', nullable: How a real wallet's answer travelled, as on `AgeCheckResult`. Null when no wallet was involved, and also null while the check is still pending.
    - `reference` string, nullable: Your correlation id from create, echoed back
    - `createdAt` string, date-time
    - `mode` 'test' | 'live': The mode of the project that created this check, fixed when the project was created. `test` is a sandbox: the check completes on its own after a couple of seconds and its result is simulated, so `meetsMinAge` proves nothing about anyone. `live` means only a wallet presentation completes the check. Read this before acting on `meetsMinAge`.
    - `billable` boolean: Whether this check is on an invoice. NOT derivable from `status`: a failed check may be a presentation that did not verify, which is free, or one that verified without a readable claim, which bills.
    - `failedAttempts` integer: Presentations refused while the check stayed pending. It tells apart an expired check someone tried to answer from one nobody opened.
  - `hasMore` boolean: More rows exist; page with ?startingAfter=<last id>.

## Other responses

- `400`: invalid_status / invalid_method
- `401`: Missing / invalid / revoked key
- `403`: insufficient_scope. The key is valid but may only read stats (`stats:read`), so it cannot call this route. Use a project's key with scope `full`.

---

[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)
