Issuance API

Programmatically issue and revoke credentials

Use `POST /v1/credentials/issue` for single credentials or hit `/v1/credentials/bulk-issue` with CSV payloads. Issuance links open the wallet, handle acceptance, and log audit events automatically.

Request body

POST /v1/credentials/issue
Authorization: Bearer <ISSUER_TOKEN>
Content-Type: application/json

{
  "credential_type": "staff_id",
  "subject": {
    "email": "john@example.com",
    "name": "John Doe"
  },
  "attributes": {
    "employee_id": "EMP12345",
    "department": "Engineering",
    "access_levels": ["office", "lab", "parking"],
    "start_date": "2025-01-15",
    "end_date": "2026-12-31"
  },
  "presentation_methods": ["nfc", "qr"],
  "metadata": {
    "internal_id": "hr_12345",
    "batch_id": "batch_jan_2025"
  }
}

Response

{
  "credential_id": "cred_abc123",
  "issuance_link": "https://nexiel.io/claim/cred_abc123",
  "wallet_url": "openid-credential-offer://?credential_offer=...",
  "qr_code_url": "https://api.nexiel.io/v1/credentials/offers/cred_abc123/qr",
  "status": "pending_acceptance",
  "expires_at": "2026-12-31T23:59:59Z"
}

Webhook lifecycle

credential.issued

Signed credential ready for collection.

credential.accepted

Holder added it to their wallet.

credential.revoked

Issuer revoked or superseded the credential.

nfc.tap.logged

Reader verified the credential (optional).

QR endpoint

Encodes the `openid-credential-offer://` link defined by EUDI / OpenID4VCI profile for wallets.

GET /v1/credentials/offers/cred_abc123/qr?size=360 HTTP/1.1
Host: api.nexiel.io
Authorization: Bearer <ISSUER_TOKEN>
Accept: image/png

Pass an optional `size` (160–1024px). The endpoint regenerates the QR on every request so display kiosks always show the latest pre-authorised offer.