---
id: config-read-digital-wallet-open-id-individual-wallet-unit-statistics
title: "Read individual wallet unit statistics"
description: "Returns the counts of the individual wallet units of the wallet provider: all, `active`, `revoked`, and the units on each device platform. The counts are current at the read. For the list of the wallet units, use [List individual wallet units](/docs/openid4vc-api/config-list-digital-wallet-open-id-individual-wallet-unit)."
sidebar_label: "Read individual wallet unit statistics"
hide_title: true
hide_table_of_contents: true
api: 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
sidebar_class_name: "get api-method"
info_path: docs/openid4vc-api/igrant-io-api-documentation
custom_edit_url: null
---

> **Build this with an AI coding agent.** Install the iGrant.io Agent Skills, then ask your agent to build the integration:
>
> ```bash
> npx skills add L3-iGrant/skills
> ```


import ApiTabs from "@theme/ApiTabs";
import DiscriminatorTabs from "@theme/DiscriminatorTabs";
import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes";
import MimeTabs from "@theme/MimeTabs";
import ParamsItem from "@theme/ParamsItem";
import ResponseSamples from "@theme/ResponseSamples";
import SchemaItem from "@theme/SchemaItem";
import SchemaTabs from "@theme/SchemaTabs";
import Markdown from "@theme/Markdown";
import OperationTabs from "@theme/OperationTabs";
import TabItem from "@theme/TabItem";

<h1 className={"openapi__heading"}>Read individual wallet unit statistics</h1>

<MethodEndpoint method={"get"} path={"/v4/config/ows/wallet-provider/individual-wallet-unit-statistics"}></MethodEndpoint>



Returns the counts of the individual wallet units of the wallet provider: all, `active`, `revoked`, and the units on each device platform. The counts are current at the read. For the list of the wallet units, use [List individual wallet units](/docs/openid4vc-api/config-list-digital-wallet-open-id-individual-wallet-unit).

<div><div><ApiTabs label={undefined} id={undefined}><TabItem label={"200"} value={"200"}><div>

The counts of the individual wallet units.

</div><details style={{"textAlign":"left","marginBottom":"1rem"}} className={"openapi-markdown__details"} data-collaposed={true} open={false}><summary style={{}}><strong>Response Headers</strong></summary><ul style={{"marginLeft":"1rem"}}></ul></details><div><MimeTabs className={"openapi-tabs__mime"} schemaType={"response"}><TabItem label={"application/json"} value={"application/json"}><SchemaTabs className={"openapi-tabs__schema"}><TabItem label={"Schema"} value={"Schema"}><details style={{}} className={"openapi-markdown__details response"} data-collapsed={false} open={true}><summary style={{}} className={"openapi-markdown__details-summary-response"}><strong>Schema</strong></summary><div style={{"textAlign":"left","marginLeft":"1rem"}}></div><ul style={{"marginLeft":"1rem"}}><SchemaItem collapsible={true} className={"schemaItem"}><details style={{}} className={"openapi-markdown__details"}><summary style={{}}><span className={"openapi-schema__container"}><strong className={"openapi-schema__property"}>individualWalletUnitStatistics</strong><span className={"openapi-schema__name"}> object</span></span></summary><div style={{"marginLeft":"1rem"}}><div style={{"marginTop":".5rem","marginBottom":".5rem"}}>

The counts of the individual wallet units of the wallet provider, current at the read. A deleted wallet unit is not counted. `active` and `revoked` count the `attestationStatus` of the wallet units, so a wallet unit that has no Wallet Unit Attestation yet is in neither, and `total` can be more than `active` plus `revoked`.

</div><SchemaItem collapsible={false} name={"total"} required={true} schemaName={"integer"} qualifierMessage={undefined} schema={{"type":"integer","example":120,"description":"The individual wallet units."}}></SchemaItem><SchemaItem collapsible={false} name={"active"} required={true} schemaName={"integer"} qualifierMessage={undefined} schema={{"type":"integer","example":110,"description":"The wallet units whose `attestationStatus` is `active`. An `active` wallet unit can hold only expired WUAs."}}></SchemaItem><SchemaItem collapsible={false} name={"revoked"} required={true} schemaName={"integer"} qualifierMessage={undefined} schema={{"type":"integer","example":6,"description":"The wallet units whose `attestationStatus` is `revoked`."}}></SchemaItem><SchemaItem collapsible={false} name={"ios"} required={true} schemaName={"integer"} qualifierMessage={undefined} schema={{"type":"integer","example":52,"description":"The wallet units on iOS."}}></SchemaItem><SchemaItem collapsible={false} name={"android"} required={true} schemaName={"integer"} qualifierMessage={undefined} schema={{"type":"integer","example":68,"description":"The wallet units on Android."}}></SchemaItem></div></details></SchemaItem></ul></details></TabItem><TabItem label={"Example (from schema)"} value={"Example (from schema)"}><ResponseSamples responseExample={"{\n  \"individualWalletUnitStatistics\": {\n    \"total\": 120,\n    \"active\": 110,\n    \"revoked\": 6,\n    \"ios\": 52,\n    \"android\": 68\n  }\n}"} language={"json"}></ResponseSamples></TabItem><TabItem label={"Example"} value={"Example"}><ResponseSamples responseExample={"{\n  \"individualWalletUnitStatistics\": {\n    \"total\": 14,\n    \"active\": 9,\n    \"revoked\": 2,\n    \"ios\": 1,\n    \"android\": 13\n  }\n}"} language={"json"}></ResponseSamples></TabItem></SchemaTabs></TabItem></MimeTabs></div></TabItem><TabItem label={"400"} value={"400"}><div>

