Skip to main content
Contact the AIR team to enable them for your partner account before you start: Partner with us.
Iden3 credentials use a BJJ_SIG_2021 signature and the W3C Verifiable Credentials Data Model v1.1 in JSON-LD form. Holders prove claims with Groth16 zero-knowledge proofs. To verify them, see Verify Iden3 credentials.

When to use Iden3

Choose Iden3 over SD-JWT when you need one of these:
  • Predicate proofs. Prove a condition such as age > 18 without revealing the value.
  • Unlinkable presentations. Each proof is randomized, so verifiers cannot link a holder’s presentations.
  • On-chain verification. Check a proof through the Universal Verifier and Groth16 verifier contracts.
The cost is heavier proof generation on the holder’s device and a verifier that implements the Iden3 proof profile. Generic W3C VC support is not enough. See Credential formats for the full comparison.

Set up the issuer service

Iden3 issuers use the Iden3 branch of the AIR issuer service. It exposes the same POST /available-vc and POST /issue-vc contract as the SD-JWT service, with proofType: "BJJ_SIG_2021".

Generate the issuer seed

Your BJJ issuer DID is derived from a 32-byte seed:
SEED is your issuer identity. Store it in a secret manager and back it up. Losing it means you can no longer act as that issuer, and changing it creates a new issuer DID.

Configure the environment

Extract the issuer DID

Start the service. It logs the DID at startup as Issuer DID: did:air:…. You can also print it with the REPL:
Register the issuer in the Developer Dashboard under Issuer → Settings, filling in these fields:

Define a schema class

Create the schema in the Dashboard’s Schema Builder and record its schema ID, type, schema JSON URL, and JSON-LD context URL. Then add a class under src/issuer/schemas/:
src/issuer/schemas/schema-<SCHEMA_ID>.ts
Register it in src/issuer/schemas/index.ts:
src/issuer/schemas/index.ts
Claim keys and types must match the Dashboard schema exactly, or merklization and verification fail. The service sets credentialSubject.id to the holder DID.

Issue in bulk without a user session

The Iden3 service includes a CSV runner. It resolves each email through AIR initialize-user, issues, encrypts, and uploads:
Every credentialSubject.[field] cell must be a JSON-stringified value, so strings carry quotes.
The runner writes a result log named [unix_timestamp_ms].csv.

Revocation and status

The Iden3 service embeds a /credential-status URL under ISSUER_ORIGIN in each credential, so keep the origin stable. It does not support the token status list.

Issue both formats

A partner that issues SD-JWT and Iden3 credentials runs both services, each at its own ISSUER_ORIGIN. Set IDEN3_ISSUER_DID on the SD-JWT service to your BJJ issuer DID; it is then listed under alsoKnownAs in your did:web document.