Skip to main content

Overview

The AnonCredsApi provides methods for working with AnonCreds, a privacy-preserving credential format that supports zero-knowledge proofs and predicates. AnonCreds is typically used with Hyperledger Indy and supports:
  • Zero-knowledge proofs
  • Predicate proofs (e.g., age > 18 without revealing exact age)
  • Revocation
  • Multi-credential proofs
import { AnonCredsModule } from '@credo-ts/anoncreds'
import { Agent } from '@credo-ts/core'

const agent = new Agent({
  // ...
  modules: {
    anoncreds: new AnonCredsModule({
      registries: [indyVdrRegistry],
    }),
  },
})

// Access via modules
const api = agent.modules.anoncreds

Setup Methods

createLinkSecret()

Create a link secret (master secret) for the holder. Required before receiving credentials.
const linkSecretId = await agent.modules.anoncreds.createLinkSecret({
  linkSecretId: 'my-link-secret',
  setAsDefault: true,
})

console.log('Link secret created:', linkSecretId)
Optional ID for the link secret. Generated if not provided.
options.setAsDefault
boolean
default:"false"
Whether to set as default link secret. First link secret is always default.
Returns: Promise<string> - The link secret ID

getLinkSecretIds()

Get all link secret IDs created by the agent.
const linkSecretIds = await agent.modules.anoncreds.getLinkSecretIds()
console.log('Link secrets:', linkSecretIds)
Returns: Promise<string[]>

Schema Operations

registerSchema()

Register a credential schema on the ledger.
const result = await agent.modules.anoncreds.registerSchema({
  schema: {
    issuerId: issuerDid,
    name: 'Employee Credential',
    version: '1.0',
    attrNames: ['name', 'employee_id', 'department', 'hire_date'],
  },
  options: {},
})

if (result.schemaState.state === 'finished') {
  const schemaId = result.schemaState.schemaId
  console.log('Schema registered:', schemaId)
}
options.schema
AnonCredsSchema
required
Schema definition:
  • issuerId: Issuer DID
  • name: Schema name
  • version: Schema version
  • attrNames: Array of attribute names
options.options
object
required
Registry-specific options
Returns: Promise<RegisterSchemaReturn>

getSchema()

Retrieve a schema from the ledger.
const { schema, resolutionMetadata } = await agent.modules.anoncreds.getSchema(
  'did:indy:sovrin:5nDyJVP1NrcPAttP3xwMB9/anoncreds/v0/SCHEMA/Employee/1.0'
)

if (schema) {
  console.log('Schema:', schema.attrNames)
}
schemaId
string
required
Schema identifier
options
AnonCredsResolutionOptions
Resolution options
Returns: Promise<GetSchemaReturn>

getCreatedSchemas()

Get schemas created by this agent.
const schemas = await agent.modules.anoncreds.getCreatedSchemas({
  schemaName: 'Employee Credential',
})
query
SimpleQuery<AnonCredsSchemaRecord>
required
Query to filter schemas
Returns: Promise<AnonCredsSchemaRecord[]>

Credential Definition Operations

registerCredentialDefinition()

Register a credential definition on the ledger.
const result = await agent.modules.anoncreds.registerCredentialDefinition({
  credentialDefinition: {
    issuerId: issuerDid,
    schemaId: schemaId,
    tag: 'default',
  },
  options: {
    supportRevocation: true,
  },
})

if (result.credentialDefinitionState.state === 'finished') {
  const credDefId = result.credentialDefinitionState.credentialDefinitionId
  console.log('Credential definition registered:', credDefId)
}
options.credentialDefinition
AnonCredsRegisterCredentialDefinitionOptions
required
Credential definition options:
  • issuerId: Issuer DID
  • schemaId: Schema identifier
  • tag: Tag to distinguish multiple definitions for same schema
options.options
object
required
Options:
  • supportRevocation: Whether to support revocation
Returns: Promise<RegisterCredentialDefinitionReturn>

getCredentialDefinition()

Retrieve a credential definition.
const { credentialDefinition } = await agent.modules.anoncreds.getCredentialDefinition(
  credentialDefinitionId
)

if (credentialDefinition) {
  console.log('Schema ID:', credentialDefinition.schemaId)
}
credentialDefinitionId
string
required
Credential definition identifier
options
AnonCredsResolutionOptions
Resolution options
Returns: Promise<GetCredentialDefinitionReturn>

