---
title: "W3C VC via OID4VP"
description: "Present a W3C Verifiable Credential from a Wallet API v2 wallet using OID4VP 1.0."
stack: "Community Stack (open source) — version 1.1.1"
stack_version: "1.1.1"
stack_comparison: https://docs.walt.id/community-vs-enterprise.md
canonical_url: https://docs.walt.id/community-stack/wallet2/credential-presenting/w3c-vc
generated: 2026-10-01
---
# Presenting W3C VC Credentials via OID4VP

This guide shows you how to present a [W3C Verifiable Credential](https://docs.walt.id/concepts/digital-credentials/verifiable-credentials-w3c.md) from a wallet using the walt.id Wallet API v2. You'll take a presentation request — for example one created with [Verifier2](https://docs.walt.id/community-stack/verifier2/credential-verification/vc-oid4vp.md) — and satisfy it in a single call.

[**W3C VC**](https://docs.walt.id/concepts/digital-credentials/verifiable-credentials-w3c.md): The W3C Verifiable Credentials data model, here presented as a JWT (`jwt_vc_json`).

[**OID4VP**](https://docs.walt.id/concepts/data-exchange-protocols/openid4vp.md): The protocol used to deliver the presentation from the wallet to the verifier. Credential matching uses [DCQL](https://docs.walt.id/concepts/data-exchange-protocols/dcql.md).

**Note:**

This page uses the **full presentation flow** — one call that matches, signs, and submits. To preview what will be shared, let the user choose between matches, or present a credential that isn't stored in the wallet, see [Isolated Flow](https://docs.walt.id/community-stack/wallet2/credential-presenting/isolated-flow.md).

## Prerequisites

Before you begin, ensure you have:

- **Wallet API v2 running** — Follow the [Setup](https://docs.walt.id/community-stack/wallet2/setup.md) guide. The examples use `http://localhost:7006` as the base URL (Verifier2 defaults to `7004`).
- **A wallet holding a W3C VC** — [Receive one first](https://docs.walt.id/community-stack/wallet2/credential-receiving/w3c-vc.md); you'll need the wallet's `walletId`.
- **A presentation request** — For a full end-to-end run, create one with the [Verifier2 W3C VC guide](https://docs.walt.id/community-stack/verifier2/credential-verification/vc-oid4vp.md). The request is an `openid4vp://` URL.

---

## Present the Credential

Hand the verifier's request to the wallet. This single call resolves the request, matches a stored W3C VC against the verifier's DCQL query, signs the presentation with the wallet's default key, and submits it.

**Option: CURL**

**Endpoint:** `POST /wallet/{walletId}/credentials/present` | [API Reference](https://docs.walt.id/community-stack/wallet2/full-api-reference.md)

##### Example Request

```bash
curl -X POST http://localhost:7006/wallet/{walletId}/credentials/present \
  -H 'Content-Type: application/json' \
  -d '{
    "requestUrl": "openid4vp://authorize?client_id=x509_san_dns%3Averifier.example.org&request_uri=http%3A%2F%2Flocalhost%3A7004%2Fopenid4vc%2Frequest%2Fabc123"
  }'
```

**Path Parameters**

- **walletId**: _String_ (required) - The wallet holding the credential to present. Returned when you [create a wallet](https://docs.walt.id/community-stack/wallet2/wallets.md); to look up an existing one, list your wallets with `GET /wallet`.

**Body Parameters**

- **requestUrl**: _String_ (required) - The OID4VP authorization request URL from the verifier.
- **keyId**: _String_ (optional) - Key used to sign the presentation. Defaults to the wallet's default key.
- **did**: _String_ (optional) - DID for the presenter identity. Defaults to the wallet's default DID.

---

##### Example Response

```json
{
  "transmission_success": true,
  "verifier_response": {
    "status": "received",
    "message": "Presentation received and is being processed."
  }
}
```

**Response Fields**

- **transmission_success**: _Boolean_ - Whether the wallet successfully submitted the presentation to the verifier.
- **verifier_response**: _Object_ - The raw response body returned by the verifier (for a `direct_post` submission, a status/message acknowledgement as above).
- **redirect_to**: _String_ (optional) - Where to send the user next, if the verifier returned a redirect. Omitted otherwise.
- **get_url** / **form_post_html**: _String_ (optional) - Present instead for `direct_post.jwt` / form-post response modes.

**Note:**

  `transmission_success: true` means the wallet delivered the presentation — confirm the verification outcome on the verifier side (`GET /verification-session/{sessionId}/info` → `status: SUCCESSFUL`).

🎉 You've presented a W3C VC credential to the verifier.

---

## Doing It Step by Step

The full-flow call above matches and submits in one shot. If you're building a wallet UI and need to show the user what will be shared before they consent — or present a credential that isn't stored in the wallet — drive the isolated endpoints yourself. The consent path is **preview → build-vp-token → send-response** (or **reject**); advanced resolve/match steps are also available. See [Isolated Flow](https://docs.walt.id/community-stack/wallet2/credential-presenting/isolated-flow.md).

---

## Next Steps

- **Present other credential types** — [SD-JWT VC](https://docs.walt.id/community-stack/wallet2/credential-presenting/sd-jwt-vc.md) or [mDL](https://docs.walt.id/community-stack/wallet2/credential-presenting/mdl.md).
- **Preview and consent** — Use [Isolated Flow](https://docs.walt.id/community-stack/wallet2/credential-presenting/isolated-flow.md#preview-the-presentation) to show the user which credentials and claims match before sharing.
- **Receive more credentials** — [Credential Receiving](https://docs.walt.id/community-stack/wallet2/credential-receiving/overview.md).
