---
id: config-create-digital-wallet-open-id-individual-wallet-unit
title: "Create individual wallet unit"
description: "Registers an individual wallet unit in advance: the wallet of a natural person in a mobile app on one device. A mobile wallet that is not registered registers itself, authorised, at its first Wallet Unit Attestation (WUA) request, so this operation is optional. Use it to register a wallet unit before that request, or with `isAuthorised: false` to hold its WUA requests until you authorise it with [Update individual wallet unit](/docs/openid4vc-api/config-update-digital-wallet-open-id-individual-wallet-unit)."
sidebar_label: "Create individual wallet unit"
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"}>Create individual wallet unit</h1>

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



Registers an individual wallet unit in advance: the wallet of a natural person in a mobile app on one device. A mobile wallet that is not registered registers itself, authorised, at its first Wallet Unit Attestation (WUA) request, so this operation is optional. Use it to register a wallet unit before that request, or with `isAuthorised: false` to hold its WUA requests until you authorise it with [Update individual wallet unit](/docs/openid4vc-api/config-update-digital-wallet-open-id-individual-wallet-unit).

The client id is unique for the wallet provider over both kinds of wallet unit and stays taken after a delete. No operation makes an organisation wallet unit.

## Request

<MimeTabs className={"openapi-tabs__mime"}><TabItem label={"application/json"} value={"application/json-schema"}><details style={{}} className={"openapi-markdown__details mime"} data-collapsed={false} open={true}><summary style={{}} className={"openapi-markdown__details-summary-mime"}><h3 className={"openapi-markdown__details-summary-header-body"}>Body</h3><strong className={"openapi-schema__required"}>required</strong></summary><div style={{"textAlign":"left","marginLeft":"1rem"}}><div style={{"marginTop":"1rem","marginBottom":"1rem"}}>

The new individual wallet unit.

</div></div><ul style={{"marginLeft":"1rem"}}><SchemaItem collapsible={false} name={"clientId"} required={true} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"Required. The client id of the wallet unit, usually its DID: the `sub` of its Wallet Unit Attestations. It must be new for the wallet provider: no wallet unit of either kind, also a deleted one, may have it."}}></SchemaItem><SchemaItem collapsible={false} name={"clientUrl"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"Optional. The credential offer URL of the wallet. A wallet unit replaces it with the `credential_offer_url` of its next WUA request."}}></SchemaItem><SchemaItem collapsible={true} className={"schemaItem"}><details style={{}} className={"openapi-markdown__details"}><summary style={{}}><span className={"openapi-schema__container"}><strong className={"openapi-schema__property"}>clientPublicKey</strong><span className={"openapi-schema__name"}> object</span><span className={"openapi-schema__divider"}></span><span className={"openapi-schema__required"}>required</span></span></summary><div style={{"marginLeft":"1rem"}}><div style={{"marginTop":".5rem","marginBottom":".5rem"}}>

Required. The public key of the wallet unit as a JWK: an EC key on P-256, P-384 or P-521 with `kty`, `crv`, `x` and `y`, and no private member. A single WUA request of the wallet replaces it with the key of its client assertion (`cnf`).

</div><SchemaItem name={"property name*"} required={false} schemaName={"any"} qualifierMessage={undefined} schema={{"type":"object","additionalProperties":true,"description":"Required. The public key of the wallet unit as a JWK: an EC key on P-256, P-384 or P-521 with `kty`, `crv`, `x` and `y`, and no private member. A single WUA request of the wallet replaces it with the key of its client assertion (`cnf`)."}} collapsible={false} discriminator={false}></SchemaItem></div></details></SchemaItem><SchemaItem collapsible={false} name={"isAuthorised"} required={false} schemaName={"boolean"} qualifierMessage={undefined} schema={{"type":"boolean","default":false,"description":"`true` authorises the wallet unit at once, so that it can get Wallet Unit Attestations. Default `false`: authorise it later with [Update individual wallet unit](/docs/openid4vc-api/config-update-digital-wallet-open-id-individual-wallet-unit)."}}></SchemaItem><SchemaItem collapsible={false} name={"devicePlatform"} required={true} schemaName={"string"} qualifierMessage={"**Possible values:** [`ios`, `android`]"} schema={{"type":"string","description":"Required. The device platform of the wallet unit. The wallet provider refuses a WUA request of the wallet unit from another platform.","enum":["ios","android"],"example":"android"}}></SchemaItem></ul></details></TabItem></MimeTabs><div><div><ApiTabs label={undefined} id={undefined}><TabItem label={"201"} value={"201"}><div>