getCreatedCredentialDefinitions()

Get credential definitions created by this agent.
const credDefs = await agent.modules.anoncreds.getCreatedCredentialDefinitions({
  schemaId: schemaId,
})
query
SimpleQuery<AnonCredsCredentialDefinitionRecord>
required
Query to filter credential definitions
Returns: Promise<AnonCredsCredentialDefinitionRecord[]>

Revocation Operations

registerRevocationRegistryDefinition()

Register a revocation registry definition.
const result = await agent.modules.anoncreds.registerRevocationRegistryDefinition({
  revocationRegistryDefinition: {
    issuerId: issuerDid,
    tag: 'default',
    credentialDefinitionId: credDefId,
    maximumCredentialNumber: 1000,
  },
  options: {},
})

if (result.revocationRegistryDefinitionState.state === 'finished') {
  const revRegDefId = result.revocationRegistryDefinitionState.revocationRegistryDefinitionId
  console.log('Revocation registry registered:', revRegDefId)
}
options.revocationRegistryDefinition
AnonCredsRegisterRevocationRegistryDefinitionOptions
required
Revocation registry options:
  • issuerId: Issuer DID
  • tag: Tag for registry
  • credentialDefinitionId: Associated credential definition
  • maximumCredentialNumber: Maximum number of credentials
options.options
object
required
Registry-specific options
Returns: Promise<RegisterRevocationRegistryDefinitionReturn>

getRevocationRegistryDefinition()

Retrieve a revocation registry definition.
const { revocationRegistryDefinition } = 
  await agent.modules.anoncreds.getRevocationRegistryDefinition(revRegDefId)
revocationRegistryDefinitionId
string
required
Revocation registry definition identifier
options
AnonCredsResolutionOptions
Resolution options
Returns: Promise<GetRevocationRegistryDefinitionReturn>

registerRevocationStatusList()

Register the initial revocation status list.
const result = await agent.modules.anoncreds.registerRevocationStatusList({
  revocationStatusList: {
    issuerId: issuerDid,
    revocationRegistryDefinitionId: revRegDefId,
  },
  options: {},
})
options.revocationStatusList
AnonCredsRegisterRevocationStatusListOptions
required
Revocation status list options
options.options
object
required
Registry-specific options
Returns: Promise<RegisterRevocationStatusListReturn>

updateRevocationStatusList()

Update the revocation status list (revoke or un-revoke credentials).
const result = await agent.modules.anoncreds.updateRevocationStatusList({
  revocationStatusList: {
    revocationRegistryDefinitionId: revRegDefId,
    revokedCredentialIndexes: [1, 5, 10], // Revoke these
    issuedCredentialIndexes: [],
  },
  options: {},
})
options.revocationStatusList
AnonCredsUpdateRevocationStatusListOptions
required
Update options:
  • revocationRegistryDefinitionId: Registry ID
  • revokedCredentialIndexes: Credential indexes to revoke
  • issuedCredentialIndexes: Credential indexes to issue
options.options
object
required
Registry-specific options
Returns: Promise<RegisterRevocationStatusListReturn>

getRevocationStatusList()

Retrieve a revocation status list at a specific timestamp.
const { revocationStatusList } = 
  await agent.modules.anoncreds.getRevocationStatusList(
    revRegDefId,
    Date.now()
  )
revocationRegistryDefinitionId
string
required
Revocation registry definition identifier
timestamp
number
required
Timestamp to query (milliseconds since epoch)
options
AnonCredsResolutionOptions
Resolution options
Returns: Promise<GetRevocationStatusListReturn>

Credential Operations

getCredential()

Get a stored AnonCreds credential by ID.
const credential = await agent.modules.anoncreds.getCredential(credentialId)
console.log('Credential:', credential)
id
string
required
Credential ID
Returns: Promise<AnonCredsCredential>

getCredentials()

Get all stored AnonCreds credentials matching options.
const credentials = await agent.modules.anoncreds.getCredentials({
  credentialDefinitionId: credDefId,
})

console.log(`Found ${credentials.length} credentials`)
options
GetCredentialsOptions
required
Filter options
Returns: Promise<AnonCredsCredential[]>

Complete Example

Issuer Setup

import { Agent } from '@credo-ts/core'
import { AnonCredsModule } from '@credo-ts/anoncreds'

