Properties
| Name | Type | Description |
|---|---|---|
| id | string | |
| status | string | |
| result | object | Null until status is completed. Stays null when status is failed, which means no answer was obtained. |
| reference | stringnull | Your correlation id from create, echoed back |
| mode | object | |
| failedAttempts | integer | How many presentations failed verification, or wallet error responses arrived, while the check stayed pending, on either transport. Neither ends the check, so a pending or expired check with a count a |
| lastFailureCodes | arraynull | The error codes of the most recent failed attempt, such as `issuer_untrusted` or `signature_invalid`. A code beginning `wallet_` is the wallet's own error response, for example `wallet_access_denied` |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://artifacts.apis.io/tessio-eu/json-schema/tessio-eu-age-check-schema.json",
"title": "AgeCheck",
"x-generated": "2026-10-31",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/tessio-eu-openapi.json#/components/schemas/AgeCheck",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"status": {
"type": "string",
"enum": [
"pending",
"completed",
"expired",
"failed"
]
},
"result": {
"description": "Null until status is completed. Stays null when status is failed, which means no answer was obtained.",
"oneOf": [
{
"type": "null"
},
{
"$ref": "#/$defs/AgeCheckResult"
}
]
},
"reference": {
"type": [
"string",
"null"
],
"description": "Your correlation id from create, echoed back"
},
"mode": {
"$ref": "#/$defs/Mode"
},
"failedAttempts": {
"type": "integer",
"description": "How many presentations failed verification, or wallet error responses arrived, while the check stayed pending, on either transport. Neither ends the check, so a pending or expired check with a count above zero means a response was posted and refused, or a wallet said it could not answer. It counts every refused response for the check, not only the holder's, so read it as a signal rather than as the person's own attempts.\n"
},
"lastFailureCodes": {
"type": [
"array",
"null"
],
"items": {
"type": "string"
},
"description": "The error codes of the most recent failed attempt, such as `issuer_untrusted` or `signature_invalid`. A code beginning `wallet_` is the wallet's own error response, for example `wallet_access_denied` when the holder declined, the wallet held no matching credential or it could not authenticate the holder (OpenID4VP 1.0 section 8.5 gives one code for all three): it is the wallet's claim and nothing was verified. `session_mismatch` is a same device presentation whose redirect came back to a different browser from the one that opened the wallet, rejected under HAIP 1.0 section 5.1. Null when there has been none. Kept after the check completes.\n"
}
},
"$defs": {
"AgeCheckResult": {
"type": "object",
"properties": {
"minAge": {
"type": "integer"
},
"meetsMinAge": {
"type": "boolean",
"description": "True if the user proved they meet the age threshold"
},
"method": {
"type": "string",
"enum": [
"demo",
"simulated",
"eudiw",
"av"
],
"description": "What answered the check. 'demo' is a sandbox completion and 'simulated' is the public demo's explicit simulate call, neither of which involves a wallet. 'eudiw' and 'av' name the profile a real wallet presented under."
},
"transport": {
"type": [
"string",
"null"
],
"enum": [
"openid4vp",
"dcapi",
null
],
"description": "How a real wallet's answer travelled: `openid4vp` for the deeplink flow, `dcapi` for the W3C Digital Credentials API. Null when no wallet was involved, so a sandbox completion stays distinguishable on this field too.\n"
}
}
},
"Mode": {
"type": "string",
"enum": [
"test",
"live"
],
"description": "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`.\n"
}
}
}
Work with this as data
Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/tessio-eu-age-check"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.