The organisation is not the wallet provider (also without a deployment).

</div><details style={{"textAlign":"left","marginBottom":"1rem"}} className={"openapi-markdown__details"} data-collaposed={true} open={false}><summary style={{}}><strong>Response Headers</strong></summary><ul style={{"marginLeft":"1rem"}}></ul></details><div><MimeTabs className={"openapi-tabs__mime"} schemaType={"response"}><TabItem label={"application/json"} value={"application/json"}><SchemaTabs className={"openapi-tabs__schema"}><TabItem label={"Schema"} value={"Schema"}><details style={{}} className={"openapi-markdown__details response"} data-collapsed={false} open={true}><summary style={{}} className={"openapi-markdown__details-summary-response"}><strong>Schema</strong></summary><div style={{"textAlign":"left","marginLeft":"1rem"}}></div><ul style={{"marginLeft":"1rem"}}><SchemaItem collapsible={false} name={"errorCode"} required={true} schemaName={"integer"} qualifierMessage={undefined} schema={{"type":"integer","example":400}}></SchemaItem><SchemaItem collapsible={false} name={"errorDescription"} required={true} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","example":"Bad input parameter"}}></SchemaItem><SchemaItem collapsible={false} name={"errorKey"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"A text code of the refusal that does not change when the text changes. Only some refusals have it, for example `organisation_suspended`, `feature_disabled` or `purpose_exists`."}}></SchemaItem></ul></details></TabItem><TabItem label={"Example (from schema)"} value={"Example (from schema)"}><ResponseSamples responseExample={"{\n  \"errorCode\": 400,\n  \"errorDescription\": \"Bad input parameter\",\n  \"errorKey\": \"string\"\n}"} language={"json"}></ResponseSamples></TabItem></SchemaTabs></TabItem></MimeTabs></div></TabItem><TabItem label={"401"} value={"401"}><div>

The `Authorization` header is missing, or the API key or token is not valid.

</div><details style={{"textAlign":"left","marginBottom":"1rem"}} className={"openapi-markdown__details"} data-collaposed={true} open={false}><summary style={{}}><strong>Response Headers</strong></summary><ul style={{"marginLeft":"1rem"}}></ul></details><div><MimeTabs className={"openapi-tabs__mime"} schemaType={"response"}><TabItem label={"application/json"} value={"application/json"}><SchemaTabs className={"openapi-tabs__schema"}><TabItem label={"Schema"} value={"Schema"}><details style={{}} className={"openapi-markdown__details response"} data-collapsed={false} open={true}><summary style={{}} className={"openapi-markdown__details-summary-response"}><strong>Schema</strong></summary><div style={{"textAlign":"left","marginLeft":"1rem"}}></div><ul style={{"marginLeft":"1rem"}}><SchemaItem collapsible={false} name={"errorCode"} required={true} schemaName={"integer"} qualifierMessage={undefined} schema={{"type":"integer","example":400}}></SchemaItem><SchemaItem collapsible={false} name={"errorDescription"} required={true} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","example":"Bad input parameter"}}></SchemaItem><SchemaItem collapsible={false} name={"errorKey"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"A text code of the refusal that does not change when the text changes. Only some refusals have it, for example `organisation_suspended`, `feature_disabled` or `purpose_exists`."}}></SchemaItem></ul></details></TabItem><TabItem label={"Example (from schema)"} value={"Example (from schema)"}><ResponseSamples responseExample={"{\n  \"errorCode\": 400,\n  \"errorDescription\": \"Bad input parameter\",\n  \"errorKey\": \"string\"\n}"} language={"json"}></ResponseSamples></TabItem></SchemaTabs></TabItem></MimeTabs></div></TabItem><TabItem label={"403"} value={"403"}><div>

