When to run an Issuer BackendIntegrate an Issuer Backend when you need on-demand issuance, queryable available credentials, revocation checks, or issuer-controlled data access. New issuance programs should use the
BJJ_SIG_2021 signature type by default.Dashboard setup
Credential services are gated. When you first sign up, the Issuer and Verifier menus (schemas, programs, and DID settings) stay hidden until your Issuer DID is registered with AIR.- Create or use an AIR Dashboard account.
- Download
air-issuer-serviceand generate a seed. Your signing keys — and your Issuer DID — are derived from this seed, so keep it secure. - Retrieve your Issuer DID with the tool.
- Contact AIR with your Issuer DID. AIR registers it against your partner account; only after AIR sets your DID do the Issuer and Verifier menus (schemas and programs) become visible.
- Configure the remaining issuer details under Issuer → Settings:
- Supported signature types —
BJJ_SIG_2021 - JWKS URL / key information where applicable
- Optional user identifier type (email, phone, or partner user ID)
- Issuer Backend URL and endpoint paths (if you run a hosted backend; leave empty for direct issuance)
- Supported signature types —
- Select or create a schema, then create an issuance program.
Technical integration
See Issuance API Reference for request and response details.
Hosted Issuer Backend flow
Use this when you can operate a backend for on-demand issuance.Step 1 — Configure the backend
Set up your issuer backend / environment with:- Issuer DID and signing keys
- Schema and program configuration
- API keys / partner auth
- DStorage endpoint configuration
- Issuer data source connection
- A generated private API key, shared with AIR — AIR sends it in the
x-api-keyheader when calling your issuer-hosted endpoints
If your Issuer Backend enables CORS, allow
*.air3.com so AIR can call your available-vc and issue-vc endpoints.Step 2 — Expose available-vc
Your backend exposes POST /available-vc and accepts the AIR-resolved holder identity:
- Retrieves the user’s eligible credential data from your data source.
- Returns
{ data: [...] }, with each credential subject encrypted to the holder’spubKey. - Accepts optional
schemaIdandproofTypefilters.
Step 3 — Expose issue-vc
Your backend exposes POST /issue-vc with the same holderDID, pubKey, and userId, plus the required schemaId and optional proofType:
- Retrieves the final user data.
- Builds the VC and signs it with issuer-controlled keys.
- Encrypts the VC to the user’s public key.
- Stores the encrypted VC via DStorage.
- Returns an empty response body after successful issuance. The issuer backend stores the DStorage response in its issuance record; it does not return the
storagePathto AIR.
x-api-key: <issuerBackendApiKey>. AIR resolves and supplies userId; use it—not holderDID alone—to retrieve partner-owned eligibility and claim data.
Step 4 — Trigger issuance
AIR / the SDK triggers issuance by calling your backend, typically from a user-initiated frontend flow. The user’s raw data never leaves your control in plaintext, and AIR stores only the encrypted envelope and metadata.Compliance encryption (CAK)
When compliance encryption is enabled for your issuance program (configured in the Developer Dashboard), you can obtain a user-specific public key (cakPublicKey) to encrypt additional compliance data for regulated disclosure or threshold decryption. The key is deterministically derived from the [User – Issuer – Schema] composite identifier, so the same key is returned for the same combination.
Full CAK Issuer Guide
For Dashboard configuration, encrypting user data with the CAK public key, and implementing the callback endpoint, see the dedicated CAK Issuer Guide.
View issued credential records
Review the records of every credential you have issued in the Developer Dashboard under Issuer → Usage Records. Where a credential needs to be invalidated, use the Revoke function in the Dashboard.
Issuer -> Usage Records in the Developer Dashboard
GET /admin/issuance-history and revoke by nonce with POST /admin/revoke. Issued BJJ credentials reference the public GET /credential-status/:nonce endpoint for non-revocation proofs. See the Issuance API Reference for the complete issuer-side contract.
Best practices for issuers
- Only issue credentials after thorough validation of submitted evidence or claims.
- Keep source data and signing keys under issuer control; never expose plaintext user data to AIR.
- Minimize personally identifiable information — issue privacy-preserving credentials whenever possible.
- Adopt open, standardized schemas to maximize compatibility across apps.
- Implement robust expiry and revocation processes, and keep holders and verifiers informed of credential status.
- Treat bulk imports as an operational process for large backfills, not the default integration path.