Credential Offers
Create OID4VCI credential offers for wallet consumption
Credential offers are the entry point for issuance. They contain the information a wallet needs to request a specific credential.
Create an offer
POST /oid4vci/offers
Authorization: Bearer oat_your_secret_key
Content-Type: application/jsonRequest body
{
"templateId": "550e8400-e29b-41d4-a716-446655440000",
"claims": {
"given_name": "Alice",
"family_name": "Smith",
"birth_date": "1990-01-15"
},
"useAuthorizationCode": false
}| Field | Type | Required | Description |
|---|---|---|---|
templateId | string (UUID) | Yes | Template ID defining the credential schema |
claims | object | No | Claim values for the credential |
useAuthorizationCode | boolean | No | Include authorization code grant alongside pre-auth |
offerScheme | string | No | Scheme of the returned offer URI: openid-credential-offer (default), haip-vci or eu-eaa-offer (EUDI wallets, ETSI TS 119 472-3) |
Response
{
"offer_id": "abc123",
"credential_offer": {
"credential_issuer": "https://api.verifiables.com",
"credential_configuration_ids": ["eu.europa.ec.eudi.pid.1"],
"grants": { "...": "..." }
},
"credential_offer_uri": "openid-credential-offer://?credential_offer_uri=https%3A%2F%2F...",
"tx_code": "847291"
}| Field | Description |
|---|---|
offer_id | Unique offer identifier |
credential_offer | The OID4VCI credential offer object (see below) |
credential_offer_uri | URI for the wallet (QR code or deep link) |
tx_code | Transaction code the holder must enter (if applicable) |
Offer structure
The credential offer URI points to a JSON object with this structure:
{
"credential_issuer": "https://api.verifiables.com",
"credential_configuration_ids": ["eu.europa.ec.eudi.pid.1"],
"grants": {
"urn:ietf:params:oauth:grant-type:pre-authorized_code": {
"pre-authorized_code": "...",
"tx_code": {
"input_mode": "numeric",
"length": 6,
"description": "Enter the code"
}
},
"authorization_code": {
"issuer_state": "offer_abc123"
}
}
}When useAuthorizationCode is true, both grant types are included. The wallet chooses which flow to follow.
Templates
Templates define the credential type, schema, and display. Create them from the dashboard or via API:
POST /templates
Authorization: Bearer oat_your_secret_key
Content-Type: application/json{
"type": "eu.europa.ec.eudi.pid.1",
"format": "mso_mdoc",
"title": "EU Personal ID",
"description": "European Union Person Identification Data",
"claims": [
{ "name": "family_name", "type": "string", "mandatory": true },
{ "name": "given_name", "type": "string", "mandatory": true },
{ "name": "birth_date", "type": "string", "mandatory": true }
]
}Accepted fields are type, format, claims, schema, description, title, bindingMethods, algorithms, and proofTypes. There is no separate doctype, namespace, or display input: the mDoc doctype (or SD-JWT vct) is derived from type when the issuer metadata is built. See the API reference for the full field table.