Skip to main content
POST
Mint a credential for a person or a business operator

Authorizations

X-API-Key
string
header
required

Headers

Idempotency-Key
string
required

An opaque key, ideally a UUID, that makes this request safe to retry. A second request with the same key and body within 24 hours answers with the first one's response, marked Idempotent-Replayed: true, without minting again. The same key with a different body is refused with 422, and a retry that arrives while the first is still running with 409. Keys are scoped to your application.

Body

type: INDIVIDUAL: mint for a verified person as themselves.

audience
string
required

The counterparty the credential is scoped to: a bare domain (login.example.com), or an https authorization-server identifier (https://login.example.com) kept whole, which derives a different pairwise subject than the bare host. Paths, queries, fragments and non-default ports are refused.

Required string length: 1 - 512
agent_key
CredentialAgentKey (v1) · object
required

Public JWK of the agent that will present the credential; becomes the credential's cnf binding.

individual_ref
string
required

Pairwise reference to the verified individual, as issued to the calling organization at verification completion.

Required string length: 1 - 255
type
string
required

INDIVIDUAL: the person as themselves.

Allowed value: "INDIVIDUAL"
format
enum<string>
default:dc+sd-jwt

Credential wire format. dc+sd-jwt (media type application/dc+sd-jwt, draft-ietf-oauth-sd-jwt-vc-19 §2.1) is the only format issued.

Available options:
dc+sd-jwt
level
enum<string>
default:L3

Credential layer to mint (defaults to L3): L2 (audience-scoped pairwise DID) or L3 (selectively disclosed verified identity).

Available options:
L2,
L3
ttl_seconds
integer | null

Maximum credential validity in seconds, capped at supporting evidence expiry. Omitted or null uses the server default (3600 seconds). Must not exceed the configured maximum (86400 seconds by default). Applies to L2 and L3.

Required range: x > 0
disclosed_fields
string[]

L3 only: the dotted disclosure paths the subject credential should carry, e.g. email or hashes.email. A business mint lists business paths here and the actor credential's paths, e.g. given_name, in actor_disclosed_fields.

Maximum array length: 64
preset
enum<string> | null

L3 only: disclose a use case's fields instead of listing disclosed_fields; never both. GET /issuance/credentials/presets lists each preset's paths. A preset always shares values in the clear, and B2B presets need a business mint.

Available options:
consumer_ecommerce,
age_gated,
consumer_regulated,
b2b_ecommerce,
b2b_regulated
disclosure_mode
enum<string>
default:CLEARTEXT_AND_HASH

L3 disclosure mode: CLEARTEXT_AND_HASH (default) discloses requested fields as cleartext alongside their recognition hashes; HASH_ONLY discloses only the recognition hashes.

Available options:
CLEARTEXT_AND_HASH,
HASH_ONLY

Response

The minted credentials.

Body of POST /issuance/credentials: one credential for an individual, and for a business L3 mint the subject's followed by the actor's.

environment
enum<string>
required

The environment the credentials were minted in.

Available options:
sandbox,
production
ttl_capped
boolean
required

Whether supporting evidence expiry shortened the requested validity; each entry's expires_at is the instant it ends.

credentials
CredentialMintEntry (v1) · object[]
required

The minted credentials, subject first.