Docs
Issuance

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

Request body

{
  "templateId": "550e8400-e29b-41d4-a716-446655440000",
  "claims": {
    "given_name": "Alice",
    "family_name": "Smith",
    "birth_date": "1990-01-15"
  },
  "useAuthorizationCode": false
}
FieldTypeRequiredDescription
templateIdstring (UUID)YesTemplate ID defining the credential schema
claimsobjectNoClaim values for the credential
useAuthorizationCodebooleanNoInclude authorization code grant alongside pre-auth
offerSchemestringNoScheme 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"
}
FieldDescription
offer_idUnique offer identifier
credential_offerThe OID4VCI credential offer object (see below)
credential_offer_uriURI for the wallet (QR code or deep link)
tx_codeTransaction 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.