const issuer = new Agent({
  // ...
  modules: {
    anoncreds: new AnonCredsModule({
      registries: [indyVdrRegistry],
    }),
  },
})

await issuer.initialize()

// Register schema
const schemaResult = await issuer.modules.anoncreds.registerSchema({
  schema: {
    issuerId: 'did:indy:sovrin:V4SGRU86Z58d6TV7PBUe6f',
    name: 'EmployeeCredential',
    version: '1.0',
    attrNames: ['name', 'employee_id', 'department', 'hire_date', 'salary'],
  },
  options: {},
})

const schemaId = schemaResult.schemaState.schemaId

// Register credential definition
const credDefResult = await issuer.modules.anoncreds.registerCredentialDefinition({
  credentialDefinition: {
    issuerId: 'did:indy:sovrin:V4SGRU86Z58d6TV7PBUe6f',
    schemaId,
    tag: 'employee-2024',
  },
  options: {
    supportRevocation: true,
  },
})

const credDefId = credDefResult.credentialDefinitionState.credentialDefinitionId

// Register revocation registry
const revRegResult = await issuer.modules.anoncreds.registerRevocationRegistryDefinition({
  revocationRegistryDefinition: {
    issuerId: 'did:indy:sovrin:V4SGRU86Z58d6TV7PBUe6f',
    tag: 'default',
    credentialDefinitionId: credDefId,
    maximumCredentialNumber: 5000,
  },
  options: {},
})

const revRegDefId = revRegResult.revocationRegistryDefinitionState.revocationRegistryDefinitionId

// Register initial revocation status list
await issuer.modules.anoncreds.registerRevocationStatusList({
  revocationStatusList: {
    issuerId: 'did:indy:sovrin:V4SGRU86Z58d6TV7PBUe6f',
    revocationRegistryDefinitionId: revRegDefId,
  },
  options: {},
})

Holder Setup

import { Agent } from '@credo-ts/core'
import { AnonCredsModule } from '@credo-ts/anoncreds'

const holder = new Agent({
  // ...
  modules: {
    anoncreds: new AnonCredsModule({
      registries: [indyVdrRegistry],
    }),
  },
})

await holder.initialize()

// Create link secret (required before receiving credentials)
const linkSecretId = await holder.modules.anoncreds.createLinkSecret({
  setAsDefault: true,
})

console.log('Link secret created:', linkSecretId)

// Now ready to receive AnonCreds credentials via DIDComm

Revoking a Credential

// Revoke credential at index 42
const result = await issuer.modules.anoncreds.updateRevocationStatusList({
  revocationStatusList: {
    revocationRegistryDefinitionId: revRegDefId,
    revokedCredentialIndexes: [42],
    issuedCredentialIndexes: [],
  },
  options: {},
})

if (result.revocationStatusListState.state === 'finished') {
  console.log('Credential revoked successfully')
}

Usage with DIDComm

AnonCreds is typically used with DIDComm credential exchange:
// Issue credential via DIDComm
const credentialRecord = await agent.didcomm.credentials.offerCredential({
  connectionId,
  protocolVersion: 'v2',
  credentialFormats: {
    anoncreds: {
      credentialDefinitionId: credDefId,
      attributes: [
        { name: 'name', value: 'Alice Smith' },
        { name: 'employee_id', value: 'E12345' },
        { name: 'department', value: 'Engineering' },
        { name: 'hire_date', value: '2024-01-15' },
        { name: 'salary', value: '75000' },
      ],
    },
  },
  autoAcceptCredential: AutoAcceptCredential.ContentApproved,
})

// Request proof via DIDComm
const proofRecord = await agent.didcomm.proofs.requestProof({
  connectionId,
  protocolVersion: 'v2',
  proofFormats: {
    anoncreds: {
      name: 'Employment Verification',
      version: '1.0',
      requested_attributes: {
        name: {
          name: 'name',
          restrictions: [{ cred_def_id: credDefId }],
        },
        department: {
          name: 'department',
          restrictions: [{ cred_def_id: credDefId }],
        },
      },
      requested_predicates: {
        salary: {
          name: 'salary',
          p_type: '>=',
          p_value: 50000,
          restrictions: [{ cred_def_id: credDefId }],
        },
      },
    },
  },
})

See Also

Build docs developers (and LLMs) love