The new individual wallet unit. Its device members and `assertionToken` stay empty until its first WUA request.

</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"}>individualWalletUnit</strong><span className={"openapi-schema__name"}> object</span></span></summary><div style={{"marginLeft":"1rem"}}><div style={{"marginTop":".5rem","marginBottom":".5rem"}}>

An individual wallet unit: the wallet of a natural person in a mobile app on one iOS or Android device. The service always sends every member; a member without a value is an empty string, `0`, `false` or `null`.

</div><SchemaItem collapsible={false} name={"id"} required={true} schemaName={"uuid"} qualifierMessage={undefined} schema={{"type":"string","format":"uuid","description":"The id of the wallet unit: the `walletUnitId` of the individual wallet unit operations and of the history filter."}}></SchemaItem><SchemaItem collapsible={false} name={"clientId"} required={true} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"The client id of the wallet unit, usually its DID: the `sub` of its Wallet Unit Attestations. It is unique for the wallet provider."}}></SchemaItem><SchemaItem collapsible={false} name={"clientUrl"} required={true} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"The credential offer URL of the wallet, from its last WUA request (`credential_offer_url`) or from the registration. Empty when the wallet sent none."}}></SchemaItem><SchemaItem collapsible={true} className={"schemaItem"}><details style={{}} className={"openapi-markdown__details"}><summary style={{}}><span className={"openapi-schema__container"}><strong className={"openapi-schema__property"}>clientPublicKey</strong><span className={"openapi-schema__name"}> object</span><span className={"openapi-schema__divider"}></span><span className={"openapi-schema__nullable"}>nullable</span><span className={"openapi-schema__required"}>required</span></span></summary><div style={{"marginLeft":"1rem"}}><div style={{"marginTop":".5rem","marginBottom":".5rem"}}>

The public key (JWK) of the wallet unit: from the registration, then the key of the client assertion of its last single WUA request.

</div><SchemaItem name={"property name*"} required={false} schemaName={"any"} qualifierMessage={undefined} schema={{"type":"object","nullable":true,"description":"The public key (JWK) of the wallet unit: from the registration, then the key of the client assertion of its last single WUA request.","additionalProperties":true}} collapsible={false} discriminator={false}></SchemaItem></div></details></SchemaItem><SchemaItem collapsible={false} name={"isAuthorised"} required={true} schemaName={"boolean"} qualifierMessage={undefined} schema={{"type":"boolean","description":"`true`: the wallet unit can get Wallet Unit Attestations. `false`: the wallet provider refuses its WUA requests."}}></SchemaItem><SchemaItem collapsible={false} name={"devicePlatform"} required={true} schemaName={"string"} qualifierMessage={"**Possible values:** [`ios`, `android`]"} schema={{"type":"string","description":"The device platform of the wallet unit. The wallet provider refuses a WUA request from another platform.","enum":["ios","android"],"example":"ios"}}></SchemaItem><SchemaItem collapsible={false} name={"deviceIntegrityToken"} required={true} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"The device integrity token of the last WUA request (header `X-Wallet-Unit-Integrity-Token`): Play Integrity on Android, App Attest on iOS. Empty before the first request."}}></SchemaItem><SchemaItem collapsible={false} name={"deviceKeyId"} required={true} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"The device key id that the wallet sent (header `X-Wallet-Unit-KeyID`), for example the App Attest key id on iOS. Empty when the wallet sent none."}}></SchemaItem><SchemaItem collapsible={false} name={"assertionToken"} required={true} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"The client assertion (a JWT, RFC 7523) of the last WUA request of the wallet. Empty for a wallet unit that sent no request yet. Treat it as a secret: do not write it to logs."}}></SchemaItem><SchemaItem collapsible={false} name={"assertionTokenType"} required={true} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"The type of `assertionToken`: `urn:ietf:params:oauth:client-assertion-type:jwt-bearer`, or empty."}}></SchemaItem><SchemaItem collapsible={true} className={"schemaItem"}><details style={{}} className={"openapi-markdown__details"}><summary style={{}}><span className={"openapi-schema__container"}><strong className={"openapi-schema__property"}>clientMetadata</strong><span className={"openapi-schema__name"}> object</span><span className={"openapi-schema__divider"}></span><span className={"openapi-schema__nullable"}>nullable</span><span className={"openapi-schema__required"}>required</span></span></summary><div style={{"marginLeft":"1rem"}}><div style={{"marginTop":".5rem","marginBottom":".5rem"}}>

The client metadata that the wallet sent in its last WUA request (`client_metadata`), for example its name.

