Skip to main content
As a Verifier, your role is to verify the authenticity of user credentials and ensure they meet your requirements. Verification is program-driven: a Verification Program configured in the Developer Dashboard centrally controls the accepted credential format, the requested claims, and selective disclosure. Your integration passes a programId, the fields to disclose, and a nonce; the SDK handles credential discovery, consent, and result handling. Most programs accept SD-JWT VC credentials, the default format. Iden3 programs add zero-knowledge proofs and on-chain verification; see Iden3 credentials.

Verification flow

  1. Start verification — the verifier starts a session with a programId. The program defines what to check and how.
  2. Consent + discovery — the SDK requests the holder’s consent and loads the matching encrypted credential from DStorage.
  3. Presentation — the holder decrypts the credential and discloses only the requested claims. For SD-JWT credentials with a holder key, the holder also signs a key-binding JWT over your nonce. Iden3 programs generate a zero-knowledge proof instead where required.
  4. Verification — the presentation is checked against the program’s settings off-chain. Iden3 programs can also record the proof on-chain.
  5. Result — on success the SDK returns a W3C Verifiable Presentation containing the disclosed credential. Verify it again on your backend before you act on it.
Every verification attempt is recorded as a verification session — a server-side record of the result, mode, holder context, and usage data — giving you consistent reporting across integrations.

Verifier integration checklist

  1. Create or select a Verification Program in the Developer Dashboard (Verifier → Program).
  2. Configure the program:
    • Accepted proof type: SD_JWT_VC (default), or BJJ_SIG_2021 for Iden3 programs
    • Requested claims and whether selective disclosure is required
    • Whether to check issuer revocation status
    • The Issuer’s DID to constrain trusted issuers (optional)
    • For Iden3 programs only: whether a ZKP is required, and off-chain vs on-chain verification
  3. Publish the program and take note of the programId.
  4. Integrate the AIR Verifier SDK.
  5. Start verification with the programId.
  6. Handle outcomes: Compliant, Non-compliant, No matching credential, User declined consent, or proof/verification failure.
  7. On success, send the returned Verifiable Presentation to your backend and verify it there before granting access or rewards.
The dashboard link above uses Sandbox for development. For production launches, use the production Developer Dashboard. Moca Chain mainnet is live, and SD-JWT verification programs are self-serve in production. See Production mainnet access.

Start verification

Generate a Partner JWT with scope=verify and a fresh nonce on your backend, then start verification with the SDK. The credential format and requested claims come from the program configuration, so your call stays minimal.

Input parameters

Response

The function returns a Promise<CredentialVerificationResult>, a discriminated union on status.For non-compliant statuses ("Non-Compliant", "Pending", "Revoking", "Revoked", "Expired", "NotFound"):For compliant status ("Compliant"):
Inside the presentation:For an SD_JWT_VC program, the presentation looks like this:
The presentation wrapper, including holder, is not signed. Only the compact SD-JWT inside id is. AIR checks it in the user’s browser, so verify the SD-JWT on your backend before you rely on the result. See Verify SD-JWT on your backend.
See Selective Disclosure for how requested fields populate the presentation.
Under the hood, the SDK loads the holder’s matching encrypted credential from DStorage, decrypts it locally, and obtains consent for disclosure. AIR handles ciphertext and metadata; the verifier receives the user-approved disclosures. A successful result returns the compliant payload above.

Next steps