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...
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...
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.
Head to our cheqd Studio and click Get Started.
Email and password
Google single sign-on
Discord login
Click Sign In or Create Account to continue.
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.
Get started with our tutorials for cheqd Studio functionality.
cheqd Studio uses a to handle user authentication and login. You can create an account or sign in using:
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 as a payments processor and users will need to input their card information to initiate a billing plan.
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
Get started with cheqd's API product offering for creating DIDs, trust registries and monetising credentials: cheqd Studio.
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.
With cheqd Studio, there are multiple ways it can be deployed and hosted to support clients with different requirements.
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.
Within Custodian mode, we also enable clients to toggle
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.
Below are a list of alternatives for integrating with cheqd. Each offers a different set of protocols and underlying technical capabilities.
Get started with cheqd's identity functionality and product offerings.
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:
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.
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.
cheqd supports a wide array of standards and protocols via different Software Development Kits (SDKs) and integrations.
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:
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:
Please reach out to us there for discussions, help, and feedback on the project.
cheqd Studio directly leverages our , making a wide array of features available from launch, including:
We use similar techniques to Password Managers such as and to ensure that even if the database were to be compromised, the keys would remain encrypted and unusable.
We use a self-hosted version of , which supports OpenID Connect. Theoretically, these values could also be replaced with or any other OpenID Connect identity provider.
Default role update using : 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.
Under the hood, cheqd Studio leverages our for its identity functionality. Check out our to understand how cheqd Studio fits together with our other Open Source packages.
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.
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 alongside other commonly adopted DID methods.
Under the hood, cheqd Studio utilises the , providing the most feature complete set of functionality and tooling.
If you'd rather build a deeper integration or lower level package, we've created a simple diagram to show how our packages are structured below.
The is our primary chat channel for the open-source community, software developers, and node operators.
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.
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:
Get started with the setup of your AI Agent Trust Registry using the guides below:
Read through some of our guides below to getting setup with trust registries on cheqd:
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.
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.
Follow the tutorial here to get started with your cheqd Studio account.
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.
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.
Get started with our tutorials for cheqd Studio functionality.
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:
Creating, Updating or Deactivating DIDs
Creating unencrypted or encrypted Status Lists
Creating Trust Registries
Creating other DID-Linked Resources
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.
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:
Once you have successfully created an account and have topped up your CHEQ tokens, you are ready to get started!
Get started with our tutorials for cheqd Studio functionality.
Fully conformant Digital identifiers for establishing a root of trust in a given ecosystem. Utilising .
Setup encrypted Status Lists and other Resources with , allowing issuers to set a price for verifying a Credential Status.
Fully conformant Verifiable Credentials for establishing trust. Supporting JSON, JSON-LD, SD-JWT and AnonCreds through cheqd APIs and via cheqd's Partners.
Simple setup for building cheqd DIDs into existing applications using REST APIs, building into the .
Service for resolving cheqd DIDs and DID URLs. Feature complete with query-based DID URL dereferencing. Full integration and driver within the .
First you need to which is able to hold CHEQ tokens. We recommend using which natively supports all CHEQ transactions in a browser plugin or on mobile. Alternatively, follow the .
You will then need to .
This is super simple. You can add free CHEQ tokens to your cheqd_account by inputting your cheqd account address. Access the .
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.
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.
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.
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.
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:
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.
Issue the compiled credential using the cheqd studio API enpoint below:
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.
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!
Design, Build and Validate Trust Registries for AI Agents on cheqd.
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:
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.
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.
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.
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:
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.
Therefore, relying parties can query the accreditations of AI Agents all the way back to a Root of Trust.
Below are a series of use cases to which this solution architecture can be applied:
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”
Read through some of our guides below to getting setup with trust registries on cheqd:
Advanced setup guide for running the cheqd Studio.
This standalone service uses an in-memory database with no persistence, and therefore is recommended only if you're managing key/secret storage separately.
Construct the postgres URL and configure the env variables mentioned above.
POSTGRES_USER
: Username for Postgres database
POSTGRES_PASSWORD
: Password for Postgres database
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:
Then, run the LogTo service to configure the LogTo application API resources, applications, sign-in experiences, roles etc using Docker Compose:
Then, start the service using Docker Compose:
When upgrading either the external Veramo KMS or LogTo, you might need to run migrations for the underlying databases.
For example, to run cheqd Studio app migrations on an existing Postgres database (for external Veramo KMS):
Or to run LogTo migrations on an existing Postgres database:
Use the cheqd MCP server to provision your AI Agent its own DID.
⚠️ Before you begin...
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".
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.
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.
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.
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.
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.
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.
The simplest way to get started with MCP and Trust Registry verification is to use our hosted remote MCP server.
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.
If you prefer to run the MCP server locally, with more control on the configuration and environment variables, you can run locally using docker.
Get the docker-compose.yaml
specially designed for Claude Desktop:
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.
Add the following configuration to your claude_desktop_config.json or .cursor/mcp.json
When successfully started, the MCP tools will be available.
Once configured, you can interact with the Trust Registry through Claude by:
Using the verify-trust-registry
tool to verify credentials against the Trust Registry
Running a verification check for a cheqd DID or credential
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
As described in , you should have already designed and published schemas for your AI Agent ecosystem.
If you want to run the application without any external databases or dependent services, we provide to spin up a standalone service.
The in the same folder contains all the environment variables necessary to configure the service. (See section Configuration above.)
Spinning up a Docker container from the is as simple as the command below:
Configure the environment variables in the :
Configure the environment variables in the with the settings described in section above.
Configuring LogTo is outside the scope of this guide, and we recommend reading to familiarise yourself.
Configure the environment variables in the 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.
You can run just the migration scripts using defined in the Compose file.
To build your own image using Docker, use the provided.
Make sure you have configured the .
In the background, Claude is communicating with our MCP Server which relays a request to one of our SDKs, . Using Credo, the AI Agent creates itself a DID that conforms to the .
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.
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:
An MCP Compatible Desktop based AI Agent. We have tested with .
For detailed usage examples, refer to our .
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.
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
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...
Although, either agents can start the connection, in this tutorial we will start the invite from Holder.
Parameters and Request Body
For automated acceptance, pass the following parameters:
A simple request body is below:
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.
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.
Parameters
Filter on "offer-received" state
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.
Advanced functionality for cheqd's MCP Server.
We have built additional functionality into the MCP Server for other use cases, including:
Accept a JWT Credential into the AI Agent's wallet.
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:
Verify and validate your AI Agent's trust with cheqd's MCP server and TRAIN.
⚠️ Before you begin...
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:
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:
Make sure you have configured the .
Our contains "demo" profile, which includes a Holder ACA-py Agent setup. Start the Holder Agent with the following command
Open the Holder API at or use Postman, to create a new connection request. Copy the invitation_url
from the response.
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 or Postman.
As per 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 will include a JWT token in the proof
section.
In the background, Claude is communicating with our MCP Server which relays a request to one of our SDKs, . Using Credo, the AI Agent imports a Credential into the identity wallet associated with itself.
Make sure you have configured the .
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.
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...
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.
Parameters
To narrow down the latest proof request, pass the following parameters
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.
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.
Make sure you have configured the and from the same MCP Client.
If the connection was disrupted, between the Holder and Claude Desktop.
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 or Postman.
Resolve a did:cheqd Decentralized Identifier (DID) to fetch the associated DID Document, using cheqd Studio.
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.
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.
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.
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.
cheqd DIDs are also supported in a range of SaaS offerings from cheqd partners, making it possible to use did:cheqd
across different platforms:
DIDs created on cheqd use the did:cheqd
DID Method. This is fully defined below, as well as the associated ledger-write fees:
Learn about DIDs If you want to .
Create Issuer DID
Create an Issuer DID using the did:cheqd DID method over REST API.
Create Subject DID
Create an off-ledger Subject DID using the did:key
DID method.
Resolve DID
Resolve a DID to retrieve the associated DID Document.
Deactivate a did:cheqd Decentralized Identifier (DID) using cheqd Studio.
Users are also able to deactivate DID Documents to prevent further updates and to provide client applications the relevant information that the DID Document is no longer actively used.
A /did/deactivate
request must be signed by all of the Verification Method keys listed in the DID Document.
Create holder Decentralized Identifiers (DIDs), of method did:key, and associated identity keys using cheqd Studio.
Issuers may want to create identity keypairs for multiple reasons, such as for signing payloads or for creating did:key
DIDs.
There is also an option to fetch an identity keypair by inputting a Key ID (kid) as a request format.
cheqd Studio currently supports one types of subject
DIDs:
did:key
With the former, you can follow the to create a subject DID based on a generated keypair.
Simple setup for building cheqd DIDs into existing applications using REST APIs, building into the .
Walt.id Community Stack is an SDK that supports the standards for identity, with cheqd DID support.
I want to set up a Trust Registry for my AI Agent
I want to verify the trust in AI Agents I am using
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.
The user is able to set verification parameters to filter whether they want to verify certain aspects of a Credential, including:
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:
Whether the Credential has been tampered
Whether the Credential has a valid issuance date
Whether the Credential has expired
Whether the Credential Status is valid
Create an issuer Decentralized Identifier (DID) with the did:cheqd DID method using cheqd Studio.
To create a cheqd DID (did:cheqd
) and associated DID Document there are two ways of building the payload for the request:
Make sure you have set up your account with cheqd Studio and are logged in, using our guide below:
Using the /did/create
API, users have two options for creating a did:cheqd
DID and associated DID Document on-ledger:
Filling out a simple form using the application/x-www-url-form-encoded
or application/json
option within an API client of your choice.
Compiling a full DID Document body yourself using the application/json
option, using already created identity keys, within an API client of your choice.
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 the application/x-www-url-form-encoded
option, users are able to choose between the following variables to compile your DID:
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.
Alternatively, you can use the application/json
option and pass only a few specific inputs, for example:
Or, if you have created a keypair already that you want to use, you can reference that in the request:
Within the /did/create
JSON payload, paste the response of your DID Document template, with your own signing keys.
Request format:
Hit execute on the API below to create your did:cheqd
DID and associated DID Document.
After creating a DID or multiple DIDs, users can list all the created DIDs associated with their account. Using the /did/list
API.
Below are a list of alternatives for creating cheqd DIDs.
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:
The specific section(s) of the DID Document to be updated; or
The full updated DID Document body.
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.
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.
The example above will rotate the keys that control the DID Document, updating the DID Document's verificationMethod
and authentication
sections accordingly.
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.
Use the /did/update
API below to pass your DID Document update as a request, using either the full body or a specific section.
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.
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.
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:
Paste the Credential Body or JWT into the API below and execute the API to revoke the 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.
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.
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:
Paste the Credential Body or JWT into the API below and execute the API to suspend the Credential.
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.
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.
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:
Paste the Credential Body or JWT into the API below and execute the API to unsuspend the Credential.
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.
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:
You can use SaaS products from our partners to create best-in-class credential ecosystems, built on cheqd
cheqd supports all four major digital Credential types via its selection of SDKs and APIs. Below you can learn about these Credential formats:
Depending on what type of credentials you want to use, choose the SDK that suits your tech stack:
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.
Make sure you have set up your account with cheqd Studio and are logged in, using our guide below:
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:
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:
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:
Filling out a simple form using the application/x-www-url-form-encoded
option within an API client of your choice.
Compiling a Credential body yourself using the application/json
option within an API client of your choice.
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:
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:
Instead of using simple form variables, you can issue a Verifiable Credential using a JSON payload with the application/json
option.
Below is an example of the request format for issuing a Verifiable Credential using a custom JSON payload, including some of the possible parameters:
Execute the API below to issue a Verifiable Credential, signed by your issuer DID.
Below are a list of alternatives for using Credentials with cheqd support. Each offers a different set of protocols and underlying technical capabilities.
t
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.
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.
The user is able to set verification parameters to filter whether they want to verify certain aspects of a Presentation, including:
Use the API below to verify a Presentation
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.
Make sure you have set up your account with cheqd Studio and are logged in, using our guide below:
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.
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!
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.
This schema can be always retrieved from the cheqd ledger at:
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.
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
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:
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.
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.
Use the following request format:
You can use the API below to make this transaction, using the parameter 'authorise'.
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.
For a trusted ecosystem, these attestations are required to trace the legitimacy of a credential issuer to a root-of-trust.
If you just want to accredit the subordinate DID to issue credentials to your AI Agent, use a Verifiable Accreditation to Attest.
For a trusted ecosystem, these attestations are required to trace the legitimacy of a credential issuer to a root-of-trust.
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:
To verify a Credential, you can either pass the full Credential body or the JWT proof. These can be either obtained from a or from a Verifiable Presentation presented to the user.
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 to input the key material into the DID document.
Use the to generate a new keypair within the Credential Service key management store. Copy the "publicKeyHex".
To simplify this process of formatting a DID Document using your own keys, we've created a . Simply paste in your publicKeyHex and choose the variables to compile your DID Document template.
Learn about Verifiable Credentials and Presentations
If you want to learn more about what
Make sure you've and created your first DID, then you can start to:
This is the DID of the Credential issuer, created in . This needs to be a did:cheqd
DID. For example:
This is the DID of the Credential subject, created in . This needs to be a did:key
or did:vda
DID. For example:
These are the claims or attributes attested to within the Verifiable Credential. This must be a JSON object, following the . For example:
This is an optional property that defines semantic information about the Credential, conforming to the . For example:
This is an optional property that defines information about the type of Verifiable Credential, conforming to the . For example:
This is an optional property that defines information about the expiration date of a Verifiable Credential, conforming to the . For example:
Note that this is the same for and for . For example:
Using POST
Set Up Your Account
Set up your account with cheqd Studio and get your API key to start using the APIs.
"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
"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
"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
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.
AnonCreds
AnonCreds is a credential format maintained by the Hyperledger Foundation, with functionality for zero knowledge proofs (ZKPs) and selective disclosure.
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.
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
cheqd Cosmos CLI
Cosmos CLI which directly communicates with the cheqd network. This should only be used for testing environments.
✔️
✔️
✔️
✔️
✔️
✔️
✔️
✔️
✔️
✔️
❌
✔️
✔️
❌
❌
❌
✔️
⌛(roadmap)
⌛(roadmap)
✔️
Setup your Verida Wallet to receive W3C Verifiable Credentials.
cheqd Studio currently is setup to work with the Verida Wallet. In 2024, we will be building compatibility with a full suite of other digital identity wallets.
On the "Profile" tab, you will see your did:vda
address under the section "DID".
For example: "did:vda:testnet:0xD7477C4a75143Af16A967381d09650A533Bd0DD7"
A scannable QR code
The profile icon of the Verida DID that issued / signed the credential
A tick of approval indicating the credential has been verified
Understand how privacy is protected throughout the credential payment flow.
There are multiple areas within this flow where privacy needs to be maintained:
Verifier pays Issuer: Any payment for decrypting a Status List should not be correlatable to a Holder presenting or sharing a Credential.
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.
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.
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.
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.
Using cheqd Studio, you can get started setting up your encrypted Status Lists with Access Control Conditions below:
t
Understand how cheqd's Payment Rails work with 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.
For Credential Payments, the predominant Access Control Condition is a payment made from the Verifier of a Credential back to the Issuer.
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:
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.
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:
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.
Using cheqd Studio, you can get started setting up your encrypted Status Lists with Access Control Conditions below:
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.
Create encrypted Status Lists on-ledger, and pay to unlock the Access Control Conditions in CHEQ, using our cheqd Studio Payments APIs:
Build your understanding of How Credential Payments work, including Access Control Conditions and how the model preserves privacy.
Below are a list of alternatives for using Credential Payments.
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 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:
Make sure you have set up your account with cheqd Studio and are logged in, using our guide below:
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:
Using the /credential-status/create/encrypted
API, users have two options for creating an encrypted Status List on-ledger:
Filling out a simple form using the application/x-www-url-form-encoded
option on the Swagger UI.
Compiling a Status List payload yourself using the application/json
option on the Swagger UI.
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:
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.
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.
An example of the JSON payload needed to be submitted is below:
The table below expands on some of the required parameters:
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.
The following code snippet shows an example of an encrypted Status List response format, which will be published to the ledger:
Simple setup for building cheqd DIDs into existing applications using REST APIs, building into the .
JSON based JWT Verifiable Credential ()
JSON-LD Verifiable Credential ()
AnonCreds ()
Selective Disclosure-JWT Credential ()
Credo is an SDK which and regular Verifiable Credentials natively with cheqd support.
Walt.id SSI Kit is an SDK that supports the standards for identity, with full cheqd support.
Credentials stored with the will automatically be rendered in the Verida Wallet as a credential. This custom display includes:
cheqd's implementation of Credential Payments uses encrypted (such as a Status Lists), with Payment Conditions required to unlock. Learn about cheqd's Access Control Condition logic below:
Status List construction: Credential information within Status List should not constitute .
The , which cheqd encrypts with payment conditions, utilises 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 is revoked, if it is 0 (zero) it is not revoked.
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 as well as a .
The expands on these privacy considerations.
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 ().
When , a user will have the following options:
For the purpose of this tutorial, we will assume the user is creating an encrypted Status List. For unencrypted Status Lists, .
Enter the Decentralized Identifier (DID) of the Status List publisher . For example:
Note: it is important to save the response, including the "encryptedSymmetricKey
" locally, as this will be used for .
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 , without being able to see the contents of the Status List itself.
Access Control Conditions
Understand how cheqd gates encrypted resources using payment conditions and Access Control logic.
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.
"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.
"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.
"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.
Verida wallet
Download the Verida wallet to receive credentials issued by cheqd Studio to a did:vda
address.
Learn about establishing Root Authorisations for Trust Registries on cheqd.
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.
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
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
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
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.
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
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.
Make sure you have set up your account with cheqd Studio and are logged in, using our guide below:
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:
Follow the tutorial here to create an encrypted Status List with a set of Payment Conditions to unlock:
Follow the instructions within the /credential/create
API below to format and issue a Verifiable Credential.
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.
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:
Using the /credential-status/check
API, users have two options for checking whether a particular Credential index is revoked or suspended:
Filling out a simple form using the application/x-www-url-form-encoded
option on the Swagger UI.
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:
To automatically make a payment to an Issuer in order to verify an encrypted Status List, there is an additional variable:
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.
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.
The response format below will indicate clearly whether the check is successful and whether the Credential index in question is revoked / suspended or not.
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.
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.
This payment should be made in CHEQ.
cheqd Studio will perform a verification check on the Credential Status and pay the issuer the fee specified in the Payment Conditions.
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:
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 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
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:
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.
Learn about Decentralized Trust Chains (DTCs) on cheqd.
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.
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
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.
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.
There are many terms used within this guide, and as such, familiarise yourself or refer back to the concepts within the glossary below:
-
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
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.
Trust is delegated top-down through Verifiable Accreditations:
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.
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.
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).
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
)
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
)
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 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:
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
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
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 Chains are constructed from three verifiable building blocks:
Define the rules of the ecosystem
Issued by the rTAO as a VerifiableAuthorisationForTrustChain
Reference the root governance framework
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
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
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
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.
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.
Make sure you have already created at least one Verifiable Accreditation that you are able to query in the verify API.
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:
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:
The Root TAO can also set polices known as the AccreditationPolicy
within the termsOfUse
section of the Verifiable Accreditation.
Whereby:
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
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:
The credentialSubject
section outlines what the SubTAO is accredited to do — including supported credential types, relevant schemas, and jurisdictional constraints.
Whereby:
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:
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:
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.
Make sure you have set up your account with cheqd Studio and are logged in, using our guide below:
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:
Verifiable Accreditations are JSON objects that take the form of the Verifiable Credential data model. There are three types of Verifiable Accreditation:
For each accreditation type, the user will need to use a different request format for the API.
For a trusted ecosystem, these attestations are required to trace the legitimacy of a credential issuer to a root-of-trust.
For a trusted ecosystem, these attestations are required to trace the legitimacy of a credential issuer to a root-of-trust.
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:
Here, the "resourceURI
" specifies the DID URL of the specific Verifiable Accreditation that was created.
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
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
Set up your Decentralized Trust Chain (DTC) on cheqd.
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:
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.
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.
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.
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
Each TAO may issue Verifiable Accreditations to one or more Trusted Issuers, who are responsible for issuing actual Verifiable Credentials to end-users.
Each entity is linked by a signed Verifiable Accreditation, and all references point back to the initial Root Authorisation for Trust Chain.
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.
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
This optional step is highly recommended if your governance model involves domain ownership or if trust must be externally verifiable.
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
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:
Root TAOs can set permissions under which TAOs must abide. This creates a level of codified governance for the trust ecosystem.
Field descriptions:
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.
Whereby:
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:
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
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.
termsOfUse
The termsOfUse
field uses the AttestationPolicy
type and typically includes:
AttestationPolicy
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.
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.
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.
Here’s a simplified example of the request body TRAIN accepts:
TRAIN returns a response like this:
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.
Ensure that the "statusListName
" and "statusPurpose
" are the same as the Status List . 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.
Using one of , Verifiers can make a payment of the amount specified in the "feePaymentAmount"
to the "feePayerAddress"
.
🤝 Interoperability with tools like , which can validate trust chains using DNS lookups
Verify Credential
Verify a W3C Verifiable Credential using the cheqd Studio APIs.
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.
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.
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.
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
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
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
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
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
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
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.
"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
"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
"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
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.
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
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
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
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
Decentralized Trust Chains (DTCs)
Build using our Trust Registry solution using DIDs and DID-Linked Resources based on the EBSI Trust Chain model.
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.
Use Trust Registries for AI Agents
Design, build and validate trust registries for AI Agents using cheqd's APIs and our MCP Server.
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.
Figure 1: Graphic showing the Bitstring Status List bitstring
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.
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.
Make sure you have set up your account with cheqd Studio and are logged in, using our guide below:
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:
Using the /credential-status/create/unencrypted
API, users have two options for creating an encrypted Status List on-ledger:
Filling out a simple form using the application/x-www-url-form-encoded
option within an API client of your choice.
Compiling a Status List payload yourself using the application/json
option within an API client of your choice.
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:
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.
An example of the JSON payload needed to be submitted is below:
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.
Anchor Decentralized Identifiers (DIDs) in DNS records and validate Decentralized Trust Chains (DTCs) using TRAIN.
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.
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
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
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
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:
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.
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
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
Anchor rTAO in DNS
🌐 TDZM
Manage trust zones
🛠️ TDZM Backend & UI
Define & delegate trust
📜 Verifiable Accreditations
Validate credentials
🔎 TRAIN Trust Validator (TTV)
By combining DNS-based assurance with credential-level verification, the TRAIN infrastructure provides a flexible and scalable solution for decentralized trust governance.
Deploy the DNS Zone Manager and anchor your Root DID in a DNS Zone.
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.
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)
You can deploy TDZM in two ways:
Locally using Docker Compose
In a Kubernetes Cluster using Helm charts
This is the easiest way to run TDZM for development and testing.
Navigate to the deploy/local
directory in the TDZM repository.
Run the deployment script:
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
TDZM can be deployed in a Kubernetes cluster using Helm charts for both the backend and UI.
Kubernetes cluster with Nginx Ingress Controller
TLS certificates available as Kubernetes secrets OR A Let’s Encrypt cert issuer setup via Ingress
Before TDZM can manage your trust zone, you must configure your DNS provider:
NS Record in the parent zone pointing to your TDZM instance Example:
A Record resolving the nameserver to your TDZM server’s IP Example:
These records must be added in the parent zone (e.g., federation1.com
) for your trust zone to be valid (trust.federation1.com
).
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).
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
Once TDZM is running and DNS is delegated:
Add a TXT record under your trust zone with the content linking your rTAO DID to the domain.
Example DNS entry:
This DNS record will allow TRAIN to resolve and validate the rTAO’s DID during trust chain verification.
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
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).
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.
Use the TRAIN APIs below to validate your trust chain:
TRAIN's Trust Validator (TTV) validates credentials by:
Taking a Verifiable Credential (VC) as input.
Identifying the issuer DID from the credential.
Following the credential's trust chain, resolving links between DIDs, Verifiable Accreditations, and Trust Anchors.
Verifying whether the top-level (root) entity in the chain is a trusted source (e.g., DNS-anchored entity, government body, industry group).
Producing a trust assessment (e.g., valid/invalid, verified/unverified) that can be consumed by relying parties.
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.
When TRAIN evaluates a credential issued within cheqd's ecosystem, it performs the following checks:
Credential Verification Validates the signature and schema of the input Verifiable Credential.
Trust Chain Resolution
Follows the termsOfUse
field and associated VerifiableAccreditation
resources to build the credential’s trust chain.
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).
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).
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).
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.
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" ]
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:
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
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.
Below is a sequence diagram showing how a request is fully validated.
Create, update and fetch Status Lists on cheqd, stored as a 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.
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.
There are two predominant Status List formats supported in cheqd Studio. Please choose a Status List type below to get started.
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 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.
Users are able to filter by:
Execute the filters from Step 1 on the API below:
Update a Token Status List JWT or CWT as a new DID-Linked Resource (DLR), using cheqd Studio.
Create a JWT or CWT file with the updated indices and bits for the updated Status List.
Save this file locally and call it something like statusListTokenUPDATED.json
Prepare a file with resource and encode it into base64, base64url
or hex
. On Unix systems, you can use the following command input:
Expected output:
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:
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.
Using the /credential-status/check
API, users have two options for checking whether a particular Credential index is revoked or suspended:
Filling out a simple form using the application/x-www-url-form-encoded
option on the Swagger UI.
Compiling a DID Document body 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:
To automatically make a payment to an Issuer in order to verify an encrypted Status List, follow the tutorial here:
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:
Execute the API request using the API below:
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.
Make sure you have set up your account with cheqd Studio and are logged in, using our guide below:
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:
Token Status Lists are JWT or CWT files that reference lists of bits formatted in JSON or CBOR.
Save this file locally and call it something like statusListToken.json
Prepare a file with resource and encode it into base64, base64url
or hex
. On Unix systems, you can use the following command input:
Expected output:
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:
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.
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:
Here, the "resourceURI
" specifies the DID URL of the specific Token Status List that was created.
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
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
The Bitstring Status List supported in cheqd Studio utilise 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 is revoked, if it is 0 (zero) it is not revoked.
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 as well as a .
cheqd stores each Status List and subsequent entries on-ledger as versions. This has notable benefits, including the provenance, legitimacy and security of the Status List. For a full list of benefits, see .
When , a user will have the following options:
For the purpose of this tutorial, we will assume the user is creating an unencrypted Status List. For encrypted Status Lists, .
Enter the Decentralized Identifier (DID) of the Status List publisher . For example:
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.
TDZM Backend:
TDZM UI:
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.
The .
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
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.
Deploy TRAIN and Anchor rTAO in DNS
Add high assurance to your root DID, anchoring it within a DNS record.
TRAIN TTV API
Validate your Trust Chain using the TRAIN Trust Validator APIs.
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.
Set up Trust Chain
Design and build a trust chain for establishing a trust hierarchy in your ecosystem.
Validate Trust Chain
Validate Trust Chain to a root of trust using the TRAIN Trust Validator (TTV).
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.
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.
Create DID-Linked Resources (DLRs) linked to cheqd Decentralized Identifiers (DIDs).
Below are a list of alternatives for creating cheqd DID-Linked Resources.
cheqd DID-Linked Resources are supported in SaaS offerings from cheqd partners, making it possible to use did:cheqd DLRs across different platforms:
Read up on our identity write pricing for cheqd Mainnet below:
Understand how to reference a DID-Linked Resource (DLR) within the body of a W3C Verifiable Credential.
Once created, issuers of Verifiable Credentials may want to reference resources within the body of issued Verifiable Credentials.
Schemas;
Status lists;
Trust registries;
Visual Representations of Verifiable Credentials;
Documents; or
Logos
within the contents of Verifiable Credentials themselves.
Below is an example of a Verifiable Credential for an IIW event ticket which includes a fully qualified DID URL for the schema and logo, using resources on-ledger.
The schema in the above Credential dereferences to the following data:
Understanding the context and construction of DID-Linked Resources (DLRs) on cheqd.
Read the guides below to understand the context, rationale and design decisions involved in the DID-Linked Resource (DLR) implementation on cheqd.
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:
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:
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:
Schemas
Credential Definitions
Trust Registries
Status Lists
Logos associated with DIDs
Governance files
Make sure you have set up your account with cheqd Studio and are logged in, using our guide below:
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:
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:
Save this file locally and call it something like resource.json.
Prepare a file with resource and encode it into base64, base64url
or hex
. On Unix systems, you can use the following command input:
Expected output:
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.
Understand the context and design decisions around why cheqd developed DID-Linked Resources (DLRs).
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
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.
Such visual representations can also be used to quickly communicate information visually during identity exchanges, such as airline mobile boarding passes.
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.
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.
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:
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.
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.
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.
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.
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.
We took the following design principles into consideration, along with an explanation of how we addressed them:
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.
Protection against linkrot for long-term retrieval: Any Resource stored on-ledger is replicated across multiple nodes.
If any individual node or endpoint is down, lookup requests can be sent to any other node on the network.
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.
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.
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?"
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?"
Understand the technical composition of DID-Linked Resources (DLRs) on cheqd.
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.
Figure 1: DID-linked Resource DID URL path
This will be explained further in the section on DID URL dereferencing to fetch a resource.
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
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.
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:
Generate a new, unique UUID for the Resources
Specify the same Collection ID as the unique identifier of the parent DID
Sign the createResource
transaction with the Verification Method keys of the parent DID.
This is shown in the diagram below:
Figure 3: Relationship between a DID and DID-linked Resource
Example of createResource
transaction using Veramo SDK:
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:
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:
The following list defines which specific parameters a resource request format may contain:
resourceUri
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.
The following list defines which specific parameters a resource response format may contain:
resourceUri
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.
Let’s take a look at a fully resolved output response for a DID with a Collection and single associated Resource:
Let’s take a look at a fully resolved output response for a DID with a Collection and multiple associated Resources:
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.
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:
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.
IMPORTANT: DID URL queries should be fully qualified so that they uniquely identify a single resource, or single resource version unless expressly specified.
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.
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.
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
)
Credo supports two approaches to creating a DID:
Use when you want full control over the DID structure and already have key(s) in your wallet.
Use when you want Credo to create the DID Document from a key you specify in secret
.
method
*: cheqd
secret
options
*
didDocument
First, generate a key pair:
Use that key to construct and register the DID Document:
📝 Make sure the
publicKeyBase58
matches the key in your wallet. The DID will be written to thetestnet
unless you specify"mainnet"
inoptions.network
.
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.
🔐 Credo will generate the DID Document using the key referenced in
secret
and publish it to the network.
Now that your DID is live on the cheqd network, try:
Understand cheqd's SDK suite and choose the best fit for your project.
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.
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.
Choose one of our SDKs below and started building cheqd into your existing or new product:
Credo SDK with cheqd support for Decentralized Identifiers (DIDs), DID-Linked Resources (DLRs) and Credentials.
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.
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.
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
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 setup with your Credo agent and begin using cheqd's functionality below:
Credo supports the following Credential formats:
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.
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
To enable cheqd in your agent, install the required package:
This package provides everything needed to register, resolve, and interact with did:cheqd
identifiers and AnonCreds objects.
If you're using React Native, additional steps are needed to support cosmjs
:
cosmjs-rn
packagesUpdate your package.json
using npm overrides or Yarn resolutions:
Example (NPM overrides
):
Example (Yarn resolutions
):
Install the buffer
package:
Create a shim.js
file:
Then, import this shim in your entry point (e.g. before your App.tsx
is rendered):
After installing the dependencies, we can register the cheqd module on the agent by adding the below code snippet to the agent constructor.
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:
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.
"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.
As mentioned in the section on , this may be useful for referencing:
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 .
In self-sovereign identity (SSI) ecosystems, “resources” are often required in tandem with , to provide supporting information or additional context to verifiers receiving .
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:
Prominent examples of this include , , etc.
Status lists allow recipients of a Verifiable Credential exchange to for validity. Prominent examples of this include the specification, , etc.
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.
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:
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.
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.
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).
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 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" 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: )
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.
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.
"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".
Note that the Collection ID may take the syntactical form of a 'Hyperledger Indy' DID identifier or may be a . This is described in the .
Any (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 .
A 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.
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
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
For more information about the particulars of requests and responses, please refer to our .
To enable combined resolution/dereferencing behavior, cheqd are defining multiple query-based parameters to fetch resource
or associated metadata. If a specification supports these parameters, and if a using that method includes the parameter with a valid value, then when a resolver calls the associated using that , the VDR returns the identified digital resource, not the .
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.
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.
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.
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.
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.
Create DID-Linked Resource
Associate DID-Linked Resources to your DID using Credo.
Issue Verifiable Credentials
Issue Credentials using your cheqd DID using Credo.
Godiddy
Godiddy from Danube Tech is a DID-specific SaaS offering focussed on enterprise registration and resolution of DIDs across multiple methods.
Truvera (Dock)
Truvera is a full platform that supports credential issuance and management using cheqd as the primary DID Method.
Identity Write Pricing
Click here to understand the price of DIDs and DID-Linked Resources on cheqd, compared to other identity networks.
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.
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
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
did
✅
The full did:cheqd
identifier you wish to deactivate
options
❌
Optional settings, including a versionId
to track the update
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
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
).
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
💡 The
id
field must be a UUIDv4. You are responsible for generating and tracking this ID.
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
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.
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
To update a did:cheqd
, you must:
Fetch the current DID Document
Modify the relevant fields (e.g., add keys, update service endpoints)
Submit the updated DID Document using agent.dids.update(...)
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)
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 SDK Plugin
The Veramo SDK Plugin is an extension of the Veramo SDK, a JavaScript framework for Trusted Data, adding support for cheqd functionality.
DID Registrar
cheqd Cosmos CLI
Cosmos-native CLI for creating transactions on cheqd. Should be used for testing purposes only.
✔️
✔️
✔️
✔️
cheqd Credential Payments
❌
✔️
❌
❌
❌
✔️
✔️
✔️
✔️
✔️
✔️
✔️
✔️
❌
✔️
❌
✔️
⌛(roadmap)
✔️
✔️
✔️
✔️
✔️
❌
✔️
❌
✔️
❌
✔️
✔️
✔️
❌
✔️
✔️
✔️
❌
✔️
❌
✔️
❌
✔️
❌
✔️
❌
✔️
❌
✔️
❌
✔️
⌛(roadmap)
❌
✔️
✔️
⌛(roadmap)
❌
✔️
✔️
⌛(roadmap)
❌
✔️
❌
✔️
✔️
✔️
✔️
❌
✔️
✔️
✔️
❌
✔️
❌
✔️
❌
✔️
❌
✔️
❌
✔️
❌
✔️
❌
✔️
❌
✔️
✔️
✔️
✔️
✔️
❌
✔️
❌
DID-Linked Trust Registries
❌
⌛(roadmap)
⌛(roadmap)
❌
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.
Below are a list of alternatives for creating cheqd DIDs.
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:
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.
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
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
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
Below are a list of SDK alternatives for creating cheqd DID-Linked Resources.
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...
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.
Create an Credential Definition as a DID-Linked Resource on cheqd for issuing AnonCreds.
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.
The request body must contain the credential_definition
object with the Issuer DID and the Schema ID created in the previous steps.
Issue Verifiable Credentials with Credo, signed by cheqd Decentralized Identifiers (DIDs).
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.
Before you begin, make sure you have:
A registered did:cheqd
identifier for the Issuer
A Credential Schema and Credential Definition already created and published as DID-Linked Resources
A Credo Agent 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
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.
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:
Generate a credential offer and send to the holder, informing them about the available credential and its attributes.
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
.
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.
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
After connection is established, the Verifier can send a proof request to the Holder.
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.
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
)
Simple setup for building cheqd DIDs into existing applications using REST APIs, building into the .
Create cheqd DIDs ()
JSON based JWT Verifiable Credential ()
JSON-LD Verifiable Credential ()
AnonCreds ()
Selective Disclosure-JWT Credential ()
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) ()
OpenID for Verifiable Credential Issuance ()
OpenID for Verifiable Credential Presentations ()
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 ()
Walt.id Community Stack is an SDK that supports the standards for identity, with cheqd DID support.
Learn about DIDs If you want to learn about what
For a comprehensive list and detailed explanations of these parameters, refer to .
Make sure you've correctly configured .
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 .
To enable revocation, the options
must contain the revocation flag, and the size of the revocation registry. Also, ensure that a is configured for the issuer.
Learn about Verifiable Credentials and Presentations
If you want to learn more about what
Use any supported method to create a connection with the Holder of the credential. Automated is recommended.
Use any supported method to create a connection with the Holder. Automated is recommended. You can follow the same steps as described in .
For more tutorials and examples, visit .
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.
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.
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
cheqd Cosmos CLI
Cosmos-native CLI for creating transactions on cheqd. Should be used for testing purposes only.
cheqd Studio
Our API product enables users to use cheqd's functionality with minimal complexity and easily integrate APIs into existing apps.
DID Registrar
Veramo
The Veramo SDK plugin supports JSON, JSON-LD credentials as well as cheqd Credential Payments in an SDK.
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.
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.
To deactivate an active DID, pass the did
id in the request body, with any additional options
that you may have configured.
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.
To update an existing DID, you must pass the did
id and the complete didDocument
in the request body. The main field that is updated using this method os the service
object of the DID.
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.
Below are a list of SDK alternatives for creating cheqd DIDs.
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...
For wallet storage, utilise a Postgres database to ensure key persistence, enabling future updates to the DID.
Populate the various options
and features
in the JSON request body and call the API to create the DID.
These are the variables that can be passed in the Body:
After creating a DID or multiple DIDs, users can list all the created DIDs associated with their wallet. Using the /wallet/did
API.
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.
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 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 as the backing ledger
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.
The cheqd plugin for ACA-Py supports dynamic DID registration via the Universal Registrar. This provides a streamlined interface for managing multiple DID methods.
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 setup with your ACA-Py agent and begin using cheqd's functionality below:
Set up your ACA-Py agent to start using cheqd.
Before you begin, ensure you have a DID registrar and resolver running.
For mainnet, you must run your own cheqd DID registrar driver with the correct mnemonic configuration. Details are provided below.
Add the following under services
section of your docker-compose file.
Set the environment variables.
Run the driver.
The Cheqd Registrar must be run as driver-did-cheqd
because the Universal Registrar is configured with that name by default.
Add the following under services
section of your docker-compose file.
Start the Universal Registrar Service.
Confirm that the Cheqd Driver properties are correct and matches your settings.
To run your own DID Resolver, the following settings must be added to your docker-compose file
Add the following under services
section of your docker-compose file.
Run the resolver.
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.
plugin-config.yml
:Update the URLs if you have your hosted versions or using the Universal Resolver.
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.
When starting ACA-Py, ensure that the wallet-type
is set to askar
. Example:
Using PostgreSQL as a wallet storage backend is recommended for scalability and data persistence.
Install PostgreSQL and create a database for ACA-Py.
Configure ACA-Py to use PostgreSQL, add the following to ./configs/settings.yml
:
Start ACA-Py with PostgreSQL-backed wallet storage.
Example Dockerfile:
Build the ACA-Py Agent docker image with the plugin.
Deploy the agent. Sample docker-compose is below.
Run the Agent.
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.
Create a Credential Definition as a DID-Linked Resource (DLR) on cheqd for issuing AnonCreds.
Issue and present Verifiable Credentials, signed by cheqd Decentralized Identifiers (DIDs), using ACA-Py.
Present a Verifiable Credential, signed by a did:cheqd Decentralized Identifier (DID), using ACA-Py.
Using the /present-proof-2.0
API endpoints, it is possible to present Verifiable Credentials, signed by a cheqd DID, in a few clicks or lines of code. This process enables secure and trustworthy sharing of verifiable credentials within the ACA-Py framework and cheqd ecosystem.
After connection is established, the Verifier can send a proof request to the Holder.
The request body will depend on the credential, but here is a sample.
Holder can get the stored credentials from own wallet and format a proof to send to the Verifier.
Verifier receives the presentation via the connection, and can use the following API to verify. The response must have verified: true
.
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 .
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 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.
Simple setup for building cheqd DIDs into existing applications using REST APIs, building into the .
Learn about DIDs If you want to learn about what
Make sure you've correctly for ACA-Py.
For testnet, you can use the (with cheqd driver) and a .
All sample configs and docker-compose files are available .
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 .
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 .
Where all the plugin settings are populated in ./configs/settings.yml
, a sample file is .
To enable revocation, the options
must contain the revocation flag, and the size of the revocation registry. Also, ensure that a is configured for the issuer.
Learn about Verifiable Credentials and Presentations
If you want to learn more about what
Use any supported method to create a connection with the Holder. Automated is recommended. You can follow the same steps as described in .
"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.
The request body must contain the schema
object, which defines the attributes, name and version of the Schema. This will create a of type anonCredsSchema
.
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.
cheqd Agent Setup
Setup the ACA-Py agent with cheqd plugin.
Create cheqd DIDs
Use the agent to create cheqd DIDs.
Create DID-Linked Resources
Create a DID-Linked Resource (DLR) linked to a cheqd DID.
Issue a Credential
Issue a Verifiable Credential using ACA-Py agent with did:cheqd
.
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.
Revoke a Verifiable Credential, signed by a did:cheqd Decentralized Identifier (DID), using ACA-Py.
Revoking credentials is crucial for maintaining control over issued credentials and preventing misuse in the cheqd ecosystem. To revoke credentials within the ACA-Py framework, follow these steps:
The Issuer must determine the credential that needs to be revoked by getting the list of issued credentials and the connection id.
Initiate the credential revocation process by supplying the necessary credential identifiers like the connection id and the credential exchange id.
Veramo SDK plugin with cheqd support for Decentralized Identifiers (DIDs), DID-Linked Resources (DLRs) and Credentials.
Utilise cheqd's identity functionality through the Veramo SDK Plugin by installing the Veramo CLI and getting started below:
We chose to build a cheqd plugin into Veramo SDK for a few key reasons.
Design Principles — The Veramo SDK was designed to be highly flexible and modular making it highly scalable and fit for a lot of complex workflows. As a result, we felt it offered a route to minimise how much needs to be built from scratch. Through its flexible plug-in system, it’s easy to pick and choose which plug-ins are most beneficial, plus it’s possible to add in our custom packages where required which we knew would be necessary from Cosmos-based transactions.
Developer Experience — The Veramo SDK has been designed in a way that offers a fast end-to-end process. Ultimately, at cheqd, we want to reduce the amount of time our team spends on SDKs and so we can maintain our focus on building ledger functionality (i.e. building our implementation of the revocation registry and the credentials payment rails).
Attractive & Simple CLI — The Veramo core API is exposed by its CLI which makes it easy to create DIDs and VCs directly from a terminal or local cloud agent.
Platform Agnostic — The Veramo packages run on Node, Browsers and React & React Native right out of the box.
Veramo provides an excellent foundation for clients that want to build verifiable data applications. This is because Veramo Core, the Veramo CLI and any specific plugins are available as NPM packages, enabling:
Identity functionality to be carried out through a native CLI interface; or
Identity functionality to be integrated directly into client applications through NPM packages.
Using the DID-Provider-cheqd package, we have also been able to reuse identity functionality and abstract the complexity of cheqd/SDK and cheqd Network in less complex packages.
New DID creation can also be done by passing a full-body DIDoc payload in JSON, rather than having to assemble the document field-by-field.
This package works alongside other base Veramo packages:
The @cheqd/sdk
package adds Cosmos SDK specific functionality such as signing transactions, paying for ledger fees, etc.
You can use our Veramo plugin in non-CLI contexts as well, for example, for integrating into custom applications
Depending on the type of application you are looking to develop, you will need to install a different set of packages.
For other applications, see:
Note: Depending on your system permissions, you might be prompted for additional permissions. Add sudo
to the beginning of the command in case that happens.
Verify the installation was correct. Command below should output latest version of veramo you installed.
did-provider-cheqd
packageInstall the did-provider-cheqd
NPM package in a similar fashion:
You can check all of your NPM package versions by running the command:
agent.yml
configuration fileYou can do this in terminal through:
agent.yml
file in an editor to customise the configYou can open the agent.yml
in a text editor/IDE of your choice to edit a few mandatory settings.
In terminal, you can edit the agent.yml
file using an editor like nano
:
Make sure you provide the actual relative/absolute path to the file.
By default, the did-provider-cheqd
package has a default SQLite database password, but it's a good idea to modify and change this to a new key unique to your install.
Take the key generated and replace the value under dbEncryptionKey
in the agent.yml
file.
The default value is set to resolver.cheqd.net
, which is an instance of the cheqd DID Resolver hosted by the cheqd team. This DID Resolver instance can handle requests for did:cheqd:mainnet
as well as did:cheqd:testnet
namespaces.
If you want, you can replace the url
property with a different REST API endpoint for a different instance of the cheqd DID Resolver.
Note: This configuration is an advanced step and not recommended for most users. Skip it and continue to the next step in most cases, unless you know why you want to switch the resolver interface.
Firstly, comment out the custom did-cheqd-resolver
entry and uncomment the universal-resolver
entry. This tells Veramo CLI to use the Universal Resolver interface for did:cheqd
.
Also comment out this section for the did-cheqd-resolver
:
Finally, uncomment and configure the universal-resolver
interface:
In order to add cheqd-testnet to your Keplr extension, please follow the following instructions:
You need to configure this in under didManager
section as shown above, where you'll need to edit:
defaultProvider
: The default cheqd network is set to did:cheqd:testnet
to allow developers to test out network functionality. However, if you prefer, you can switch this out to did:cheqd:mainnet
instead.
agent.yml
file and exitMake sure all your edits above are persisted and saved to a file that you can access.
Once you've completed Step 2 above, verify that your Veramo configuration is accurate using the following command. If your configuration is correct, you should get a success message like the one below.
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.
DID Registrar
Simple setup for building cheqd DIDs into existing applications using REST APIs, building into the .
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 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.
cheqd Cosmos CLI
Cosmos-native CLI for creating transactions on cheqd. Should be used for testing purposes only.
This endpoint returns the custodian-mode client details for authenticated users.
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.
Key ID of the identity key pair to fetch.
This endpoint returns the list of DIDs controlled by the account.
Follow the steps to to verify that the credential has been successfully revoked. The response should have verified: false
.
is a modular and pluggable client app SDK for decentralised identity and SSI applications. Our Veramo plugin - the - enables developers to interact with the cheqd ledger using Veramo SDK.
This package includes for use with the . It can also be consumed as an NPM package outside Veramo CLI for building your own applications with NPM.
The package's core functionality is borrowed from and extends this to include cheqd ledger functionality, such as creating and managing DIDs.
did-provider-cheqd
is the first Veramo SDK plug-in that utilises the DID Manager Update method to offer a full-body DIDDoc update for a DID on cheqd ledger, rather than individual field update transactions used more commonly in other DID methods such as .
Learn how to network
Our provides step-by-step instructions on how to configure your installation for cheqd network
Figure 1: Veramo SDK for cheqd architecture with components ()
did-provider-cheqd
consumes functionality that exists within the in a way that complies to the Veramo AbstractIdentifierProvider
. (You don't need to call this package separately as it's already included as a dependency in package.json
.)
For identity-related keys, this plugin uses to manage keys for create and update operations.
Find out about .
Our natively supports the following Credential formats:
We provide a quick-start .
If you're looking to use the Veramo CLI with cheqd or develop a proof-of-concept application, use the .
Node version recommended Nodev16
. You can install Node
This step is exactly :
Download the file that contains the configuration for cheqd network to be used with Veramo CLI.
Note: Alternatively, you can also fetch this by the repository.
In order to be able to read/query did:cheqd
entries from the ledger, you need to configure a REST API endpoint for a instance.
If you plan on interacting with multiple DID methods using Veramo CLI, you can alternatively query did:cheqd
using instead. This allows your CLI configuration to handle .
Go to , then replace everything with cheqd-testnet json configuration below.
While reading/querying from the cheqd ledger incurs no cost, if you want to to cheqd ledger, you need to pay transaction fees for the ledger writes.
cosmosPayerMnemonic
: . This is only stored locally, and the mnemonic is used to reconstitute the account address and keys used to pay for the transaction.
rpcUrl
: For both did:cheqd:mainnet:
as well as did:cheqd:testnet:
sections, you can specify a Cosmos SDK RPC endpoint. This endpoint is where transactions are sent to. By default, this is populated with rpc.cheqd.net
(for mainnet) and rpc.cheqd.network
(for testnet), but you can can modify this to or even your own local/private RPC endpoint.
If the config check
throws an error, check out our to see common errors and fixes.
Now that your Veramo CLI installation is successfully set up to work with cheqd, try following our tutorials for or .
Issue a Verifiable Credential, signed by a did:cheqd Decentralized Identifier (DID), using the ACA-Py API endpoints.
Using the /issue-credential-2.0
API endpoints, it is possible to issue Verifiable Credentials, signed by a cheqd DID, in a few clicks or lines of code. By following the following steps, you can effectively issue verifiable credentials using ACA-Py integrated with the cheqd ecosystem.
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.
For automated acceptance, pass the following parameters:
A simple request body is below:
The above request will have an invitation
in the response. Holder will have to copy that invitation and pass in the body of the following API call.
The request body should be the invitation
value from the /create-invitation
call by the Issuer.
Generate a credential offer using the /issue-credential-2.0/send-offer
API. This offer is sent to the holder, informing them about the available credential and its attributes.
The Holder has to retrieve the credential exchange id, and call this API to accept the offer.
Once the credential request is received and validated, issue the credential using the /issue-credential-2.0/records/<exchange-id>/issue
API endpoint.
The Holder has to store the issued credential into their wallet using the following API.
Use any supported method to create a connection with the Holder of the credential. Automated is recommended.
This endpoint creates an identity key pair associated with the user's account for custodian-mode clients.
Key type of the identity key pair to create.
The DID of the issuer of the status list.
The purpose of the status list. Can be either revocation or suspension.
The name of the StatusList2021 DID-Linked Resource.
This endpoint returns the DID-Linked Resource for a given DID identifier and resource identifier.
DID identifier
did:cheqd:mainnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0
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.
3ccde6ba-6ba5-56f2-9f4f-8825561a9860
Filter a DID-Linked Resource query by Resource Name. See DID-Linked Resources for more details.
cheqd-issuer-logo
Filter a DID-Linked Resource query by Resource Type. See DID-Linked Resources for more details.
CredentialArtwork
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.
v1
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.
1970-01-01T00:00:00Z
Request integrity check against a given DID-Linked Resource by providing a SHA-256 checksum hash. See DID-Linked Resources for more details.
dc64474d062ed750a66bad58cb609928de55ed0d81defd231a4a4bf97358e9ed
Return only metadata of DID-Linked Resource instead of actual DID-Linked Resource. Mutually exclusive with some of the other parameters.
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.
Input fields for the creating a Verifiable Credential.
DID of the Verifiable Credential issuer. This needs to be a did:cheqd
DID.
did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0
DID of the Verifiable Credential holder/subject. This needs to be a did:key
DID.
did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK
JSON object containing the attributes to be included in the credential.
{"name":"Bob","gender":"male"}
Optional properties to be included in the @context
property of the credential.
["https://schema.org/schema.jsonld","https://veramo.io/contexts/profile/v1"]
Optional properties to be included in the type
property of the credential.
["Person"]
Optional expiration date according to the <a href=https://www.w3.org/TR/vc-data-model/#expiration> VC Data Model specification.
2023-06-08T13:49:28.000Z
Format of the Verifiable Credential. Defaults to VC-JWT.
jwt
Possible values: Terms of use can be utilized by an issuer or a holder to communicate the terms under which a verifiable credential was issued.
{"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"]}]}
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.
{"type":"ManualRefreshService2018","id":"https://example.edu/refresh/3732"}
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.
{"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"}
This endpoint deactivates a DID Document by taking the DID identifier as input. Must be called and signed by the DID owner.
DID identifier to deactivate.
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.
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.
If set to true
the verification will also check the status of the credential. Requires the VC to have a credentialStatus
property.
false
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.
false
If set to true
allow to verify credential which based on deactivated DID.
false
Verifiable Credential to be verified as a VC-JWT string or a JSON object.
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.
Network to create the DID on (testnet or mainnet)
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.
Type of verification method to use for the DID. See DID Core specification for more details. Only the types listed below are supported.
The unique identifier in hexadecimal public key format used in the verification method to create the DID.
["https://www.w3.org/ns/did/v1"]
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.
DID identifier to be updated.
did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0
Authentication section of the DID Document.
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.
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.
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.
true
Verifiable Credential to be revoked as a VC-JWT string or a JSON object.
The symmetric key used to encrypt the StatusList2021 DID-Linked Resource. Required if the StatusList2021 DID-Linked Resource is encrypted.
This endpoint suspends a given Verifiable Credential. As input, it can take the VC-JWT as a string or the entire credential itself.
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.
Verifiable Credential to be revoked as a VC-JWT string or a JSON object.
The symmetric key used to encrypt the StatusList2021 DID-Linked Resource. Required if the StatusList2021 DID-Linked Resource is encrypted.
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.
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.
Verifiable Credential to be revoked as a VC-JWT string or a JSON object.
The symmetric key used to encrypt the StatusList2021 DID-Linked Resource. Required if the StatusList2021 DID-Linked Resource is encrypted.
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.
Input fields for the creating a Verifiable Credential.
DID of the Verifiable Credential issuer. This needs to be a did:cheqd
DID.
did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0
DID of the Verifiable Credential holder/subject. This needs to be a did:key
DID.
did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK
JSON object containing the attributes to be included in the credential.
{"name":"Bob","gender":"male"}
Optional properties to be included in the @context
property of the credential.
["https://schema.org/schema.jsonld","https://veramo.io/contexts/profile/v1"]
Optional properties to be included in the type
property of the credential.
["Person"]
Optional expiration date according to the <a href=https://www.w3.org/TR/vc-data-model/#expiration> VC Data Model specification.
2023-06-08T13:49:28.000Z
Format of the Verifiable Credential. Defaults to VC-JWT.
jwt
Possible values: Terms of use can be utilized by an issuer or a holder to communicate the terms under which a verifiable credential was issued.
{"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"]}]}
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.
{"type":"ManualRefreshService2018","id":"https://example.edu/refresh/3732"}
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.
{"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"}
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.
Input fields for the creating a Verifiable Credential.
DID of the Verifiable Credential issuer. This needs to be a did:cheqd
DID.
did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0
DID of the Verifiable Credential holder/subject. This needs to be a did:key
DID.
did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK
JSON object containing the attributes to be included in the credential.
{"name":"Bob","gender":"male"}
Optional properties to be included in the @context
property of the credential.
["https://schema.org/schema.jsonld","https://veramo.io/contexts/profile/v1"]
Optional properties to be included in the type
property of the credential.
["Person"]
Optional expiration date according to the <a href=https://www.w3.org/TR/vc-data-model/#expiration> VC Data Model specification.
2023-06-08T13:49:28.000Z
Format of the Verifiable Credential. Defaults to VC-JWT.
jwt
Possible values: Terms of use can be utilized by an issuer or a holder to communicate the terms under which a verifiable credential was issued.
{"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"]}]}
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.
{"type":"ManualRefreshService2018","id":"https://example.edu/refresh/3732"}
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.
{"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"}
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.
If set to true
the verification will also check the status of the presentation. Requires the VP to have a credentialStatus
property.
false
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.
false
If set to true
allow to verify credential which based on deactivated DID.
false
Verifiable Presentation to be verified as a VP-JWT string or a JSON object.
Provide an optional verifier DID (also known as 'domain' parameter), if the verifier DID in the presentation is not managed in the wallet.
Automatically make fee payment (if required) based on payment conditions to unlock encrypted StatusList2021 DID-Linked Resource.
false
Generate and publish a Verifiable Accreditation for a subject DID as a DID Linked resource.
Select the type of accreditation to be issued.
Input fields for the creating a Verifiable Accreditation.
DID of the Verifiable Accreditation issuer. This needs to be a did:cheqd
DID.
did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0
DID of the Verifiable Accreditation holder/subject. This needs to be a did:cheqd
DID.
did:cheqd:testnet:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK
Unique name of the Verifiable Accreditation.
JSON object containing the attributes to be included in the Accreditation.
Optional properties to be included in the @context
property of the Accreditation.
["https://schema.org/schema.jsonld","https://veramo.io/contexts/profile/v1"]
DID URL of the parent Verifiable Accreditation, required for accredit/attest operation.
DID URL of the root Verifiable Accreditation, required for accredit/attest operation.
Name or Type of the Trust Framework, required for authorise operation.
Url of the Trust Framework, required for authorise operation.
Optional properties to be included in the type
property of the Accreditation.
["Person"]
Optional expiration date according to the <a href=https://www.w3.org/TR/vc-data-model/#expiration> VC Data Model specification.
2023-06-08T13:49:28.000Z
Format of the Verifiable Accreditation. Defaults to VC-JWT.
jwt
Possible values: Terms of use can be utilized by an issuer or a holder to communicate the terms under which a verifiable credential was issued.
{"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"]}]}
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.
{"type":"ManualRefreshService2018","id":"https://example.edu/refresh/3732"}
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.
{"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"}
The update action to be performed on the encrypted status list, can be revoke, suspend or reinstate
The update action to be performed on the encrypted status list, can be revoke, suspend or reinstate
The update action to be performed on the encrypted status list, can be revoke, suspend or reinstate
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.
The purpose of the status list. Can be either revocation or suspension.
DID of the StatusList2021 publisher.
The name of the StatusList2021 DID-Linked Resource to be checked.
Credential status index to be checked for revocation or suspension.
Automatically make fee payment (if required) based on payment conditions to unlock encrypted StatusList2021 DID-Linked Resource.
true
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.
The purpose of the status list. Can be either revocation or suspension.
DID of the StatusList2021 publisher.
The name of the StatusList2021 DID-Linked Resource to be checked.
Credential status index to be checked for revocation or suspension.
Automatically make fee payment (if required) based on payment conditions to unlock encrypted StatusList2021 DID-Linked Resource.
true
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.
The purpose of the status list. Can be either revocation or suspension.
DID of the StatusList2021 publisher.
The name of the StatusList2021 DID-Linked Resource to be checked.
Credential status index to be checked for revocation or suspension.
Automatically make fee payment (if required) based on payment conditions to unlock encrypted StatusList2021 DID-Linked Resource.
true
Generate and publish a Verifiable Accreditation for a subject DID as a DID Linked resource.
If set to true
the verification will also check the status of the accreditation. Requires the VC to have a credentialStatus
property.
false
If set to true
allow to verify accreditation which based on deactivated DID.
false
DID of the Verifiable Accreditation holder/subject. This needs to be a did:key
DID.
did:cheqd:testnet:5efa5126-c070-420f-a9c2-d22ae6eefb92
DID URL of the Verifiable Accreditation to be verified as a VC-JWT string or a JSON object.
did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e?resourceName=cheqd-issuer-logo&resourceType=CredentialArtwork
DID of the Verifiable Accreditation holder/subject
did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e
Unique resource identifier of the Verifiable Accreditation
398cee0a-efac-4643-9f4c-74c48c72a14b
Resource name of the Verifiable Accreditation
cheqd-issuer-logo
Resource type of the Verifiable Accreditation
CredentialArtwork
Generate and publish a Verifiable Accreditation for a subject DID as a DID Linked resource.
Select the type of accreditation to be issued.
Input fields for the creating a Verifiable Accreditation.
DID of the Verifiable Accreditation issuer. This needs to be a did:cheqd
DID.
did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0
DID of the Verifiable Accreditation holder/subject. This needs to be a did:cheqd
DID.
did:cheqd:testnet:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK
Unique name of the Verifiable Accreditation.
JSON object containing the attributes to be included in the Accreditation.
Optional properties to be included in the @context
property of the Accreditation.
["https://schema.org/schema.jsonld","https://veramo.io/contexts/profile/v1"]
DID URL of the parent Verifiable Accreditation, required for accredit/attest operation.
DID URL of the root Verifiable Accreditation, required for accredit/attest operation.
Name or Type of the Trust Framework, required for authorise operation.
Url of the Trust Framework, required for authorise operation.
Optional properties to be included in the type
property of the Accreditation.
["Person"]
Optional expiration date according to the <a href=https://www.w3.org/TR/vc-data-model/#expiration> VC Data Model specification.
2023-06-08T13:49:28.000Z
Format of the Verifiable Accreditation. Defaults to VC-JWT.
jwt
Possible values: Terms of use can be utilized by an issuer or a holder to communicate the terms under which a verifiable credential was issued.
{"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"]}]}
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.
{"type":"ManualRefreshService2018","id":"https://example.edu/refresh/3732"}
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.
{"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"}
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.
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.
{"did":"did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e","statusListName":"cheqd-employee-credentials","length":140000,"encoding":"base64url"}
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.
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.
{"did":"did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e","statusListName":"cheqd-employee-credentials","length":140000,"encoding":"base64url"}
The update action to be performed on the unencrypted status list, can be revoke, suspend or reinstate
{"did":"did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e","statusListName":"cheqd-employee-credentials","indices":[10,3199,12109,130999]}
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.
DID identifier to link the resource to.
Input fields for DID-Linked Resource creation.
Encoded string containing the data to be stored in the DID-Linked Resource.
Encoding format used to encode the data.
Name of DID-Linked Resource.
Type of DID-Linked Resource. This is NOT the same as the media type, which is calculated automatically ledger-side.
Optional field to assign a human-readable version in the DID-Linked Resource.
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.
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.
The purpose of the status list. Can be either revocation or suspension.
DID of the StatusList2021 publisher.
The name of the StatusList2021 DID-Linked Resource to be checked.
Credential status index to be checked for revocation or suspension.
Automatically make fee payment (if required) based on payment conditions to unlock encrypted StatusList2021 DID-Linked Resource.
true
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.
DID identifier to link the resource to.
Input fields for DID-Linked Resource creation.
Encoded string containing the data to be stored in the DID-Linked Resource.
Encoding format used to encode the data.
Name of DID-Linked Resource.
Type of DID-Linked Resource. This is NOT the same as the media type, which is calculated automatically ledger-side.
Optional field to assign a human-readable version in the DID-Linked Resource.
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.
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.
DID identifier to link the resource to.
Input fields for DID-Linked Resource creation.
Encoded string containing the data to be stored in the DID-Linked Resource.
Encoding format used to encode the data.
Name of DID-Linked Resource.
Type of DID-Linked Resource. This is NOT the same as the media type, which is calculated automatically ledger-side.
Optional field to assign a human-readable version in the DID-Linked Resource.
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.
Resolve a DID Document by DID identifier. Also supports DID Resolution Queries as defined in the .
DID identifier to resolve.
did:cheqd:mainnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0
Return only metadata of DID Document instead of actual DID Document.
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.
3ccde6ba-6ba5-56f2-9f4f-8825561a9860
Returns the closest version of the DID Document at or before specified time. See DID Resolution handling for did:cheqd
for more details.
1970-01-01T00:00:00Z
This directive transforms the Verification Method key format from the version in the DID Document to the specified format chosen below.
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.
service-1
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.
/path/to/file
Resolve a DID Document by DID identifier. Also supports DID Resolution Queries as defined in the .
DID identifier to resolve.
did:cheqd:mainnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0
Return only metadata of DID Document instead of actual DID Document.
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.
3ccde6ba-6ba5-56f2-9f4f-8825561a9860
Returns the closest version of the DID Document at or before specified time. See DID Resolution handling for did:cheqd
for more details.
1970-01-01T00:00:00Z
This directive transforms the Verification Method key format from the version in the DID Document to the specified format chosen below.
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.
service-1
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.
/path/to/file
Connection identifier
{"value":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}
Number of results to return
{"value":50}
Offset for pagination
{"value":0}
Role assigned in credential exchange
Credential exchange state
Thread identifier
{"value":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}
Connection identifier
{"value":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}
Number of results to return
{"value":50}
Offset for pagination
{"value":0}
Role assigned in presentation exchange
Presentation exchange state
Thread identifier
{"value":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}
Presentation exchange identifier
{"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}
Maximum number to retrieve
{"value":"1"}
Pattern: ^[1-9][0-9]*$
(JSON) object mapping referents to extra WQL queries
{"value":"{\"0_drink_uuid\": {\"attr::drink::value\": \"martini\"}}"}
Pattern: ^{\s*".*?"\s*:\s*{.*?}\s*(,\s*".*?"\s*:\s*{.*?}\s*)*\s*}$
Proof request referents of interest, comma-separated
{"value":"1_name_uuid,2_score_uuid"}
Start index
{"value":"0"}
Pattern: ^[0-9]*$
DID of interest
{"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 type to query for.
{"value":"ed25519"}
Possible values: DID method to query for. e.g. sov to only fetch indy/sov DIDs
{"value":"key"}
Whether DID is current public DID, posted to ledger but current public DID, or local to the wallet
{"value":"wallet_only"}
Possible values: Verification key of interest
{"value":"H3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV"}
Pattern: ^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{43,44}$
Auto-accept connection (defaults to configuration)
Create unique DID for this invitation (default false)
Create invitation for multiple use (default false)
List of mime type in order of preference that should be use in responding to the message
["didcomm/aip1","didcomm/aip2;env=rfc19"]
Alias for connection
Barry
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
To issue a Faber College Graduate credential
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
issue-vc
Handshake protocol to specify in invitation
Identifier for active mediation record to be used
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}
Optional metadata to attach to the connection created with the invitation
Label for connection invitation
Invitation to Barry
OOB protocol version
1.1
DID to use in invitation
did:example:123
DID method to use in invitation
did:peer:2
Possible values: Whether to use public DID in invitation
Credential exchange identifier
{"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}
Whether to remove the credential exchange record on completion (overrides --preserve-exchange-records configuration setting)
Holder DID to substitute for the credentialSubject.id
did:key:ahsdkjahsdkjhaskjdhakjshdkajhsdkjahs
Credential exchange identifier
{"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}
Presentation exchange identifier
{"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}
Presentation specification for anoncreds
Whether to remove the presentation exchange record on completion (overrides --preserve-exchange-records configuration setting)
Optional Presentation specification for DIF, overrides the PresentationExchange record's PresRequest
Presentation specification for indy
Record trace information, based on agent configuration
DID to deactivate
did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86
Pattern: ^(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})([?][^#]*)?)$
Additional configuration options
{"network":"testnet"}
DID to update
did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86
Pattern: ^(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})([?][^#]*)?)$
DID Document to update
{"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..."}]}
Additional configuration options
{"network":"testnet"}
Whether to remove the presentation exchange record on completion (overrides --preserve-exchange-records configuration setting)
Verifier choice to auto-verify proof presentation
Connection identifier
3fa85f64-5717-4562-b3fc-2c963f66afa6
Whether to trace event (default false)
Presentation exchange identifier
{"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}
Presentation specification for anoncreds
Whether to remove the presentation exchange record on completion (overrides --preserve-exchange-records configuration setting)
Optional Presentation specification for DIF, overrides the PresentationExchange record's PresRequest
Presentation specification for indy
Record trace information, based on agent configuration
Optional comment to include in revocation notification
Connection ID to which the revocation notification will be sent; required if notify is true
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}
Credential exchange identifier
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}
Credential revocation identifier
12345
Pattern: ^[1-9][0-9]*$
Send a notification to the credential recipient
Specify which version of the revocation notification should be sent
(True) publish revocation to ledger immediately, or (default, False) mark it pending
Revocation registry identifier
did:(method):4:did:<method>:3:CL:20:tag:CL_ACCUM:0
Pattern: ^(.+$)
Thread ID of the credential exchange message thread resulting in the credential now being revoked; required if notify is true
Auto-accept connection (defaults to configuration)
Create unique DID for this invitation (default false)
Create invitation for multiple use (default false)
List of mime type in order of preference that should be use in responding to the message
["didcomm/aip1","didcomm/aip2;env=rfc19"]
Alias for connection
Barry
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
To issue a Faber College Graduate credential
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
issue-vc
Handshake protocol to specify in invitation
Identifier for active mediation record to be used
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}
Optional metadata to attach to the connection created with the invitation
Label for connection invitation
Invitation to Barry
OOB protocol version
1.1
DID to use in invitation
did:example:123
DID method to use in invitation
did:peer:2
Possible values: Whether to use public DID in invitation
Alias for connection
{"value":"Barry"}
Auto-accept connection (defaults to configuration)
Identifier for active mediation record to be used
{"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}
Use an existing connection, if possible
Message identifier
3fa85f64-5717-4562-b3fc-2c963f66afa6
Message type
https://didcomm.org/my-family/1.0/my-message-type
List of mime type in order of preference
["didcomm/aip1","didcomm/aip2;env=rfc19"]
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
To issue a Faber College Graduate credential
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
issue-vc
Handshake protocol
Optional image URL for out-of-band invitation
http://192.168.56.101/img/logo.jpg
Optional label
Bob
Whether to respond automatically to credential requests, creating and issuing requested credentials
Whether to remove the credential exchange record on completion (overrides --preserve-exchange-records configuration setting)
Human-readable comment
Connection identifier
3fa85f64-5717-4562-b3fc-2c963f66afa6
Credential specification criteria by format
Optional identifier used to manage credential replacement
3fa85f64-5717-4562-b3fc-2c963f66afa6
Record trace information, based on agent configuration
Credential exchange identifier
{"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}
Whether to remove the credential exchange record on completion (overrides --preserve-exchange-records configuration setting)
Holder DID to substitute for the credentialSubject.id
did:key:ahsdkjahsdkjhaskjdhakjshdkajhsdkjahs
Credential exchange identifier
{"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}
Human-readable comment
Credential exchange identifier
{"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}