---
id: config-delete-digital-wallet-open-id-individual-wallet-unit
title: "Delete individual wallet unit"
description: "Deletes an individual wallet unit. In one change, the wallet provider removes its authorisation, revokes (`Revoked`) its Wallet Unit Attestations on their status lists, and deletes it. There is no undo: the wallet unit leaves the list, a read gives 404, and its client id cannot register again."
sidebar_label: "Delete individual wallet unit"
hide_title: true
hide_table_of_contents: true
api: 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
sidebar_class_name: "delete 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"}>Delete individual wallet unit</h1>

<MethodEndpoint method={"delete"} path={"/v4/config/ows/wallet-provider/individual-wallet-units/{walletUnitId}"}></MethodEndpoint>



Deletes an individual wallet unit. In one change, the wallet provider removes its authorisation, revokes (`Revoked`) its Wallet Unit Attestations on their status lists, and deletes it. There is no undo: the wallet unit leaves the list, a read gives 404, and its client id cannot register again.

Its rows in the wallet unit attestation issuance history stay, with `revocationStatus` `Revoked`. Its key attestations do not change: revoke them first with [Update individual wallet unit key attestation revocation status](/docs/openid4vc-api/config-update-digital-wallet-open-id-individual-wallet-unit-key-attestation-revocation-status) when they must stop too.

## Request

<details style={{"marginBottom":"1rem"}} className={"openapi-markdown__details"} data-collapsed={false} open={true}><summary style={{}}><h3 className={"openapi-markdown__details-summary-header-params"}>Path Parameters</h3></summary><div><ul><ParamsItem className={"paramsItem"} param={{"description":"The `id` of the wallet unit, from the list of the wallet units of its kind. The routes of each kind read only their kind: the `id` of an organisation wallet unit gives 404 on an individual wallet unit route, and the other way round. A deleted wallet unit also gives 404.","in":"path","name":"walletUnitId","required":true,"schema":{"type":"string","format":"uuid"}}}></ParamsItem></ul></div></details><div><div><ApiTabs label={undefined} id={undefined}><TabItem label={"200"} value={"200"}><div>

The wallet unit is revoked and deleted. No body.

</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></div></TabItem><TabItem label={"400"} value={"400"}><div>

The organisation is not the wallet provider (also without a deployment), or a status list refused the revocation.

</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={"404"} value={"404"}><div>

No individual wallet unit of the wallet provider has this id (also for the id of an organisation wallet unit or of a deleted wallet unit).

</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={"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>
      