> For the complete documentation index, see [llms.txt](https://docs.toolkit.equs.ai/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.toolkit.equs.ai/standards/presentation/configuration.md).

# Configuration

Set up the Verifier that asks for presentations and the VP Schema that says what you accept

Before your first presentation you configure two things: a **Verifier**, the entity that asks for and validates presentations, and a **VP Schema**, which says exactly what you're asking for and what you'll accept. Both are set up once and reused by every flow.

{% code collapsedlinecount="10" %}

```mermaid
flowchart LR
    T["Your Tenant"] --> V1["Verifier A<br/>did:web"]
    T --> V2["Verifier B<br/>did:web"]
    V1 --- S1["VP Schema<br/>'Age check'"]
    V2 --- S1
    V2 --- S2["VP Schema<br/>'Full KYC'"]
    style T fill:#e8f0fe,stroke:#4285f4
    style V1 fill:#fff4e5,stroke:#f9ab00
    style V2 fill:#fff4e5,stroke:#f9ab00
```

{% endcode %}

As with Issuers and VC Schemas, the relationship is many-to-many: a VP Schema names the Verifiers allowed to use it. Separate Verifiers are how you separate apps, brands, or environments.

Creating them also creates your **Verifier Key** in the platform's KMS, which signs presentation requests.

You can do all of this with no code in the [Operator Portal](https://portal.us.equs.ai/), or through the REST API. Each section below covers both.

In the portal, open **Verification**: it lists your VP Schemas, and the caret (**∨**) on the **New VP schema** button opens **Manage verifiers**. The portal manages Verifiers and VP Schemas only; presentations themselves are requested through the API. To get access to the portal, see [Registration](/standards/onboarding/registration.md).

### 1. Create the Verifier

A Verifier is normally identified by a `did:web`. Wallets resolve it to see who is asking, so its display name and logo are what the Holder sees when deciding whether to answer.

The exception is the EU Digital Identity ecosystem, where wallets require an X.509 identifier instead - see [EUDI Ecosystem](/standards/presentation/configuration/configuration-eudi-ecosystem.md).

Verifier names must be unique within your Tenant, and the number of Verifiers you can create is [capped](/standards/api/rate-limits.md).

Verifiers can also be updated, deactivated, and reactivated, but not deleted. A deactivated Verifier cannot be named in a new VP Schema.

#### In the Operator Portal <a href="#verifier-portal" id="verifier-portal"></a>

Add a Verifier with:

* **Name** - required, and unique within your Tenant. This is the name Holders see when deciding whether to answer.
* **Logo URL** - optional. A link to an image you host; there is no file upload. Without a logo, the Verifier is shown with the first letter of its name.

<figure><img src="https://701364325-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFaucIkpW1i4WOAQC06fj%2Fuploads%2FU3RFs5feQVTTwXutQ3AS%2Fimage.png?alt=media&amp;token=1812ab0b-4d55-4d42-afc4-2aef59f77935" alt=""><figcaption></figcaption></figure>

The portal creates `did:web` Verifiers only. The DID is generated and hosted for you, so there is nothing to publish on your side. From the list you can deactivate and reactivate a Verifier. For an X.509 Verifier in the EU Digital Identity ecosystem, use the API - see [EUDI Ecosystem](/standards/presentation/configuration/configuration-eudi-ecosystem.md).

#### With the API <a href="#verifier-api" id="verifier-api"></a>

{% hint style="info" icon="rectangle-api" %}
All calls mentioned on this page are on the [Control API](https://docs.toolkit.equs.ai/standards/presentation/pages/MvAvsnLQU3ER2hOIIDU2#id-2.4.1-apis).
{% endhint %}

## Create Verifier

> Create new Verifier

```json
{"openapi":"3.0.0","info":{"title":"EqusDTK Control API Documentation","version":"0.1.2"},"tags":[{"name":"Verifier","description":""}],"security":[{"sp":[]},{"tenant":[]},{"sp":[]}],"components":{"securitySchemes":{"sp":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Service Provider. Token of the Service Provider client in the `agents` realm, with no `tenantId` claim. Authorize one bearer scheme at a time."},"tenant":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Tenant. Token of a Tenant machine client or of a Tenant portal user, carrying the `tenantId` claim. Authorize one bearer scheme at a time."}},"schemas":{"CreateVerifierRequest":{"type":"object","properties":{"name":{"type":"string","description":"Display name of the verifier."},"logo":{"description":"Logo displayed for this verifier when requesting presentations.","allOf":[{"$ref":"#/components/schemas/Logo"}]},"didMethod":{"type":"string","description":"DID method used to generate the DID for this verifier.","enum":["did:web"]},"clientIdPrefix":{"type":"string","enum":["did_web","x509_hash","x509_san_dns"],"description":"OID4VP Client Identifier Prefix. Defaults to `did_web`."},"trustedRootCerts":{"description":"Base64-encoded X.509 root certificates trusted when verifying presented credentials.","type":"array","items":{"type":"string"}}},"required":["name"]},"Logo":{"type":"object","properties":{"uri":{"type":"string","format":"uri","description":"Publicly accessible URL of the logo image."},"altText":{"type":"string","description":"Alternative text describing the logo, used for accessibility."}},"required":["uri"]},"CreateVerifierResponse":{"type":"object","properties":{"id":{"type":"string","description":"Verifier unique ID"}},"required":["id"]}}},"paths":{"/api/v1/verifiers":{"post":{"description":"Create new Verifier","operationId":"VerifierController_createVerifier_api/v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVerifierRequest"}}}},"responses":{"201":{"description":"When Verifier is created successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVerifierResponse"}}}},"400":{"description":"When the verifier name already exists."},"409":{"description":"When the Tenant already owns its maximum number of Verifiers."},"422":{"description":"When clientIdPrefix is x509_san_dns but the active access certificate carries no dNSName SAN equal to the protocol host."}},"summary":"Create Verifier","tags":["Verifier"]}}}}
```

### 2. Create the VP Schema

A VP Schema is the question you're asking. It carries one or more **inputs**, each describing a credential you'll accept and the claims you want from it.

**One input means one credential.** If what you need spans two credentials, that's two inputs; a single input can't be satisfied by combining several. At least one input is required - without one there's nothing to ask for.

{% code collapsedlinecount="10" %}

```mermaid
flowchart LR
    S["VP Schema"] --> I1["Input 1<br/>= one credential"]
    S --> I2["Input 2<br/>= another credential"]
    I1 --> A["Which credential<br/>vcSchemaIds or credTypes"]
    I1 --> B["Which claims<br/>path · values · mandatory"]
    I1 --> C["fullDisclosure<br/>true or false"]
    style S fill:#e8f0fe,stroke:#4285f4
    style A fill:#fff4e5,stroke:#f9ab00
    style B fill:#e6f4ea,stroke:#34a853
    style C fill:#f1f3f4,stroke:#9aa0a6
```

{% endcode %}

An input has three parts, and **the credential and the claims are both optional** - which combination you use is what decides the question being asked.

<table><thead><tr><th width="150">Credential</th><th width="150">Claims</th><th width="150">fullDisclosure</th><th>What you're asking</th></tr></thead><tbody><tr><td>One</td><td>None</td><td><code>false</code></td><td><em>Do you hold this credential?</em> Nothing is disclosed - an existence check</td></tr><tr><td>One</td><td>None</td><td><code>true</code></td><td><em>Show me everything in this credential</em></td></tr><tr><td>None</td><td>Listed</td><td><code>false</code></td><td><em>Show me these claims, from any credential that has them</em></td></tr><tr><td>One</td><td>Listed</td><td><code>false</code></td><td><em>Show me these claims, from this credential</em></td></tr><tr><td>Several</td><td>Listed</td><td><code>false</code></td><td><em>Show me these claims, from whichever of these credentials you hold</em></td></tr></tbody></table>

#### Naming the credential

<table><thead><tr><th width="200"></th><th></th></tr></thead><tbody><tr><td><strong><code>vcSchemaVersionIds</code></strong></td><td>A specific version of a <strong>VC</strong> Schema defined on this platform</td></tr><tr><td><strong><code>credTypes</code></strong></td><td>A format plus type identifiers - <code>dc+sd-jwt</code> with <code>vct</code> values, or mDoc with <code>mdocType</code> values - for credentials defined elsewhere</td></tr></tbody></table>

Listing several means *any of these will do*.

#### Naming the claims

Each claim takes a **`path`** into the credential, an optional list of **`values`**, and **`mandatory`**.

`values` changes what you're asking. Omit it and any value is accepted - *tell me your country of residence*. Supply it and the claim must match one you listed - *confirm your country is one of these*. The second asks for **less**: you learn whether the Holder qualifies, not the answer itself.

`mandatory` decides whether the presentation can complete without that claim.

#### In the Operator Portal <a href="#vp-schema-portal" id="vp-schema-portal"></a>

A new VP Schema takes two steps:

{% stepper %}
{% step %}

#### Configure the Schema

* **Verifier** - required. Pick one or more of your Verifiers, or create one with the **＋** beside the field.
* **Name** - required.
* **Description** - optional.

<figure><img src="https://701364325-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFaucIkpW1i4WOAQC06fj%2Fuploads%2FiNyTZn2j0UF7xXb6Nhzo%2Fimage.png?alt=media&amp;token=6c1c8328-caf0-43cc-9b8c-2fedb16089a0" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

#### Add the inputs

Each input is one credential you'll accept. Match it in one of two ways:

* **VC schema** - pick one or more of your VC Schemas. Once you've picked one, the **Full disclosure** toggle lets you ask for everything in the credential.
* **Credential type** - for credentials defined elsewhere. Pick the **Credential format** and enter the type **Value**, such as the `vct` of an SD-JWT VC. **Add value** accepts more than one.

Then use **Add claim** for each claim you want.

Use **Add input** to ask for another credential, then select **Create VP schema**.

<figure><img src="https://701364325-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFaucIkpW1i4WOAQC06fj%2Fuploads%2FGb1hqr6QI0ofecCjeyBD%2Fimage.png?alt=media&amp;token=f81568de-89e5-4f6a-8d80-bf509447554a" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

The claim form has no allowed values. To require a claim to match a list of `values`, use the API.

#### With the API <a href="#vp-schema-api" id="vp-schema-api"></a>

## Create VP Schema

> Create new VP Schema

```json
{"openapi":"3.0.0","info":{"title":"EqusDTK Control API Documentation","version":"0.1.2"},"tags":[{"name":"Verifier","description":""}],"security":[{"sp":[]},{"tenant":[]},{"sp":[]}],"components":{"securitySchemes":{"sp":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Service Provider. Token of the Service Provider client in the `agents` realm, with no `tenantId` claim. Authorize one bearer scheme at a time."},"tenant":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Tenant. Token of a Tenant machine client or of a Tenant portal user, carrying the `tenantId` claim. Authorize one bearer scheme at a time."}},"schemas":{"CreateVpSchemaRequest":{"type":"object","properties":{"name":{"type":"string","description":"Display name of the VP schema."},"description":{"type":"string","description":"Human-readable description of the VP schema."},"verifiers":{"description":"Identifiers of the verifiers allowed to use this VP schema.","type":"array","items":{"type":"string"}},"inputs":{"description":"Inputs describing the credentials and claims requested by this VP schema.","type":"array","items":{"$ref":"#/components/schemas/VpSchemaInput"}}},"required":["name","verifiers","inputs"]},"VpSchemaInput":{"type":"object","properties":{"vcSchemaVersionIds":{"description":"VC schema version identifiers this input can be satisfied by.","type":"array","items":{"type":"string"}},"credTypes":{"description":"Credential type this input can be satisfied by, as an alternative to vcSchemaVersionIds.","allOf":[{"$ref":"#/components/schemas/VpSchemaInputCredType"}]},"claims":{"description":"Claims requested from the presented credential.","type":"array","items":{"$ref":"#/components/schemas/VpSchemaInputClaims"}},"fullDisclosure":{"type":"boolean","description":"Determines whether all claims of the credential must be disclosed."}}},"VpSchemaInputCredType":{"type":"object","properties":{"format":{"type":"string","description":"Credential format the queried credential type values belong to."},"values":{"description":"Credential type identifiers accepted for this input.","type":"array","items":{"type":"string"}}},"required":["format","values"]},"VpSchemaInputClaims":{"type":"object","properties":{"path":{"description":"Path of the claim to disclose within the credential.","type":"array","items":{"type":"string"}},"values":{"description":"Allowed values the claim must match. If omitted any value of the claim is accepted.","type":"array","items":{"type":"string"}},"mandatory":{"type":"boolean","description":"Determines whether the claim must be disclosed by the holder."}},"required":["path"]},"CreateVpSchemaResponse":{"type":"object","properties":{"id":{"type":"string","description":"VP schema unique ID"}},"required":["id"]}}},"paths":{"/api/v1/vp-schemas":{"post":{"description":"Create new VP Schema","operationId":"VpSchemaController_createVpSchema_api/v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVpSchemaRequest"}}}},"responses":{"201":{"description":"When VP Schema is created successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVpSchemaResponse"}}}},"400":{"description":"- When one or more inputs contain invalid data.\n- When one or more Verifier IDs do not exist.\n- When one or more Verifiers are inactive.\n- When one or more VC Schema IDs do not exist.\n- When the VP Schema name already exists."}},"summary":"Create VP Schema","tags":["Verifier"]}}}}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.toolkit.equs.ai/standards/presentation/configuration.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
