Only this pageAll pages
Powered by GitBook
Couldn't generate the PDF for 211 pages, generation stopped at 100.
Extend with 50 more pages.
1 of 100

Product Docs

Getting Started

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Start using cheqd

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Integrate an SDK

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Get Started with cheqd Studio

Get started with cheqd's API product offering for creating DIDs, trust registries and monetising credentials: cheqd Studio.

Introduction

cheqd Studio is a set of APIs, guides and tutorials to help users establish an end-to-end trusted ecosystem for digital credentials.

Using REST APIs, customers can build cheqd's trust infrastructure into existing applications. All of cheqd’s existing open-source libraries remain available, and cheqd Studio does not necessitate developers to switch their SSI stack in their entirety, but allows them to build into their existing tooling, for example alongside APIs such as the Universal Resolver.

Get started

Features

cheqd Studio directly leverages our Veramo SDK Plugin, making a wide array of features available from launch, including:

Understanding the different modes and client choices

With cheqd Studio, there are multiple ways it can be deployed and hosted to support clients with different requirements.

Option 1: Custodied by cheqd (Custodian Mode)

This mode is the most simple for users, allowing cheqd to custody both Cosmos AND Identity keys in Veramo KMS. This means that manages both ledger-writes and signing identity transactions on behalf of the customer.

To ensure this is highly secure, we have deployed an instance of a Veramo Key Management Store (KMS) which uses a Postgress DB (TypeOrm) to store Cosmos AND identity keys in one encrypted table, so it cannot be read in plaintext. This design allows us to segment different customers' keys securely and efficiently.

We use similar techniques to Password Managers such as 1Password and Bitwarden to ensure that even if the database were to be compromised, the keys would remain encrypted and unusable.

User optionality and toggles:

Within Custodian mode, we also enable clients to toggle

External Database

Clients are able to choose whether to use our default database for storing keys or utilise their own database.

By default, ENABLE_EXTERNAL_DB is set to off/false. To enable external Veramo KMS database, set ENABLE_EXTERNAL_DB to true, then define below environment variables in .env file:

  1. EXTERNAL_DB_CONNECTION_URL: PostgreSQL database connection URL, e.g. postgres://<user>:<password>@<host>:<port>/<database>.

  2. EXTERNAL_DB_ENCRYPTION_KEY: Secret key used to encrypt the Veramo key-specific database tables. This adds a layer of protection by not storing the database in plaintext.

  3. EXTERNAL_DB_CERTIFICATE: Custom CA certificate required to connect to the database (optional).

API Authentication using LogTo

By default, the application has API authentication disabled (which can be changed in configuration). If, however, you'd like to run the app with API authentication features, the following variables need to be configured.

We use a self-hosted version of LogTo, which supports OpenID Connect. Theoretically, these values could also be replaced with LogTo Cloud or any other OpenID Connect identity provider.

By default, ENABLE_AUTHENTICATION is set to off/false. To enable external Veramo KMS database, set ENABLE_AUTHENTICATION to true, then define below environment variables in .env file:

  1. Endpoints

    1. LOGTO_ENDPOINT: API endpoint for LogTo server

    2. LOGTO_DEFAULT_RESOURCE_URL: Root of API resources in this application to be guarded. (Default: http://localhost:3000/api on localhost.)

    3. LOGTO_MANAGEMENT_API: URL of management API for LogTo (default is https://default.logto.app/api)

    4. CORS_ALLOWED_ORIGINS: CORS allowed origins used in the app

  2. User-facing APIs

    1. LOGTO_APP_ID: Application ID for the cheqd Studio application in LogTo. This can be set up as type "Traditional Web"

    2. LOGTO_APP_SECRET: Application secret associated with App ID above.

  3. Machine-to-machine backend APIs

    1. LOGTO_M2M_APP_ID: Application ID for machine-to-machine application in LogTo. This is used for elevated management APIs within LogTo.

    2. LOGTO_M2M_APP_SECRET: Application secret

  4. Default role update using LogTo webhooks: LogTo supports webhooks to fire of requests to an API when it detects certain actions/changes. If you want to automatically assign a role to users, a webhook is recommended to be setup for firing off whenever there's a new account created, or a new sign-in.

    1. LOGTO_DEFAULT_ROLE_ID: LogTo Role ID for the default role to put new users into.

    2. LOGTO_WEBHOOK_SECRET: Webhook secret to authenticate incoming webhook requests from LogTo.

  5. Miscellaneous

    1. DEFAULT_CUSTOMER_ID: Customer/user in LogTo to use for unauthenticated users

    2. COOKIE_SECRET: Secret for cookie encryption.

Option 2: Self-custodied (Client-managed mode)

Client-managed mode gives the cheqd Studio user the ability to utilise their own identity keys for signing identity transactions, while still allowing cheqd Studio to manage the CHEQ account keys for writing to the cheqd network. This mode is intended to be used for more production environments where the user signs each identity transaction independently, affording a greater level of security and control to the client.

Full client-managed mode is still in development and we will update this documentation as and when it becomes available

Architecture

Under the hood, cheqd Studio leverages our Veramo SDK Plugin for its identity functionality. Check out our guide on supported SDKs to understand how cheqd Studio fits together with our other Open Source packages.

Alternative: Use an SDK

If you would rather a deeper integration with lower-level packages, instead of REST APIs, take a look at our suite of cheqd supported SDKs below. Each offers a different set of protocols and underlying technical capabilities.

Set Up Your Account

Follow these steps to create your account on cheqd Studio and begin using our APIs securely.

The user is required to Log In to our cheqd Studio portal and then access their API key to authenticate with our APIs. The API key guards the API from unauthorized access and is required for both testing production environments.

Step 1: Get started with cheqd Studio

Head to our cheqd Studio and click Get Started.

Step 2: Create your account

cheqd Studio uses a third party service called LogTo to handle user authentication and login. You can create an account or sign in using:

  • Email and password

  • Google single sign-on

  • Discord login

Click Sign In or Create Account to continue.

Sign into your account
Create a new account

Step 3: Create a new API key and authenticate with cheqd Studio APIs

Once signed in, create an API key from your account dashboard. This key is required to authenticate with cheqd Studio APIs and protects your environment from unauthorized access.

Step 4: Start using cheqd

Get started with our tutorials for cheqd Studio functionality.

Step 5: Select a Billing plan

You will be able to get started for free on our free trial, but following the expiry of the free trial, users need to sign up for a paid billing plan. cheqd Studio billing uses Stripe as a payments processor and users will need to input their card information to initiate a billing plan.

Create AI Agent DID

Use the cheqd MCP server to provision your AI Agent its own DID.

⚠️ Before you begin...

Make sure you have configured the MCP Client as per the setup instructions.

After the MCP server is running and Claude Desktop (or any MCP Client) is connected, you can ask the agent to create a DID just by typing:

Hello agent, can you create a DID on cheqd testnet?

The agent may ask for human input to run the "create-did" MCP tool, please select "yes" or "allow".

What is happening under the hood?

In the background, Claude is communicating with our MCP Server which relays a request to one of our SDKs, Credo. Using Credo, the AI Agent creates itself a DID that conforms to the cheqd DID Method.

Build an AI Agent Trust Registry

Build an AI Agent Trust Registry on cheqd.

Building a Trust Registry for your AI Agent is split into two core flows that are distinct, but also contain some overlapping dependencies:

1

Design and Build of Trust Registry

The Trust Registry is set up using our cheqd Studio APIs. Each ecosystem wanting to use our AI Agent trust registries should plan how the trust chain should be structured.

2

Setup and Configuration of MCP Server

Builders can use the cheqd MCP server to provision an AI Agent its own DID and to provision Verifiable Credentials to the AI Agent's wallet.

✅ Get Started

Get started with the setup of your AI Agent Trust Registry using the guides below:

Learn more about cheqd's Trust Registry model

Read through some of our guides below to getting setup with trust registries on cheqd:

Advanced functionality

Advanced functionality for cheqd's MCP Server.

We have built additional functionality into the MCP Server for other use cases, including:

Import Credential to AI Agent

Accept a JWT Credential into the AI Agent's wallet.

As per our instructions on issuing a verifiable credential to your AI Agent, you can now use the Agent's DID as the subjectDID to create an accreditation for the agent using Cheqd Studio. The response from Step 4 will include a JWT token in the proof section.

Copy the JWT token and ask Claude Desktop (or any your choice of MCP Client) to accept the credential as follows:

Can you accept the credential from this JWT token "eyJhbGciOiJFZ....."

Claude/Client should use the import-credential tool to add this credential to it's wallet as shown below:

What is happening under the hood?

In the background, Claude is communicating with our MCP Server which relays a request to one of our SDKs, Credo. Using Credo, the AI Agent imports a Credential into the identity wallet associated with itself.

Verify a Verifiable Accreditation

Verify Verifiable Accreditations back to a Root of Trust using cheqd Studio.

Users are able to issue Verifiable Accreditations to determine the validity of the accreditation, as well to traverse the trust chain to a root of trust.

Step 1: Issue Accreditation

Make sure you have already created at least one Verifiable Accreditation that you are able to query in the verify API.

Step 2: Use the Verify Accreditation API

Update Bitstring Status List

Update the indices of a Bitstring Status List as a DID-Linked Resource (DLR) on cheqd, using cheqd Studio.

The /credential-status/update/unencrypted API enables users to update the indices of a Status List. This may be useful for revoking Credentials in bulk, rather than submitting individual /credential/revoke requests.

Search for DID-Linked Resources

Search for a DID-Linked Resource (DLR) associated with a cheqd Decentralized Identifier (DID) over REST API, using cheqd Studio.

The /resource/search API allows users to search for specific entries of a Resource on the cheqd Network. For example, if there are multiple Resources associated with the same DID, the search functionality allows applications to make requests only to a specified Resource.

Bulk Update or Rotate Encryption Keys

Publish multiple revocation or suspension updates, or rotate encryption keys using cheqd Studio.

The /credential-status/update/encrypted API enables users to update the indices of a Status List or rotate the encryption keys. This may be useful for revoking Credentials in bulk, rather than submitting individual /credential/revoke requests.

When a new encrypted Status List resource is published, this will also encrypt the latest version with a new set of encryption keys. This may therefore be used to rotate encryption keys, even if the listed indices are kept the same.

Create API Keys

Generate API Keys to securely authenticate with cheqd Studio APIs.

API keys are unique data strings used to authenticate a user and enable access to privileged operations on cheqd Studio APIs. All cheqd Studio APIs use API keys as the mechanism to authenticate client requests. Your API key should be kept confidential and secure at all times.

  • Authentication is required for all API requests; without it, the requests will fail.

  • All API requests must be made over HTTPS.

🚧Keep Your API Keys Safe

Because our API keys allow access to cheqd Studio APIs, you must keep them secure at all times.

  • Ensure your API key is always stored securely as soon as it is initially generated.

  • Make sure to copy your API key into a secure place, such as a Password Manager.

  • Never share it or record it in a publicly accessible medium (client-side code, public repositories, etc.).

Caution: If you lose secure control of your API keys, your entity may not be able to access your created DIDs, DID-Linked Resources or Credential Payments.

Step 1: Sign into cheqd Studio

Follow the tutorial here to get started with your cheqd Studio account.

Step 2: Generate API key

Navigate to the "Developers" tab on cheqd Studio and select "Create an API Key". You are able to choose the expiry date of the API key, and it will automatically be set to expire 1 year from the current date.

Step 3: Use your API key to authenticate with cheqd Studio APIs

Navigate to the "APIs" tab and copy/paste your API key into the API key box towards the top of your page. This will enable you to authenticate with the cheqd Studio APIs, allowing users to use cheqd Studio APIs within their existing Billing Plan and usage limits.

Step 4: Start using cheqd

Get started with our tutorials for cheqd Studio functionality.

Verify a Verifiable Presentation

Verify W3C Verifiable Presentations using cheqd Studio.

A Verifiable Presentation is a collection of multiple Verifiable Credentials that are being presented by a holder to a verifier. In addition to checking whether the Credentials are untampered, Verifiable Presentation verification also checks that the holder subject DID is valid.

Step 1: Obtain Presentation to Verify

To verify a Credential, you can either pass the full VP-JWT string or a JSON object. These can be either obtained from a Verifiable Presentation presented to the user.

Step 2: Configure Verification Parameters

The user is able to set verification parameters to filter whether they want to verify certain aspects of a Presentation, including:

verifyStatus
  • true (indicates that the user wants to verify the Credential Statuses within the Presentatiuon, requiring a credentialStatus property to be present in at least one Credential within the Presentation)

  • false (Default. Indicates that the user does not want to verify the Credential Status.

fetchRemoteContexts

When dealing with JSON-LD type Verifiable Credentials you also MUST provide the proper contexts within a Credential body. Set this to true ONLY if you want the @context URLs to be fetched in case they are a custom context.

  • true

  • false (default)

Step 3: Execute the API

Use the API below to verify a Presentation

Resolve a DID

Resolve a did:cheqd Decentralized Identifier (DID) to fetch the associated DID Document, using cheqd Studio.

Resolving a DID means retrieving the associated DID Document, which contains the public keys, service endpoints, and metadata that describe and verify the identity. In decentralized identity systems, DID resolution is the foundation for:

  • Verifying the authenticity of a DID

  • Retrieving public keys for signature validation

  • Accessing service endpoints (e.g. credential issuance APIs)

  • Dereferencing to DID-Linked Resources (DLRs), such as status lists or trust registries.

A user is able to input a DID (string) as a request format and resolve the DID to fetch the associated DID Document, DID Resolution Metadata and DID Document metadata.

Deactivate a DID

Deactivate a did:cheqd Decentralized Identifier (DID) using cheqd Studio.

Deactivating a DID marks it as no longer active or in use. This process updates the DID Document on the ledger to signal to verifiers, wallets, and other clients that the DID should no longer be trusted for interactions such as credential issuance or presentation.

Once a DID is deactivated:

  • ✅ It cannot be updated again

  • ❌ It cannot be reactivated

  • 🛑 Applications resolving the DID will see its status marked as deactivated


When to Deactivate a DID

You should deactivate a DID when:

  • The associated identity (e.g. organisation, credential issuer) is no longer operating

  • The cryptographic keys have been compromised or rotated to a new DID

  • You want to enforce a clean break with no further updates to the DID Document


Security Requirement

To prevent unauthorized deactivations, a deactivate request must be signed by all of the Verification Method keys listed in the current DID Document.

This ensures that only the current controller(s) of the DID can authorize its deactivation.

🔐 If even one required key is missing or invalid, the request will be rejected.


How to Deactivate a DID

Use the API below to submit a request to deactivate a did:cheqd DID.

Understanding Credential Payments

Learn how cheqd's Credential Payments work.

Build your knowledge about how cheqd's Credential Payment model works, including setting Access Control Conditions, and privacy-preserving payment flows.

Learn about Credential Payments

Get started

Using cheqd Studio, you can get started setting up your encrypted Status Lists with Access Control Conditions below:

t

Search Bitstring Status List

Search and filter for Bitstring Status List DID-Linked Resources (DLRs) using cheqd Studio.

The /credential-status/search API allows users to search for specific entries of a Status List on the cheqd network. For example, if there are multiple Status Lists associated with the same DID, the search functionality allows applications to make requests only to a specified Status List.

Step 1: Set Status List Search Filters

Users are able to filter by:

did (required)

The is the DID of the publisher of the Status List. The Status List entries will be DID-Linked Resources associated with this DID.

statusPurpose

The is the type of Status List to be queried. The options are:

  • revocation

  • suspension

statusListName

The is the name of the Status List. Alongside the statusPurpose, this will uniquely identify a version of the Status List.

Step 2: Hit the API

Execute the filters from Step 1 on the API below:

Resolve a DID-Linked Resource

Resolve a DID-Linked Resource (DLR) on cheqd using the Credo Agent.

The resolveResource method in the Credo cheqd module enables you to retrieve DID-Linked Resources stored on the cheqd network. These resources can be resolved in two primary ways:

Resolution Methods

1. Resolve by Resource ID (UUID)

Use the full DID + /resources/<resourceId> format to directly resolve a known resource.

This approach is ideal when you know the exact UUID of the resource.


2. Resolve by Resource Name and Type

You can also resolve a resource using a DID URL query format with resourceName and resourceType parameters:

This method is useful when:

  • You want to resolve the latest version of a known logical resource

  • You don’t have or track the UUID

3. Fetch the Resource Version Closest to a Specific Time


4. Alternative parameters

For a comprehensive list and detailed explanations of these parameters, refer to .

Revoke a Verifiable Credential

Revoke a W3C Verifiable Credential using cheqd Studio.

Using cheqd's innovative DID-Linked Resource module, cheqd is able to support decentralized and scalable Verifiable Credential revocation and suspension. Using this API, the user is able to choose whether they would like to publish the revocation status to the cheqd ledger or elsewhere.

Step 1: Locate the Credential Body or JWT to be revoked

It is best practice for issuers to keep a record of the Credentials they have issued, including the "statusListIndex" of the Credentials. From this record system, issuers should be able to fetch either the full Credential Body or the JWT proof of the Credential they want to revoke.

Step 2: Decide whether to publish update to the ledger

When revoking a Credential, issuers can decide whether they want to publish an updated Status List on-ledger, with the revoked credential index updated in the bitstring. The parameter below can be changed to reflect this:

publish
  • true (indicates the issuer wants to publish the updated Status List on ledger)

  • false (indicates the issuer wants to manually publish a Status List update)

Step 3: Paste the Credential Body or JWT into the API

Paste the Credential Body or JWT into the API below and execute the API to revoke the Credential.

Token Status List

Get Started

Understanding Token Status List

Token Status List is a specification from the Internet Engineering Task Force, using JSON or CBOR encoded sets of bits and wrapping these as either a JSON Web Tokens (JWTs) or CBOR Web Tokens (CWTs), to comprise a full status list.

The .

Update a DID

Update a did:cheqd Decentralized Identifier (DID) using the ACA-Py Agent.

Follow these instructions to update a did:cheqd DID from ACA-Py Agent.

⚠️ Important...

Your wallet must have the key(s) which were generated when the DID was created, without them signing will fail.

Update DID

To update an existing DID, you must pass the did id and the complete didDocumentin the request body. The main field that is updated using this method os the service object of the DID.

Issue a Verifiable Credential

Ask your AI Agent to issue its own Verifiable Credential to another agent or wallet.

Verify a Credential

Ask your AI Agent to verify a Verifiable Credential that is in its wallet.

await agent.modules.cheqd.resolveResource(
  'did:cheqd:testnet:92874297-d824-40ea-8ae5-364a1ec9237d/resources/6de33634-6439-4e46-aa3f-bfe03606b000'
)
await agent.modules.cheqd.resolveResource(
  'did:cheqd:testnet:92874297-d824-40ea-8ae5-364a1ec9237d?resourceName=exampleTrustRegistry&resourceType=TrustRegistry'
)
await agent.modules.cheqd.resolveResource(
  'did:cheqd:testnet:<uuid>?resourceName=example&resourceType=exampleType&resourceVersionTime=2023-01-01T00:00:00Z'
)
ADR-005

Set up your account

Get started with cheqd Studio, setting up your account and selecting a Billing Plan.

DIDs and Identity Keys

Create did:cheqd DIDs for credential issuers and for DID-Linked Resources

Trust Registries

Create an end-to-end trusted ecosystem, using Trust Chains to build a full Trust Registry.

Payments

Create commercial models for verifiable credentials, such as verifier-pays-issuer

Status Lists

Create status lists, including Bitstring Status List and Token Status List

Credentials

Issue any type of credential, including SD-JWT, VCDM and AnonCreds via our partners, including trust registries, status lists and payments.

Resources

Create custom resources for policies, presentation definitions, schemas and visual representations of credentials

Access Control Conditions

Familiarise yourself with how the Payment gating and Access Control Condition logic works.

Privacy Considerations

Understand how privacy is preserved throughout the Credential Payments flow.

Charge for Status List

Set your payment conditions and encrypt a Bitstring Status List Resource.

Issue Credential with Encrypted Status List

Issue a Verifiable Credential referencing an encrypted Status List in the Credential body.

Verifier pays Issuer

Pay an Issuer directly in CHEQ, meeting the Access Control Conditions. Verify the Credential to view the Status information.

link to the specification may be found here

Create Token Status List

Create a Token Status List JWT or CWT as a DID-Linked Resource on cheqd

Update Token Status List

Update a Token Status List JWT or CWT as a new DID-Linked Resource version on cheqd

Set Up Your Account

Begin your cheqd Studio set up, creating your account, creating an API key and authenticating with our APIs.

Create an API Key

Create your first API Key and authenticate with the cheqd Studio APIs to begin using the identity functionality.

Advanced Configuration Options

Run cheqd Studio yourself or use your own external database.

DIDs and Identity Keys

Create did:cheqd DIDs for credential issuers and for DID-Linked Resources.

Trust Registries

Create an end-to-end trusted ecosystem, using Trust Chains to build a full Trust Registry.

Payments

Create commercial models for verifiable credentials, such as verifier-pays-issuer.

Status Lists

Create status lists, including Bitstring Status List and Token Status List.

Verifiable Credentials

Issue any type of credential, including SD-JWT, VCDM and AnonCreds via our partners, including trust registries, status lists and payments.

DID-Linked Resources

Create custom resources for policies, presentation definitions, schemas and visual representations of credentials.

Credo

Credo is an SDK that is building directly towards supporting the EUDI standards, as well as support for AnonCreds.

ACA-Py

ACA-Py is a quickly expanding SDK, moving from the AnonCreds ecosystem towards wider support for EUDI.

Veramo

The Veramo SDK Plugin is an extension of the Veramo SDK, a JavaScript framework for Trusted Data, adding support for cheqd functionality.

Walt.id Community Stack

Walt.id Community Stack is an SDK that supports the European Architecture and Reference Framework (ARF) standards for identity, with cheqd DID support.

Cover
Cover
Cover
Cover

Setup AI Agent Trust Registry

Use our walkthrough guide to set up a comprenesive AI Agent trust registry using our APIs.

Setup and Configure MCP Server

Use our MCP server walkthrough to configure your remote MCP server, create DIDs and provision credentials.

Decentralized Trust Chains (DTCs)

Take a deep dive into the architecture and model for cheqd's trust registries.

Set up Trust Chain

Set up a generic trust chain using our cheqd Studio APIs.

Get Started with TRAIN

Set up and start using our trust registry valdation engine called TRAIN.

Cover
Cover

cheqd Studio

Click here to sign up for a cheqd Studio plan to get started with creating API keys.

API keys

Create a new API key to authenticate with the cheqd Studio APIs.

DIDs and Identity Keys

Create did:cheqd DIDs for credential issuers and for DID-Linked Resources

Trust Registries

Create an end-to-end trusted ecosystem, using Trust Chains to build a full Trust Registry.

Payments

Create commercial models for verifiable credentials, such as verifier-pays-issuer

Status Lists

Create status lists, including Status List v2021 and Token Status List

Credentials

Issue any type of credential, including SD-JWT, VCDM and AnonCreds via our partners, including trust registries, status lists and payments.

Resources

Create custom resources for policies, presentation definitions, schemas and visual representations of credentials

Create an AnonCreds Schema

Create an AnonCreds Schema as a DID-Linked Resource on cheqd for issuing AnonCreds.

To issue Verifiable Credentials, the issuer will have to first create a Schema and then a Credential Definition.

⚠️ Before you begin...

Make sure you've correctly configured the Credo agent with cheqd.

Import a DID (optional)

In order to register a schema and credential definition, a DID must be added to the agent first. This can be done by calling agent.dids.create(), but this does require an endorser DID to be present as the submitterDid. This is optional, if you have created a DID from the agent before as described here.

Issuer
const seed = TypedArrayEncoder.fromString(`<seed>`) // Secret seed. Should be kept secure in production!
const cheqdDid = 'did:cheqd:testnet:d37eba59-513d-42d3-8f9f-d1df0548b675' // Cheqd DID to be imported

await agent.dids.import({
  did: cheqdDid,
  overwrite: true,
  privateKeys: [
    {
      privateKey: seed,
      keyType: KeyType.Ed25519,
    },
  ],
})

Register a Schema

When you have a registered (or imported) a DID on the network and in your wallet, you can register a schema. Registering a schema requires four fields: issuerId, name, version and attrNames. It is important to note that the issuerId must be the same as a DID in your wallet.

Issuer
const schemaResult = await agent.modules.anoncreds.registerSchema({
  schema: {
    attrNames: ['name', 'degree', 'date'],
    issuerId: '<did>',
    name: 'Example Schema to register',
    version: '1.0.0',
  },
  options: {},
})

if (schemaResult.schemaState.state === 'failed') {
  throw new Error(`Error creating schema: ${schemaResult.schemaState.reason}`)
}

Parameters

schema (mandatory)

"attrNames": Array of attributes for the schema definition.

"issuerId": Issuer DID, use the did created by the Issuer.

"name": Name of the Schema

"version": Version of the Schema (To update existing Schema, use same name and different version)

options (optional)

Optional Key-Value pairs of additional options.

Create an AnonCreds Credential Definition

Create an Credential Definition as a DID-Linked Resource on cheqd for issuing AnonCreds.

Register a Credential Definition

After registering a schema, a credential definition can be registered based on the schema. The credential definition, amongst more things, binds the schema to a specific issuer. Schemas can be reused between issuers, but a credential definition is specific to an issuer. In a credential definition revocation can also be specified. This section will not go in-depth about revocation.

Issuer
const credentialDefinitionResult = await agent.modules.anoncreds.registerCredentialDefinition({
  credentialDefinition: {
    tag: 'default',
    issuerId: '<did>',
    schemaId: schemaResult.schemaState.schemaId,
  },
  options: {
    supportRevocation: false,
  },
})

if (credentialDefinitionResult.credentialDefinitionState.state === 'failed') {
  throw new Error(
    `Error creating credential definition: ${credentialDefinitionResult.credentialDefinitionState.reason}`
  )
}

The request body must contain the credential_definition object with the Issuer DID and the Schema ID created in the previous steps.

To enable revocation, the options must contain the revocation flag, and the size of the revocation registry. Also, ensure that a Tails Server is configured for the issuer.

Parameters

credential_definition (mandatory)

"issuerId": DID of the Issuer.

"schemaId": The AnonCreds Schema ID created by the Issuer (must be of the same DID).

"tag": Additional Name to identify the Credential Definition.

options (optional)

"support_revocation": Boolean value to indicate that the Credential can be revoked or not. (Tails server must be configured if this is set to `true`)

"revocation_registry_size": Maximum size of the Revocation Registry.

Deactivate a DID

Deactivate a did:cheqd DID using the Credo Agent.

This guide explains how to deactivate a did:cheqd using a configured Credo Agent. Deactivating a DID marks it as no longer usable but does not remove it from the ledger — the DID can still be resolved and its deactivated state will be reflected in its metadata.

Prerequisites

Before deactivating a DID, ensure that:

  • The Credo agent is configured with cheqd support

  • The DID you are deactivating was created and is controlled by your agent

  • You have access to the signing key used to authorize DID updates

Behavior of Deactivated DIDs

  • Deactivated DIDs remain resolvable

  • DID resolvers will indicate that the DID is deactivated

  • The DID and its associated document become immutable and non-functional

  • Deactivation is permanent

Parameters

Parameter
Required
Description

did

✅

The full did:cheqd identifier you wish to deactivate

options

❌

Optional settings, including a versionId to track the update

Example: Deactivate a cheqd DID

await agent.dids.deactivate({
  did: 'did:cheqd:testnet:b84817b8-43ee-4483-98c5-f03760816411',
  options: {
    versionId: '3.0', // Optional: for tracking version history or audit purposes
  },
})

Notes

  • The optional versionId parameter allows you to assign a custom version identifier to the deactivation transaction

  • Once deactivated, the DID cannot be updated, reactivated, or used for issuing credentials

  • You can still resolve the DID to verify its deactivated status via the deactivated: true metadata

Issue Verifiable Accreditation

Issue a Verifiable Accreditation as a DID-Linked Resource from an "issuer" DID to a recipient "subject" DID.

Create a Subject DID

Create a 'Holder' or 'Subject' Decentralized Identifier (DID), of method did:key using cheqd Studio.

In decentralized identity systems, Holders (also referred to as Subjects) are the recipients of Verifiable Credentials—typically representing individuals, organisations, objects or devices.

To enable credential interactions such as receiving, presenting, and proving control over an identity, each Holder needs a unique cryptographic key pair. This key pair is used to create a Decentralized Identifier (DID) that represents their identity.


Use Cases for Holder Identity Keys

After generating a key pair using the API below, you can use it to:

  • ✅ Generate a did:key identifier, an off-ledger, self-contained DID that is ideal for lightweight identity use cases


Why Use did:key for Holders?

The did:key method is a simple, deterministic DID method that embeds the Holder’s public key directly into the DID itself. It doesn’t require blockchain anchoring, making it:

  • ⚡ Fast and lightweight – no on-ledger operations required

  • 🔐 Privacy-preserving – good for ephemeral or throwaway identifiers

  • 🧪 Useful for testing and interoperability – widely supported by wallets and agent frameworks

  • 🧍 Ideal for Holder/Subject identities – where the main role is to receive and present credentials rather than issue them

Many ecosystems choose did:key for wallet-based identities, while keeping issuer DIDs on-ledger (e.g. did:cheqd) to ensure resolvability and public trust.

Take a deeper look into the did:key specification here:

Note that there are also perfectly valid use cases for using a did:cheqd DID for a 'Holder' or 'Subject' DID as well, where it is valuable to have the 'Holder' / 'Subject' identifiable on-chain.

For example, AI Agents, Organisations or products in a supply chain are good use cases for using did:cheqd.

This is because the 'Holder' / 'Subject' does not have Personally Identifiable Information (PII) associated with it.


Get Started

To create a did:key DID, you can generate an identity key pair using the API below on cheqd Studio.

Verify a Credential

Tutorial: Verify a Credential using MCP Toolkit

Follow these instructions to Verify a Credential from your MCP Client (e.g. Claude Desktop) using the MCP Toolkit.

⚠️ Before you begin...

Make sure you have configured the MCP Client as per the setup instructions and issued a Credential from the same MCP Client.

Step 1: Create Connection between Holder and Claude Desktop.

If the connection was disrupted, create a new connection between the Holder and Claude Desktop.

Step 2: Ask Claude to issue a Proof Request

Ask Claude to issue a proof request with some conditions based on the attributes of your credential.

For this tutorial, we asked Claude to generate a proof request with score > 50.

Step 3: Holder checks Request and sends Proof

The next steps are at the Holder Agent side to accept the proof request and send the response. It can be simulated by running the following APIs in sequence from the Holder API at http://localhost:4001/api/doc or Postman.

Parameters

To narrow down the latest proof request, pass the following parameters

limit

Set this to 10.

offset

set this to 0.

state

Set this to "request-received"

Copy and save the pres_ex_id and the proof request by_format.pres_request.anoncreds from the response.

Fetch the relevant credentials and then create a proof response. Send the proof response by calling the below API.

Request Body

For this tutorial, as the credential is AnonCreds, we are sending an AnonCreds proof in the body. The values will be based on the presentation request and the credentials retrieved in the previous two steps.

{
    "anoncreds": {
        "requested_attributes": <<requestedAttributes>>,
        "requested_predicates": <<requestedPredicates>>,
        "self_attested_attributes": {}
}

Step 4: Ask Claude to validate the Presentation Response

Finally, you can ask Claude to check the status of the Proof Request with the following prompt.

"Can you check the status of the proof request?"

Claude should get the latest status and summarise if the verification result was true or false.

Verify a Verifiable Credential

Verify a W3C Verifiable Credential using cheqd Studio.

Once you have issued your credential and have a JWT as part of the credential proof, you can use the /credential/verify API to check that the JWT has not been tampered.

Step 1: Obtain Credential to Verify

To verify a Credential, you can either pass the full Credential body or the JWT proof. These can be either obtained from a Credential that has been issued or from a Verifiable Presentation presented to the user.

Step 2: Configure Verification Parameters

The user is able to set verification parameters to filter whether they want to verify certain aspects of a Credential, including:

verifyStatus
  • true (indicates that the user wants to verify the Credential Status, requiring a credentialStatus property to be present in the Credential)

  • false (Default. Indicates that the user does not want to verify the Credential Status.

fetchRemoteContexts

When dealing with JSON-LD type Verifiable Credentials you also MUST provide the proper contexts within a Credential body. Set this to true ONLY if you want the @context URLs to be fetched in case they are a custom context.

  • true

  • false (default)

Step 3: Pass the Credential to the API

Simply paste the JWT or the full credential body into the request field of the /credential/verify API, and the API will give you a response including the following verification policies:

  1. Whether the Credential has been tampered

  2. Whether the Credential has a valid issuance date

  3. Whether the Credential has expired

  4. Whether the Credential Status is valid

Issue Credential with Encrypted Status List

Understand how to issue a W3C Verifiable Credential including an encrypted Status List in the body.

Issuers are able to add encrypted Status Lists to the body of the Credential if they have previously created an Encrypted Status List on-ledger.

Step 1: Set up your account

Make sure you have set up your account with cheqd Studio and are logged in, using our guide below:

Step 2: Create an Issuer DID

Before you can create an encrypted Status List for charging for Credentials, you need to create a DID which is used to link the Status List on-ledger. Use the API in the page below to create a DID:

Step 3: Create an Encrypted Status List

Follow the tutorial here to create an encrypted Status List with a set of Payment Conditions to unlock:

Step 4: Specify the encrypted Status List within Credential body

Follow the instructions within the /credential/create API below to format and issue a Verifiable Credential.

Ensure that the "statusListName" and "statusPurpose" are the same as the Status List created in Step 3. This makes sure that if the Credential Status is changed, for example, if it is revoked or suspended, the correct Status List will be updated.

Setup Verida Wallet

Setup your Verida Wallet to receive W3C Verifiable Credentials.

cheqd Studio currently is setup to work with the Verida Wallet. In 2025, we will be building compatibility with a full suite of other digital identity wallets.

Verida Wallet

Subject DID

On the "Profile" tab, you will see your did:vda address under the section "DID".

For example: "did:vda:testnet:0xD7477C4a75143Af16A967381d09650A533Bd0DD7"

Rendering credentials

Credentials stored with the credential schema will automatically be rendered in the Verida Wallet as a credential. This custom display includes:

  1. A scannable QR code

  2. The profile icon of the Verida DID that issued / signed the credential

  3. A tick of approval indicating the credential has been verified

Issue a Verifiable Credential

Tutorial: Issue a Verifiable Credential using MCP Toolkit

Follow these instructions to Issue a new Credential from your MCP Client (e.g. Claude Desktop) using the MCP Toolkit.

⚠️ Before you begin...

Make sure you have configured the MCP Client as per the setup instructions.

Step 1: Start your Holder Agent

Our docker-compose file contains "demo" profile, which includes a Holder ACA-py Agent setup. Start the Holder Agent with the following command

// from mcp-toolkit folder 
cd docker
docker compose --profile demo up -d

Step 2: Create Connection between Holder and Claude Desktop.

Although, either agents can start the connection, in this tutorial we will start the invite from Holder.

Open the Holder API at http://localhost:4001/api/doc or use Postman, to create a new connection request. Copy the invitation_url from the response.

Parameters and Request Body

For automated acceptance, pass the following parameters:

auto_accept

Set this to true.

A simple request body is below:

{
    "alias": "Faber",
    "handshake_protocols": ["https://didcomm.org/didexchange/1.1"],
    "use_public_did": false,
    "my_label": "Invitation to Faber"
}

Step 3: Claude Desktop accepts the invitation

Go to Claude Desktop, and accept the connection by pasting the invitation_url value.

Always "Allow for this chat" or "Allow once" when the prompt appears. This is a security feature to have human interaction for MCP tools.

Step 4: Ask Claude to issue a Credential

Now you can ask Claude Desktop to issue a Credential Offer to the connection. Claude will interpret the message automatically and do all the steps necessary to issue a Credential Offer.

For this tutorial, we asked Claude to create a credential offer with score as 80 and subject as Mathematics.

When all the steps are completed, a Credential Offer will be sent to Holder agent.

Step 5: Holder accepts and stores the Credential.

The rest of the steps are from the Holder to accept the credential offer and store the credential. This can be achieved by the following API Calls from the Holder API at http://localhost:4001/api/doc or Postman.

Parameters

Filter on "offer-received" state

state

Set this to "offer-received".

Copy and save the cred_ex_id from the response and pass that in the next request to Accept the Offer.

Now, store the received Credential into the Holder wallet.

Create Identity Keys

Create a standalone public/private keypair, used to create Decentralized Identifiers (DIDs), using cheqd Studio.

In decentralized identity systems, all actors—whether Issuers, Holders, or Verifiers—require cryptographic keys to prove control over a Decentralized Identifier (DID) and to sign or verify interactions (e.g. credential issuance or presentation).

This tutorial guides you through generating a key pair that can be used to:

  • ✅ Create a new DID (e.g. did:cheqd or did:key)

  • ✅ Import into cheqd Studio for identity operations

  • ✅ Use directly in SDKs or agent frameworks that support key-based identity


Why Identity Keys Matter

DIDs are built on public-private key cryptography. The public key is embedded in or referenced by the DID Document, while the private key remains securely held by the actor controlling the identity.

Without keys, you can’t:

  • Create a DID

  • Authenticate or prove control of an identity

  • Sign or verify credentials and presentations

  • Rotate or deactivate identifiers


Step 1: Choose Your Key Type

cheqd Studio supports two cryptographic key types for identity operations:

Key Type
Use Case / Notes

Ed25519

The default and recommended key type for most DID and Verifiable Credential operations. Fast, secure, and widely supported across agent frameworks.

secp256k1

A widely adopted elliptic curve used in blockchain ecosystems (e.g. Bitcoin, Ethereum). Useful for cross-chain identity interoperability or aligning with Web3 wallets.

✅ Choose Ed25519 for identity-specific use cases. Use secp256k1 if you need compatibility with blockchain-based tooling, wallets, or ecosystems that already rely on this curve.

Step 2: Hit the API below

Use the API below to create and generate your new identity key pair of either type Ed25519 or secp256k1.

Step 3 (Alternative): Fetch Identity Key Details

If you've already generated a key pair using cheqd Studio and want to retrieve, reference or use it later, you can do so by referencing its Key ID (kid). This is useful for:

  • Recovering key material generated earlier (e.g., to construct a DID or sign a credential)

  • Working with shared or externally provisioned keys

  • Avoiding duplicate key creation when managing identities programmatically

Suspend or Unsuspend a Verifiable Credential

Suspend or unsuspend a W3C Verifiable Credential using cheqd Studio.

Users are also able to suspend Verifiable Credentials. The difference between revocation and suspension is that suspended Credentials may be unsuspended at a future date; whereas, revoked credentials are permanently revoked.

Step 1: Locate the Credential Body or JWT to be suspended

It is best practice for issuers to keep a record of the Credentials they have issued, including the "statusListIndex" of the Credentials. From this record system, issuers should be able to fetch either the full Credential Body or the JWT proof of the Credential they want to suspend.

Step 2: Decide whether to publish update to the ledger

When suspending a Credential, issuers can decide whether they want to publish an updated Status List on-ledger, with the suspended credential index updated in the bitstring. The parameter below can be changed to reflect this:

publish
  • true (indicates the issuer wants to publish the updated Status List on ledger)

  • false (indicates the issuer wants to manually publish a Status List update)

Step 3: Paste the Credential Body or JWT into the API

Paste the Credential Body or JWT into the API below and execute the API to suspend the Credential.

Unsuspend (reinstate) Verifiable Credentials

If a Credential has been suspended, and an Issuer wants to unsuspend the Credential to make it once again valid, the Issuer can reinstate a suspended Credential.

Step 1: Locate the Credential Body or JWT to be unsuspended

It is best practice for issuers to keep a record of the Credentials they have issued, including the "statusListIndex" of the Credentials. From this record system, issuers should be able to fetch either the full Credential Body or the JWT proof of the Credential they want to unsuspend.

Step 2: Decide whether to publish update to the ledger

When unsuspending or reinstating a Credential, issuers can decide whether they want to publish an updated Status List on-ledger, with the unsuspended credential index updated in the bitstring. The parameter below can be changed to reflect this:

publish
  • true (indicates the issuer wants to publish the updated Status List on ledger)

  • false (indicates the issuer wants to manually publish a Status List update)

Step 3: Paste the Credential Body or JWT into the API

Paste the Credential Body or JWT into the API below and execute the API to unsuspend the Credential.

Bitstring Status List

Get started

Understanding Bitstring Status List

The Bitstring Status List supported in cheqd Studio utilise bitstrings to represent whether a Verifiable Credential has been suspended/revoked or not. A bitstring can be thought of as a long list of 1s and 0s, where, if the binary value of the position in the list is 1 (one), the verifiable credential is revoked, if it is 0 (zero) it is not revoked.

Graphic showing the StatusList2021 bitstring

Figure 1: Graphic showing the Bitstring Status List bitstring

Each issued Credential correlates with a position and index on the bitstring, so that a verifier will be able to correlate the value within the Credential against the public bitstring to ascertain whether the Credential has been revoked or not, using a validate algorithm as well as a bitstring expansion algorithm.

Where is the StatusList usually published?

The issuer keeps a bitstring list of all Verifiable Credentials it has issued. The Status List is usually published by the issuer in the format of its own Verifiable Credential. This Verifiable Credential is generally hosted publicly on a centralised server or domain to enable third-party read-access.

Where does cheqd store the Status List?

cheqd stores each Status List and subsequent entries on-ledger as DID-Linked Resource versions. This has notable benefits, including the provenance, legitimacy and security of the Status List. For a full list of benefits, see the context for creating DID-Linked Resources.

Validate AI Agent Trust Chain

Verify and validate your AI Agent's trust with cheqd's MCP server and TRAIN.

⚠️ Before you begin...

Make sure you have configured the MCP Client as per the setup instructions.

To validate your AI Agent, you can simply use the whois prompt provided by the Cheqd MCP Server.

Then Click "Send" button without writing any other prompt:

You can also use /<mcp-server-name>:whois if using a CLI client:

The response should be similar to below. Claude/Client should use list-credentials to get the latest credentials from Agent's wallet, and then use verify-trust-registry tool to verify the credential.

Then present a summary of the credential:

Learn more about what's happening under the hood:

Under the hood, the MCP Server is using our trust registry validation engine called TRAIN to recursively verify the issuer of the credential, up to a root of trust.

If you do not want to use MCP, you can build and validate cheqd Trust Registries in any alternative application using our more generalised tutorials.

Read more about our Decentralized Trust Chain (DTC) approach and how TRAIN works below:

Decentralized Identifiers (DIDs)

Create Decentralized Identifiers (DIDs) on cheqd using Credo.

A Decentralized Identifier "DID" is a globally unique identifier that does not require a centralized registration authority because it is registered with distributed ledger technology or other form of decentralized network.

Learn about DIDs If you want to learn about what DIDs are, please go over to our learning site here.

Get started

Alternatives

Below are a list of alternatives for creating cheqd DIDs.

Update Token Status List

Update a Token Status List JWT or CWT as a new DID-Linked Resource (DLR), using cheqd Studio.

Step 1. Manually create your new Status List JWT/CWT and save the file locally

Create a JWT or CWT file with the updated indices and bits for the updated Status List.

Non-normative example for a Status List Token in JWT format
{
  "alg": "ES256",
  "kid": "12",
  "typ": "statuslist+jwt"
}
.
{
  "exp": 2291720170,
  "iat": 1686920170,
  "iss": "https://example.com",
  "status_list": {
    "bits": 3,
    "lst": "eNrbuRgAAhcBXQHutdpRiBFREinSjQfeTpXmdQfwefegD"
  },
  "sub": "https://example.com/statuslists/1"
}
Non-normative example for a Status List Token in CWT format (not including the type header yet)
d28453a20126106e7374617475736c6973742b637774a1044231325860a502782168
747470733a2f2f6578616d706c652e636f6d2f7374617475736c697374732f310173
68747470733a2f2f6578616d706c652e636f6d061a648c5bea041a8898dfea19fffe
56a2646269747301636c73744a78dadbb918000217015d58400f2ca3772e10b09d5d
6ed56461f7cba1a816c6234072d1bb693db277048e5db5a4e64444492a9b781d6c7a
c9714db99cc7aadb3812ec90cab7794170bab5b473

Save this file locally and call it something like statusListTokenUPDATED.json

Note that each JWT or CWT must be below ~45kb in size.

Step 2: Encode the updated file

Prepare a file with resource and encode it into base64, base64url or hex. On Unix systems, you can use the following command input:

$ base64 -w 0 resource.json
<path-to-the-resource-file>

Expected output:

$ base64 -w 0 resource.json
HfSynOpmBrhgfYguING

Step 3: Set the same Resource Name and Type

To create a new version you must use the same "name" and "type" for your resource, and ensure that the new Token Status List resource is being created underneath the same DID as your initial DID. You will also need to be logged into the same cheqd Studio account that you used to create the initial Token Status List to have access to the keys to sign the update.

For Token Status Lists, the "type" MUST be: "TokenStatusList".

For example:

{
    "data": "HfSynOpmBrhgfYguING",
    "encoding": "base64url",
    "name": "DegreeCredentialStatus",
    "type": "TokenStatusList"
}

Step 4: Populate the request inputs and hit the API

AnonCreds

Issue, present and revoke AnonCreds signed by cheqd Decentralized Identifiers (DIDs), using Credo.

AnonCreds is a privacy-preserving Verifiable Credential format designed for selective disclosure, non-correlatable presentations, and revocation support. In Credo, AnonCreds is fully supported using the Issue Credential v1/v2 and Present Proof v1/v2 protocols.

Credo allows users to issue, hold, and verify AnonCreds credentials using a range of supported ledgers—including full integration with the cheqd network, a modern, scalable alternative to legacy Indy-based networks.

Get started

Issue, present and revoke AnonCreds signed by cheqd Decentralized Identifiers (DIDs), using the tutorials below:


Why Use AnonCreds?

AnonCreds credentials are purpose-built for high-assurance, privacy-respecting use cases that require:

  • Selective disclosure of individual claims

  • Zero-knowledge proofs

  • Revocation support via AnonCreds Status Lists

  • Credential definitions and revocation registries anchored on-ledger


AnonCreds + cheqd Support

Credo now supports did:cheqd for issuing AnonCreds credentials using the cheqd AnonCreds Object Method. This removes dependency on Indy-based networks while retaining the proven AnonCreds credential exchange flow.

With Credo + cheqd, you can:

  • ✅ Register did:cheqd identifiers for use in credential issuance

  • ✅ Publish Schemas and Credential Definitions as DID-Linked Resources

  • ✅ Issue and verify AnonCreds credentials signed with did:cheqd

  • ✅ Enable revocation using AnonCreds Status List Definitions and Entries, also stored on-ledger as DID-Linked Resources

✅ This allows developers to migrate off the deprecated Sovrin network or other Indy networks without changing their existing flows or protocols.


Features Supported in Credo

Feature
Supported in ACA-Py

Issue AnonCreds credentials

✅ Yes

Present and verify credentials

✅ Yes

Revocation support via cheqd AnonCreds Status Lists

✅ Yes

DID-Linked Resource anchoring (schemas, defs, status)

✅ Yes

Use did:cheqd for AnonCreds

✅ Yes

Use other Indy-compatible ledgers

✅ Yes

AnonCreds Object Method

Take a deep dive into the cheqd AnonCreds Object Method below:

Understanding DID-Linked Resources

Understanding the context and construction of DID-Linked Resources (DLRs) on cheqd.

Overview

Our objective in building DID-Linked Resources on cheqd is to improve the way resources are stored, referenced and retrieved for our partners and the broader SSI community, in line with the existing W3C DID Core standard.

Contents

Read the guides below to understand the context, rationale and design decisions involved in the DID-Linked Resource (DLR) implementation on cheqd.

Architecture for DID-Linked Resources

If you are interested in diving into the full architectural decisions for DID-Linked Resources, head to our ADR and the emerging W3C specification.

As a general architectural overview for DID-Linked Resources, see the diagram below:

Support for AnonCreds using DID-Linked Resources

One of the functions of DID-Linked Resources is enabling support for AnonCreds on cheqd, where previously these were tied into the Hyperledger Indy ecosystem. Take a look at our AnonCreds documentation here:

Deactivate a DID

Deactivate a did:cheqd Decentralized Identifier (DID) using the ACA-Py Agent.

Follow these instructions to deactivate a did:cheqd DID from ACA-Py Agent.

⚠️ Important...

Your wallet must have the key(s) which were generated when the DID was created, without them signing will fail.

Deactivate DID

To deactivate an active DID, pass the didid in the request body, with any additional optionsthat you may have configured.

Create a DID

Create a did:cheqd Decentralized Identifier (DID) using the ACA-Py Agent.

Follow these instructions to create a new DID from ACA-Py Agent and publish the associated DID Document on cheqd ledger.

⚠️ Before you begin...

Make sure you've correctly configured the cheqd plugin's agent settings for ACA-Py.

For wallet storage, utilise a Postgres database to ensure key persistence, enabling future updates to the DID.

Create DID

Populate the various optionsand featuresin the JSON request body and call the API to create the DID.

Request Body

These are the variables that can be passed in the Body:

features (optional)

Optional Object with Key-Value format for additional features of the new DID. This is for future use.

options (optional)

Optional Object with Key-Value format for additional configuration options, recommendations below:

"network": testnet or mainnet

"key_type": "ed25519" or "bls12381g2"

List DIDs associated with your wallet

After creating a DID or multiple DIDs, users can list all the created DIDs associated with their wallet. Using the /wallet/did API.

Charge for Verifiable Credentials

Charge for Verifiable Credentials using encrypted DID-Linked Resources (DLRs) with Access Control Conditions, and build Verifier-pays-Issuer payment flows.

Credential Payments brings a significant evolution to the Verifiable Credentials landscape, allowing verifiers to directly pay issuers to unlock Credential Status information. Underneath the hood, we've engineered a robust and secure payment flow that streamlines the end-to-end payment process, with accuracy, speed, and cryptographic integrity.

Get started

Create encrypted Status Lists on-ledger, and pay to unlock the Access Control Conditions in CHEQ, using our cheqd Studio Payments APIs:

Learn more

Build your understanding of How Credential Payments work, including Access Control Conditions and how the model preserves privacy.

Alternatives

Below are a list of alternatives for using Credential Payments.

Update a DID

Update a did:cheqd Decentralized Identifier (DID) using cheqd Studio.

Users are able to update DID Documents for various reasons, such as to include a new section (such as service) or to rotate the verificationMethod or authentication keys within the DID Document.

With the /did/update API, users are able to input either:

  1. The specific section(s) of the DID Document to be updated; or

  2. The full updated DID Document body.

For the /did/update function, users are recommended to use the application/json request format for the API.

Example Request formats

Update Service Section

To update individual sections of the DID Document, users are able to pass only the section they would like to update. For example, users may often want to update the service section to add or change a serviceEndpoint:

The above request format will replace the service section of the existing DID Document with the new section. No extra information, such as the verificationMethod or authentication keys need to be passed with the request, because cheqd Studio custodies the keys on behalf of the user.

Rotate Keys

Users may regularly want to rotate the keys used to control the DID. Like with the service section above, users are able to pass the sections of the DID Document that include the rotated keys, usually contained within theverificationMethod and authentication sections.

Other sections such as keyAgreement, capabilityInvocation, capabilityDelegation, assertionMethod, etc. may also be updated via this method

The example above will rotate the keys that control the DID Document, updating the DID Document's verificationMethod and authentication sections accordingly.

Any top level section of the DID Document may be updated this way, including the likes of alsoKnownAs, assertionMethod, capabilityDelegation, etc.

Pass full updated DID Document body

Users may alternatively want to update the DID Document body in full, and pass the updated DID Document to the API. For example:

This method may be better for users wanting to update larger portions of the DID Document, or for having full visibility over the updated body.

Get started with the API below

Use the /did/update API below to pass your DID Document update as a request, using either the full body or a specific section.

Build Trust Registries

Build and validate Decentralized Trust Chains, using cheqd Decentralized Identifiers (DIDs) and Verifiable Accreditations stored as DID-Linked Resources (DLRs).

Trust Registries enable a Relying Party to determine the authenticity and authorization of a legal entity within a digital credential ecosystem. Trust Registries are crucial to establish for production environments, because they allow relying parties to make informed decisions on whether to trust the credentials they receive.

cheqd has pioneered a industry-leading trust registry solution, allowing users to create hierarchical chains of trust, with each trust registry entry being DID-Resolvable.

cheqd’s Trust Registry Model

cheqd offers an industry-leading, decentralized trust registry solution, allowing issuers to be accredited through hierarchical chains of trust called Decentralized Trust Chains (DTCs). Each entry in the registry is:

  • ✅ DID-resolvable

  • 📜 Cryptographically signed and verifiable

  • 🌍 Publicly discoverable using DID-Linked Resources

  • 🔗 Linked to governance frameworks

Learn about cheqd Trust Registries

cheqd enables you to build Decentralized Trust Chains — a powerful model for structuring trust in credential ecosystems without relying on centralized authorities or static whitelists.

Using cheqd’s flexible DID and DID-Linked Resource architecture, trust is established through a chain of cryptographically verifiable credentials:

  • Root Authorisations define the governance framework and root of trust

  • Verifiable Accreditations delegate authority to trusted organisations

  • 🏷Verifiable Attestations (Credentials) are issued by accredited entities to end users

Each link in the chain is publicly resolvable, tamper-evident, and policy-bound — forming a complete lineage of trust from issuer to root authority.

Before you begin building, we recommend familiarising yourself with how Decentralized Trust Chains work and the role of each credential type:

Get started

Use cheqd Studio APIs to define, issue, and publish trust registry entries:

  • Create and manage Root Authorisations, Accreditations, and Attestations

  • Resolve trust chains in real time using standard DID resolution

  • Anchor trust registries on-chain while keeping business logic off-chain

For verification, use TRAIN to validate the trust registry to determine whether an issuer DID is accredited, and what they are accredited for — by traversing the full trust chain to its root.

Create a DID-Linked Resource

Create a DID-Linked Resource (DLR) on cheqd using the Credo Agent.

The createResource method from the Credo cheqd module allows you to create a DID-Linked Resource and publish it to the cheqd network under a did:cheqd identifier.

DID-Linked Resources are uniquely identified by a UUIDv4 resource ID and persistently attached to the DID on-chain. These resources can later be resolved by ID or query parameters (e.g., resourceName, resourceType).

Required Parameters

Field
Required
Description

Example

💡 The id field must be a UUIDv4. You are responsible for generating and tracking this ID.

Recommendations

  • Ensure the id is a UUIDv4, generated using a reliable UUID library (e.g., uuid in Node.js)

  • Keep resourceName and resourceType descriptive but concise — they are used for resolution

  • If the resource data is sensitive or large, consider encoding as a base64 string

  • Use version to manage changes to the resource over time

Create Status Lists

Create, update and fetch Status Lists on cheqd, stored as DID-Linked Resources (DLRs).

Status Lists are generally sets of indices which can be used to mathematically derive whether an issued Credential has been revoked, suspended or is still valid. Status Lists are crucial for verifier applications to determine whether to accept a credential, presented by a holder.

What options do I have for creating status lists on cheqd?

There are many different ways to create status lists on cheqd, with options for easy integration (e.g. cheqd Studio) and more bespoke integrations (e.g. Credo and Veramo). Below are a list of options for creating cheqd DIDs.

Get started with cheqd Studio

There are two predominant Status List formats supported in cheqd Studio. Please choose a Status List type below to get started.

Present a Verifiable Credential

Present a Verifiable Credential, signed by a did:cheqd Decentralized Identifier (DID), using Credo.

Verifiable Credentials signed by a did:cheqd can be securely presented using the AnonCreds proof format and the Present Proof Protocol v2 within the Credo framework. This enables trust-minimised, selective disclosure of credential data between a Holder and a Verifier.

Prerequisites

Before presenting a credential:

  • A Verifiable Credential must have been issued and accepted by the Holder

  • A Credo Agent is running for both the Verifier and the Holder

  • A DIDComm connection exists between Holder and Verifier (via OOB or another method)

  • Both agents are configured with:

    • @credo-ts/anoncreds

    • @credo-ts/didcomm

Step 1: Create a Connection with Holder

Use any supported method to create a connection with the Holder. Automated is recommended. You can follow the same steps as described in .

Step 2: Send Proof Request

After connection is established, the Verifier can send a proof request to the Holder.

Step 3: Holder sends Presentation Proof

Holder can get the stored credentials from own wallet and format a proof to send to the Verifier.

When we want to send a proof, we have to listen to incoming proof requests and handle accordingly. In this example we do not have any user interaction, but is likely that your application would have a user-interface which would display the request.

What’s Happening Behind the Scenes?

  • The Verifier sends a proof request with specific attributes and credential requirements

  • The Holder uses locally stored credentials to generate a selective disclosure proof

  • The proof is signed using AnonCreds and returned to the Verifier over DIDComm

  • The Verifier cryptographically validates the proof and the issuing DID (did:cheqd)

Next Steps

For more tutorials and examples, visit .

Set Up Your Account

Set up your account with cheqd Studio and log in to start using the APIs.

Create an Issuer DID

Create a W3C conformant DID on cheqd using the did:cheqd DID Method.

Charge for Status List

Create an encrypted Status List on-ledger with Payment Conditions to unlock, to charge for unlocking Status Lists.

Issue Credential

Issue a W3C conformant Verifiable Credential using the cheqd Studio APIs.

Issue AnonCreds Credentials

Issue AnonCreds Credentials signed by cheqd DIDs using Credo.

Present AnonCreds Credentials

Present AnonCreds Credentials using Credo.

cheqd AnonCreds Object Method

Understand how cheqd supports AnonCreds Objects using DID-Linked Resources.

did

✅

The did:cheqd identifier under which the resource is created

id

✅

A UUID string that acts as the permanent resource ID

name

✅

A human-readable resource name

resourceType

✅

A short type identifier (e.g. TrustRegistry, Logo, StatusList)

data

✅

The content to store (object, Base64-encoded string, or plain text)

version

❌

Optional semantic version string (e.g. "1.0")

alsoKnownAs

❌

Optional array of aliases for the resource

await agent.modules.cheqd.createResource(
  'did:cheqd:testnet:92874297-d824-40ea-8ae5-364a1ec9237d',
  {
    id: '6de33634-6439-4e46-aa3f-bfe03606b000',
    name: 'exampleTrustRegistry',
    resourceType: 'TrustRegistry',
    version: '1.0',
    data: {
      name: 'Example Org',
      jurisdiction: 'EU',
    },
  }
)
Verifier/Issuer
await this.agent.modules.proofs.requestProof({
  protocolVersion: 'v2',
  connectionId: connectionRecord.id,
  proofFormats: {
    anoncreds: {
      name: 'proof-request',
      version: '1.0',
      requested_attributes: {
        name: {
          name: 'name',
          restrictions: [
            {
              cred_def_id: this.credentialDefinition?.credentialDefinitionId,
            },
          ],
        },
      },
    },
  },
})
Holder
this.agent.events.on(ProofEventTypes.ProofStateChanged
  async ({ payload }: ProofStateChangedEvent) => {
    if (payload.proofRecord.state === ProofState.RequestReceived) {
      const requestedCredentials = await this.agent.modules.proofs.selectCredentialsForRequest({
        proofRecordId: payload.proofRecord.id,
      })
      await this.agent.modules.proofs.acceptRequest({
        proofRecordId: proofRecord.id,
        proofFormats: requestedCredentials.proofFormats,
      })
    }
})
out-of-band protocol
Issue a Verifiable Credential
Credo Docs

Charge for Status List

With Credential Payments, Issuers are able to create payment-gated Status Lists in order to charge for the verification of Credential Status information.

Issue Credential with Encrypted Status List

Issue a Verifiable Credential referencing an encrypted Status List in the body, with a specified bitstring index.

Verifier pays Issuer

Understand how a Verifier pays an Issuer in CHEQ to unlock Status List and verify Credential Status.

Bulk Update or Rotate Encryption Keys

Update a set of Credential indices or rotate the encrypted symmetric key for the Status List.

Understanding Credential Payments

Before diving into Credential Payments, developers may want to learn how the Payment gating and Access Control condition logic works.

Why are we payment gating Status Lists?

Learn about the role of cheqd in Trusted Data Markets and why we are payment gating the "reputability" of Credentials.

Cover

Veramo SDK Plugin

The Veramo SDK Plugin is an extension of the Veramo SDK, a JavaScript framework for Trusted Data, adding support for cheqd functionality.

Diagram showing how cheqd trust registries are referenced
Cover

Decentralized Trust Chains (DTCs)

Build using our Trust Registry solution using DIDs and DID-Linked Resources based on the EBSI Trust Chain model.

Cover

Set up Trust Chain

Design and build a trust chain for establishing a trust hierarchy in your ecosystem.

Cover

Get started with TRAIN

Deploy TRAIN and start validating trust chains with DNS-anchored roots and cryptographic accreditations.

Cover

Use Trust Registries for AI Agents

Design, build and validate trust registries for AI Agents using cheqd's APIs and our MCP Server.

Cover

cheqd Studio

Our API product enables users to use cheqd's functionality with minimal complexity and easily integrate APIs into existing apps.

Cover

Credo

Credo is an SDK which supports the European Architecture and Reference Framework (ARF) standards as well as AnonCreds with full cheqd support for DIDs.

Cover

Veramo

The Veramo SDK Plugin supports JSON, JSON-LD credentials as well as cheqd Credential Payments in an SDK.

Cover

Walt.id Community Stack

Walt.id Community Stack is an SDK that supports the European Architecture and Reference Framework (ARF) standards for identity, with full cheqd support.

Bitstring Status List

This Status List is a generic Bitstring Status List used for most JSON and JSON-LD credential implementations.

Token Status List

This Status List is generally used for SD-JWT specific credential types.

Verida wallet

Download the Verida wallet to receive credentials issued by cheqd Studio to a did:vda address.

Cover

Create DID

Create an Issuer DID with the did:cheqd DID method using Credo.

Update DID

Update a did:cheqd DID using Credo.

Deactivate DID

Deactivate a did:cheqd DID using Credo.

cheqd Studio

Our API product enables users to use cheqd's functionality with minimal complexity and easily integrate APIs into existing apps.

DID Registrar

Simple setup for building cheqd DIDs into existing applications using REST APIs, building into the Universal Registrar.

ACA-Py

ACA-Py plugin supports full cheqd support for DIDs as well as Verifiable Credentials.

Veramo

The Veramo SDK plugin supports JSON, JSON-LD credentials as well as cheqd Credential Payments in an SDK.

Walt.id Community Stack

Walt.id Community Stack is an SDK that supports the European Architecture and Reference Framework (ARF) standards for identity, with full cheqd support.

cheqd Cosmos CLI

Cosmos CLI which directly communicates with the cheqd network. This should only be used for testing environments.

Cover
Cover
Cover
Cover
Cover
Cover

Create Bitstring Status List

Create a Bitstring Status List on cheqd as a DID-Linked Resource

Update Bitstring Status List

Update a Bitstring Status List to revoke/suspend credentials

Check Bitstring Status List

Check whether a specified indices is revoked, suspended, unsuspended or valid

Search Bitstring Status List

Search for specific entries in the Status List, traversing its history

Decentralized Trust Chains (DTCs)

Build using our Trust Registry solution using DIDs and DID-Linked Resources based on the EBSI Trust Chain model.

Get Started With TRAIN

Deploy TRAIN and start validating trust chains with DNS-anchored roots and cryptographic accreditations.

Cover
Cover

Context for developing DID-Linked Resources

Understand the rationale for creating DID-Linked Resources and how they improve the current paradigm.

Technical composition of DID-Linked Resources

Understand the requirements and technical composition for DID-Linked Resources.

Referencing DID-Linked Resources in VCs

Learn how to embed DID-Linked Resources into the body of credentials for different purposes.

ADR 002: DID-Linked Resources

Read up on the full architectural considerations and decisions that went into the initial design of DID-Linked Resources

W3C DID-Linked Resources

Keep up to date with the formal standardisation of DID-Linked Resources at the World Wide Web Consortium (W3C).

cheqd AnonCreds Object Method

Understand how cheqd supports AnonCreds natively on its ledger, and start issuing and verifying AnonCreds using our supported SDKs.

Create a did:key DID

Create an off-ledger 'holder' or 'subject' DID, of the did:key method using the specification.

{
  "did": "did:cheqd:mainnet:71e24492-e62c-4e55-a581-007a6e36e881",
  "service": [
      {
        "id": "did:cheqd:mainnet:71e24492-e62c-4e55-a581-007a6e36e881#website",
        "type": "LinkedDomains",
        "serviceEndpoint": [
          "https:example.com"
        ]
      }
    ]
}
{
  "did": "did:cheqd:mainnet:71e24492-e62c-4e55-a581-007a6e36e881",
  "verificationMethod": [
     {
       "id":"did:cheqd:mainnet:71e24492-e62c-4e55-a581-007a6e36e881#key-2",
       "type":"Ed25519VerificationKey2018",
       "controller":"did:cheqd:mainnet:71e24492-e62c-4e55-a581-007a6e36e881",
       "publicKeyBase58":"4sjwZ3VGWupJ26ytxjhU6LhjKiPrHV5reZbaNseyHtf8"
     }
  ],
  "authentication": [
       "did:cheqd:mainnet:71e24492-e62c-4e55-a581-007a6e36e881#key-2"
  ]
}
{
  "didDocument": {
    "@context": [
      "https://www.w3.org/ns/did/v1",
      "https://w3id.org/security/suites/ed25519-2018/v1"
    ],
    "id": "did:cheqd:mainnet:71e24492-e62c-4e55-a581-007a6e36e881",
    "controller": [
      "did:cheqd:mainnet:71e24492-e62c-4e55-a581-007a6e36e881"
    ],
    "verificationMethod": [
      {
        "id": "did:cheqd:mainnet:71e24492-e62c-4e55-a581-007a6e36e881#key-1",
        "type": "Ed25519VerificationKey2018",
        "controller": "did:cheqd:mainnet:71e24492-e62c-4e55-a581-007a6e36e881",
        "publicKeyBase58": "4sjwZ3VGWupJ26ytxjhU6LhjKiPrHV5reZbaNseyHtf8"
      }
    ],
    "authentication": [
      "did:cheqd:mainnet:71e24492-e62c-4e55-a581-007a6e36e881#key-1"
    ],
    "service": [
      {
        "id": "did:cheqd:mainnet:71e24492-e62c-4e55-a581-007a6e36e881#website",
        "type": "LinkedDomains",
        "serviceEndpoint": [
          "https://example.com"
        ]
      }
    ]
  }
}

Advanced Configuration Options

Advanced setup guide for running the cheqd Studio.

Run as standalone application using Docker Compose

If you want to run the application without any external databases or dependent services, we provide a Docker Compose file to spin up a standalone service.

docker compose -f docker/no-external-db/docker-compose-no-db.yml up --detach

This standalone service uses an in-memory database with no persistence, and therefore is recommended only if you're managing key/secret storage separately.

The no-db.env file in the same folder contains all the environment variables necessary to configure the service. (See section Configuration above.)

Run with external Key Management System (KMS) and/or authentication service using Docker Compose

Construct the postgres URL and configure the env variables mentioned above.

Spinning up a Docker container from the pre-built cheqd Studio Docker image on Github is as simple as the command below:

Configure PostgreSQL database

Configure the environment variables in the :

  1. POSTGRES_USER: Username for Postgres database

  2. POSTGRES_PASSWORD: Password for Postgres database

  3. POSTGRES_MULTIPLE_DATABASES: Database names for multiple databases in the same cluster, e.g.: "app,logto". This sets up multiple databases in the same cluster, which can be used independently for External Veramo KMS or LogTo service.

Then, make the Postgres initialisation scripts executable:

chmod +x docker/with-external-db/pg-init-scripts/create-multiple-postgresql-databases.sh

Start LogTo service

Configure the environment variables in the logto.env file with the settings described in section above.

Then, run the LogTo service to configure the LogTo application API resources, applications, sign-in experiences, roles etc using Docker Compose:

docker compose -f docker/with-external-db/docker-compose-with-db.yml --profile logto up --detach

Configuring LogTo is outside the scope of this guide, and we recommend reading LogTo documentation to familiarise yourself.

Start credential-service app

Configure the environment variables in the with-db.env file with the settings described in section above. Depending on whether you are using external Veramo KMS only, LogTo only, or both you will need to have previously provisioned these services as there are environment variables in this file that originate from Postgres/LogTo.

Then, start the service using Docker Compose:

docker compose -f docker/with-external-db/docker-compose-with-db.yml up --detach

Running app or LogTo migrations

When upgrading either the external Veramo KMS or LogTo, you might need to run migrations for the underlying databases.

You can run just the migration scripts using Docker Compose profiles defined in the Compose file.

For example, to run cheqd Studio app migrations on an existing Postgres database (for external Veramo KMS):

docker compose -f docker/with-external-db/docker-compose-with-db.yml --profile app-setup up --detach

Or to run LogTo migrations on an existing Postgres database:

docker compose -f docker/with-external-db/docker-compose-with-db.yml --profile logto-setup up --detach

Build using Docker

To build your own image using Docker, use the Dockerfile provided.

docker build --file docker/Dockerfile --target runner . --tag credential-service:local

Token Top Up

Manually Top Up Your Account with CHEQ.

Users may exhaust their usage limits in their cheqd Studio billing plan, but may want to continue using the Studio before their usage limits refresh. Therefore, users can manually top up their account with CHEQ tokens to use any APIs that involve a ledger-write, e.g:

  1. Creating, Updating or Deactivating DIDs

  2. Creating unencrypted or encrypted Status Lists

  3. Creating Trust Registries

  4. Creating other DID-Linked Resources

Step 1: Locate your cheqd address (for CHEQ)

The following API can be used to fetch the new account information:

  • customer_id is used as an identifier for the particular customer using cheqd Studio. It is generated as a sub-field of the JWT token used in the authorization header.

  • cheqd_account is used to pay for identity transactions on either testnet or mainnet. A cheqd account is automatically generated when a new customer_id is generated.

Step 2: Adding CHEQ tokens to your account

If you exceed the usage limits in your cheqd Studio billing plan but want to continue using ledger-based functionality before your limits reset, you can manually top up your account using CHEQ tokens.

If you need to add CHEQ tokens to your cheqd Studio cheqd_account, there are a few steps you need to follow:

Mainnet
  • First you need to setup your wallet which is able to hold CHEQ tokens. We recommend using Leap Wallet which natively supports all CHEQ transactions in a browser plugin or on mobile. Alternatively, follow the tutorial here to setup your Keplr wallet.

  • You will then need to get CHEQ tokens from any of the listed providers here.

  • You will need to send CHEQ tokens from your new cheqd Wallet account to your cheqd_account address for using the Credential Service.

Testnet
  • It is unlikely that you will ever need to top up your Testnet account, as this is handled automatically. However, in the event that your Testnet account runs out of tokens, you can follow the step below.

  • This is super simple. You can add free CHEQ tokens to your cheqd_account via our Testnet Faucet by inputting your cheqd account address. Access the Testnet Faucet directly here.

Once you have successfully created an account and have topped up your CHEQ tokens, you are ready to get started!

Step 3: Continue using cheqd

Get started with our tutorials for cheqd Studio functionality.

Check Bitstring Status List

Query Bitstring Status List entries or indices using cheqd Studio.

Using the /credential-status/check API, users are able to query specific Credential indices within a Status List to ascertain whether the Credential is revoked, suspended or currently valid.

Step 1: Set parameters for check

Using the /credential-status/check API, users have two options for checking whether a particular Credential index is revoked or suspended:

  1. Filling out a simple form using the application/x-www-url-form-encoded option on the Swagger UI.

  2. Compiling a DID Document body yourself using the application/json option on the Swagger UI.

Option 1. Choose from a few variables

This is the easiest way to check whether a particular credential index is revoked or suspended.

Using the application/x-www-url-form-encoded option on the Swagger UI, users are able to choose between the following variables to compile your DID:

statusPurpose

The purpose of the status list that has already been created on-ledger. Can be:

  • revocation

  • suspension

did

DID of the StatusList2021 publisher, or the DID linked to the Status List resources. For example:

did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0

statusListName

The name of the existing Status List resource to be checked. For example:

employmentCredentialRevocationList
index

The index within the bitstring that the user wants to query. For example:

10

Make Fee Payment

To automatically make a payment to an Issuer in order to verify an encrypted Status List, follow the tutorial here:

Option 2. Publish a JSON Payload

Instead of using simple parameters, users can submit a JSON payload to the same effect using the application/json option on the Swagger UI. For example:

{
  "did": "string",
  "statusListName": "string",
  "index": 0,
  "makeFeePayment": false
}

Step 2: Execute the API request

Execute the API request using the API below:

DID-Linked Resources

Create cheqd DID-Linked Resources (DLRs) linked to cheqd Decentralized Identifiers (DIDs) using Credo.

DID-Linked Resources are digital files or data blobs that are permanently and verifiably linked to a specific did:cheqd identifier. Each resource is stored on the cheqd ledger and assigned a UUID, called the Resource ID, which acts as a unique, persistent reference.

Applications can retrieve these resources using either:

  • A fully-qualified Resource ID (DID + /resources/<UUID>)

  • Or a DID URL with query parameters like resourceName and resourceType

Common Use Cases

DID-Linked Resources enable storage of a wide variety of DID-associated metadata, including:

  • Trust Registry entries

  • Status Lists (e.g. credential revocation)

  • Logos and brand assets

  • Governance and policy documents

  • Credential Schemas and Definitions

Get started

Alternatives

Below are a list of SDK alternatives for creating cheqd DID-Linked Resources.

TAO -> Trusted Issuer (TI)

Learn about structuring Verifiable Accreditations from a Trusted Accreditation Organisation (TAO) to a Trusted Issuer (TI) on cheqd.

A Trusted Accreditation Organisation (TAO) can delegate authority to Trusted Issuers (TIs) by issuing them Verifiable Accreditations. These accreditations grant permission to issue specific types of Verifiable Attestations — such as diplomas, licences, or professional credentials — within the boundaries of a defined governance framework.

The Verifiable Accreditation should include:

Field
Description
Example

Issuer

DID of the TAO

did:cheqd:testnet:e66a9416-d03e-4ced-95e3-07af16e25bc5

Subject

DID of the Trusted Issuer that is being accredited

did:cheqd:testnet:f6e731f0-5bfb-429b-b2c7-e65a951d7b5e

Credential Subject

A set of structured permissions around what credentials the Trusted Issuer is accredited to issue, and in which jurisdiction.

See below

Terms of use

A set of policies setting out the scope of Trust Chain for Relying parties to validate against.

See below

Permissions

Root TAOs can set permissions under which TAOs must abide. This creates a level of codified governance for the trust ecosystem.

"credentialSubject": {
    "id": "did:cheqd:testnet:e66a9416-d03e-4ced-95e3-07af16e25bc5",
    "accreditedFor": [
      {
        "schemaId": "did:cheqd:testnet:8ea036da-f340-480d-8952-f5561ea1763c/resources/b10146d7-0d0f-41e0-8ee3-c76db64890be",
        "types": [
          "VerifiableCredential",
          "VerifiableAttestation",
          "DiplomaCredential"
        ],
        "limitJurisdiction": "https://publications.europa.eu/resource/authority/atu/FIN"
      }
    ]
  },

Field descriptions:

Field
Description

id

The DID of the Trusted Issuer receiving the accreditation

schemaId

The schema the TI is authorised to use for issuing credentials

types

Credential types the TI is allowed to issue

limitJurisdiction

(Optional) Limits issuance to a specific jurisdiction

Policies

The termsOfUse field contains the AccreditationPolicy, which provides governance context by linking to both the TAO’s parent accreditation and the root authorisation of the trust chain.

"termsOfUse": {
    "type": "AccreditationPolicy",
    "parentAccreditation": "did:cheqd:testnet:8ea036da-f340-480d-8952-f5561ea1763c/resources/18de60ec-bed1-42e5-980c-601c432bc60b",
    "rootAuthorisation": "did:cheqd:testnet:8ea036da-f340-480d-8952-f5561ea1763c/resources/18de60ec-bed1-42e5-980c-601c432bc60b"
  }

Whereby:

Field
Description

type

Must be AccreditationPolicy

parentAccreditation

The DID URL of the Accreditation issued by another TAO or the Root TAO to the TAO

rootAuthoroisation

The DID URL of the Root of Trust Verifiable Authorsation

For all Verifiable Accreditations, the accreditations are stored as DID-Linked Resources (DLRs), linked to the DID of the Accreditor. This means that the Accreditations are publically available, fully DID resolvable and are signed by the authentication keys within the DID Document of the Accreditor.

To issue a Verifiable Accreditation, follow the tutorial below:

Verifiable Credentials and Presentations

Issue Verifiable Credentials with Credo, signed by cheqd Decentralized Identifiers (DIDs).

📚 Learn about Verifiable Credentials and Presentations

If you want to learn more about what Verifiable Credentials and Presentations are, please go over to our learning site here.

Credo provides full support for working with Verifiable Credentials (VCs) and Verifiable Presentations (VPs), based on the standards defined by the W3C and the Aries RFCs.

Credo enables users to issue, hold, present, and verify credentials in a secure and interoperable way using DIDComm messaging and OpenID for Verifiable Credential protocols. This functionality forms the foundation of any Self-Sovereign Identity (SSI) ecosystem.

Get started

Get started issuing and presenting credentials with your Credo agent, either with AnonCreds, JSON-LD or SD-JWT VC:

Get started

Credential Format Support

Credo supports multiple credential formats and exchange protocols out of the box, including:

✅ SD-JWT VC

  • Alignment with the European Digital Identity Wallet initiative and standards.

  • Selective disclosure baked in at credential-format level.

  • Issuance and presentation support with OpenID4VCI and OpenID4VP.

✅ AnonCreds

  • Ideal for privacy-preserving use cases that require zero-knowledge proofs, selective disclosure, and non-revocation proofs

  • Backed by a credential definition and revocation registry stored on a supported ledger (e.g., cheqd, Indy)

  • Common in enterprise and government deployments

✅ W3C Verifiable Credentials (JSON-LD)

  • Standards-compliant with the W3C VC Data Model

  • Extensible for cheqd DID-Linked Resources and Trust Registries

  • Issuance and presentation over DIDComm v2.

  • Suitable for web-native and mobile-first use cases

Alternatives

Below are a list of alternatives for using Credentials with cheqd support. Each offers a different set of protocols and underlying technical capabilities.

Create a DID

Create a did:cheqd DID using the Credo Agent.

This tutorial shows you how to create a cheqd DID using your configured Credo Agent, and how to publish the associated DID Document to the cheqd ledger.

⚠️ Prerequisites

Before you begin:

  • ✅ Ensure your Credo agent is correctly configured with the @credo-ts/cheqd module

  • ✅ You’ve set up a cosmosPayerSeed for publishing to the cheqd network

  • ✅ You're connected to the correct network (mainnet or testnet)

Method Overview

Credo supports two approaches to creating a DID:

Option 1 – Manually construct a full DID Document

Use when you want full control over the DID structure and already have key(s) in your wallet.

Option 2 – Auto-generate the DID Document

Use when you want Credo to create the DID Document from a key you specify in secret.

Create DID

Parameters​

  1. method*: cheqd

  2. secret

  3. options*

  4. didDocument

Option 1: Create a DID from a full DID Document

  1. First, generate a key pair:

const key = await agent.wallet.createKey({
  keyType: KeyType.Ed25519,
})

const ed25519PublicKeyBase58 = key.publicKeyBase58
  1. Use that key to construct and register the DID Document:

import { DidDocument } from '@credo-ts/core'

await agent.dids.create<CheqdDidCreateOptions>({
  method: 'cheqd',
  secret: {}, // No secret needed if key is already in wallet
  options: {
    network: 'testnet',
  },
  didDocument: new DidDocument({
    id: 'did:cheqd:testnet:92874297-d824-40ea-8ae5-364a1ec9237d',
    controller: ['did:cheqd:testnet:92874297-d824-40ea-8ae5-364a1ec9237d'],
    verificationMethod: [
      {
        id: 'did:cheqd:testnet:92874297-d824-40ea-8ae5-364a1ec9237d#key-1',
        type: 'Ed25519VerificationKey2018',
        controller: 'did:cheqd:testnet:92874297-d824-40ea-8ae5-364a1ec9237d',
        publicKeyBase58: ed25519PublicKeyBase58,
      },
    ],
    authentication: [
      'did:cheqd:testnet:92874297-d824-40ea-8ae5-364a1ec9237d#key-1',
    ],
  }),
})

📝 Make sure the publicKeyBase58 matches the key in your wallet. The DID will be written to the testnet unless you specify "mainnet" in options.network.

Option 2​

If you don’t want to manually build a DID Document, you can let Credo handle it based on your input key type and ID.

await agent.dids.create({
  method: 'cheqd',
  secret: {
    verificationMethod: {
      id: 'key-1', // Logical key name
      type: 'Ed25519VerificationKey2020', // Or another supported type
    },
  },
  options: {
    network: 'testnet',
    methodSpecificIdAlgo: 'uuid', // Optional: 'uuid' (default) or 'base58'
  },
})

🔐 Credo will generate the DID Document using the key referenced in secret and publish it to the network.

What’s Next?

Now that your DID is live on the cheqd network, try:

Create a DID-Linked Resource

Create a DID-Linked Resource (DLR) associated with a cheqd Decentralized Identifier (DID) over REST API, using cheqd Studio.

Using the /resource/create API, users are able to create custom DID-Linked Resources, including:

  1. Schemas

  2. Credential Definitions

  3. Trust Registries

  4. Status Lists

  5. Logos associated with DIDs

  6. Governance files

Step 1: Set up your account

Make sure you have set up your account with cheqd Studio and are logged in, using our guide below:

Step 2: Create a DID

Before you can create a DID-Linked Resource, you need to create a "parent" DID which is used to link the Resource on-ledger. Use the API in the page below to create a DID:

Step 3. Create your Resource content and save the file locally

DID-Linked Resources can be any type of file or content that is below ~45kb in size.

For the purpose of an example, lets use an AnonCreds schema (JSON file) as the resource:

{
  "name": "degreeSchema",
  "version": "1.5.7",
  "attrNames": ["name", "age", "degree", "grade"]
 }

Save this file locally and call it something like resource.json.

Step 4: Encode the file

Prepare a file with resource and encode it into base64, base64url or hex. On Unix systems, you can use the following command input:

$ base64 -w 0 resource.json
<path-to-the-resource-file>

Expected output:

$ base64 -w 0 resource.json
SGVsbG8sIHdvcmxk

Step 5: Set a consistent name and type

Resources are grouped by having identical names and types. This means if you want to create a new version of the same Resource, you will need to specify the same name and type in the following request.

Step 6: Populate the request inputs and hit the API

Referencing Trust Registry within a Verifiable Credential

Learn how to include or reference Trust Registries and Verifiable Accreditations within the body of W3C Verifiable Credentials.

To ensure a Verifiable Credential (VC) is not only technically valid but also issued by an authorised and trusted party, it must include metadata that links back to its origin in a trust registry.

This is done using the termsOfUse property, where the Trusted Issuer includes an AttestationPolicy referencing:

  • The Verifiable Accreditation that granted them permission

  • The Root Authorisation that anchors the governance framework

Why reference a trust registry?

Including a reference to a trust registry enables verifiers to:

  • Validate that the issuer is accredited to issue this type of credential.

  • Trace the credential’s trust lineage back to a Root Trusted Accreditation Organisation (rTAO).

  • Enforce domain-specific governance or regulatory policies.

Structure of termsOfUse

The termsOfUse field uses the AttestationPolicy type and typically includes:

Field
Description

Example: Credential referencing its trust registry via AttestationPolicy

What this enables

This embedded trust policy allows verifiers to:

  • Look up the parent accreditation and root authorisation.

  • Confirm that the issuer was permitted to issue the attestation type.

  • Automate or enforce policy-based trust decisions.

Validating Trust Chains Using TRAIN

Once a Verifiable Credential includes an AttestationPolicy referencing the trust registry, TRAIN (TRust mAnagement INfrastructure) can be used to automatically validate the issuer’s authority against a decentralized trust chain.

What does TRAIN do?

TRAIN is a trust validator that:

  • Accepts a credential (or its metadata) as input.

  • Resolves the issuer’s accreditation.

  • Traverses the trust chain to the root authorisation.

  • Optionally checks DNS anchoring of the root DID for higher assurance.

  • Returns a result that confirms if the issuer is trusted under the specified framework.


TRAIN Validation Input

Here’s a simplified example of the request body TRAIN accepts:

Note: DNSTrustFrameworkPointers is optional. If omitted, TRAIN will still validate trust up to the root authorisation.


TRAIN Validation Output

TRAIN returns a response like this:

✅ VerificationStatus: true indicates that the issuer is properly accredited and the trust chain is intact. Although this will only be true if the root DID is also included in a DNS record.


Why use TRAIN?

  • Automates trust validation using standardized credential metadata.

  • Provides clear trust decisions for wallets, agents, and verifiers.

  • Enables integration with public DNS for added assurance of root DIDs.

  • Compatible with all credentials that follow cheqd’s trust chain model.

Create DID-Linked Resources

Create DID-Linked Resources (DLRs) linked to cheqd Decentralized Identifiers (DIDs).

"DID-Linked Resources" are identified with a with a that acts as a permanently-accessible link to fetch the resources from the cheqd ledger. We refer to this as the "resource ID". Through the "resource ID" or a set of DID URL query parameters, applications are able to persistently access a digital resource on the cheqd network.

Get started

Alternatives

Below are a list of alternatives for creating cheqd DID-Linked Resources.

Partner SaaS support

cheqd DID-Linked Resources are supported in SaaS offerings from cheqd partners, making it possible to use did:cheqd DLRs across different platforms:

DID-Linked Resource Write Pricing

Read up on our identity write pricing for cheqd Mainnet below:

Get Started with TRAIN

Anchor Decentralized Identifiers (DIDs) in DNS records and validate Decentralized Trust Chains (DTCs) using TRAIN.

What is TRAIN?

TRAIN (TRust mAnagement INfrastructure) is a framework, led by the team at the , for establishing and validating decentralized trust. It allows ecosystems to verify whether Verifiable Credentials (VCs) were issued by authorized and trustworthy entities through cryptographically linked trust chains.

TRAIN includes two core components:

  • TRAIN Trust Validator (TTV): A service that validates the issuer of a Verifiable Credential by tracing Verifiable Accreditations up to a trusted root authority.

  • TDZM (Trust-DNS Zone Manager): A DNS component that enables Root Trusted Accreditation Organisations (rTAOs) to publicly anchor their Decentralized Identifiers (DIDs) in DNS.

Together, these components allow for governance-aware, high-assurance validation of digital credentials without centralized trust registries.


How TDZM and the TRAIN Trust Validator Work Together

Component
Purpose

When combined, they allow you to:

  • Establish a cryptographically linked trust hierarchy

  • Publish root DIDs (rTAOs) in DNS

  • Automatically validate credentials against published governance frameworks

  • Support scalable, decentralized ecosystems without compromising on assurance


Step-by-Step: Setting Up Trust and Validation

1. Deploy Trust-DNS Zone Manager (TDZM)

Run the TDZM backend and UI using:

  • Docker Compose (for testing or development)

  • Helm Charts in Kubernetes (for production)

TDZM includes:

  • A DNS nameserver to manage your trust zone

  • A backend API and UI for managing records

  • Optional OIDC authentication


2. Delegate DNS Control to TDZM

In your parent DNS zone (e.g. federation1.com):

  • Add an NS record pointing your trust subdomain (e.g. trust.federation1.com) to TDZM

  • Add an A record to resolve the nameserver’s domain to its IP

Example:


3. Anchor the rTAO DID in DNS

Use TDZM to publish a TXT or TLSA DNS record that links your rTAO’s DID to the trust domain.

Example:

This enables the TRAIN Trust Validator to resolve and verify the rTAO’s authenticity.


4. Build the Trust Chain

  • Publish a Root Authorisation for Trust Chain from the rTAO

  • Issue Verifiable Accreditations from rTAO → TAOs → Trusted Issuers

  • Define governance rules and credential schema policies as needed


5. Use the TRAIN Trust Validator (TTV)

Send a JSON request to TTV with the credential’s issuer, type, accreditation path, and optional DNS anchors. TTV will:

  • Traverse the Verifiable Accreditation chain

  • Verify structural and policy compliance

  • Optionally confirm the root via DNS lookups

  • Return a structured verification result


Summary

Goal
Component

By combining DNS-based assurance with credential-level verification, the TRAIN infrastructure provides a flexible and scalable solution for decentralized trust governance.

Issue a Verifiable Credential

Issue a Verifiable Credential (AnonCreds), signed with a did:cheqd Decentralized Identifier (DID).

Using AnonCreds and the Issue Credential v2 Protocol, you can issue Verifiable Credentials signed by a did:cheqd identifier with just a few lines of code. This guide walks through the full flow using the Credo Agent.

Prerequisites

Before you begin, make sure you have:

  • A registered did:cheqd for the Issuer.

  • A and already created and published as DID-Linked Resources.

  • A configured with:

    • @credo-ts/cheqd for DID operations and resource publishing.

    • @credo-ts/anoncreds for AnonCreds credential handling.

    • @credo-ts/didcomm for DIDComm messaging

  • Two agents: an Issuer and a Holder (can be separate apps or run locally)

  • Secure connectivity between agents using Out-of-Band (OOB) or a supported connection method.

Step 1: Create a Connection with Holder

Use any supported method to create a connection with the Holder of the credential. Automated is recommended.

1a: Issuer Creates Connection Invite

The Issuer agent will create a new connection invite for the Holder. This is needed to securely communicate between the Issuer and the Holder agents.

1b: Holder receives invitation

The above request will have an invitation in the response. Holder will have to copy that invitation and pass URL as invitationUrl in the following code:

Step 2: Prepare and Send Credential Offer

Generate a credential offer and send to the holder, informing them about the available credential and its attributes.

Step 3: Holder accepts credential offer

When we want to accept a credential, we have to listen to incoming credentials and handle accordingly. In this example we do not have any user interaction, but is likely that your application would have a user-interface which would display the credential. When receiving a credential offer you can get the values from credentialExchangeRecord.credentialAttributes.

Summary

Step
Action

Credo

Credo SDK with cheqd support for Decentralized Identifiers (DIDs), DID-Linked Resources (DLRs) and Credentials.

Get Started with Credo

Credo is a TypeScript-based framework for building Self-Sovereign Identity (SSI) agents and services. It is designed for modularity, interoperability, and compliance with the European Architecture and Reference Framework (ARF).

Previously known as Aries Framework JavaScript, Credo has recently been rebranded and transitioned from the Hyperledger Foundation to the Open Wallet Foundation, reflecting its broader mission and growing community.

Credo has evolved into a more flexible and general-purpose SSI framework. A major milestone in this evolution is the full integration with — making Credo the first framework to support AnonCreds on non-Indy ledgers.

This integration showcases Credo’s expanding support for:

  • Multiple credential formats

  • Diverse DID methods

  • Interoperable ledger technologies

Using Credo, developers can now issue Verifiable Credentials, create Credential Schemas, and define Credential Definitions using cheqd-native AnonCreds, enabled by the cheqd AnonCreds Object Method.

Key Features

Credo may be the right choice as it has the following benefits:

  • TypeScript-native — strongly typed, developer-friendly, and production-ready

  • Modular and extensible — use only what you need, plug in new components

  • Cross-ledger compatibility — supports Indy, cheqd, and beyond

  • Flexible credential support — AnonCreds, W3C JSON-LD, JWT

  • Aligned with EU standards — interoperable with EU ARF and continuing to align with eIDAS 2.0 implementing acts

  • Backed by the Open Wallet Foundation — with growing community adoption

Breaking New Ground: Credo + cheqd

Credo is now the first framework to support AnonCreds on non-Indy ledgers, thanks to a deep integration with . ACA-Py has since followed suit.

This includes:

  • Issuance of Verifiable Credentials using cheqd DIDs

  • Creation of Credential Schemas and Credential Definitions

  • Support for the cheqd AnonCreds Object Method

  • Native DID and resource support for did:cheqd

Get started

Get setup with your Credo agent and begin using cheqd's functionality below:

Supported Credential types

Credo supports the following Credential formats:

Watch our demo video

Enterprise Support for Credo

Below are a list of enterprise applications that leverage Credo with full did:cheqd support under the hood:

ACA-Py

Aries Cloud Agent Python (ACA-Py) Plugin with cheqd support for Decentralized Identifiers (DIDs), DID-Linked Resources (DLRs) and Credentials.

Aries Cloud Agent Python (ACA-Py) is a powerful and extensible agent framework for building Verifiable Credential (VC) ecosystems. Built on the Aries RFCs and aligned with the Trust Over IP stack, ACA-Py operates at Layer 2 (Credential Exchange) and Layer 3 (Peer-to-Peer Communication).

As a project under the Open Wallet Foundation, ACA-Py supports dynamic extensions via runtime-loaded plugins, enabling flexible integration into enterprise and SSI platforms.


DID and Credential Support

ACA-Py supports multiple credential formats and DID methods, including:

  • AnonCreds

  • W3C Verifiable Credentials (JSON-LD)

  • DIDComm v1 & v2

  • DID method plugins like did:peer, did:indy, and did:cheqd


ACA-Py + cheqd: Modern Verifiable Credential Issuance

ACA-Py now includes full support for the did:cheqd method, enabling seamless integration with the cheqd decentralized identity network. This allows developers to:

  • Create and resolve did:cheqd identifiers

  • Publish Credential Schemas and Credential Definitions to cheqd

  • Issue and verify AnonCreds credentials using cheqd DIDs as signatures

  • Issue and verify JSON-LD credentials using cheqd DIDs as signatures

  • Replace legacy did:sov/Sovrin usage with a modern, scalable alternative

💡 AnonCreds on cheqd are enabled via the cheqd AnonCreds Object Method, maintaining compatibility with ACA-Py's credential exchange workflows.


Universal Registrar Integration

The cheqd plugin for ACA-Py supports dynamic DID registration via the Universal Registrar. This provides a streamlined interface for managing multiple DID methods.

Benefits of Using Universal Registrar:

  • Unified DID Support Register multiple DID methods (e.g., did:cheqd, did:key, did:web) through a single unified API.

  • Streamlined Setup Eliminate manual configuration—DIDs are created dynamically at runtime by calling the relevant driver.

  • Interoperable by Design Easily switch or support multiple DID methods in the same ACA-Py deployment.

Get started

Get setup with your ACA-Py agent and begin using cheqd's functionality below:

Enterprise Support for ACA-Py

Below are a list of enterprise applications that leverage ACA-Py with full did:cheqd support under the hood:

Present a Verifiable Credential

Present a JSON-LD Verifiable Credential, signed by a did:cheqd Decentralized Identifier (DID), using Credo.

Verifiable Credentials signed by a did:cheqd can be securely presented using the Dif proof format and the Present Proof Protocol v2 within the Credo framework. This enables trust-minimised, selective disclosure of credential data between a Holder and a Verifier.

Prerequisites

Before presenting a credential:

  • A Verifiable Credential must have been issued and accepted by the Holder

  • A Credo Agent is running for both the Verifier and the Holder

  • A DIDComm connection exists between Holder and Verifier (via OOB or another method)

  • Both agents are configured with needed for JSON-LD Credential Proof.

Step 1: Create a Connection with Holder

Use any supported method to create a connection with the Holder. Automated is recommended. You can follow the same steps as described in .

Step 2: Register Proof Event Listeners

Both agents need event listeners to handle the proof exchange protocol automatically.

Step 3: Send Proof Request

After the connection is established and event handlers registered, the Verifier can send a proof request to the Holder.

The Proof Acceptance and Presentation is handled automatically by the event listeners registered for both Verifier and Holder.

Next Steps

For more tutorials and examples, visit .

Present a Verifiable Credential

Receive and present a SD-JWT Verifiable Credential, signed by a did:cheqd Decentralized Identifier (DID), using Credo and OpenID4VP.

Using the OpenID4VC module, you can receive and present a OpenID compatible SD-JWT Credentials signed by a did:cheqd identifier. This guide walks through the flow of presentation using the Credo Agent.

Prerequisites

Before you being, ensure you have:

  • Basic knowledge of .

  • .

Step 1: Configure the Holder Agent

Configure the holder with cheqd and OpenID4VC Modules

Step 2: Resolve and Accept Credential Offer

This method:

  1. Resolves the offer.

  2. Accepts it via pre-authorized code flow.

  3. Selects a binding method—did:key (preferred) or JWK—for the SD-JWT, depending on issuer capabilities

Step 3: Store the Credentials

Step 4: Resolve and Accept Authorization Request

Once you have a credential in your wallet, you can present it by responding to a receive authorization request, which includes an OpenID4VP presentation request. This request can be generated either by the verifier module or an external OpenID4VC verifier. First, resolve the authorization request, then accept it to present the credential in your wallet.

Decentralized Identifiers (DIDs)

Create Decentralized Identifiers (DIDs) on cheqd using ACA-Py.

A Decentralized Identifier "DID" is a globally unique identifier that does not require a centralized registration authority because it is registered with distributed ledger technology or other form of decentralized network.

Learn about DIDs If you want to learn about what

Get started

Alternatives

Below are a list of SDK alternatives for creating cheqd DIDs.

SD-JWT VC

Issue and present SD-JWT VC credentials signed by cheqd Decentralized Identifiers (DIDs), using Credo.

SD-JWT Verifiable Credentials enable selective disclosure and unlinkability, combining the compact JWT format with privacy-preserving cryptographic techniques. They are optimized for privacy, mobile compatibility, and integration with modern identity standards.

In Credo, SD-JWT credentials are issued using OpenID for Verifiable Credential Issuance (OID4VCI) and presented using OpenID for Verifiable Presentations (OID4VP)—ensuring secure, interoperable credential exchange based on open standards.

✅ This approach is fully aligned with the EU Digital Identity Wallet standards and protocols, and the developing EU Architecture and Reference Framework (ARF).


Get Started

Issue and present SD-JWT credentials in Credo using the tutorials below:


Why Use SD-JWT?

SD-JWT credentials are ideal for ecosystems that require:

  • Privacy-preserving credential exchange Reveal only the claims you choose—no more, no less

  • Unlinkability across presentations Each presentation is cryptographically unique, preventing correlation by relying parties

  • Optimized for mobile and constrained environments Compact format, ideal for mobile wallets and low-bandwidth scenarios

  • Standards-compliant Built on IETF SD-JWT, OID4VCI, and OID4VP specifications

  • Interoperability with identity wallets Enables seamless interaction with both SSI wallets and federated identity providers supporting OpenID standards

  • EU Wallet-ready Fully compatible with the EU Digital Identity Wallet and ARF requirements


Extensibility for cheqd Functionality

While SD-JWT focuses on minimal disclosure, it can integrate cheqd-native functionality through linked references:

🔗 DID-Linked Resources Reference schemas, legal terms, or trust frameworks hosted on the cheqd ledger via out-of-band metadata Use credential_metadata or presentation definitions to point to these resources

🏛️ Trust Registries Issuers can prove authorisation by referencing cheqd-based trust registries—linked via DID-Linked Resources or OpenID Federation metadata

🚫 Status Lists (Revocation) Revocation is supported via cheqd-compatible Bitstring Status Lists These can be referenced externally without compromising SD-JWT’s privacy guarantees

📦 These integrations maintain SD-JWT’s compact, privacy-first design while adding verifiability and governance via cheqd infrastructure.


Features Supported in Credo

Supported DID Methods

Credo supports SD-JWT credential issuance and key binding using:

  • did:key

  • did:web

  • did:cheqd

Supported Protocols

  • Issuance: OID4VCI (OpenID for Verifiable Credential Issuance)

  • Presentation: OID4VP (OpenID for Verifiable Presentations)

Update a DID

Update a did:cheqd DID using the Credo Agent.

This guide walks you through how to update an existing cheqd DID using your configured Credo Agent. Updating a DID Document lets you add or modify keys, service endpoints, or other metadata associated with the DID.

Prerequisites

Before you begin, make sure:

  • ✅ Your Credo agent is already configured with cheqd support

  • ✅ You have write access to the DID (i.e., the key used for DID creation or a controller key)

  • ✅ You know the DID you want to update and its current document state

How DID Updates Work

To update a did:cheqd, you must:

  1. Fetch the current DID Document

  2. Modify the relevant fields (e.g., add keys, update service endpoints)

  3. Submit the updated DID Document using agent.dids.update(...)

Example: Add a New Service and Verification Method


Parameters Reference

Parameter
Required
Description

DID-Linked Resources

Learn about cheqd's approach to implementing DID-Linked Resources

Issue Verifiable Accreditation

Issue a Verifiable Accreditation to start a trust registry on cheqd

Create DID-Linked Resource

Associate DID-Linked Resources to your DID using Credo.

Issue Verifiable Credentials

Issue Credentials using your cheqd DID using Credo.

import { DidDocumentService } from '@credo-ts/core'

await agent.dids.update({
  did: 'did:cheqd:testnet:b84817b8-43ee-4483-98c5-f03760816411',

  // Used to authorize and derive additional keys, if needed
  secret: {
    verificationMethod: {
      id: 'key-2',
      type: 'JsonWebKey2020', // Can also be Ed25519VerificationKey2020, etc.
    },
  },

  didDocument: {
    id: 'did:cheqd:testnet:b84817b8-43ee-4483-98c5-f03760816411',
    controller: ['did:cheqd:testnet:b84817b8-43ee-4483-98c5-f03760816411'],

    verificationMethod: [
      {
        id: 'did:cheqd:testnet:b84817b8-43ee-4483-98c5-f03760816411#key-1',
        type: 'Ed25519VerificationKey2020',
        controller: 'did:cheqd:testnet:b84817b8-43ee-4483-98c5-f03760816411',
        publicKeyMultibase: 'z6MknkzLUEP5cxqqsaysNMWoh8NJRb3YsowTCj2D6yhwyEdj',
      },
    ],

    authentication: [
      'did:cheqd:testnet:b84817b8-43ee-4483-98c5-f03760816411#key-1',
    ],

    service: [
      new DidDocumentService({
        id: 'did:cheqd:testnet:b84817b8-43ee-4483-98c5-f03760816411#website',
        type: 'linkedDomains',
        serviceEndpoint: 'https://rand.in',
      }),
    ],
  },
})

did

✅

The DID you want to update

didDocument

✅

The complete updated DID Document

secret

⚠️

Required only if you're referencing new keys not yet in the agent’s wallet

options

❌

Optional advanced settings (e.g., method-specific configurations)

Issuer
const createNewInvitation = async (agent: Agent) => {
  const outOfBandRecord = await agent.modules.oob.createInvitation()

  return {
    invitationUrl: outOfBandRecord.outOfBandInvitation.toUrl({ domain: 'http://localhost:3001' }),
    outOfBandRecord,
  }
}
Holder
const receiveInvitation = async (agent: Agent, invitationUrl: string) => {
  const { outOfBandRecord } = await agent.modules.oob.receiveInvitationFromUrl(invitationUrl)
  if (!outOfBandRecord) {
      throw new Error(redText(Output.NoConnectionRecordFromOutOfBand))
  }
  return outOfBandRecord
}
Issuer
await this.agent.modules.credentials.offerCredential({
      connectionId: connectionRecord.id,
      protocolVersion: 'v2',
      credentialFormats: {
        anoncreds: {
          attributes: [
            {
              name: 'name',
              value: 'Alice Smith',
            },
            {
              name: 'degree',
              value: 'Computer Science',
            },
            {
              name: 'date',
              value: '01/01/2022',
            },
          ],
          credentialDefinitionId: credentialDefinition.credentialDefinitionId,
        },
      },
    })
Holder
this.agent.events.on(CredentialEventTypes.CredentialStateChanged,
  async ({ payload }: CredentialStateChangedEvent) => {
  switch (payload.credentialRecord.state) {
    case CredentialState.OfferReceived:
      console.log('received a credential')
      // custom logic here
      await this.agent.modules.credentials.acceptOffer({ credentialRecordId: payload.credentialRecord.id })
      break
    case CredentialState.Done:
      console.log(`Credential for credential id ${payload.credentialRecord.id} is accepted`)
      // For demo purposes we exit the program here.
      process.exit(0)
  }
})

1

Create and accept a secure connection between Issuer and Holder

2

Issuer prepares and sends a credential offer (via AnonCreds v2)

3

Holder accepts and stores the credential automatically or via UI

Decentralized Identifier (DID)
Credential Schema
Credential Definition
Credo Agent
out-of-band protocol
Verifier and Holder
import { ProofEventTypes, ProofState } from '@credo-ts/core'

const setupProofListener = (agent: Agent) => {
  agent.events.on(ProofEventTypes.ProofStateChanged, async ({ payload }) => {
    const { proofRecord } = payload
    
    switch (proofRecord.state) {
      case ProofState.RequestReceived:
        console.log('Holder: Proof request received, creating presentation...')
        const requestedCredentials = await agent.proofs.selectCredentialsForRequest({
          proofRecordId: proofRecord.id,
        })
        
        await agent.proofs.acceptRequest({
          proofRecordId: proofRecord.id,
          proofFormats: {
            presentationExchange: {
              credentials: requestedCredentials.proofFormats['presentation-exchange']?.credentials || {},
            },
          },
        })
        break
        
      case ProofState.PresentationReceived:
        console.log('Issuer: Presentation received, verifying...')
        await agent.proofs.acceptPresentation({
          proofRecordId: proofRecord.id,
        })
        break
        
      case ProofState.Done:
        console.log('Proof verification completed!')
        const proof = await agent.proofs.getById(proofRecord.id)
        console.log('Proof is valid:', proof.isVerified)
        break
    }
  })
}
Verifier/Issuer
// Define what we want to verify
const presentationDefinition = {
  id: 'permanent-resident-verification',
  input_descriptors: [
    {
      id: 'permanent-resident-card',
      name: 'Permanent Resident Card',
      purpose: 'Verify permanent resident status',
      constraints: {
        fields: [
          {
            path: ['$.type'],
            filter: {
              type: 'array',
              contains: { const: 'PermanentResidentCard' },
            },
          },
          {
            path: ['$.credentialSubject.givenName'],
            filter: { type: 'string' },
          },
          {
            path: ['$.credentialSubject.familyName'],
            filter: { type: 'string' },
          },
          {
            path: ['$.credentialSubject.lprNumber'],
            filter: { type: 'string' },
          },
        ],
      },
    },
  ],
}
// Get Connection
const {invitationUrl, issuerConnection} = await createInvitation(issuerAgent)

console.log('Requesting proof verification...')
const proofExchange = await issuerAgent.proofs.requestProof({
  connectionId: issuerConnection.id,
  protocolVersion: 'v2',
  proofFormats: {
    presentationExchange: { presentationDefinition },
  },
  comment: 'Please present your Permanent Resident Card for verification',
})
console.log('Proof request sent:', proofExchange.id)
// The rest of the flow is handled automatically by event listeners
Credo packages
out-of-band protocol
Issue a Verifiable Credential
Credo Docs
import { Agent, DidsModule } from '@credo-ts/core';
import { agentDependencies } from '@credo-ts/node';
import { CheqdModule } from '@credo-ts/cheqd';
import { OpenId4VcHolderModule } from '@credo-ts/openid4vc';

const holder = new Agent({
  config,
  dependencies: agentDependencies,
  modules: {
    dids: new DidsModule({
      resolvers: [new CheqdDidResolver()],
    }),
    openId4VcHolderModule: new OpenId4VcHolderModule(),
  },
});
import { DidKey, KeyDidCreateOptions, getJwkFromKey } from '@credo-ts/core';

const resolved = await holder.modules.openId4VcHolder.resolveCredentialOffer(credentialOffer);

const credentials = await holder.modules.openId4VcHolder.acceptCredentialOfferUsingPreAuthorizedCode(
  resolved,
  {
    credentialBindingResolver: async ({
      supportedDidMethods,
      keyType,
      supportsAllDidMethods,
      supportsJwk,
      credentialFormat,
    }) => {
      if (supportsAllDidMethods || supportedDidMethods?.includes('did:key')) {
        const didResult = await holder.dids.create<KeyDidCreateOptions>({
          method: 'key',
          options: { keyType },
        });
        const didKey = DidKey.fromDid(didResult.didState.did);
        return {
          method: 'did',
          didUrl: `${didKey.did}#${didKey.key.fingerprint}`,
        };
      }
      if (supportsJwk && credentialFormat === OpenId4VciCredentialFormatProfile.SdJwtVc) {
        const key = await holder.wallet.createKey({ keyType });
        return { method: 'jwk', getJwkFromKey(key) };
      }
      throw new Error('No binding method supported.');
    },
  }
);
// Store the received credentials
const records: Array<W3cCredentialRecord | SdJwtVcRecord> = []
for (const credential of credentials) {
  if ('compact' in credential) {
    const record = await holder.sdJwtVc.store(credential.compact)
    records.push(record)
  } else {
    const record = await holder.w3cCredentials.storeCredential({
      credential,
    })
    records.push(record)
  }
}
// resolved credential offer contains the offer, metadata, etc..
const resolvedRequest = await holder.modules.openId4VcHolderModule.resolveSiopAuthorizationRequest(authorizationRequest)
console.log(
  'Resolved credentials for request', JSON.stringify(resolvedRequest.presentationExchange.credentialsForRequest, null, 2)
)

const presExchangeService = holder.dependencyManager.resolve(DifPresentationExchangeService)
// Automatically select credentials. In a wallet you could manually choose which credentials to return based on the "resolvedAuthorizationRequest.presentationExchange.credentialsForRequest" value
const selectedCredentials = presExchangeService.selectCredentialsForRequest(
  resolvedRequest.presentationExchange.credentialsForRequest
)

// issuer only supports pre-authorized flow for now
const authorizationResponse = await holder.modules.openId4VcHolderModule.acceptSiopAuthorizationRequest({
  authorizationRequest: resolvedRequest.authorizationRequest,
  presentationExchange: {
    credentials: selectedCredentials,
  },
})
console.log('Submitted authorization response', JSON.stringify(authorizationResponse.submittedResponse, null, 2))
Credo Agent configuration
Issued a SD-JWT Verifiable Credential

type

Must be "AttestationPolicy"

parentAccreditation

DID URL pointing to the Verifiable Accreditation that granted authority to the issuer

rootAuthorisation

DID URL referencing the original Root Authorisation for the trust chain

{
  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    "https://www.w3.org/ns/credentials/examples/v2"
  ],
  "id": "http://university.example/credentials/3732",
  "type": ["VerifiableCredential", "ExampleDegreeCredential"],
  "issuer": "did:cheqd:testnet:c2f18b6b-32e2-48d1-a5a8-5f5d2d9798f0",
  "validFrom": "2010-01-01T00:00:00Z",
  "credentialSubject": {
    "id": "did:cheqd:testnet:b4902745-5b5b-423e-820a-0773b033f2b9",
    "degree": {
      "type": "ExampleBachelorDegree",
      "name": "Bachelor of Science and Arts"
    }
  },
  "termsOfUse": {
    "type": "AttestationPolicy",
    "parentAccreditation": "did:cheqd:testnet:c2f18b6b-32e2-48d1-a5a8-5f5d2d9798f0/resources/58c01595-f884-4a3b-add4-8c691e16b8ee",
    "rootAuthorisation": "did:cheqd:testnet:c2f18b6b-32e2-48d1-a5a8-5f5d2d9798f0/resources/58c01595-f884-4a3b-add4-8c691e16b8ee"
  }
}
{
  "issuer": "did:cheqd:testnet:c2f18b6b-32e2-48d1-a5a8-5f5d2d9798f0",
  "type": ["VerifiableCredential", "ExampleDegreeCredential"],
  "termsofuse": "AttestationPolicy",
  "parentAccreditation": "did:cheqd:testnet:c2f18b6b-32e2-48d1-a5a8-5f5d2d9798f0/resources/58c01595-f884-4a3b-add4-8c691e16b8ee",
  "DNSTrustFrameworkPointers": ["example.trust-scheme.org"]
}
{
  "VerificationStatus": true,
  "VerificationResult": {
    "AccreditorDIDs": [
      "did:cheqd:testnet:c2f18b6b-32e2-48d1-a5a8-5f5d2d9798f0",
      "did:cheqd:testnet:8ea036da-f340-480d-8952-f5561ea1763c"
    ],
    "FoundRootIssuerDID": "did:cheqd:testnet:8ea036da-f340-480d-8952-f5561ea1763c",
    "TrustFramework": "Example Trust Framework",
    "TrustFrameworkId": "https://example.com/governance-framework/124",
    "VerifyRootIssuerDIDinDNS": true
  }
}
Cover

Get Started with TRAIN

Deploy TRAIN to verify Decentralized Trust Chains back to a Root of Trust DID and DNS Record.

TDZM

Anchors rTAO DIDs in DNS, establishing a verifiable and auditable trust root

TTV (TRAIN Trust Validator)

Validates VCs by following Verifiable Accreditations and optionally confirming the rTAO via DNS

trust.federation1.com. NS ns1.trust.federation1.com.
ns1.trust.federation1.com. A 203.0.113.10
_did.trust.federation1.com. TXT "did:cheqd:mainnet:rtao123"

Anchor rTAO in DNS

🌐 TDZM

Manage trust zones

🛠️ TDZM Backend & UI

Define & delegate trust

📜 Verifiable Accreditations

Validate credentials

🔎 TRAIN Trust Validator (TTV)

Fraunhofer Institute

Deploy TRAIN and Anchor rTAO in DNS

Add high assurance to your root DID, anchoring it within a DNS record.

Cover

Set up Trust Chain

Design and build a trust chain for establishing a trust hierarchy in your ecosystem.

Cover

Validate Trust Chain

Validate Trust Chain to a root of trust using the TRAIN Trust Validator (TTV).

cheqd Agent Setup

Setup the ACA-Py agent with our cheqd plugin.

Create a Decentralized Identifier (DID)

Use the ACA-Py agent to create did:cheqd Decentralized Identifiers (DIDs).

Create DID-Linked Resources

Create a DID-Linked Resource (DLR) linked to a cheqd Decentralized Identifier (DID).

Issue a Verifiable Credential

Issue and verify Verifiable Credential using ACA-Py agent with did:cheqd.

Cover

Sudo Platform (Anonyome Labs)

API-first developer platform for cheqd DIDs and support for multiple Verifiable Credential formats.

Cover

DIDx

DIDx supports did:cheqd through an enterprise version of ACA-Py, supporting AnonCreds and JSON-LD.

Issue a Verifiable Credential

Issue SD-JWT Credentials signed by cheqd DIDs using Credo and OpenID4VCI.

Present a Verifiable Credential

Present SD-JWT Credentials signed by cheqd DIDs using Credo and OpenID4VP.

Verify a Verifiable Credential

Verify SD-JWT Credentials signed by cheqd DIDs using Credo and OpenID4VCI.

Create DID-Linked Resource

Create a generic DID-Linked Resource (DLR) tied to a cheqd DID using Credo.

Understanding DLRs

More details about DID-Linked Resources on Cheqd.

Understanding AnonCreds

More details about AnonCreds Object Method.

Create Schema

Create an AnonCreds Schema using Credo.

Create Credential Definition

Create an AnonCreds Credential Definition using Credo.

cheqd Studio

Our API product enables users to use cheqd's functionality with minimal complexity and easily integrate APIs into existing apps.

DID Registrar

Simple setup for building cheqd DIDs into existing applications using REST APIs, building into the Universal Registrar.

Veramo

The Veramo SDK plugin supports JSON, JSON-LD credentials as well as cheqd Credential Payments in an SDK.

cheqd Cosmos CLI

Cosmos-native CLI for creating transactions on cheqd. Should be used for testing purposes only.

ACA-Py

ACA-Py (Aries Cloud Agent Python) is an SDK that can issue AnonCreds, JSON-LD and SD-JWT credentials with full cheqd support.

Cover
Cover
Cover
Cover
Cover

Setup Credo Agent

Before you get started, you need to setup your Credo Agent.

AnonCreds

Issue and present AnonCreds signed by cheqd DIDs using Credo.

JSON-LD

Issue and present JSON-LD Verifiable Credentials signed by cheqd DIDs using Credo.

SD-JWT VC

Issue and present SD-JWT Verifiable Credentials signed by cheqd DIDs using Credo.

cheqd Studio

Our API product enables users to use cheqd's functionality with minimal complexity and easily integrate APIs into existing apps.

ACA-Py

ACA-Py plugin supports full cheqd support for DIDs as well as Verifiable Credentials.

Veramo

The Veramo SDK plugin supports JSON, JSON-LD credentials as well as cheqd Credential Payments in an SDK.

Walt.id Community Stack

Walt.id Community Stack is an SDK that supports the European Architecture and Reference Framework (ARF) standards for identity, with full cheqd support.

Cover
Cover
Cover
Cover

Referencing DID-Linked Resources in VCs

Understand how to reference a DID-Linked Resource (DLR) within the body of a W3C Verifiable Credential.

Verifiable Credentials (VCs) often need to reference external data to provide structure, governance, or context. On the cheqd network, these external references can be anchored as DID-Linked Resources, enabling permanent, tamper-evident, and verifiable links within the credential itself.

This tutorial explains how to reference DID-Linked Resources in the body of a VC using fully qualified did:cheqd URLs. These references enhance trust, interoperability, and auditability of issued credentials.

Common Resources to Reference in a VC

The table details what types of DID-Linked Resources may commonly be included within the body of a Verifiable Credential:

Resource Type
Use Case

Credential Schemas

Define the expected structure and semantics of a credential

Trust Registries

Prove that the issuer is authorised to issue a particular credential

Status Lists

Reference revocation registries (for AnonCreds or Bitstring Status Lists)

Logos & Visuals

Display issuer branding or credential type icons in wallets

Legal Terms & Governance

Point to frameworks, policies, or usage restrictions

Example: Event Ticket Credential with Schema & Logo References

Below is a Verifiable Credential issued for an event ticket. It references:

  • A schema, published as a DID-Linked Resource

  • A logo, hosted as a visual asset under the same issuer DID

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://veramo.io/contexts/profile/v1",
    "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:z6jKUJA5YcZsNxZgsrQPKPipL2FRTf4s/resources/a20aa56a-a76f-4828-8a98-4c85d9494545"
  ],
  "type": [
    "VerifiableCredential",
    "EventReservation"
  ],
  "issuanceDate": "2022-11-17T03:19:03.328Z",
  "credentialSubject": {
    "id": "did:key:z6MkwTr46BWU42YejmZrDDCbL127dBoxSXeLuaHS75vTCg7i"
  },
  "reservationId": "4810116769",
  "reservationStatus": "https://schema.org/ReservationConfirmed",
  "reservationFor": {
    "@type": "Event",
    "name": "Internet Identity Workshop IIWXXXV",
    "startDate": "2022-11-16T16:00:00",
    "endDate": "2022-11-18T00:00:00",
    "location": "Computer History Museum, 1401 N Shoreline Blvd, Mountain View, CA 94043",
    "logo": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:z6jKUJA5YcZsNxZgsrQPKPipL2FRTf4s/resources/8140ec3a-d8bb-4f59-9784-a1cbf91a4a35"
  },
  "issuer": {
    "id": "did:cheqd:mainnet:zAXwwqZzhCZA1L77ZBa8fhVNjL9MQCHX"
  },
  "proof": {
    "type": "JwtProof2020",
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vdmVyYW1vLmlvL2NvbnRleHRzL3Byb2ZpbGUvdjEiLCJodHRwczovL3Jlc29sdmVyLmNoZXFkLm5ldC9kaWQ6Y2hlcWQ6dGVzdG5ldDp6NmpLVUpBNVljWnNOeFpnc3JRUEtQaXBMMkZSVGY0cy9yZXNvdXJjZXMvYTIwYWE1NmEtYTc2Zi00ODI4LThhOTgtNGM4NWQ5NDk0NTQ1Il0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJFdmVudFJlc2VydmF0aW9uIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImlkIjoiZGlkOmtleTp6Nk1rd1RyNDZCV1U0Mlllam1ackREQ2JMMTI3ZEJveFNYZUx1YUhTNzV2VENnN2kifX0sIkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIiwiaHR0cHM6Ly92ZXJhbW8uaW8vY29udGV4dHMvcHJvZmlsZS92MSIsImh0dHBzOi8vcmVzb2x2ZXIuY2hlcWQubmV0L2RpZDpjaGVxZDp0ZXN0bmV0Ono2aktVSkE1WWNac054WmdzclFQS1BpcEwyRlJUZjRzL3Jlc291cmNlcy9hMjBhYTU2YS1hNzZmLTQ4MjgtOGE5OC00Yzg1ZDk0OTQ1NDUiXSwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIkV2ZW50UmVzZXJ2YXRpb24iXSwiaXNzdWFuY2VEYXRlIjoiMjAyMi0xMS0xN1QwMzoxOTowMy4zMjhaIiwiY3JlZGVudGlhbFN1YmplY3QiOnsiaWQiOiJkaWQ6a2V5Ono2TWt3VHI0NkJXVTQyWWVqbVpyRERDYkwxMjdkQm94U1hlTHVhSFM3NXZUQ2c3aSJ9LCJyZXNlcnZhdGlvbklkIjoiNDgxMDExNjc2OSIsInJlc2VydmF0aW9uU3RhdHVzIjoiaHR0cHM6Ly9zY2hlbWEub3JnL1Jlc2VydmF0aW9uQ29uZmlybWVkIiwicmVzZXJ2YXRpb25Gb3IiOnsiQHR5cGUiOiJFdmVudCIsIm5hbWUiOiJJbnRlcm5ldCBJZGVudGl0eSBXb3Jrc2hvcCBJSVdYWFhWIiwic3RhcnREYXRlIjoiMjAyMi0xMS0xNlQxNjowMDowMCIsImVuZERhdGUiOiIyMDIyLTExLTE4VDAwOjAwOjAwIiwibG9jYXRpb24iOiJDb21wdXRlciBIaXN0b3J5IE11c2V1bSwgMTQwMSBOIFNob3JlbGluZSBCbHZkLCBNb3VudGFpbiBWaWV3LCBDQSA5NDA0MyIsImxvZ28iOiJodHRwczovL3Jlc29sdmVyLmNoZXFkLm5ldC8xLjAvaWRlbnRpZmllcnMvZGlkOmNoZXFkOnRlc3RuZXQ6ejZqS1VKQTVZY1pzTnhaZ3NyUVBLUGlwTDJGUlRmNHMvcmVzb3VyY2VzLzgxNDBlYzNhLWQ4YmItNGY1OS05Nzg0LWExY2JmOTFhNGEzNSJ9LCJpc3N1ZXIiOnsiaWQiOiJkaWQ6Y2hlcWQ6bWFpbm5ldDp6QVh3d3FaemhDWkExTDc3WkJhOGZoVk5qTDlNUUNIWCJ9LCJzdWIiOiJkaWQ6a2V5Ono2TWt3VHI0NkJXVTQyWWVqbVpyRERDYkwxMjdkQm94U1hlTHVhSFM3NXZUQ2c3aSIsIm5iZiI6MTY2ODY1NTE0MywiaXNzIjoiZGlkOmNoZXFkOm1haW5uZXQ6ekFYd3dxWnpoQ1pBMUw3N1pCYThmaFZOakw5TVFDSFgifQ.U4vPbvdY7724a1jJwiDeCH_4_YC5sKUMcH6lY_XCVWBTE1RvYAnTj4fPHWMy6zSVFL9TAk4ZBOqFjKUtShBSCw"
  }
}

Dereferencing the schema

The VC references a schema hosted as a DID-Linked Resource. Resolving this DID URL returns:

{
  "@context": {
    "id": "@id",
    "type": "@type",
    "@version": 1.1,
    "schema": "http://schema.org/#",
    "xsd": "https://www.w3.org/2001/XMLSchema#",
    "reservationId": {
      "@id": "schema: reservationId",
      "@type": "xsd:string"
    },
    "reservationStatus": "schema: reservationStatus",
    "reservationFor": {
      "@id": "schema: reservationFor",
      "@type": "@id",
      "@context": {
        "name": "schema: name",
        "startDate": "schema: startDate",
        "endDate": "schema: endDate",
        "location": {
          "@id": "schema: location",
          "@type": "xsd: string"
        },
        "logo": "schema: logo"
      }
    }
  }
}

Verify a Verifiable Credential

Verify a SD-JWT Verifiable Credential, signed by a did:cheqd Decentralized Identifier (DID), using Credo and OpenID4VP.

Using the OpenID4VC module, you can verify OpenID compatible SD-JWT Credentials signed by a did:cheqd identifier. This guide walks through the flow of verification using the Credo Agent.

Prerequisites

Before you being, ensure you have:

  • Basic knowledge of Credo Agent configuration.

  • Issued a SD-JWT Verifiable Credential.

  • Presented a SD-JWT Verifiable Credential

Step 1: Configure the Verifier Agent

After setting the verifier as per these steps, configure the verifier as follows

// Create a verifier, assuming the agent is called 'verifier'
const openId4VcVerifier = await verifier.modules.openId4VcVerifier.createVerifier({})

// Create a did:key that we will use for signing OpenID4VP authorization requests
const verifierDidResult = await issuer.dids.create<KeyDidCreateOptions>({
  method: 'key',
  options: {
    keyType: KeyType.Ed25519,
  },
})

if (verifierDidResult.didState.state !== 'finished') {
  throw new Error('DID creation failed.')
}

const verifierDidKey = DidKey.fromDid(verifierDidResult.didState.did)

Step 2: Create an Authorization Request

Once you have configured the verifier, you can create an authorization request including an OpenID4VP presentation request based on DIF Presentation Exchange V2. The authorization request method will generate an authorization request URI that you can share with a holder.

const { authorizationRequest, verificationSession } =
  await verifier.modules.openId4VcVerifier.createAuthorizationRequest({
    verifierId: openId4VcVerifier.verifierId,
    requestSigner: {
      didUrl: `${verifierDidKey.did}#${verifierDidKey.key.fingerprint}`,
      method: 'did',
    },
    // Add DIF presentation exchange data
    presentationExchange: {
      definition: {
        id: '9ed05140-b33b-445e-a0f0-9a23aa501868',
        name: 'Employee Verification',
        purpose: 'We need to verify your employee status to grant access to the employee portal',
        input_descriptors: [
          {
            id: '9c98fb43-6fd5-49b1-8dcc-69bd2a378f23',
            constraints: {
              // Require limit disclosure
              limit_disclosure: 'required',
              fields: [
                {
                  filter: {
                    type: 'string',
                    const: 'AcmeCorpEmployee',
                  },
                  path: ['$.vct'],
                },
              ],
            },
          },
        ],
      },
    },
  })

Step 3: Add Event Listener to check Verification State Change

Add an event listener that listens for state changed events, this allows Verifier to know when the authorization session is complete.

// Listen and react to changes in the verification session
verifier.events.on<OpenId4VcVerificationSessionStateChangedEvent>(
  OpenId4VcVerifierEvents.VerificationSessionStateChanged,
  async (event) => {
    if (event.payload.verificationSession.id === verificationSession.id) {
      console.log('Verification session state changed to ', event.payload.verificationSession.state)
    }

    if (event.payload.verificationSession.state === OpenId4VcVerificationSessionState.ResponseVerified) {
      const verifiedAuthorizationResponse = await verifier.modules.openId4VcVerifier.getVerifiedAuthorizationResponse(
        verificationSession.id
      )
      console.log('Successfully verified presentation.', JSON.stringify(verifiedAuthorizationResponse, null, 2))

      console.log('Exiting...')
      process.exit()
    }
  }
)

DIDs and Identity Keys

Create did:cheqd DIDs for credential issuers and for DID-Linked Resources

Trust Registries

Create an end-to-end trusted ecosystem, using Trust Chains to build a full Trust Registry.

Payments

Create commercial models for verifiable credentials, such as verifier-pays-issuer

Status Lists

Create status lists, including Status List v2021 and Token Status List

Credentials

Issue any type of credential, including SD-JWT, VCDM and AnonCreds via our partners, including trust registries, status lists and payments.

Resources

Create custom resources for policies, presentation definitions, schemas and visual representations of credentials

Verifier pays Issuer

Understand how a Verifier pays an Issuer to decrypt an encrypted Status List and verify a Credential Status.

Set up your account

Set up your account with cheqd Studio and log in to start using the APIs.

Create an Issuer DID

Create a W3C conformant DID on cheqd using the did:cheqd DID Method.

Learn more about DID-Linked Resources

Understand the context and technical composition of cheqd's DID-Linked Resources.

did:cheqd Decentralized Identifier
Universally Unique Identifier (UUID)
Image showing a formatted DID URL for a cheqd resource

Understanding DID-Linked Resources

Detailed guide explaining the context and technical composition of DID-Linked Resources on cheqd.

Create DID-Linked Resource

Create a custom DID-Linked Resource for a schema, Trust Registry or other persistent data file.

Search DID-Linked Resources

Search and query for existing DID-Linked Resources on cheqd.

DID Resolution and DID URL Dereferencing

Architecture decision record explaining the different parameters for fetching DID Document data on cheqd, including DID-Linked Resources.

Cover

Credo

Credo is an SDK which supports the European Architecture and Reference Framework (ARF) standards as well as AnonCreds with full cheqd support for DIDs.

Cover

ACA-Py

ACA-Py is a quickly expanding SDK, moving from the AnonCreds ecosystem towards wider support for EUDI.

Cover

Veramo SDK Plugin

The Veramo SDK Plugin is an extension of the Veramo SDK, a JavaScript framework for Trusted Data, adding support for cheqd functionality.

Cover

DID Registrar

Simple setup for building cheqd DIDs into existing applications using REST APIs, building into the .

Cover

cheqd Cosmos CLI

Cosmos-native CLI for creating transactions on cheqd. Should be used for testing purposes only.

Cover

Godiddy

Godiddy from Danube Tech is a DID-specific SaaS offering focussed on enterprise registration and resolution of DIDs across multiple methods.

Cover

Truvera (Dock)

Truvera is a full platform that supports credential issuance and management using cheqd as the primary DID Method.

Cover

Identity Write Pricing

Click here to understand the price of DIDs and DID-Linked Resources on cheqd, compared to other identity networks.

cheqd
cheqd

Setup your Credo Agent

Setup the cheqd agent to start being able to use cheqd inside Credo.

Create a Decentralized Identifier (DID)

Use the cheqd DID module to start creating cheqd DIDs.

Create DID-Linked Resources (DLRs)

Create generic DID-Linked Resources, as well as schemas and credential definitions.

Issue a Verifiable Credential

Issue and present Verifiable Credentials using a cheqd DID.

AnonCreds

AnonCreds is a Zero-Knowledge Credential format, offering full Holder privacy and selective disclosure.

SD-JWT

Selective Disclosure JWT (SD-JWT) is the most commonly adopted credential format for European Digital Identity Ecosystems, allowing users to selectively disclose which attributes they would like to share in a presentation.

JSON-LD

JSON-LD (Linked Data) Credentials are a richer data format, allowing applications to follow embedded links to other pieces of Linked Data across the web.

Cover

Paradym (Animo Solutions)

Paradym by Animo Solutions fully supports EU Architecture & Reference Framework standards with cheqd under the hood.

Cover

Hovi Studio (Hovi)

Hovi provides an all-in-one platform for issuing and managing Verifiable Credentials with cheqd DIDs supported.

Cover

Sudo Platform (Anonyome Labs)

API-first developer platform for cheqd DIDs and support for multiple Verifiable Credential formats.

DIDs are, please go over to our learning site here.

Create DID

Create an Issuer DID with the did:cheqd DID method using ACA-Py.

Update DID

Update a did:cheqd DID using ACA-Py.

Deactivate DID

Deactivate a did:cheqd DID using ACA-Py.

Cover

cheqd Studio

Our API product enables users to use cheqd's functionality with minimal complexity and easily integrate APIs into existing apps.

Cover

Credo

Credo is an SDK which supports the European Architecture and Reference Framework (ARF) standards as well as AnonCreds with full cheqd support for DIDs.

Cover

DID Registrar

Simple setup for building cheqd DIDs into existing applications using REST APIs, building into the .

Cover

Veramo

The Veramo SDK plugin supports JSON, JSON-LD credentials as well as cheqd Credential Payments in an SDK.

Cover

Walt.id Community Stack

Walt.id Community Stack is an SDK that supports the standards for identity, with full cheqd support.

Cover

cheqd Cosmos CLI

Cosmos CLI which directly communicates with the cheqd network. This should only be used for testing environments.

Set up Trust Chain

Set up your Decentralized Trust Chain (DTC) on cheqd.

Overview

A Trust Chain is a hierarchical structure of Verifiable Accreditations (VAs) that connects a Trusted Issuer to a Root Trusted Accreditation Organisation (rTAO). This structure allows credentials to be verified as trustworthy using tools like TRAIN, by tracing authority through cryptographic delegation.

Each step in the chain is formalised using a Verifiable Accreditation, while the root is anchored using a Root Authorisation for Trust Chain, which establishes the governance framework of the ecosystem.

If you're ready to issue your first accreditation, skip ahead to use cheqd Studio:

Why Build a Trust Chain?

Trust Chains enable decentralized ecosystems to:

  • Delegate authority without centralized registries

  • Define and enforce governance frameworks

  • Enable TRAIN to validate credentials against trusted policies

  • Optionally anchor trust using DNS or X.509 proofs

This is especially useful in domains like education, health, supply chain, or finance where hierarchical authority is well established.


Key Roles in a Trust Chain

Role

Description

rTAO (Root Trusted Accreditation Organisation)

The top-level, highly trusted entity (e.g. government agency or standards body). It defines the governance framework and issues the root authorisation.

TAO (Trusted Accreditation Organisation)

An intermediary entity that is accredited by the rTAO or another TAO. It may accredit further entities.

Trusted Issuer

An entity accredited by a TAO or rTAO to issue Verifiable Credentials to holders.


Trust Chain Structure

Root Authorisation for Trust Chain (published by rTAO)
    ↓
Verifiable Accreditation from rTAO to TAO
    ↓
Verifiable Accreditation from TAO to Trusted Issuer
    ↓
Verifiable Credential (Attestation) issued to subject

Steps to Set Up a Trust Chain

1. Create an rTAO DID

Register a DID to represent your Root Trusted Accreditation Organisation (rTAO). This should be a recognised, high-trust entity.

Optionally, anchor this DID in DNS using a TXT or TLSA record for added assurance in tools like TRAIN.

2. Publish a Root Authorisation for Trust Chain

Before issuing any accreditations, the rTAO must publish a Root Authorisation for Trust Chain, which includes:

  • A URI for the governance framework

  • A human-readable trust framework ID

  • Supported credential schemas for the ecosystem

This authorisation forms the root of the trust graph and is referenced by all downstream Verifiable Accreditations.

3. Issue Verifiable Accreditations (VAs)

Use the rTAO to issue a Verifiable Accreditation to a TAO. This VA should:

  • Reference the Root Authorisation

  • Define the scope of trust (e.g. what credential types or domains the TAO can operate in)

  • Optionally include expiration or other constraints

4. Delegate Further to Trusted Issuers

Each TAO may issue Verifiable Accreditations to one or more Trusted Issuers, who are responsible for issuing actual Verifiable Credentials to end-users.


Example: Education Trust Chain

TAO: did:cheqd:gov-edu                    ← Department of Education
    └── Root Authorisation → "cheqd Governance Framework"
    ↓
TAO:  did:cheqd:state-certifier            ← State Certification Body
    ↓
Trusted Issuer: did:cheqd:university-123   ← Accredited University
    ↓
Verifiable Credential: Bachelor of Science

Each entity is linked by a signed Verifiable Accreditation, and all references point back to the initial Root Authorisation for Trust Chain.


Optional: DNS Anchoring for rTAOs

In decentralized ecosystems, trust can be strengthened by combining blockchain-based identity with traditional Web PKI. To support this, Root Trusted Accreditation Organisations (rTAOs) can anchor their DIDs in DNS records, enabling domain-level verification of the root of the trust chain.

Why Anchor Your rTAO in DNS?

Anchoring a DID in DNS provides:

  • 🔐 Cryptographic proof of domain control

  • 🌍 Public discoverability and auditability of the rTAO’s identity

  • ✅ Higher assurance in trust chain validation, especially for public sector or federated environments

  • 🤝 Interoperability with tools like TRAIN, which can validate trust chains using DNS lookups

This optional step is highly recommended if your governance model involves domain ownership or if trust must be externally verifiable.


How It Works: TDZM (Trust-DNS Zone Manager)

TDZM is a component that manages DNS zones where rTAOs can publish their DIDs as TXT or TLSA records. It integrates with DNS infrastructure to serve trust metadata for automated validation.

TRAIN uses TDZM to verify that:

  • The rTAO controls the claimed domain

  • The DID used in the trust chain is anchored in DNS

  • The governance framework is consistently represented

Create Bitstring Status List

Create a Bitstring Status List as a DID-Linked Resource (DLR) on cheqd, using cheqd Studio.

Users are able to create Bitstring Status List entries on-ledger, in order to revoke or suspend Verifiable Credentials. This is a derivation from the core spec made by cheqd to support a more decentralized and resilient approach to storing Status Lists.

Step 1: Set up your account

Make sure you have set up your account with cheqd Studio and are logged in, using our guide below:

Step 2: Create a DID

Before you can create a Status List, you need to create a DID which is used to link the Status List on-ledger. Use the API in the page below to create a DID:

Step 3: Select the unencrypted Status List API

When creating a Status List, a user will have the following options:

/credential-status/create/encrypted

Using this API will encrypt the bitstring of the Status List, meaning that a set of Payment Conditions will need to be met in order to access the Status List contents.

/credential-status/create/unencrypted

Using this API will create a regular Status List on-ledger, where the contents of the Status List are visible to any users who queries the blockchain.

For the purpose of this tutorial, we will assume the user is creating an unencrypted Status List. For encrypted Status Lists, follow the tutorial here.

Step 4: Create unencrypted Status List

Using the /credential-status/create/unencrypted API, users have two options for creating an encrypted Status List on-ledger:

  1. Filling out a simple form using the application/x-www-url-form-encoded option within an API client of your choice.

  2. Compiling a Status List payload yourself using the application/json option within an API client of your choice.

Option 1. Choose from a few variables and we will compile the Status List for you

This is the easiest way to create unencrypted Status Lists on cheqd and is recommended for users who are not overly familiar with compiling JSON objects.

Using the application/x-www-url-form-encoded option, users are able to choose between the following variables and options to create an unencrypted Status List on-ledger:

statusPurpose (required)
  • revocation (creates a Status List where each entry refers to revocation status)

  • suspension (creates a Status List where each entry refers to suspension status. Note that suspended Credentials may become unsuspended).

did (required)

Enter the Decentralized Identifier (DID) of the Status List publisher created in Step 2. For example:

did:cheqd:testnet:0ff9df5d-653b-4f77-a66c-0035abc34d63
statusListName (required)

This is the name of your Status List. This will also need to be kept consistent for all future updates of the same Status List. For example:

employmentCredentialRevocationList
length (optional)

The length of the Status List to be created. The default and minimum length is 140000 which is 16kb. For example:

140000
encoding (optional)

The encoding format of the encrypted StatusList DID-Linked Resource to be created.

  • base64url

  • base64

  • hex

statusListVersion (optional)

A user set value to represent the version of the Status List. For example:

1.0
alsoKnownAs (optional)

A user set field to assign a set of alternative URIs where the DID-Linked Resource can be fetched from. For example:

https://www.foo.com

Option 2. Publish a JSON payload yourself

Instead of using simple form variables, you can create an encrypted Status List using a JSON payload yourself using the application/json option on the Swagger UI.

Request format

An example of the JSON payload needed to be submitted is below:

{
  "did": "did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e",
  "statusListName": "cheqd-employee-credentials",
  "length": 140000,
  "encoding": "base64url"
}

Step 5: Hit the API

Once the Issuer has populated the requisite information for the unencrypted Status List request, they can use the API below to submit it to the ledger.

JSON-LD

Issue and present JSON-LD credentials signed by cheqd Decentralized Identifiers (DIDs), using Credo.

JSON-LD Verifiable Credentials follow the W3C Verifiable Credentials Data Model, enabling decentralized, semantically rich, and interoperable credential exchange.

In Credo, you can issue, verify, and present JSON-LD credentials over DIDComm v2, using the Issue Credential v2 and Present Proof v2 protocols—alongside support for Linked Data Proofs and various signature suites.

Get Started

Issue and present JSON-LD credentials with Credo using the tutorials below:


Why Use JSON-LD?

JSON-LD credentials are ideal for ecosystems that require:

  • Standards-aligned, interoperable credentials

  • Richly structured, linked data

  • Flexible signature types (e.g. Ed25519, BBS+)

  • Integration with W3C-conformant wallets and identity providers

  • Compatibility with OpenID for Verifiable Credentials (OID4VC) and EU Digital Identity Wallet initiatives


Extensibility for cheqd Functionality

Thanks to the flexibility of the W3C VC data model, JSON-LD credentials can be extended to support advanced cheqd-native features, including:

🔗 DID-Linked Resources

  • Credentials can reference schemas, governance frameworks, or legal documents published as DID-Linked Resources on the cheqd ledger

  • Use the termsOfUse or credentialSchema fields to point to cheqd-hosted resources

🏛️ Trust Registries

  • A credential can reference a trust registry (also a DID-Linked Resource) that defines the rules, requirements, or authorisations under which the credential was issued

🚫 Status Lists (Revocation)

  • cheqd-compatible Bistring Status List entries can be referenced using the credentialStatus field, enabling scalable and private revocation

  • These status lists can also be stored as DID-Linked Resources on cheqd

🔧 These extensions follow W3C patterns and require no change to the base data model—making them portable, verifiable, and standards-compliant.


Features Supported in Credo

Feature
Supported in ACA-Py

Issue JSON-LD credentials

✅ Yes

Present and verify JSON-LD credentials

✅ Yes

Support for multiple proof types

✅ Yes (Ed25519Signature2018, Ed25519Signature2020, etc.)

Use of external or on-chain contexts

✅ Yes

Support for DID-Linked Resources

⚠️ Via extensions and custom fields


Supported DID Methods

Credo natively supports signing JSON-LD credentials using DIDs such as:

  • did:key

  • did:web

  • did:cheqd

Create Token Status List

Create a Token Status List JWT or CWT as a DID-Linked Resource (DLR), using cheqd Studio.

Users are able to create Token Status List entries on-ledger, which may be used to represent whether a Verifiable Credential is active, inactive or suspended. This implementation on cheqd is a derivation from the core spec made by cheqd to support a more decentralised and resilient approach to storing Token Status Lists.

Step 1: Set up your account

Make sure you have set up your account with cheqd Studio and are logged in, using our guide below:

Step 2: Create a DID

Before you can create a Status List, you need to create a DID which is used to link the Status List on-ledger. Use the API in the page below to create a DID:

Step 3. Create your Status List JWT/CWT and save the file locally

Token Status Lists are JWT or CWT files that reference lists of bits formatted in JSON or CBOR.

Non-normative example for a Status List Token in JWT format
{
  "alg": "ES256",
  "kid": "12",
  "typ": "statuslist+jwt"
}
.
{
  "exp": 2291720170,
  "iat": 1686920170,
  "iss": "https://example.com",
  "status_list": {
    "bits": 1,
    "lst": "eNrbuRgAAhcBXQ"
  },
  "sub": "https://example.com/statuslists/1"
}
Non-normative example for a Status List Token in CWT format (not including the type header yet)
d28453a20126106e7374617475736c6973742b637774a1044231325860a502782168
747470733a2f2f6578616d706c652e636f6d2f7374617475736c697374732f310173
68747470733a2f2f6578616d706c652e636f6d061a648c5bea041a8898dfea19fffe
56a2646269747301636c73744a78dadbb918000217015d58400f2ca3772e10b09d5d
6ed56461f7cba1a816c6234072d1bb693db277048e5db5a4e64444492a9b781d6c7a
c9714db99cc7aadb3812ec90cab7794170bab5b473

Save this file locally and call it something like statusListToken.json

Note that each JWT or CWT must be below ~45kb in size.

Step 4: Encode the file

Prepare a file with resource and encode it into base64, base64url or hex. On Unix systems, you can use the following command input:

$ base64 -w 0 resource.json
<path-to-the-resource-file>

Expected output:

$ base64 -w 0 resource.json
SGVsbG8sIHdvcmxk

Step 5: Set the resource name and type

DID-Linked Resources are grouped by having identical names and types. This means if you want to create a new version of the same Resource, you will need to specify the same name and type in the following request.

For Token Status Lists, the "type" MUST be: "TokenStatusList".

For example:

{
    "data": "SGVsbG8sIHdvcmxk",
    "encoding": "base64url",
    "name": "DegreeCredentialStatus",
    "type": "TokenStatusList"
}

Step 6: Populate the request inputs and hit the API

Ensure that you link this Token Status List to the DID that you created in step 3. This will sign the resource with the same verification method keys in your DID Document, ensuring cryptographic integrity and Controllership of the Status List.

As a DID-Linked Resource, the Token Status List will have a fully resolvable DID URL which can be referenced within the body of Verifiable Credentials, and queried by verification policies to establish the status of the specific credential.

Step 7: Reference the Token Status List

Owing to the design of DID-Linked Resources, following the creation of the Token Status List, users are able to reference the specific version, or create a query to always fetch the latest version of the Token Status List.

Using a DID Resolver or the search DID endpoint, users can find the DID URL and unique resourceId of the Token Status List. The unique resourceId allows users to specify this exact version of the Token Status List.

In the DID Document Metadata, users should find "linkedResourceMetadata", like the following snippet:

"linkedResourceMetadata": [
      {
        "resourceURI": "did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d/resources/4e1104f9-2ee9-4bde-adc2-ab8ba72b124a",
        "resourceCollectionId": "0a5b94d0-a417-48ed-a6f5-4abc9e95888d",
        "resourceId": "4e1104f9-2ee9-4bde-adc2-ab8ba72b124a",
        "resourceName": "DegreeCredentialStatus",
        "resourceType": "TokenStatusList",
        "mediaType": "application/json",
        "resourceVersion": "",
        "created": "2023-03-24T12:13:45Z",
        "checksum": "6819aaecd4073173b159fedf8077c38e14939d03d58e7f4e2a0ddfe034eb2ed4",
        "previousVersionId": null,
        "nextVersionId": null
      } 

Specific version of the Token Status List

Here, the "resourceURI" specifies the DID URL of the specific Token Status List that was created.

Latest version of the Token Status List

In order to reference the latest version of the Token Status List, the following construction needs to be used:

did:cheqd:<namespace>:<resourceCollectionId>?resourceName=<resourceName>&resourceType=<resourceType>

For example:

did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d?resourceName=DegreeCredentialStatus&resourceType=TokenStatusList

Token Status List at specific point in time

In order to reference the Token Status List at a particular point in time, the following construction needs to be used:

did:cheqd:<namespace>:<resourceCollectionId>?resourceName=<resourceName>&resourceType=<resourceType>&resourceVerionTime=<XMLDateTime>

For example:

did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d?resourceName=DegreeCredentialStatus&resourceType=TokenStatusList&resourceVersionTime=2023-02-22T06:58:18.61Z

Privacy Considerations

Understand how privacy is protected throughout the credential payment flow.

Privacy considerations

cheqd's implementation of Credential Payments uses encrypted DID-Linked Resources (such as a Status Lists), with Payment Conditions required to unlock. Learn about cheqd's Access Control Condition logic below:

There are multiple areas within this flow where privacy needs to be maintained:

  1. Status List construction: Credential information within Status List should not constitute Personally Identifiable Information (PII).

  2. Verifier pays Issuer: Any payment for decrypting a Status List should not be correlatable to a Holder presenting or sharing a Credential.

Status List construction

The Bitstring Status List specification, which cheqd encrypts with payment conditions, utilises bitstrings to represent whether a Verifiable Credential has been suspended/revoked or not. A bitstring can be thought of as a long list of 1s and 0s, where, if the binary value of the position in the list is 1 (one), the verifiable credential is revoked, if it is 0 (zero) it is not revoked.

Graphic showing the Bitstring for a Status List

This works by tying each issued Credential with a position and index on the bitstring, so that a Verifier will be able to check the value within the Credential against the public bitstring to ascertain whether the Credential has been revoked or not, using a validate algorithm as well as a bitstring expansion algorithm.

As part of the bitstring construction. there is a minimum bitstring length of 131,072 entries (16kb uncompressed). Moreover, in this string, the indexes that are not specified are randomised between revoked and unrevoked. This means that there will never be a bitstring with a single entry, or a small amount of entries.

Using this type of construction, the privacy of the Holder is protected through "Herd Privacy" because there is no way that a third party can externally view the Status List and can correlate indices with a particular individual's credential without direct knowledge of a Holders' credential index.

The Bitstring Status List specification expands on these privacy considerations.

Verifier pays Issuer

As part of the Access Control Condition setup, the Issuer can set a single payment fee for meeting the Access Control Conditions and decrypting a particular Status List.

Through setting a flat price for decryption, there is no price variation from checking one persons' credential status versus another's. This means that for a particular Status List, all payments on the network will be made at the same price.

Once again, this creates a layer of "Herd Privacy" for the Holder, since the Credential index itself is decoupled from the payment fee. Therefore. while transactions will be visible on the network, there will be no way for a third party to surveil the network or draw conclusions about who's Credential status is being checked.

If there was a variation in the price per Credential status check within the same status list, this would be more likely to become correlatable, alongside other information, back to a specific individual.

Continual improvement

We will continue to improve and assess the privacy considerations as we roll out Credential Payments. Some areas we believe there may be scope for privacy leakage are as follows:

  • Holders' Credential index is doxxed: If a Holder has a particular Credential index doxxed, as well as a link to the status list, there may be scope to monitor the Credential Status of that individual, through a payment. However, third parties will not know when that Holder is using their Credentials.

  • Issuer creates single entry Status List with specific unlock price: If an Issuer does not use our preset Status List length and creates their own resource with a single or few entries, they may provide a higher likelihood of doxxing when an individual uses their Credential. This is why cheqd, and the specification, has enforced a minimum Status List length.

TAO -> SubTAO

Learn about structuring Verifiable Accreditations from a Trusted Accreditation Organisation (TAO) to a subordinate TAO (subTAO) on cheqd.

A Trusted Accreditation Organisation (TAO) can extend trust further down the hierarchy by accrediting Sub-Trusted Accreditation Organisations (SubTAOs). These SubTAOs may then be authorised to issue further Verifiable Accreditations or Verifiable Attestations, subject to defined constraints.

The Verifiable Accreditation should include:

Field
Description
Example

Permissions

The credentialSubject section outlines what the SubTAO is accredited to do — including supported credential types, relevant schemas, and jurisdictional constraints.

Whereby:

Field
Description

Policies

The termsOfUse field contains an AccreditationPolicy, which points back to both the parent accreditation and the original root authorisation. This maintains traceability through the full trust chain.

Whereby:

Field
Description

Example of fully formed Accreditation

The example below shows a Verifiable Accreditation that is issued by an TAO to a SubTAO, granting permission to issue further accreditations under a defined schema and policy chain.

For all Verifiable Accreditations, the accreditations are stored as DID-Linked Resources (DLRs), linked to the DID of the Accreditor. This means that the Accreditations are publically available, fully DID resolvable and are signed by the authentication keys within the DID Document of the Accreditor.

To issue a Verifiable Accreditation, follow the tutorial below:

RTAO -> TAO

Learn about structuring Verifiable Accreditations from a Root of Trust (rTAO) to a subordinate entity (TAO) on cheqd.

A Root Trusted Accreditation Organisation (rTAO) can delegate trust by issuing Verifiable Accreditations to Trusted Accreditation Organisations (TAOs). These accreditations define the permissions and scope under which the TAO can operate.

The Verifiable Accreditation should include:

Field
Description
Example

Permissions

The credentialSubject of the accreditation, issued by issuer defines what the TAO is authorised to do — including which credential types they can issue and in which jurisdictions.

Field descriptions:

Field
Description

Policies

The Root TAO can also set polices known as the AccreditationPolicy within the termsOfUse section of the Verifiable Accreditation.

Whereby:

Field
Description

Example of fully formed Accreditation

The example below shows a Verifiable Accreditation that is issued by an rTAO to a TAO, specifying a schema under which the recipient is able to use for issuing their own accreditations.

For all Verifiable Accreditations, the accreditations are stored as DID-Linked Resources (DLRs), linked to the DID of the Accreditor. This means that the Accreditations are publically available, fully DID resolvable and are signed by the authentication keys within the DID Document of the Accreditor.

To issue a Verifiable Accreditation, follow the tutorial below:

t

Issue JSON-LD Credentials

Issue JSON-LD Credentials signed by cheqd DIDs using Credo.

Present JSON-LD Credentials

Present JSON-LD Credentials using Credo.

Universal Registrar
Universal Registrar
European Architecture and Reference Framework (ARF)

Issuer

DID of the TAO

did:cheqd:testnet:a2b675de-33d0-4044-8183-0d74f210cceb

Subject

DID of the SubTAO that is being accredited

did:cheqd:testnet:e66a9416-d03e-4ced-95e3-07af16e25bc5

Credential Subject

A set of structured permissions around what credentials the SubTAO is accredited to issue, and in which jurisdiction.

See below

Terms of use

A set of policies setting out the scope of Trust Chain for Relying parties to validate against.

See below

"credentialSubject": {
    "id": "did:cheqd:testnet:e66a9416-d03e-4ced-95e3-07af16e25bc5",
    "accreditedFor": [
      {
        "schemaId": "did:cheqd:testnet:8ea036da-f340-480d-8952-f5561ea1763c/resources/b10146d7-0d0f-41e0-8ee3-c76db64890be",
        "types": [
          "VerifiableCredential",
          "VerifiableAccreditation",
          "VerifiableAttestation",
          "VerifiableAccreditationToAccredit"
        ],
        "limitJurisdiction": "https://publications.europa.eu/resource/authority/atu/FIN"
      }
    ]
  },

schemaId

Schema of the Verifiable Accreditation that the SubTAO is accredited to issue themselves

types

Types of Credential that the SubTAO is accredited to issue

limitJurisdiction

(Optional) Permission that the TAO can set to limit the jurisdictional scope of the credentials issued in the ecosystem

"termsOfUse": {
    "type": "AccreditationPolicy",
    "parentAccreditation": "did:cheqd:testnet:8ea036da-f340-480d-8952-f5561ea1763c/resources/18de60ec-bed1-42e5-980c-601c432bc60b",
    "rootAuthorisation": "did:cheqd:testnet:8ea036da-f340-480d-8952-f5561ea1763c/resources/18de60ec-bed1-42e5-980c-601c432bc60b"
  }

type

Must be AccreditationPolicy

parentAccreditation

The DID URL of the Accreditation issued by another TAO or the Root TAO to the TAO

rootAuthoroisation

The DID URL of the Root of Trust Verifiable Authorsation

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://schema.org/schema.jsonld",
    "https://veramo.io/contexts/profile/v1"
  ],
  "issuer": {
    "id": "did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e"
  },
  "type": [
    "VerifiableCredential",
    "VerifiableAccreditationToAccredit"
  ],
  "issuanceDate": "2024-08-07T02:08:30.000Z",
  "credentialSubject": {
    "accreditedFor": [
      {
        "schemaId": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e?resourceName=VerifiableAccreditation&resourceType=JSONSchemaValidator2020",
        "types": [
          "VerifiableCredential",
          "VerifiableAccreditation",
          "VerifiableAttestation",
          "VerifiableAccreditationToAccredit"
        ]
      }
    ],
    "id": "did:cheqd:testnet:6af412d7-2f04-4e12-a424-e6719db487ad"
  },
  "termsOfUse": {
    "type": "AccreditationPolicy",
    "parentAccreditation": "did:cheqd:testnet:8ea036da-f340-480d-8952-f5561ea1763c/resources/18de60ec-bed1-42e5-980c-601c432bc60b",
    "rootAuthorisation": "did:cheqd:testnet:8ea036da-f340-480d-8952-f5561ea1763c/resources/18de60ec-bed1-42e5-980c-601c432bc60b"
  },
  "proof": {
    "type": "JwtProof2020",
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vc2NoZW1hLm9yZy9zY2hlbWEuanNvbmxkIiwiaHR0cHM6Ly92ZXJhbW8uaW8vY29udGV4dHMvcHJvZmlsZS92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiVmVyaWZpYWJsZUF1dGhvcmlzYXRpb25Gb3JUcnVzdENoYWluIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImFjY3JlZGl0ZWRGb3IiOlt7InNjaGVtYUlkIjoiZGlkOmNoZXFkOnRlc3RuZXQ6OGVhMDM2ZGEtZjM0MC00ODBkLTg5NTItZjU1NjFlYTE3NjNjL3Jlc291cmNlcy9iMTAxNDZkNy0wZDBmLTQxZTAtOGVlMy1jNzZkYjY0ODkwYmUiLCJ0eXBlcyI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIlZlcmlmaWFibGVBY2NyZWRpdGF0aW9uIiwiVmVyaWZpYWJsZUF0dGVzdGF0aW9uIiwiVmVyaWZpYWJsZUFjY3JlZGl0YXRpb25Ub0FjY3JlZGl0Il0sImxpbWl0SnVyaXNkaWN0aW9uIjoiaHR0cHM6Ly9wdWJsaWNhdGlvbnMuZXVyb3BhLmV1L3Jlc291cmNlL2F1dGhvcml0eS9hdHUvRklOIn1dfX0sInN1YiI6ImRpZDpjaGVxZDp0ZXN0bmV0OjZhZjQxMmQ3LTJmMDQtNGUxMi1hNDI0LWU2NzE5ZGI0ODdhZCIsIm5iZiI6MTcyMjk5NjUxMCwiaXNzIjoiZGlkOmNoZXFkOnRlc3RuZXQ6YjAwM2RmNmYtZWM4ZS00OGRkLTlhMmItNzAxMWM1Y2YwYTVlIn0.CrEirG-Yki2HCfY6GjNR_Oqx0ZV6uJr1NPpTTLnVWfG1Q9R3YASj7IyEZ3FtVGRmdSNhQ9v2pmPijVxeBnwPAg"
  }
}

DID-Linked Resources

Learn about cheqd's approach to implementing DID-Linked Resources

Issue Verifiable Accreditation

Issue a Verifiable Accreditation to start a trust registry on cheqd

Issuer

DID of the Root of Trust (RTAO)

did:cheqd:testnet:8ea036da-f340-480d-8952-f5561ea1763c

Subject

DID of the TAO that is being accredited

did:cheqd:testnet:a2b675de-33d0-4044-8183-0d74f210cceb

Credential Subject

A set of structured permissions around what credentials the TAO is accredited to issue, and in which jurisdiction.

See below

Terms of use

A set of policies setting out the Governance Framework for the ecosystem

See below

"credentialSubject": {
  "id": "did:cheqd:testnet:a2b675de-33d0-4044-8183-0d74f210cceb",
  "accreditedFor": [
    {
      "schemaId": "did:cheqd:testnet:8ea036da-f340-480d-8952-f5561ea1763c/resources/b10146d7-0d0f-41e0-8ee3-c76db64890be",
      "types": [
        "VerifiableCredential",
        "VerifiableAccreditation",
        "VerifiableAttestation",
        "VerifiableAccreditationToAccredit"
      ],
      "limitJurisdiction": "https://publications.europa.eu/resource/authority/atu/FIN"
    }
  ]
}

schemaId

The schema the TAO is authorised to use when issuing accreditations or credentials

types

Credential types the TAO is permitted to issue

limitJurisdiction

(Optional) A geographic or regulatory restriction on where the accreditation is valid

"termsOfUse": {
    "type": "AccreditationPolicy",
    "parentAccreditation": "did:cheqd:testnet:8ea036da-f340-480d-8952-f5561ea1763c/resources/18de60ec-bed1-42e5-980c-601c432bc60b",
    "rootAuthorisation": "did:cheqd:testnet:8ea036da-f340-480d-8952-f5561ea1763c/resources/18de60ec-bed1-42e5-980c-601c432bc60b"
  }

type

Must be AccreditationPolicy

parentAccreditation

The DID URL of the Accreditation issued by another TAO or the Root TAO to the TAO

rootAuthoroisation

The DID URL of the Root of Trust Verifiable Authorsation

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://schema.org/schema.jsonld",
    "https://veramo.io/contexts/profile/v1"
  ],
  "issuer": {
    "id": "did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e"
  },
  "type": [
    "VerifiableCredential",
    "VerifiableAccreditationToAccredit"
  ],
  "issuanceDate": "2024-08-07T02:08:30.000Z",
  "credentialSubject": {
    "accreditedFor": [
      {
        "schemaId": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e?resourceName=VerifiableAccreditation&resourceType=JSONSchemaValidator2020",
        "types": [
          "VerifiableCredential",
          "VerifiableAccreditation",
          "VerifiableAttestation",
          "VerifiableAccreditationToAccredit"
        ]
      }
    ],
    "id": "did:cheqd:testnet:6af412d7-2f04-4e12-a424-e6719db487ad"
  },
  "termsOfUse": {
    "type": "AccreditationPolicy",
    "parentAccreditation": "did:cheqd:testnet:8ea036da-f340-480d-8952-f5561ea1763c/resources/18de60ec-bed1-42e5-980c-601c432bc60b",
    "rootAuthorisation": "did:cheqd:testnet:8ea036da-f340-480d-8952-f5561ea1763c/resources/18de60ec-bed1-42e5-980c-601c432bc60b"
  },
  "proof": {
    "type": "JwtProof2020",
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vc2NoZW1hLm9yZy9zY2hlbWEuanNvbmxkIiwiaHR0cHM6Ly92ZXJhbW8uaW8vY29udGV4dHMvcHJvZmlsZS92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiVmVyaWZpYWJsZUF1dGhvcmlzYXRpb25Gb3JUcnVzdENoYWluIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImFjY3JlZGl0ZWRGb3IiOlt7InNjaGVtYUlkIjoiZGlkOmNoZXFkOnRlc3RuZXQ6OGVhMDM2ZGEtZjM0MC00ODBkLTg5NTItZjU1NjFlYTE3NjNjL3Jlc291cmNlcy9iMTAxNDZkNy0wZDBmLTQxZTAtOGVlMy1jNzZkYjY0ODkwYmUiLCJ0eXBlcyI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIlZlcmlmaWFibGVBY2NyZWRpdGF0aW9uIiwiVmVyaWZpYWJsZUF0dGVzdGF0aW9uIiwiVmVyaWZpYWJsZUFjY3JlZGl0YXRpb25Ub0FjY3JlZGl0Il0sImxpbWl0SnVyaXNkaWN0aW9uIjoiaHR0cHM6Ly9wdWJsaWNhdGlvbnMuZXVyb3BhLmV1L3Jlc291cmNlL2F1dGhvcml0eS9hdHUvRklOIn1dfX0sInN1YiI6ImRpZDpjaGVxZDp0ZXN0bmV0OjZhZjQxMmQ3LTJmMDQtNGUxMi1hNDI0LWU2NzE5ZGI0ODdhZCIsIm5iZiI6MTcyMjk5NjUxMCwiaXNzIjoiZGlkOmNoZXFkOnRlc3RuZXQ6YjAwM2RmNmYtZWM4ZS00OGRkLTlhMmItNzAxMWM1Y2YwYTVlIn0.CrEirG-Yki2HCfY6GjNR_Oqx0ZV6uJr1NPpTTLnVWfG1Q9R3YASj7IyEZ3FtVGRmdSNhQ9v2pmPijVxeBnwPAg"
  }
}

DID-Linked Resources

Learn about cheqd's approach to implementing DID-Linked Resources

Issue Verifiable Accreditation

Issue a Verifiable Accreditation to start a trust registry on cheqd

Issue Verifiable Accreditation

Issue a type of Verifiable Accreditation, including authorisations for the trust chain, and subordinate accreditations

Issue Verifiable Accreditation

Issue a type of Verifiable Accreditation, including authorisations for the trust chain, and subordinate accreditations

Deploy TRAIN and Anchor rTAO in DNS

Add high assurance to your root DID, anchoring it within a DNS record.

Cover

Access Control Conditions

Understand how cheqd gates encrypted resources using payment conditions and Access Control logic.

Root Authorisations

Learn about establishing Root Authorisations for Trust Registries on cheqd.

What is a Root Authorisation?

A Root Authorisation — formally a Verifiable Authorisation for Trust Chain — defines the governance framework and trust rules for an entire decentralized trust ecosystem.

It serves as the starting point for all Verifiable Accreditations and Verifiable Credentials issued within a trust chain. Every accreditation and attestation must ultimately trace back to a valid Root Authorisation to establish its legitimacy.

The Root Authorisation anchors the root entity — the Root Trusted Accreditation Organisation (rTAO) — to a specific Trust Framework Policy, and enables verifiers to traverse the full chain of trust.


Purpose of a Root Authorisation

Function

Description

Define governance

Specifies the trust framework, operational rules, and any regulatory requirements for the ecosystem

Anchor trust

Establishes a verifiable starting point for all trust chains

Enable validation

Allows verifiers to confirm that any credential ultimately aligns with an approved governance framework


Key Characteristics

  • Credential Type: Must be of type VerifiableAuthorisationForTrustChain.

  • Issuer: The DID of the Root Trusted Accreditation Organisation (rTAO).

  • Credential Subject: The DID being authorised — this can either be:

    • The same DID as the issuer (self-authorisation), or

    • A different DID (delegated root authority to another trusted organisation).

  • Terms of Use: Must include a TrustFrameworkPolicy, referencing:

    • The name of the governance framework

    • A link (URL) to the full, published governance framework document


Required Fields

Field

Description

Example

Issuer

DID of the rTAO

did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e

Credential Subject

DID of the entity being root-authorised (same as issuer for self-authorisation, or a different trusted DID)

did:cheqd:testnet:6af412d7-2f04-4e12-a424-e6719db487ad

termsOfUse

Must include a TrustFrameworkPolicy with a governance framework reference

See Policies


Example of a Root Authorisation

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1"
  ],
  "issuer": {
    "id": "did:cheqd:testnet:c6630f1e-9248-4af6-b7ac-5bcaf646f213"
  },
  "type": [
    "VerifiableCredential",
    "VerifiableAuthorisationForTrustChain"
  ],
  "issuanceDate": "2025-04-01T07:19:55.000Z",
  "credentialSubject": {
    "id": "did:cheqd:testnet:0a35d559-00ff-41b6-81ad-f64faa522771",
    "accreditedFor": [
      {
        "schemaId": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:c6630f1e-9248-4af6-b7ac-5bcaf646f213?resourceName=AIAgentAuthorisation&resourceType=JSONSchemaValidator2020",
        "types": [
          "VerifiableCredential",
          "AIAgentAuthorisation"
        ]
      },
      {
        "schemaId": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e?resourceName=VerifiableAccreditation&resourceType=JSONSchemaValidator2020",
        "types": [
          "VerifiableCredential",
          "VerifiableAccreditation",
          "VerifiableAccreditationToAccredit"
        ]
      },
      {
        "schemaId": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e?resourceName=VerifiableAttestation&resourceType=JSONSchemaValidator2020",
        "types": [
          "VerifiableCredential",
          "VerifiableAttestation",
          "VerifiableAccreditationToAttest"
        ]
      }
    ]
  },
  "termsOfUse": {
    "type": "TrustFrameworkPolicy",
    "trustFramework": "DAIAA Governance Framework",
    "trustFrameworkId": "https://medium.com/quantum-economics/why-we-started-the-decentralized-ai-agent-alliance-6eb0938d7bc5"
  },
  "proof": {
    "type": "JwtProof2020",
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9..."
  }
}

Important Notes

  • Self-Authorisation: When the issuer and subject are the same DID, the rTAO self-declares adherence to the trust framework.

  • Delegated Root Authorisation: When the subject is a different DID, the rTAO is immediately empowering another trusted entity to operate under the framework.

  • Policy Binding: All downstream Verifiable Accreditations and Attestations must reference a chain of authorisations and accreditations back to this Root Authorisation.

  • DID-Linked Resource: The Root Authorisation should be published as a DID-Linked Resource (DLR) attached to the rTAO’s DID for discoverability and validation.


Visual Flow

Root Authorisation (rTAO defines framework)
         ↓
Verifiable Accreditation (TAO is authorised to operate)
         ↓
Verifiable Accreditation (Trusted Issuer is authorised)
         ↓
Verifiable Credential (End-user receives attestation)

Summary

Concept

Root Authorisation

Defines

The trust framework and governance for the ecosystem

Issued by

rTAO

Subject

Either rTAO itself or another trusted entity

Credential Type

VerifiableAuthorisationForTrustChain

Linked Policy

Trust Framework Policy

Deploy TRAIN and Anchor rTAO in DNS

Deploy the DNS Zone Manager and anchor your Root DID in a DNS Zone.

Overview

To enable DNS-based verification of root authorities in your trust ecosystem, TRAIN relies on a component called the TDZM (Trust-DNS Zone Manager). This component manages DNS zones where Root Trusted Accreditation Organisations (rTAOs) can anchor their DIDs using TXT or TLSA records.

This page explains how to deploy TDZM, anchor your rTAO, and configure the environment to support trust chain resolution using DNS.


Why Anchor Your rTAO in DNS?

Anchoring your rTAO in DNS enhances trustworthiness and auditability by:

  • Providing cryptographic proof of domain control

  • Allowing trust validators (like TRAIN) to verify the root of the trust chain against public DNS records

  • Increasing assurance in ecosystems where DNS-based trust is required (e.g., public sector, federated networks)


Deployment Options

You can deploy TDZM in two ways:

  1. Locally using Docker Compose

  2. In a Kubernetes Cluster using Helm charts


Option 1: Run Locally with Docker Compose

This is the easiest way to run TDZM for development and testing.

Steps:

  1. Navigate to the deploy/local directory in the TDZM repository.

  2. Run the deployment script:

bashCopyEdit./deploy.sh build

The build flag is optional but recommended to ensure you’re running the latest version.

This will launch:

  • A Keycloak instance for authentication

  • The TDZM backend

  • The TDZM UI

Local Access

  • TDZM Backend: http://localhost:16001

  • TDZM UI: http://localhost:8001/ui


Option 2: Deploy in Kubernetes (Production)

TDZM can be deployed in a Kubernetes cluster using Helm charts for both the backend and UI.

Prerequisites

  • Kubernetes cluster with Nginx Ingress Controller

  • TLS certificates available as Kubernetes secrets OR A Let’s Encrypt cert issuer setup via Ingress


Configure DNS Delegation

Before TDZM can manage your trust zone, you must configure your DNS provider:

  1. NS Record in the parent zone pointing to your TDZM instance Example:

    CopyEdittrust.federation1.com. NS ns1.trust.federation1.com.
  2. A Record resolving the nameserver to your TDZM server’s IP Example:

    cssCopyEditns1.trust.federation1.com. A 192.0.2.4

These records must be added in the parent zone (e.g., federation1.com) for your trust zone to be valid (trust.federation1.com).


Helm Configuration: TDZM Backend

When deploying the backend, set the following values in your Helm values.yaml file:

Property

Description

Example

zoneConfig.TF_DOMAIN_NAME

DNS zone managed by TDZM

trust.federation1.com

zoneConfig.TF_DOMAIN_IP

IP address for the NS server

192.0.2.4

zoneConfig.PRIMARY_SERVER_NSD

Domain of the primary nameserver

ns1.trust.federation1.com

zoneConfig.PRIMARY_SERVER_IP

IP of the primary nameserver

192.0.2.4

authConfigFileContent.ISSUER_URL

OIDC issuer for JWT validation

https://auth.federation1.com

authConfigFileContent.CLIENT_ID

Allowed client ID

tzdm-client

authConfigFileContent.ALLOW_UNSAFE_SSL

Skip SSL validation (not recommended)

false

Note: TDZM requires a shared volume (ReadWriteMany) for pod scaling. Ensure your cluster supports this (e.g., via NFS).


Helm Configuration: TDZM UI

UI configuration options:

Property

Description

Example

zonemgr_url

Backend URL

http://tdzm-backend.namespace.svc.cluster.local

oidc_issuer_url

OIDC server URL

https://auth.federation1.com

oidc_client_id

OIDC client ID

tzdm-ui-client

oidc_client_secret

Client secret

super-secret-value

ui_host

Public UI domain

ui.trust.federation1.com

app_base_url_path

Must be /ui

/ui


Next Step: Anchor Your rTAO DID

Once TDZM is running and DNS is delegated:

  1. Add a TXT record under your trust zone with the content linking your rTAO DID to the domain.

  2. Example DNS entry:

arduinoCopyEdit_did.trust.federation1.com. TXT "did:cheqd:mainnet:rtao123"

This DNS record will allow TRAIN to resolve and validate the rTAO’s DID during trust chain verification.


Summary

Component
Description

TDZM Backend

Manages DNS records and trust zones

TDZM UI

Provides web interface to manage delegations

TRAIN

Uses TDZM-managed DNS records to validate rTAO identities

DNS Provider

Must delegate NS and A records to the TDZM zone manager


postgres.env file

Set up your account

Set up your account with cheqd Studio and log in to start using the APIs.

Create an Issuer DID

Create a W3C conformant DID on cheqd using the did:cheqd DID Method.

Set up your account

Set up your account with cheqd Studio and log in to start using the APIs.

Create an Issuer DID

Create a W3C conformant DID on cheqd using the did:cheqd DID Method.

Use Trust Registries for AI Agents

Design, Build and Validate Trust Registries for AI Agents on cheqd.

Get Started

cheqd Trust Registries can be designed and built by companies that create AI agents, and verified by users of AI agents. Select your user type below to begin:

What are Trust Registries for AI Agents?

Trust Registries play a critical role in establishing trust for AI Agents. Acting as authoritative databases, they can verify the AI Agent is accredited and authorised to carry out certain actions, ensuring transparency and accountability.

Here’s how they support the AI ecosystem:

  • Accreditation of AI Agents: Trust Registries maintain verified records of AI agents, ensuring that they are accredited by trusted organisations or ecosystems. Through accreditations, these trust registries validate that AI agents are legitimate and scope the permissions under which the AI agent can operate within.

  • Transparency: Trust Registries enable users and organisations to query and verify the origins and accreditations of AI systems they engage with. By providing a publicly accessible record of trusted AI agents, Trust Registries empower stakeholders to assess the credibility and history of an AI system before utilising it. This enhances confidence in the system, especially when the AI’s decisions impact sensitive areas like personal data or legal outcomes.

  • Governance: Trust Registries also serve as a governance tool, ensuring that AI developers and platforms are held accountable for their actions. By maintaining a registry of accredited AI systems, these registries can track the ongoing compliance of AI agents, making it easier to enforce ethical standards and regulatory requirements. In the event of a failure or harm caused by an AI agent, Trust Registries offer a clear point of reference for auditing and resolving accountability issues.

cheqd has developed a robust Trust Registry solution, enabling users to establish hierarchical chains of trust, with each registry entry being DID-resolvable for enhanced transparency and security.

Capabilities of cheqd's Trust Registries for AI Agents

cheqd’s Agentic Trust combine and build upon tried and tested capabilities, already deployed at scale:

  • Integrations with popular AI/ML tooling, such as MCP servers for easing how AI agents can interface with decentralised identity.

  • Work with our SaaS (cheqd Studio) or Software Development Kits (SDKs) depending on your desired level of control versus simplicity.

  • SDKs in multiple software languages to suit preferences / skillsets.

  • Industry-leading whilst interoperable capabilities. e.g. DIDs, DID-linked resources, and Trust Registries.

Components of cheqd's AI Trust Registry Solution

Authorities can author trust registries and issue identifiers to agents using:

  • cheqd studio (SaaS APIs) for easy and quick integration with no deployment requirements

  • SDKs for more control and tighter integration

Agent frameworks, deployments or end-users can use:

  • Model Context Protocol (MCP) to surface responses directly to users via the agent, including a /who_is command which has the agent verify itself.

  • Hosted TRAIN APIs to verify Agent accreditations.

  • SDKs to hold & proof credentials, including verifying signatures.

Establishing a Trust Hierarchy

cheqd's Trust Registry model is predicated on the notion of a trust hierarchy, which is conceptually very similar to traditional Public Key Infrastructure (PKI). Specifically, the model relies on a Root of Trust from which trusted relationships can be established.

In our model for AI Agents, each organisation in the trust hierarchy is able to issue Verifiable Accreditations to other entities, conveying a set of permissions or scopes that determine what the recipient entity is permitted to do.

The following diagram shows an example of how an AI Agent Creator can accredit two AI Agents lower in the hierarchy:

Root DID (rTAO) accrediting or authorising sub-DIDs (TAOs)

Through this type of relationship, an AI Agent can prove that it is accredited by an AI Agent Creator through presenting the Verifiable Accreditation, which is stored on the cheqd blockchain.

Similarly, an AI Agent creator can prove that it is also trustworthy, demonstrating that it is a real actor rather than a fraudulent actor. In the diagram below, a Governance Authority (such as an accreditation body for AI Agent Creators) can accredit AI Agent Creators directly.

Full tree diagram of root DID accrediting DIDs, that accredit AI Agents.

Therefore, relying parties can query the accreditations of AI Agents all the way back to a Root of Trust.

Use cases for AI Agent Trust registries

Below are a series of use cases to which this solution architecture can be applied:

Use-case
Description
Governance authority
(Governance authority issued) Verifiable Accreditation
Organisation
(Organisation issued) Verifiable Accreditation

Ownership / representation

Verification of which agents are approved to represent which company for a given scope.

Group company

Company relationship

Subsidiary

Scope of representation

Agent Bill of Materials

Verifiable proof of the “supply chain” of an AI Agent, including who, how and when it was developed, trained, and deployed.

Framework

Agent Bill of Materials (e.g. model, corpus, used)

Not applicable

Not applicable

Regulatory compliance

Verifiable compliance with a given regulatory scheme for a given period.

Government (e.g. EU)

Authority to audit against EU AI Act

Auditor

Agent Compliance Certificate

Industry standard compliance

Verifiable compliance with an industry-body administered scheme.

Industry body (e.g. DAIAA, SAIA)

Agent Compliance Certificate (issued to Agent)

Not applicable

Not applicable

Security audit

Proof of a suitable and reputable security audit.

Security company

Agent Compliance Certificate (issued to Agent)

Not applicable

Not applicable

Generic trust check

The ability to state that a company or AI Agent trusts another for a given context.

Any organisation

“I trust this organisation”

Any organisation

“I trust this agent”

Learn more about cheqd's Trust Registry model

Read through some of our guides below to getting setup with trust registries on cheqd:

Setup Credo Agent

Setup your Credo Agent to get started.

This guide walks you through the setup process for a Credo Agent with support for cheqd DIDs and AnonCreds.

Prerequisites

Before you begin, make sure you have the following:

  • Node.js v16 or v18

  • Yarn or npm installed

  • A working Node.js or React Native project

  • Follow the Getting Started guide if you're new to Credo

Installing Cheqd

To enable cheqd in your agent, install the required package:

yarn add @credo-ts/cheqd
# or
npm install @credo-ts/cheqd

This package provides everything needed to register, resolve, and interact with did:cheqd identifiers and AnonCreds objects.

React Native Support

If you're using React Native, additional steps are needed to support cosmjs:

1. Use cosmjs-rn packages

Update your package.json using npm overrides or Yarn resolutions:

Example (NPM overrides):

{
  "overrides": {
    "@cosmjs/amino": "npm:@cosmjs-rn/amino@^0.27.1",
    "@cosmjs/encoding": "npm:@cosmjs-rn/encoding@^0.27.1",
    "@cosmjs/math": "npm:@cosmjs-rn/math@^0.27.1",
    "@cosmjs/stargate": "npm:@cosmjs-rn/stargate@^0.27.1",
    "@cosmjs/tendermint-rpc": "npm:@cosmjs-rn/tendermint-rpc@^0.27.1",
    "@cosmjs/utils": "npm:@cosmjs-rn/utils@^0.27.1",
    "@cosmjs/proto-signing": "npm:@cosmjs-rn/proto-signing@^0.27.1",
    "@cosmjs/crypto": "npm:@cosmjs-rn/crypto@^0.27.1"
  }
}

Example (Yarn resolutions):

{
  "resolutions": {
    "@cosmjs/amino": "npm:@cosmjs-rn/amino@^0.27.1",
    "@cosmjs/encoding": "npm:@cosmjs-rn/encoding@^0.27.1",
    "@cosmjs/math": "npm:@cosmjs-rn/math@^0.27.1",
    "@cosmjs/stargate": "npm:@cosmjs-rn/stargate@^0.27.1",
    "@cosmjs/tendermint-rpc": "npm:@cosmjs-rn/tendermint-rpc@^0.27.1",
    "@cosmjs/utils": "npm:@cosmjs-rn/utils@^0.27.1",
    "@cosmjs/proto-signing": "npm:@cosmjs-rn/proto-signing@^0.27.1",
    "@cosmjs/crypto": "npm:@cosmjs-rn/crypto@^0.27.1"
  }
}

2. Add Buffer Polyfill

Install the buffer package:

bashCopyEdityarn add buffer

Create a shim.js file:

tsCopyEditimport { Buffer } from 'buffer'
global.Buffer = Buffer

Then, import this shim in your entry point (e.g. before your App.tsx is rendered):

tsCopyEditimport './shim'

Adding cheqd to the Agent​

After installing the dependencies, we can register the cheqd module on the agent by adding the below code snippet to the agent constructor.

import { Agent, DidsModule, KeyType, DidDocument } from '@credo-ts/core'
import { agentDependencies } from '@credo-ts/node'
import { AskarModule } from '@credo-ts/askar'
import { askar } from '@openwallet-foundation/askar-nodejs'
import {
  ConnectionsModule,
  V2ProofProtocol,
  V2CredentialProtocol,
  ProofsModule,
  AutoAcceptProof,
  AutoAcceptCredential,
  CredentialsModule,
  HttpOutboundTransport,
  getDefaultDidcommModules,
} from '@credo-ts/didcomm'
import {
  CheqdAnonCredsRegistry,
  CheqdDidRegistrar,
  CheqdDidResolver,
  CheqdModule,
  CheqdModuleConfig,
} from '@credo-ts/cheqd'
import { AnonCredsModule } from '@credo-ts/anoncreds'
import { anoncreds } from '@hyperledger/anoncreds-nodejs'

const agent = new Agent({
  config,
  dependencies: agentDependencies,
  modules: {
    dids: new DidsModule({
      registrars: [new CheqdDidRegistrar()],
      resolvers: [new CheqdDidResolver()],
    }),

    // AnonCreds
    anoncreds: new AnonCredsModule({
      registries: [new CheqdAnonCredsRegistry()],
      anoncreds,
    }),

    // Add cheqd module
    cheqd: new CheqdModule(
      new CheqdModuleConfig({
        networks: [
          {
            network: '<mainnet or testnet>',
            cosmosPayerSeed: '<cosmos payer seed or mnemonic>',
          },
        ],
      })
    ),
    // Indy VDR can optionally be used with Askar as wallet and storage implementation
    askar: new AskarModule({
      askar,
    }),
    connections: new ConnectionsModule({
      autoAcceptConnections: true,
    }),
    credentials: new CredentialsModule({
      autoAcceptCredentials: AutoAcceptCredential.ContentApproved,
      credentialProtocols: [
        new V2CredentialProtocol({
          credentialFormats: [new LegacyIndyCredentialFormatService(), new AnonCredsCredentialFormatService()],
        }),
      ],
    }),
  },
})

The cosmosPayerSeed can be a 32-bit seed value or mnemonic. It can be managed using Leap wallet, which is available as a mobile app or browser extension for Chrome and Safari. Leap enables users to create accounts, exchange tokens, etc. To setup Leap wallet for cheqd follow the tutorial below:

Next steps

Now that your Credo agent is successfully set up to work with cheqd, try following our tutorials for creating a new DID or issuing Verifiable Credentials.

Create DIDs and Identity Keys

Create Decentralized Identifiers (DIDs) and identity keys using cheqd's DID Method (did:cheqd).

A Decentralized Identifier "DID" is a globally unique identifier that does not require a centralized registration authority because it is registered with distributed ledger technology or other form of decentralized network.

Learn about DIDs If you want to learn about what DIDs are, please go over to our learning site here.

What options do I have for creating DIDs on cheqd?

There are many different ways to create DIDs on cheqd, with options for easy integration (e.g. cheqd Studio) and more bespoke integrations (e.g. Credo, ACA-Py and Veramo). Below are a list of SDK options for creating cheqd DIDs.

Get started with cheqd Studio

The easiest way to start creating DIDs is with our product cheqd Studio, allowing users to build and create did:cheqd DIDs using REST APIs.

Partner SaaS support

cheqd DIDs are also supported in a range of SaaS offerings from cheqd partners, making it possible to use did:cheqd across different platforms:

Read up on our DID Method

DIDs created on cheqd use the did:cheqd DID Method. This is fully defined below, as well as the associated ledger-write fees:

Setup and Configure MCP Server

Setup and Configure your MCP Server to begin using cheqd's identity functionality with your AI Agent.

This is an advanced guide for those who want to integrate AI Agents with the Cheqd Network to create DIDs, Issue Verifiable Credentials and store Verifiable Credentials.

Overview

The Cheqd MCP Server is a specialised implementation of the (MCP) that integrates with the cheqd network to provide secure decentralised identity management capabilities for AI applications. Built on the powerful combination of MCP's standardised context protocol and cheqd's robust identity infrastructure, this server enables AI agents to perform sophisticated identity operations while maintaining security, privacy, and verifiability.

Our MCP server is designed as a modular toolkit that can be easily integrated with existing AI workflows, particularly through Claude Desktop, Cursor, and other MCP-compatible client applications.

Benefits of using MCP with cheqd

  • Enhanced AI Trust and Verification: Enable AI agents to create, resolve, and verify decentralised identities, establishing a foundation of trust for AI interactions.

  • Verifiable Credential Management: Simplify the issuance, verification, and management of verifiable credentials through standardised tools.

  • Decentralised Identity Operations: Leverage cheqd's blockchain infrastructure for creating and managing DIDs with cryptographic security.

  • Standardised AI Context: Utilise the Model Context Protocol to provide structured and verifiable context for AI interactions.

  • Human-in-the-loop Security: MCP's approval-based tool execution model ensures humans maintain oversight of sensitive identity operations.

  • Interoperable Integration: Seamlessly connect with existing identity ecosystems through the cheqd network and Credo Toolkit.

Integration with Credo Toolkit

The server includes deep integration with the Credo Toolkit (), which provides a comprehensive set of tools for interacting with the cheqd network through the OpenWalletFoundation's Credo-TS framework. This integration enables:

  • DID Management: Create, update, resolve, and deactivate DIDs on the cheqd network.

  • Resource Operations: Create and resolve DID-linked resources.

  • Schema Management: Define and retrieve credential schemas for standardised credential formats.

  • Connection Management: Establish secure DIDComm connections between identity holders and verifiers.

  • Credential Issuance: Generate and issue verifiable credentials with cryptographic proofs.

  • Verification Protocols: Implement zero-knowledge proof verification for enhanced privacy.

The Credo Toolkit abstracts the complexity of these operations, presenting them as simple, well-documented MCP tools that can be invoked by AI agents with appropriate permissions. By leveraging the Credo Toolkit integration, the MCP server provides comprehensive tools for managing the full lifecycle of decentralised identifiers (DIDs) and verifiable credentials on the cheqd network.

Target Use Cases and Scenarios

The Cheqd MCP Server is particularly well-suited for scenarios requiring trusted AI interactions with verifiable identity information:

  • AI-Assisted Identity Verification: Enable AI agents to verify user identities through cryptographically secured credentials.

  • Credential Issuance Workflows: Streamline the creation and issuance of verifiable credentials through AI-guided processes.

  • Trusted Data Exchange: Facilitate secure sharing of verified data between organisations using AI intermediaries.

  • Identity-Aware AI Systems: Build AI applications that respect privacy and understand the provenance of identity information.

  • Cross-Domain Verification: Enable verification of credentials across different systems and networks through the cheqd infrastructure.

  • Self-Sovereign Identity Management: Support user control over identity information while enabling AI assistance for complex operations.

Getting Started

Prerequisites

  • An MCP Compatible Desktop based AI Agent. We have tested with .

  • Working understanding of cheqd network: Understanding of DID operations and verifiable credentials.

  • Node.js 20 or higher (if running using npx).

  • Docker Desktop (if running using docker). This is preferred when running the ACA-Py demo.

Quick Start: Use the Remote MCP Server

The simplest way to get started with MCP and Trust Registry verification is to use our hosted remote MCP server.

Configuration

  • Open your Claude Desktop configuration file:

    • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

    • Windows: %APPDATA%\Claude\claude_desktop_config.json

  • Or, for Cursor .cursor/mcp.json

  • Add the following configuration:

  • Save the file and restart Claude Desktop.

  • You should now see the Trust Registry verification tools available in Claude Desktop/ Cursor.

Alternative: Local Installation (For Developers)

If you prefer to run the MCP server locally, with more control on the configuration and environment variables, you can run locally using docker.

1. Get the code

Get the docker-compose.yaml specially designed for Claude Desktop:

2. Create Configuration File

Update your local env.example file with the required environment variables:

Replace your-testnet-mnemonic with a valid mnemonic for the cheqd testnet. You can generate one using the cheqd CLI or get one from the cheqd faucet.

Server Configuration Options

Variable
Description
Default

Credo Tool Configuration Options

Variable
Description
Required

3. Update Claude Config

Add the following configuration to your claude_desktop_config.json or .cursor/mcp.json

4. Restart Claude Desktop

When successfully started, the MCP tools will be available.

Using the MCP with Trust Registry

Once configured, you can interact with the Trust Registry through Claude by:

  1. Using the verify-trust-registry tool to verify credentials against the Trust Registry

  2. Running a verification check for a cheqd DID or credential

For detailed usage examples, refer to our .

Next Steps

Now that you have the Cheqd MCP Server running, you can:

  • Explore the available tools for DID management and credential operations

  • Create your first verifiable credential using the provided tools

  • Set up a complete identity verification workflow

Create Verifier Pays Issuer flow

How a Verifier pays an Issuer to decrypt an encrypted Status List.

cheqd Studio supports payments for verifying Credential Status. This is an innovative feature that is also commonly known as cheqd's Payment Rails. Using the API in this tutorial, there are multiple ways for a Verifier to pay an Issuer to unlock and verify a Credential's status.

Step 1: Set up an account

A Verifier will need a cheqd Studio account to take advantage of the /credential-status/check API and easily use cheqd's Credential Payments. Make sure you are set up and are logged in, using our guide below:

Step 2: Set parameters for check

Using the /credential-status/check API, users have two options for checking whether a particular Credential index is revoked or suspended:

  1. Filling out a simple form using the application/x-www-url-form-encoded option on the Swagger UI.

  2. Compiling the JSON transaction yourself using the application/json option on the Swagger UI.

This is the easiest way to check whether a particular credential index is revoked or suspended.

Using the application/x-www-url-form-encoded option on the Swagger UI, users are able to choose between the following variables to compile your DID:

statusPurpose

The purpose of the status list that has already been created on-ledger. Can be:

  • revocation

  • suspension

did

DID of the StatusList2021 publisher, or the DID linked to the Status List resources. For example:

statusListName

The name of the existing Status List resource to be checked. For example:

index

The index within the bitstring that the user wants to query. For example:

Option 1: Automatically paying an Issuer to unlock a Credential Status

To automatically make a payment to an Issuer in order to verify an encrypted Status List, there is an additional variable:

makeFeePayment

This will automatically make the fee payment to the issuer (if required) based on payment conditions to unlock encrypted StatusList2021 DID-Linked Resource. This can be set to:

  • true (automatically make fee payment)

  • false (do not automatically make fee payment)

If there is sufficient CHEQ in the account of the Verifier, this will automatically make a payment to the Issuer and meet the Access Control Conditions.

Step 3: Hit the API

In the same action, the Credential Service will perform a verification check on the Credential Status and pay the issuer the fee specified in the Payment Conditions.

Response format

The response format below will indicate clearly whether the check is successful and whether the Credential index in question is revoked / suspended or not.

Option 2: Manually Paying an Issuer to unlock a Credential Status

If a Verifier does not want to automatically pay the Issuer using the API, they can choose to make a manual payment to unlock the Credential Status information to build a higher level of trust within the Credential presented to them.

Step 1: Locating Issuers' payment address and conditions

If a Verifier wants to unlock access to the Resource, to gain access to additional information about a Credential presented to them, such as the Credential Status, firstly, the Verifier will be presented Credential, including a link to the Status List within the "credentialStatus" section of the Credential body.

Through following the link in"credentialStatus" section of the Credential body. the The Verifier will be directed to an on-ledger Resource, identifiable through a DID URL, for example:

This on-ledger Resource will contain:

  • An encrypted potion of the Resource, such as a Status List bitstring. identified by the "encodedList" property.

  • Unencrypted metadata about the Resource, including the issuers' payment address "feePayerAddress" and and the Payment Conditions, "feePaymentAmount" and "intervalInSeconds".

This gives the verifier requisite information they need in order to pay the Issuer to unlock the Credential Status. You can learn more about Access Control Conditions below.

Step 2: Pay the Issuer

Using one of , Verifiers can make a payment of the amount specified in the "feePaymentAmount" to the "feePayerAddress".

This payment should be made in CHEQ.

Note that the "feePaymentAmount" may be specified in ncheq. This is lowest denomination of the CHEQ token, "nano" CHEQ which is 1 x 10^-9 CHEQ.

Step 3: Hit the API

cheqd Studio will perform a verification check on the Credential Status and pay the issuer the fee specified in the Payment Conditions.

Note the "intervalInSeconds" which is the amount of time after making the payment that the Verifier has to hit the API and request access to the encrypted Status List.

Response format

The response format below will indicate clearly whether the check is successful and whether the Credential index in question is revoked / suspended or not.

Alternatively, if Verifiers have made the payment manually they can also use the /credential/verify API in the tutorial below:

Access Control Conditions

Understand how cheqd's Payment Rails work with Access Control Conditions.

Access Control Conditions

The Access Control Conditions outlined in this section establish a secure and structured framework for unlocking encrypted Status Lists and other DID-Linked Resource.

By employing a combination of Decentralised Identifiers (DIDs), DID-Linked Resources, encryption, and timed payment mechanisms, these access control conditions safeguard the integrity of the Resource, promote transparency, and control access to its data.

Request format: Payment conditions

For Credential Payments, the predominant Access Control Condition is a payment made from the Verifier of a Credential back to the Issuer.

The payment conditions outlined in the code snippet below define the payment requirements that must be met to access and interact with an encrypted Resource. These are written into a payload.json file when a create Status List transaction is made to the ledger ().

These conditions are established to ensure that authorized entities or users contribute a specified fee before gaining access to the Resource.

The parameters within the payment conditions are defined as follows:

Parameter
Value
Description

By including these payment conditions in the Status List Payload, the ledger enforces a financial gate from verifiers seeking access. Additionally, the timelock mechanism adds a layer of time-based verification to the payment process. With the timelock, the payment can only be made in a specific time-interval from the latest block-time on the cheqd network. This ensures that historical payments cannot be used to meet the access control conditions, and fresh payments need to be made to access the Resource, helping to maintain the integrity of the payment and access process.

Response format: Access Control Conditions

If a Payment Condition is set upon creation of a Status List or other Resource, this will populate an Access Control Condition which is broadcasted across series of nodes to monitor whether the conditions have been met. The Access Control Condition uses query language to directly fetch information from the cheqd ledger, and is fully derived from the inputs made into the Payment Condition.

Each of these conditions are defined as follows:

Parameter
Value
Description

Once an Access Control Condition has been set, the decryption keys are sharded between an array of nodes to prevent any single node or few malicious nodes from decrypting the data. This comprehensive setup ensures secure and controlled access to the specified resource based on specified criteria and events from the cheqd blockchain.

Get started

Using cheqd Studio, you can get started setting up your encrypted Status Lists with Access Control Conditions below:

Issue Verifiable Credentials to AI Agent

Issue a Credential to an AI Agent using cheqd's APIs.

Once you have created your Trust Registry for the accreditation and authorisation of the organisations in your ecosystem, you can issue a credential to your AI Agent.

Step 1: Create DID for AI Agent

Each AI Agent must have its own DID to securely receive and manage credentials and accreditations. This identification allows the AI Agent to cryptographically control these credentials and accreditations.

Step 2: Choose Schema for Credential

As described in , you should have already designed and published schemas for your AI Agent ecosystem.

You must decide which schema to use for the credential you are issuing to the AI Agent. You should make sure that you, as an issuer, are accreditedToAttest for the specific credential schema you want to use.

Step 3: Compile Credential Request

To ensure the AI Agent's credentials are demonstrably verifiable to a root of trust, certain steps are essential in the credential issuance process.

For subjectDid use the DID created in Step 1.

An example of the request format is below:

The table below breaks down what components are required and why they are needed:

Field
Required?
Description

Step 4: Issue Verifiable Credential to AI Agent

Issue the compiled credential using the cheqd studio API enpoint below:

(Optional) Step 5: Publish Credential Response as a DID-Linked Resource

The Issuer, after issuing the credential to the AI Agent, may publish the response (the fully formatted verifiable credential) as a DID-Linked Resource.

The response format should look like the following example, including a proof (signed by the issuer).

You can follow the tutorial below to publish your issued credential as a DID-Linked Resource. Generally we suggest the resourceType of VerifiableAttestation for credentials issued to AI Agents.

This will store the schemas securely on the cheqd Network, where they can be fetched using DID URLs.

Step 5: Provision Verifiable Credential into AI Agent using MCP server

To complete the setup of your AI Agent trust registry and its associated credential, the final step is to provision this credential directly into the AI Agent's wallet using our MCP Server. Follow the tutorial below to finalize your setup!

Validate Trust Chain

Validate the trust chain of a credential using TRAIN, to recursively traverse back to a Root of Trust, and determine the accreditations and authorizations of an issuer Decentralized Identifier (DID).

Overview

TRAIN is a trust validation service that evaluates the trustworthiness of Verifiable Credentials (VCs) by checking whether the issuer's Decentralized Identifier (DID) can be traced back to a trusted source—known as a root of trust.

This page explains how TRAIN performs trust validation for credentials issued within the , using Decentralized Trust Chains (DTCs) to verify each step in the chain from the credential issuer to a recognized root authority.

Get started with TRAIN TTV API

Use the TRAIN APIs below to validate your trust chain:

What TRAIN Does

TRAIN's Trust Validator (TTV) validates credentials by:

  1. Taking a Verifiable Credential (VC) as input.

  2. Identifying the issuer DID from the credential.

  3. Following the credential's trust chain, resolving links between DIDs, Verifiable Accreditations, and Trust Anchors.

  4. Verifying whether the top-level (root) entity in the chain is a trusted source (e.g., DNS-anchored entity, government body, industry group).

  5. Producing a trust assessment (e.g., valid/invalid, verified/unverified) that can be consumed by relying parties.

How TRAIN Uses the cheqd Trust Anchor

Within the cheqd network, Trust Anchors represent root entities that can authorize other issuers via Verifiable Accreditations. These accreditations form Decentralized Trust Chains, which TRAIN evaluates to determine if a credential is trustworthy.

TRAIN integrates the cheqd Trust Anchor model by:

  • Recognizing VerifiableAccreditation credentials as establishing authority between entities.

  • Resolving these links recursively up the chain until it reaches a root-level DID.

  • Checking whether the root DID is associated with a DNS-anchored Trust Anchor using DNSTrustFrameworkPointer entries.

Validation Logic

When TRAIN evaluates a credential issued within cheqd's ecosystem, it performs the following checks:

  1. Credential Verification Validates the signature and schema of the input Verifiable Credential.

  2. Trust Chain Resolution Follows the termsOfUse field and associated VerifiableAccreditation resources to build the credential’s trust chain.

  3. Anchor Resolution Locates the root DID and evaluates whether it has a valid DNSTrustFrameworkPointer or other proof-of-authority reference (e.g., X.509 linkage).

  4. Anchor Validation Confirms that the root DID’s association with a domain name is cryptographically anchored using DNS-based proofs (e.g., DNS TXT records or TLSA).

  5. Policy Compliance (optional) Validates that the trust chain complies with local or domain-specific policy requirements (e.g., only accept credentials rooted in .gov domains).

TRAIN Trust Validator (TTV) Request Format

The following fields are used when submitting a request to the TRAIN Trustworthiness Validator (TTV). This validator checks whether the issuer of a Verifiable Credential is trustworthy by tracing their accreditations up a trust chain. The fields below are passed as JSON in the request body and instruct TRAIN on how to resolve and validate the issuer's authority and compliance with a defined trust policy.

TRAIN Trust Valdiator (TTV) Response Format

When a trust validation request is submitted, the TRAIN Trust Validator returns a structured JSON response describing the outcome of the trust chain evaluation. This includes the result of DNS anchoring checks (if requested) and the discovered trust framework that governs the credential's validation.

Below is a breakdown of each field returned in the response:

Benefits of Using TRAIN with cheqd

  • Decentralized Assurance: No need to trust a single registry—chains of accreditations are independently verifiable.

  • DNS Anchoring: Leverages globally resolvable domain infrastructure to provide high-assurance validation.

  • Interoperable: Built on open standards like DIDs, VCs, and JSON-LD for compatibility with other ecosystems.

Sequence Diagram for Validation

Below is a sequence diagram showing how a request is fully validated.

Issue Credentials and Presentations

Issue and manage Verifiable Credentials and Presentations, signed by cheqd Decentralized Identifiers (DIDs).

Verifiable Credentials are a tamper-evident data format for asserting a set of claims about a subject. You can issue and verify Verifiable Credentials and Presentations without building complex integrations, using our simple cheqd Studio APIs.

📚 Learn about Verifiable Credentials and Presentations

If you want to learn more about what

What options do I have for issuing credentials anchored on cheqd?

There are many different ways to issue verifiable credentials signed by DIDs anchored on cheqd, with options for easy integration (e.g. cheqd Studio) and more bespoke integrations (e.g. Credo and Veramo). Below are a list of options for issuing credentials with cheqd underneath:

Partner SaaS products

You can use SaaS products from our partners to create best-in-class credential ecosystems, built on cheqd:

Get started with cheqd Studio

Make sure you've and created your first DID, then you can start to:

Supported Credential types

cheqd supports all four major digital Credential types via its selection of SDKs and APIs. Below you can learn about these Credential formats:

Credential Coverage

Depending on what type of credentials you want to use, choose the SDK that suits your tech stack:

Functionality
cheqd Studio
Credo (and Paradym)
ACA-Py
Veramo
Walt.id

Setup ACA-Py Agent

Set up your ACA-Py agent to start using cheqd.

Pre-requisites

Before you begin, ensure you have a DID registrar and resolver running.

  • For testnet, you can use the (with cheqd driver) and a .

  • For mainnet, you must run your own cheqd DID registrar driver with the correct mnemonic configuration. Details are provided below.

Configuration

All sample configs and docker-compose files are available .

Cheqd DID Registrar Driver

To enable DID registration on Cheqd, you must deploy the Cheqd DID Registrar driver as a dedicated service. The fastest way to run the Cheqd Registrar driver is using the published docker image, for other options or to build your own container, check the .

Steps to deploy the Cheqd Registrar Driver

  1. Add the following under services section of your docker-compose file.

  2. Set the environment variables.

  3. Run the driver.

The Cheqd Registrar must be run as driver-did-cheqd because the Universal Registrar is configured with that name by default.

Universal Registrar Setup

The Universal Registrar allows dynamic DID registration for multiple DID methods, including Cheqd. Setting it up ensures seamless DID creation without manual configurations for different DID methods. The fastest way to run the Universal Registrar is using the published docker container, for other options check the .

Steps to setup Universal Registrar for Cheqd

  1. Add the following under services section of your docker-compose file.

  2. Start the Universal Registrar Service.

  3. Confirm that the Cheqd Driver properties are correct and matches your settings.

Cheqd DID Resolver

To run your own DID Resolver, the following settings must be added to your docker-compose file

Steps to deploy the Cheqd Resolver

  1. Add the following under services section of your docker-compose file.

  2. Run the resolver.

Plugin Configuration

Cheqd ACA-Py Plugin supports configuring the Universal Registrar and DID Resolver URLs via a plugin-config.yml file. These settings define how the agent interacts with the Cheqd network for DID operations.

Example plugin-config.yml:

Update the URLs if you have your hosted versions or using the Universal Resolver.

Wallet Compatibility

The Cheqd plugin only works with the askar-anoncreds wallet type. Askar-anoncreds is the preferred wallet due to its support for AnonCreds and enhanced security features.

Setting Up Askar Wallet in ACA-Py

When starting ACA-Py, ensure that the wallet-type is set to askar. Example:

Recommended Wallet Storage: PostgreSQL

Using PostgreSQL as a wallet storage backend is recommended for scalability and data persistence.

Setting Up PostgreSQL for ACA-Py

  1. Install PostgreSQL and create a database for ACA-Py.

  2. Configure ACA-Py to use PostgreSQL, add the following to ./configs/settings.yml:

  3. Start ACA-Py with PostgreSQL-backed wallet storage.

Build the Agent and deploy

  1. Example Dockerfile:

  2. Build the ACA-Py Agent docker image with the plugin.

  3. Deploy the agent. Sample docker-compose is below.

  4. Where all the plugin settings are populated in ./configs/settings.yml , a sample file is .

  5. Run the Agent.

Next steps

Now that your ACA-Py agent is successfully set up to work with cheqd, try following our tutorials for creating a new DID or issuing Verifiable Credentials.

    "paymentConditions": [
        {
            "type": "timelockPayment",
            "feePaymentAddress": "cheqd1xl5wccz667lk06ahama26pdqvrkz5aws6m0ztp",
            "feePaymentAmount": "147603000000000ncheq",
            "intervalInSeconds": 3153600000
        }
    ],

"type"

"timelockPayment"

Indicates that a timelock payment mechanism is employed. Currently, this is the only type that is supported.

"feePaymentAddress"

"cheqd1xl5wccz667lk06ahama26pdqvrkz5aws6m0ztp"

Specifies the cheqd address to which the payment fee should be sent. This address is associated with the entity managing the Status List (Issuer) and who will receive the payment.

"feePaymentAmount"

"147603000000000ncheq"

Defines the amount of the payment fee. In this case, the fee is specified in the smallest unit of CHEQ, (ncheq).

"intervalInSeconds"

3153600000

Sets the duration of the timelock interval, measured in seconds. The verifier must make the payment within the specified time frame relative to a particular block-time on the cheqd blockchain. If the payment is successfully confirmed within this interval, the Verifier's access to the Resource is granted. However, if the payment claim is made outside of this window, it may be considered invalid, and the verifier's access to the Resource may be denied.

{
    "unifiedAccessControlCondition": {
        "conditionType": "cosmos",
        "path": "/cosmos/tx/v1beta1/txs?events=transfer.recipient='cheqd1xl5wccz667lk06ahama26pdqvrkz5aws6m0ztp'&events=transfer.amount='147603000000000ncheq'&order_by=2&pagination.limit=1",
        "chain": "cheqdMainnet",
        "method": "timelock",
        "parameters": ["latest"],
        "returnValueTest": {
            "key": "$.tx_responses.*.timestamp",
            "comparator": "<=",
            "value": "3153600000"
        }
    },
    "returnTxResponse": true
}

"conditionType"

"cosmos"

Specifies the type of condition being employed, indicating that the access control condition is related to the Cosmos blockchain ecosystem

"path"

"/cosmos/tx/v1beta1/txs?events=transfer.recipient='cheqd1xl5wccz667lk06ahama26pdqvrkz5aws6m0ztp'&events=transfer.amount='147603000000000ncheq'&order_by=2&pagination.limit=1"

Defines the query path to retrieve specific transaction events from the cheqd blockchain. It filters transactions with a recipient address and amount matching certain criteria, orders the results, and limits the query to one transaction.

"chain"

"cheqdMainnet"

Specifies the blockchain network (chain) being used, indicating that the condition applies to the cheqd Mainnet.

"method"

"timelock"

Specifies the access control method being utilized, which is a timelock mechanism.

"parameters"

"latest"

Provides parameters for the access control method. In this case, it refers to the "latest" state on the blockchain

"key"

"$.tx_responses.*.timestamp"

Specifies the key path within the transaction responses to extract the timestamp of the transaction.

"comparator"

"<="

This checks if the extracted timestamp is less than or equal to the provided value.

"value"

"3153600000"

Defines the value (in seconds) against which the extracted timestamp is compared. This value represents a time interval.

see section below on creating an encrypted Status List

Charge for Status List

Set your payment conditions and encrypt a Status List 2021 Resource.

Issue Credential with Encrypted Status List

Issue a Verifiable Credential referencing an encrypted Status List in the Credential body.

Verifier pays Issuer

Pay an Issuer directly in CHEQ, meeting the Access Control Conditions. Verify the Credential to view the Status information.

Field

Required

Description

Example Value

issuer

✅ Yes

The DID of the issuer of the Verifiable Credential being validated. Must be a valid did:cheqd DID.

did:cheqd:testnet:975f1941-9313-41d4-ac8b-88fedda7ce80

type

✅ Yes

An array of credential types. The first must always be "VerifiableCredential"; any additional values represent the VC subtype.

[ "VerifiableCredential", "MuseumPassCredential" ]

termsofuse

✅ Yes

The policy name or type under which the credential is issued. Indicates which validation logic TRAIN should apply.

"AttestationPolicy"

parentAccreditation

✅ Yes

A DID URI pointing to the VerifiableAccreditation that proves the issuer was accredited by a higher authority (i.e. part of a trust chain).

did:cheqd:testnet:07b4e2cb-b0b8-444e-8ed4-b0920115a45e?resourceName=TrustedIssuerAccreditation&resourceType=VerifiableAccreditationToAttest

credentialSchema

❌ Optional

URI for a JSON schema to validate the structure of the credential. If not provided, TRAIN will use the schema defined in the accreditation itself.

https://resolver.cheqd.net/.../resourceName=MuseumPassCredentialSchema&resourceType=JsonSchemaValidator2018

DNSTrustFrameworkPointers

❌ Optional

A list of DNS domains used to verify that the root DID is also DNS-anchored. If not provided, TRAIN will still validate the root DID alone.

[ "cheqd.testtrain.trust-scheme.de" ]

Field

Type

Description

Example

VerificationStatus

boolean

Indicates whether the root DID was successfully matched against a DNS record. Will only be true if DNS verification was performed and succeeded.

true

VerificationResult

object

Contains detailed information about the accreditation chain, root DID, and DNS verification process.

—

VerificationResult.AccreditorDIDs

string[]

An ordered array of DIDs representing each entity in the accreditation chain, from the VC issuer up to the root authority.

[ "did:cheqd:issuer", "did:cheqd:intermediary", "did:cheqd:root" ]

VerificationResult.FoundRootIssuerDID

string

The root DID at the top of the trust chain (i.e. the ultimate Trust Anchor).

"did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e"

VerificationResult.TrustFramework

string

A URL pointing to the governance or policy framework that governs this trust chain. This is sourced from the root authorisation (VerifiableAuthorisation).

"https://learn.cheqd.io/governance/start"

VerificationResult.TrustFrameworkId

string

A human-readable name or ID of the trust framework, also derived from the root authorisation metadata.

"cheqd Governance Framework"

VerificationResult.FindingCorrespondingDNSTrustFrameworkInitiated

boolean

Indicates whether TRAIN attempted to look up a DNS pointer associated with the root DID.

true

VerificationResult.VerifyRootIssuerDIDinDNS

boolean

Indicates whether the root DID was successfully verified via a DNS TXT/TLSA record.

true

cheqd ecosystem

TRAIN TTV API

Validate your Trust Chain using the TRAIN Trust Validator APIs.

JSON based JWT Verifiable Credential (spec)

✔️

✔️

✔️

✔️

✔️

JSON-LD Verifiable Credential (spec)

✔️

✔️

✔️

✔️

✔️

AnonCreds (spec)

❌

✔️

✔️

❌

❌

Selective Disclosure-JWT Credential (spec)

❌

✔️

⌛(roadmap)

⌛(roadmap)

✔️

Verifiable Credentials and Presentations are, please go over to our learning site here.
set up your account with cheqd Studio
Cover

Credo

Credo is an SDK which supports the European Architecture and Reference Framework (ARF) standards as well as AnonCreds with full cheqd support for DIDs.

Cover

ACA-Py

ACA-Py (Aries Cloud Agent Python) is an SDK that can issue AnonCreds, JSON-LD and SD-JWT credentials with full cheqd support.

Cover

cheqd Studio

Our API product supports simple credential issuance in JSON and JSON-LD formats.

Cover

Veramo

The Veramo SDK Plugin supports JSON, JSON-LD credentials as well as cheqd Credential Payments in an SDK.

Cover

Walt.id Community Stack

Walt.id Community Stack is an SDK that supports the European Architecture and Reference Framework (ARF) standards for identity, with full cheqd support.

Cover

Paradym (Animo Solutions)

Paradym by Animo Solutions fully supports EU Architecture & Reference Framework standards with cheqd under the hood.

Cover

Truvera (Dock)

Truvera is a full platform that supports credential issuance and management using cheqd as the primary DID Method.

Cover

Hovi Studio

Hovi provides an all-in-one platform for issuing and managing Verifiable Credentials with cheqd DIDs supported.

Cover

Cloud Platform (Walt.id)

Cloud Platform by Walt.id similarly fully supports EU Architecture & Reference Framework standards with cheqd under the hood.

Cover

Sudo Platform (Anonyome Labs)

API-first developer platform for cheqd DIDs and support for multiple Verifiable Credential formats.

Cover

DIDx

DIDx supports did:cheqd through an enterprise version of ACA-Py, supporting AnonCreds and JSON-LD.

Issue Credentials

Issue W3C conformant Verifiable Credentials easily over REST API.

Verify Credentials

Verify whether Credentials are valid, have been tampered or have expired.

Verify Presentations

Verify whether a combination of Credentials are valid, have been tampered or have expired.

SD-JWT

Selective Disclosure JWT (SD-JWT) is the most commonly adopted credential format for European Digital Identity Ecosystems, allowing users to selectively disclose which attributes they would like to share in a presentation.

JSON (JWT)

JSON Web Token (JWT) Credentials are a simple way to transmit Trusted Data as a JSON object.

JSON-LD

JSON-LD (Linked Data) Credentials are a richer data format, allowing applications to follow embedded links to other pieces of Linked Data across the web.

AnonCreds

AnonCreds is a credential format maintained by the Hyperledger Foundation, with functionality for zero knowledge proofs (ZKPs) and selective disclosure.

driver-did-cheqd:
    image: ghcr.io/cheqd/did-registrar:production-latest
    platform: linux/amd64
    ports:
      - "9089:3000"
    restart: on-failure
    environment:
      - FEE_PAYER_TESTNET_MNEMONIC=${FEE_PAYER_TESTNET_MNEMONIC}
      - FEE_PAYER_MAINNET_MNEMONIC=${FEE_PAYER_MAINNET_MNEMONIC}
export FEE_PAYER_TESTNET_MNEMONIC="your testnet mnemonic phrase ..."
export FEE_PAYER_MAINNET_MNEMONIC="your mainnet mnemonic phrase ..."
docker-compose up -d
did_registrar:
    image: universalregistrar/uni-registrar-web:latest
    platform: linux/amd64
    ports:
      - "9080:9080"
    depends_on:
      - driver-did-cheqd
docker-compose up -d
curl -X GET http://localhost:9080/1.0/properties
did_resolver:
    image: ghcr.io/cheqd/did-resolver:latest
    platform: linux/amd64
    ports:
      - target: 8080
        published: 8080
        mode: host
    restart: on-failure
    environment:
      MAINNET_ENDPOINT: "grpc.cheqd.net:443,true,5s"
      TESTNET_ENDPOINT: "grpc.cheqd.network:443,true,5s"
      LOG_LEVEL: "warn"
      RESOLVER_LISTENER: "0.0.0.0:8080"
docker-compose up -d
resolver_url: "http://localhost:8080/1.0/identifiers/"
registrar_url: "http://localhost:9080/1.0/"
aca-py start --wallet-type askar-anoncreds --wallet-storage-type postgres_storage
wallet-name: issuer
wallet-key: somesecret
wallet-storage-type: postgres_storage
wallet-storage-creds: '{"account":"postgres","password":"postgres","admin_account":"postgres","admin_password":"postgres"}'
wallet-storage-config: '{"url":"localhost:5432","max_connections":5}'
aca-py start --arg-file ./configs/settings.yml
FROM ghcr.io/openwallet-foundation/acapy:py3.12-1.1.0

USER root

# install plugins as binaries
RUN pip install git+https://github.com/openwallet-foundation/acapy-plugins@main#subdirectory=cheqd

USER $user
COPY ./configs configs

ENTRYPOINT ["aca-py"]
docker build -t issuer-agent .
issuer:
    image: issuer-agent:latest
    ports:
      - "3001:3001"
      - "3002:3002"
    command: >
      start --arg-file ./configs/settings.yml
    healthcheck:
      test: curl -s -o /dev/null -w '%{http_code}' "http://localhost:3001/status/live" | grep "200" > /dev/null
      start_period: 30s
      interval: 7s
      timeout: 5s
      retries: 5
    depends_on:
      - did_registrar
      - did_resolver
docker-compose up -d
Universal Registrar
DID registrar
resolver
here
GitHub repository
Universal Registrar GitHub repository
here

Create a DID

Create an Issuer DID using the did:cheqd DID method.

Issue a Verifiable Credential

Issue a Verifiable Credential using ACA-Py signed by a cheqd DID.

Leap Wallet

Manage your CHEQ natively through the Leap Wallet with full support on desktop, browser and mobile.

Create a DID

Create an Issuer DID with the did:cheqd DID method using Credo.

Issue a Verifiable Credential

Issue a Verifiable Credential (AnonCreds) using Credo signed by a did:cheqd DID.

Cover

cheqd Studio

Our API product enables users to use cheqd's functionality with minimal complexity and easily integrate APIs into existing apps.

Credo

Credo is an SDK which supports the European Architecture and Reference Framework (ARF) standards as well as AnonCreds with full cheqd support for DIDs.

ACA-Py

ACA-Py is a quickly expanding SDK, moving from the AnonCreds ecosystem towards wider support for EUDI.

Veramo

The Veramo SDK Plugin supports JSON, JSON-LD credentials as well as cheqd Credential Payments in an SDK.

Walt.id Community Stack

Walt.id Community Stack is an SDK that supports the European Architecture and Reference Framework (ARF) standards for identity, with full cheqd support.

DID Registrar

Simple setup for building cheqd DIDs into existing applications using REST APIs, building into the Universal Registrar.

cheqd Cosmos CLI

Cosmos CLI which directly communicates with the cheqd network. This should only be used for testing environments.

Create a DID

Create a Decentralized Identifier (DID) using the did:cheqd DID method using cheqd Studio.

Create a Subject DID

Create an off-ledger 'Subject' or 'Holder' DID using the did:keyDID method.

Resolve DID

Resolve a DID to retrieve the associated DID Document.

Godiddy

Godiddy from Danube Tech is a DID-specific SaaS offering focussed on enterprise registration and resolution of DIDs across multiple methods.

Paradym

Paradym by Animo Solutions fully supports EU Architecture & Reference Framework standards with cheqd under the hood.

Truvera (Dock)

Truvera is a full platform that supports credential issuance and management using cheqd as the primary DID Method.

Hovi Studio

Hovi provides an all-in-one platform for issuing and managing Verifiable Credentials with cheqd DIDs supported.

Cloud Platform (Walt.id)

Cloud Platform by Walt.id similarly fully supports EU Architecture & Reference Framework standards with cheqd under the hood.

Sudo Platform (Anonyome Labs)

API-first developer platform for cheqd DIDs and support for multiple Verifiable Credential formats.

DIDx

DIDx supports did:cheqd through an enterprise version of ACA-Py, supporting AnonCreds and JSON-LD.

cheqd DID Method

Click here to learn more about the cheqd DID method (did:cheqd).

DID Write Pricing

Click here to understand the price of DIDs and other resources on cheqd, compared to other identity networks.

Cover
Cover
Cover
Cover
Cover
Cover
Cover
Cover
Cover
Cover
Cover
Cover
Cover
Cover
Cover
Cover

🖐️ I want to set up a Trust Registry for my AI Agent

Design, build and configure your AI Agent trust registry with cheqd Studio and our MCP server.

✅ I want to verify the trust in AI Agents I am using

Use our trust registry validation prompts to get AI agents to identify themselves and demonstrate their trustworthiness against a trust registry.

Decentralized Trust Chains (DTCs)

Take a deep dive into the architecture and model for cheqd's trust registries.

Set Up Trust Chain

Set up a generic trust chain using our cheqd Studio APIs.

Get Started with TRAIN

Set up and start using our trust registry valdation engine called TRAIN.

Cover
Cover
Cover
Cover
Cover
cheqd and Animo AnonCreds demo
"mcpServers": {
    "cheqd-mcp": {
        "command": "npx",
        "args": [
            "mcp-remote",
            "https://remote-mcp.cheqd.io/mcp"
        ],
    }
}
# Clone the repository
git clone https://github.com/cheqd/mcp-toolkit.git
cd mcp-toolkit
./env.example
TOOLS="credo"                                # Required tool configuration
PORT="5000"                                # The Port where the Remote MCP Server will run
CREDO_PORT="3000"                            # Port for the Credo agent
CREDO_NAME="faber"                        # Name of the Credo agent
CREDO_ENDPOINT="http://faber:3000"        # Public endpoint connections
CREDO_CHEQD_TESTNET_MNEMONIC="your-testnet-mnemonic" # Required for cheqd network access
TRAIN_ENDPOINT="https://dev-train.trust-scheme.de/tcr/v1/"    # The TRAIN endpoint for verification of trust registry 

TOOLS

Comma-separated list of tools to enable

"credo"

PORT

The port where remote MCP server will run

5000

CREDO_CHEQD_TESTNET_MNEMONIC

Mnemonic for cheqd testnet wallet

Yes

CREDO_PORT

Port for the Credo agent

No

CREDO_NAME

Name for the Credo agent

No

CREDO_ENDPOINT

Public endpoint for DIDComm connections

No

TRAIN_ENDPOINT

The endpoint for verifying trust registry

No

{
  "mcpServers": {
    "cheqd": {
      "command": "docker",
      "args": [
        "compose",
        "-f",
        "/path/to/repo/mcp-toolkit/docker/docker-compose.yml",
        "run",
        "--rm",
        "-p", 
        "3000:3000",
        "--name",
        "faber",
        "-T",
        "mcp-server"
      ]
    }
  }
}
Model Context Protocol
@cheqd/mcp-toolkit-credo
Claude Desktop
Trust Registry Verification Guide

Create AI Agent DID

Create a new did:cheqd DID for the AI Agent.

Import AI Agent Credential

Import and provision a JWT Credential to your AI Agent

Issue Credentials

Issue Verifiable Credentials signed by cheqd DIDs using MCP Toolkit.

Verify Credentials

Verify a Credential using MCP Toolkit.

did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0
employmentCredentialRevocationList
10
{
  "checked": true,
  "revoked": false
}
{
  "checked": true,
  "revoked": false
}
cheqd's supported wallets

Set Up Your Account

Set up your account with cheqd Studio and log in to start using the APIs.

Understanding Access Control Conditions

Learn what different Payment Conditions mean and how they affect a Verifier when verifying Credentials.

Verify Credential

Verify a W3C Verifiable Credential using the cheqd Studio APIs.

{
  "issuerDid": "did:cheqd:testnet:0a35d559-00ff-41b6-81ad-f64faa522771", // DID of Trusted Issuer
  "subjectDid": "did:cheqd:testnet:a7e8bf7c-9d97-4b1e-a7bb-43a6754aafbf", // DID of AI Agent
  "attributes": {
      "aiAgentName": "ChatGPT-4 Turbo",
      "aiAgentVersion": "4.0-turbo",
      "model": "GPT-4 Turbo",
      "modelVersion": "4.0",
      "contextWindow": 128000,
      "temperature": 0.7,
      "topK": 40,
      "topP": 0.9,
      "maxTokens": 4096,
      "fineTuned": false,
      "fineTuningDetails": null,
      "safetyRating": "ISO 42001 Certified",
      "evaluationMetrics": [
        "BLEU-4",
        "ROUGE-L",
        "F1 Score: 92.5%"
      ],
      "certificationAuthority": "AI Ethics Board",
      "validUntil": "2026-03-28T12:00:00Z"
  },
  "type": [
    "VerifiableCredential",
    "VerifiableAttestation",
    "AIAgentAuthorisation"
  ],
  "format": "jwt",
  "credentialSchema": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:c6630f1e-9248-4af6-b7ac-5bcaf646f213?resourceName=AIAgentAuthorisation&resourceType=JSONSchemaValidator2020",
    "termsOfUse": {
      "type": "AttestationPolicy",
      "parentAccreditation": "did:cheqd:testnet:0a35d559-00ff-41b6-81ad-f64faa522771?resourceName=AccreditationToAttest&resourceType=VerifiableAccreditationToAttest",
      "rootAuthorisation": "did:cheqd:testnet:c6630f1e-9248-4af6-b7ac-5bcaf646f213?resourceName=OrganisationAuthorisationForAIAgents&resourceType=VerifiableAuthorisationForTrustChain"
    }
}

issuerDid

Yes

The Issuer DID issuing the credential to the AI Agent

subjectDid

Yes

The DID of the AI Agent

attributes

Yes

The specific permissions, scopes or attributes you want to issue to the AI Agent

type

Yes

The type of credential. This should match the types the issuer is accredited to issue,

format

No

Defaults to VC JWT

credentialSchema

Yes

The credential schema matching the attributes of the credential

termsOfUse

Yes

Pointers to the accreditations of the issuer

type

Yes

Must be attestationPolicy

parentAccreditation

Yes

Must point to the accreditation of the Issuer, matching the credential type and schema

rootAuthorisation

Yes

Must point to the root authorisation that has accredited DIDs higher in the trust chain.

{
  "credentialSubject": {
    "aiAgentName": "ChatGPT-4 Turbo",
    "aiAgentVersion": "4.0-turbo",
    "model": "GPT-4 Turbo",
    "modelVersion": "4.0",
    "contextWindow": 128000,
    "temperature": 0.7,
    "topK": 40,
    "topP": 0.9,
    "maxTokens": 4096,
    "fineTuned": false,
    "fineTuningDetails": null,
    "safetyRating": "ISO 42001 Certified",
    "evaluationMetrics": [
      "BLEU-4",
      "ROUGE-L",
      "F1 Score: 92.5%"
    ],
    "certificationAuthority": "AI Ethics Board",
    "validUntil": "2026-03-28T12:00:00Z",
    "id": "did:cheqd:testnet:a7e8bf7c-9d97-4b1e-a7bb-43a6754aafbf"
  },
  "issuer": {
    "id": "did:cheqd:testnet:0a35d559-00ff-41b6-81ad-f64faa522771"
  },
  "type": [
    "VerifiableCredential",
    "VerifiableAttestation",
    "AIAgentAuthorisation"
  ],
  "termsOfUse": {
    "type": "AttestationPolicy",
    "parentAccreditation": "did:cheqd:testnet:0a35d559-00ff-41b6-81ad-f64faa522771?resourceName=AccreditationToAttest&resourceType=VerifiableAccreditationToAttest",
    "rootAuthorisation": "did:cheqd:testnet:c6630f1e-9248-4af6-b7ac-5bcaf646f213?resourceName=OrganisationAuthorisationForAIAgents&resourceType=VerifiableAuthorisationForTrustChain"
  },
  "credentialSchema": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:c6630f1e-9248-4af6-b7ac-5bcaf646f213?resourceName=AIAgentAuthorisation&resourceType=JSONSchemaValidator2020",
  "@context": [
    "https://www.w3.org/2018/credentials/v1"
  ],
  "issuanceDate": "2025-04-04T02:43:52.000Z",
  "proof": {
    "type": "JwtProof2020",
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiVmVyaWZpYWJsZUF0dGVzdGF0aW9uIiwiQUlBZ2VudEF1dGhvcmlzYXRpb24iXSwiY3JlZGVudGlhbFN1YmplY3QiOnsiYWlBZ2VudE5hbWUiOiJDaGF0R1BULTQgVHVyYm8iLCJhaUFnZW50VmVyc2lvbiI6IjQuMC10dXJibyIsIm1vZGVsIjoiR1BULTQgVHVyYm8iLCJtb2RlbFZlcnNpb24iOiI0LjAiLCJjb250ZXh0V2luZG93IjoxMjgwMDAsInRlbXBlcmF0dXJlIjowLjcsInRvcEsiOjQwLCJ0b3BQIjowLjksIm1heFRva2VucyI6NDA5NiwiZmluZVR1bmVkIjpmYWxzZSwiZmluZVR1bmluZ0RldGFpbHMiOm51bGwsInNhZmV0eVJhdGluZyI6IklTTyA0MjAwMSBDZXJ0aWZpZWQiLCJldmFsdWF0aW9uTWV0cmljcyI6WyJCTEVVLTQiLCJST1VHRS1MIiwiRjEgU2NvcmU6IDkyLjUlIl0sImNlcnRpZmljYXRpb25BdXRob3JpdHkiOiJBSSBFdGhpY3MgQm9hcmQiLCJ2YWxpZFVudGlsIjoiMjAyNi0wMy0yOFQxMjowMDowMFoifSwidGVybXNPZlVzZSI6eyJ0eXBlIjoiQXR0ZXN0YXRpb25Qb2xpY3kiLCJwYXJlbnRBY2NyZWRpdGF0aW9uIjoiZGlkOmNoZXFkOnRlc3RuZXQ6MGEzNWQ1NTktMDBmZi00MWI2LTgxYWQtZjY0ZmFhNTIyNzcxP3Jlc291cmNlTmFtZT1BY2NyZWRpdGF0aW9uVG9BdHRlc3QmcmVzb3VyY2VUeXBlPVZlcmlmaWFibGVBY2NyZWRpdGF0aW9uVG9BdHRlc3QiLCJyb290QXV0aG9yaXNhdGlvbiI6ImRpZDpjaGVxZDp0ZXN0bmV0OmM2NjMwZjFlLTkyNDgtNGFmNi1iN2FjLTViY2FmNjQ2ZjIxMz9yZXNvdXJjZU5hbWU9T3JnYW5pc2F0aW9uQXV0aG9yaXNhdGlvbkZvckFJQWdlbnRzJnJlc291cmNlVHlwZT1WZXJpZmlhYmxlQXV0aG9yaXNhdGlvbkZvclRydXN0Q2hhaW4ifSwiY3JlZGVudGlhbFNjaGVtYSI6Imh0dHBzOi8vcmVzb2x2ZXIuY2hlcWQubmV0LzEuMC9pZGVudGlmaWVycy9kaWQ6Y2hlcWQ6dGVzdG5ldDpjNjYzMGYxZS05MjQ4LTRhZjYtYjdhYy01YmNhZjY0NmYyMTM_cmVzb3VyY2VOYW1lPUFJQWdlbnRBdXRob3Jpc2F0aW9uJnJlc291cmNlVHlwZT1KU09OU2NoZW1hVmFsaWRhdG9yMjAyMCJ9LCJzdWIiOiJkaWQ6Y2hlcWQ6dGVzdG5ldDphN2U4YmY3Yy05ZDk3LTRiMWUtYTdiYi00M2E2NzU0YWFmYmYiLCJuYmYiOjE3NDM3MzQ2MzIsImlzcyI6ImRpZDpjaGVxZDp0ZXN0bmV0OjBhMzVkNTU5LTAwZmYtNDFiNi04MWFkLWY2NGZhYTUyMjc3MSJ9.z9xTp5dSMACTLhrAsO-RBjcmaJJvWHqD6_78FTjaOkBroAMS0f8NlvpIrC7CGojkzCv_T8M_VBexzXU9I8JKAg"
  }
}
the previous tutorial

Create AI Agent DID

Create a W3C conformant DID on cheqd using our MCP Server.

Create DID-Linked Resource

Link resources such as schemas to your DID, publishing as a DID-Linked Resource.

Provision Credential to AI Agent

Once you have issued your credential and have the JWT, you can provision this credential directly to the AI Agent using our MCP server.

Charge for Status List

Create an encrypted Status List Resource using cheqd Studio.

To create an encrypted Verifiable Credential Status List with a set of Access Control Conditions, an Issuer will need to follow the steps below:

Step 1: Set up your account

Make sure you have set up your account with cheqd Studio and are logged in, using our guide below:

Step 2: Create an Issuer DID

Before you can create an encrypted Status List for charging for Credentials, you need to create a DID which is used to link the Status List on-ledger. Use the API in the page below to create a DID:

Step 3: Select the encrypted Status List API

When creating a Status List, a user will have the following options:

/credential-status/create/encrypted

Using this API will encrypt the bitstring of the Status List, meaning that a set of Payment Conditions will need to be met in order to access the Status List contents.

/credential-status/create/unencrypted

Using this API will create a regular Status List on-ledger, where the contents of the Status List are visible to any users who queries the blockchain.

For the purpose of this tutorial, we will assume the user is creating an encrypted Status List. For unencrypted Status Lists, follow the tutorial here.

Step 4: Create encrypted Status List

Using the /credential-status/create/encrypted API, users have two options for creating an encrypted Status List on-ledger:

  1. Filling out a simple form using the application/x-www-url-form-encoded option on the Swagger UI.

  2. Compiling a Status List payload yourself using the application/json option on the Swagger UI.

Option 1. Choose from a few variables and we will compile the Status List for you

This is the easiest way to create encrypted Status Lists on cheqd and is recommended for users who are not overly familiar with compiling JSON objects.

Using the application/x-www-url-form-encoded option on the Swagger UI, users are able to choose between the following variables and options to create an encrypted Status List on-ledger:

statusPurpose (required)
  • revocation (creates a Status List where each entry refers to revocation status)

  • suspension (creates a Status List where each entry refers to suspension status. Note that suspended Credentials may become unsuspended).

did (required)

Enter the Decentralized Identifier (DID) of the Status List publisher created in Step 2. For example:

did:cheqd:testnet:0ff9df5d-653b-4f77-a66c-0035abc34d63
statusListName (required)

This is the name of your Status List. This will also need to be kept consistent for all future updates of the same Status List. For example:

employmentCredentialRevocationList
feePaymentAddress (required)

The cheqd payment address where payments to unlock the encrypted StatusList2021 DID-Linked Resource need to be sent. For example:

cheqd1qs0nhyk868c246defezhz5eymlt0dmajna2csg
feePaymentAmount (required)

The amount in CHEQ tokens to unlocked the encrypted StatusList2021 DID-Linked Resource. For example:

100
feePaymentWindow (required)

Time window (in minutes) within which the payment to unlock the encrypted StatusList2021 DID-Linked Resource is considered valid. For example:

10
length (optional)

The length of the Status List to be created. The default and minimum length is 140000 which is 16kb. For example:

140000
encoding (optional)

The encoding format of the encrypted StatusList DID-Linked Resource to be created.

  • base64url

  • base64

  • hex

statusListVersion (optional)

A user set value to represent the version of the Status List. For example:

1.0
alsoKnownAs (optional)

A user set field to assign a set of alternative URIs where the DID-Linked Resource can be fetched from. For example:

https://www.foo.com

From this request, cheqd Studio will automatically create and publish an encrypted Status List to the ledger with set Payment Conditions required to be met to unlock.

Option 2. Publish a JSON payload yourself

Instead of using simple form variables, you can create an encrypted Status List using a JSON payload yourself using the application/json option on the Swagger UI.

Request format

An example of the JSON payload needed to be submitted is below:

{
  "did": "did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e",
  "statusListName": "cheqd-employee-credentials-encrypted",
  "paymentConditions": [
    {
      "feePaymentAddress": "cheqd1qs0nhyk868c246defezhz5eymlt0dmajna2csg",
      "feePaymentAmount": 20,
      "feePaymentWindow": 10
    }
  ]
}

The table below expands on some of the required parameters:

Parameter
Example value
Description

"feePaymentAddress"

"cheqd1xl5wccz667lk06ahama26pdqvrkz5aws6m0ztp"

This specifies the cheqd address to which the payment fee should be sent. This address is associated with the User who wants to charge for Credential Status

"feePaymentAmount"

"1000"

This defines the amount of the payment fee in CHEQ which the Issuer will charge for a third party to unlock the Credential Status. The amount may be up to 2 decimal points, e.g. "1000.25".

"feePaymentWindow"

"10"

The amount of time, in minutes, after making the payment in which a Verifier is able to unlock an encrypted resource.

Step 5: Hit the API

Once the Issuer has populated the requisite information for the encrypted Status List request, they can use the API below to submit it to the ledger.

Encrypted Status List Response format

The following code snippet shows an example of an encrypted Status List response format, which will be published to the ledger:

Note: it is important to save the response, including the "encryptedSymmetricKey" locally, as this will be used for updating encrypted Status List operations.

{
  "created": true,
  "resource": {
    "StatusList2021": {
      "encodedList": "496fdfbeb745b4db03fcdb40566f9c4c4a1c0f184b31255e641b6e7bdfb9b6946c12be87ca3763be0393c00b67ac1e8737c106b32f46ef59c765754415b5e8cc7c65fccaa3374620430ea476301a5e0dd63340e7a27a68bc627518471f22e4a2",
      "type": "StatusList2021Revocation",
      "validFrom": "2023-06-26T11:45:19.349Z"
    },
    "metadata": {
      "type": "StatusList2021Revocation",
      "encoding": "base64url",
      "encrypted": true,
      "encryptedSymmetricKey": "b11182dc524b8181f9a6aef4c4ad0a1c14e40033b9112dffd8d1bcf6cc3b85abc07ded2205ee94068a99f4202502cb0855f322583fa6ce1534d3a05bf36891766ea2c5f90a982b3040680762977d404d758a2370224a239c8279aa7d21e980931c42055b17ca4c7dbffa4782480a8b6279cf989b2f166d5fdb4b2c1b5a63927200000000000000203018dcaba26df45a415bb599218b27ca853a70289d7a3ed3ed0e3730452e8f8d9af91b6e71312565d2c069341f6660ab",
      "paymentConditions": [
        {
          "feePaymentAddress": "cheqd1qs0nhyk868c246defezhz5eymlt0dmajna2csg",
          "feePaymentAmount": "20000000000ncheq",
          "intervalInSeconds": 600,
          "type": "timelockPayment"
        }
      ]
    },
    "resourceMetadata": {
      "resourceURI": "did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e/resources/5945233a-a4b5-422b-b893-eaed5cedd2dc",
      "resourceCollectionId": "7c2b990c-3d05-4ebf-91af-f4f4d0091d2e",
      "resourceId": "5945233a-a4b5-422b-b893-eaed5cedd2dc",
      "resourceName": "cheqd-revocation-encrypted-1",
      "resourceType": "StatusList2021Revocation",
      "mediaType": "application/json",
      "resourceVersion": "2023-06-26T11:45:19.349Z",
      "created": "2023-06-26T11:45:20Z",
      "checksum": "909e22e371a41afbb96c330a97752cf7c8856088f1f937f87decbef06cbe9ca2",
      "previousVersionId": null,
      "nextVersionId": null
    },
    "symmetricKey": "dfe204ee95ae74ea5d74b94c3d8ff782273905b07fbc9f8c3d961c3b43849f18"
  }
}

Note: The only encrypted element is the "encodedList" element. This provides the Verifier sufficient information to be able to make the payment back the the Issuer and to fulfill the Access Control Conditions, without being able to see the contents of the Status List itself.

Issue a Verifiable Credential

Issue W3C conformant Verifiable Credentials over REST API, using cheqd Studio.

Using the /credential/create API, it is possible to issue Verifiable Credentials, signed by a cheqd DID, in a few clicks or lines of code.

Step 1: Set up your account

Make sure you have set up your account with cheqd Studio and are logged in, using our guide below:

Step 2: Create an Issuer DID

Before you can issue a Verifiable Credential, you need to create an Issuer DID which is used to sign the Credential payload. Use the API in the page below to create an Issuer DID:

(Optional) Step 3: Create a Subject DID

Again, before you issue a Verifiable Credential, you need to know to whom you are issuing it. If you need to create a Subject DID, you can take a look at the page here:

It is also possible to use a did:cheqd DID for holders and subjects, but this is only recommended when the holder is not a natural person (e.g. is an AI Agent, organisation or object).

Step 4: Compile your Credential body

Within the JSON object of the API request, you will need to input the issuer and subject information, as well as the attributes which you want to issue in the Credential. You may also want to add additional fields such as a credentialSchema.

Users have two options for compiling the Credential bodies and issuing Verifiable Credentials:

  1. Filling out a simple form using the application/x-www-url-form-encoded option within an API client of your choice.

  2. Compiling a Credential body yourself using the application/json option within an API client of your choice.

Option 1. Choose from a few variables and we will compile the Credential body for you

This is the easiest way to issue Credentials and is recommended for users who are not overly familiar with compiling JSON objects.

Using the application/x-www-url-form-encoded option, users are able to choose between the following variables and options to issue Verifiable Credentials:

issuerDid (required)

This is the DID of the Credential issuer, created in . This needs to be a did:cheqd DID. For example:

subjectDid (required)

This is the DID of the Credential subject, created in . This needs to be a did:key or did:vda DID. For example:

attributes (required)

These are the claims or attributes attested to within the Verifiable Credential. This must be a JSON object, following the . For example:

credentialSchema (required for Verida wallet)

This is the Schema which the Credential body takes the form of. For the Verida wallet, to display a credential, it needs to have a schema associated with it.

@context (optional)

This is an optional property that defines semantic information about the Credential, conforming to the . For example:

type (optional)

This is an optional property that defines information about the type of Verifiable Credential, conforming to the . For example:

expirationDate (optional)

This is an optional property that defines information about the expiration date of a Verifiable Credential, conforming to the . For example:

format (optional)

Format of the Verifiable Credential. Defaults to VC-JWT.

  • jwt (VC-JWT)

  • lds (JSON-LD)

credentialStatus (optional)

credentialStatus properties for VC revocation or suspension. Takes statusListName and statusListPurpose as inputs. If you have already created a Status List, you can include the same inputs here to map this issued credential within the created bitstring.

Note that this is the same for and for . For example:

Additional options for specifying credentialStatus bitstring index

Below are a set of examples of alternative input parameters for users to specify the bitstring index of the issued Credential. The bitstring index is where exactly the issued credential will map to within the Status List. This should be noted and stored by the issuer to keep a record of which issued credentials are active, revoked or suspended:

Example Request Format: Random Bitstring index
Example Request Format: Specified Bitstring index
Example Request Format: Bitstring index within a given range
Example Request Format: Bitstring including omitted bits

Ensure that the "statusPurpose" and "statusListName" is the same as the existing Status List on-ledger.

Option 2. Publish a JSON payload yourself

Instead of using simple form variables, you can issue a Verifiable Credential using a JSON payload with the application/json option.

Request format

Below is an example of the request format for issuing a Verifiable Credential using a custom JSON payload, including some of the possible parameters:

Step 5: Issue a Credential using the API below

Execute the API below to issue a Verifiable Credential, signed by your issuer DID.

Alternatives

Below are a list of alternatives for using Credentials with cheqd support. Each offers a different set of protocols and underlying technical capabilities.

t

Issue a Verifiable Credential

Issue a JSON-LD Verifiable Credential, signed by a did:cheqd Decentralized Identifier (DID), using Credo.

Using the Issue Credential v2 Protocol, you can issue JSON-LD Verifiable Credentials signed by a did:cheqd identifier with just a few lines of code. This guide walks through the full flow using the Credo Agent.

Prerequisites

Before you begin, ensure you have:

  • Basic knowledge of Credo Agent configuration.

  • A cheqd testnet or mainnet account with sufficient tokens for DID operations

Step 1: Install dependencies

npm install @credo-ts/core @credo-ts/node @credo-ts/askar @credo-ts/cheqd
npm install @hyperledger/aries-askar-nodejs

Step 2: Set up the Issuer Agent

The issuer agent requires the cheqd module for DID operations and additional modules for W3C JSON-LD credential processing.

Issuer
import type { InitConfig } from '@credo-ts/core'
import { AskarModule } from '@credo-ts/askar'
import {
  Agent,
  CredentialsModule,
  V2CredentialProtocol,
  JsonLdCredentialFormatService,
  DidsModule,
  HttpOutboundTransport,
  WsOutboundTransport,
  ProofsModule,
  V2ProofProtocol,
  DifPresentationExchangeProofFormatService,
  CacheModule,
  InMemoryLruCache,
  W3cCredentialsModule,
  KeyType,
  DidDocumentBuilder,
  utils,
  getEd25519VerificationKey2018,
} from '@credo-ts/core'
import { agentDependencies, HttpInboundTransport } from '@credo-ts/node'
import { ariesAskar } from '@hyperledger/aries-askar-nodejs'
import { CheqdModule, CheqdModuleConfig, CheqdDidRegistrar, CheqdDidResolver } from '@credo-ts/cheqd'

let issuerDid: string

const issuerConfig: InitConfig = {
  label: 'cheqd-jsonld-issuer',
  walletConfig: {
    id: 'cheqd-issuer-wallet',
    key: 'testkey0000000000000000000000000',
  },
}

const initializeIssuerAgent = async () => {
  const issuer = new Agent({
    config: issuerConfig,
    dependencies: agentDependencies,
    modules: {
      askar: new AskarModule({ ariesAskar }),
      dids: new DidsModule({
        registrars: [new CheqdDidRegistrar()],
        resolvers: [new CheqdDidResolver()],
      }),
      cheqd: new CheqdModule(
        new CheqdModuleConfig({
          networks: [
            {
              network: 'testnet', // or 'mainnet'
              cosmosPayerSeed: 'your-cosmos-payer-seed-here',
            },
          ],
        })
      ),
      credentials: new CredentialsModule({
        credentialProtocols: [
          new V2CredentialProtocol({
            credentialFormats: [new JsonLdCredentialFormatService()],
          }),
        ],
      }),
      proofs: new ProofsModule({
        proofProtocols: [
          new V2ProofProtocol({
            proofFormats: [new DifPresentationExchangeProofFormatService()],
          }),
        ],
      }),
      cache: new CacheModule({
        cache: new InMemoryLruCache({ limit: 100 }),
      }),
      w3cCredentials: new W3cCredentialsModule({}),
    },
  })

  // Register transports
  issuer.registerOutboundTransport(new WsOutboundTransport())
  issuer.registerOutboundTransport(new HttpOutboundTransport())
  issuer.registerInboundTransport(new HttpInboundTransport({ port: 3001 }))

  await issuer.initialize()
  return issuer
}

Step 3: Set up the Holder Agent

The holder agent needs to resolve cheqd DIDs and handle JSON-LD credentials.

Holder
const holderConfig: InitConfig = {
  label: 'cheqd-jsonld-holder',
  walletConfig: {
    id: 'cheqd-holder-wallet',
    key: 'testkey0000000000000000000000000',
  },
}

const initializeHolderAgent = async () => {
  const holder = new Agent({
    config: holderConfig,
    dependencies: agentDependencies,
    modules: {
      askar: new AskarModule({ ariesAskar }),
      dids: new DidsModule({
        resolvers: [new CheqdDidResolver()],
      }),
      credentials: new CredentialsModule({
        credentialProtocols: [
          new V2CredentialProtocol({
            credentialFormats: [new JsonLdCredentialFormatService()],
          }),
        ],
      }),
      proofs: new ProofsModule({
        proofProtocols: [
          new V2ProofProtocol({
            proofFormats: [new DifPresentationExchangeProofFormatService()],
          }),
        ],
      }),
      cache: new CacheModule({
        cache: new InMemoryLruCache({ limit: 100 }),
      }),
      w3cCredentials: new W3cCredentialsModule({}),
    },
  })

  // Register transports
  holder.registerOutboundTransport(new WsOutboundTransport())
  holder.registerOutboundTransport(new HttpOutboundTransport())
  holder.registerInboundTransport(new HttpInboundTransport({ port: 3002 }))

  await holder.initialize()
  return holder
}

Step 4: Create Issuer DID

Issuer
// Create a cheqd DID with Ed25519 verification method
const did = `did:cheqd:testnet:${utils.uuid()}`
const ed25519Key = await issuer.wallet.createKey({ keyType: KeyType.Ed25519 })

const createResult = await issuer.dids.create({
  method: 'cheqd',
  didDocument: new DidDocumentBuilder(did)
    .addController(did)
    .addVerificationMethod(
      getEd25519VerificationKey2018({
        key: ed25519Key,
        controller: did,
        id: `${did}#${ed25519Key.fingerprint}`,
      })
    )
    .addAssertionMethod(`${did}#${ed25519Key.fingerprint}`)
    .addAuthentication(`${did}#${ed25519Key.fingerprint}`)
    .build(),
})

if (!createResult.didState.did) {
  throw new Error('cheqd DID creation failed')
}

issuerDid = createResult.didState.did
console.log('Issuer DID created:', issuerDid)

Step 5: Create connection between Issuer and Holder

Use any supported method to create a connection with the Holder of the credential. Automated out-of-band protocol is recommended.

5a: Issuer creates Connection Invite

The Issuer agent will create a new connection invite for the Holder. This is needed to securely communicate between the Issuer and the Holder agents.

Issuer
const createNewInvitation = async (agent: Agent) => {
  const outOfBandRecord = await agent.modules.oob.createInvitation()

  return {
    invitationUrl: outOfBandRecord.outOfBandInvitation.toUrl({ domain: 'http://localhost:3001' }),
    outOfBandRecord,
  }
}

5b: Holder receives invitation

The above request will have an invitation in the response. Holder will have to copy that invitation and pass URL as invitationUrl in the following code:

Holder
const receiveInvitation = async (agent: Agent, invitationUrl: string) => {
  const { outOfBandRecord } = await agent.modules.oob.receiveInvitationFromUrl(invitationUrl)
  if (!outOfBandRecord) {
      throw new Error(redText(Output.NoConnectionRecordFromOutOfBand))
  }
  return outOfBandRecord
}

Step 6: Set up Credential Event Listeners

Both agents need event listeners to handle the credential exchange protocol automatically.

Issuer and Holder
import { CredentialEventTypes, CredentialState } from '@credo-ts/core'

const setupCredentialListener = (agent: Agent) => {
  agent.events.on(CredentialEventTypes.CredentialStateChanged, async ({ payload }) => {
    const { credentialRecord } = payload
    
    switch (credentialRecord.state) {
      case CredentialState.ProposalReceived:
        console.log('Issuer: Credential proposal received')
        await agent.credentials.acceptProposal({
          credentialRecordId: credentialRecord.id,
          comment: 'JSON-LD Credential Offer',
        })
        break
        
      case CredentialState.OfferReceived:
        console.log('Holder: Credential offer received, accepting...')
        await agent.credentials.acceptOffer({
          credentialRecordId: credentialRecord.id,
          credentialFormats: { jsonld: {} },
        })
        break
        
      case CredentialState.RequestReceived:
        console.log('Issuer: Credential request received, issuing credential...')
        await agent.credentials.acceptRequest({
          credentialRecordId: credentialRecord.id,
          comment: 'JSON-LD Credential',
        })
        break
        
      case CredentialState.CredentialReceived:
        console.log('Holder: Credential received, accepting...')
        await agent.credentials.acceptCredential({
          credentialRecordId: credentialRecord.id,
        })
        break
        
      case CredentialState.Done:
        console.log('Done: Credential exchange completed!')
        break
    }
  })
}

Step 7: Holder proposes the Credential

In this example, we will initiate the credential issuance process by having the holder propose a credential.

Holder
// Define the credential to be proposed
const credentialOptions = {
  credential: {
    '@context': [
      'https://www.w3.org/2018/credentials/v1',
      'https://w3id.org/citizenship/v1',
      'https://w3id.org/security/bbs/v1',
    ],
    id: 'https://cheqd.io/credentials/permanent-resident-card',
    type: ['VerifiableCredential', 'PermanentResidentCard'],
    issuer: issuerDid,
    issuanceDate: new Date().toISOString(),
    expirationDate: new Date(Date.now() + 10 * 365 * 24 * 60 * 60 * 1000).toISOString(), // 10 years
    credentialSubject: {
      id: 'did:example:holder123',
      type: ['PermanentResident', 'Person'],
      givenName: 'John',
      familyName: 'Doe',
      gender: 'Male',
      birthDate: '1990-01-01',
      birthCountry: 'United States',
      residentSince: '2020-01-01',
      lprNumber: '123-456-789',
      lprCategory: 'IR1',
    },
  },
  options: {
    proofType: 'Ed25519Signature2018',
    proofPurpose: 'assertionMethod',
  },
}
// Get Connection
const holderConnection = await receiveInvitation(holderAgent, invitationUrl)
// Holder proposes credential
console.log('Starting credential proposal...')
const credentialExchange = await holderAgent.credentials.proposeCredential({
  connectionId: holderConnection.id,
  protocolVersion: 'v2',
  credentialFormats: { jsonld: credentialOptions },
  comment: 'Requesting Permanent Resident Card',
})

console.log('Credential exchange initiated:', credentialExchange.id)

// The rest of the flow is handled automatically by event listeners
// Wait for completion...

The Credential Acceptance and storage is handled automatically by the event listeners registered for both Issuer and Holder.

Set Up Your Account

Set up your account with cheqd Studio and log in to start using the APIs.

Create an Issuer DID

Create a W3C conformant DID on cheqd using the did:cheqd DID Method.

did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0
did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK
{
  "name": "Bob",
  "gender": "male"
}
https://common.schemas.verida.io/health/pathology/tests/covid19/pcr/v0.1.0/schema.json
https://www.w3.org/2018/credentials/v1
VerifiableCredential
2023-06-08T13:49:28.000Z
{
  "statusPurpose": "revocation",
  "statusListName": "employee-credentials"
}
{
  "statusPurpose": "revocation",
  "statusListName": "employee-credentials"
}
{
  "statusPurpose": "revocation",
  "statusListName": "employee-credentials",
  "statusListIndex": 1543
}
{
  "statusPurpose": "revocation",
  "statusListName": "employee-credentials"
  "statusListRangeStart": 1000,
  "statusListRangeEnd": 2000
}
{
  "statusPurpose": "revocation",
  "statusListName": "employee-credentials"
  "statusListRangeStart": 1000,
  "statusListRangeEnd": 2000,
  "indexNotIn": 1001. 1264. 1268, 1854
}
{
  "issuerDid": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0",
  "subjectDid": "did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK",
  "attributes": {
    "gender": "male",
    "name": "Bob"
  },
  "@context": [
    "https://schema.org"
  ],
  "type": [
    "Person"
  ],
  "credentialSchema": "https://common.schemas.verida.io/identity/kyc/FinClusive/individual-basic/v0.1.0/schema.json",
  "format": "jwt",
  "credentialStatus": {
    "statusPurpose": "revocation",
    "statusListName": "employee-credentials",
    "statusListIndex": 10
  }
}
Step 2
Step
3
syntax defined in the Verifiable Credential Data Model
@contexts section of the Verifiable Credential Data Model
types section of the Verifiable Credential Data Model
expiration section of the Verifiable Credentials Data Model
unencrypted Status Lists
encrypted Status Lists

Set Up Your Account

Set up your account with cheqd Studio and log in to start using the APIs.

Create an Issuer DID

Create a W3C conformant DID on cheqd using the did:cheqd DID Method.

Create a Subject DID

Create an off-ledger did:key or did:vda Subject DID to receive a Verifiable Credential.

Setup Verida Wallet

Learn about setting up your Verida wallet to receive a did:vda address.

Veramo SDK Plugin

The Veramo SDK Plugin is an extension of the Veramo SDK, a JavaScript framework for Trusted Data, adding support for cheqd functionality.

Credo

Credo is an SDK which and regular Verifiable Credentials natively with cheqd support.

ACA-Py

ACA-Py (Aries Cloud Agent Python) is an SDK that can issue AnonCreds, JSON-LD and SD-JWT credentials with full cheqd support.

Walt.id SSI Kit

Walt.id SSI Kit is an SDK that supports the standards for identity, with full cheqd support.

Create a DID

Create a Decentralized Identifier (DID) with the did:cheqd DID method using cheqd Studio.

In cheqd Studio, you can easily create and publish a did:cheqd DID to the cheqd testnet or mainnet, anchoring it on-ledger with associated public keys and metadata. This DID can then be used to:

  • Sign and issue verifiable credentials as an 'issuer'.

  • Establish a trusted identity on cheqd for entities like organisations, digital products or AI Agents.

  • Serve as the parent identifier for DID-Linked Resources (e.g. status lists, trust registries).

This tutorial walks through the process of creating an Issuer DID using cheqd Studio's API or interface, including how to configure your keys, DID Document, and optional service endpoints.

🔐 Once registered, the DID becomes publicly resolvable and forms the cryptographic foundation of your identity as an issuer in decentralized ecosystems.

Step 1: Set up your account

Make sure you have set up your account with cheqd Studio and have generated an API key to authenticate with our APIs, using our guides below:

Step 2: Create a DID and associated DID Document

Using the /did/create API, users have two options for creating a did:cheqd DID and associated DID Document on-ledger:

  1. Filling out a simple form using the application/x-www-url-form-encoded or application/json option within an API client of your choice.

  2. Compiling a full DID Document body yourself using the application/json option, using already created identity keys, within an API client of your choice.

Option 1. Choose from a few variables and we will compile the DID for you

This is the easiest way to create DIDs on cheqd and is recommended for users who are not overly familiar with compiling DID Documents.

Using application/x-www-url-form-encoded

Using the application/x-www-url-form-encoded option, users are able to choose between the following variables to compile your DID:

network (required)
  • "testnet" (recommended for testing)

  • "mainnet" (recommended for production)

identifierFormatType (required)
  • "uuid" - this is a Universally Unique Identifier (recommended)

  • "base58btc" - this is an identifier which is commonly used for Hyperledger Indy transactions

verificationMethodType (required)
  • "Ed25519VerificationKey2018" (recommended)

  • "Ed25519VerificationKey2020"

  • "JSONWebKey2020"

service (optional)

This input field contains the required inputs for adding in a service section to the DID Document upon creation.

{
  "idFragment": "service-1",
  "type": "LinkedDomains",
  "serviceEndpoint": [
    "https://example.com"
  ]
}

From this request, cheqd Studio will automatically create and publish a DID and associated DID Document to the ledger and return it as a response.

Expected response format
{
  "did": "did:cheqd:testnet:ca029356-69dc-4cb4-a4c6-13b959ffaad6",
  "keys": [
    {
      "kid": "1a07cb379cd6f2d9acddf9a6d6af4e930d5696818a38020bde2b6ead5cd85039",
      "kms": "postgres",
      "type": "Ed25519",
      "publicKeyHex": "1a07cb379cd6f2d9acddf9a6d6af4e930d5696818a38020bde2b6ead5cd85039",
      "meta": {
        "algorithms": [
          "EdDSA",
          "Ed25519"
        ]
      },
      "controller": "did:cheqd:testnet:ca029356-69dc-4cb4-a4c6-13b959ffaad6"
    }
  ],
  "services": [],
  "provider": "did:cheqd:testnet",
  "controllerKeyRefs": [
    "1a07cb379cd6f2d9acddf9a6d6af4e930d5696818a38020bde2b6ead5cd85039"
  ],
  "controllerKeys": [
    {
      "kid": "1a07cb379cd6f2d9acddf9a6d6af4e930d5696818a38020bde2b6ead5cd85039",
      "kms": "postgres",
      "type": "Ed25519",
      "publicKeyHex": "1a07cb379cd6f2d9acddf9a6d6af4e930d5696818a38020bde2b6ead5cd85039",
      "meta": {
        "algorithms": [
          "EdDSA",
          "Ed25519"
        ]
      },
      "controller": "did:cheqd:testnet:ca029356-69dc-4cb4-a4c6-13b959ffaad6"
    }
  ],
  "controllerKeyId": "1a07cb379cd6f2d9acddf9a6d6af4e930d5696818a38020bde2b6ead5cd85039"
}

Using application/json

Alternatively, you can use the application/json option and pass only a few specific inputs, for example:

{
  "network": "testnet",
  "identifierFormatType": "uuid",
  "options": {
    "verificationMethodType": "Ed25519VerificationKey2018"
  }
}

Or, if you have created a keypair already that you want to use, you can reference the created key ID, kid, in the request:

{
  "network": "testnet",
  "identifierFormatType": "uuid",
  "options": {
    "key": "8255ddadd75695e01f3d98fcec8ccc7861a030b317d4326b0e48a4d579ddc43a", // Pass kid if you have created a key separately
    "verificationMethodType": "Ed25519VerificationKey2018"
  }
}

Note that if you are passing a kid that is already created, you must also specify the verificationMethodType within options.

Using the application/json option, users are able to choose between the following variables to compile your DID:

network (required)
  • "testnet" (recommended for testing)

  • "mainnet" (recommended for production)

identifierFormatType (required)
  • "uuid" - this is a Universally Unique Identifier (recommended)

  • "base58btc" - this is an identifier which is commonly used for Hyperledger Indy transactions

verificationMethodType (required)
  • "Ed25519VerificationKey2018" (recommended)

  • "Ed25519VerificationKey2020"

  • "JSONWebKey2020"

Note that this should be nested under options

key (optional)
  • "8255ddadd75695e01f3d98fcec8ccc7861a030b317d4326b0e48a4d579ddc43a"

  • This is a kid that should have been created using our Key Create API.

Note that this should be nested under options

Option 2. Publish a fully compiled DID Document body yourself

Instead of generating a DID Document using simple parameters, you can create a fully formatted DID Document yourself. Before, submitting a manually created DID, you will need to have created a set of identity keys to input the key material into the DID document.

Step 1: Create a new keypair

Use the /key/create API to generate a new keypair within the Credential Service key management store. Copy the publicKeyHex.

Step 2 (option 1): Utilise the DID Document template helper

To simplify this process of formatting a DID Document using your own keys, we've created a Helper Tool in our DID Registrar here. Simply paste in your publicKeyHex and choose the variables to compile your DID Document template.

Step 3: Paste the response

Within the /did/create JSON payload, paste the response of your DID Document template, with your own signing keys.

Request format:

{
  "didDocument": {
    "id": "did:cheqd:testnet:0ff9df5d-653b-4f77-a66c-0035abc34d63",
    "controller": [
      "did:cheqd:testnet:0ff9df5d-653b-4f77-a66c-0035abc34d63"
    ],
    "verificationMethod": [
      {
        "id": "did:cheqd:testnet:0ff9df5d-653b-4f77-a66c-0035abc34d63#key-1",
        "type": "JsonWebKey2020",
        "controller": "did:cheqd:testnet:0ff9df5d-653b-4f77-a66c-0035abc34d63",
        "publicKeyJwk": {
          "crv": "Ed25519",
          "kty": "OKP",
          "x": "BFSLOxwMJgpmWRtTUuo0JAvz6VXGp4WDDcN0dFfCQKo"
        }
      }
    ],
    "authentication": [
      "did:cheqd:testnet:0ff9df5d-653b-4f77-a66c-0035abc34d63#key-1"
    ]
  }
}

Step 2 (option 2) Use application/json options

Alternatively, you can use the application/json request format below.

You can use the kid created from Step 1 within the options section, and then compile the remainder of tour DID Document.

"options": {
    "key": "8255ddadd75695e01f3d98fcec8ccc7861a030b317d4326b0e48a4d579ddc43a",
    "verificationMethodType": "Ed25519VerificationKey2018"
  },
  "didDocument": {
    "@context": [
      "https://www.w3.org/ns/did/v1"
    ],
    "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0",
    "controller": [
      "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0"
    ],
    "authentication": [
      "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#key-1"
    ],
    "service": [
      {
        "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#service-1",
        "type": "LinkedDomains",
        "serviceEndpoint": [
          "https://example.com"
        ]
      }
    ]
  }
}

Step 3: Hit execute on the API

Hit execute on the API below to create your did:cheqd DID and associated DID Document.

List DIDs associated with your account

After creating a DID or multiple DIDs, users can list all the created DIDs associated with their account. Using the /did/list API.

Alternatives

Below are a list of alternatives for creating cheqd DIDs.

Example of encrypted Status List identifiable via a DID URL

Issue a Verifiable Credential

Issue a SD-JWT Verifiable Credential, signed by a did:cheqd Decentralized Identifier (DID), using Credo and OpenID4VCI.

Using the OpenID4VC module, you can issue OpenID compatible SD-JWT Credentials signed by a did:cheqd identifier. This guide walks through the flow of issuance using the Credo Agent.

Prerequisites

Before you being, ensure you have:

  • Basic knowledge of Credo Agent configuration.

  • A cheqd testnet or mainnet account with sufficient tokens for DID operations.

Step 1: Install dependencies

npm install @credo-ts/core @credo-ts/node @credo-ts/cheqd
npm install @credo-ts/openid4vc

Step 2: Configure the Issuer Agent

Configure the issuer with cheqd and OpenID4VC Modules

import { Agent, DidsModule, KeyType } from '@credo-ts/core';
import { agentDependencies } from '@credo-ts/node';
import { CheqdModule } from '@credo-ts/cheqd';
import express, { Router } from 'express'
import { OpenId4VcIssuerModule, OpenId4VcVerifierModule } from '@credo-ts/openid4vc';

// Create two express routers, all endpoints for the
// issuer and verifier will be added to these routers
const verifierRouter = Router()
const issuerRouter = Router()

// Register the routers on the express server. The path should match
// with the baseUrl you configure in the modules below.
const app = express()
app.use('/oid4vci', issuerRouter)
app.use('/siop', verifierRouter)

const issuer = new Agent({
  config,
  dependencies: agentDependencies,
  modules: {
    dids: new DidsModule({
      registrars: [new CheqdDidRegistrar()],
      resolvers: [new CheqdDidResolver()],
    }),
    cheqd: new CheqdModule(
      new CheqdModuleConfig({
        networks: [
          {
            network: '<mainnet or testnet>',
            cosmosPayerSeed: '<cosmos payer seed or mnemonic>',
          },
        ],
      })
    ),
    openId4VcIssuer: new OpenId4VcIssuerModule({
      baseUrl: 'https://your-issuer-host/oid4vci',
      router: issuerRouter,
      endpoints: {
        // The credentialRequestToCredentialMapper is the only required endpoint
        // configuration that must be provided. This method is called whenever a
        // credential request has been received for an offer we created. The callback should
        // return the issued credential to return in the credential response to the holder.
        credential: {
          // you'll map credential once requests come in
          credentialRequestToCredentialMapper: async ({ credentialRequest }) => {
            // See step 5.
          },
        },
      },
    }),
    // openId4VcVerifier module can only be used in Node.js
    openId4VcVerifier: new OpenId4VcVerifierModule({
      baseUrl: 'https://your-issuer-host/siop',
      router: verifierRouter,
    }),
  },
});
// listen on port 3000 for the openid4vc app.
app.listen(3000)

This registers:

  • cheqd for did:cheqd DID creation and ledger integration

  • openId4VcIssuer and openId4VcVerifier for OID4VC flows

Step 3: Create a cheqd DID and link it to SD‑JWT issuance

// Create a did:cheqd that we will use for issuance
const issuerDidResult = await issuer.dids.create({
  method: 'cheqd',
  options: {
    network: 'testnet',
    methodSpecificIdAlgo: 'uuid',
  },
})

if (issuerDidResult.didState.state !== 'finished') {
  throw new Error('DID creation failed.')
}
const issuerDid = issuerDidResult.did;

Step 4: Define the Issuer with SD‑JWT + did:cheqd support

import { JwaSignatureAlgorithm } from '@credo-ts/core'

// Create an issuer with one supported credential: AcmeCorpEmployee
const openid4vcIssuer = await issuer.modules.openId4VcIssuer.createIssuer({
  display: [
    {
      name: 'ACME Corp.',
      description: 'ACME Corp. is a company that provides the best services.',
      text_color: '#000000',
      background_color: '#FFFFFF',
      logo: {
        url: 'https://acme.com/logo.png',
        alt_text: 'ACME Corp. logo',
      },
    },
  ],
  credentialsSupported: [
    {
      format: 'vc+sd-jwt',
      vct: 'AcmeCorpEmployee',
      id: 'AcmeCorpEmployee',
      cryptographic_binding_methods_supported: ['did:cheqd'],
      cryptographic_suites_supported: [JwaSignatureAlgorithm.ES256],
    },
  ],
})

This declares support for:

  • vc+sd-jwt format

  • cryptographic binding with wasm-bound did:cheqd keys

If you want to change the display metadata or the credentials supported by the issuer, you can use the issuer.modules.openId4VcIssuer.updateIssuer method.

Step 5: Map credential requests to SD‑JWT payloads

Credential Issuance Mapper

The core of the issuance process is the credentialRequestToCredentialMapper function. This function constructs the credential to be signed and issued to the Holder. It includes:

  • Domain-specific claims: e.g., employee ID, role.

  • Cryptographic bindings: Associations with the Holder.

  • Optional selective disclosure: Customisable elements for privacy control.

Utilising payload and disclosureFrame, you have full flexibility over the credential's structure and visibility. This allows for privacy-preserving credentials that adhere to the SD-JWT specification and the OpenID for Verifiable Credential Issuance (OID4VCI) standard.

const credentialRequestToCredentialMapper: OpenId4VciCredentialRequestToCredentialMapper = async ({
  // agent context for the current wallet / tenant
  agentContext,
  // the credential offer related to the credential request
  credentialOffer,
  // the received credential request
  credentialRequest,
  // the list of credentialsSupported entries
  credentialsSupported,
  // the cryptographic binding provided by the holder in the credential request proof
  holderBinding,
  // the issuance session associated with the credential request and offer
  issuanceSession,
}) => {
  const firstSupported = credentialsSupported[0]
  const { sub } = credentialRequest.claims;
  const payload = {
    vct: firstSupported.vct, // Verifiable Credential Type identifier
    // Credential subject fields (flattened)
    credentialSubjectId: sub,   // Represents subject's DID (e.g., Holder DID)
    firstName: 'John',
    lastName: 'Doe',
    employeeId: 'EMP-1234',
    role: 'engineer',
    // Optional: evidence and schema
    evidence: [{
      type: 'EmployeeRecord',
      verifier: issuerDid,
      evidenceDocument: 'HR Database Entry 2024-Q1',
      subjectPresence: 'Physical',
      documentPresence: 'Digital',
    }],
  
    credentialSchema: {
      id: 'https://example.org/schemas/employee-passport.json',
      type: 'JsonSchemaValidator2018',
    },
    // Credential Status
    credentialStatus: {
      id: 'https://status.cheqd.net/vc/123456',
      type: 'StatusList2021Entry',
      statusPurpose: 'revocation',
      statusListIndex: '123456',
      statusListCredential: 'https://status.cheqd.net/list/employee-vc.json',
    },
    // Timestamps in numeric format
    notBefore: Math.floor(Date.now() / 1000),
    expiry: Math.floor((Date.now() + 31536000000) / 1000),
    // Terms of Use
    termsOfUse: [
      {
        type: 'OdrlPolicy2017',
        profile: 'https://cheqd.net/policies/employee-vc-policy.json',
        prohibition: [
          {
            assigner: issuerDid,
            target: 'credential',
            action: 'share',
          },
        ],
      },
    ],
  };
  return {
    credentialSupportedId: firstSupported.id,
    format: 'vc+sd-jwt',
    // We can provide the holderBinding as is, if we don't want to make changes
    holder: holderBinding,
    payload: payload,
    disclosureFrame: {
      _sd: ['lastName', 'credentialStatus', 'termsOfUse'],
    },
    issuer: {
      method: 'cheqd',
      issuerDid,
    },
  };
}

This constructs a standard SD‑JWT payload—structural claims ready for selective disclosure.

Notes on Mapping VC Fields to SD-JWT Format

VC Model Field
SD-JWT Equivalent and Custom
Comment

@context

Omitted in SD-JWT

Context is not typically included in JWT payloads

id

id

Use urn:uuid:... or full URL

type

vct

Set via vct (Verifiable Credential Type)

issuer

issuer

Must be a valid DID

issuanceDate

iat

ISO 8601 format

expirationDate

exp

Optional

credentialSubject

Flattened into individual keys

SD-JWT doesn’t nest claims

evidence

evidence

Optional, can be array of structured info

credentialSchema

credentialSchema

Helps verifier interpret structure

termsOfUse

termsOfUse

Optional. Encodes policy using ODRL or similar—can include rights, duties, and prohibitions.

Selective Disclosure (Optional)

With this expanded payload, you can also enhance your disclosureFrame:

tsCopyEditdisclosureFrame: {
  _sd: ['lastName', 'role', 'evidence', 'termsOfUse'],
}

This configuration means:

  • The lastName, role, evidence, and termsOfUse claims are blinded in the signed JWT.

  • The Holder can choose to reveal these fields when presenting the credential.


⚠️ Important Considerations

While SD-JWT allows for simple flat key-value claims, some fields from the full VC model (like @context, type, and deeply nested credentialSubject) are not directly represented due to JWT limitations. However, you can convey semantics through:

  • vct (type semantics)

  • credentialSchema (structure enforcement)

  • custom claim naming (e.g., credentialSubjectId instead of nesting)

  • Use termsOfUse to express legal/policy frameworks around credential usage, such as prohibitions on sharing.

Step 6: Create Credential Offer

Once you have configured the issuer, you can create a credential offer. The credential offer method will generate an offer URI that you can share with a holder.

const { credentialOffer, issuanceSession } = 
  await issuer.modules.openId4VcIssuer.createCredentialOffer({
    issuerId: openid4vcIssuer.issuerId,
    // values must match the `id` of the credential supported by the issuer
    offeredCredentials: ['AcmeCorpEmployee'],
  
    // Only pre-authorized code flow is supported
    preAuthorizedCodeFlowConfig: {
      userPinRequired: false,
    },
  
    // You can store any metadata about the issuance here
    issuanceMetadata: {
      someKey: 'someValue',
    },
})

// Listen and react to changes in the issuance session
issuer.events.on<OpenId4VcIssuanceSessionStateChangedEvent>(
  OpenId4VcIssuerEvents.IssuanceSessionStateChanged,
  (event) => {
    if (event.payload.issuanceSession.id === issuanceSession.id) {
      console.log('Issuance session state changed to ', 
        event.payload.issuanceSession.state)
    }
  }
)

We have also added an event listener that listens for state changed events, this allows Issuer to know when the issuance session is complete.

Set Up Your Account

Set up your account with cheqd Studio and get your API key to start using the APIs.

Create API Keys

Create one or more API keys used to authenticate with the cheqd Studio APIs.

Credo

Credo is an SDK which supports the European Architecture and Reference Framework (ARF) standards as well as AnonCreds with full cheqd support for DIDs.

ACA-Py

ACA-Py plugin supports full cheqd support for DIDs as well as Verifiable Credentials.

Veramo

The Veramo SDK Plugin supports JSON, JSON-LD credentials as well as cheqd Credential Payments in an SDK.

DID Registrar

Simple setup for building cheqd DIDs into existing applications using REST APIs, building into the Universal Registrar.

Walt.id Community Stack

Walt.id Community Stack is an SDK that supports the European Architecture and Reference Framework (ARF) standards for identity, with full cheqd support.

cheqd Cosmos CLI

Cosmos CLI which directly communicates with the cheqd network. This should only be used for testing environments.

Cover
Cover
Cover
Cover
Cover
Cover
https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:322761ea-587d-454a-a955-745200301b99?resourceName=revocation-list-encrypted-inverse-timelock&resourceType=StatusList2021Revocationresolver.cheqd.net
supports ZKCreds (AnonCreds)
European Architecture and Reference Framework (ARF)

Decentralized Trust Chains (DTCs)

Learn about Decentralized Trust Chains (DTCs) on cheqd.

Introduction​

Verifiable Credentials (VCs) are most commonly issued by legal entities to assert facts such as identity, qualifications, or authorisation. Their core purpose is to provide the Relying Party — the entity verifying the credential — with a Level of Assurance (LoA) that the claims within the credential are legitimate.

However, in practice, it’s often difficult for relying parties to determine whether a legal entity issuing a credential is authentic, or a fraudulent impersonation. There is no built-in mechanism in most credential ecosystems for verifying whether a DID-based issuer is recognised, authorised, or trustworthy.

Note: This lack of trusted issuer infrastructure is a critical blocker for many digital credential ecosystems — and a common reason why solutions stall before reaching production.

To fully establish trust, relying parties must be able to:

  • Identify who issued a credential

  • Understand whether the issuer was authorised to issue it

  • Trace who accredited the issuer, and under what governance framework

Introducing Decentralized Trust Chains (DTCs)

To solve this challenge, cheqd introduces a verifiable trust infrastructure called Decentralized Trust Chains (DTCs) — a model that complements and extends approaches like the EBSI Trust Chain Framework.

DTCs allow participants to create hierarchical chains of trust, where:

  • A Root Trusted Accreditation Organisation (rTAO) defines the governance model

  • Verifiable Accreditations delegate authority to other legal entities (e.g., TAOs, Trusted Issuers)

  • Verifiable Credentials are issued by accredited issuers, with embedded metadata that references the trust chain

Together, these components form a decentralized trust registry for each ecosystem.

Publicly Verifiable, Policy-Governed Trust

cheqd’s DTC model introduces both permissions and policies:

  • Permissions define what an entity is allowed to do (e.g. issue or accredit)

  • Policies define who granted that permission, under what framework, and with what legal or operational requirements.

This infrastructure is made publicly resolvable by publishing all authorisations and accreditations as DID-Linked Resources on the cheqd ledger. This means:

  • 🧩 Trust relationships are machine-verifiable

  • 🔍 Verifiers do not need prior knowledge of each entity

  • 🛠️ Resolution follows W3C standards like DID-Core, DID Resolution and DID-Linked Resources.

The result: A scalable, cryptographically verifiable way to determine whether an issuer — and the credential they issue — can be trusted.

Glossary​

There are many terms used within this guide, and as such, familiarise yourself or refer back to the concepts within the glossary below:

Abbreviation
Term
Description

-

Accreditation Policy

A machine-readable policy embedded in a Verifiable Accreditation that defines the scope, conditions, and governance under which an entity is authorised to accredit others or issue Verifiable Credentials.

-

Attestation Policy

A machine-readable policy embedded in a Verifiable Credential that links the credential to the issuer’s accreditation and root authorisation, enabling verifiers to validate that the issuer was authorised to make the attestation.

DID

Decentralized Identifier

Legal entity identifier for Trust Registry, cannot be natural person in context of Trust Infrastructure

GA

Governance Authority

The legal entity or consortia responsible for writing the Governance Framework. In many instances the Governance Authority is also a Root TAO

GF

Governance Framework

A policy document outlining the purpose, roles, scopes and permissions for a given ecosystem using the Trust Infrastructure.

Root TAO (rTAO)

Root Trusted Accreditation Organization

A Root Trusted Accreditation Organisation (rTAO) is the top-level authority in a Decentralized Trust Chain responsible for defining the governance framework and issuing the Root Authorisation that anchors all downstream accreditations and attestations within the trust ecosystem.

TAO

Trusted Accreditation Organization

A Trusted Accreditation Organisation (TAO) is an entity accredited by a Root Trusted Accreditation Organisation (rTAO) or another TAO to govern a segment of the trust chain by issuing accreditations to other entities or authorising the issuance of Verifiable Credentials within a defined scope.

-

Trust Chain

Hierarchy of Verifiable Accreditations. Multiple Trust Chains may comprise a Trust Registry.

TI

Trusted Issuer

A Trusted Issuer is an entity accredited within a Decentralized Trust Chain to issue domain-specific Verifiable Credentials, operating under the scope and governance defined by an upstream accreditation and the overarching trust framework.

-

Trust Infrastructure

The overall set of technical and governance components to establish end-to-end trust.

-

Verifiable Accreditation

A Verifiable Accreditation is a Verifiable Credential that delegates authority from one entity to another, specifying the types of credentials they are permitted to issue or the roles they are authorised to perform within a defined trust framework.

-

Verifiable Trust Model

Permissions with policies to either accredit, or to attest

Establishing a Trust Hierarchy

Decentralized Trust Chains are based on the concept of a hierarchical trust model, conceptually similar to traditional Public Key Infrastructure (PKI). At the top sits a Root of Trust, from which trust is delegated through a verifiable chain of credentials.

In this model, each participant is identified by a Decentralized Identifier (DID) and may be granted permission — via a Verifiable Accreditation — to accredit others or issue credentials themselves.

How the Hierarchy Works

Trust is delegated top-down through Verifiable Accreditations:

Role
Description

Root TAO (rTAO)

Issues Root Authorisations and initial Accreditations to other TAOs. Sets the governance baseline.

Trusted Accreditation Organisation (TAO)

Can accredit other TAOs or Trusted Issuers. Acts as an intermediary layer in larger ecosystems.

Trusted Issuer (TI)

Issues Verifiable Credentials to users/entities, based on permissions received from an upstream TAO.

The following diagram show how a Root TAO accredits two TAOs lower in the hierarchy:

Each role is cryptographically linked through issued Verifiable Credentials, creating a machine-verifiable trust path.

Verifiable Credentials & Policy Enforcement

  • Credentials are issued with a termsOfUse section that references an Attestation Policy, linking them back to the issuer’s accreditation and the root of trust.

  • Digital Wallets or agents can present these credentials for verification.

  • Verifiers can then resolve and validate the entire trust chain — from the issuer to the rTAO — using DID resolution and optional DNS anchoring.

Trust Infrastructure Roles and their Permissions

As shown in the diagram above, legal entities can play the following roles:

  • In a Decentralized Trust Chain, each legal entity assumes a defined role with clearly scoped permissions. While a single DID may represent multiple roles in simple ecosystems, every complete trust chain should include these three functional roles:

    • Root Trusted Accreditation Organisation (rTAO)

    • Trusted Accreditation Organisation (TAO)

    • Trusted Issuer (TI)

    Only the Trusted Issuer (TI) is permitted to issue domain-specific Verifiable Credentials (VCs).

Root Trusted Accreditation Organisation (rTAO)

The rTAO is the root of governance in a trust chain. It establishes the ecosystem’s rules and authorises who can issue or accredit within it.

Capabilities:

  • Issue a Root Authorisation that defines the Trust Framework

  • Self-accredit for governance or issuance

  • Accredit TAOs and TIs to delegate responsibility

  • Revoke accreditations from any participant in the trust chain

Credential Type:

  • VerifiableAuthorisationForTrustChain

Policy Type:

  • TrustFrameworkPolicy (included in termsOfUse)

Trusted Accreditation Organisation (TAO)​

A TAO manages a delegated segment of the trust chain under the rTAO. It may further accredit entities or take on the role of issuer if permitted.

Capabilities:

  • Accredit itself to issue VCs

  • Accredit other TAOs or Trusted Issuers

  • Revoke accreditations issued within its scope

Credential Type:

  • VerifiableAccreditationToAccredit

Policy Type:

  • AccreditationPolicy (included in termsOfUse)

Trusted Issuer (TI)​

A Trusted Issuer is an entity that issues domain-specific Verifiable Credentials under the conditions granted by its accreditation.

Capabilities:

  • Issue Verifiable Credentials to users or organisations

  • Only within the types, schemas, and jurisdictions defined in their accreditation

Credential Type:

  • VerifiableAccreditationToAttest

Policy Type:

  • AccreditationPolicy (accreditation) + AttestationPolicy (included in the issued credential’s termsOfUse)

Policies Overview​

Policies define the rules, permissions, and governance bindings for each layer of the trust chain. They are embedded into credentials via the termsOfUse field and fall into three types:

Policy Type
Used In
Purpose

TrustFrameworkPolicy

Root Authorisation

Defines the root governance model

AccreditationPolicy

Verifiable Accreditation

Constrains and describes the scope of authority

AttestationPolicy

Verifiable Credential

Links the credential back to the issuer’s accreditation and trust framework

How Policies are Linked

  • Root Authorisation includes a TrustFrameworkPolicy

  • Each Accreditation must reference:

    • A parent AccreditationPolicy, or

    • The original TrustFrameworkPolicy

  • Each Credential (Attestation) must reference:

    • The AttestationPolicy pointing back to the issuer’s accreditation

Diagram showing different policy relationships in the trust chain

This layered policy model enables verifiers to traverse and validate the entire trust chain — from a single credential back to a rTAO (optionally anchored in DNS) — while ensuring that all participants adhere to consistent governance and operational standards.

Trust Types in Decentralized Trust Chains

Trust Chains are constructed from three verifiable building blocks:

1. Authorisations

  • Define the rules of the ecosystem

  • Issued by the rTAO as a VerifiableAuthorisationForTrustChain

  • Reference the root governance framework

2. Accreditations

  • Grant permission to accredit or issue

  • Are always domain-specific and non-transferable

  • Must include an AccreditationPolicy in termsOfUse

  • Allow entities to govern or issue only within the authorised scope

3. Credentials (Attestations)

  • Assert facts (identity, qualifications, rights)

  • Must include an AttestationPolicy that:

    • Links back to the issuer's accreditation

    • Establishes a trust path to the root authority

  • Issuable only by accredited Trusted Issuers

In Summary:

Element

Purpose

Authorisations

Define the governance and policy rules at the root of the trust chain

Accreditations

Delegate trust authority for accreditation or credential issuance

Credentials (Attestations)

Assert verifiable facts within the scope of a governed trust framework

Get Started

Get started

Use cheqd Studio APIs to define, issue, and publish trust registry entries:

  • Create and manage Root Authorisations, Accreditations, and Attestations

  • Resolve trust chains in real time using standard DID resolution

  • Anchor trust registries on-chain while keeping business logic off-chain

For verification, use TRAIN to validate the trust registry to determine whether an issuer DID is accredited, and what they are accredited for — by traversing the full trust chain to its root.

Issue a Verifiable Accreditation

Issue Verifiable Accreditations as DID-Linked Resources using cheqd Studio.

Users are able to issue Verifiable Accreditations as DID-Linked Resources on-ledger, which may be used to verify whether a particular recipient of an accreditation is accredited to issue a certain type of credential, under the scope of a particular governance framework. This implementation on cheqd builds on the principles of the EBSI Trust Chain model, using DID-Linked Resources to create a more standardised format for storing, retrieving and dereferencing to trust registry entries.

Step 1: Set up your account

Make sure you have set up your account with cheqd Studio and are logged in, using our guide below:

Step 2: Create a DID

Before you can create a Verifiable Accreditation, you need to create a DID which is used to link to one or multiple Verifiable Accreditations on-ledger. Use the API in the page below to create a DID:

Step 3: Choose the type of Accreditation

Verifiable Accreditations are JSON objects that take the form of the Verifiable Credential data model. There are three types of Verifiable Accreditation:

Type
Description

Verifiable Authorisation for Trust Chain

This Accreditation authorises the recipient to issue Accreditations with reference to a particular governance framework.

Verifiable Accreditation to Accredit

This Accreditation verifies that an organisation has the permissions needed to accredit other organisations for issuing a particular type of Verifiable Accredittion.

Verifiable Accreditation to Attest

This Accreditation verifies that an organisation has the permissions needed to issue Verifiable Credentials, defined by a particular schema.

Step 4: Compile the appropriate request format for the API

For each accreditation type, the user will need to use a different request format for the API.

Verifiable Authorisation for Trust Chain

Request format for Verifiable Authorisation for Trust Chain
{
  "issuerDid": "did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e",
  "subjectDid": "did:cheqd:testnet:6af412d7-2f04-4e12-a424-e6719db487ad",
  "schemas": [
    {
      "type": "MuseumPassCredential",
      "url": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d?resourceName=MuseumPassCredentialSchema&resourceType=JsonSchemaValidator2018"
    }
  ],
  "format": "jwt",
  "accreditationName": "authoriseAccreditationTest",
  "trustFramework": "https://learn.cheqd.io/governance/start",
  "trustFrameworkId": "cheqd Governance Framework"
}
Response format for Verifiable Authorisation for Trust Chain
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1"
  ],
  "type": [
    "VerifiableCredential",
    "VerifiableAuthorisationForTrustChain"
  ],
  "issuer": {
    "id": "did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e"
  },
  "credentialSubject": {
    "accreditedFor": [
      {
        "schemaId": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d?resourceName=MuseumPassCredentialSchema&resourceType=JsonSchemaValidator2018",
        "type": "MuseumPassCredential"
      }
    ],
    "id": "did:cheqd:testnet:6af412d7-2f04-4e12-a424-e6719db487ad"
  },
  "issuanceDate": "2024-10-15T04:06:47.000Z",
  "termsOfUse": {
    "type": "VerifiableAuthorisationForTrustChain",
    "trustFramework": "https://learn.cheqd.io/governance/start",
    "trustFrameworkId": "cheqd Governance Framework"
  },
  "proof": {
    "type": "JwtProof2020",
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiVmVyaWZpYWJsZUF1dGhvcmlzYXRpb25Gb3JUcnVzdENoYWluIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImFjY3JlZGl0ZWRGb3IiOlt7InNjaGVtYUlkIjoiaHR0cHM6Ly9yZXNvbHZlci5jaGVxZC5uZXQvMS4wL2lkZW50aWZpZXJzL2RpZDpjaGVxZDp0ZXN0bmV0OjBhNWI5NGQwLWE0MTctNDhlZC1hNmY1LTRhYmM5ZTk1ODg4ZD9yZXNvdXJjZU5hbWU9TXVzZXVtUGFzc0NyZWRlbnRpYWxTY2hlbWEmcmVzb3VyY2VUeXBlPUpzb25TY2hlbWFWYWxpZGF0b3IyMDE4IiwidHlwZSI6Ik11c2V1bVBhc3NDcmVkZW50aWFsIn1dfSwidGVybXNPZlVzZSI6eyJ0eXBlIjoiVmVyaWZpYWJsZUF1dGhvcmlzYXRpb25Gb3JUcnVzdENoYWluIiwidHJ1c3RGcmFtZXdvcmsiOiJodHRwczovL2xlYXJuLmNoZXFkLmlvL2dvdmVybmFuY2Uvc3RhcnQiLCJ0cnVzdEZyYW1ld29ya0lkIjoiY2hlcWQgR292ZXJuYW5jZSBGcmFtZXdvcmsifX0sInN1YiI6ImRpZDpjaGVxZDp0ZXN0bmV0OjZhZjQxMmQ3LTJmMDQtNGUxMi1hNDI0LWU2NzE5ZGI0ODdhZCIsIm5iZiI6MTcyODk2NTIwNywiaXNzIjoiZGlkOmNoZXFkOnRlc3RuZXQ6YjAwM2RmNmYtZWM4ZS00OGRkLTlhMmItNzAxMWM1Y2YwYTVlIn0.6dKE9-y2Id852onu1_WnD6aJnDtxgFZcjCbCfQ8MT1ACsHY8ox5jiKP4QUJNmhwesLidC99Qa0uyCrUhvHc2Bg"
  }
}
Request Parameter
Required
Description

"issuerDid"

Yes

The DID of the Issuer of the Accreditation

"subjectDid"

Yes

The DID of the Recipient of the Accreditation

"schemas"

Yes

A schema or multiple schemas that the recipient is accredited to issue

"format"

Optional

Defaults to "jwt" but may also be "json-ld"

"accreditationName"

Yes

Name of the accreditation which is used for chronological versioning of the accreditation.

"trustFramework"

Yes

A URL that points to an Ecosystem Governance Framework

"trustFrameworkId"

Yes

The name of the Ecosystem Governance Framework

"credentialStatus"

Optional

An object detailing the status information of the Accreditation

Verifiable Accreditation to Accredit

Request format for Verifiable Accreditation to Accredit
{
  "issuerDid": "did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e",
  "subjectDid": "did:cheqd:testnet:6af412d7-2f04-4e12-a424-e6719db487ad",
  "schemas": [
    {
      "type": "MuseumPassCredential",
      "url": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d?resourceName=MuseumPassCredentialSchema&resourceType=JsonSchemaValidator2018"
    }
  ],
  "format": "jwt",
  "accreditationName": "accreditationToAttestTest",
  "parentAccreditation": "did:cheqd:testnet:15b74787-6e48-4fd5-8020-eab24e990578?resourceName=accreditAccreditation&resourceType=VerifiableAccreditationToAccredit",
  "rootAuthorization": "did:cheqd:testnet:5RpEg66jhhbmASWPXJRWrA?resourceName=authorizeAccreditation&resourceType=VerifiableAuthorisationForTrustChain",
}
Response format for Verifiable Accreditation to Accredit
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1"
  ],
  "type": [
    "VerifiableCredential",
    "VerifiableAccreditationToAccredit"
  ],
  "issuer": {
    "id": "did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e"
  },
  "credentialSubject": {
    "accreditedFor": [
      {
        "schemaId": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d?resourceName=MuseumPassCredentialSchema&resourceType=JsonSchemaValidator2018",
        "type": "MuseumPassCredential"
      }
    ],
    "id": "did:cheqd:testnet:6af412d7-2f04-4e12-a424-e6719db487ad"
  },
  "issuanceDate": "2024-10-15T04:06:47.000Z",
  "termsOfUse": {
    "type": "VerifiableAuthorisationForTrustChain",
    "parentAccreditation": "did:cheqd:testnet:15b74787-6e48-4fd5-8020-eab24e990578?resourceName=accreditAccreditation&resourceType=VerifiableAccreditationToAccredit",
    "rootAuthorization": "did:cheqd:testnet:5RpEg66jhhbmASWPXJRWrA?resourceName=authorizeAccreditation&resourceType=VerifiableAuthorisationForTrustChain",
  },
  "proof": {
    "type": "JwtProof2020",
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiVmVyaWZpYWJsZUF1dGhvcmlzYXRpb25Gb3JUcnVzdENoYWluIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImFjY3JlZGl0ZWRGb3IiOlt7InNjaGVtYUlkIjoiaHR0cHM6Ly9yZXNvbHZlci5jaGVxZC5uZXQvMS4wL2lkZW50aWZpZXJzL2RpZDpjaGVxZDp0ZXN0bmV0OjBhNWI5NGQwLWE0MTctNDhlZC1hNmY1LTRhYmM5ZTk1ODg4ZD9yZXNvdXJjZU5hbWU9TXVzZXVtUGFzc0NyZWRlbnRpYWxTY2hlbWEmcmVzb3VyY2VUeXBlPUpzb25TY2hlbWFWYWxpZGF0b3IyMDE4IiwidHlwZSI6Ik11c2V1bVBhc3NDcmVkZW50aWFsIn1dfSwidGVybXNPZlVzZSI6eyJ0eXBlIjoiVmVyaWZpYWJsZUF1dGhvcmlzYXRpb25Gb3JUcnVzdENoYWluIiwidHJ1c3RGcmFtZXdvcmsiOiJodHRwczovL2xlYXJuLmNoZXFkLmlvL2dvdmVybmFuY2Uvc3RhcnQiLCJ0cnVzdEZyYW1ld29ya0lkIjoiY2hlcWQgR292ZXJuYW5jZSBGcmFtZXdvcmsifX0sInN1YiI6ImRpZDpjaGVxZDp0ZXN0bmV0OjZhZjQxMmQ3LTJmMDQtNGUxMi1hNDI0LWU2NzE5ZGI0ODdhZCIsIm5iZiI6MTcyODk2NTIwNywiaXNzIjoiZGlkOmNoZXFkOnRlc3RuZXQ6YjAwM2RmNmYtZWM4ZS00OGRkLTlhMmItNzAxMWM1Y2YwYTVlIn0.6dKE9-y2Id852onu1_WnD6aJnDtxgFZcjCbCfQ8MT1ACsHY8ox5jiKP4QUJNmhwesLidC99Qa0uyCrUhvHc2Bg"
  }
}
Request Parameter
Required
Description

"issuerDid"

Yes

The DID of the Issuer of the Accreditation

"subjectDid"

Yes

The DID of the Recipient of the Accreditation

"schemas"

Yes

A schema or multiple schemas that the recipient is accredited to issue

"format"

Optional

Defaults to "jwt" but may also be "json-ld"

"accreditationName"

Yes

Name of the accreditation which is used for chronological versioning of the accreditation.

"parentAccreditation"

Yes

A URL or DID URL of Accreditation of the Issuer demonstrating capacity to issue this Accreditation.

"rootAuthorization"

Yes

A URL or DID URL of the root authorization governing the ecosystem

"credentialStatus"

Optional

An object detailing the status information of the Accreditation

For a trusted ecosystem, these attestations are required to trace the legitimacy of a credential issuer to a root-of-trust.

Verifiable Accreditation to Attest

Request format for Verifiable Accreditation to Attest
{
  "issuerDid": "did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e",
  "subjectDid": "did:cheqd:testnet:6af412d7-2f04-4e12-a424-e6719db487ad",
  "schemas": [
    {
      "type": "MuseumPassCredential",
      "url": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d?resourceName=MuseumPassCredentialSchema&resourceType=JsonSchemaValidator2018"
    }
  ],
  "format": "jwt",
  "accreditationName": "accreditationToAttestTest",
  "parentAccreditation": "did:cheqd:testnet:15b74787-6e48-4fd5-8020-eab24e990578?resourceName=accreditAccreditation&resourceType=VerifiableAccreditationToAccredit",
  "rootAuthorization": "did:cheqd:testnet:5RpEg66jhhbmASWPXJRWrA?resourceName=authorizeAccreditation&resourceType=VerifiableAuthorisationForTrustChain",
}
Response format for Verifiable Accreditation to Attest
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1"
  ],
  "type": [
    "VerifiableCredential",
    "VerifiableAccreditationToAccredit"
  ],
  "issuer": {
    "id": "did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e"
  },
  "credentialSubject": {
    "accreditedFor": [
      {
        "schemaId": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d?resourceName=MuseumPassCredentialSchema&resourceType=JsonSchemaValidator2018",
        "type": "MuseumPassCredential"
      }
    ],
    "id": "did:cheqd:testnet:6af412d7-2f04-4e12-a424-e6719db487ad"
  },
  "issuanceDate": "2024-10-15T04:06:47.000Z",
  "termsOfUse": {
    "type": "VerifiableAuthorisationForTrustChain",
    "parentAccreditation": "did:cheqd:testnet:15b74787-6e48-4fd5-8020-eab24e990578?resourceName=accreditAccreditation&resourceType=VerifiableAccreditationToAccredit",
    "rootAuthorization": "did:cheqd:testnet:5RpEg66jhhbmASWPXJRWrA?resourceName=authorizeAccreditation&resourceType=VerifiableAuthorisationForTrustChain",
  },
  "proof": {
    "type": "JwtProof2020",
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiVmVyaWZpYWJsZUF1dGhvcmlzYXRpb25Gb3JUcnVzdENoYWluIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImFjY3JlZGl0ZWRGb3IiOlt7InNjaGVtYUlkIjoiaHR0cHM6Ly9yZXNvbHZlci5jaGVxZC5uZXQvMS4wL2lkZW50aWZpZXJzL2RpZDpjaGVxZDp0ZXN0bmV0OjBhNWI5NGQwLWE0MTctNDhlZC1hNmY1LTRhYmM5ZTk1ODg4ZD9yZXNvdXJjZU5hbWU9TXVzZXVtUGFzc0NyZWRlbnRpYWxTY2hlbWEmcmVzb3VyY2VUeXBlPUpzb25TY2hlbWFWYWxpZGF0b3IyMDE4IiwidHlwZSI6Ik11c2V1bVBhc3NDcmVkZW50aWFsIn1dfSwidGVybXNPZlVzZSI6eyJ0eXBlIjoiVmVyaWZpYWJsZUF1dGhvcmlzYXRpb25Gb3JUcnVzdENoYWluIiwidHJ1c3RGcmFtZXdvcmsiOiJodHRwczovL2xlYXJuLmNoZXFkLmlvL2dvdmVybmFuY2Uvc3RhcnQiLCJ0cnVzdEZyYW1ld29ya0lkIjoiY2hlcWQgR292ZXJuYW5jZSBGcmFtZXdvcmsifX0sInN1YiI6ImRpZDpjaGVxZDp0ZXN0bmV0OjZhZjQxMmQ3LTJmMDQtNGUxMi1hNDI0LWU2NzE5ZGI0ODdhZCIsIm5iZiI6MTcyODk2NTIwNywiaXNzIjoiZGlkOmNoZXFkOnRlc3RuZXQ6YjAwM2RmNmYtZWM4ZS00OGRkLTlhMmItNzAxMWM1Y2YwYTVlIn0.6dKE9-y2Id852onu1_WnD6aJnDtxgFZcjCbCfQ8MT1ACsHY8ox5jiKP4QUJNmhwesLidC99Qa0uyCrUhvHc2Bg"
  }
}
Request Parameter
Required
Description

"issuerDid"

Yes

The DID of the Issuer of the Accreditation

"subjectDid"

Yes

The DID of the Recipient of the Accreditation

"schemas"

Yes

A schema or multiple schemas that the recipient is accredited to issue

"format"

Optional

Defaults to "jwt" but may also be "json-ld"

"accreditationName"

Yes

Name of the accreditation which is used for chronological versioning of the accreditation.

"parentAccreditation"

Yes

A URL or DID URL of Accreditation of the Issuer demonstrating capacity to issue this Accreditation.

"rootAuthorization"

Yes

A URL or DID URL of the root authorization governing the ecosystem

"credentialStatus"

Optional

An object detailing the status information of the Accreditation

For a trusted ecosystem, these attestations are required to trace the legitimacy of a credential issuer to a root-of-trust.

Step 5: Make request to the API

Step 7: Reference the Verifiable Accreditation

Owing to the design of DID-Linked Resources, following the creation of the a Verifiable Accreditation, users are able to reference the specific version, or create a query to always fetch the latest version of the Accreditation.

Using a DID Resolver or the search DID endpoint, users can find the DID URL and unique resourceId of the Verifiable Accreditation. The unique resourceId allows users to specify this exact version of the Accreditation.

In the DID Document Metadata, users should find "linkedResourceMetadata", like the following snippet:

"linkedResourceMetadata": [
      {
        "resourceURI": "did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d/resources/4e1104f9-2ee9-4bde-adc2-ab8ba72b124a",
        "resourceCollectionId": "0a5b94d0-a417-48ed-a6f5-4abc9e95888d",
        "resourceId": "4e1104f9-2ee9-4bde-adc2-ab8ba72b124a",
        "resourceName": "OxfordUniversityAccreditation",
        "resourceType": "VerifiableAccreditationToAccredit",
        "mediaType": "application/json",
        "resourceVersion": "",
        "created": "2023-03-24T12:13:45Z",
        "checksum": "6819aaecd4073173b159fedf8077c38e14939d03d58e7f4e2a0ddfe034eb2ed4",
        "previousVersionId": null,
        "nextVersionId": null
      } 

Specific version of the Verifiable Accreditation

Here, the "resourceURI" specifies the DID URL of the specific Verifiable Accreditation that was created.

Latest version of the Verifiable Accreditation

In order to reference the latest version of the Verifiable Accreditation, the following construction needs to be used:

did:cheqd:<namespace>:<resourceCollectionId>?resourceName=<resourceName>&resourceType=<resourceType>

For example:

did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d?resourceName=OxfordUniversityAccreditation&resourceType=VerifiableAccreditationToAccredit

Verifiable Accreditation at specific point in time

In order to reference the Verifiable Accreditation at a particular point in time, the following construction needs to be used:

did:cheqd:<namespace>:<resourceCollectionId>?resourceName=<resourceName>&resourceType=<resourceType>&resourceVerionTime=<XMLDateTime>

For example:

did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d?resourceName=OxfordUniversityAccreditation&resourceType=VerifiableAccreditationToAccredit&resourceVersionTime=2023-02-22T06:58:18.61Z

Choosing the right SDK

Understand cheqd's SDK suite and choose the best fit for your project.

Integrate with a cheqd supported SDK

cheqd has integrated into a suite of SDKs to enable third parties to create DIDs and DID-Linked Resources; and, issue and verify Verifiable Credentials, using cheqd DIDs.

Choose a software stack to suit your needs

cheqd is continually integrating into different software development kits to suit the needs of different partners and their clients.

Below is a comparison between our supported SDKs, including: Credo, ACA-Py, Veramo SDK plugin and Walt.id's Community Stack.

Functionality
Credo
Veramo
ACA-Py
Walt.id SSI Kit

Create cheqd DIDs ()

✔️

✔️

✔️

✔️

cheqd Credential Payments

❌

✔️

❌

❌

JSON based JWT Verifiable Credential ()

❌

✔️

✔️

✔️

JSON-LD Verifiable Credential ()

✔️

✔️

✔️

✔️

AnonCreds ()

✔️

❌

✔️

❌

Selective Disclosure-JWT Credential ()

✔️

⌛(roadmap)

✔️

✔️

Create on-ledger Schema ()

✔️

✔️

✔️

❌

Create Credential Definition ()

✔️

❌

✔️

❌

DIDComm v1.0 ()

✔️

✔️

✔️

❌

DIDComm v2.0 ()

✔️

✔️

✔️

❌

DID Exchange Protocol ()

✔️

❌

✔️

❌

Agent Connection Protocol ()

✔️

❌

✔️

❌

Out of Band Protocol ()

✔️

❌

✔️

❌

Self Issued OpenID Provider v2 (OIDC-SIOP) ()

✔️

⌛(roadmap)

❌

✔️

OpenID for Verifiable Credential Issuance ()

✔️

⌛(roadmap)

❌

✔️

OpenID for Verifiable Credential Presentations ()

✔️

⌛(roadmap)

❌

✔️

Bitstring Status List ()

❌

✔️

✔️

✔️

Token Status List ()

✔️

❌

✔️

✔️

AnonCreds Revocation Registry Definitions ()

✔️

❌

✔️

❌

AnonCreds Status List Entries ()

✔️

❌

✔️

❌

Issue Credential Protocol ()

✔️

❌

✔️

❌

Issue Credential Protocol V2 ()

✔️

❌

✔️

❌

DIF Presentation Exchange ()

✔️

✔️

✔️

✔️

Aries Present Proof 2.0 ()

✔️

❌

✔️

❌

DID-Linked Trust Registries

❌

⌛(roadmap)

⌛(roadmap)

❌

Get started

Choose one of our SDKs below and started building cheqd into your existing or new product:

Credo

Credo is an SDK that is building directly towards supporting the EUDI standards, as well as support for AnonCreds.

ACA-Py

ACA-Py is a quickly expanding SDK, moving from the AnonCreds ecosystem towards wider support for EUDI.

Veramo

The Veramo SDK Plugin is an extension of the Veramo SDK, a JavaScript framework for Trusted Data, adding support for cheqd functionality.

Walt.id Community Stack

Walt.id Community Stack is an SDK that supports the European Architecture and Reference Framework (ARF) standards for identity, with cheqd DID support.

ADR
spec
spec
spec
spec
ADR
spec
spec
spec
RFC 0023
RFC 0160
RFC 0434
spec
spec
spec
spec
spec
spec
spec
RFC 0036
RFC 0453
spec
spec
Cover
Cover
Cover
Cover

Root Authorisations

Learn how Root TAOs can set the governance baseline, including the governance framework for the trust chain through Root Authorisations.

RTAO -> TAO

Learn about how Root TAOs can accredit other TAOs in the trust ecosystem with permissions and Trust Framework Policies.

TAO -> SubTAO

Learn about how TAOs can accredit other SubTAOs in the trust ecosystem with permissions and Accreditation Policies.

TAO - TI

Learn about how TAOs can accredit Trusted Issuers to issue credentials within the trust ecosystem, using permissions and Accreditation Policies.

Referencing Trust Registry within a Verifiable Credential

Learn how a Trusted Issuer can reference a Trust Registry in an issued credential, enabling a relying party to traverse the Trust Chain.

Set up Trust Chain

Design and build a trust chain for establishing a trust hierarchy in your ecosystem.

Get started with TRAIN

Deploy TRAIN and start validating trust chains with DNS-anchored roots and cryptographic accreditations.

Cover
Cover

Set Up Your Account

Set up your account with cheqd Studio and log in to start using the APIs.

Create an Issuer DID

Create a W3C conformant DID on cheqd using the did:cheqd DID Method.

Product Overview

Get started with cheqd's identity functionality and product offerings.

cheqd is a purpose-built network for decentralised identity. This documentation site provides technical and product information for all identity features & functionality on the cheqd network.

Integrate with cheqd

cheqd maintains an array of products and packages with varying levels of integration complexity to allow its partners and customers to have multiple ways of plugging into cheqd's identity functionality. Via these different packages, customers and partners can create cheqd DIDs, DID-Linked Resources, Status Lists, Trust Registries and Schemas, as well as use cheqd's Credential Payments model.

There are three core ways of integrating and building with cheqd:

What functionality does cheqd offer?

cheqd's identity functionality is fully standards-compliant, ensuring interoperability and no vendor lock-in. cheqd's tooling and different product offerings offer a variety of building blocks for any Trusted Data Market.

Industry Standard DID Support

If you want to utilise cheqd DIDs or DID-Linked Resources within applications without a specific cheqd integration, you can incorporate a Universal Registrar or Universal Resolver driver to support did:cheqd alongside other commonly adopted DID methods.

Get started with cheqd Studio

cheqd Studio is the easiest route to get started with cheqd's identity functionality, or for testing with very low integration effort. Using simple REST APIs, it is possible to integrate cheqd Studio in a few lines of code.

Under the hood, cheqd Studio utilises the Veramo SDK cheqd Plugin, providing the most feature complete set of functionality and tooling.

If you'd rather build a deeper integration using a Software Development Kit (SDK) or lower level package, we've created a simple diagram to show how our packages are structured below.

Understanding cheqd's capabilities

cheqd supports a wide array of standards and protocols via different Software Development Kits (SDKs) and integrations.

cheqd Capability diagram

Understanding the structure of cheqd's packages

One of cheqd's primary motives is to make itself accessible to the widest set of identity applications possible. To accomplish this, cheqd has built a flexible set of packages and tooling to accommodate its identity capabilities into a broad set of external SDKs and applications.

These can be represented through the visual below:

cheqd packages diagram

Partner SaaS products

You can also leverage SaaS products from our partners that consume these underlying SDKs to build high-quality credential ecosystems on top of cheqd’s infrastructure:

Get involved

The cheqd Discord is our primary chat channel for the open-source community, software developers, and node operators.

Please reach out to us there for discussions, help, and feedback on the project.

🙋 Find us elsewhere

Context for developing DID-Linked Resources

Understand the context and design decisions around why cheqd developed DID-Linked Resources (DLRs).

Understanding "Resources" in decentralised identity

In self-sovereign identity (SSI) ecosystems, “resources” are often required in tandem with , to provide supporting information or additional context to verifiers receiving .

For example, common types of resources that might be required to issue and validate Verifiable Credentials are:

  • Schemas;

  • Status lists;

  • Trust registries;

  • Visual Representations of Verifiable Credentials;

  • Documents; or

  • Logos

Schemas

Schemas describe in a machine-readable format. Prominent examples of this include , , etc. You can think of them as a template for what is included in a Verifiable Credential.

Below is an example of a residential address with full URLs:

This might also take the form of evidence schemes, which describe additional information about the processes used to validate the information presented in a Verifiable Credential in common, machine-readable format.

Prominent examples of this include , , etc.

Status and Revocation Lists

Status lists allow recipients of a Verifiable Credential exchange to for validity. Prominent examples of this include the specification, , etc.

Trust registries

Trust registries enable recipients of a Verifiable Credential exchange to check that the Decentralized Identifier of the issuer is listed in a trusted registry. This provides a level of assurance in the authenticity of the issuer. Examples of Trust Registries include the , , etc.

Visual representations for Verifiable Credentials

Although Verifiable Credentials can be exchanged digitally, in practice most identity wallets want to present “human-friendly” representations. Examples of this include the , (".pkpass"), , etc. A resource, using something like may enable a credential representation to be shown according to the brand guidelines of the issuer, , etc.

Figure 1:

Such visual representations can also be used to quickly communicate information visually during identity exchanges, such as airline mobile boarding passes.

Figure 2: Mobile boarding passes in Apple Wallet showing different visual styles (source: )

In the , the pass at the front is for a “Gold” loyalty status member, whereas the pass at the back is for a “standard” loyalty status member. This information can be represented in a Verifiable Credential, of course, but the example here uses the Apple Wallet / Google Wallet formats to overlay a richer display.

While it’s useful to have digital credentials that can be verified cryptographically, the reality is that there are often occasions when a quick “visual check” is done instead. For example, when at an airport, an airline staff member might visually check a mobile boarding pass to direct people to the correct queue they need to join. The mobile boarding pass does get scanned at points like check-in, security, boarding etc., to digitally read the information, other scenarios where this is not done are equally valid. However, most Verifiable Credential formats do not explicitly provide such “human-friendly” forms of showing the data held in a credential.

Documents

More broadly, there are other types of resources that might be relevant for companies beyond SSI vendors, that want a way to represent information about themselves in an immutable and trustworthy way.

Many companies require documentation such as Privacy Policies, Data Protection Policies or Terms of Use to be made publicly available. Moreover, , which would typically be a text file, a , PDF etc.

Logos

Companies may want to provide authorised image logos to display across different websites, exchanges or block explorers. Examples of this include (which is used by to show logos for validators) and “” (commonly used to set the logo for websites in browser tabs).

The current uses for resources are therefore very broad across the SSI ecosystem, and in addition, for other companies that may want to use DIDs to reference relevant information on ledger. For this reason, it is essential that the SSI community strengthens the way that resources are stored, referenced and retrieved in SSI ecosystems.

In our demo for IIW, we showed an IIW logo as a resource on-ledger, being used within the body of a Verifiable Credential. In the JSON below, you will be able to see the resources being used in both the "@context" and "logo" sections.

By clicking the image below, you will see that this is actually being pulled and resolved from the cheqd ledger:

Rationale for storing resources on-ledger

What are the problems with the way resources are stored?

There are multiple approaches to decentralised identity which rely on centralised infrastructure across different technical layers. Decentralised Identifiers (DIDs): are often stored on ledgers (e.g., , , distributed storage (e.g., in ), or non-ledger distributed systems (e.g., ). Yet, DIDs can be stored on traditional centralised-storage endpoints (e.g., , .)

The issue of centralisation affects resources providing extra context and information to support Verifiable Credentials. These resources, such as schemas and revocation lists, are often stored and referenced using centralised hosting providers.

Using centralised hosting providers to store resources may have a significant difference in the longevity and authenticity of Verifiable Credentials. For example, a passport (which typically has a 5–10 year validity) issued as a Verifiable Credential anchored to a DID (regardless of whether the DID was on-ledger or not) might stop working if the credential schema, visual presentation format, or other necessary resources were stored off-ledger on traditional centralised storage.

  • DIDs could be tampered by compromising the hosting provider: DIDs and DID Documents ("DIDDocs") stored at a centralised web endpoint can be compromised and replaced by malicious actors.

  • Hosting providers could unilaterally cease to host particular clients: Hosting providers could terminate accounts due to factors such as non-payment of fees, violation of Terms of Service, etc.

  • Single point-of-failure in resiliency: Even for highly-trusted and sophisticated hosting providers who may not present a risk of infrastructure being compromised, a service outage at the hosting provider can make a DID anchored on their systems inaccessible.

Single points of failure

Even for highly-trusted and sophisticated hosting providers who may not present a risk of infrastructure being compromised, a service outage at the hosting provider can make a resource anchored on their systems inaccessible.

The high centralisation of cloud providers and history of noteworthy outages clearly demonstrates why we should not host resources on centralised cloud storage in production environments. In Q1 of 2022, the three largest players in the cloud (AWS, Google Cloud, Microsoft Azure) dominated with .

Figure 3: Breakdown of global cloud provider market share (source: )

Beyond cloud providers, there are other events that exemplify the issuers relying on larger players. The (shown in the graph below) functionality. This highlights the risks of “contagion impact” (e.g., ) of centralised digital systems — even ones run by extremely-capable tech providers.

Figure 4: Graph showing drop in Facebook traffic from their global service outage in 2021 (source: )

Likewise, with decentralised identity, there has been excellent work to decentralise, with standards that remove the need for centralised intermediaries — notably around and the decentralised trust provided by . Yet, all of this excellent work may be eroded in practice, unless every component of an SSI ecosystem is able to maintain an equivalent level of decentralised trust. Resources are currently an area that has been centralised for the sake of convenience.

Link rot

"Link rot" happens when over time, URLs become inaccessible, either because the endpoint where the content was stored is no longer active, or the URL format itself changes. The graph below from shows degradation over time of URLs.

Figure 5: Linkrot analysis over 1996-2019 by New York Times (source: )

For this reason, keeping an up-to-date version of the links themselves is crucial. Furthermore, a study of link rot found . This can have an adverse impact on the digital longevity of Verifiable Credentials if there’s “link rot” in the resources necessary to process the credential. For this reason, projects such as ’s exist to snapshot digital ephemera before they are lost forever.

Figure 6: Pie chart showing root causes of link rot (source: )

This illustrates that link rot can affect a significant proportion of links in a relatively small amount of time, and once again, looking at how resources are currently stored in SSI ecosystems, if the resource locations are moved and the links are broken, the Verifiable Credentials relying on these resources become unusable. Therefore, resources, once defined, should be architected to be used and referenced indefinitely, without being changed.

Tamper-evident changes and censorship resistance

Finally, the centralised way that resources are currently stored and managed is not immutable, and as a result, it is liable to tampering. For example, if a hosting provider is compromised, or if malicious actors are working for the company, resources may be changed and previous resource versions may be purged from the central database.

As we move towards a new web infrastructure with Web 3 (and beyond…), and as more projects leverage blockchain and distributed ledgers, it’s important not to port the previous issues of the web, and instead find novel ways to better manage information, with longevity in mind. This is why at cheqd, we have decided to redesign the way resources are captured on the ledger.

Semantic Linkage

Solutions that do currently store schemas on ledger (e.g., Hyperledger Indy) don't have semantic linkage between old and new versions. In this instance, current ledgers allow new versions to be made but don't offer an easy way for client apps to discover linkages as they evolve over time.

Addressing risk vectors using DID-Linked Resources

We took the following design principles into consideration, along with an explanation of how we addressed them:

  1. Built using existing, familiar DID Core Spec patterns: Wherever possible, our design attempts to utilise existing patterns and behaviours within the W3C DID Core specification (such as the use of DID URLs to identify resources), instead of trying to implement proprietary/custom approaches. We believe that similar designs could be adopted by other DID methods if they choose.

  2. Protection against linkrot for long-term retrieval: Any Resource stored on-ledger is replicated across multiple nodes.

    1. If any individual node or endpoint is down, lookup requests can be sent to any other node on the network.

    2. In a catastrophic scenario where the network itself stops to exist, e.g., companies shutting down, getting acquired etc the on-ledger data can still be restored by digital archivists using ledger snapshots. A practical example of this is how Cosmos Hub makes historical chain archives available which can be restored. While this can be cumbersome, we wanted to design for this as a fail-safe.

  3. Extensible by default: Our objective was to build a flexible design pattern that allowed developers to define and extend their own resource types. Trying to control what kinds of resources could be written to ledger would make the ledger-side logic complex. Instead, we opted for a design where the cheqd ledger acts agnostically to store resources, as long as correctly authorised, as a permanently-accessible endpoint.

  4. Design for DID-spec "dumb" as well as DID-spec "smart" client applications: Many approaches in this space assume that client applications must be adept at parsing DIDDocs and resolving complex inter-DIDDoc relationships. We saw describing resources using DIDDocs as metadata about the resource which could be independently-parsed by "smart" client applications; while also providing a fallback approach for "dumb" client applications. We internally considered this as "What if an identity wallet understood how to parse JSON, but didn't understand the DID Core spec?"

  5. Version controlled: The ability to evolve a resource over time is critical for identity use cases. As described above, examples of this include when identity document schemas change, logos evolve, etc. Current approaches (such as Hyperledger Indy CredDefs) deal with this by creating entirely new, unlinked resources. We designed to make it easy, using existing DID Core specification techniques, so that client applications could query "What was the version of a resource with this name on this date/time?"

  6. Make re-use of resources simple: We liked the concept of in the sense that it promotes a common, machine-readable specification. Therefore, our design allows for patterns where the controllers of a DID can reference resources created by other DID owners/controllers, e.g., referencing a pre-existing schema. Taking this line of thought further, it allows for an arbitrary depth of how resources can be nested, as long as they are discoverable/resolvable.

  7. Notalltypes of resources should be stored on a ledger...but can be made discoverable through similar design patterns: Distributed ledgers are great for redundancy, but the cost of this duplication (in terms of storage required by node, block size, transaction finality speeds, etc) can be quite significant. For instance, a distributed ledger is probably not the best storage and retrieval mechanism for a video file (which can run into many GBs/TBs); or even a PDF larger than a few MBs. cheqd network . This can be updated via an on-ledger vote, but the trade-off of asking node operators to provision ever-expanding storage would be not ideal. Our design therefore restricts the file/payload size of on-ledger resources (in our case, ~190 KB - giving enough room for transaction data besides the resource itself), while allowing the same techniques below to be used for describing off-ledger resources. E.g., references . We recognise and accept that DID owners/creators may choose to use their own centralised/decentralised storage, and the design patterns described below accommodate that.

Learn more about the , and how we achieve these design principles.

cheqd Studio

Low complexity

Customers can easily integrate cheqd's identity functionality into their existing applications through hitting simple REST APIs using cheqd Studio.

Software Development Kits (SDKs)

Moderate complexity

To have greater flexibility, customers can build identity solutions through a set of SDKs to meet different technical stacks and requirements.

Direct integration with ledger code (cheqd SDK)

High complexity

For full customisation and flexibility, the cheqd SDK plugs directly into cheqd Network and is responsible for communicating with the core ledger code.

Create Decentralized Identifiers (DIDs)

Create Decentralized Identifiers (DIDs) with the did:cheqd DID Method.

Build Trust Registries

Create and verify trust registries, using the Decentralized Trust Chain (DTC) model, to secure your identity ecosystem.

Charge for Credentials

Charge and monetise your credential flows with encrypted DID-Linked Resources and Access Control Conditions.

Issue Credentials and Presentations

Issue and verify Verifiable Credentials, signed by did:cheqd DIDs, with JWT, JSON-LD, AnonCreds and SD-JWT supported.

Create Status Lists

Create and update status lists (Bitstring Status List, AnonCreds Status List) on cheqd, using DID-Linked Resources.

Create DID-Linked Resources (DLRs)

Create DID-Linked Resources (DLRs) on cheqd. These are digital files that are cryptographically tied to a Decentralized Identifier (DID).

DID Registrar (and Universal Registrar Driver)

Low complexity

Simple setup for building cheqd DIDs into existing applications using REST APIs, building into the Universal Registrar.

DID Resolver (and Universal Resolver Driver)

Low complexity

Service for resolving cheqd DIDs and DID URLs. Feature complete with query-based DID URL dereferencing. Full integration and driver within the Universal Resolver.

Get started with cheqd Studio

Click here to start your journey with cheqd Studio, create your account and begin using cheqd's underlying functionality.

Paradym (Animo Solutions)

Paradym by Animo Solutions fully supports EU Architecture & Reference Framework standards with cheqd under the hood.

Truvera (Dock)

Truvera is a full platform that supports credential issuance and management using cheqd as the primary DID Method.

Hovi Studio (Hovi)

Hovi provides an all-in-one platform for issuing and managing Verifiable Credentials with cheqd DIDs supported.

Sudo Platform (Anonyome Labs)

API-first developer platform for cheqd DIDs and support for multiple Verifiable Credential formats.

DIDx

DIDx supports did:cheqd through an enterprise version of ACA-Py, supporting AnonCreds and JSON-LD.

Godiddy (Danube Tech)

Godiddy from Danube Tech is a DID-specific SaaS offering focused on enterprise registration and resolution of DIDs across multiple methods.

Cloud Platform (Walt.id)

Cloud Platform by Walt.id similarly fully supports EU Architecture & Reference Framework standards with cheqd under the hood.

Cover
Cover
Cover
Cover
Cover
Cover
Cover
Cover
Cover
Cover
Cover
{ 
    "@type": "http://schema.org/Person", 
    "http://schema.org/address": {   
        "@type": "http://schema.org/PostalAddress",   
        "http://schema.org/streetAddress": "123 Main St.",   
        "http://schema.org/addressLocality": "Blacksburg",   
        "http://schema.org/addressRegion": "VA",   
        "http://schema.org/postalCode": "24060",   
        "http://schema.org/addressCountry": "US" 
    }
}
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://veramo.io/contexts/profile/v1",
    "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:z6jKUJA5YcZsNxZgsrQPKPipL2FRTf4s/resources/a20aa56a-a76f-4828-8a98-4c85d9494545"
  ],
  "type": [
    "VerifiableCredential",
    "EventReservation"
  ],
  "issuanceDate": "2022-11-17T03:19:03.328Z",
  "credentialSubject": {
    "id": "did:key:z6MkwTr46BWU42YejmZrDDCbL127dBoxSXeLuaHS75vTCg7i"
  },
  "reservationId": "4810116769",
  "reservationStatus": "https://schema.org/ReservationConfirmed",
  "reservationFor": {
    "@type": "Event",
    "name": "Internet Identity Workshop IIWXXXV",
    "startDate": "2022-11-16T16:00:00",
    "endDate": "2022-11-18T00:00:00",
    "location": "Computer History Museum, 1401 N Shoreline Blvd, Mountain View, CA 94043",
    "logo": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:z6jKUJA5YcZsNxZgsrQPKPipL2FRTf4s/resources/8140ec3a-d8bb-4f59-9784-a1cbf91a4a35"
  },
  "issuer": {
    "id": "did:cheqd:mainnet:zAXwwqZzhCZA1L77ZBa8fhVNjL9MQCHX"
  },
  "proof": {
    "type": "JwtProof2020",
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vdmVyYW1vLmlvL2NvbnRleHRzL3Byb2ZpbGUvdjEiLCJodHRwczovL3Jlc29sdmVyLmNoZXFkLm5ldC9kaWQ6Y2hlcWQ6dGVzdG5ldDp6NmpLVUpBNVljWnNOeFpnc3JRUEtQaXBMMkZSVGY0cy9yZXNvdXJjZXMvYTIwYWE1NmEtYTc2Zi00ODI4LThhOTgtNGM4NWQ5NDk0NTQ1Il0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJFdmVudFJlc2VydmF0aW9uIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImlkIjoiZGlkOmtleTp6Nk1rd1RyNDZCV1U0Mlllam1ackREQ2JMMTI3ZEJveFNYZUx1YUhTNzV2VENnN2kifX0sIkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIiwiaHR0cHM6Ly92ZXJhbW8uaW8vY29udGV4dHMvcHJvZmlsZS92MSIsImh0dHBzOi8vcmVzb2x2ZXIuY2hlcWQubmV0L2RpZDpjaGVxZDp0ZXN0bmV0Ono2aktVSkE1WWNac054WmdzclFQS1BpcEwyRlJUZjRzL3Jlc291cmNlcy9hMjBhYTU2YS1hNzZmLTQ4MjgtOGE5OC00Yzg1ZDk0OTQ1NDUiXSwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIkV2ZW50UmVzZXJ2YXRpb24iXSwiaXNzdWFuY2VEYXRlIjoiMjAyMi0xMS0xN1QwMzoxOTowMy4zMjhaIiwiY3JlZGVudGlhbFN1YmplY3QiOnsiaWQiOiJkaWQ6a2V5Ono2TWt3VHI0NkJXVTQyWWVqbVpyRERDYkwxMjdkQm94U1hlTHVhSFM3NXZUQ2c3aSJ9LCJyZXNlcnZhdGlvbklkIjoiNDgxMDExNjc2OSIsInJlc2VydmF0aW9uU3RhdHVzIjoiaHR0cHM6Ly9zY2hlbWEub3JnL1Jlc2VydmF0aW9uQ29uZmlybWVkIiwicmVzZXJ2YXRpb25Gb3IiOnsiQHR5cGUiOiJFdmVudCIsIm5hbWUiOiJJbnRlcm5ldCBJZGVudGl0eSBXb3Jrc2hvcCBJSVdYWFhWIiwic3RhcnREYXRlIjoiMjAyMi0xMS0xNlQxNjowMDowMCIsImVuZERhdGUiOiIyMDIyLTExLTE4VDAwOjAwOjAwIiwibG9jYXRpb24iOiJDb21wdXRlciBIaXN0b3J5IE11c2V1bSwgMTQwMSBOIFNob3JlbGluZSBCbHZkLCBNb3VudGFpbiBWaWV3LCBDQSA5NDA0MyIsImxvZ28iOiJodHRwczovL3Jlc29sdmVyLmNoZXFkLm5ldC8xLjAvaWRlbnRpZmllcnMvZGlkOmNoZXFkOnRlc3RuZXQ6ejZqS1VKQTVZY1pzTnhaZ3NyUVBLUGlwTDJGUlRmNHMvcmVzb3VyY2VzLzgxNDBlYzNhLWQ4YmItNGY1OS05Nzg0LWExY2JmOTFhNGEzNSJ9LCJpc3N1ZXIiOnsiaWQiOiJkaWQ6Y2hlcWQ6bWFpbm5ldDp6QVh3d3FaemhDWkExTDc3WkJhOGZoVk5qTDlNUUNIWCJ9LCJzdWIiOiJkaWQ6a2V5Ono2TWt3VHI0NkJXVTQyWWVqbVpyRERDYkwxMjdkQm94U1hlTHVhSFM3NXZUQ2c3aSIsIm5iZiI6MTY2ODY1NTE0MywiaXNzIjoiZGlkOmNoZXFkOm1haW5uZXQ6ekFYd3dxWnpoQ1pBMUw3N1pCYThmaFZOakw5TVFDSFgifQ.U4vPbvdY7724a1jJwiDeCH_4_YC5sKUMcH6lY_XCVWBTE1RvYAnTj4fPHWMy6zSVFL9TAk4ZBOqFjKUtShBSCw"
  }
}
W3C Verifiable Credentials
Verifiable Presentations
the fields and content types in a credential
schema.org
Hyperledger Indy schema objects
schema.org
Schema.org
Hyperledger AnonCreds SCHEMA objects
check the status of a credential
Bitstring Status List
Hyperledger AnonCreds Revocation
ToIP Trust Registry Query Protocol
EBSI Trust Chains
Overlays Capture Architecture (OCA) specification
Apple Wallet PassKit
Google Wallet Pass
Overlay Capture Architecture (OCA)
internationalisation (“i18n”) translations
Overlays Capture Architecture Specification Version 1.0.0
British Airways media centre
example above from British Airways
Trust over IP (ToIP) recommends making Governance Frameworks available through DID URLs
Markdown file
key-publishing sites like Keybase.io
Cosmos SDK block explorers such as our own
favicons
cheqd
Hyperledger Indy
IPFS
Sidetree
KERI
did:web
did:git
65 per cent in nearly all regions (outside of China)
CoinTelegraph
Facebook outage of 2021
took down apps that used “Login with Facebook”
a different Facebook outage took down Spotify, TikTok, Pinterest
Kentik
Verifiable Credentials
DID Authentication
an analysis by The New York Times of linkrot
Columbia Journalism Review / New York Times
at least 66.5% of links to sites in the last 9 years are dead
The Internet Archive
Wayback Machine
Ahrefs
Schema.org
restricts the block size for an individual block to ~200 KB
our first DID on cheqd network
a 7+ MB image accessible via IPFS
technical details on learn how we have architected DID-Linked resources
Image of Overlay Capture Architecture
Image of British airways tickets in digital visual format
Cloud provider market share
Graph showing drop in Facebook traffic from their global service outage in 2021
Link rot analysis over time
A pie chart showing an analysis of why link rot happens

Technical composition of DID-Linked Resources

Understand the technical composition of DID-Linked Resources (DLRs) on cheqd.

Formatting a Resource

"Resources" are identified with a did:cheqd Decentralized Identifier with a Universally Unique Identifier (UUID) that acts as a permanently-accessible link to fetch the resources from the cheqd ledger. We refer to this as the "resource ID".

Using UUIDs, we can have a high level of confidence that no two identical resource IDs will ever be created. This is important for ensuring the integrity and uniqueness of each individual resource.

Image showing a formatted DID URL for a cheqd resource

Figure 1: DID-linked Resource DID URL path

This will be explained further in the section on DID URL dereferencing to fetch a resource.

Understanding the DID and Collection relationship

Resources are organised into groups called "Collections". Each DID may have an associated Collection, and the Collection ID is derived from the unique identifier of the DID.

Collections can store any type of Resource, but for the purpose of this documentation we will focus on the use case where the Collection is used for storing a set of schemas.

The most important concept used in this design is that each on-ledger Collection is identified using a DID and is described using a DID Document.

The DID Document acts as metadata, providing information about the Collection, such as who is able to update it, when it was created and what are the latest and deprecated versions of Resources within the Collection.

For example, the following DID:

did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d

will derive the Collection ID: 1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d

Relation between a DID and Resource Collection

Figure 2: Relationship between a DID and Resource Collection

A Collection is created using a createResource transaction, and specifying the Collection ID as the same identifier as that of the parent DID.

Note that the Collection ID may take the syntactical form of a 'Hyperledger Indy' DID identifier or may be a Universally Unique Identifier (UUID). This is described in the cheqd DID method.

Creating a Resource inside a Collection, associated with a DID

To create a "DID-Linked Resource", you must already have created a 'parent' DID, from which the Collection ID can be derived. When you carry out the createResource transaction, you must:

  1. Generate a new, unique UUID for the Resources

  2. Specify the same Collection ID as the unique identifier of the parent DID

  3. Sign the createResource transaction with the Verification Method keys of the parent DID.

This is shown in the diagram below:

Relationship between a DID and DID-linked Resource

Figure 3: Relationship between a DID and DID-linked Resource

Example of createResource transaction using Veramo SDK:

{
    "kms": "local",
    "payload": {
        "collectionId": "1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d",
        "id": "f3d39687-69f5-4046-a960-3aae86a0d3ca",
        "name": "PassportSchema",
        "version": "", // optional
        "resourceType": "CL-Schema",
        "alsoKnownAs": [], // optional alternative URIs
        "data": "SGVsbG8sIHdvcmxk" // base 64 encoded file 
    },
    "signInputs": [{
        "verificationMethodId": "did:cheqd:testnet:z4ZUuPbs1xyK7y8d#key-1",
        "keyType": "Ed25519",
        "privateKeyHex": "0f5c124886178037952e87e0cdc55d185732577fca19ae877e64ac9ab24a0cc534e5326e70f1a42d785d93048aee806c359ec75a7b06f39253befd1746708438"
    }]
}

Linking DIDs to Resources and Collections

Multiple, DID-Linked Resources can be stored in a Collection, for example, this could be different versions of the same Resource over a period of time or semantically-linked resources. This enables unique resources to be stored directly on-ledger and be retrievable through DID resolution and dereferencing.

Once you have created a resource, the DID Document will automatically reference the resource and the collection within the didDocumentMetadata in a newly defined section called linkedResourceMetadata.

This relationship is shown in the diagram below:

DID Document metadata with linked Resource metadata

Figure 4: DID Document metadata with DID-linked Resource metadata

For simplicity, we will focus on the use case where a Resource is a schema. The same logic used in fetching schemas from the ledger can be applied to any of the aforementioned types of Resources.

The syntax of a Resource metadata for a single schema is as follows:

"linkedResourceMetadata": [
  {
    "resourceURI": "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d/resources/f3d39687-69f5-4046-a960-3aae86a0d3ca",
    "resourceCollectionId": "1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d",
    "resourceId": "f3d39687-69f5-4046-a960-3aae86a0d3ca",
    "resourceName": "PassportSchema", // First version of a Resource called PassportSchema
    "resourceType": "CL-Schema",
    "mediaType": "application/json",
    "created": "2022-07-19T08:40:00Z",
    "checksum": "7b2022636f6e74656e74223a202274657374206461746122207d0ae3b0c44298",
    "previousVersionId": "", // empty string if no previous version, otherwise, resourceId of previous version
    "nextVersionId": "", // null if no new version, otherwise, resourceId of new version
  }
]

Media Types allowed in Resources

Any valid IANA Media Type (colloquially known as "file type") is allowed as an on-ledger Resource. The only restriction is that the Resource should fit within a block, which de-facto restricts it to ~190KB to fit within the ~200KB block limit. Any files larger than this are recommended to be stored and linked via long-term immutable file discovery mechanisms such as IPFS.

A Golang library is used to derive and set media type based on the file extension of provided resource file. This makes it much simpler to maintain, since there is no list of file types that the cheqd ledger needs to gatekeep.

Resource Request Parameters

The following list defines which specific parameters a resource request format may contain:

Parameter
Description

resourceUri

A string or a map that conforms to the rules of which SHOULD directly lead to a location where the resource can be accessed from. For example: dic:cheqd:mainnet:46e2af9a-2ea0-4815-999d-730a6778227c/resources/0f964a80-5d18-4867-83e3-b47f5a756f02

resourceCollectionId

A string that conforms to a cheqd-supported unique identifier format. For example a UUID: 46e2af9a-2ea0-4815-999d-730a6778227c

resourceId

A string that uniquely identifies the resource, cheqd uses UUIDs. For example a UUID: 0f964a80-5d18-4867-83e3-b47f5a756f02

resourceName

A string that uniquelt names and identifies a resource. This property, along with the resourceType below, can be used to track version changes within a resource.

resourceType

A string that identifies the type of resource. This property, along with the resourceName above, can be used to track version changes within a resource. Not to be confused with media type.

resourceVersion

(Optional) A string that identifies the version of resource. This property is provided by the client and can be any value

alsoKnownAs

(Optional) An array that describes alternative URIs for the resource.

Resource Response Parameters

The following list defines which specific parameters a resource response format may contain:

Parameter
Description

resourceUri

A string or a map that conforms to the rules of which SHOULD directly lead to a location where the resource can be accessed from. For example: dic:cheqd:mainnet:46e2af9a-2ea0-4815-999d-730a6778227c/resources/0f964a80-5d18-4867-83e3-b47f5a756f02

resourceCollectionId

A string that conforms to a cheqd-supported unique identifier format. For example a UUID: 46e2af9a-2ea0-4815-999d-730a6778227c

resourceId

A string that uniquely identifies the resource, cheqd uses UUIDs. For example a UUID: 0f964a80-5d18-4867-83e3-b47f5a756f02

resourceName

A string that uniquelt names and identifies a resource. This property, along with the resourceType below, can be used to track version changes within a resource.

resourceType

A string that identifies the type of resource. This property, along with the resourceName above, can be used to track version changes within a resource. Not to be confused with media type.

resourceVersion

(Optional) A string that identifies the version of resource. This property is provided by the client and can be any value

alsoKnownAs

(Optional) An array that describes alternative URIs for the resource.

mediaType

A string that identifies the IANA-media type of the resource.

created

A string that identifies the time the resource was created in XML date-time.

updated

(Optional) A string that identifies the time the resource was updated in XML date-time.

checksum

A string that may be used to prove that the resource has not been tampered.

previousVersionId

(Optional) A string that identifies the previous version of the resource.

nextVersionId

(Optional) A string that identifies the next version of the resource.

Example of a resolved DID with an associated Resource

Let’s take a look at a fully resolved output response for a DID with a Collection and single associated Resource:

{
  "@context": "https://w3id.org/did-resolution/v1",
  "didResolutionMetadata": {
    "contentType": "application/did+ld+json",
    "retrieved": "2022-11-28T05:01:50Z",
    "did": {
      "didString": "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d",
      "methodSpecificId": "1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d",
      "method": "cheqd"
    }
  },
  "didDocument": {
    "@context": [
      "https://www.w3.org/ns/did/v1"
    ],
    "id": "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d",
    "controller": [
      "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d"
    ],
    "verificationMethod": [
      {
        "id": "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d#verKey1",
        "type": "Ed25519VerificationKey2020",
        "controller": "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d",
        "publicKeyMultibase": "zB5wPyMGYL4LbT424Z7yXHm6nZrrLqZZg9eWtVmedodys"
      },
    ],
    "authentication": [
      "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d#verKey1"
    ]
  },
  "didDocumentMetadata": {
    "created": "2015-04-10T11:51:40Z",
    "versionId": "ea2b76cf-a118-403a-8f49-244e56c9dcb8",
    "linkedResourceMetadata": [
      { // First version of a Resource called PassportSchema
        "resourceURI": "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d/resources/f3d39687-69f5-4046-a960-3aae86a0d3ca",
        "resourceCollectionId": "1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d", // Derived Collection ID
        "resourceId": "f3d39687-69f5-4046-a960-3aae86a0d3ca",
        "resourceName": "PassportSchema",
        "resourceType": "CL-Schema",
        "mediaType": "application/json",
        "created": "2015-04-16T14:01:42Z",
        "checksum": "72f9d4f96c6f4fedcfd5d1691b10d60d14a008cace269ddb35342aa8d43a30fc",
        "previousVersionId": null, // No previous or next versions
        "nextVersionId": null // No previous or next versions
      }
    ]
  }
}

Example of DID Document with multiple versions of the same resource

Let’s take a look at a fully resolved output response for a DID with a Collection and multiple associated Resources:

{
  "@context": "https://w3id.org/did-resolution/v1",
  "didResolutionMetadata": {
    "contentType": "application/did+ld+json",
    "retrieved": "2022-11-28T05:01:50Z",
    "did": {
      "didString": "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d",
      "methodSpecificId": "1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d",
      "method": "cheqd"
    }
  },
  "didDocument": {
    "@context": [
      "https://www.w3.org/ns/did/v1"
    ],
    "id": "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d",
    "controller": [
      "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d"
    ],
    "verificationMethod": [
      {
        "id": "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d#verKey1",
        "type": "Ed25519VerificationKey2020",
        "controller": "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d",
        "publicKeyMultibase": "zB5wPyMGYL4LbT424Z7yXHm6nZrrLqZZg9eWtVmedodys"
      },
    ],
    "authentication": [
      "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d#verKey1"
    ]
  },
  "didDocumentMetadata": {
    "created": "2015-04-10T11:51:40Z",
    "versionId": "9D760202FF2BD4A12344283627FF251BE6C48812C7626C3564C1C2843CAB9085",
    "linkedResourceMetadata": [
      { // First version of a Resource called PassportSchema
        "resourceURI": "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d/resources/f3d39687-69f5-4046-a960-3aae86a0d3ca",
        "resourceCollectionId": "1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d", // Derived Collection ID
        "resourceId": "f3d39687-69f5-4046-a960-3aae86a0d3ca",
        "resourceName": "PassportSchema", // Resource name remains the same
        "resourceType": "CL-Schema", // Resource type remains the same
        "mediaType": "application/json",
        "created": "2015-04-16T14:01:42Z",
        "checksum": "72f9d4f96c6f4fedcfd5d1691b10d60d14a008cace269ddb35342aa8d43a30fc",
        "previousVersionId": null,
        "nextVersionId": "8f86d7aa-dc6a-4cee-ac37-97956542d587"
      },
      { // Second version of a Resource called PassportSchema
        "resourceURI": "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d/resources/8f86d7aa-dc6a-4cee-ac37-97956542d587",
        "resourceCollectionId": "1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d", // Derived Collection ID
        "resourceId": "8f86d7aa-dc6a-4cee-ac37-97956542d587",
        "resourceName": "PassportSchema", // Resource name remains the same
        "resourceType": "CL-Schema", // Resource type remains the same
        "mediaType": "application/json",
        "created": "2020-06-16T14:02:39Z",
        "checksum": "ec54f8019b869d5511b42678ea859b9dc185f487bf1776cb079fda0930331689",
        "previousVersionId": "f3d39687-69f5-4046-a960-3aae86a0d3ca",
        "nextVersionId": "bd128013-636d-4240-b48b-fc88bf9ee8de"
      },
      { // Third version of a Resource called PassportSchema
        "resourceURI": "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d/resources/bd128013-636d-4240-b48b-fc88bf9ee8de",
        "resourceCollectionId": "1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d", // Derived Collection ID
        "resourceId": "bd128013-636d-4240-b48b-fc88bf9ee8de",
        "resourceName": "PassportSchema", // Resource name remains the same
        "resourceType": "CL-Schema", // Resource type remains the same
        "mediaType": "application/json",
        "created": "2022-09-16T14:10:46Z",
        "checksum": "cc187364f3bf071e5411cb6074d9c44a1b416a32b8eea581d113e486d1d586cf",
        "previousVersionId": "8f86d7aa-dc6a-4cee-ac37-97956542d587",
        "nextVersionId": null
      }
    ]
  }
}

Collections are identified by a Collection ID which is a unique identifier of the linked, parent DID. Within the DID Document Metadata of the Collection DIDDoc, the Linked Resource metadata describes Resources within this Collection:

Note that the Linked Resource output above does not show the actual data / schema attributes when displaying all Resources in this Collection. It only shows Resource metadata.

This logic prevents GetResourceCollection requests returning large quantities of data, which may be stored across multiple Resources within a Collection.

In order to fetch the actual data, it is necessary to query the specific Resource, rather than the entire Collection.

For more information about the particulars of requests and responses, please refer to our ADR on Resources on ledger.

Versioning and Archiving Resources

As shown in the examples above, there may be previous and next versions of the Resource ID.

Whenever a Resource is updated, a new UUID must be generated. The new Resource references the older version, so the UUID is effectively a version number.

Importantly, the collectionId, resourceName and the resourceType of the Resource must remain the same.

For example, a Resource with the name PassportSchema must always have the same name and resource type to be considered for previous/next version linking.

This could be used, for example, to find the version active at a particular point in time:

Query based dereferencing

Fetching resources using DID resolvers and DID URLs is hugely desirable. Up until this point, we have shown resources identified using path-based syntax.

However, query-based syntax should also be enabled to allow more granular and specific searches within a particular Collection.

To enable combined resolution/dereferencing behavior, cheqd are defining multiple query-based DID URL parameters to fetch resource or associated metadata. If a DID method specification supports these parameters, and if a DID URL using that method includes the parameter with a valid value, then when a resolver calls the associated VDR using that DID URL, the VDR returns the identified digital resource, not the DID document.

IMPORTANT: DID URL queries should be fully qualified so that they uniquely identify a single resource, or single resource version unless expressly specified.

RFC3986 URIs
RFC3986 URIs

Fetch custodian-mode client details.

get

This endpoint returns the custodian-mode client details for authenticated users.

Authorizations
Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
get
GET /account HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Accept: */*
{
  "customer": {
    "customerId": "text",
    "name": "text"
  },
  "paymentAccount": {
    "mainnet": "text",
    "testnet": "text"
  }
}
Telegram
Discord
Medium
LinkedIn
YouTube

Fetch an identity key pair.

get

This endpoint fetches an identity key pair's details for a given key ID. Only the user account associated with the custodian-mode client can fetch the key pair.

Authorizations
Path parameters
kidstringRequired

Key ID of the identity key pair to fetch.

Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
application/json
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
application/json
get
GET /key/read/{kid} HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Accept: */*
{
  "kid": "text",
  "type": "Ed25519",
  "publicKeyHex": "text"
}

Fetch DIDs associated with an account.

get

This endpoint returns the list of DIDs controlled by the account.

Authorizations
Responses
200
The request was successful.
application/json
Responsestring[]
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
get
GET /did/list HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Accept: */*
[
  "text"
]
Image being pulled from the cheqd ledger using the resource module

Setup AI Agent Trust Registry

Walkthrough for setting up Trust Registries for your AI Agents.

Users are able to build AI Agent Trust Registries using our cheqd Studio APIs. The following steps will enable organisations, governance authorities, auditors and AI Agents to establish permissions, rules and hierarchy between each other.

Step 1: Set up your cheqd Studio account

Make sure you have set up your account with cheqd Studio and are logged in, using our guide below:

Step 2: Create a Root DID

The first step for any trust registry is a Root DID, which acts as a trust anchor for the chain of trust below. This DID should be for the highest level of trust in your ecosystem, such as a governance authority, a managing company or an auditor.

For more basic trust registries, the company issuing the AI Agent credentials may also be the Root of Trust with the Root DID.

Step 3: Design Schemas for your Ecosystem

When you accredit an AI Agent or Organisation that builds AI Agents, you need to do so for a particular purpose. These purposes are defined in schemas, containing the fields that MUST or MAY be present in an accreditation or credential.

We have created some template schemas that we suggest you use within your trust registry!

3.1 Verifiable Attestation

This is a schema for a Verifiable Credential issued to your AI Agent from a Trusted Issuer. The Issuer attests to features of the AI Agent, hence we call it a Verifiable Attestation.

Verifiable Attestation Schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Verifiable Attestation",
  "description": "The schema defines a generic structure for any Verifiable Credentials according to the VCDM v1.1",
  "type": "object",
  "properties": {
    "@context": {
      "description": "Semantic context for the issued credential. First element MUST be https://www.w3.org/2018/credentials/v1",
      "type": "array",
      "items": {
        "type": "string",
        "format": "uri"
      },
      "contains": {
        "const": "https://www.w3.org/2018/credentials/v1"
      },
      "minItems": 1,
      "uniqueItems": true
    },
    "id": {
      "description": "Globally unique identifier for the issued credential",
      "type": "string",
      "format": "uri"
    },
    "type": {
      "description": "Full type chain, used to identify the credential base types",
      "type": "array",
      "items": {
        "type": "string"
      },
      "contains": {
        "type": "string",
        "const": "VerifiableAttestation"
      },
      "uniqueItems": true
    },
    "issuer": {
      "description": "Defines a property for expressing the issuer of a Verifiable Credential",
      "oneOf": [
        {
          "description": "DID of the credential issuer",
          "type": "string",
          "format": "uri"
        },
        {
          "type": "object",
          "required": ["id"],
          "properties": {
            "id": {
              "description": "DID of the credential issuer",
              "type": "string",
              "format": "uri"
            }
          }
        }
      ]
    },
    "issuanceDate": {
      "description": "Defines the date and time, when the issued credential becomes valid",
      "type": "string",
      "format": "date-time"
    },
    "issued": {
      "description": "Defines when the issued credential was issued",
      "type": "string",
      "format": "date-time"
    },
    "validFrom": {
      "description": "Defines the date and time, when the issued credential becomes valid",
      "type": "string",
      "format": "date-time"
    },
    "validUntil": {
      "description": "Defines the date and time, when the issued credential expires",
      "type": "string",
      "format": "date-time"
    },
    "expirationDate": {
      "description": "Defines the date and time, when the issued credential expires",
      "type": "string",
      "format": "date-time"
    },
    "credentialSubject": {
      "description": "Defines information about the subject that is defined by the type chain",
      "anyOf": [
        {
          "$ref": "#/$defs/credentialSubject"
        },
        {
          "type": "array",
          "items": {
            "$ref": "#/$defs/credentialSubject"
          }
        }
      ]
    },
    "credentialStatus": {
      "description": "Defines suspension and/or revocation details for the issued credential. Further redefined by the type extension",
      "anyOf": [
        {
          "$ref": "#/$defs/credentialStatus"
        },
        {
          "type": "array",
          "items": {
            "$ref": "#/$defs/credentialStatus"
          }
        }
      ]
    },
    "credentialSchema": {
      "description": "One or more schemas that validate the Verifiable Credential.",
      "anyOf": [
        {
          "$ref": "#/$defs/credentialSchema"
        },
        {
          "type": "array",
          "items": {
            "$ref": "#/$defs/credentialSchema"
          }
        }
      ]
    },
    "termsOfUse": {
      "description": "Contains the terms under which the issued credential was issued",
      "anyOf": [
        {
          "$ref": "#/$defs/termsOfUse"
        },
        {
          "type": "array",
          "items": {
            "$ref": "#/$defs/termsOfUse"
          }
        }
      ]
    },
    "evidence": {
      "description": "Contains the optional evidence used to issue this credential",
      "anyOf": [
        {
          "$ref": "#/$defs/evidence"
        },
        {
          "type": "array",
          "items": {
            "$ref": "#/$defs/evidence"
          }
        }
      ]
    }
  },
  "required": [
    "@context",
    "id",
    "type",
    "issuer",
    "credentialSubject"
  ],
  "$defs": {
    "credentialSubject": {
      "description": "Defines information about the subject that is defined by the type chain",
      "type": "object",
      "properties": {
        "id": {
          "description": "Defines the DID of the subject that is described by the issued credential",
          "type": "string",
          "format": "uri"
        }
      }
    },
    "credentialStatus": {
      "description": "Defines suspension and/or revocation details for the issued credential. Further redefined by the type extension",
      "type": "object",
      "properties": {
        "id": {
          "description": "Exact identity for the credential status",
          "type": "string",
          "format": "uri"
        },
        "type": {
          "description": "Defines the revocation type extension",
          "type": "string"
        }
      },
      "required": ["id", "type"]
    },
    "credentialSchema": {
      "description": "Contains information about the credential schema on which the issued credential is based",
      "type": "object",
      "properties": {
        "id": {
          "description": "References the credential schema stored on the Trusted Schemas Registry (TSR) on which the Verifiable Authorisation is based on",
          "type": "string",
          "format": "uri"
        },
        "type": {
          "description": "Defines credential schema type",
          "type": "string"
        }
      },
      "required": ["id", "type"]
    },
    "termsOfUse": {
      "description": "Contains the terms under which the issued credential was issued",
      "type": "object",
      "properties": {
        "id": {
          "description": "Contains a URL that points to where more information about this instance of terms of use can be found.",
          "type": "string"
        },
        "type": {
          "description": "Defines the type extension",
          "type": "string"
        }
      },
      "required": ["type"]
    },
    "evidence": {
      "type": "object",
      "properties": {
        "id": {
          "description": "If present, it SHOULD contain a URL that points to where more information about this instance of evidence can be found.",
          "type": "string"
        },
        "type": {
          "anyOf": [
            {
              "description": "Defines the evidence type extension",
              "type": "string"
            },
            {
              "description": "Defines the evidence type extension",
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          ]
        }
      },
      "required": ["type"]
    }
  }
}

This schema can be always retrieved from the cheqd ledger at:

3.2 Verifiable Accreditation

This is a schema for a Verifiable Credential between two DIDs, to accredit the DIDs for specific purposes. The accreditedFor section of the Accreditation can be modified with specific schemas for AI Agents.

Verifiable Accreditation Schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Verifiable Accreditation",
  "description": "Schema of a Verifiable Accreditation",
  "type": "object",
  "allOf": [
    {
      "$ref": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e?resourceName=VerifiableAttestation&resourceType=JSONSchemaValidator2020"
    },
    {
      "properties": {
        "credentialSubject": {
          "description": "Defines additional information about the subject that is described by the Verifiable Accreditation",
          "type": "object",
          "properties": {
            "id": {
              "description": "Defines a unique identifier of the Verifiable Accreditation",
              "type": "string",
              "format": "uri"
            },
            "accreditedFor": {
              "description": "Defines a list of claims that define/determine the authorisation of an Issuer to issue certain types of VCs",
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "schemaId": {
                    "description": "Schema, registered in Trusted  Schemas Registry, which the accredited organisation is allowed to issue, as per their accreditation",
                    "type": "string",
                    "format": "uri"
                  },
                  "types": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "limitJurisdiction": {
                    "anyOf": [
                      {
                        "description": "Defines the jurisdiction for which the accreditation is valid",
                        "type": "string",
                        "format": "uri"
                      },
                      {
                        "type": "array",
                        "description": "Defines the jurisdictions for which the accreditation is valid",
                        "items": {
                          "type": "string",
                          "format": "uri"
                        }
                      }
                    ]
                  }
                },
                "required": ["schemaId", "types"]
              }
            }
          },
          "required": ["id", "accreditedFor"]
        },
        "credentialStatus": {
          "description": "Defines revocation details for the issued credential. Further redefined by type extension",
          "type": "object",
          "properties": {
            "id": {
              "description": "Exact identity for the credential status",
              "type": "string",
              "format": "uri"
            },
            "type": {
              "description": "Defines the revocation status type",
              "type": "string",
              "const": "EbsiAccreditationEntry"
            }
          },
          "required": ["id", "type"]
        }
      },
      "required": [
        "credentialSubject",
        "termsOfUse"
      ]
    }
  ]
}

This schema can be always retrieved from the cheqd ledger at:

We suggest that you use the same schemas that we have already made for Verifiable Accreditations and Attestations, although this is not a requirement

3.3 Custom Schemas

Builders can create custom schemas for their AI Agents, or for the accreditations between different organisations in their ecosystems. This is achieved through editing the accreditedFor section of a Verifiable Attestation above.

For example, the following schema shows how the configuration of an AI Agent can be represented within a schema:

AI Agent Authorisation Schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "allOf": [
    {
      "$ref": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e?resourceName=VerifiableAttestation&resourceType=JSONSchemaValidator2020"
    },
    {
    "properties": {
      "credentialSubject": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "uri"
          },
          "aiAgentName": {
            "type": "string"
          },
          "aiAgentVersion": {
            "type": "string"
          },
          "model": {
            "type": "string"
          },
          "modelVersion": {
            "type": "string"
          },
          "contextWindow": {
            "type": "integer",
            "minimum": 0
          },
          "temperature": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          },
          "topK": {
            "type": "integer",
            "minimum": 0
          },
          "topP": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          },
          "maxTokens": {
            "type": "integer",
            "minimum": 0
          },
          "fineTuned": {
            "type": "boolean"
          },
          "fineTuningDetails": {
            "type": "string",
            "nullable": true
          },
          "safetyRating": {
            "type": "string"
          },
          "evaluationMetrics": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "certificationAuthority": {
            "type": "string"
          },
          "validUntil": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "id",
          "aiAgentName",
          "model"
        ]
      },
      "proof": {
        "description": "Contains information about the proof",
        "type": "object",
        "properties": {
          "type": {
            "description": "Defines the proof type",
            "type": "string"
          },
          "proofPurpose": {
            "description": "Defines the purpose of the proof",
            "type": "string"
          },
          "created": {
            "description": "Defines the date and time, when the proof has been created",
            "type": "string",
            "format": "date-time"
          },
          "verificationMethod": {
            "description": "Contains information about the verification method / proof mechanisms",
            "type": "string"
          },
          "jws": {
            "description": "Defines the proof value in JWS format",
            "type": "string"
          }
        },
        "required": [
          "type",
          "proofPurpose",
          "created",
          "verificationMethod",
          "jws"
        ]
      }
    },
    "required": ["credentialSubject", "proof"]
    }
  ]
}

Step 4: Publish your schemas to cheqd as DID-Linked Resources

With the Root DID you created in Step 2, you can create links to your schemas, storing them on-chain in a resolvable format.

You can follow the tutorial here to publish your schemas as DID-Linked Resources. Generally we use the resourceType of JSONSchemaValidator2020 for JSON schemas written to the ledger.

This will store the schemas securely on the cheqd Network, where they can be fetched using DID URLs.

Step 5: Issue a Root Authorisation for the Trust Chain

The Root Authorisation in trust registries on cheqd is called a rootAuthorisationForTrustChain. This authorisation contains informartion about the governance framework the AI Agents will operate in, and signifies to trust registry resolvers that they have reached the intended Root.

Authorisations are issued between two DIDs (which may be the same). As such, if you are managing the entire ecosystem, you may need to create multiple DIDs for different roles in the ecosystem. Otherwise, you need to be aware of the DIDs of the organisations you are seeking to authorise.

Generally, the Root Authorisation also contains the schemas and types of credentials that will be issued below in the trust chain.

Note that it is common for the rootAuthorisationForTrustChain to be self-issued, from the same issuer DID to subject DID, authorising it to carry out other operations.

5.1 Verifiable Authorisation for Trust Chain

Using POST /trust-registry/accreditation/issue

Use the following request format:

Request format for Verifiable Authorisation for Trust Chain
{
  "issuerDid": "did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e", // This is the Root DID for the Trust Chain
  "subjectDid": "did:cheqd:testnet:6af412d7-2f04-4e12-a424-e6719db487ad", // This is the DID Authorised at a Root Level and may often be the same DID as the issuer
  "schemas": [ // enter the schemas you have created for your trust registry
    {
      "types": "AIAgentAuthorisation",
      "url": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:c6630f1e-9248-4af6-b7ac-5bcaf646f213?resourceName=AIAgentAuthorisation&resourceType=JSONSchemaValidator2020"
    },
    {
      "uri": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e?resourceName=VerifiableAccreditation&resourceType=JSONSchemaValidator2020",
      "types": [
          "VerifiableCredential",
          "VerifiableAccreditation",
          "VerifiableAccreditationToAccredit"
        ]
      },
      {
       "uri": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e?resourceName=VerifiableAttestation&resourceType=JSONSchemaValidator2020",
       "types": [
          "VerifiableCredential",
          "VerifiableAttestation",
          "VerifiableAccreditationToAttest"
        ]
      }
  ],
  "format": "jwt",
  "accreditationName": "authoriseAccreditationTest",
  "trustFramework": "https://learn.cheqd.io/governance/start",
  "trustFrameworkId": "cheqd Governance Framework"
}
Response format for Verifiable Authorisation for Trust Chain
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1"
  ],
  "type": [
    "VerifiableCredential",
    "VerifiableAuthorisationForTrustChain"
  ],
  "issuer": {
    "id": "did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e"
  },
  "credentialSubject": {
    "accreditedFor": [
      {
        "schemaId": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d?resourceName=MuseumPassCredentialSchema&resourceType=JsonSchemaValidator2018",
        "type": "MuseumPassCredential"
      }
    ],
    "id": "did:cheqd:testnet:6af412d7-2f04-4e12-a424-e6719db487ad"
  },
  "issuanceDate": "2024-10-15T04:06:47.000Z",
  "termsOfUse": {
    "type": "VerifiableAuthorisationForTrustChain",
    "trustFramework": "https://learn.cheqd.io/governance/start",
    "trustFrameworkId": "cheqd Governance Framework"
  },
  "proof": {
    "type": "JwtProof2020",
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiVmVyaWZpYWJsZUF1dGhvcmlzYXRpb25Gb3JUcnVzdENoYWluIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImFjY3JlZGl0ZWRGb3IiOlt7InNjaGVtYUlkIjoiaHR0cHM6Ly9yZXNvbHZlci5jaGVxZC5uZXQvMS4wL2lkZW50aWZpZXJzL2RpZDpjaGVxZDp0ZXN0bmV0OjBhNWI5NGQwLWE0MTctNDhlZC1hNmY1LTRhYmM5ZTk1ODg4ZD9yZXNvdXJjZU5hbWU9TXVzZXVtUGFzc0NyZWRlbnRpYWxTY2hlbWEmcmVzb3VyY2VUeXBlPUpzb25TY2hlbWFWYWxpZGF0b3IyMDE4IiwidHlwZSI6Ik11c2V1bVBhc3NDcmVkZW50aWFsIn1dfSwidGVybXNPZlVzZSI6eyJ0eXBlIjoiVmVyaWZpYWJsZUF1dGhvcmlzYXRpb25Gb3JUcnVzdENoYWluIiwidHJ1c3RGcmFtZXdvcmsiOiJodHRwczovL2xlYXJuLmNoZXFkLmlvL2dvdmVybmFuY2Uvc3RhcnQiLCJ0cnVzdEZyYW1ld29ya0lkIjoiY2hlcWQgR292ZXJuYW5jZSBGcmFtZXdvcmsifX0sInN1YiI6ImRpZDpjaGVxZDp0ZXN0bmV0OjZhZjQxMmQ3LTJmMDQtNGUxMi1hNDI0LWU2NzE5ZGI0ODdhZCIsIm5iZiI6MTcyODk2NTIwNywiaXNzIjoiZGlkOmNoZXFkOnRlc3RuZXQ6YjAwM2RmNmYtZWM4ZS00OGRkLTlhMmItNzAxMWM1Y2YwYTVlIn0.6dKE9-y2Id852onu1_WnD6aJnDtxgFZcjCbCfQ8MT1ACsHY8ox5jiKP4QUJNmhwesLidC99Qa0uyCrUhvHc2Bg"
  }
}
Request Parameter
Required
Description

"issuerDid"

Yes

The DID of the Issuer of the Accreditation

"subjectDid"

Yes

The DID of the Recipient of the Accreditation

"types"

Yes

The "types" of credential you are authorising for your trust chain

"url"

Yes

A schema or multiple schemas that the recipient is accredited to issue

"format"

Optional

Defaults to "jwt" but may also be "json-ld"

"accreditationName"

Yes

Name of the accreditation which is used for chronological versioning of the accreditation.

"trustFramework"

Yes

A URL that points to an Ecosystem Governance Framework

"trustFrameworkId"

Yes

The name of the Ecosystem Governance Framework

"credentialStatus"

Optional

An object detailing the status information of the Accreditation

You can use the API below to make this transaction, using the parameter 'authorise'.

Step 6: Issue your next Accreditation

Depending on how many layers deep you want your trust registry, you now need to issue an accreditationToAccredit or an accreditationToAttest. In essence, you need to decide whether you want to accredit a subordinate entity to accredit other organisations (creating a deeper trust chain), or accredit a subordinate entity to issue Credentials to your AI Agent.

6.1 Verifiable Accreditation to Accredit

Request format for Verifiable Accreditation to Accredit
{
  "issuerDid": "did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e",
  "subjectDid": "did:cheqd:testnet:6af412d7-2f04-4e12-a424-e6719db487ad",
  "schemas": [
    {
      "types": "AIAgentAuthorisation",
      "url": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:c6630f1e-9248-4af6-b7ac-5bcaf646f213?resourceName=AIAgentAuthorisation&resourceType=JSONSchemaValidator2020"
    },
    {
      "uri": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e?resourceName=VerifiableAccreditation&resourceType=JSONSchemaValidator2020",
      "types": [
          "VerifiableCredential",
          "VerifiableAccreditation",
          "VerifiableAccreditationToAccredit"
        ]
      },
      {
       "uri": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e?resourceName=VerifiableAttestation&resourceType=JSONSchemaValidator2020",
       "types": [
          "VerifiableCredential",
          "VerifiableAttestation",
          "VerifiableAccreditationToAttest"
        ]
      }
  ],
  "format": "jwt",
  "accreditationName": "accreditationToAttestTest",
  "parentAccreditation": "did:cheqd:testnet:15b74787-6e48-4fd5-8020-eab24e990578?resourceName=accreditAccreditation&resourceType=VerifiableAccreditationToAccredit",
  "rootAuthorization": "did:cheqd:testnet:5RpEg66jhhbmASWPXJRWrA?resourceName=authorizeAccreditation&resourceType=VerifiableAuthorisationForTrustChain",
}
Response format for Verifiable Accreditation to Accredit
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1"
  ],
  "type": [
    "VerifiableCredential",
    "VerifiableAccreditationToAccredit"
  ],
  "issuer": {
    "id": "did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e"
  },
  "credentialSubject": {
    "accreditedFor": [
      {
        "schemaId": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d?resourceName=MuseumPassCredentialSchema&resourceType=JsonSchemaValidator2018",
        "type": "AIAgentAuthorisation"
      }
    ],
    "id": "did:cheqd:testnet:6af412d7-2f04-4e12-a424-e6719db487ad"
  },
  "issuanceDate": "2024-10-15T04:06:47.000Z",
  "termsOfUse": {
    "type": "AccreditationPolicy",
    "parentAccreditation": "did:cheqd:testnet:15b74787-6e48-4fd5-8020-eab24e990578?resourceName=accreditAccreditation&resourceType=VerifiableAccreditationToAccredit",
    "rootAuthorization": "did:cheqd:testnet:5RpEg66jhhbmASWPXJRWrA?resourceName=authorizeAccreditation&resourceType=VerifiableAuthorisationForTrustChain",
  },
  "proof": {
    "type": "JwtProof2020",
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiVmVyaWZpYWJsZUF1dGhvcmlzYXRpb25Gb3JUcnVzdENoYWluIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImFjY3JlZGl0ZWRGb3IiOlt7InNjaGVtYUlkIjoiaHR0cHM6Ly9yZXNvbHZlci5jaGVxZC5uZXQvMS4wL2lkZW50aWZpZXJzL2RpZDpjaGVxZDp0ZXN0bmV0OjBhNWI5NGQwLWE0MTctNDhlZC1hNmY1LTRhYmM5ZTk1ODg4ZD9yZXNvdXJjZU5hbWU9TXVzZXVtUGFzc0NyZWRlbnRpYWxTY2hlbWEmcmVzb3VyY2VUeXBlPUpzb25TY2hlbWFWYWxpZGF0b3IyMDE4IiwidHlwZSI6Ik11c2V1bVBhc3NDcmVkZW50aWFsIn1dfSwidGVybXNPZlVzZSI6eyJ0eXBlIjoiVmVyaWZpYWJsZUF1dGhvcmlzYXRpb25Gb3JUcnVzdENoYWluIiwidHJ1c3RGcmFtZXdvcmsiOiJodHRwczovL2xlYXJuLmNoZXFkLmlvL2dvdmVybmFuY2Uvc3RhcnQiLCJ0cnVzdEZyYW1ld29ya0lkIjoiY2hlcWQgR292ZXJuYW5jZSBGcmFtZXdvcmsifX0sInN1YiI6ImRpZDpjaGVxZDp0ZXN0bmV0OjZhZjQxMmQ3LTJmMDQtNGUxMi1hNDI0LWU2NzE5ZGI0ODdhZCIsIm5iZiI6MTcyODk2NTIwNywiaXNzIjoiZGlkOmNoZXFkOnRlc3RuZXQ6YjAwM2RmNmYtZWM4ZS00OGRkLTlhMmItNzAxMWM1Y2YwYTVlIn0.6dKE9-y2Id852onu1_WnD6aJnDtxgFZcjCbCfQ8MT1ACsHY8ox5jiKP4QUJNmhwesLidC99Qa0uyCrUhvHc2Bg"
  }
}
Request Parameter
Required
Description

"issuerDid"

Yes

The DID of the Issuer of the Accreditation

"subjectDid"

Yes

The DID of the Recipient of the Accreditation

"url"

Yes

A schema or multiple schemas that the recipient is accredited to issue

"types"

Yes

The types of credential the subject is accredited to issue

"format"

Optional

Defaults to "jwt" but may also be "json-ld"

"accreditationName"

Yes

Name of the accreditation which is used for chronological versioning of the accreditation.

"parentAccreditation"

Yes

A URL or DID URL of Accreditation of the Issuer demonstrating capacity to issue this Accreditation.

"rootAuthorisation"

Yes

A URL or DID URL of the root authorization governing the ecosystem

"credentialStatus"

Optional

An object detailing the status information of the Accreditation

For a trusted ecosystem, these attestations are required to trace the legitimacy of a credential issuer to a root-of-trust.

6.2 Verifiable Accreditation to Attest

If you just want to accredit the subordinate DID to issue credentials to your AI Agent, use a Verifiable Accreditation to Attest.

Request format for Verifiable Accreditation to Attest
{
  "issuerDid": "did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e",
  "subjectDid": "did:cheqd:testnet:6af412d7-2f04-4e12-a424-e6719db487ad",
  "schemas": [
    {
      "types": "AIAgentAuthorisation",
      "url": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:c6630f1e-9248-4af6-b7ac-5bcaf646f213?resourceName=AIAgentAuthorisation&resourceType=JSONSchemaValidator2020"
    },
    {
      "uri": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e?resourceName=VerifiableAccreditation&resourceType=JSONSchemaValidator2020",
      "types": [
          "VerifiableCredential",
          "VerifiableAccreditation",
          "VerifiableAccreditationToAccredit"
        ]
      },
      {
       "uri": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e?resourceName=VerifiableAttestation&resourceType=JSONSchemaValidator2020",
       "types": [
          "VerifiableCredential",
          "VerifiableAttestation",
          "VerifiableAccreditationToAttest"
        ]
      }
  ],
  "format": "jwt",
  "accreditationName": "accreditationToAttestTest",
  "parentAccreditation": "did:cheqd:testnet:15b74787-6e48-4fd5-8020-eab24e990578?resourceName=accreditAccreditation&resourceType=VerifiableAccreditationToAccredit",
  "rootAuthorization": "did:cheqd:testnet:5RpEg66jhhbmASWPXJRWrA?resourceName=authorizeAccreditation&resourceType=VerifiableAuthorisationForTrustChain",
}
Response format for Verifiable Accreditation to Attest
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1"
  ],
  "type": [
    "VerifiableCredential",
    "VerifiableAccreditationToAccredit"
  ],
  "issuer": {
    "id": "did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e"
  },
  "credentialSubject": {
    "accreditedFor": [
      {
        "schemaId": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d?resourceName=MuseumPassCredentialSchema&resourceType=JsonSchemaValidator2018",
        "type": "MuseumPassCredential"
      }
    ],
    "id": "did:cheqd:testnet:6af412d7-2f04-4e12-a424-e6719db487ad"
  },
  "issuanceDate": "2024-10-15T04:06:47.000Z",
  "termsOfUse": {
    "type": "VerifiableAuthorisationForTrustChain",
    "parentAccreditation": "did:cheqd:testnet:15b74787-6e48-4fd5-8020-eab24e990578?resourceName=accreditAccreditation&resourceType=VerifiableAccreditationToAccredit",
    "rootAuthorization": "did:cheqd:testnet:5RpEg66jhhbmASWPXJRWrA?resourceName=authorizeAccreditation&resourceType=VerifiableAuthorisationForTrustChain",
  },
  "proof": {
    "type": "JwtProof2020",
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiVmVyaWZpYWJsZUF1dGhvcmlzYXRpb25Gb3JUcnVzdENoYWluIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImFjY3JlZGl0ZWRGb3IiOlt7InNjaGVtYUlkIjoiaHR0cHM6Ly9yZXNvbHZlci5jaGVxZC5uZXQvMS4wL2lkZW50aWZpZXJzL2RpZDpjaGVxZDp0ZXN0bmV0OjBhNWI5NGQwLWE0MTctNDhlZC1hNmY1LTRhYmM5ZTk1ODg4ZD9yZXNvdXJjZU5hbWU9TXVzZXVtUGFzc0NyZWRlbnRpYWxTY2hlbWEmcmVzb3VyY2VUeXBlPUpzb25TY2hlbWFWYWxpZGF0b3IyMDE4IiwidHlwZSI6Ik11c2V1bVBhc3NDcmVkZW50aWFsIn1dfSwidGVybXNPZlVzZSI6eyJ0eXBlIjoiVmVyaWZpYWJsZUF1dGhvcmlzYXRpb25Gb3JUcnVzdENoYWluIiwidHJ1c3RGcmFtZXdvcmsiOiJodHRwczovL2xlYXJuLmNoZXFkLmlvL2dvdmVybmFuY2Uvc3RhcnQiLCJ0cnVzdEZyYW1ld29ya0lkIjoiY2hlcWQgR292ZXJuYW5jZSBGcmFtZXdvcmsifX0sInN1YiI6ImRpZDpjaGVxZDp0ZXN0bmV0OjZhZjQxMmQ3LTJmMDQtNGUxMi1hNDI0LWU2NzE5ZGI0ODdhZCIsIm5iZiI6MTcyODk2NTIwNywiaXNzIjoiZGlkOmNoZXFkOnRlc3RuZXQ6YjAwM2RmNmYtZWM4ZS00OGRkLTlhMmItNzAxMWM1Y2YwYTVlIn0.6dKE9-y2Id852onu1_WnD6aJnDtxgFZcjCbCfQ8MT1ACsHY8ox5jiKP4QUJNmhwesLidC99Qa0uyCrUhvHc2Bg"
  }
}
Request Parameter
Required
Description

"issuerDid"

Yes

The DID of the Issuer of the Accreditation

"subjectDid"

Yes

The DID of the Recipient of the Accreditation

"url"

Yes

A schema or multiple schemas that the recipient is accredited to issue

"types"

Yes

The types of credential the subject is accredited to issue

"format"

Optional

Defaults to "jwt" but may also be "json-ld"

"accreditationName"

Yes

Name of the accreditation which is used for chronological versioning of the accreditation.

"parentAccreditation"

Yes

A URL or DID URL of Accreditation of the Issuer demonstrating capacity to issue this Accreditation.

"rootAuthorisation"

Yes

A URL or DID URL of the root authorization governing the ecosystem

"credentialStatus"

Optional

An object detailing the status information of the Accreditation

For a trusted ecosystem, these attestations are required to trace the legitimacy of a credential issuer to a root-of-trust.

Note that there MUST be an accreditationToAttest for credentials to be issued that reference an accreditation in the next tutorial.

Core Trust Registry Setup Complete!

Great! Now you have set up the core functionality for your trust registry. Next you will want to issue a Verifiable Attestation from the "trusted issuer" in the Trust Registry to an AI Agent:

Set up your account

Set up your account with cheqd Studio and log in to start using the APIs.

Create an Issuer DID

Create a W3C conformant DID on cheqd using the did:cheqd DID Method.

Create DID-Linked Resource

Link resources such as schemas to your DID, publishing as a DID-Linked Resource.

Issue Verifiable Credentials to AI Agent

Issue a Verifiable Credential to your AI Agent referencing the parentAccreditation and rootAuthorisation for the trust chain.

Verify a verifiable accreditation for a DID.

post

Generate and publish a Verifiable Accreditation for a subject DID as a DID Linked resource.

Authorizations
Query parameters
verifyStatusbooleanOptional

If set to true the verification will also check the status of the accreditation. Requires the VC to have a credentialStatus property.

Default: false
allowDeactivatedDidbooleanOptional

If set to true allow to verify accreditation which based on deactivated DID.

Default: false
Body
subjectDidstringRequired

DID of the Verifiable Accreditation holder/subject. This needs to be a did:key DID.

Example: did:cheqd:testnet:5efa5126-c070-420f-a9c2-d22ae6eefb92
didUrlstringOptional

DID URL of the Verifiable Accreditation to be verified as a VC-JWT string or a JSON object.

Example: did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e?resourceName=cheqd-issuer-logo&resourceType=CredentialArtwork
didstringOptional

DID of the Verifiable Accreditation holder/subject

Example: did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e
resourceIdstringOptional

Unique resource identifier of the Verifiable Accreditation

Example: 398cee0a-efac-4643-9f4c-74c48c72a14b
resourceNamestringOptional

Resource name of the Verifiable Accreditation

Example: cheqd-issuer-logo
resourceTypestringOptional

Resource type of the Verifiable Accreditation

Example: CredentialArtwork
Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /trust-registry/accreditation/verify HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 498

"subjectDid='did:cheqd:testnet:5efa5126-c070-420f-a9c2-d22ae6eefb92'&didUrl='did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e?resourceName=cheqd-issuer-logo&resourceType=CredentialArtwork'&did='did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e'&resourceId='398cee0a-efac-4643-9f4c-74c48c72a14b'&resourceName='cheqd-issuer-logo'&resourceType='CredentialArtwork'&schemas=[{'types':'text','url':'text'}]&policies={'issuanceDate':true,'expirationDate':true,'audience':false}"
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://schema.org",
    "https://veramo.io/contexts/profile/v1"
  ],
  "credentialSubject": {
    "gender": "male",
    "id": "did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK",
    "name": "Bob"
  },
  "credentialStatus": {
    "id": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e?resourceName=cheqd-suspension-1&resourceType=StatusList2021Suspension#20",
    "statusIndex": 20,
    "statusPurpose": "suspension",
    "type": "StatusList2021Entry"
  },
  "issuanceDate": "2023-06-08T13:49:28.000Z",
  "issuer": {
    "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0"
  },
  "proof": {
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJkaWQ6Y2hlcWQ6dGVzdG5ldDo3YmY4MWEyMC02MzNjLTRjYzctYmM0YS01YTQ1ODAxMDA1ZTAiLCJuYmYiOjE2ODYyMzIxNjgsInN1YiI6ImRpZDprZXk6ejZNa2hhWGdCWkR2b3REa0w1MjU3ZmFpenRpR2lDMlF0S0xHcGJubkVHdGEyZG9LIiwidmMiOnsiQGNvbnRleHQiOlsiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvdjEiLCJodHRwczovL3NjaGVtYS5vcmciLCJodHRwczovL3ZlcmFtby5pby9jb250ZXh0cy9wcm9maWxlL3YxIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImdlbmRlciI6Im1hbGUiLCJuYW1lIjoiQm9iIn0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJQZXJzb24iXX19.wMfdR6RtyAZA4eoWya5Aw97wwER2Cm5Guk780Xw8H9fA3sfudIJeLRLboqixpTchqSbYeA7KbuCTAnLgXTD_Cg",
    "type": "JwtProof2020"
  },
  "type": [
    "VerifiableCredential",
    "Person"
  ]
}

Update an existing unencrypted StatusList2021 credential status list.

post
Authorizations
Query parameters
statusActionstring · enumRequired

The update action to be performed on the unencrypted status list, can be revoke, suspend or reinstate

Possible values:
Body
all ofOptionalExample: {"did":"did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e","statusListName":"cheqd-employee-credentials","indices":[10,3199,12109,130999]}
Responses
200
The request was successful.
application/json
Responseall of
and
one ofOptional
or
or
and
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential-status/update/unencrypted?statusAction=revoke HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 143

"did='did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e'&statusListName='cheqd-employee-credentials'&indices=[10,3199,12109,130999]"
{
  "updated": true,
  "revoked": true,
  "resource": {
    "StatusList2021": {
      "encodedList": "H4sIAAAAAAAAA-3BAQ0AAADCoPdPbQ8HFAAAAAAAAAAAAAAAAAAAAADwaDhDr_xcRAAA",
      "type": "StatusList2021Revocation",
      "validFrom": "2023-06-26T11:45:19.349Z"
    },
    "metadata": {
      "type": "StatusList2021Revocation",
      "encoding": "base64url",
      "encrypted": false
    }
  },
  "resourceMetadata": {
    "resourceURI": "did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e/resources/5945233a-a4b5-422b-b893-eaed5cedd2dc",
    "resourceCollectionId": "7c2b990c-3d05-4ebf-91af-f4f4d0091d2e",
    "resourceId": "5945233a-a4b5-422b-b893-eaed5cedd2dc",
    "resourceName": "cheqd-employee-credentials",
    "resourceType": "StatusList2021Revocation",
    "mediaType": "application/json",
    "resourceVersion": "1.0.0",
    "created": "2023-06-26T11:45:20Z",
    "checksum": "909e22e371a41afbb96c330a97752cf7c8856088f1f937f87decbef06cbe9ca2",
    "previousVersionId": null,
    "nextVersionId": null
  }
}

Get a DID-Linked Resource.

get

This endpoint returns the DID-Linked Resource for a given DID identifier and resource identifier.

Authorizations
Path parameters
didstringRequired

DID identifier

Example: did:cheqd:mainnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0
Query parameters
resourceIdstring · uuidOptional

Fetch a DID-Linked Resource by Resource ID unique identifier. Since this is a unique identifier, other Resource query parameters are not required. See DID-Linked Resources for more details.

Example: 3ccde6ba-6ba5-56f2-9f4f-8825561a9860
resourceNamestringOptional

Filter a DID-Linked Resource query by Resource Name. See DID-Linked Resources for more details.

Example: cheqd-issuer-logo
resourceTypestringOptional

Filter a DID-Linked Resource query by Resource Type. See DID-Linked Resources for more details.

Example: CredentialArtwork
resourceVersionstringOptional

Filter a DID-Linked Resource query by Resource Version, which is an optional free-text field used by issuers (e.g., "v1", "Final Version", "1st January 1970" etc). See DID-Linked Resources for more details.

Example: v1
resourceVersionTimestring · date-timeOptional

Filter a DID-Linked Resource query which returns the closest version of the Resource at or before specified time. See DID-Linked Resources for more details.

Example: 1970-01-01T00:00:00Z
checksumstringOptional

Request integrity check against a given DID-Linked Resource by providing a SHA-256 checksum hash. See DID-Linked Resources for more details.

Example: dc64474d062ed750a66bad58cb609928de55ed0d81defd231a4a4bf97358e9ed
resourceMetadatabooleanOptional

Return only metadata of DID-Linked Resource instead of actual DID-Linked Resource. Mutually exclusive with some of the other parameters.

Responses
200
The request was successful.
any
Responseobject
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
get
GET /resource/search/{did} HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Accept: */*
{}

Update an existing encrypted StatusList2021 credential status list.

post
Authorizations
Query parameters
statusActionstring · enumRequired

The update action to be performed on the encrypted status list, can be revoke, suspend or reinstate

Possible values:
Body
all ofOptional
Responses
200
The request was successful.
application/json
Responseall of
and
one ofOptional
or
or
and
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential-status/update/encrypted?statusAction=revoke HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 227

"did='https://example.com'&statusListName='text'&indices=[1]&statusListVersion='text'&symmetricKey='text'&feePaymentAddress='cheqd1qs0nhyk868c246defezhz5eymlt0dmajna2csg'&feePaymentAmount=20&feePaymentWindow=10"
{
  "updated": true,
  "revoked": true,
  "resource": {
    "StatusList2021": {
      "encodedList": "496fdfbeb745b4db03fcdb40566f9c4c4a1c0f184b31255e641b6e7bdfb9b6946c12be87ca3763be0393c00b67ac1e8737c106b32f46ef59c765754415b5e8cc7c65fccaa3374620430ea476301a5e0dd63340e7a27a68bc627518471f22e4a2",
      "type": "StatusList2021Revocation",
      "validFrom": "2023-06-26T11:45:19.349Z"
    },
    "metadata": {
      "type": "StatusList2021Revocation",
      "encoding": "base64url",
      "encrypted": true,
      "encryptedSymmetricKey": "b11182dc524b8181f9a6aef4c4ad0a1c14e40033b9112dffd8d1bcf6cc3b85abc07ded2205ee94068a99f4202502cb0855f322583fa6ce1534d3a05bf36891766ea2c5f90a982b3040680762977d404d758a2370224a239c8279aa7d21e980931c42055b17ca4c7dbffa4782480a8b6279cf989b2f166d5fdb4b2c1b5a63927200000000000000203018dcaba26df45a415bb599218b27ca853a70289d7a3ed3ed0e3730452e8f8d9af91b6e71312565d2c069341f6660ab",
      "paymentConditions": [
        {
          "feePaymentAddress": "cheqd1qs0nhyk868c246defezhz5eymlt0dmajna2csg",
          "feePaymentAmount": "20000000000ncheq",
          "intervalInSeconds": 600,
          "type": "timelockPayment"
        }
      ]
    },
    "resourceMetadata": {
      "resourceURI": "did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e/resources/5945233a-a4b5-422b-b893-eaed5cedd2dc",
      "resourceCollectionId": "7c2b990c-3d05-4ebf-91af-f4f4d0091d2e",
      "resourceId": "5945233a-a4b5-422b-b893-eaed5cedd2dc",
      "resourceName": "cheqd-revocation-encrypted-1",
      "resourceType": "StatusList2021Revocation",
      "mediaType": "application/json",
      "resourceVersion": "2023-06-26T11:45:19.349Z",
      "created": "2023-06-26T11:45:20Z",
      "checksum": "909e22e371a41afbb96c330a97752cf7c8856088f1f937f87decbef06cbe9ca2",
      "previousVersionId": null,
      "nextVersionId": null
    },
    "symmetricKey": "dfe204ee95ae74ea5d74b94c3d8ff782273905b07fbc9f8c3d961c3b43849f18"
  }
}

Verify a Verifiable Presentation generated from credential(s).

post

This endpoint verifies the Verifiable Presentation generated from credential(s). As input, it can take the Verifiable Presentation JWT as a string or the entire Verifiable Presentation itself.

Authorizations
Query parameters
verifyStatusbooleanOptional

If set to true the verification will also check the status of the presentation. Requires the VP to have a credentialStatus property.

Default: false
fetchRemoteContextsbooleanOptional

When dealing with JSON-LD you also MUST provide the proper contexts. * Set this to true ONLY if you want the @context URLs to be fetched in case they are a custom context.

Default: false
allowDeactivatedDidbooleanOptional

If set to true allow to verify credential which based on deactivated DID.

Default: false
Body
presentationobjectRequired

Verifiable Presentation to be verified as a VP-JWT string or a JSON object.

verifierDidstringOptional

Provide an optional verifier DID (also known as 'domain' parameter), if the verifier DID in the presentation is not managed in the wallet.

makeFeePaymentbooleanOptional

Automatically make fee payment (if required) based on payment conditions to unlock encrypted StatusList2021 DID-Linked Resource.

Default: false
Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /presentation/verify HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 135

"presentation={}&verifierDid='text'&makeFeePayment=false&policies={'issuanceDate':true,'expirationDate':true,'audience':false}"
{
  "verified": true,
  "issuer": "text",
  "signer": {},
  "jwt": "text",
  "verifiableCredential": {}
}

Resolve a DID Document.

get

Resolve a DID Document by DID identifier. Also supports DID Resolution Queries as defined in the W3C DID Resolution specification.

Authorizations
Path parameters
didstringRequired

DID identifier to resolve.

Example: did:cheqd:mainnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0
Query parameters
metadatabooleanOptional

Return only metadata of DID Document instead of actual DID Document.

versionIdstring · uuidOptional

Unique UUID version identifier of DID Document. Allows for fetching a specific version of the DID Document. See cheqd DID Method Specification for more details.

Example: 3ccde6ba-6ba5-56f2-9f4f-8825561a9860
versionTimestring · date-timeOptional

Returns the closest version of the DID Document at or before specified time. See DID Resolution handling for did:cheqd for more details.

Example: 1970-01-01T00:00:00Z
transformKeysstring · enumOptional

This directive transforms the Verification Method key format from the version in the DID Document to the specified format chosen below.

Possible values:
servicestringOptional

Query DID Document for a specific Service Endpoint by Service ID (e.g., service-1 in did:cheqd:mainnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#service-1). This will typically redirect to the Service Endpoint based on DID Resolution specification algorithm.

Example: service-1
relativeRefstringOptional

Relative reference is a query fragment appended to the Service Endpoint URL. Must be used along with the service query property above. See DID Resolution specification algorithm for more details.

Example: /path/to/file
Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
get
GET /did/search/{did} HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Accept: */*
{
  "@context": "https://w3id.org/did-resolution/v1",
  "didDidResolutionMetadata": {
    "contentType": "application/did+ld+json",
    "retrieved": "2021-09-01T12:00:00Z",
    "did": {
      "didString": "did:cheqd:testnet:55dbc8bf-fba3-4117-855c-1e0dc1d3bb47",
      "method": "cheqd",
      "methodSpecificId": "55dbc8bf-fba3-4117-855c-1e0dc1d3bb47"
    }
  },
  "didDocument": {
    "@context": [
      "https://www.w3.org/ns/did/v1"
    ],
    "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0",
    "controller": [
      "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0"
    ],
    "verificationMethod": [
      {
        "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#key-1",
        "type": "Ed25519VerificationKey2018",
        "controller": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0",
        "publicKeyBase58": "z6MkkVbyHJLLjdjU5B62DaJ4mkdMdUkttf9UqySSkA9bVTeZ"
      }
    ],
    "authentication": [
      "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#key-1"
    ],
    "service": [
      {
        "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#service-1",
        "type": "LinkedDomains",
        "serviceEndpoint": [
          "https://example.com"
        ]
      }
    ]
  },
  "didDocumentMetadata": {
    "created": "2021-09-01T12:00:00Z",
    "deactivated": false,
    "updated": "2021-09-10T12:00:00Z",
    "versionId": "3ccde6ba-6ba5-56f2-9f4f-8825561a9860",
    "linkedResourceMetadata": [
      {
        "resourceURI": "did:cheqd:testnet:55dbc8bf-fba3-4117-855c-1e0dc1d3bb47/resources/398cee0a-efac-4643-9f4c-74c48c72a14b",
        "resourceCollectionId": "55dbc8bf-fba3-4117-855c-1e0dc1d3bb47",
        "resourceId": "398cee0a-efac-4643-9f4c-74c48c72a14b",
        "resourceName": "cheqd-issuer-logo",
        "resourceType": "CredentialArtwork",
        "mediaType": "image/png",
        "resourceVersion": "1.0",
        "checksum": "a95380f460e63ad939541a57aecbfd795fcd37c6d78ee86c885340e33a91b559",
        "created": "2021-09-01T12:00:00Z",
        "nextVersionId": "d4829ac7-4566-478c-a408-b44767eddadc",
        "previousVersionId": "ad7a8442-3531-46eb-a024-53953ec6e4ff"
      }
    ]
  }
}

Deactivate a DID Document.

post

This endpoint deactivates a DID Document by taking the DID identifier as input. Must be called and signed by the DID owner.

Authorizations
Path parameters
didstringRequired

DID identifier to deactivate.

Body
publicKeyHexsstring[]Optional

List of key references (publicKeys) which will be used for signing the message. The should be in hexadecimal format and placed in the wallet of current user.

Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /did/deactivate/{did} HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 26

"publicKeyHexs=['text']"
{
  "@context": "https://w3id.org/did-resolution/v1",
  "didDidResolutionMetadata": {
    "contentType": "application/did+ld+json",
    "retrieved": "2021-09-01T12:00:00Z",
    "did": {
      "didString": "did:cheqd:testnet:55dbc8bf-fba3-4117-855c-1e0dc1d3bb47",
      "method": "cheqd",
      "methodSpecificId": "55dbc8bf-fba3-4117-855c-1e0dc1d3bb47"
    }
  },
  "didDocument": {
    "@context": [
      "https://www.w3.org/ns/did/v1"
    ],
    "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0",
    "controller": [
      "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0"
    ],
    "verificationMethod": [
      {
        "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#key-1",
        "type": "Ed25519VerificationKey2018",
        "controller": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0",
        "publicKeyBase58": "z6MkkVbyHJLLjdjU5B62DaJ4mkdMdUkttf9UqySSkA9bVTeZ"
      }
    ],
    "authentication": [
      "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#key-1"
    ],
    "service": [
      {
        "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#service-1",
        "type": "LinkedDomains",
        "serviceEndpoint": [
          "https://example.com"
        ]
      }
    ]
  },
  "didDocumentMetadata": {
    "created": "2021-09-01T12:00:00Z",
    "deactivated": true,
    "updated": "2021-09-10T12:00:00Z",
    "versionId": "3ccde6ba-6ba5-56f2-9f4f-8825561a9860",
    "linkedResourceMetadata": [
      {
        "resourceURI": "did:cheqd:testnet:55dbc8bf-fba3-4117-855c-1e0dc1d3bb47/resources/398cee0a-efac-4643-9f4c-74c48c72a14b",
        "resourceCollectionId": "55dbc8bf-fba3-4117-855c-1e0dc1d3bb47",
        "resourceId": "398cee0a-efac-4643-9f4c-74c48c72a14b",
        "resourceName": "cheqd-issuer-logo",
        "resourceType": "CredentialArtwork",
        "mediaType": "image/png",
        "resourceVersion": "1.0",
        "checksum": "a95380f460e63ad939541a57aecbfd795fcd37c6d78ee86c885340e33a91b559",
        "created": "2021-09-01T12:00:00Z",
        "nextVersionId": "d4829ac7-4566-478c-a408-b44767eddadc",
        "previousVersionId": "ad7a8442-3531-46eb-a024-53953ec6e4ff"
      }
    ]
  }
}

Fetch StatusList2021 DID-Linked Resource based on search criteria.

get
Authorizations
Query parameters
didstringRequired

The DID of the issuer of the status list.

statusPurposestring · enumOptional

The purpose of the status list. Can be either revocation or suspension.

Possible values:
statusListNamestringOptional

The name of the StatusList2021 DID-Linked Resource.

Responses
200
The request was successful.
application/json
Responseall of
and
one ofOptional
or
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
get
GET /credential-status/search?did=text HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Accept: */*
{
  "found": true,
  "resource": {
    "StatusList2021": {
      "encodedList": "H4sIAAAAAAAAA-3BAQ0AAADCoPdPbQ8HFAAAAAAAAAAAAAAAAAAAAADwaDhDr_xcRAAA",
      "type": "StatusList2021Revocation",
      "validFrom": "2023-06-26T11:45:19.349Z"
    },
    "metadata": {
      "type": "StatusList2021Revocation",
      "encoding": "base64url",
      "encrypted": false
    }
  },
  "resourceMetadata": {
    "resourceURI": "did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e/resources/5945233a-a4b5-422b-b893-eaed5cedd2dc",
    "resourceCollectionId": "7c2b990c-3d05-4ebf-91af-f4f4d0091d2e",
    "resourceId": "5945233a-a4b5-422b-b893-eaed5cedd2dc",
    "resourceName": "cheqd-employee-credentials",
    "resourceType": "StatusList2021Revocation",
    "mediaType": "application/json",
    "resourceVersion": "1.0.0",
    "created": "2023-06-26T11:45:20Z",
    "checksum": "909e22e371a41afbb96c330a97752cf7c8856088f1f937f87decbef06cbe9ca2",
    "previousVersionId": null,
    "nextVersionId": null
  }
}

Revoke a Verifiable Credential.

post

This endpoint revokes a given Verifiable Credential. As input, it can take the VC-JWT as a string or the entire credential itself. The StatusList2021 resource should already be setup in the VC and credentialStatus property present in the VC.

Authorizations
Query parameters
publishbooleanRequired

Set whether the StatusList2021 resource should be published to the ledger or not. If set to false, the StatusList2021 publisher should manually publish the resource.

Default: true
Body
credentialone ofOptional

Verifiable Credential to be revoked as a VC-JWT string or a JSON object.

objectOptional
or
stringOptional
symmetricKeystringOptional

The symmetric key used to encrypt the StatusList2021 DID-Linked Resource. Required if the StatusList2021 DID-Linked Resource is encrypted.

Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential/revoke?publish=true HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 39

"credential={}&symmetricKey='text'"
{
  "revoked": true
}

Create an identity key pair.

post

This endpoint creates an identity key pair associated with the user's account for custodian-mode clients.

Authorizations
Query parameters
typestring · enumOptional

Key type of the identity key pair to create.

Possible values:
Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
application/json
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
application/json
post
POST /key/create HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Accept: */*
{
  "kid": "text",
  "type": "Ed25519",
  "publicKeyHex": "text"
}

Verify a Verifiable Credential.

post

This endpoint verifies a Verifiable Credential passed to it. As input, it can take the VC-JWT as a string or the entire credential itself.

Authorizations
Query parameters
verifyStatusbooleanOptional

If set to true the verification will also check the status of the credential. Requires the VC to have a credentialStatus property.

Default: false
fetchRemoteContextsbooleanOptional

When dealing with JSON-LD you also MUST provide the proper contexts. Set this to true ONLY if you want the @context URLs to be fetched in case they are a custom context.

Default: false
allowDeactivatedDidbooleanOptional

If set to true allow to verify credential which based on deactivated DID.

Default: false
Body
credentialobjectOptional

Verifiable Credential to be verified as a VC-JWT string or a JSON object.

Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential/verify HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 89

"credential={}&policies={'issuanceDate':true,'expirationDate':true,'audience':false}"
{
  "verified": true,
  "polices": {},
  "issuer": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0",
  "signer": {
    "controller": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0",
    "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#key-1",
    "publicKeyBase58": "BTJiso1S4iSiReP6wGksSneGfiKHxz9SYcm2KknpqBJt",
    "type": "Ed25519VerificationKey2018"
  }
}

Create an identity key pair.

post

This endpoint creates an identity key pair associated with the user's account for custodian-mode clients.

Authorizations
Query parameters
typestring · enumOptional

Key type of the identity key pair to create.

Possible values:
Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
application/json
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
application/json
post
POST /key/create HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Accept: */*
{
  "kid": "text",
  "type": "Ed25519",
  "publicKeyHex": "text"
}

Suspend a Verifiable Credential.

post

This endpoint suspends a given Verifiable Credential. As input, it can take the VC-JWT as a string or the entire credential itself.

Authorizations
Query parameters
publishbooleanOptional

Set whether the StatusList2021 resource should be published to the ledger or not. If set to false, the StatusList2021 publisher should manually publish the resource.

Body
credentialone ofOptional

Verifiable Credential to be revoked as a VC-JWT string or a JSON object.

objectOptional
or
stringOptional
symmetricKeystringOptional

The symmetric key used to encrypt the StatusList2021 DID-Linked Resource. Required if the StatusList2021 DID-Linked Resource is encrypted.

Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential/suspend HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 39

"credential={}&symmetricKey='text'"
{
  "suspended": true
}

Reinstate a suspended Verifiable Credential.

post

Set whether the StatusList2021 resource should be published to the ledger or not. If set to false, the StatusList2021 publisher should manually publish the resource.

Authorizations
Query parameters
publishbooleanOptional

Set whether the StatusList2021 resource should be published to the ledger or not. If set to false, the StatusList2021 publisher should manually publish the resource.

Body
credentialone ofOptional

Verifiable Credential to be revoked as a VC-JWT string or a JSON object.

objectOptional
or
stringOptional
symmetricKeystringOptional

The symmetric key used to encrypt the StatusList2021 DID-Linked Resource. Required if the StatusList2021 DID-Linked Resource is encrypted.

Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential/reinstate HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 39

"credential={}&symmetricKey='text'"
{
  "unsuspended": true
}

Create a DID-Linked Resource.

post

This endpoint creates a DID-Linked Resource. As input, it can take the DID identifier and the resource parameters via a form, or the fully-assembled resource itself.

Authorizations
Path parameters
didstringRequired

DID identifier to link the resource to.

Body

Input fields for DID-Linked Resource creation.

datastringRequired

Encoded string containing the data to be stored in the DID-Linked Resource.

encodingstring · enumRequired

Encoding format used to encode the data.

Possible values:
namestringRequired

Name of DID-Linked Resource.

typestringRequired

Type of DID-Linked Resource. This is NOT the same as the media type, which is calculated automatically ledger-side.

versionstringOptional

Optional field to assign a human-readable version in the DID-Linked Resource.

publicKeyHexsstring[]Optional

List of key references (publicKeys) which will be used for signing the message. The should be in hexadecimal format and placed in the wallet of current user.

Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /resource/create/{did} HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 94

"data='SGVsbG8gV29ybGQ='&encoding='base64url'&name='ResourceName'&type='TextDocument'"
{
  "resourceURI": "did:cheqd:testnet:55dbc8bf-fba3-4117-855c-1e0dc1d3bb47/resources/398cee0a-efac-4643-9f4c-74c48c72a14b",
  "resourceCollectionId": "55dbc8bf-fba3-4117-855c-1e0dc1d3bb47",
  "resourceId": "398cee0a-efac-4643-9f4c-74c48c72a14b",
  "resourceName": "cheqd-issuer-logo",
  "resourceType": "CredentialArtwork",
  "mediaType": "image/png",
  "resourceVersion": "1.0",
  "checksum": "a95380f460e63ad939541a57aecbfd795fcd37c6d78ee86c885340e33a91b559",
  "created": "2021-09-01T12:00:00Z",
  "nextVersionId": "d4829ac7-4566-478c-a408-b44767eddadc",
  "previousVersionId": "ad7a8442-3531-46eb-a024-53953ec6e4ff"
}

Update a DID Document.

post

This endpoint updates a DID Document. As an input, it can take JUST the sections/parameters that need to be updated in the DID Document (in this scenario, it fetches the current DID Document and applies the updated section). Alternatively, it take the fully-assembled DID Document with updated sections as well as unchanged sections.

Authorizations
Body
didstringOptional

DID identifier to be updated.

Example: did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0
authenticationstring[]Optional

Authentication section of the DID Document.

publicKeyHexsstring[]Optional

List of key references (publicKeys) which will be used for signing the message. The should be in hexadecimal format and placed in the wallet of current user.

Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /did/update HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 1226

"did='did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0'&service=[{'id':'did:cheqd:mainnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#service-1','type':'LinkedDomains','serviceEndpoint':['https://example.com']}]&verificationMethod=[{'controller':'did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0','id':'did:cheqd:testnet :7bf81a20-633c-4cc7-bc4a-5a45801005e0#key-1','publicKeyBase58':'BTJiso1S4iSiReP6wGksSneGfiKHxz9SYcm2KknpqBJt','type':'Ed25519VerificationKey2018'}]&authentication=['text']&publicKeyHexs=['text']&didDocument={'@context':['https://www.w3.org/ns/did/v1'],'id':'did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0','controller':['did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0'],'verificationMethod':[{'id':'did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#key-1','type':'Ed25519VerificationKey2018','controller':'did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0','publicKeyBase58':'z6MkkVbyHJLLjdjU5B62DaJ4mkdMdUkttf9UqySSkA9bVTeZ'}],'authentication':['did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#key-1'],'service':[{'id':'did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#service-1','type':'LinkedDomains','serviceEndpoint':['https://example.com']}]}"
{
  "did": "text",
  "controllerKeyId": "text",
  "keys": [
    {}
  ],
  "services": [
    {
      "id": "did:cheqd:mainnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#service-1",
      "type": "LinkedDomains",
      "serviceEndpoint": [
        "https://example.com"
      ]
    }
  ],
  "controllerKeyRefs": [
    "text"
  ],
  "controllerKeys": [
    "text"
  ]
}

Check a StatusList2021 index for a given Verifiable Credential.

post

This endpoint checks a StatusList2021 index for a given Verifiable Credential and reports whether it is revoked or suspended. It offers a standalone method for checking an index without passing the entire Verifiable Credential or Verifiable Presentation.

Authorizations
Query parameters
statusPurposestring · enumRequired

The purpose of the status list. Can be either revocation or suspension.

Possible values:
Body
didstring · uriRequired

DID of the StatusList2021 publisher.

statusListNamestringRequired

The name of the StatusList2021 DID-Linked Resource to be checked.

indexintegerRequired

Credential status index to be checked for revocation or suspension.

makeFeePaymentbooleanOptional

Automatically make fee payment (if required) based on payment conditions to unlock encrypted StatusList2021 DID-Linked Resource.

Default: true
Responses
200
The request was successful.
application/json
Responseone of
or
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential-status/check?statusPurpose=revocation HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 85

"did='https://example.com'&statusListName='text'&index=1&makeFeePayment=true"
{
  "checked": true,
  "revoked": false
}

Create a DID-Linked Resource.

post

This endpoint creates a DID-Linked Resource. As input, it can take the DID identifier and the resource parameters via a form, or the fully-assembled resource itself.

Authorizations
Path parameters
didstringRequired

DID identifier to link the resource to.

Body

Input fields for DID-Linked Resource creation.

datastringRequired

Encoded string containing the data to be stored in the DID-Linked Resource.

encodingstring · enumRequired

Encoding format used to encode the data.

Possible values:
namestringRequired

Name of DID-Linked Resource.

typestringRequired

Type of DID-Linked Resource. This is NOT the same as the media type, which is calculated automatically ledger-side.

versionstringOptional

Optional field to assign a human-readable version in the DID-Linked Resource.

publicKeyHexsstring[]Optional

List of key references (publicKeys) which will be used for signing the message. The should be in hexadecimal format and placed in the wallet of current user.

Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /resource/create/{did} HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 94

"data='SGVsbG8gV29ybGQ='&encoding='base64url'&name='ResourceName'&type='TextDocument'"
{
  "resourceURI": "did:cheqd:testnet:55dbc8bf-fba3-4117-855c-1e0dc1d3bb47/resources/398cee0a-efac-4643-9f4c-74c48c72a14b",
  "resourceCollectionId": "55dbc8bf-fba3-4117-855c-1e0dc1d3bb47",
  "resourceId": "398cee0a-efac-4643-9f4c-74c48c72a14b",
  "resourceName": "cheqd-issuer-logo",
  "resourceType": "CredentialArtwork",
  "mediaType": "image/png",
  "resourceVersion": "1.0",
  "checksum": "a95380f460e63ad939541a57aecbfd795fcd37c6d78ee86c885340e33a91b559",
  "created": "2021-09-01T12:00:00Z",
  "nextVersionId": "d4829ac7-4566-478c-a408-b44767eddadc",
  "previousVersionId": "ad7a8442-3531-46eb-a024-53953ec6e4ff"
}

Create an unencrypted StatusList2021 credential status list.

post

This endpoint creates an unencrypted StatusList2021 credential status list. The StatusList is published as a DID-Linked Resource on ledger. As input, it can can take input parameters needed to create the status list via a form, or a pre-assembled status list in JSON format. Status lists can be created as either encrypted or unencrypted; and with purpose as either revocation or suspension.

Authorizations
Query parameters
statusPurposestring · enumRequired

The purpose of the status list. Can be either revocation or suspension. Once this is set, it cannot be changed. A new status list must be created to change the purpose.

Possible values:
Body
all ofOptionalExample: {"did":"did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e","statusListName":"cheqd-employee-credentials","length":140000,"encoding":"base64url"}
Responses
200
The request was successful.
application/json
Responseall of
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential-status/create/unencrypted?statusPurpose=revocation HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 149

"did='did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e'&statusListName='cheqd-employee-credentials'&length=140000&encoding='base64url'"
{
  "created": true,
  "resource": {
    "StatusList2021": {
      "encodedList": "H4sIAAAAAAAAA-3BAQ0AAADCoPdPbQ8HFAAAAAAAAAAAAAAAAAAAAADwaDhDr_xcRAAA",
      "type": "StatusList2021Revocation",
      "validFrom": "2023-06-26T11:45:19.349Z"
    },
    "metadata": {
      "type": "StatusList2021Revocation",
      "encoding": "base64url",
      "encrypted": false
    }
  },
  "resourceMetadata": {
    "resourceURI": "did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e/resources/5945233a-a4b5-422b-b893-eaed5cedd2dc",
    "resourceCollectionId": "7c2b990c-3d05-4ebf-91af-f4f4d0091d2e",
    "resourceId": "5945233a-a4b5-422b-b893-eaed5cedd2dc",
    "resourceName": "cheqd-employee-credentials",
    "resourceType": "StatusList2021Revocation",
    "mediaType": "application/json",
    "resourceVersion": "1.0.0",
    "created": "2023-06-26T11:45:20Z",
    "checksum": "909e22e371a41afbb96c330a97752cf7c8856088f1f937f87decbef06cbe9ca2",
    "previousVersionId": null,
    "nextVersionId": null
  }
}

Create an unencrypted StatusList2021 credential status list.

post

This endpoint creates an unencrypted StatusList2021 credential status list. The StatusList is published as a DID-Linked Resource on ledger. As input, it can can take input parameters needed to create the status list via a form, or a pre-assembled status list in JSON format. Status lists can be created as either encrypted or unencrypted; and with purpose as either revocation or suspension.

Authorizations
Query parameters
statusPurposestring · enumRequired

The purpose of the status list. Can be either revocation or suspension. Once this is set, it cannot be changed. A new status list must be created to change the purpose.

Possible values:
Body
all ofOptionalExample: {"did":"did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e","statusListName":"cheqd-employee-credentials","length":140000,"encoding":"base64url"}
Responses
200
The request was successful.
application/json
Responseall of
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential-status/create/unencrypted?statusPurpose=revocation HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 149

"did='did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e'&statusListName='cheqd-employee-credentials'&length=140000&encoding='base64url'"
{
  "created": true,
  "resource": {
    "StatusList2021": {
      "encodedList": "H4sIAAAAAAAAA-3BAQ0AAADCoPdPbQ8HFAAAAAAAAAAAAAAAAAAAAADwaDhDr_xcRAAA",
      "type": "StatusList2021Revocation",
      "validFrom": "2023-06-26T11:45:19.349Z"
    },
    "metadata": {
      "type": "StatusList2021Revocation",
      "encoding": "base64url",
      "encrypted": false
    }
  },
  "resourceMetadata": {
    "resourceURI": "did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e/resources/5945233a-a4b5-422b-b893-eaed5cedd2dc",
    "resourceCollectionId": "7c2b990c-3d05-4ebf-91af-f4f4d0091d2e",
    "resourceId": "5945233a-a4b5-422b-b893-eaed5cedd2dc",
    "resourceName": "cheqd-employee-credentials",
    "resourceType": "StatusList2021Revocation",
    "mediaType": "application/json",
    "resourceVersion": "1.0.0",
    "created": "2023-06-26T11:45:20Z",
    "checksum": "909e22e371a41afbb96c330a97752cf7c8856088f1f937f87decbef06cbe9ca2",
    "previousVersionId": null,
    "nextVersionId": null
  }
}

Create a DID-Linked Resource.

post

This endpoint creates a DID-Linked Resource. As input, it can take the DID identifier and the resource parameters via a form, or the fully-assembled resource itself.

Authorizations
Path parameters
didstringRequired

DID identifier to link the resource to.

Body

Input fields for DID-Linked Resource creation.

datastringRequired

Encoded string containing the data to be stored in the DID-Linked Resource.

encodingstring · enumRequired

Encoding format used to encode the data.

Possible values:
namestringRequired

Name of DID-Linked Resource.

typestringRequired

Type of DID-Linked Resource. This is NOT the same as the media type, which is calculated automatically ledger-side.

versionstringOptional

Optional field to assign a human-readable version in the DID-Linked Resource.

publicKeyHexsstring[]Optional

List of key references (publicKeys) which will be used for signing the message. The should be in hexadecimal format and placed in the wallet of current user.

Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /resource/create/{did} HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 94

"data='SGVsbG8gV29ybGQ='&encoding='base64url'&name='ResourceName'&type='TextDocument'"
{
  "resourceURI": "did:cheqd:testnet:55dbc8bf-fba3-4117-855c-1e0dc1d3bb47/resources/398cee0a-efac-4643-9f4c-74c48c72a14b",
  "resourceCollectionId": "55dbc8bf-fba3-4117-855c-1e0dc1d3bb47",
  "resourceId": "398cee0a-efac-4643-9f4c-74c48c72a14b",
  "resourceName": "cheqd-issuer-logo",
  "resourceType": "CredentialArtwork",
  "mediaType": "image/png",
  "resourceVersion": "1.0",
  "checksum": "a95380f460e63ad939541a57aecbfd795fcd37c6d78ee86c885340e33a91b559",
  "created": "2021-09-01T12:00:00Z",
  "nextVersionId": "d4829ac7-4566-478c-a408-b44767eddadc",
  "previousVersionId": "ad7a8442-3531-46eb-a024-53953ec6e4ff"
}

Resolve a DID Document.

get

Resolve a DID Document by DID identifier. Also supports DID Resolution Queries as defined in the W3C DID Resolution specification.

Authorizations
Path parameters
didstringRequired

DID identifier to resolve.

Example: did:cheqd:mainnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0
Query parameters
metadatabooleanOptional

Return only metadata of DID Document instead of actual DID Document.

versionIdstring · uuidOptional

Unique UUID version identifier of DID Document. Allows for fetching a specific version of the DID Document. See cheqd DID Method Specification for more details.

Example: 3ccde6ba-6ba5-56f2-9f4f-8825561a9860
versionTimestring · date-timeOptional

Returns the closest version of the DID Document at or before specified time. See DID Resolution handling for did:cheqd for more details.

Example: 1970-01-01T00:00:00Z
transformKeysstring · enumOptional

This directive transforms the Verification Method key format from the version in the DID Document to the specified format chosen below.

Possible values:
servicestringOptional

Query DID Document for a specific Service Endpoint by Service ID (e.g., service-1 in did:cheqd:mainnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#service-1). This will typically redirect to the Service Endpoint based on DID Resolution specification algorithm.

Example: service-1
relativeRefstringOptional

Relative reference is a query fragment appended to the Service Endpoint URL. Must be used along with the service query property above. See DID Resolution specification algorithm for more details.

Example: /path/to/file
Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
get
GET /did/search/{did} HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Accept: */*
{
  "@context": "https://w3id.org/did-resolution/v1",
  "didDidResolutionMetadata": {
    "contentType": "application/did+ld+json",
    "retrieved": "2021-09-01T12:00:00Z",
    "did": {
      "didString": "did:cheqd:testnet:55dbc8bf-fba3-4117-855c-1e0dc1d3bb47",
      "method": "cheqd",
      "methodSpecificId": "55dbc8bf-fba3-4117-855c-1e0dc1d3bb47"
    }
  },
  "didDocument": {
    "@context": [
      "https://www.w3.org/ns/did/v1"
    ],
    "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0",
    "controller": [
      "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0"
    ],
    "verificationMethod": [
      {
        "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#key-1",
        "type": "Ed25519VerificationKey2018",
        "controller": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0",
        "publicKeyBase58": "z6MkkVbyHJLLjdjU5B62DaJ4mkdMdUkttf9UqySSkA9bVTeZ"
      }
    ],
    "authentication": [
      "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#key-1"
    ],
    "service": [
      {
        "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#service-1",
        "type": "LinkedDomains",
        "serviceEndpoint": [
          "https://example.com"
        ]
      }
    ]
  },
  "didDocumentMetadata": {
    "created": "2021-09-01T12:00:00Z",
    "deactivated": false,
    "updated": "2021-09-10T12:00:00Z",
    "versionId": "3ccde6ba-6ba5-56f2-9f4f-8825561a9860",
    "linkedResourceMetadata": [
      {
        "resourceURI": "did:cheqd:testnet:55dbc8bf-fba3-4117-855c-1e0dc1d3bb47/resources/398cee0a-efac-4643-9f4c-74c48c72a14b",
        "resourceCollectionId": "55dbc8bf-fba3-4117-855c-1e0dc1d3bb47",
        "resourceId": "398cee0a-efac-4643-9f4c-74c48c72a14b",
        "resourceName": "cheqd-issuer-logo",
        "resourceType": "CredentialArtwork",
        "mediaType": "image/png",
        "resourceVersion": "1.0",
        "checksum": "a95380f460e63ad939541a57aecbfd795fcd37c6d78ee86c885340e33a91b559",
        "created": "2021-09-01T12:00:00Z",
        "nextVersionId": "d4829ac7-4566-478c-a408-b44767eddadc",
        "previousVersionId": "ad7a8442-3531-46eb-a024-53953ec6e4ff"
      }
    ]
  }
}

Check a StatusList2021 index for a given Verifiable Credential.

post

This endpoint checks a StatusList2021 index for a given Verifiable Credential and reports whether it is revoked or suspended. It offers a standalone method for checking an index without passing the entire Verifiable Credential or Verifiable Presentation.

Authorizations
Query parameters
statusPurposestring · enumRequired

The purpose of the status list. Can be either revocation or suspension.

Possible values:
Body
didstring · uriRequired

DID of the StatusList2021 publisher.

statusListNamestringRequired

The name of the StatusList2021 DID-Linked Resource to be checked.

indexintegerRequired

Credential status index to be checked for revocation or suspension.

makeFeePaymentbooleanOptional

Automatically make fee payment (if required) based on payment conditions to unlock encrypted StatusList2021 DID-Linked Resource.

Default: true
Responses
200
The request was successful.
application/json
Responseone of
or
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential-status/check?statusPurpose=revocation HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 85

"did='https://example.com'&statusListName='text'&index=1&makeFeePayment=true"
{
  "checked": true,
  "revoked": false
}

Check a StatusList2021 index for a given Verifiable Credential.

post

This endpoint checks a StatusList2021 index for a given Verifiable Credential and reports whether it is revoked or suspended. It offers a standalone method for checking an index without passing the entire Verifiable Credential or Verifiable Presentation.

Authorizations
Query parameters
statusPurposestring · enumRequired

The purpose of the status list. Can be either revocation or suspension.

Possible values:
Body
didstring · uriRequired

DID of the StatusList2021 publisher.

statusListNamestringRequired

The name of the StatusList2021 DID-Linked Resource to be checked.

indexintegerRequired

Credential status index to be checked for revocation or suspension.

makeFeePaymentbooleanOptional

Automatically make fee payment (if required) based on payment conditions to unlock encrypted StatusList2021 DID-Linked Resource.

Default: true
Responses
200
The request was successful.
application/json
Responseone of
or
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential-status/check?statusPurpose=revocation HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 85

"did='https://example.com'&statusListName='text'&index=1&makeFeePayment=true"
{
  "checked": true,
  "revoked": false
}

Check a StatusList2021 index for a given Verifiable Credential.

post

This endpoint checks a StatusList2021 index for a given Verifiable Credential and reports whether it is revoked or suspended. It offers a standalone method for checking an index without passing the entire Verifiable Credential or Verifiable Presentation.

Authorizations
Query parameters
statusPurposestring · enumRequired

The purpose of the status list. Can be either revocation or suspension.

Possible values:
Body
didstring · uriRequired

DID of the StatusList2021 publisher.

statusListNamestringRequired

The name of the StatusList2021 DID-Linked Resource to be checked.

indexintegerRequired

Credential status index to be checked for revocation or suspension.

makeFeePaymentbooleanOptional

Automatically make fee payment (if required) based on payment conditions to unlock encrypted StatusList2021 DID-Linked Resource.

Default: true
Responses
200
The request was successful.
application/json
Responseone of
or
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential-status/check?statusPurpose=revocation HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 85

"did='https://example.com'&statusListName='text'&index=1&makeFeePayment=true"
{
  "checked": true,
  "revoked": false
}

Issue a Verifiable Credential

post

This endpoint issues a Verifiable Credential. As input it takes the list of issuerDid, subjectDid, attributes, and other parameters of the credential to be issued.

Authorizations
Body

Input fields for the creating a Verifiable Credential.

issuerDidstringRequired

DID of the Verifiable Credential issuer. This needs to be a did:cheqd DID.

Example: did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0
subjectDidstringRequired

DID of the Verifiable Credential holder/subject. This needs to be a did:key DID.

Example: did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK
attributesobjectRequired

JSON object containing the attributes to be included in the credential.

Example: {"name":"Bob","gender":"male"}
@contextstring[]Optional

Optional properties to be included in the @context property of the credential.

Example: ["https://schema.org/schema.jsonld","https://veramo.io/contexts/profile/v1"]
typestring[]Optional

Optional properties to be included in the type property of the credential.

Example: ["Person"]
expirationDatestring · date-timeOptional

Optional expiration date according to the <a href=https://www.w3.org/TR/vc-data-model/#expiration> VC Data Model specification.

Example: 2023-06-08T13:49:28.000Z
formatstring · enumOptional

Format of the Verifiable Credential. Defaults to VC-JWT.

Example: jwtPossible values:
termsOfUseobject[]Optional

Terms of use can be utilized by an issuer or a holder to communicate the terms under which a verifiable credential was issued.

Example: {"type":"IssuerPolicy","id":"http://example.com/policies/credential/4","profile":"http://example.com/profiles/credential","prohibition":[{"assigner":"https://example.edu/issuers/14","assignee":"AllVerifiers","target":"http://example.edu/credentials/3732","action":["Archival"]}]}
refreshServiceobject[]Optional

RefreshService property MUST be one or more refresh services that provides enough information to the recipient's software such that the recipient can refresh the verifiable credential.

Example: {"type":"ManualRefreshService2018","id":"https://example.edu/refresh/3732"}
evidenceobject[]Optional

Evidence property MUST be one or more evidence schemes providing enough information for a verifier to determine whether the evidence gathered by the issuer meets its confidence requirements for relying on the credential.

Example: {"type":["DocumentVerification"],"id":"https://example.edu/evidence/f2aeec97-fc0d-42bf-8ca7-0548192d4231","verifier":"https://example.edu/issuers/14","evidenceDocument":"DriversLicense","subjectPresence":"Physical","documentPresence":"Physical","licenseNumber":"123AB4567"}
Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential/issue HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 364

"issuerDid='did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0'&subjectDid='did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK'&attributes={'gender':'male','name':'Bob'}&@context=['https://schema.org']&type=['Person']&format='jwt'&credentialStatus={'statusPurpose':'revocation','statusListName':'employee-credentials','statusListIndex':10}"
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://schema.org",
    "https://veramo.io/contexts/profile/v1"
  ],
  "credentialSubject": {
    "gender": "male",
    "id": "did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK",
    "name": "Bob"
  },
  "credentialStatus": {
    "id": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e?resourceName=cheqd-suspension-1&resourceType=StatusList2021Suspension#20",
    "statusIndex": 20,
    "statusPurpose": "suspension",
    "type": "StatusList2021Entry"
  },
  "issuanceDate": "2023-06-08T13:49:28.000Z",
  "issuer": {
    "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0"
  },
  "proof": {
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJkaWQ6Y2hlcWQ6dGVzdG5ldDo3YmY4MWEyMC02MzNjLTRjYzctYmM0YS01YTQ1ODAxMDA1ZTAiLCJuYmYiOjE2ODYyMzIxNjgsInN1YiI6ImRpZDprZXk6ejZNa2hhWGdCWkR2b3REa0w1MjU3ZmFpenRpR2lDMlF0S0xHcGJubkVHdGEyZG9LIiwidmMiOnsiQGNvbnRleHQiOlsiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvdjEiLCJodHRwczovL3NjaGVtYS5vcmciLCJodHRwczovL3ZlcmFtby5pby9jb250ZXh0cy9wcm9maWxlL3YxIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImdlbmRlciI6Im1hbGUiLCJuYW1lIjoiQm9iIn0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJQZXJzb24iXX19.wMfdR6RtyAZA4eoWya5Aw97wwER2Cm5Guk780Xw8H9fA3sfudIJeLRLboqixpTchqSbYeA7KbuCTAnLgXTD_Cg",
    "type": "JwtProof2020"
  },
  "type": [
    "VerifiableCredential",
    "Person"
  ]
}

Update an existing encrypted StatusList2021 credential status list.

post
Authorizations
Query parameters
statusActionstring · enumRequired

The update action to be performed on the encrypted status list, can be revoke, suspend or reinstate

Possible values:
Body
all ofOptional
Responses
200
The request was successful.
application/json
Responseall of
and
one ofOptional
or
or
and
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential-status/update/encrypted?statusAction=revoke HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 227

"did='https://example.com'&statusListName='text'&indices=[1]&statusListVersion='text'&symmetricKey='text'&feePaymentAddress='cheqd1qs0nhyk868c246defezhz5eymlt0dmajna2csg'&feePaymentAmount=20&feePaymentWindow=10"
{
  "updated": true,
  "revoked": true,
  "resource": {
    "StatusList2021": {
      "encodedList": "496fdfbeb745b4db03fcdb40566f9c4c4a1c0f184b31255e641b6e7bdfb9b6946c12be87ca3763be0393c00b67ac1e8737c106b32f46ef59c765754415b5e8cc7c65fccaa3374620430ea476301a5e0dd63340e7a27a68bc627518471f22e4a2",
      "type": "StatusList2021Revocation",
      "validFrom": "2023-06-26T11:45:19.349Z"
    },
    "metadata": {
      "type": "StatusList2021Revocation",
      "encoding": "base64url",
      "encrypted": true,
      "encryptedSymmetricKey": "b11182dc524b8181f9a6aef4c4ad0a1c14e40033b9112dffd8d1bcf6cc3b85abc07ded2205ee94068a99f4202502cb0855f322583fa6ce1534d3a05bf36891766ea2c5f90a982b3040680762977d404d758a2370224a239c8279aa7d21e980931c42055b17ca4c7dbffa4782480a8b6279cf989b2f166d5fdb4b2c1b5a63927200000000000000203018dcaba26df45a415bb599218b27ca853a70289d7a3ed3ed0e3730452e8f8d9af91b6e71312565d2c069341f6660ab",
      "paymentConditions": [
        {
          "feePaymentAddress": "cheqd1qs0nhyk868c246defezhz5eymlt0dmajna2csg",
          "feePaymentAmount": "20000000000ncheq",
          "intervalInSeconds": 600,
          "type": "timelockPayment"
        }
      ]
    },
    "resourceMetadata": {
      "resourceURI": "did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e/resources/5945233a-a4b5-422b-b893-eaed5cedd2dc",
      "resourceCollectionId": "7c2b990c-3d05-4ebf-91af-f4f4d0091d2e",
      "resourceId": "5945233a-a4b5-422b-b893-eaed5cedd2dc",
      "resourceName": "cheqd-revocation-encrypted-1",
      "resourceType": "StatusList2021Revocation",
      "mediaType": "application/json",
      "resourceVersion": "2023-06-26T11:45:19.349Z",
      "created": "2023-06-26T11:45:20Z",
      "checksum": "909e22e371a41afbb96c330a97752cf7c8856088f1f937f87decbef06cbe9ca2",
      "previousVersionId": null,
      "nextVersionId": null
    },
    "symmetricKey": "dfe204ee95ae74ea5d74b94c3d8ff782273905b07fbc9f8c3d961c3b43849f18"
  }
}

Update an existing encrypted StatusList2021 credential status list.

post
Authorizations
Query parameters
statusActionstring · enumRequired

The update action to be performed on the encrypted status list, can be revoke, suspend or reinstate

Possible values:
Body
all ofOptional
Responses
200
The request was successful.
application/json
Responseall of
and
one ofOptional
or
or
and
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential-status/update/encrypted?statusAction=revoke HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 227

"did='https://example.com'&statusListName='text'&indices=[1]&statusListVersion='text'&symmetricKey='text'&feePaymentAddress='cheqd1qs0nhyk868c246defezhz5eymlt0dmajna2csg'&feePaymentAmount=20&feePaymentWindow=10"
{
  "updated": true,
  "revoked": true,
  "resource": {
    "StatusList2021": {
      "encodedList": "496fdfbeb745b4db03fcdb40566f9c4c4a1c0f184b31255e641b6e7bdfb9b6946c12be87ca3763be0393c00b67ac1e8737c106b32f46ef59c765754415b5e8cc7c65fccaa3374620430ea476301a5e0dd63340e7a27a68bc627518471f22e4a2",
      "type": "StatusList2021Revocation",
      "validFrom": "2023-06-26T11:45:19.349Z"
    },
    "metadata": {
      "type": "StatusList2021Revocation",
      "encoding": "base64url",
      "encrypted": true,
      "encryptedSymmetricKey": "b11182dc524b8181f9a6aef4c4ad0a1c14e40033b9112dffd8d1bcf6cc3b85abc07ded2205ee94068a99f4202502cb0855f322583fa6ce1534d3a05bf36891766ea2c5f90a982b3040680762977d404d758a2370224a239c8279aa7d21e980931c42055b17ca4c7dbffa4782480a8b6279cf989b2f166d5fdb4b2c1b5a63927200000000000000203018dcaba26df45a415bb599218b27ca853a70289d7a3ed3ed0e3730452e8f8d9af91b6e71312565d2c069341f6660ab",
      "paymentConditions": [
        {
          "feePaymentAddress": "cheqd1qs0nhyk868c246defezhz5eymlt0dmajna2csg",
          "feePaymentAmount": "20000000000ncheq",
          "intervalInSeconds": 600,
          "type": "timelockPayment"
        }
      ]
    },
    "resourceMetadata": {
      "resourceURI": "did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e/resources/5945233a-a4b5-422b-b893-eaed5cedd2dc",
      "resourceCollectionId": "7c2b990c-3d05-4ebf-91af-f4f4d0091d2e",
      "resourceId": "5945233a-a4b5-422b-b893-eaed5cedd2dc",
      "resourceName": "cheqd-revocation-encrypted-1",
      "resourceType": "StatusList2021Revocation",
      "mediaType": "application/json",
      "resourceVersion": "2023-06-26T11:45:19.349Z",
      "created": "2023-06-26T11:45:20Z",
      "checksum": "909e22e371a41afbb96c330a97752cf7c8856088f1f937f87decbef06cbe9ca2",
      "previousVersionId": null,
      "nextVersionId": null
    },
    "symmetricKey": "dfe204ee95ae74ea5d74b94c3d8ff782273905b07fbc9f8c3d961c3b43849f18"
  }
}

Issue a Verifiable Credential

post

This endpoint issues a Verifiable Credential. As input it takes the list of issuerDid, subjectDid, attributes, and other parameters of the credential to be issued.

Authorizations
Body

Input fields for the creating a Verifiable Credential.

issuerDidstringRequired

DID of the Verifiable Credential issuer. This needs to be a did:cheqd DID.

Example: did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0
subjectDidstringRequired

DID of the Verifiable Credential holder/subject. This needs to be a did:key DID.

Example: did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK
attributesobjectRequired

JSON object containing the attributes to be included in the credential.

Example: {"name":"Bob","gender":"male"}
@contextstring[]Optional

Optional properties to be included in the @context property of the credential.

Example: ["https://schema.org/schema.jsonld","https://veramo.io/contexts/profile/v1"]
typestring[]Optional

Optional properties to be included in the type property of the credential.

Example: ["Person"]
expirationDatestring · date-timeOptional

Optional expiration date according to the <a href=https://www.w3.org/TR/vc-data-model/#expiration> VC Data Model specification.

Example: 2023-06-08T13:49:28.000Z
formatstring · enumOptional

Format of the Verifiable Credential. Defaults to VC-JWT.

Example: jwtPossible values:
termsOfUseobject[]Optional

Terms of use can be utilized by an issuer or a holder to communicate the terms under which a verifiable credential was issued.

Example: {"type":"IssuerPolicy","id":"http://example.com/policies/credential/4","profile":"http://example.com/profiles/credential","prohibition":[{"assigner":"https://example.edu/issuers/14","assignee":"AllVerifiers","target":"http://example.edu/credentials/3732","action":["Archival"]}]}
refreshServiceobject[]Optional

RefreshService property MUST be one or more refresh services that provides enough information to the recipient's software such that the recipient can refresh the verifiable credential.

Example: {"type":"ManualRefreshService2018","id":"https://example.edu/refresh/3732"}
evidenceobject[]Optional

Evidence property MUST be one or more evidence schemes providing enough information for a verifier to determine whether the evidence gathered by the issuer meets its confidence requirements for relying on the credential.

Example: {"type":["DocumentVerification"],"id":"https://example.edu/evidence/f2aeec97-fc0d-42bf-8ca7-0548192d4231","verifier":"https://example.edu/issuers/14","evidenceDocument":"DriversLicense","subjectPresence":"Physical","documentPresence":"Physical","licenseNumber":"123AB4567"}
Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential/issue HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 364

"issuerDid='did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0'&subjectDid='did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK'&attributes={'gender':'male','name':'Bob'}&@context=['https://schema.org']&type=['Person']&format='jwt'&credentialStatus={'statusPurpose':'revocation','statusListName':'employee-credentials','statusListIndex':10}"
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://schema.org",
    "https://veramo.io/contexts/profile/v1"
  ],
  "credentialSubject": {
    "gender": "male",
    "id": "did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK",
    "name": "Bob"
  },
  "credentialStatus": {
    "id": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e?resourceName=cheqd-suspension-1&resourceType=StatusList2021Suspension#20",
    "statusIndex": 20,
    "statusPurpose": "suspension",
    "type": "StatusList2021Entry"
  },
  "issuanceDate": "2023-06-08T13:49:28.000Z",
  "issuer": {
    "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0"
  },
  "proof": {
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJkaWQ6Y2hlcWQ6dGVzdG5ldDo3YmY4MWEyMC02MzNjLTRjYzctYmM0YS01YTQ1ODAxMDA1ZTAiLCJuYmYiOjE2ODYyMzIxNjgsInN1YiI6ImRpZDprZXk6ejZNa2hhWGdCWkR2b3REa0w1MjU3ZmFpenRpR2lDMlF0S0xHcGJubkVHdGEyZG9LIiwidmMiOnsiQGNvbnRleHQiOlsiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvdjEiLCJodHRwczovL3NjaGVtYS5vcmciLCJodHRwczovL3ZlcmFtby5pby9jb250ZXh0cy9wcm9maWxlL3YxIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImdlbmRlciI6Im1hbGUiLCJuYW1lIjoiQm9iIn0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJQZXJzb24iXX19.wMfdR6RtyAZA4eoWya5Aw97wwER2Cm5Guk780Xw8H9fA3sfudIJeLRLboqixpTchqSbYeA7KbuCTAnLgXTD_Cg",
    "type": "JwtProof2020"
  },
  "type": [
    "VerifiableCredential",
    "Person"
  ]
}

Issue a Verifiable Credential

post

This endpoint issues a Verifiable Credential. As input it takes the list of issuerDid, subjectDid, attributes, and other parameters of the credential to be issued.

Authorizations
Body

Input fields for the creating a Verifiable Credential.

issuerDidstringRequired

DID of the Verifiable Credential issuer. This needs to be a did:cheqd DID.

Example: did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0
subjectDidstringRequired

DID of the Verifiable Credential holder/subject. This needs to be a did:key DID.

Example: did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK
attributesobjectRequired

JSON object containing the attributes to be included in the credential.

Example: {"name":"Bob","gender":"male"}
@contextstring[]Optional

Optional properties to be included in the @context property of the credential.

Example: ["https://schema.org/schema.jsonld","https://veramo.io/contexts/profile/v1"]
typestring[]Optional

Optional properties to be included in the type property of the credential.

Example: ["Person"]
expirationDatestring · date-timeOptional

Optional expiration date according to the <a href=https://www.w3.org/TR/vc-data-model/#expiration> VC Data Model specification.

Example: 2023-06-08T13:49:28.000Z
formatstring · enumOptional

Format of the Verifiable Credential. Defaults to VC-JWT.

Example: jwtPossible values:
termsOfUseobject[]Optional

Terms of use can be utilized by an issuer or a holder to communicate the terms under which a verifiable credential was issued.

Example: {"type":"IssuerPolicy","id":"http://example.com/policies/credential/4","profile":"http://example.com/profiles/credential","prohibition":[{"assigner":"https://example.edu/issuers/14","assignee":"AllVerifiers","target":"http://example.edu/credentials/3732","action":["Archival"]}]}
refreshServiceobject[]Optional

RefreshService property MUST be one or more refresh services that provides enough information to the recipient's software such that the recipient can refresh the verifiable credential.

Example: {"type":"ManualRefreshService2018","id":"https://example.edu/refresh/3732"}
evidenceobject[]Optional

Evidence property MUST be one or more evidence schemes providing enough information for a verifier to determine whether the evidence gathered by the issuer meets its confidence requirements for relying on the credential.

Example: {"type":["DocumentVerification"],"id":"https://example.edu/evidence/f2aeec97-fc0d-42bf-8ca7-0548192d4231","verifier":"https://example.edu/issuers/14","evidenceDocument":"DriversLicense","subjectPresence":"Physical","documentPresence":"Physical","licenseNumber":"123AB4567"}
Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential/issue HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 364

"issuerDid='did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0'&subjectDid='did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK'&attributes={'gender':'male','name':'Bob'}&@context=['https://schema.org']&type=['Person']&format='jwt'&credentialStatus={'statusPurpose':'revocation','statusListName':'employee-credentials','statusListIndex':10}"
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://schema.org",
    "https://veramo.io/contexts/profile/v1"
  ],
  "credentialSubject": {
    "gender": "male",
    "id": "did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK",
    "name": "Bob"
  },
  "credentialStatus": {
    "id": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e?resourceName=cheqd-suspension-1&resourceType=StatusList2021Suspension#20",
    "statusIndex": 20,
    "statusPurpose": "suspension",
    "type": "StatusList2021Entry"
  },
  "issuanceDate": "2023-06-08T13:49:28.000Z",
  "issuer": {
    "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0"
  },
  "proof": {
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJkaWQ6Y2hlcWQ6dGVzdG5ldDo3YmY4MWEyMC02MzNjLTRjYzctYmM0YS01YTQ1ODAxMDA1ZTAiLCJuYmYiOjE2ODYyMzIxNjgsInN1YiI6ImRpZDprZXk6ejZNa2hhWGdCWkR2b3REa0w1MjU3ZmFpenRpR2lDMlF0S0xHcGJubkVHdGEyZG9LIiwidmMiOnsiQGNvbnRleHQiOlsiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvdjEiLCJodHRwczovL3NjaGVtYS5vcmciLCJodHRwczovL3ZlcmFtby5pby9jb250ZXh0cy9wcm9maWxlL3YxIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImdlbmRlciI6Im1hbGUiLCJuYW1lIjoiQm9iIn0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJQZXJzb24iXX19.wMfdR6RtyAZA4eoWya5Aw97wwER2Cm5Guk780Xw8H9fA3sfudIJeLRLboqixpTchqSbYeA7KbuCTAnLgXTD_Cg",
    "type": "JwtProof2020"
  },
  "type": [
    "VerifiableCredential",
    "Person"
  ]
}

Create a DID Document.

post

This endpoint creates a DID and associated DID Document. As input, it can take the DID Document parameters via a form, or the fully-assembled DID Document itself.

Authorizations
Body
networkstring · enumOptional

Network to create the DID on (testnet or mainnet)

Possible values:
identifierFormatTypestring · enumOptional

Algorithm to use for generating the method-specific ID. The two styles supported are UUIDs and Indy-style Base58. See cheqd DID method documentation for more details.

Possible values:
verificationMethodTypestring · enumOptional

Type of verification method to use for the DID. See DID Core specification for more details. Only the types listed below are supported.

Possible values:
keystringOptional

The unique identifier in hexadecimal public key format used in the verification method to create the DID.

@contextstring[]OptionalExample: ["https://www.w3.org/ns/did/v1"]
Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
application/json
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
application/json
post
POST /did/create HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 266

"network='testnet'&identifierFormatType='uuid'&verificationMethodType='Ed25519VerificationKey2018'&service=[{'idFragment':'service-1','type':'LinkedDomains','serviceEndpoint':['https://example.com']}]&key='text'&@context=['https://www.w3.org/ns/did/v1']"
{
  "did": "text",
  "controllerKeyId": "text",
  "keys": [
    {}
  ],
  "services": [
    {
      "id": "did:cheqd:mainnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#service-1",
      "type": "LinkedDomains",
      "serviceEndpoint": [
        "https://example.com"
      ]
    }
  ]
}

Publish a verifiable accreditation for a DID.

post

Generate and publish a Verifiable Accreditation for a subject DID as a DID Linked resource.

Authorizations
Query parameters
accreditationTypestring · enumRequired

Select the type of accreditation to be issued.

Possible values:
Body

Input fields for the creating a Verifiable Accreditation.

issuerDidstringRequired

DID of the Verifiable Accreditation issuer. This needs to be a did:cheqd DID.

Example: did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0
subjectDidstringRequired

DID of the Verifiable Accreditation holder/subject. This needs to be a did:cheqd DID.

Example: did:cheqd:testnet:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK
accreditationNamestringRequired

Unique name of the Verifiable Accreditation.

attributesobjectOptional

JSON object containing the attributes to be included in the Accreditation.

@contextstring[]Optional

Optional properties to be included in the @context property of the Accreditation.

Example: ["https://schema.org/schema.jsonld","https://veramo.io/contexts/profile/v1"]
parentAccreditationstringOptional

DID URL of the parent Verifiable Accreditation, required for accredit/attest operation.

rootAuthorisationstringOptional

DID URL of the root Verifiable Accreditation, required for accredit/attest operation.

trustFrameworkstringOptional

Name or Type of the Trust Framework, required for authorise operation.

trustFrameworkIdstringOptional

Url of the Trust Framework, required for authorise operation.

typestring[]Optional

Optional properties to be included in the type property of the Accreditation.

Example: ["Person"]
expirationDatestring · date-timeOptional

Optional expiration date according to the <a href=https://www.w3.org/TR/vc-data-model/#expiration> VC Data Model specification.

Example: 2023-06-08T13:49:28.000Z
formatstring · enumOptional

Format of the Verifiable Accreditation. Defaults to VC-JWT.

Example: jwtPossible values:
termsOfUseobject[]Optional

Terms of use can be utilized by an issuer or a holder to communicate the terms under which a verifiable credential was issued.

Example: {"type":"IssuerPolicy","id":"http://example.com/policies/credential/4","profile":"http://example.com/profiles/credential","prohibition":[{"assigner":"https://example.edu/issuers/14","assignee":"AllVerifiers","target":"http://example.edu/credentials/3732","action":["Archival"]}]}
refreshServiceobject[]Optional

RefreshService property MUST be one or more refresh services that provides enough information to the recipient's software such that the recipient can refresh the verifiable credential.

Example: {"type":"ManualRefreshService2018","id":"https://example.edu/refresh/3732"}
evidenceobject[]Optional

Evidence property MUST be one or more evidence schemes providing enough information for a verifier to determine whether the evidence gathered by the issuer meets its confidence requirements for relying on the credential.

Example: {"type":["DocumentVerification"],"id":"https://example.edu/evidence/f2aeec97-fc0d-42bf-8ca7-0548192d4231","verifier":"https://example.edu/issuers/14","evidenceDocument":"DriversLicense","subjectPresence":"Physical","documentPresence":"Physical","licenseNumber":"123AB4567"}
Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /trust-registry/accreditation/issue?accreditationType=authorise HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 955

"issuerDid='did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0'&subjectDid='did:cheqd:testnet:2582fe17-9b25-45e4-8104-1cfca430f0c3'&schemas=[{'type':'MuseumPassCredential','url':'https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d?resourceName=MuseumPassCredentialSchema&resourceType=JsonSchemaValidator2018'}]&format='jwt'&accreditationName='authoriseAccreditation'&trustFramework='https://learn.cheqd.io/governance/start'&trustFrameworkId='cheqd Governance Framework'&parentAccreditation='did:cheqd:testnet:15b74787-6e48-4fd5-8020-eab24e990578?resourceName=accreditAccreditation&resourceType=VerifiableAccreditationToAccredit'&rootAuthorisation='did:cheqd:testnet:5RpEg66jhhbmASWPXJRWrA?resourceName=authoriseAccreditation&resourceType=VerifiableAuthorisationForTrustChain'&credentialStatus={'statusPurpose':'revocation','statusListName':'employee-credentials','statusListIndex':10}"
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://schema.org",
    "https://veramo.io/contexts/profile/v1"
  ],
  "credentialSubject": {
    "gender": "male",
    "id": "did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK",
    "name": "Bob"
  },
  "credentialStatus": {
    "id": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e?resourceName=cheqd-suspension-1&resourceType=StatusList2021Suspension#20",
    "statusIndex": 20,
    "statusPurpose": "suspension",
    "type": "StatusList2021Entry"
  },
  "issuanceDate": "2023-06-08T13:49:28.000Z",
  "issuer": {
    "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0"
  },
  "proof": {
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJkaWQ6Y2hlcWQ6dGVzdG5ldDo3YmY4MWEyMC02MzNjLTRjYzctYmM0YS01YTQ1ODAxMDA1ZTAiLCJuYmYiOjE2ODYyMzIxNjgsInN1YiI6ImRpZDprZXk6ejZNa2hhWGdCWkR2b3REa0w1MjU3ZmFpenRpR2lDMlF0S0xHcGJubkVHdGEyZG9LIiwidmMiOnsiQGNvbnRleHQiOlsiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvdjEiLCJodHRwczovL3NjaGVtYS5vcmciLCJodHRwczovL3ZlcmFtby5pby9jb250ZXh0cy9wcm9maWxlL3YxIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImdlbmRlciI6Im1hbGUiLCJuYW1lIjoiQm9iIn0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJQZXJzb24iXX19.wMfdR6RtyAZA4eoWya5Aw97wwER2Cm5Guk780Xw8H9fA3sfudIJeLRLboqixpTchqSbYeA7KbuCTAnLgXTD_Cg",
    "type": "JwtProof2020"
  },
  "type": [
    "VerifiableCredential",
    "Person"
  ]
}

Publish a verifiable accreditation for a DID.

post

Generate and publish a Verifiable Accreditation for a subject DID as a DID Linked resource.

Authorizations
Query parameters
accreditationTypestring · enumRequired

Select the type of accreditation to be issued.

Possible values:
Body

Input fields for the creating a Verifiable Accreditation.

issuerDidstringRequired

DID of the Verifiable Accreditation issuer. This needs to be a did:cheqd DID.

Example: did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0
subjectDidstringRequired

DID of the Verifiable Accreditation holder/subject. This needs to be a did:cheqd DID.

Example: did:cheqd:testnet:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK
accreditationNamestringRequired

Unique name of the Verifiable Accreditation.

attributesobjectOptional

JSON object containing the attributes to be included in the Accreditation.

@contextstring[]Optional

Optional properties to be included in the @context property of the Accreditation.

Example: ["https://schema.org/schema.jsonld","https://veramo.io/contexts/profile/v1"]
parentAccreditationstringOptional

DID URL of the parent Verifiable Accreditation, required for accredit/attest operation.

rootAuthorisationstringOptional

DID URL of the root Verifiable Accreditation, required for accredit/attest operation.

trustFrameworkstringOptional

Name or Type of the Trust Framework, required for authorise operation.

trustFrameworkIdstringOptional

Url of the Trust Framework, required for authorise operation.

typestring[]Optional

Optional properties to be included in the type property of the Accreditation.

Example: ["Person"]
expirationDatestring · date-timeOptional

Optional expiration date according to the <a href=https://www.w3.org/TR/vc-data-model/#expiration> VC Data Model specification.

Example: 2023-06-08T13:49:28.000Z
formatstring · enumOptional

Format of the Verifiable Accreditation. Defaults to VC-JWT.

Example: jwtPossible values:
termsOfUseobject[]Optional

Terms of use can be utilized by an issuer or a holder to communicate the terms under which a verifiable credential was issued.

Example: {"type":"IssuerPolicy","id":"http://example.com/policies/credential/4","profile":"http://example.com/profiles/credential","prohibition":[{"assigner":"https://example.edu/issuers/14","assignee":"AllVerifiers","target":"http://example.edu/credentials/3732","action":["Archival"]}]}
refreshServiceobject[]Optional

RefreshService property MUST be one or more refresh services that provides enough information to the recipient's software such that the recipient can refresh the verifiable credential.

Example: {"type":"ManualRefreshService2018","id":"https://example.edu/refresh/3732"}
evidenceobject[]Optional

Evidence property MUST be one or more evidence schemes providing enough information for a verifier to determine whether the evidence gathered by the issuer meets its confidence requirements for relying on the credential.

Example: {"type":["DocumentVerification"],"id":"https://example.edu/evidence/f2aeec97-fc0d-42bf-8ca7-0548192d4231","verifier":"https://example.edu/issuers/14","evidenceDocument":"DriversLicense","subjectPresence":"Physical","documentPresence":"Physical","licenseNumber":"123AB4567"}
Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /trust-registry/accreditation/issue?accreditationType=authorise HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 955

"issuerDid='did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0'&subjectDid='did:cheqd:testnet:2582fe17-9b25-45e4-8104-1cfca430f0c3'&schemas=[{'type':'MuseumPassCredential','url':'https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d?resourceName=MuseumPassCredentialSchema&resourceType=JsonSchemaValidator2018'}]&format='jwt'&accreditationName='authoriseAccreditation'&trustFramework='https://learn.cheqd.io/governance/start'&trustFrameworkId='cheqd Governance Framework'&parentAccreditation='did:cheqd:testnet:15b74787-6e48-4fd5-8020-eab24e990578?resourceName=accreditAccreditation&resourceType=VerifiableAccreditationToAccredit'&rootAuthorisation='did:cheqd:testnet:5RpEg66jhhbmASWPXJRWrA?resourceName=authoriseAccreditation&resourceType=VerifiableAuthorisationForTrustChain'&credentialStatus={'statusPurpose':'revocation','statusListName':'employee-credentials','statusListIndex':10}"
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://schema.org",
    "https://veramo.io/contexts/profile/v1"
  ],
  "credentialSubject": {
    "gender": "male",
    "id": "did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK",
    "name": "Bob"
  },
  "credentialStatus": {
    "id": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e?resourceName=cheqd-suspension-1&resourceType=StatusList2021Suspension#20",
    "statusIndex": 20,
    "statusPurpose": "suspension",
    "type": "StatusList2021Entry"
  },
  "issuanceDate": "2023-06-08T13:49:28.000Z",
  "issuer": {
    "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0"
  },
  "proof": {
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJkaWQ6Y2hlcWQ6dGVzdG5ldDo3YmY4MWEyMC02MzNjLTRjYzctYmM0YS01YTQ1ODAxMDA1ZTAiLCJuYmYiOjE2ODYyMzIxNjgsInN1YiI6ImRpZDprZXk6ejZNa2hhWGdCWkR2b3REa0w1MjU3ZmFpenRpR2lDMlF0S0xHcGJubkVHdGEyZG9LIiwidmMiOnsiQGNvbnRleHQiOlsiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvdjEiLCJodHRwczovL3NjaGVtYS5vcmciLCJodHRwczovL3ZlcmFtby5pby9jb250ZXh0cy9wcm9maWxlL3YxIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImdlbmRlciI6Im1hbGUiLCJuYW1lIjoiQm9iIn0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJQZXJzb24iXX19.wMfdR6RtyAZA4eoWya5Aw97wwER2Cm5Guk780Xw8H9fA3sfudIJeLRLboqixpTchqSbYeA7KbuCTAnLgXTD_Cg",
    "type": "JwtProof2020"
  },
  "type": [
    "VerifiableCredential",
    "Person"
  ]
}
https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e?resourceName=VerifiableAttestation&resourceType=JSONSchemaValidator2020resolver.cheqd.net
https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e?resourceName=VerifiableAccreditation&resourceType=JSONSchemaValidator2020resolver.cheqd.net

Update a did:cheqd

post
Body
didstringRequired

DID to update

Example: did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86Pattern: ^(did:cheqd:(testnet|mainnet):(?:(?:[a-zA-Z0-9]{21,22}|([a-z,0-9,-]{36,36}))*:)*((?:[a-zA-Z0-9]{21,22}|([a-z,0-9,-]{36,36}))+)((;[a-zA-Z0-9_.:%-]+=[a-zA-Z0-9_.:%-]*)*)([?][^#]*)?|did:cheqd:(testnet|mainnet):(?:(?:[a-zA-Z0-9]{21,22}|([a-z,0-9,-]{36,36}))*:)*((?:[a-zA-Z0-9]{21,22}|([a-z,0-9,-]{36,36}))+)/resources/([a-z,0-9,-]{36,36})([?][^#]*)?)$
didDocumentall ofRequired

DID Document to update

Example: {"authentication":["did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86#key-1"],"controller":["did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86"],"id":"did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86","service":[{"id":"did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86#service-1","type":"MessagingService","serviceEndpoint":["https://example.com/service"]}],"verificationMethod":[{"id":"did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86#key-1","type":"Ed25519VerificationKey2018","controller":"did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86","publicKeyMultibase":"z6Mk..."}]}
optionsobjectOptional

Additional configuration options

Example: {"network":"testnet"}
Responses
200Success
application/json
post
POST /did/cheqd/update HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 720

{
  "did": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
  "didDocument": {
    "authentication": [
      "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86#key-1"
    ],
    "controller": [
      "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86"
    ],
    "id": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
    "service": [
      {
        "id": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86#service-1",
        "type": "MessagingService",
        "serviceEndpoint": [
          "https://example.com/service"
        ]
      }
    ],
    "verificationMethod": [
      {
        "id": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86#key-1",
        "type": "Ed25519VerificationKey2018",
        "controller": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
        "publicKeyMultibase": "z6Mk..."
      }
    ]
  },
  "options": {
    "network": "testnet"
  }
}
200Success
{
  "did": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
  "didState": {
    "did": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
    "didDocument": {
      "authentication": [
        "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86#key-1"
      ],
      "controller": [
        "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86"
      ],
      "id": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
      "verificationMethod": [
        {
          "id": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86#key-1",
          "type": "Ed25519VerificationKey2020",
          "controller": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
          "publicKeyMultibase": "z6Mk..."
        }
      ]
    },
    "secret": {
      "signingResponse": [
        {
          "kid": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86#key-1",
          "signature": "SHFz..."
        }
      ]
    },
    "state": "finished"
  },
  "success": true
}

Fetch all present-proof exchange records

get
Query parameters
connection_idstringOptional

Connection identifier

Example: {"value":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}
limitintegerOptional

Number of results to return

Example: {"value":50}
offsetintegerOptional

Offset for pagination

Example: {"value":0}
rolestring · enumOptional

Role assigned in presentation exchange

Possible values:
statestring · enumOptional

Presentation exchange state

Possible values:
thread_idstringOptional

Thread identifier

Example: {"value":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}
Responses
200Success
application/json
get
GET /present-proof-2.0/records HTTP/1.1
Host: 
Accept: */*
200Success
{
  "results": [
    {
      "auto_present": false,
      "auto_remove": false,
      "auto_verify": true,
      "by_format": {
        "pres": {},
        "pres_proposal": {},
        "pres_request": {}
      },
      "connection_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "created_at": "2021-12-31T23:59:59Z",
      "error_msg": "Invalid structure",
      "initiator": "self",
      "pres": {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "@type": "https://didcomm.org/my-family/1.0/my-message-type",
        "comment": "text",
        "formats": [
          {
            "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
            "format": "dif/presentation-exchange/[email protected]"
          }
        ],
        "presentations~attach": [
          {
            "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
            "byte_count": 1234,
            "data": {
              "base64": "ey4uLn0=",
              "json": "{\"sample\": \"content\"}",
              "jws": {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0",
                "signatures": [
                  {
                    "header": {
                      "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                    },
                    "protected": "ey4uLn0",
                    "signature": "ey4uLn0"
                  }
                ]
              },
              "links": [
                "https://link.to/data"
              ],
              "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
            },
            "description": "view from doorway, facing east, with lights off",
            "filename": "IMG1092348.png",
            "lastmod_time": "2021-12-31T23:59:59Z",
            "mime-type": "image/png"
          }
        ]
      },
      "pres_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "pres_proposal": {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "@type": "https://didcomm.org/my-family/1.0/my-message-type",
        "comment": "text",
        "formats": [
          {
            "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
            "format": "dif/presentation-exchange/[email protected]"
          }
        ],
        "proposals~attach": [
          {
            "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
            "byte_count": 1234,
            "data": {
              "base64": "ey4uLn0=",
              "json": "{\"sample\": \"content\"}",
              "jws": {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0",
                "signatures": [
                  {
                    "header": {
                      "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                    },
                    "protected": "ey4uLn0",
                    "signature": "ey4uLn0"
                  }
                ]
              },
              "links": [
                "https://link.to/data"
              ],
              "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
            },
            "description": "view from doorway, facing east, with lights off",
            "filename": "IMG1092348.png",
            "lastmod_time": "2021-12-31T23:59:59Z",
            "mime-type": "image/png"
          }
        ]
      },
      "pres_request": {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "@type": "https://didcomm.org/my-family/1.0/my-message-type",
        "comment": "text",
        "formats": [
          {
            "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
            "format": "dif/presentation-exchange/[email protected]"
          }
        ],
        "request_presentations~attach": [
          {
            "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
            "byte_count": 1234,
            "data": {
              "base64": "ey4uLn0=",
              "json": "{\"sample\": \"content\"}",
              "jws": {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0",
                "signatures": [
                  {
                    "header": {
                      "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                    },
                    "protected": "ey4uLn0",
                    "signature": "ey4uLn0"
                  }
                ]
              },
              "links": [
                "https://link.to/data"
              ],
              "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
            },
            "description": "view from doorway, facing east, with lights off",
            "filename": "IMG1092348.png",
            "lastmod_time": "2021-12-31T23:59:59Z",
            "mime-type": "image/png"
          }
        ],
        "will_confirm": true
      },
      "role": "prover",
      "state": "proposal-sent",
      "thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "trace": true,
      "updated_at": "2021-12-31T23:59:59Z",
      "verified": "true",
      "verified_msgs": [
        "text"
      ]
    }
  ]
}

Fetch credentials from wallet for presentation request

get
Path parameters
pres_ex_idstringRequired

Presentation exchange identifier

Example: {"value":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}Pattern: [a-fA-F0-9]{8}-[a-fA-F0-9]{4}-4[a-fA-F0-9]{3}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}
Query parameters
countstringOptional

Maximum number to retrieve

Example: {"value":"1"}Pattern: ^[1-9][0-9]*$
extra_querystringOptional

(JSON) object mapping referents to extra WQL queries

Example: {"value":"{\"0_drink_uuid\": {\"attr::drink::value\": \"martini\"}}"}Pattern: ^{\s*".*?"\s*:\s*{.*?}\s*(,\s*".*?"\s*:\s*{.*?}\s*)*\s*}$
referentstringOptional

Proof request referents of interest, comma-separated

Example: {"value":"1_name_uuid,2_score_uuid"}
startstringOptional

Start index

Example: {"value":"0"}Pattern: ^[0-9]*$
Responses
200Success
application/json
get
GET /present-proof-2.0/records/{pres_ex_id}/credentials HTTP/1.1
Host: 
Accept: */*
200Success
[
  {
    "cred_info": {
      "attrs": {
        "ANY_ADDITIONAL_PROPERTY": "alice"
      },
      "cred_def_id": "WgWxqztrNooG92RXvxSTWv:3:CL:20:tag",
      "cred_rev_id": "12345",
      "referent": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "rev_reg_id": "WgWxqztrNooG92RXvxSTWv:4:WgWxqztrNooG92RXvxSTWv:3:CL:20:tag:CL_ACCUM:0",
      "schema_id": "WgWxqztrNooG92RXvxSTWv:2:schema_name:1.0"
    },
    "interval": {
      "from": 1640995199,
      "to": 1640995199
    },
    "presentation_referents": [
      "1_age_uuid"
    ]
  }
]

Sends a proof presentation

post
Path parameters
pres_ex_idstringRequired

Presentation exchange identifier

Example: {"value":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}Pattern: [a-fA-F0-9]{8}-[a-fA-F0-9]{4}-4[a-fA-F0-9]{3}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}
Body
anoncredsall ofOptional

Presentation specification for anoncreds

auto_removebooleanOptional

Whether to remove the presentation exchange record on completion (overrides --preserve-exchange-records configuration setting)

difall ofOptional

Optional Presentation specification for DIF, overrides the PresentationExchange record's PresRequest

indyall ofOptional

Presentation specification for indy

tracebooleanOptional

Record trace information, based on agent configuration

Responses
200Success
application/json
post
POST /present-proof-2.0/records/{pres_ex_id}/send-presentation HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 2418

{
  "anoncreds": {
    "requested_attributes": {
      "ANY_ADDITIONAL_PROPERTY": {
        "cred_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "revealed": true
      }
    },
    "requested_predicates": {
      "ANY_ADDITIONAL_PROPERTY": {
        "cred_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "timestamp": 1640995199
      }
    },
    "self_attested_attributes": {
      "ANY_ADDITIONAL_PROPERTY": "self_attested_value"
    },
    "trace": false
  },
  "auto_remove": true,
  "dif": {
    "issuer_id": "text",
    "presentation_definition": {
      "format": {
        "di_vc": {},
        "jwt": {},
        "jwt_vc": {},
        "jwt_vp": {},
        "ldp": {},
        "ldp_vc": {},
        "ldp_vp": {}
      },
      "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "input_descriptors": [
        {
          "constraints": {
            "fields": [
              {
                "filter": {
                  "const": null,
                  "enum": [],
                  "exclusiveMaximum": null,
                  "exclusiveMinimum": null,
                  "format": "text",
                  "maxLength": 1234,
                  "maximum": null,
                  "minLength": 1234,
                  "minimum": null,
                  "not": false,
                  "pattern": "text",
                  "type": "text"
                },
                "id": "text",
                "path": [
                  "text"
                ],
                "predicate": "required",
                "purpose": "text"
              }
            ],
            "is_holder": [
              {
                "directive": "required",
                "field_id": [
                  "3fa85f64-5717-4562-b3fc-2c963f66afa6"
                ]
              }
            ],
            "limit_disclosure": "text",
            "status_active": "required",
            "status_revoked": "required",
            "status_suspended": "required",
            "subject_is_issuer": "required"
          },
          "group": [
            "text"
          ],
          "id": "text",
          "metadata": {},
          "name": "text",
          "purpose": "text",
          "schema": {
            "oneof_filter": [
              [
                {
                  "uri": "https://www.w3.org/Test1#Test1"
                },
                {
                  "uri": "https://www.w3.org/Test2#Test2"
                }
              ],
              {
                "oneof_filter": [
                  [
                    {
                      "uri": "https://www.w3.org/Test1#Test1"
                    }
                  ],
                  [
                    {
                      "uri": "https://www.w3.org/Test2#Test2"
                    }
                  ]
                ]
              }
            ]
          }
        }
      ],
      "name": "text",
      "purpose": "text",
      "submission_requirements": [
        {
          "count": 1234,
          "from": "text",
          "from_nested": "[Circular Reference]",
          "max": 1234,
          "min": 1234,
          "name": "text",
          "purpose": "text",
          "rule": "all"
        }
      ]
    },
    "record_ids": {
      "<input descriptor id_1>": [
        "<record id_1>",
        "<record id_2>"
      ],
      "<input descriptor id_2>": [
        "<record id>"
      ]
    },
    "reveal_doc": {
      "@context": [
        "https://www.w3.org/2018/credentials/v1",
        "https://w3id.org/security/bbs/v1"
      ],
      "@explicit": true,
      "@requireAll": true,
      "credentialSubject": {
        "@explicit": true,
        "@requireAll": true,
        "Observation": [
          {
            "effectiveDateTime": {},
            "@explicit": true,
            "@requireAll": true
          }
        ]
      },
      "issuanceDate": {},
      "issuer": {},
      "type": [
        "VerifiableCredential",
        "LabReport"
      ]
    }
  },
  "indy": {
    "requested_attributes": {
      "ANY_ADDITIONAL_PROPERTY": {
        "cred_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "revealed": true
      }
    },
    "requested_predicates": {
      "ANY_ADDITIONAL_PROPERTY": {
        "cred_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "timestamp": 1640995199
      }
    },
    "self_attested_attributes": {
      "ANY_ADDITIONAL_PROPERTY": "self_attested_value"
    },
    "trace": false
  },
  "trace": true
}
200Success
{
  "auto_present": false,
  "auto_remove": false,
  "auto_verify": true,
  "by_format": {
    "pres": {},
    "pres_proposal": {},
    "pres_request": {}
  },
  "connection_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "created_at": "2021-12-31T23:59:59Z",
  "error_msg": "Invalid structure",
  "initiator": "self",
  "pres": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "comment": "text",
    "formats": [
      {
        "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "format": "dif/presentation-exchange/[email protected]"
      }
    ],
    "presentations~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ]
  },
  "pres_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "pres_proposal": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "comment": "text",
    "formats": [
      {
        "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "format": "dif/presentation-exchange/[email protected]"
      }
    ],
    "proposals~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ]
  },
  "pres_request": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "comment": "text",
    "formats": [
      {
        "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "format": "dif/presentation-exchange/[email protected]"
      }
    ],
    "request_presentations~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ],
    "will_confirm": true
  },
  "role": "prover",
  "state": "proposal-sent",
  "thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "trace": true,
  "updated_at": "2021-12-31T23:59:59Z",
  "verified": "true",
  "verified_msgs": [
    "text"
  ]
}

Create a new connection invitation

post
Query parameters
auto_acceptbooleanOptional

Auto-accept connection (defaults to configuration)

create_unique_didbooleanOptional

Create unique DID for this invitation (default false)

multi_usebooleanOptional

Create invitation for multiple use (default false)

Body
acceptstring[]Optional

List of mime type in order of preference that should be use in responding to the message

Example: ["didcomm/aip1","didcomm/aip2;env=rfc19"]
aliasstringOptional

Alias for connection

Example: Barry
goalstringOptional

A self-attested string that the receiver may want to display to the user about the context-specific goal of the out-of-band message

Example: To issue a Faber College Graduate credential
goal_codestringOptional

A self-attested code the receiver may want to display to the user or use in automatically deciding what to do with the out-of-band message

Example: issue-vc
handshake_protocolsstring[]Optional

Handshake protocol to specify in invitation

mediation_idstringOptional

Identifier for active mediation record to be used

Example: 3fa85f64-5717-4562-b3fc-2c963f66afa6Pattern: [a-fA-F0-9]{8}-[a-fA-F0-9]{4}-4[a-fA-F0-9]{3}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}
metadataobjectOptional

Optional metadata to attach to the connection created with the invitation

my_labelstringOptional

Label for connection invitation

Example: Invitation to Barry
protocol_versionstringOptional

OOB protocol version

Example: 1.1
use_didstringOptional

DID to use in invitation

Example: did:example:123
use_did_methodstring · enumOptional

DID method to use in invitation

Example: did:peer:2Possible values:
use_public_didbooleanOptional

Whether to use public DID in invitation

Responses
200Success
application/json
post
POST /out-of-band/create-invitation HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 475

{
  "accept": [
    "didcomm/aip1",
    "didcomm/aip2;env=rfc19"
  ],
  "alias": "Barry",
  "attachments": [
    {
      "id": "attachment-0",
      "type": "present-proof"
    }
  ],
  "goal": "To issue a Faber College Graduate credential",
  "goal_code": "issue-vc",
  "handshake_protocols": [
    "https://didcomm.org/didexchange/1.0"
  ],
  "mediation_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "metadata": {},
  "my_label": "Invitation to Barry",
  "protocol_version": "1.1",
  "use_did": "did:example:123",
  "use_did_method": "did:peer:2",
  "use_public_did": false
}
200Success
{
  "created_at": "2021-12-31T23:59:59Z",
  "invi_msg_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "invitation": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "accept": [
      "didcomm/aip1",
      "didcomm/aip2;env=rfc19"
    ],
    "goal": "To issue a Faber College Graduate credential",
    "goal_code": "issue-vc",
    "handshake_protocols": [
      "https://didcomm.org/didexchange/1.0"
    ],
    "imageUrl": "http://192.168.56.101/img/logo.jpg",
    "label": "Bob",
    "requests~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ],
    "services": [
      {
        "did": "WgWxqztrNooG92RXvxSTWv",
        "id": "string",
        "recipientKeys": [
          "did:key:z6MkpTHR8VNsBxYAAWHut2Geadd9jSwuBV8xRoAnwWsdvktH"
        ],
        "routingKeys": [
          "did:key:z6MkpTHR8VNsBxYAAWHut2Geadd9jSwuBV8xRoAnwWsdvktH"
        ],
        "serviceEndpoint": "http://192.168.56.101:8020",
        "type": "string"
      },
      "did:sov:WgWxqztrNooG92RXvxSTWv"
    ]
  },
  "invitation_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "invitation_url": "https://example.com/endpoint?c_i=eyJAdHlwZSI6ICIuLi4iLCAiLi4uIjogIi4uLiJ9XX0=",
  "oob_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "state": "await_response",
  "trace": true,
  "updated_at": "2021-12-31T23:59:59Z"
}

Fetch all credential exchange records

get
Query parameters
connection_idstringOptional

Connection identifier

Example: {"value":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}
limitintegerOptional

Number of results to return

Example: {"value":50}
offsetintegerOptional

Offset for pagination

Example: {"value":0}
rolestring · enumOptional

Role assigned in credential exchange

Possible values:
statestring · enumOptional

Credential exchange state

Possible values:
thread_idstringOptional

Thread identifier

Example: {"value":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}
Responses
200Success
application/json
get
GET /issue-credential-2.0/records HTTP/1.1
Host: 
Accept: */*
200Success
{
  "results": [
    {
      "cred_ex_record": {
        "auto_issue": false,
        "auto_offer": false,
        "auto_remove": false,
        "by_format": {
          "cred_issue": {},
          "cred_offer": {},
          "cred_proposal": {},
          "cred_request": {}
        },
        "connection_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "created_at": "2021-12-31T23:59:59Z",
        "cred_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "cred_issue": {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "@type": "https://didcomm.org/my-family/1.0/my-message-type",
          "comment": "text",
          "credentials~attach": [
            {
              "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "byte_count": 1234,
              "data": {
                "base64": "ey4uLn0=",
                "json": "{\"sample\": \"content\"}",
                "jws": {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0",
                  "signatures": [
                    {
                      "header": {
                        "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                      },
                      "protected": "ey4uLn0",
                      "signature": "ey4uLn0"
                    }
                  ]
                },
                "links": [
                  "https://link.to/data"
                ],
                "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
              },
              "description": "view from doorway, facing east, with lights off",
              "filename": "IMG1092348.png",
              "lastmod_time": "2021-12-31T23:59:59Z",
              "mime-type": "image/png"
            }
          ],
          "formats": [
            {
              "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "format": "aries/[email protected]"
            }
          ],
          "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
        },
        "cred_offer": {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "@type": "https://didcomm.org/my-family/1.0/my-message-type",
          "comment": "text",
          "credential_preview": {
            "@type": "issue-credential/2.0/credential-preview",
            "attributes": [
              {
                "mime-type": "image/jpeg",
                "name": "favourite_drink",
                "value": "martini"
              }
            ]
          },
          "formats": [
            {
              "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "format": "aries/[email protected]"
            }
          ],
          "offers~attach": [
            {
              "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "byte_count": 1234,
              "data": {
                "base64": "ey4uLn0=",
                "json": "{\"sample\": \"content\"}",
                "jws": {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0",
                  "signatures": [
                    {
                      "header": {
                        "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                      },
                      "protected": "ey4uLn0",
                      "signature": "ey4uLn0"
                    }
                  ]
                },
                "links": [
                  "https://link.to/data"
                ],
                "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
              },
              "description": "view from doorway, facing east, with lights off",
              "filename": "IMG1092348.png",
              "lastmod_time": "2021-12-31T23:59:59Z",
              "mime-type": "image/png"
            }
          ],
          "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
        },
        "cred_preview": {
          "@type": "issue-credential/2.0/credential-preview",
          "attributes": [
            {
              "mime-type": "image/jpeg",
              "name": "favourite_drink",
              "value": "martini"
            }
          ]
        },
        "cred_proposal": {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "@type": "https://didcomm.org/my-family/1.0/my-message-type",
          "comment": "text",
          "credential_preview": {
            "@type": "issue-credential/2.0/credential-preview",
            "attributes": [
              {
                "mime-type": "image/jpeg",
                "name": "favourite_drink",
                "value": "martini"
              }
            ]
          },
          "filters~attach": [
            {
              "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "byte_count": 1234,
              "data": {
                "base64": "ey4uLn0=",
                "json": "{\"sample\": \"content\"}",
                "jws": {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0",
                  "signatures": [
                    {
                      "header": {
                        "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                      },
                      "protected": "ey4uLn0",
                      "signature": "ey4uLn0"
                    }
                  ]
                },
                "links": [
                  "https://link.to/data"
                ],
                "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
              },
              "description": "view from doorway, facing east, with lights off",
              "filename": "IMG1092348.png",
              "lastmod_time": "2021-12-31T23:59:59Z",
              "mime-type": "image/png"
            }
          ],
          "formats": [
            {
              "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "format": "aries/[email protected]"
            }
          ]
        },
        "cred_request": {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "@type": "https://didcomm.org/my-family/1.0/my-message-type",
          "comment": "text",
          "formats": [
            {
              "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "format": "aries/[email protected]"
            }
          ],
          "requests~attach": [
            {
              "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "byte_count": 1234,
              "data": {
                "base64": "ey4uLn0=",
                "json": "{\"sample\": \"content\"}",
                "jws": {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0",
                  "signatures": [
                    {
                      "header": {
                        "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                      },
                      "protected": "ey4uLn0",
                      "signature": "ey4uLn0"
                    }
                  ]
                },
                "links": [
                  "https://link.to/data"
                ],
                "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
              },
              "description": "view from doorway, facing east, with lights off",
              "filename": "IMG1092348.png",
              "lastmod_time": "2021-12-31T23:59:59Z",
              "mime-type": "image/png"
            }
          ]
        },
        "error_msg": "The front fell off",
        "initiator": "self",
        "parent_thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "role": "issuer",
        "state": "done",
        "thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "trace": true,
        "updated_at": "2021-12-31T23:59:59Z"
      },
      "indy": {
        "created_at": "2021-12-31T23:59:59Z",
        "cred_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "cred_ex_indy_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "cred_id_stored": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "cred_request_metadata": {},
        "cred_rev_id": "12345",
        "rev_reg_id": "WgWxqztrNooG92RXvxSTWv:4:WgWxqztrNooG92RXvxSTWv:3:CL:20:tag:CL_ACCUM:0",
        "state": "active",
        "updated_at": "2021-12-31T23:59:59Z"
      },
      "ld_proof": {
        "created_at": "2021-12-31T23:59:59Z",
        "cred_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "cred_ex_ld_proof_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "cred_id_stored": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "state": "active",
        "updated_at": "2021-12-31T23:59:59Z"
      },
      "vc_di": {
        "auto_issue": false,
        "auto_offer": false,
        "auto_remove": false,
        "by_format": {
          "cred_issue": {},
          "cred_offer": {},
          "cred_proposal": {},
          "cred_request": {}
        },
        "connection_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "created_at": "2021-12-31T23:59:59Z",
        "cred_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "cred_issue": {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "@type": "https://didcomm.org/my-family/1.0/my-message-type",
          "comment": "text",
          "credentials~attach": [
            {
              "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "byte_count": 1234,
              "data": {
                "base64": "ey4uLn0=",
                "json": "{\"sample\": \"content\"}",
                "jws": {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0",
                  "signatures": [
                    {
                      "header": {
                        "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                      },
                      "protected": "ey4uLn0",
                      "signature": "ey4uLn0"
                    }
                  ]
                },
                "links": [
                  "https://link.to/data"
                ],
                "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
              },
              "description": "view from doorway, facing east, with lights off",
              "filename": "IMG1092348.png",
              "lastmod_time": "2021-12-31T23:59:59Z",
              "mime-type": "image/png"
            }
          ],
          "formats": [
            {
              "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "format": "aries/[email protected]"
            }
          ],
          "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
        },
        "cred_offer": {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "@type": "https://didcomm.org/my-family/1.0/my-message-type",
          "comment": "text",
          "credential_preview": {
            "@type": "issue-credential/2.0/credential-preview",
            "attributes": [
              {
                "mime-type": "image/jpeg",
                "name": "favourite_drink",
                "value": "martini"
              }
            ]
          },
          "formats": [
            {
              "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "format": "aries/[email protected]"
            }
          ],
          "offers~attach": [
            {
              "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "byte_count": 1234,
              "data": {
                "base64": "ey4uLn0=",
                "json": "{\"sample\": \"content\"}",
                "jws": {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0",
                  "signatures": [
                    {
                      "header": {
                        "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                      },
                      "protected": "ey4uLn0",
                      "signature": "ey4uLn0"
                    }
                  ]
                },
                "links": [
                  "https://link.to/data"
                ],
                "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
              },
              "description": "view from doorway, facing east, with lights off",
              "filename": "IMG1092348.png",
              "lastmod_time": "2021-12-31T23:59:59Z",
              "mime-type": "image/png"
            }
          ],
          "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
        },
        "cred_preview": {
          "@type": "issue-credential/2.0/credential-preview",
          "attributes": [
            {
              "mime-type": "image/jpeg",
              "name": "favourite_drink",
              "value": "martini"
            }
          ]
        },
        "cred_proposal": {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "@type": "https://didcomm.org/my-family/1.0/my-message-type",
          "comment": "text",
          "credential_preview": {
            "@type": "issue-credential/2.0/credential-preview",
            "attributes": [
              {
                "mime-type": "image/jpeg",
                "name": "favourite_drink",
                "value": "martini"
              }
            ]
          },
          "filters~attach": [
            {
              "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "byte_count": 1234,
              "data": {
                "base64": "ey4uLn0=",
                "json": "{\"sample\": \"content\"}",
                "jws": {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0",
                  "signatures": [
                    {
                      "header": {
                        "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                      },
                      "protected": "ey4uLn0",
                      "signature": "ey4uLn0"
                    }
                  ]
                },
                "links": [
                  "https://link.to/data"
                ],
                "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
              },
              "description": "view from doorway, facing east, with lights off",
              "filename": "IMG1092348.png",
              "lastmod_time": "2021-12-31T23:59:59Z",
              "mime-type": "image/png"
            }
          ],
          "formats": [
            {
              "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "format": "aries/[email protected]"
            }
          ]
        },
        "cred_request": {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "@type": "https://didcomm.org/my-family/1.0/my-message-type",
          "comment": "text",
          "formats": [
            {
              "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "format": "aries/[email protected]"
            }
          ],
          "requests~attach": [
            {
              "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "byte_count": 1234,
              "data": {
                "base64": "ey4uLn0=",
                "json": "{\"sample\": \"content\"}",
                "jws": {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0",
                  "signatures": [
                    {
                      "header": {
                        "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                      },
                      "protected": "ey4uLn0",
                      "signature": "ey4uLn0"
                    }
                  ]
                },
                "links": [
                  "https://link.to/data"
                ],
                "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
              },
              "description": "view from doorway, facing east, with lights off",
              "filename": "IMG1092348.png",
              "lastmod_time": "2021-12-31T23:59:59Z",
              "mime-type": "image/png"
            }
          ]
        },
        "error_msg": "The front fell off",
        "initiator": "self",
        "parent_thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "role": "issuer",
        "state": "done",
        "thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "trace": true,
        "updated_at": "2021-12-31T23:59:59Z"
      }
    }
  ]
}

Send issuer a credential request

post
Path parameters
cred_ex_idstringRequired

Credential exchange identifier

Example: {"value":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}Pattern: [a-fA-F0-9]{8}-[a-fA-F0-9]{4}-4[a-fA-F0-9]{3}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}
Body
auto_removebooleanOptional

Whether to remove the credential exchange record on completion (overrides --preserve-exchange-records configuration setting)

holder_didstringOptional

Holder DID to substitute for the credentialSubject.id

Example: did:key:ahsdkjahsdkjhaskjdhakjshdkajhsdkjahs
Responses
200Success
application/json
post
POST /issue-credential-2.0/records/{cred_ex_id}/send-request HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 80

{
  "auto_remove": true,
  "holder_did": "did:key:ahsdkjahsdkjhaskjdhakjshdkajhsdkjahs"
}
200Success
{
  "auto_issue": false,
  "auto_offer": false,
  "auto_remove": false,
  "by_format": {
    "cred_issue": {},
    "cred_offer": {},
    "cred_proposal": {},
    "cred_request": {}
  },
  "connection_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "created_at": "2021-12-31T23:59:59Z",
  "cred_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "cred_issue": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "comment": "text",
    "credentials~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ],
    "formats": [
      {
        "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "format": "aries/[email protected]"
      }
    ],
    "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
  },
  "cred_offer": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "comment": "text",
    "credential_preview": {
      "@type": "issue-credential/2.0/credential-preview",
      "attributes": [
        {
          "mime-type": "image/jpeg",
          "name": "favourite_drink",
          "value": "martini"
        }
      ]
    },
    "formats": [
      {
        "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "format": "aries/[email protected]"
      }
    ],
    "offers~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ],
    "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
  },
  "cred_preview": {
    "@type": "issue-credential/2.0/credential-preview",
    "attributes": [
      {
        "mime-type": "image/jpeg",
        "name": "favourite_drink",
        "value": "martini"
      }
    ]
  },
  "cred_proposal": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "comment": "text",
    "credential_preview": {
      "@type": "issue-credential/2.0/credential-preview",
      "attributes": [
        {
          "mime-type": "image/jpeg",
          "name": "favourite_drink",
          "value": "martini"
        }
      ]
    },
    "filters~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ],
    "formats": [
      {
        "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "format": "aries/[email protected]"
      }
    ]
  },
  "cred_request": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "comment": "text",
    "formats": [
      {
        "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "format": "aries/[email protected]"
      }
    ],
    "requests~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ]
  },
  "error_msg": "The front fell off",
  "initiator": "self",
  "parent_thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "role": "issuer",
  "state": "done",
  "thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "trace": true,
  "updated_at": "2021-12-31T23:59:59Z"
}

Store a received credential

post
Path parameters
cred_ex_idstringRequired

Credential exchange identifier

Example: {"value":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}Pattern: [a-fA-F0-9]{8}-[a-fA-F0-9]{4}-4[a-fA-F0-9]{3}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}
Body
credential_idstringOptional
Responses
200Success
application/json
post
POST /issue-credential-2.0/records/{cred_ex_id}/store HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 24

{
  "credential_id": "text"
}
200Success
{
  "cred_ex_record": {
    "auto_issue": false,
    "auto_offer": false,
    "auto_remove": false,
    "by_format": {
      "cred_issue": {},
      "cred_offer": {},
      "cred_proposal": {},
      "cred_request": {}
    },
    "connection_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "created_at": "2021-12-31T23:59:59Z",
    "cred_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "cred_issue": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "credentials~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ],
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/[email protected]"
        }
      ],
      "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
    },
    "cred_offer": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "credential_preview": {
        "@type": "issue-credential/2.0/credential-preview",
        "attributes": [
          {
            "mime-type": "image/jpeg",
            "name": "favourite_drink",
            "value": "martini"
          }
        ]
      },
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/[email protected]"
        }
      ],
      "offers~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ],
      "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
    },
    "cred_preview": {
      "@type": "issue-credential/2.0/credential-preview",
      "attributes": [
        {
          "mime-type": "image/jpeg",
          "name": "favourite_drink",
          "value": "martini"
        }
      ]
    },
    "cred_proposal": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "credential_preview": {
        "@type": "issue-credential/2.0/credential-preview",
        "attributes": [
          {
            "mime-type": "image/jpeg",
            "name": "favourite_drink",
            "value": "martini"
          }
        ]
      },
      "filters~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ],
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/[email protected]"
        }
      ]
    },
    "cred_request": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/[email protected]"
        }
      ],
      "requests~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ]
    },
    "error_msg": "The front fell off",
    "initiator": "self",
    "parent_thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "role": "issuer",
    "state": "done",
    "thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "trace": true,
    "updated_at": "2021-12-31T23:59:59Z"
  },
  "indy": {
    "created_at": "2021-12-31T23:59:59Z",
    "cred_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "cred_ex_indy_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "cred_id_stored": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "cred_request_metadata": {},
    "cred_rev_id": "12345",
    "rev_reg_id": "WgWxqztrNooG92RXvxSTWv:4:WgWxqztrNooG92RXvxSTWv:3:CL:20:tag:CL_ACCUM:0",
    "state": "active",
    "updated_at": "2021-12-31T23:59:59Z"
  },
  "ld_proof": {
    "created_at": "2021-12-31T23:59:59Z",
    "cred_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "cred_ex_ld_proof_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "cred_id_stored": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "state": "active",
    "updated_at": "2021-12-31T23:59:59Z"
  },
  "vc_di": {
    "auto_issue": false,
    "auto_offer": false,
    "auto_remove": false,
    "by_format": {
      "cred_issue": {},
      "cred_offer": {},
      "cred_proposal": {},
      "cred_request": {}
    },
    "connection_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "created_at": "2021-12-31T23:59:59Z",
    "cred_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "cred_issue": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "credentials~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ],
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/[email protected]"
        }
      ],
      "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
    },
    "cred_offer": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "credential_preview": {
        "@type": "issue-credential/2.0/credential-preview",
        "attributes": [
          {
            "mime-type": "image/jpeg",
            "name": "favourite_drink",
            "value": "martini"
          }
        ]
      },
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/[email protected]"
        }
      ],
      "offers~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ],
      "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
    },
    "cred_preview": {
      "@type": "issue-credential/2.0/credential-preview",
      "attributes": [
        {
          "mime-type": "image/jpeg",
          "name": "favourite_drink",
          "value": "martini"
        }
      ]
    },
    "cred_proposal": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "credential_preview": {
        "@type": "issue-credential/2.0/credential-preview",
        "attributes": [
          {
            "mime-type": "image/jpeg",
            "name": "favourite_drink",
            "value": "martini"
          }
        ]
      },
      "filters~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ],
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/[email protected]"
        }
      ]
    },
    "cred_request": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/[email protected]"
        }
      ],
      "requests~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ]
    },
    "error_msg": "The front fell off",
    "initiator": "self",
    "parent_thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "role": "issuer",
    "state": "done",
    "thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "trace": true,
    "updated_at": "2021-12-31T23:59:59Z"
  }
}

Deactivate a did:cheqd

post
Body
didstringRequired

DID to deactivate

Example: did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86Pattern: ^(did:cheqd:(testnet|mainnet):(?:(?:[a-zA-Z0-9]{21,22}|([a-z,0-9,-]{36,36}))*:)*((?:[a-zA-Z0-9]{21,22}|([a-z,0-9,-]{36,36}))+)((;[a-zA-Z0-9_.:%-]+=[a-zA-Z0-9_.:%-]*)*)([?][^#]*)?|did:cheqd:(testnet|mainnet):(?:(?:[a-zA-Z0-9]{21,22}|([a-z,0-9,-]{36,36}))*:)*((?:[a-zA-Z0-9]{21,22}|([a-z,0-9,-]{36,36}))+)/resources/([a-z,0-9,-]{36,36})([?][^#]*)?)$
optionsobjectOptional

Additional configuration options

Example: {"network":"testnet"}
Responses
200Success
application/json
post
POST /did/cheqd/deactivate HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 96

{
  "did": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
  "options": {
    "network": "testnet"
  }
}
200Success
{
  "did": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
  "didState": {
    "did": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
    "didDocument": {
      "authentication": [
        "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86#key-1"
      ],
      "controller": [
        "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86"
      ],
      "id": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
      "verificationMethod": [
        {
          "id": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86#key-1",
          "type": "Ed25519VerificationKey2020",
          "controller": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
          "publicKeyMultibase": "z6Mk..."
        }
      ]
    },
    "secret": {
      "signingResponse": [
        {
          "kid": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86#key-1",
          "signature": "SHFz..."
        }
      ]
    },
    "state": "finished"
  },
  "success": true
}

Create a did:cheqd

post
Body
featuresobjectOptional

Additional features to enable for the did.

Example: {}
optionsobjectOptional

Additional configuration options

Example: {"key_type":"ed25519","method_specific_id_algo":"uuid","network":"testnet"}
Responses
200Success
application/json
post
POST /did/cheqd/create HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 103

{
  "features": "{}",
  "options": {
    "key_type": "ed25519",
    "method_specific_id_algo": "uuid",
    "network": "testnet"
  }
}
200Success
{
  "did": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
  "didState": {
    "did": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
    "didDocument": {
      "authentication": [
        "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86#key-1"
      ],
      "controller": [
        "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86"
      ],
      "id": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
      "verificationMethod": [
        {
          "id": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86#key-1",
          "type": "Ed25519VerificationKey2020",
          "controller": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
          "publicKeyMultibase": "z6Mk..."
        }
      ]
    },
    "secret": {
      "signingResponse": [
        {
          "kid": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86#key-1",
          "signature": "SHFz..."
        }
      ]
    },
    "state": "finished"
  },
  "success": true,
  "verkey": "BnSWTUQmdYCewSGFrRUhT6LmKdcCcSzRGqWXMPnEP168"
}

List wallet DIDs

get
Query parameters
didstringOptional

DID of interest

Example: {"value":"did:peer:WgWxqztrNooG92RXvxSTWv"}Pattern: ^(did:sov:)?[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{21,22}$|^did:([a-zA-Z0-9_]+)(:[a-zA-Z0-9_.%-]+)?:([a-zA-Z0-9_.%-]+(:[a-zA-Z0-9_.%-]+)*)((;[a-zA-Z0-9_.:%-]+=[a-zA-Z0-9_.:%-]*)*)(\/[^#?]*)?([?][^#]*)?(\#.*)?$$
key_typestring · enumOptional

Key type to query for.

Example: {"value":"ed25519"}Possible values:
methodstringOptional

DID method to query for. e.g. sov to only fetch indy/sov DIDs

Example: {"value":"key"}
posturestring · enumOptional

Whether DID is current public DID, posted to ledger but current public DID, or local to the wallet

Example: {"value":"wallet_only"}Possible values:
verkeystringOptional

Verification key of interest

Example: {"value":"H3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV"}Pattern: ^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{43,44}$
Responses
200Success
application/json
get
GET /wallet/did HTTP/1.1
Host: 
Accept: */*
200Success
{
  "results": [
    {
      "did": "did:peer:WgWxqztrNooG92RXvxSTWv",
      "key_type": "ed25519",
      "metadata": {},
      "method": "sov",
      "posture": "wallet_only",
      "verkey": "H3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV"
    }
  ]
}