The API key or token does not allow this call. An API key without the scope of the operation gets the older body `{"Code", "Message"}`. An `X-SandboxOrgId` header that names another sandbox organisation than the one of the API key gets `{"errorCode", "errorDescription"}`. When a platform admin has turned off the feature of the operation for the organisation, the answer has `errorKey` `feature_disabled` and the member `feature` (the name of the feature).

</div><details style={{"textAlign":"left","marginBottom":"1rem"}} className={"openapi-markdown__details"} data-collaposed={true} open={false}><summary style={{}}><strong>Response Headers</strong></summary><ul style={{"marginLeft":"1rem"}}></ul></details><div><MimeTabs className={"openapi-tabs__mime"} schemaType={"response"}><TabItem label={"application/json"} value={"application/json"}><SchemaTabs className={"openapi-tabs__schema"}><TabItem label={"Schema"} value={"Schema"}><details style={{}} className={"openapi-markdown__details response"} data-collapsed={false} open={true}><summary style={{}} className={"openapi-markdown__details-summary-response"}><strong>Schema</strong></summary><div style={{"textAlign":"left","marginLeft":"1rem"}}></div><ul style={{"marginLeft":"1rem"}}><div><span className={"badge badge--info"}>anyOf</span><SchemaTabs><TabItem label={"MOD1"} value={"0-item-properties"}><SchemaItem collapsible={false} name={"errorCode"} required={true} schemaName={"integer"} qualifierMessage={undefined} schema={{"type":"integer","example":400}}></SchemaItem><SchemaItem collapsible={false} name={"errorDescription"} required={true} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","example":"Bad input parameter"}}></SchemaItem><SchemaItem collapsible={false} name={"errorKey"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"A text code of the refusal that does not change when the text changes. Only some refusals have it, for example `organisation_suspended`, `feature_disabled` or `purpose_exists`."}}></SchemaItem></TabItem><TabItem label={"Older error body"} value={"1-item-properties"}><SchemaItem collapsible={false} name={"Code"} required={true} schemaName={"integer"} qualifierMessage={undefined} schema={{"type":"integer","description":"The HTTP status.","example":403}}></SchemaItem><SchemaItem collapsible={false} name={"Message"} required={true} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"What went wrong.","example":"Unauthorized access;User doesn't have enough permissions;"}}></SchemaItem></TabItem></SchemaTabs></div></ul></details></TabItem><TabItem label={"Example (from schema)"} value={"Example (from schema)"}><ResponseSamples responseExample={"{}"} language={"json"}></ResponseSamples></TabItem><TabItem label={"Example"} value={"Example"}><ResponseSamples responseExample={"{\n  \"Code\": 403,\n  \"Message\": \"Unauthorized access;User doesn't have enough permissions;\"\n}"} language={"json"}></ResponseSamples></TabItem></SchemaTabs></TabItem></MimeTabs></div></TabItem><TabItem label={"500"} value={"500"}><div>

Unexpected server error.

</div><details style={{"textAlign":"left","marginBottom":"1rem"}} className={"openapi-markdown__details"} data-collaposed={true} open={false}><summary style={{}}><strong>Response Headers</strong></summary><ul style={{"marginLeft":"1rem"}}></ul></details><div><MimeTabs className={"openapi-tabs__mime"} schemaType={"response"}><TabItem label={"application/json"} value={"application/json"}><SchemaTabs className={"openapi-tabs__schema"}><TabItem label={"Schema"} value={"Schema"}><details style={{}} className={"openapi-markdown__details response"} data-collapsed={false} open={true}><summary style={{}} className={"openapi-markdown__details-summary-response"}><strong>Schema</strong></summary><div style={{"textAlign":"left","marginLeft":"1rem"}}></div><ul style={{"marginLeft":"1rem"}}><SchemaItem collapsible={false} name={"errorCode"} required={true} schemaName={"integer"} qualifierMessage={undefined} schema={{"type":"integer","example":400}}></SchemaItem><SchemaItem collapsible={false} name={"errorDescription"} required={true} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","example":"Bad input parameter"}}></SchemaItem><SchemaItem collapsible={false} name={"errorKey"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"A text code of the refusal that does not change when the text changes. Only some refusals have it, for example `organisation_suspended`, `feature_disabled` or `purpose_exists`."}}></SchemaItem></ul></details></TabItem><TabItem label={"Example (from schema)"} value={"Example (from schema)"}><ResponseSamples responseExample={"{\n  \"errorCode\": 400,\n  \"errorDescription\": \"Bad input parameter\",\n  \"errorKey\": \"string\"\n}"} language={"json"}></ResponseSamples></TabItem></SchemaTabs></TabItem></MimeTabs></div></TabItem></ApiTabs></div></div>
      