</div><SchemaItem name={"property name*"} required={false} schemaName={"any"} qualifierMessage={undefined} schema={{"type":"object","nullable":true,"description":"The client metadata that the wallet sent in its last WUA request (`client_metadata`), for example its name.","additionalProperties":true}} collapsible={false} discriminator={false}></SchemaItem></div></details></SchemaItem><SchemaItem collapsible={false} name={"attestationStatus"} required={true} schemaName={"string"} qualifierMessage={"**Possible values:** [``, `unauthorised`, `authorised`, `active`, `revoked`]"} schema={{"type":"string","description":"Where the wallet unit is: `unauthorised` or `authorised` (no Wallet Unit Attestation yet; registered without or with authorisation, read `isAuthorised` for the current value), `active` (it got WUAs) or `revoked` (a revocation left it no active WUA). The status does not change when the WUAs expire: compare `attestationExpiresAt` with the current time.","enum":["","unauthorised","authorised","active","revoked"],"example":"active"}}></SchemaItem><SchemaItem collapsible={false} name={"attestationExpiresAt"} required={true} schemaName={"int64"} qualifierMessage={undefined} schema={{"type":"integer","format":"int64","description":"When the newest Wallet Unit Attestation of the wallet unit expires (Unix time in seconds). `0` before the first WUA."}}></SchemaItem><SchemaItem collapsible={false} name={"createdAt"} required={true} schemaName={"int64"} qualifierMessage={undefined} schema={{"type":"integer","format":"int64","description":"When the wallet provider registered the wallet unit (Unix time in seconds)."}}></SchemaItem><SchemaItem collapsible={false} name={"updatedAt"} required={true} schemaName={"int64"} qualifierMessage={undefined} schema={{"type":"integer","format":"int64","description":"When the wallet unit last changed (Unix time in seconds)."}}></SchemaItem></div></details></SchemaItem></ul></details></TabItem><TabItem label={"Example (from schema)"} value={"Example (from schema)"}><ResponseSamples responseExample={"{\n  \"individualWalletUnit\": {\n    \"id\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n    \"clientId\": \"string\",\n    \"clientUrl\": \"string\",\n    \"clientPublicKey\": {},\n    \"isAuthorised\": true,\n    \"devicePlatform\": \"ios\",\n    \"deviceIntegrityToken\": \"string\",\n    \"deviceKeyId\": \"string\",\n    \"assertionToken\": \"string\",\n    \"assertionTokenType\": \"string\",\n    \"clientMetadata\": {},\n    \"attestationStatus\": \"active\",\n    \"attestationExpiresAt\": 0,\n    \"createdAt\": 0,\n    \"updatedAt\": 0\n  }\n}"} language={"json"}></ResponseSamples></TabItem><TabItem label={"Example"} value={"Example"}><ResponseSamples responseExample={"{\n  \"individualWalletUnit\": {\n    \"id\": \"6bf3bd97-50ba-4fec-9a78-1076b5627b5a\",\n    \"clientId\": \"wallet-unit-4f2a9c71\",\n    \"clientUrl\": \"https://wallet.example.com\",\n    \"clientPublicKey\": {\n      \"kty\": \"EC\",\n      \"crv\": \"P-256\",\n      \"x\": \"Nbii9ohvDybKefFdAx4QfqqUAKPyZnihqOHDp3Z2jEA\",\n      \"y\": \"DeBO5yAoahfS3HqfDmvrVsXvCzDrco4WLJ5wVIvTZ5s\"\n    },\n    \"isAuthorised\": true,\n    \"clientMetadata\": null,\n    \"attestationStatus\": \"authorised\",\n    \"attestationExpiresAt\": 0,\n    \"createdAt\": 1794149364,\n    \"updatedAt\": 1794149364,\n    \"devicePlatform\": \"android\",\n    \"deviceIntegrityToken\": \"\",\n    \"deviceKeyId\": \"\",\n    \"assertionToken\": \"\",\n    \"assertionTokenType\": \"\"\n  }\n}"} language={"json"}></ResponseSamples></TabItem></SchemaTabs></TabItem></MimeTabs></div></TabItem><TabItem label={"400"} value={"400"}><div>

The body is not valid (an unknown member, a missing `clientId`, `clientPublicKey` or `devicePlatform`, a `devicePlatform` other than `ios` or `android`, or a `clientPublicKey` that is not a public EC JWK), an individual wallet unit (also a deleted one) has the `clientId`, or the organisation is not the wallet provider.

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

An organisation wallet unit of the wallet provider has the `clientId`: a client id belongs to one kind of wallet unit only.

</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>
      