---
id: config-issue-digital-wallet-open-id-organisation-wallet-unit-credential
title: "Issue organisation wallet unit attestations"
description: "Fills the Wallet Unit Attestation (WUA) pool of an organisation wallet unit at once. An organisation wallet presents each WUA of its pool to one issuer only, each bound to a holder key of its own; the pool has `wiaPoolSize` WUAs (see [Read organisation wallet unit configuration](/docs/openid4vc-api/config-read-digital-wallet-open-id-organisation-wallet-unit-global-configuration)). The wallet provider signs a new pool, makes one row in the wallet unit attestation issuance history, and gives the WUAs to the holder organisation. A new pool also marks the wallet unit authorised and `active`."
sidebar_label: "Issue organisation wallet unit attestations"
hide_title: true
hide_table_of_contents: true
api: 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
sidebar_class_name: "post 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"}>Issue organisation wallet unit attestations</h1>

<MethodEndpoint method={"post"} path={"/v4/config/ows/wallet-provider/organisation-wallet-units/{walletUnitId}/attestations"}></MethodEndpoint>



Fills the Wallet Unit Attestation (WUA) pool of an organisation wallet unit at once. An organisation wallet presents each WUA of its pool to one issuer only, each bound to a holder key of its own; the pool has `wiaPoolSize` WUAs (see [Read organisation wallet unit configuration](/docs/openid4vc-api/config-read-digital-wallet-open-id-organisation-wallet-unit-global-configuration)). The wallet provider signs a new pool, makes one row in the wallet unit attestation issuance history, and gives the WUAs to the holder organisation. A new pool also marks the wallet unit authorised and `active`.

When the pool still holds enough usable WUAs, nothing changes. The wallet provider also fills the pools of the authorised wallet units on a schedule, so you need this operation for a new or a revoked wallet unit, or to fill a pool at once. The request has no body.

## 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={"201"} value={"201"}><div>

The pool is filled, or it did not need a refill. 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, the holder organisation of the wallet unit is unknown or has no holder identity key, or the wallet provider cannot sign: no configuration, no signing key, or a key that is not an EC P-256 key of the format `x509` with a valid certificate chain in a usable key store.

</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 organisation wallet unit of the wallet provider has this id (also for the id of an individual 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>
      