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

Product Docs

Getting Started

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Start using cheqd

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Integrate an SDK

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Set Up Your Account

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

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

Step 1: Get started with cheqd Studio

Head to our cheqd Studio and click Get Started.

Step 2: Create your account

  • Email and password

  • Google single sign-on

  • Discord login

Click Sign In or Create Account to continue.

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

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

Step 4: Start using cheqd

Get started with our tutorials for cheqd Studio functionality.

Step 5: Select a Billing plan

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.

third party service called LogTo

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

Stripe

Get Started with cheqd Studio

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

Introduction

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

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

Get started

Features

Understanding the different modes and client choices

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

Option 1: Custodied by cheqd (Custodian Mode)

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

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

User optionality and toggles:

Within Custodian mode, we also enable clients to toggle

External Database

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

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

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

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

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

API Authentication using LogTo

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

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

  1. Endpoints

    1. LOGTO_ENDPOINT: API endpoint for LogTo server

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

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

    4. CORS_ALLOWED_ORIGINS: CORS allowed origins used in the app

  2. User-facing APIs

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

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

  3. Machine-to-machine backend APIs

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

    2. LOGTO_M2M_APP_SECRET: Application secret

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

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

  4. Miscellaneous

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

    2. COOKIE_SECRET: Secret for cookie encryption.

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

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

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

Architecture

Alternatives

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

Product Overview

Get started with cheqd's identity functionality and product offerings.

Integrate with cheqd

cheqd maintains an array of products and packages with varying levels of integration complexity to allow its partners and customers to have multiple ways of plugging into cheqd's identity functionality. Via these different packages, customers and partners can create cheqd DIDs, DID-Linked Resources, Status Lists, Trust Registries and Schemas, as well as use cheqd's Credential Payments model.

There are three core ways of integrating and building with cheqd:

What functionality does cheqd offer?

cheqd's identity functionality is fully standards compliant, ensuring interoperability and no vendor lock-in. cheqd's tooling and different product offerings offer a variety of building blocks for any Trusted Data Market.

Industry Standard DID Support

Get started with cheqd Studio

cheqd Studio is the easiest route to get started with cheqd's identity functionality, or for testing with very low integration effort. Using simple REST APIs, it is possible to integrate cheqd Studio in a few lines of code.

Understanding cheqd's capabilities

cheqd supports a wide array of standards and protocols via different Software Development Kits (SDKs) and integrations.

Understanding the structure of cheqd's packages

One of cheqd's primary motives is to make itself accessible to the widest set of identity applications possible. To accomplish this, cheqd has built a flexible set of packages and tooling to accommodate its identity capabilities into a broad set of external SDKs and applications.

These can be represented through the visual below:

Partner SaaS products

You can also leverage SaaS products from our partners that consume these underlying SDKs to build high-quality credential ecosystems on top of cheqd’s infrastructure:

Get involved

Please reach out to us there for discussions, help, and feedback on the project.

🙋 Find us elsewhere

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.

Veramo SDK Plugin

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.

1Password
Bitwarden
LogTo
LogTo Cloud
LogTo webhooks
Veramo SDK Plugin
guide on supported SDKs
cheqd
did:cheqd
Veramo SDK cheqd Plugin
using a Software Development Kit (SDK)
cheqd Discord

Create Decentralised Identifiers (DIDs)

Build Trust Registries

Create industry-leading trust registries, using chains of Verifiable Accreditations, to secure your identity ecosytem.

Charge for Credentials

Issue Credentials and Presentations

Create Status Lists on-ledger

Sophisticated and first-of-its-kind cryptographically verifiable on-ledger files for establishing Trust and Reputability in a Verifiable Credential, utilising DID-Linked Resources.

Create DID-Linked Resources

Digital resources, leveraging the cryptographic verifiability of DIDs and patterns of DID Core to anchor schemas, trust registries, status lists and more.

DID Registrar (and Universal Registrar Driver)

Low complexity

DID Resolver (and Universal Resolver Driver)

Low complexity

Build an AI Agent Trust Registry

Build an AI Agent Trust Registry on cheqd.

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

1

Design and Build of Trust Registry

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

2

Setup and Configuration of MCP Server

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

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

Learn more about cheqd's Trust Registry model

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

Create API Keys

Generate API Keys to securely authenticate with cheqd Studio APIs.

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

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

  • All API requests must be made over HTTPS.

🚧Keep Your API Keys Safe

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

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

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

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

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

Step 1: Sign into cheqd Studio

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

Step 2: Generate API key

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

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

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

Step 4: Start using cheqd

Get started with our tutorials for cheqd Studio functionality.

Token Top Up

Manually Top Up Your Account with CHEQ.

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

  1. Creating, Updating or Deactivating DIDs

  2. Creating unencrypted or encrypted Status Lists

  3. Creating Trust Registries

  4. Creating other DID-Linked Resources

Step 1: Locate your cheqd address (for CHEQ)

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

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

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

Step 2: Adding CHEQ tokens to your account

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

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

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

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

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

Step 3: Continue using cheqd

Get started with our tutorials for cheqd Studio functionality.

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 .

Get Started

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.

Set up your account

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

DIDs and Identity Keys

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

Trust Registries

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

Payments

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

Status Lists

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

Credentials

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

Resources

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

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

W3C DID Core
cheqd's DID method (did:cheqd)
Payment Conditions to unlock
W3C VC Data Model
Universal Registrar
Universal Resolver
setup your wallet
Leap Wallet
tutorial here to setup your Keplr wallet
get CHEQ tokens from any of the listed providers here
via our Testnet Faucet
Testnet Faucet directly here

Issue Verifiable Credentials to AI Agent

Issue a Credential to an AI Agent using cheqd's APIs.

Once you have created your Trust Registry for the accreditation and authorisation of the organisations in your ecosystem, you can issue a credential to your AI Agent.

Step 1: Create DID for AI Agent

Each AI Agent must have its own DID to securely receive and manage credentials and accreditations. This identification allows the AI Agent to cryptographically control these credentials and accreditations.

Step 2: Choose Schema for Credential

You must decide which schema to use for the credential you are issuing to the AI Agent. You should make sure that you, as an issuer, are accreditedToAttest for the specific credential schema you want to use.

Step 3: Compile Credential Request

To ensure the AI Agent's credentials are demonstrably verifiable to a root of trust, certain steps are essential in the credential issuance process.

For subjectDid use the DID created in Step 1.

An example of the request format is below:

{
  "issuerDid": "did:cheqd:testnet:0a35d559-00ff-41b6-81ad-f64faa522771", // DID of Trusted Issuer
  "subjectDid": "did:cheqd:testnet:a7e8bf7c-9d97-4b1e-a7bb-43a6754aafbf", // DID of AI Agent
  "attributes": {
      "aiAgentName": "ChatGPT-4 Turbo",
      "aiAgentVersion": "4.0-turbo",
      "model": "GPT-4 Turbo",
      "modelVersion": "4.0",
      "contextWindow": 128000,
      "temperature": 0.7,
      "topK": 40,
      "topP": 0.9,
      "maxTokens": 4096,
      "fineTuned": false,
      "fineTuningDetails": null,
      "safetyRating": "ISO 42001 Certified",
      "evaluationMetrics": [
        "BLEU-4",
        "ROUGE-L",
        "F1 Score: 92.5%"
      ],
      "certificationAuthority": "AI Ethics Board",
      "validUntil": "2026-03-28T12:00:00Z"
  },
  "type": [
    "VerifiableCredential",
    "VerifiableAttestation",
    "AIAgentAuthorisation"
  ],
  "format": "jwt",
  "credentialSchema": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:c6630f1e-9248-4af6-b7ac-5bcaf646f213?resourceName=AIAgentAuthorisation&resourceType=JSONSchemaValidator2020",
    "termsOfUse": {
      "type": "AttestationPolicy",
      "parentAccreditation": "did:cheqd:testnet:0a35d559-00ff-41b6-81ad-f64faa522771?resourceName=AccreditationToAttest&resourceType=VerifiableAccreditationToAttest",
      "rootAuthorisation": "did:cheqd:testnet:c6630f1e-9248-4af6-b7ac-5bcaf646f213?resourceName=OrganisationAuthorisationForAIAgents&resourceType=VerifiableAuthorisationForTrustChain"
    }
}

The table below breaks down what components are required and why they are needed:

Field
Required?
Description

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.

Step 4: Issue Verifiable Credential to AI Agent

Issue the compiled credential using the cheqd studio API enpoint below:

(Optional) Step 5: Publish Credential Response as a DID-Linked Resource

The Issuer, after issuing the credential to the AI Agent, may publish the response (the fully formatted verifiable credential) as a DID-Linked Resource.

The response format should look like the following example, including a proof (signed by the issuer).

{
  "credentialSubject": {
    "aiAgentName": "ChatGPT-4 Turbo",
    "aiAgentVersion": "4.0-turbo",
    "model": "GPT-4 Turbo",
    "modelVersion": "4.0",
    "contextWindow": 128000,
    "temperature": 0.7,
    "topK": 40,
    "topP": 0.9,
    "maxTokens": 4096,
    "fineTuned": false,
    "fineTuningDetails": null,
    "safetyRating": "ISO 42001 Certified",
    "evaluationMetrics": [
      "BLEU-4",
      "ROUGE-L",
      "F1 Score: 92.5%"
    ],
    "certificationAuthority": "AI Ethics Board",
    "validUntil": "2026-03-28T12:00:00Z",
    "id": "did:cheqd:testnet:a7e8bf7c-9d97-4b1e-a7bb-43a6754aafbf"
  },
  "issuer": {
    "id": "did:cheqd:testnet:0a35d559-00ff-41b6-81ad-f64faa522771"
  },
  "type": [
    "VerifiableCredential",
    "VerifiableAttestation",
    "AIAgentAuthorisation"
  ],
  "termsOfUse": {
    "type": "AttestationPolicy",
    "parentAccreditation": "did:cheqd:testnet:0a35d559-00ff-41b6-81ad-f64faa522771?resourceName=AccreditationToAttest&resourceType=VerifiableAccreditationToAttest",
    "rootAuthorisation": "did:cheqd:testnet:c6630f1e-9248-4af6-b7ac-5bcaf646f213?resourceName=OrganisationAuthorisationForAIAgents&resourceType=VerifiableAuthorisationForTrustChain"
  },
  "credentialSchema": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:c6630f1e-9248-4af6-b7ac-5bcaf646f213?resourceName=AIAgentAuthorisation&resourceType=JSONSchemaValidator2020",
  "@context": [
    "https://www.w3.org/2018/credentials/v1"
  ],
  "issuanceDate": "2025-04-04T02:43:52.000Z",
  "proof": {
    "type": "JwtProof2020",
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiVmVyaWZpYWJsZUF0dGVzdGF0aW9uIiwiQUlBZ2VudEF1dGhvcmlzYXRpb24iXSwiY3JlZGVudGlhbFN1YmplY3QiOnsiYWlBZ2VudE5hbWUiOiJDaGF0R1BULTQgVHVyYm8iLCJhaUFnZW50VmVyc2lvbiI6IjQuMC10dXJibyIsIm1vZGVsIjoiR1BULTQgVHVyYm8iLCJtb2RlbFZlcnNpb24iOiI0LjAiLCJjb250ZXh0V2luZG93IjoxMjgwMDAsInRlbXBlcmF0dXJlIjowLjcsInRvcEsiOjQwLCJ0b3BQIjowLjksIm1heFRva2VucyI6NDA5NiwiZmluZVR1bmVkIjpmYWxzZSwiZmluZVR1bmluZ0RldGFpbHMiOm51bGwsInNhZmV0eVJhdGluZyI6IklTTyA0MjAwMSBDZXJ0aWZpZWQiLCJldmFsdWF0aW9uTWV0cmljcyI6WyJCTEVVLTQiLCJST1VHRS1MIiwiRjEgU2NvcmU6IDkyLjUlIl0sImNlcnRpZmljYXRpb25BdXRob3JpdHkiOiJBSSBFdGhpY3MgQm9hcmQiLCJ2YWxpZFVudGlsIjoiMjAyNi0wMy0yOFQxMjowMDowMFoifSwidGVybXNPZlVzZSI6eyJ0eXBlIjoiQXR0ZXN0YXRpb25Qb2xpY3kiLCJwYXJlbnRBY2NyZWRpdGF0aW9uIjoiZGlkOmNoZXFkOnRlc3RuZXQ6MGEzNWQ1NTktMDBmZi00MWI2LTgxYWQtZjY0ZmFhNTIyNzcxP3Jlc291cmNlTmFtZT1BY2NyZWRpdGF0aW9uVG9BdHRlc3QmcmVzb3VyY2VUeXBlPVZlcmlmaWFibGVBY2NyZWRpdGF0aW9uVG9BdHRlc3QiLCJyb290QXV0aG9yaXNhdGlvbiI6ImRpZDpjaGVxZDp0ZXN0bmV0OmM2NjMwZjFlLTkyNDgtNGFmNi1iN2FjLTViY2FmNjQ2ZjIxMz9yZXNvdXJjZU5hbWU9T3JnYW5pc2F0aW9uQXV0aG9yaXNhdGlvbkZvckFJQWdlbnRzJnJlc291cmNlVHlwZT1WZXJpZmlhYmxlQXV0aG9yaXNhdGlvbkZvclRydXN0Q2hhaW4ifSwiY3JlZGVudGlhbFNjaGVtYSI6Imh0dHBzOi8vcmVzb2x2ZXIuY2hlcWQubmV0LzEuMC9pZGVudGlmaWVycy9kaWQ6Y2hlcWQ6dGVzdG5ldDpjNjYzMGYxZS05MjQ4LTRhZjYtYjdhYy01YmNhZjY0NmYyMTM_cmVzb3VyY2VOYW1lPUFJQWdlbnRBdXRob3Jpc2F0aW9uJnJlc291cmNlVHlwZT1KU09OU2NoZW1hVmFsaWRhdG9yMjAyMCJ9LCJzdWIiOiJkaWQ6Y2hlcWQ6dGVzdG5ldDphN2U4YmY3Yy05ZDk3LTRiMWUtYTdiYi00M2E2NzU0YWFmYmYiLCJuYmYiOjE3NDM3MzQ2MzIsImlzcyI6ImRpZDpjaGVxZDp0ZXN0bmV0OjBhMzVkNTU5LTAwZmYtNDFiNi04MWFkLWY2NGZhYTUyMjc3MSJ9.z9xTp5dSMACTLhrAsO-RBjcmaJJvWHqD6_78FTjaOkBroAMS0f8NlvpIrC7CGojkzCv_T8M_VBexzXU9I8JKAg"
  }
}

You can follow the tutorial below to publish your issued credential as a DID-Linked Resource. Generally we suggest the resourceType of VerifiableAttestation for credentials issued to AI Agents.

This will store the schemas securely on the cheqd Network, where they can be fetched using DID URLs.

Step 5: Provision Verifiable Credential into AI Agent using MCP server

To complete the setup of your AI Agent trust registry and its associated credential, the final step is to provision this credential directly into the AI Agent's wallet using our MCP Server. Follow the tutorial below to finalize your setup!

Use Trust Registries for AI Agents

Design, Build and Validate Trust Registries for AI Agents on cheqd.

Get Started

cheqd Trust Registries can be designed and built by companies that create AI agents, and verified by users of AI agents. Select your user type below to begin:

What are Trust Registries for AI Agents?

Trust Registries play a critical role in establishing trust for AI Agents. Acting as authoritative databases, they can verify the AI Agent is accredited and authorised to carry out certain actions, ensuring transparency and accountability.

Here’s how they support the AI ecosystem:

  • Accreditation of AI Agents: Trust Registries maintain verified records of AI agents, ensuring that they are accredited by trusted organisations or ecosystems. Through accreditations, these trust registries validate that AI agents are legitimate and scope the permissions under which the AI agent can operate within.

  • Transparency: Trust Registries enable users and organisations to query and verify the origins and accreditations of AI systems they engage with. By providing a publicly accessible record of trusted AI agents, Trust Registries empower stakeholders to assess the credibility and history of an AI system before utilising it. This enhances confidence in the system, especially when the AI’s decisions impact sensitive areas like personal data or legal outcomes.

  • Governance: Trust Registries also serve as a governance tool, ensuring that AI developers and platforms are held accountable for their actions. By maintaining a registry of accredited AI systems, these registries can track the ongoing compliance of AI agents, making it easier to enforce ethical standards and regulatory requirements. In the event of a failure or harm caused by an AI agent, Trust Registries offer a clear point of reference for auditing and resolving accountability issues.

cheqd has developed a robust Trust Registry solution, enabling users to establish hierarchical chains of trust, with each registry entry being DID-resolvable for enhanced transparency and security.

Capabilities of cheqd's Trust Registries for AI Agents

cheqd’s Agentic Trust combine and build upon tried and tested capabilities, already deployed at scale:

  • Integrations with popular AI/ML tooling, such as MCP servers for easing how AI agents can interface with decentralised identity.

  • Work with our SaaS (cheqd Studio) or Software Development Kits (SDKs) depending on your desired level of control versus simplicity.

  • SDKs in multiple software languages to suit preferences / skillsets.

  • Industry-leading whilst interoperable capabilities. e.g. DIDs, DID-linked resources, and Trust Registries.

Components of cheqd's AI Trust Registry Solution

Authorities can author trust registries and issue identifiers to agents using:

  • cheqd studio (SaaS APIs) for easy and quick integration with no deployment requirements

  • SDKs for more control and tighter integration

Agent frameworks, deployments or end-users can use:

  • Model Context Protocol (MCP) to surface responses directly to users via the agent, including a /who_is command which has the agent verify itself.

  • Hosted TRAIN APIs to verify Agent accreditations.

  • SDKs to hold & proof credentials, including verifying signatures.

Establishing a Trust Hierarchy

cheqd's Trust Registry model is predicated on the notion of a trust hierarchy, which is conceptually very similar to traditional Public Key Infrastructure (PKI). Specifically, the model relies on a Root of Trust from which trusted relationships can be established.

In our model for AI Agents, each organisation in the trust hierarchy is able to issue Verifiable Accreditations to other entities, conveying a set of permissions or scopes that determine what the recipient entity is permitted to do.

The following diagram shows an example of how an AI Agent Creator can accredit two AI Agents lower in the hierarchy:

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.

Use cases for AI Agent Trust registries

Below are a series of use cases to which this solution architecture can be applied:

Use-case
Description
Governance authority
(Governance authority issued) Verifiable Accreditation
Organisation
(Organisation issued) Verifiable Accreditation

Ownership / representation

Verification of which agents are approved to represent which company for a given scope.

Group company

Company relationship

Subsidiary

Scope of representation

Agent Bill of Materials

Verifiable proof of the “supply chain” of an AI Agent, including who, how and when it was developed, trained, and deployed.

Framework

Agent Bill of Materials (e.g. model, corpus, used)

Not applicable

Not applicable

Regulatory compliance

Verifiable compliance with a given regulatory scheme for a given period.

Government (e.g. EU)

Authority to audit against EU AI Act

Auditor

Agent Compliance Certificate

Industry standard compliance

Verifiable compliance with an industry-body administered scheme.

Industry body (e.g. DAIAA, SAIA)

Agent Compliance Certificate (issued to Agent)

Not applicable

Not applicable

Security audit

Proof of a suitable and reputable security audit.

Security company

Agent Compliance Certificate (issued to Agent)

Not applicable

Not applicable

Generic trust check

The ability to state that a company or AI Agent trusts another for a given context.

Any organisation

“I trust this organisation”

Any organisation

“I trust this agent”

Learn more about cheqd's Trust Registry model

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

Advanced Configuration Options

Advanced setup guide for running the cheqd Studio.

Run as standalone application using Docker Compose

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

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

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

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

Configure PostgreSQL database

  1. POSTGRES_USER: Username for Postgres database

  2. POSTGRES_PASSWORD: Password for Postgres database

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

Then, make the Postgres initialisation scripts executable:

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

Start LogTo service

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

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

Start credential-service app

Then, start the service using Docker Compose:

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

Running app or LogTo migrations

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

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

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

Or to run LogTo migrations on an existing Postgres database:

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

Build using Docker

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

Create AI Agent DID

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".

What is happening under the hood?

Setup and Configure MCP Server

Setup and Configure your MCP Server to begin using cheqd's identity functionality with your AI Agent.

This is an advanced guide for those who want to integrate AI Agents with the Cheqd Network to create DIDs, Issue Verifiable Credentials and store Verifiable Credentials.

Overview

Our MCP server is designed as a modular toolkit that can be easily integrated with existing AI workflows, particularly through Claude Desktop, Cursor, and other MCP-compatible client applications.

Benefits of using MCP with cheqd

  • Enhanced AI Trust and Verification: Enable AI agents to create, resolve, and verify decentralised identities, establishing a foundation of trust for AI interactions.

  • Verifiable Credential Management: Simplify the issuance, verification, and management of verifiable credentials through standardised tools.

  • Decentralised Identity Operations: Leverage cheqd's blockchain infrastructure for creating and managing DIDs with cryptographic security.

  • Standardised AI Context: Utilise the Model Context Protocol to provide structured and verifiable context for AI interactions.

  • Human-in-the-loop Security: MCP's approval-based tool execution model ensures humans maintain oversight of sensitive identity operations.

  • Interoperable Integration: Seamlessly connect with existing identity ecosystems through the cheqd network and Credo Toolkit.

Integration with Credo Toolkit

  • DID Management: Create, update, resolve, and deactivate DIDs on the cheqd network.

  • Resource Operations: Create and resolve DID-linked resources.

  • Schema Management: Define and retrieve credential schemas for standardised credential formats.

  • Connection Management: Establish secure DIDComm connections between identity holders and verifiers.

  • Credential Issuance: Generate and issue verifiable credentials with cryptographic proofs.

  • Verification Protocols: Implement zero-knowledge proof verification for enhanced privacy.

The Credo Toolkit abstracts the complexity of these operations, presenting them as simple, well-documented MCP tools that can be invoked by AI agents with appropriate permissions. By leveraging the Credo Toolkit integration, the MCP server provides comprehensive tools for managing the full lifecycle of decentralised identifiers (DIDs) and verifiable credentials on the cheqd network.

Target Use Cases and Scenarios

The Cheqd MCP Server is particularly well-suited for scenarios requiring trusted AI interactions with verifiable identity information:

  • AI-Assisted Identity Verification: Enable AI agents to verify user identities through cryptographically secured credentials.

  • Credential Issuance Workflows: Streamline the creation and issuance of verifiable credentials through AI-guided processes.

  • Trusted Data Exchange: Facilitate secure sharing of verified data between organisations using AI intermediaries.

  • Identity-Aware AI Systems: Build AI applications that respect privacy and understand the provenance of identity information.

  • Cross-Domain Verification: Enable verification of credentials across different systems and networks through the cheqd infrastructure.

  • Self-Sovereign Identity Management: Support user control over identity information while enabling AI assistance for complex operations.

Getting Started

Prerequisites

  • Working understanding of cheqd network: Understanding of DID operations and verifiable credentials.

  • Node.js 20 or higher (if running using npx).

  • Docker Desktop (if running using docker). This is preferred when running the ACA-Py demo.

Quick Start: Use the Remote MCP Server

The simplest way to get started with MCP and Trust Registry verification is to use our hosted remote MCP server.

Configuration

  • Open your Claude Desktop configuration file:

    • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

    • Windows: %APPDATA%\Claude\claude_desktop_config.json

  • Or, for Cursor .cursor/mcp.json

  • Add the following configuration:

  • Save the file and restart Claude Desktop.

  • You should now see the Trust Registry verification tools available in Claude Desktop/ Cursor.

Alternative: Local Installation (For Developers)

If you prefer to run the MCP server locally, with more control on the configuration and environment variables, you can run locally using docker.

1. Get the code

Get the docker-compose.yaml specially designed for Claude Desktop:

2. Create Configuration File

Update your local env.example file with the required environment variables:

Replace your-testnet-mnemonic with a valid mnemonic for the cheqd testnet. You can generate one using the cheqd CLI or get one from the cheqd faucet.

Server Configuration Options

Credo Tool Configuration Options

3. Update Claude Config

Add the following configuration to your claude_desktop_config.json or .cursor/mcp.json

4. Restart Claude Desktop

When successfully started, the MCP tools will be available.

Using the MCP with Trust Registry

Once configured, you can interact with the Trust Registry through Claude by:

  1. Using the verify-trust-registry tool to verify credentials against the Trust Registry

  2. Running a verification check for a cheqd DID or credential

Next Steps

Now that you have the Cheqd MCP Server running, you can:

  • Explore the available tools for DID management and credential operations

  • Create your first verifiable credential using the provided tools

  • Set up a complete identity verification workflow

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 .

Variable
Description
Default
Variable
Description
Required

For detailed usage examples, refer to our .

Create AI Agent DID

Create a W3C conformant DID on cheqd using our MCP Server.

the previous tutorial

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.

a Docker Compose file
no-db.env file
pre-built cheqd Studio Docker image on Github
logto.env file
LogTo documentation
with-db.env file
Docker Compose profiles
Dockerfile
Credo
cheqd DID Method
"mcpServers": {
    "cheqd-mcp": {
        "command": "npx",
        "args": [
            "mcp-remote",
            "https://remote-mcp.cheqd.io/sse",
            "--transport", "sse-only"
        ],
    }
}
# Clone the repository
git clone https://github.com/cheqd/mcp-toolkit.git
cd mcp-toolkit
./env.example
TOOLS="credo"                                # Required tool configuration
PORT="5000"                                # The Port where the Remote MCP Server will run
CREDO_PORT="3000"                            # Port for the Credo agent
CREDO_NAME="faber"                        # Name of the Credo agent
CREDO_ENDPOINT="http://faber:3000"        # Public endpoint connections
CREDO_CHEQD_TESTNET_MNEMONIC="your-testnet-mnemonic" # Required for cheqd network access
TRAIN_ENDPOINT="https://dev-train.trust-scheme.de/tcr/v1/"    # The TRAIN endpoint for verification of trust registry 

TOOLS

Comma-separated list of tools to enable

"credo"

PORT

The port where remote MCP server will run

5000

CREDO_CHEQD_TESTNET_MNEMONIC

Mnemonic for cheqd testnet wallet

Yes

CREDO_PORT

Port for the Credo agent

No

CREDO_NAME

Name for the Credo agent

No

CREDO_ENDPOINT

Public endpoint for DIDComm connections

No

TRAIN_ENDPOINT

The endpoint for verifying trust registry

No

{
  "mcpServers": {
    "cheqd": {
      "command": "docker",
      "args": [
        "compose",
        "-f",
        "/path/to/repo/mcp-toolkit/docker/docker-compose.yml",
        "run",
        "--rm",
        "-p", 
        "3000:3000",
        "--name",
        "faber",
        "-T",
        "mcp-server"
      ]
    }
  }
}
MCP Client as per the setup instructions

Create AI Agent DID

Create a new did:cheqd DID for the AI Agent.

Import AI Agent Credential

Import and provision a JWT Credential to your AI Agent

Issue Credentials

Issue Verifiable Credentials signed by cheqd DIDs using MCP Toolkit.

Verify Credentials

Verify a Credential using MCP Toolkit.

Model Context Protocol
@cheqd/mcp-toolkit-credo
Claude Desktop
Trust Registry Verification Guide

Issue a Verifiable Credential

Tutorial: Issue a Verifiable Credential using MCP Toolkit

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

⚠️ Before you begin...

Step 1: Start your Holder Agent

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

Step 2: Create Connection between Holder and Claude Desktop.

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

Parameters and Request Body

For automated acceptance, pass the following parameters:

auto_accept

Set this to true.

A simple request body is below:

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

Step 3: Claude Desktop accepts the invitation

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

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

Step 4: Ask Claude to issue a Credential

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

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

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

Step 5: Holder accepts and stores the Credential.

Parameters

Filter on "offer-received" state

state

Set this to "offer-received".

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

Now, store the received Credential into the Holder wallet.

Advanced functionality

Advanced functionality for cheqd's MCP Server.

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

Import Credential to AI Agent

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

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

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

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

What is happening under the hood?

Validate AI Agent Trust Chain

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:

Learn more about what's happening under the hood:

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

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

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

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 .

docker-compose file
http://localhost:4001/api/doc
http://localhost:4001/api/doc

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.

Credo
MCP Client as per the setup instructions
our instructions
Step 4
MCP Client as per the setup instructions

Verify a Credential

Tutorial: Verify a Credential using MCP Toolkit

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

⚠️ Before you begin...

Step 1: Create Connection between Holder and Claude Desktop.

Step 2: Ask Claude to issue a Proof Request

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

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

Step 3: Holder checks Request and sends Proof

Parameters

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

limit

Set this to 10.

offset

set this to 0.

state

Set this to "request-received"

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

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

Request Body

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

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

Step 4: Ask Claude to validate the Presentation Response

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

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

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

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.

http://localhost:4001/api/doc
issued a Credential
MCP Client as per the setup instructions
create a new connection

Resolve a DID

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 DIDs and Identity Keys

Create Decentralized Identifiers (DIDs) and identity keys using cheqd's DID Method (did:cheqd).

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

What options do I have for creating DIDs on cheqd?

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

Get started with cheqd Studio

The easiest way to start creating DIDs is with our product cheqd Studio, allowing users to build and create did:cheqd DIDs using REST APIs.

Partner SaaS support

cheqd DIDs are also supported in a range of SaaS offerings from cheqd partners, making it possible to use did:cheqd across different platforms:

Read up on our DID Method

DIDs created on cheqd use the did:cheqd DID Method. This is fully defined below, as well as the associated ledger-write fees:

Learn about DIDs If you want to .

learn about what DIDs are, please go over to our learning site here

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:keyDID method.

Resolve DID

Resolve a DID to retrieve the associated DID Document.

Deactivate a DID

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 Identity Keys and Subject DIDs

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.

Creating a Subject DID

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.

did:key specification
Cover

Godiddy

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

Cover

Paradym

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

Cover

Truvera (Dock)

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

Cover

Hovi

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

Cover

Cloud Platform (Walt.id)

Cloud Platform by Walt.id similarly fully supports EU Architecture & Reference Framework standards with cheqd under the hood.

Cover

cheqd DID Method

Click here to learn more about the cheqd DID method (did:cheqd).

Cover

DID Write Pricing

Click here to understand the price of DIDs and other resources on cheqd, compared to other identity networks.

Sign into your account
Create a new account
Cover

cheqd Studio

Low complexity

Customers can easily integrate cheqd's identity functionality into their existing applications through hitting simple REST APIs using cheqd Studio.

Cover

Software Development Kits (SDKs)

Moderate complexity

To have greater flexibility, customers can build identity solutions through a set of SDKs to meet different technical stacks and requirements.

Cover

Direct integration with ledger code (cheqd SDK)

High complexity

For full customisability and flexibility, the cheqd SDK plugs directly into cheqd Network and is responsible for communicating with the core ledger code.

Cover

Get started with cheqd Studio

Click here to start your journey with cheqd Studio, create your account and begin using cheqd's underlying functionality.

cheqd Capability diagram
cheqd packages diagram
Cover

Paradym

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

Cover

Truvera (Dock)

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

Cover

Hovi

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

Cover

Cloud Platform (Walt.id)

Cloud Platform by Walt.id similarly fully supports EU Architecture & Reference Framework standards with cheqd under the hood.

Cover

Godiddy

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

Cover

Setup AI Agent Trust Registry

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

Cover

Setup and Configure MCP Server

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

Root DID (rTAO) accrediting or authorising sub-DIDs (TAOs)
Full tree diagram of root DID accrediting DIDs, that accredit AI Agents.
Cover

Decentralized Trust Chains (DTCs)

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

Cover

Set Up Trust Chain

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

Cover

Get Started with TRAIN

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

Cover

Decentralized Trust Chains (DTCs)

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

Cover

Get Started With TRAIN

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

Cover

cheqd Studio

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

Cover

Credo

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

Cover

ACA-Py

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

Cover

Veramo

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

Cover

Walt.id Community Stack

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

Cover

DID Registrar

Cover

cheqd Cosmos CLI

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

Cover

Credo

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

Cover

ACA-Py

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

Cover

Veramo

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

Cover

Walt.id Community Stack

Cover

Design, build and configure your AI Agent trust registry with cheqd Studio and our MCP server.

Cover

Use our trust registry validation prompts to get AI agents to identify themselves and demonstrate their trustworthiness against a trust registry.

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

🖐️
✅
Universal Registrar
European Architecture and Reference Framework (ARF)
Medium
YouTube
Telegram
LinkedIn
Discord

Verify Credential

Verify a W3C Verifiable Credential using cheqd Studio.

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

Step 1: Obtain Credential to Verify

Step 2: Configure Verification Parameters

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

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

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

fetchRemoteContexts

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

  • true

  • false (default)

Step 3: Pass the Credential to the API

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

  1. Whether the Credential has been tampered

  2. Whether the Credential has a valid issuance date

  3. Whether the Credential has expired

  4. Whether the Credential Status is valid

Create Issuer DID

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:

Step 1: Set up your account

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

Step 2: Create a DID and associated DID Document

Using the /did/create API, users have two options for creating a did:cheqd DID and associated DID Document on-ledger:

  1. Filling out a simple form using the application/x-www-url-form-encoded or application/json option within an API client of your choice.

  2. Compiling a full DID Document body yourself using the application/json option, using already created identity keys, within an API client of your choice.

Option 1. Choose from a few variables and we will compile the DID for you

This is the easiest way to create DIDs on cheqd and is recommended for users who are not overly familiar with compiling DID Documents.

Using application/x-www-url-form-encoded

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

network (required)
  • "testnet" (recommended for testing)

  • "mainnet" (recommended for production)

methodSpecificIdAlgo (required)
  • "uuid" - this is a Universally Unique Identifier (recommended)

  • "base58btc" - this is an identifier which is commonly used for Hyperledger Indy transactions

verificationMethod / type (required)
  • "Ed25519VerificationKey2018" (recommended)

  • "Ed25519VerificationKey2020"

  • "JSONWebKey2020"

assertionMethod (optional)
  • true (recommended if used for issuing Verifiable Credentials)

  • false

didDocument (optional)

This input field contains either a complete DID document, or an incremental change (diff) to a DID document. For example:

{
  "service": [
    {
      "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#service-1",
      "type": "LinkedDomains",
      "serviceEndpoint": [
        "https://example.com"
      ]
    }
  ]
}

From this request, cheqd Studio will automatically create and publish a DID and associated DID Document to the ledger and return it as a response.

Using application/json

Alternatively, you can use the application/json option and pass only a few specific inputs, for example:

{
  "network": "testnet",
  "identifierFormatType": "uuid",
  "assertionMethod": false
}

Or, if you have created a keypair already that you want to use, you can reference that in the request:

{
  "network": "testnet",
  "identifierFormatType": "uuid",
  "assertionMethod": false,
  "options": {
    "key": "8255ddadd75695e01f3d98fcec8ccc7861a030b317d4326b0e48a4d579ddc43a", // Pass if you have created a key separately
    "verificationMethodType": "Ed25519VerificationKey2018"
  }
}

Option 2. Publish a fully compiled DID Document body yourself

Step 1: Create a new keypair

Step 2: Utilise the DID Document template helper

Step 3: Paste the response

Within the /did/create JSON payload, paste the response of your DID Document template, with your own signing keys.

Request format:

{
  "didDocument": {
    "id": "did:cheqd:testnet:0ff9df5d-653b-4f77-a66c-0035abc34d63",
    "controller": [
      "did:cheqd:testnet:0ff9df5d-653b-4f77-a66c-0035abc34d63"
    ],
    "verificationMethod": [
      {
        "id": "did:cheqd:testnet:0ff9df5d-653b-4f77-a66c-0035abc34d63#key-1",
        "type": "JsonWebKey2020",
        "controller": "did:cheqd:testnet:0ff9df5d-653b-4f77-a66c-0035abc34d63",
        "publicKeyJwk": {
          "crv": "Ed25519",
          "kty": "OKP",
          "x": "BFSLOxwMJgpmWRtTUuo0JAvz6VXGp4WDDcN0dFfCQKo"
        }
      }
    ],
    "authentication": [
      "did:cheqd:testnet:0ff9df5d-653b-4f77-a66c-0035abc34d63#key-1"
    ]
  }
}

Step 3: Hit execute on the API

Hit execute on the API below to create your did:cheqd DID and associated DID Document.

List DIDs associated with your account

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

Alternatives

Below are a list of alternatives for creating cheqd DIDs.

Update a DID

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

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

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

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

  2. The full updated DID Document body.

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

Example Request formats

Update Service Section

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

{
  "did": "did:cheqd:mainnet:71e24492-e62c-4e55-a581-007a6e36e881",
  "service": [
      {
        "id": "did:cheqd:mainnet:71e24492-e62c-4e55-a581-007a6e36e881#website",
        "type": "LinkedDomains",
        "serviceEndpoint": [
          "https:example.com"
        ]
      }
    ]
}

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

Rotate Keys

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

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

{
  "did": "did:cheqd:mainnet:71e24492-e62c-4e55-a581-007a6e36e881",
  "verificationMethod": [
     {
       "id":"did:cheqd:mainnet:71e24492-e62c-4e55-a581-007a6e36e881",
       "type":"Ed25519VerificationKey2018",
       "controller":"did:cheqd:mainnet:71e24492-e62c-4e55-a581-007a6e36e881",
       "publicKeyBase58":"4sjwZ3VGWupJ26ytxjhU6LhjKiPrHV5reZbaNseyHtf8"
     }
  ],
  "authentication": [
       "did:cheqd:mainnet:71e24492-e62c-4e55-a581-007a6e36e881#key-1"
  ]
}

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

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

Pass full updated DID Document body

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

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

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

Get started with the API below

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

Revoke Credential

Revoke a W3C Verifiable Credential using cheqd Studio.

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

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

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

Step 2: Decide whether to publish update to the ledger

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

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

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

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

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

Suspend or Unsuspend Credential

Suspend or unsuspend a W3C Verifiable Credential using cheqd Studio.

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

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

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

Step 2: Decide whether to publish update to the ledger

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

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

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

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

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

Unsuspend (reinstate) Verifiable Credentials

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

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

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

Step 2: Decide whether to publish update to the ledger

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

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

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

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

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

Issue Credentials and Presentations

Issue and manage Verifiable Credentials and Presentations, signed by cheqd Decentralized Identifiers (DIDs).

Verifiable Credentials are a tamper-evident data format for asserting a set of claims about a subject. You can issue and verify Verifiable Credentials and Presentations without building complex integrations, using our simple cheqd Studio APIs.

What options do I have for issuing credentials anchored on cheqd?

There are many different ways to issue verifiable credentials signed by DIDs anchored on cheqd, with options for easy integration (e.g. cheqd Studio) and more bespoke integrations (e.g. Credo and Veramo). Below are a list of options for issuing credentials with cheqd underneath:

Partner SaaS products

You can use SaaS products from our partners to create best-in-class credential ecosystems, built on cheqd

Get started with cheqd Studio

Supported Credential types

cheqd supports all four major digital Credential types via its selection of SDKs and APIs. Below you can learn about these Credential formats:

Credential Coverage

Depending on what type of credentials you want to use, choose the SDK that suits your tech stack:

Issue Credential

Issue W3C conformant Verifiable Credentials over REST API, using cheqd Studio.

Using the /credential/create API, it is possible to issue Verifiable Credentials, signed by a cheqd DID, in a few clicks or lines of code.

Step 1: Set up your account

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

Step 2: Create an Issuer DID

Before you can issue a Verifiable Credential, you need to create an Issuer DID which is used to sign the Credential payload. Use the API in the page below to create an Issuer DID:

(Optional) Step 3: Create a Subject DID

Again, before you issue a Verifiable Credential, you need to know to whom you are issuing it. If you need to create a Subject DID, you can take a look at the page here:

Step 4: Compile your Credential body

Within the JSON object of the API request, you will need to input the issuer and subject information, as well as the attributes which you want to issue in the Credential. You may also want to add additional fields such as a credentialSchema.

Users have two options for compiling the Credential bodies and issuing Verifiable Credentials:

  1. Filling out a simple form using the application/x-www-url-form-encoded option within an API client of your choice.

  2. Compiling a Credential body yourself using the application/json option within an API client of your choice.

Option 1. Choose from a few variables and we will compile the Credential body for you

This is the easiest way to issue Credentials and is recommended for users who are not overly familiar with compiling JSON objects.

Using the application/x-www-url-form-encoded option, users are able to choose between the following variables and options to issue Verifiable Credentials:

issuerDid (required)
subjectDid (required)
attributes (required)
credentialSchema (required for Verida wallet)

This is the Schema which the Credential body takes the form of. For the Verida wallet, to display a credential, it needs to have a schema associated with it.

@context (optional)
type (optional)
expirationDate (optional)
format (optional)

Format of the Verifiable Credential. Defaults to VC-JWT.

  • jwt (VC-JWT)

  • lds (JSON-LD)

credentialStatus (optional)

credentialStatus properties for VC revocation or suspension. Takes statusListName and statusListPurpose as inputs. If you have already created a Status List, you can include the same inputs here to map this issued credential within the created bitstring.

Additional options for specifying credentialStatus bitstring index

Below are a set of examples of alternative input parameters for users to specify the bitstring index of the issued Credential. The bitstring index is where exactly the issued credential will map to within the Status List. This should be noted and stored by the issuer to keep a record of which issued credentials are active, revoked or suspended:

Example Request Format: Random Bitstring index
Example Request Format: Specified Bitstring index
Example Request Format: Bitstring index within a given range
Example Request Format: Bitstring including omitted bits

Ensure that the "statusPurpose" and "statusListName" is the same as the existing Status List on-ledger.

Option 2. Publish a JSON payload yourself

Instead of using simple form variables, you can issue a Verifiable Credential using a JSON payload with the application/json option.

Request format

Below is an example of the request format for issuing a Verifiable Credential using a custom JSON payload, including some of the possible parameters:

Step 5: Issue a Credential using the API below

Execute the API below to issue a Verifiable Credential, signed by your issuer DID.

Alternatives

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

t

Verify Presentation

Verify W3C Verifiable Presentations using cheqd Studio.

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

Step 1: Obtain Presentation to Verify

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

Step 2: Configure Verification Parameters

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

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

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

fetchRemoteContexts

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

  • true

  • false (default)

Step 3: Execute the API

Use the API below to verify a Presentation

Setup AI Agent Trust Registry

Walkthrough for setting up Trust Registries for your AI Agents.

Users are able to build AI Agent Trust Registries using our cheqd Studio APIs. The following steps will enable organisations, governance authorities, auditors and AI Agents to establish permissions, rules and hierarchy between each other.

Step 1: Set up your cheqd Studio account

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

Step 2: Create a Root DID

The first step for any trust registry is a Root DID, which acts as a trust anchor for the chain of trust below. This DID should be for the highest level of trust in your ecosystem, such as a governance authority, a managing company or an auditor.

For more basic trust registries, the company issuing the AI Agent credentials may also be the Root of Trust with the Root DID.

Step 3: Design Schemas for your Ecosystem

When you accredit an AI Agent or Organisation that builds AI Agents, you need to do so for a particular purpose. These purposes are defined in schemas, containing the fields that MUST or MAY be present in an accreditation or credential.

We have created some template schemas that we suggest you use within your trust registry!

3.1 Verifiable Attestation

This is a schema for a Verifiable Credential issued to your AI Agent from a Trusted Issuer. The Issuer attests to features of the AI Agent, hence we call it a Verifiable Attestation.

This schema can be always retrieved from the cheqd ledger at:

3.2 Verifiable Accreditation

This is a schema for a Verifiable Credential between two DIDs, to accredit the DIDs for specific purposes. The accreditedFor section of the Accreditation can be modified with specific schemas for AI Agents.

Verifiable Accreditation Schema

This schema can be always retrieved from the cheqd ledger at:

We suggest that you use the same schemas that we have already made for Verifiable Accreditations and Attestations, although this is not a requirement

3.3 Custom Schemas

Builders can create custom schemas for their AI Agents, or for the accreditations between different organisations in their ecosystems. This is achieved through editing the accreditedFor section of a Verifiable Attestation above.

For example, the following schema shows how the configuration of an AI Agent can be represented within a schema:

AI Agent Authorisation Schema

Step 4: Publish your schemas to cheqd as DID-Linked Resources

With the Root DID you created in Step 2, you can create links to your schemas, storing them on-chain in a resolvable format.

You can follow the tutorial here to publish your schemas as DID-Linked Resources. Generally we use the resourceType of JSONSchemaValidator2020 for JSON schemas written to the ledger.

This will store the schemas securely on the cheqd Network, where they can be fetched using DID URLs.

Step 5: Issue a Root Authorisation for the Trust Chain

The Root Authorisation in trust registries on cheqd is called a rootAuthorisationForTrustChain. This authorisation contains informartion about the governance framework the AI Agents will operate in, and signifies to trust registry resolvers that they have reached the intended Root.

Authorisations are issued between two DIDs (which may be the same). As such, if you are managing the entire ecosystem, you may need to create multiple DIDs for different roles in the ecosystem. Otherwise, you need to be aware of the DIDs of the organisations you are seeking to authorise.

Generally, the Root Authorisation also contains the schemas and types of credentials that will be issued below in the trust chain.

Note that it is common for the rootAuthorisationForTrustChain to be self-issued, from the same issuer DID to subject DID, authorising it to carry out other operations.

5.1 Verifiable Authorisation for Trust Chain

Use the following request format:

Request format for Verifiable Authorisation for Trust Chain
Response format for Verifiable Authorisation for Trust Chain

You can use the API below to make this transaction, using the parameter 'authorise'.

Step 6: Issue your next Accreditation

Depending on how many layers deep you want your trust registry, you now need to issue an accreditationToAccredit or an accreditationToAttest. In essence, you need to decide whether you want to accredit a subordinate entity to accredit other organisations (creating a deeper trust chain), or accredit a subordinate entity to issue Credentials to your AI Agent.

6.1 Verifiable Accreditation to Accredit

Request format for Verifiable Accreditation to Accredit
Response format for Verifiable Accreditation to Accredit

For a trusted ecosystem, these attestations are required to trace the legitimacy of a credential issuer to a root-of-trust.

6.2 Verifiable Accreditation to Attest

If you just want to accredit the subordinate DID to issue credentials to your AI Agent, use a Verifiable Accreditation to Attest.

Request format for Verifiable Accreditation to Attest
Response format for 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.

Note that there MUST be an accreditationToAttest for credentials to be issued that reference an accreditation in the next tutorial.

Core Trust Registry Setup Complete!

Great! Now you have set up the core functionality for your trust registry. Next you will want to issue a Verifiable Attestation from the "trusted issuer" in the Trust Registry to an AI Agent:

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:

Functionality
cheqd Studio
Credo (and Paradym)
ACA-Py
Veramo
Walt.id

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:

Verifiable Attestation Schema

Using POST

Request Parameter
Required
Description
Request Parameter
Required
Description
Request Parameter
Required
Description
Credential that has been issued

Set Up Your Account

Set up your account with cheqd Studio and get your API key to start using the APIs.

created a set of identity keys
/key/create API
Helper Tool in our DID Registrar here
did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0
did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK
{
  "name": "Bob",
  "gender": "male"
}
https://common.schemas.verida.io/health/pathology/tests/covid19/pcr/v0.1.0/schema.json
https://www.w3.org/2018/credentials/v1
VerifiableCredential
2023-06-08T13:49:28.000Z
{
  "statusPurpose": "revocation",
  "statusListName": "employee-credentials"
}
{
  "statusPurpose": "revocation",
  "statusListName": "employee-credentials"
}
{
  "statusPurpose": "revocation",
  "statusListName": "employee-credentials",
  "statusListIndex": 1543
}
{
  "statusPurpose": "revocation",
  "statusListName": "employee-credentials"
  "statusListRangeStart": 1000,
  "statusListRangeEnd": 2000
}
{
  "statusPurpose": "revocation",
  "statusListName": "employee-credentials"
  "statusListRangeStart": 1000,
  "statusListRangeEnd": 2000,
  "indexNotIn": 1001. 1264. 1268, 1854
}
{
  "issuerDid": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0",
  "subjectDid": "did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK",
  "attributes": {
    "gender": "male",
    "name": "Bob"
  },
  "@context": [
    "https://schema.org"
  ],
  "type": [
    "Person"
  ],
  "credentialSchema": "https://common.schemas.verida.io/identity/kyc/FinClusive/individual-basic/v0.1.0/schema.json",
  "format": "jwt",
  "credentialStatus": {
    "statusPurpose": "revocation",
    "statusListName": "employee-credentials",
    "statusListIndex": 10
  }
}
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Verifiable Attestation",
  "description": "The schema defines a generic structure for any Verifiable Credentials according to the VCDM v1.1",
  "type": "object",
  "properties": {
    "@context": {
      "description": "Semantic context for the issued credential. First element MUST be https://www.w3.org/2018/credentials/v1",
      "type": "array",
      "items": {
        "type": "string",
        "format": "uri"
      },
      "contains": {
        "const": "https://www.w3.org/2018/credentials/v1"
      },
      "minItems": 1,
      "uniqueItems": true
    },
    "id": {
      "description": "Globally unique identifier for the issued credential",
      "type": "string",
      "format": "uri"
    },
    "type": {
      "description": "Full type chain, used to identify the credential base types",
      "type": "array",
      "items": {
        "type": "string"
      },
      "contains": {
        "type": "string",
        "const": "VerifiableAttestation"
      },
      "uniqueItems": true
    },
    "issuer": {
      "description": "Defines a property for expressing the issuer of a Verifiable Credential",
      "oneOf": [
        {
          "description": "DID of the credential issuer",
          "type": "string",
          "format": "uri"
        },
        {
          "type": "object",
          "required": ["id"],
          "properties": {
            "id": {
              "description": "DID of the credential issuer",
              "type": "string",
              "format": "uri"
            }
          }
        }
      ]
    },
    "issuanceDate": {
      "description": "Defines the date and time, when the issued credential becomes valid",
      "type": "string",
      "format": "date-time"
    },
    "issued": {
      "description": "Defines when the issued credential was issued",
      "type": "string",
      "format": "date-time"
    },
    "validFrom": {
      "description": "Defines the date and time, when the issued credential becomes valid",
      "type": "string",
      "format": "date-time"
    },
    "validUntil": {
      "description": "Defines the date and time, when the issued credential expires",
      "type": "string",
      "format": "date-time"
    },
    "expirationDate": {
      "description": "Defines the date and time, when the issued credential expires",
      "type": "string",
      "format": "date-time"
    },
    "credentialSubject": {
      "description": "Defines information about the subject that is defined by the type chain",
      "anyOf": [
        {
          "$ref": "#/$defs/credentialSubject"
        },
        {
          "type": "array",
          "items": {
            "$ref": "#/$defs/credentialSubject"
          }
        }
      ]
    },
    "credentialStatus": {
      "description": "Defines suspension and/or revocation details for the issued credential. Further redefined by the type extension",
      "anyOf": [
        {
          "$ref": "#/$defs/credentialStatus"
        },
        {
          "type": "array",
          "items": {
            "$ref": "#/$defs/credentialStatus"
          }
        }
      ]
    },
    "credentialSchema": {
      "description": "One or more schemas that validate the Verifiable Credential.",
      "anyOf": [
        {
          "$ref": "#/$defs/credentialSchema"
        },
        {
          "type": "array",
          "items": {
            "$ref": "#/$defs/credentialSchema"
          }
        }
      ]
    },
    "termsOfUse": {
      "description": "Contains the terms under which the issued credential was issued",
      "anyOf": [
        {
          "$ref": "#/$defs/termsOfUse"
        },
        {
          "type": "array",
          "items": {
            "$ref": "#/$defs/termsOfUse"
          }
        }
      ]
    },
    "evidence": {
      "description": "Contains the optional evidence used to issue this credential",
      "anyOf": [
        {
          "$ref": "#/$defs/evidence"
        },
        {
          "type": "array",
          "items": {
            "$ref": "#/$defs/evidence"
          }
        }
      ]
    }
  },
  "required": [
    "@context",
    "id",
    "type",
    "issuer",
    "credentialSubject"
  ],
  "$defs": {
    "credentialSubject": {
      "description": "Defines information about the subject that is defined by the type chain",
      "type": "object",
      "properties": {
        "id": {
          "description": "Defines the DID of the subject that is described by the issued credential",
          "type": "string",
          "format": "uri"
        }
      }
    },
    "credentialStatus": {
      "description": "Defines suspension and/or revocation details for the issued credential. Further redefined by the type extension",
      "type": "object",
      "properties": {
        "id": {
          "description": "Exact identity for the credential status",
          "type": "string",
          "format": "uri"
        },
        "type": {
          "description": "Defines the revocation type extension",
          "type": "string"
        }
      },
      "required": ["id", "type"]
    },
    "credentialSchema": {
      "description": "Contains information about the credential schema on which the issued credential is based",
      "type": "object",
      "properties": {
        "id": {
          "description": "References the credential schema stored on the Trusted Schemas Registry (TSR) on which the Verifiable Authorisation is based on",
          "type": "string",
          "format": "uri"
        },
        "type": {
          "description": "Defines credential schema type",
          "type": "string"
        }
      },
      "required": ["id", "type"]
    },
    "termsOfUse": {
      "description": "Contains the terms under which the issued credential was issued",
      "type": "object",
      "properties": {
        "id": {
          "description": "Contains a URL that points to where more information about this instance of terms of use can be found.",
          "type": "string"
        },
        "type": {
          "description": "Defines the type extension",
          "type": "string"
        }
      },
      "required": ["type"]
    },
    "evidence": {
      "type": "object",
      "properties": {
        "id": {
          "description": "If present, it SHOULD contain a URL that points to where more information about this instance of evidence can be found.",
          "type": "string"
        },
        "type": {
          "anyOf": [
            {
              "description": "Defines the evidence type extension",
              "type": "string"
            },
            {
              "description": "Defines the evidence type extension",
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          ]
        }
      },
      "required": ["type"]
    }
  }
}
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Verifiable Accreditation",
  "description": "Schema of a Verifiable Accreditation",
  "type": "object",
  "allOf": [
    {
      "$ref": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e?resourceName=VerifiableAttestation&resourceType=JSONSchemaValidator2020"
    },
    {
      "properties": {
        "credentialSubject": {
          "description": "Defines additional information about the subject that is described by the Verifiable Accreditation",
          "type": "object",
          "properties": {
            "id": {
              "description": "Defines a unique identifier of the Verifiable Accreditation",
              "type": "string",
              "format": "uri"
            },
            "accreditedFor": {
              "description": "Defines a list of claims that define/determine the authorisation of an Issuer to issue certain types of VCs",
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "schemaId": {
                    "description": "Schema, registered in Trusted  Schemas Registry, which the accredited organisation is allowed to issue, as per their accreditation",
                    "type": "string",
                    "format": "uri"
                  },
                  "types": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "limitJurisdiction": {
                    "anyOf": [
                      {
                        "description": "Defines the jurisdiction for which the accreditation is valid",
                        "type": "string",
                        "format": "uri"
                      },
                      {
                        "type": "array",
                        "description": "Defines the jurisdictions for which the accreditation is valid",
                        "items": {
                          "type": "string",
                          "format": "uri"
                        }
                      }
                    ]
                  }
                },
                "required": ["schemaId", "types"]
              }
            }
          },
          "required": ["id", "accreditedFor"]
        },
        "credentialStatus": {
          "description": "Defines revocation details for the issued credential. Further redefined by type extension",
          "type": "object",
          "properties": {
            "id": {
              "description": "Exact identity for the credential status",
              "type": "string",
              "format": "uri"
            },
            "type": {
              "description": "Defines the revocation status type",
              "type": "string",
              "const": "EbsiAccreditationEntry"
            }
          },
          "required": ["id", "type"]
        }
      },
      "required": [
        "credentialSubject",
        "termsOfUse"
      ]
    }
  ]
}
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "allOf": [
    {
      "$ref": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e?resourceName=VerifiableAttestation&resourceType=JSONSchemaValidator2020"
    },
    {
    "properties": {
      "credentialSubject": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "uri"
          },
          "aiAgentName": {
            "type": "string"
          },
          "aiAgentVersion": {
            "type": "string"
          },
          "model": {
            "type": "string"
          },
          "modelVersion": {
            "type": "string"
          },
          "contextWindow": {
            "type": "integer",
            "minimum": 0
          },
          "temperature": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          },
          "topK": {
            "type": "integer",
            "minimum": 0
          },
          "topP": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          },
          "maxTokens": {
            "type": "integer",
            "minimum": 0
          },
          "fineTuned": {
            "type": "boolean"
          },
          "fineTuningDetails": {
            "type": "string",
            "nullable": true
          },
          "safetyRating": {
            "type": "string"
          },
          "evaluationMetrics": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "certificationAuthority": {
            "type": "string"
          },
          "validUntil": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "id",
          "aiAgentName",
          "model"
        ]
      },
      "proof": {
        "description": "Contains information about the proof",
        "type": "object",
        "properties": {
          "type": {
            "description": "Defines the proof type",
            "type": "string"
          },
          "proofPurpose": {
            "description": "Defines the purpose of the proof",
            "type": "string"
          },
          "created": {
            "description": "Defines the date and time, when the proof has been created",
            "type": "string",
            "format": "date-time"
          },
          "verificationMethod": {
            "description": "Contains information about the verification method / proof mechanisms",
            "type": "string"
          },
          "jws": {
            "description": "Defines the proof value in JWS format",
            "type": "string"
          }
        },
        "required": [
          "type",
          "proofPurpose",
          "created",
          "verificationMethod",
          "jws"
        ]
      }
    },
    "required": ["credentialSubject", "proof"]
    }
  ]
}
{
  "issuerDid": "did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e", // This is the Root DID for the Trust Chain
  "subjectDid": "did:cheqd:testnet:6af412d7-2f04-4e12-a424-e6719db487ad", // This is the DID Authorised at a Root Level and may often be the same DID as the issuer
  "schemas": [ // enter the schemas you have created for your trust registry
    {
      "types": "AIAgentAuthorisation",
      "url": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:c6630f1e-9248-4af6-b7ac-5bcaf646f213?resourceName=AIAgentAuthorisation&resourceType=JSONSchemaValidator2020"
    },
    {
      "uri": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e?resourceName=VerifiableAccreditation&resourceType=JSONSchemaValidator2020",
      "types": [
          "VerifiableCredential",
          "VerifiableAccreditation",
          "VerifiableAccreditationToAccredit"
        ]
      },
      {
       "uri": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e?resourceName=VerifiableAttestation&resourceType=JSONSchemaValidator2020",
       "types": [
          "VerifiableCredential",
          "VerifiableAttestation",
          "VerifiableAccreditationToAttest"
        ]
      }
  ],
  "format": "jwt",
  "accreditationName": "authoriseAccreditationTest",
  "trustFramework": "https://learn.cheqd.io/governance/start",
  "trustFrameworkId": "cheqd Governance Framework"
}
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1"
  ],
  "type": [
    "VerifiableCredential",
    "VerifiableAuthorisationForTrustChain"
  ],
  "issuer": {
    "id": "did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e"
  },
  "credentialSubject": {
    "accreditedFor": [
      {
        "schemaId": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d?resourceName=MuseumPassCredentialSchema&resourceType=JsonSchemaValidator2018",
        "type": "MuseumPassCredential"
      }
    ],
    "id": "did:cheqd:testnet:6af412d7-2f04-4e12-a424-e6719db487ad"
  },
  "issuanceDate": "2024-10-15T04:06:47.000Z",
  "termsOfUse": {
    "type": "VerifiableAuthorisationForTrustChain",
    "trustFramework": "https://learn.cheqd.io/governance/start",
    "trustFrameworkId": "cheqd Governance Framework"
  },
  "proof": {
    "type": "JwtProof2020",
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiVmVyaWZpYWJsZUF1dGhvcmlzYXRpb25Gb3JUcnVzdENoYWluIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImFjY3JlZGl0ZWRGb3IiOlt7InNjaGVtYUlkIjoiaHR0cHM6Ly9yZXNvbHZlci5jaGVxZC5uZXQvMS4wL2lkZW50aWZpZXJzL2RpZDpjaGVxZDp0ZXN0bmV0OjBhNWI5NGQwLWE0MTctNDhlZC1hNmY1LTRhYmM5ZTk1ODg4ZD9yZXNvdXJjZU5hbWU9TXVzZXVtUGFzc0NyZWRlbnRpYWxTY2hlbWEmcmVzb3VyY2VUeXBlPUpzb25TY2hlbWFWYWxpZGF0b3IyMDE4IiwidHlwZSI6Ik11c2V1bVBhc3NDcmVkZW50aWFsIn1dfSwidGVybXNPZlVzZSI6eyJ0eXBlIjoiVmVyaWZpYWJsZUF1dGhvcmlzYXRpb25Gb3JUcnVzdENoYWluIiwidHJ1c3RGcmFtZXdvcmsiOiJodHRwczovL2xlYXJuLmNoZXFkLmlvL2dvdmVybmFuY2Uvc3RhcnQiLCJ0cnVzdEZyYW1ld29ya0lkIjoiY2hlcWQgR292ZXJuYW5jZSBGcmFtZXdvcmsifX0sInN1YiI6ImRpZDpjaGVxZDp0ZXN0bmV0OjZhZjQxMmQ3LTJmMDQtNGUxMi1hNDI0LWU2NzE5ZGI0ODdhZCIsIm5iZiI6MTcyODk2NTIwNywiaXNzIjoiZGlkOmNoZXFkOnRlc3RuZXQ6YjAwM2RmNmYtZWM4ZS00OGRkLTlhMmItNzAxMWM1Y2YwYTVlIn0.6dKE9-y2Id852onu1_WnD6aJnDtxgFZcjCbCfQ8MT1ACsHY8ox5jiKP4QUJNmhwesLidC99Qa0uyCrUhvHc2Bg"
  }
}

"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": "did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e",
  "subjectDid": "did:cheqd:testnet:6af412d7-2f04-4e12-a424-e6719db487ad",
  "schemas": [
    {
      "types": "AIAgentAuthorisation",
      "url": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:c6630f1e-9248-4af6-b7ac-5bcaf646f213?resourceName=AIAgentAuthorisation&resourceType=JSONSchemaValidator2020"
    },
    {
      "uri": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e?resourceName=VerifiableAccreditation&resourceType=JSONSchemaValidator2020",
      "types": [
          "VerifiableCredential",
          "VerifiableAccreditation",
          "VerifiableAccreditationToAccredit"
        ]
      },
      {
       "uri": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e?resourceName=VerifiableAttestation&resourceType=JSONSchemaValidator2020",
       "types": [
          "VerifiableCredential",
          "VerifiableAttestation",
          "VerifiableAccreditationToAttest"
        ]
      }
  ],
  "format": "jwt",
  "accreditationName": "accreditationToAttestTest",
  "parentAccreditation": "did:cheqd:testnet:15b74787-6e48-4fd5-8020-eab24e990578?resourceName=accreditAccreditation&resourceType=VerifiableAccreditationToAccredit",
  "rootAuthorization": "did:cheqd:testnet:5RpEg66jhhbmASWPXJRWrA?resourceName=authorizeAccreditation&resourceType=VerifiableAuthorisationForTrustChain",
}
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1"
  ],
  "type": [
    "VerifiableCredential",
    "VerifiableAccreditationToAccredit"
  ],
  "issuer": {
    "id": "did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e"
  },
  "credentialSubject": {
    "accreditedFor": [
      {
        "schemaId": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d?resourceName=MuseumPassCredentialSchema&resourceType=JsonSchemaValidator2018",
        "type": "AIAgentAuthorisation"
      }
    ],
    "id": "did:cheqd:testnet:6af412d7-2f04-4e12-a424-e6719db487ad"
  },
  "issuanceDate": "2024-10-15T04:06:47.000Z",
  "termsOfUse": {
    "type": "AccreditationPolicy",
    "parentAccreditation": "did:cheqd:testnet:15b74787-6e48-4fd5-8020-eab24e990578?resourceName=accreditAccreditation&resourceType=VerifiableAccreditationToAccredit",
    "rootAuthorization": "did:cheqd:testnet:5RpEg66jhhbmASWPXJRWrA?resourceName=authorizeAccreditation&resourceType=VerifiableAuthorisationForTrustChain",
  },
  "proof": {
    "type": "JwtProof2020",
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiVmVyaWZpYWJsZUF1dGhvcmlzYXRpb25Gb3JUcnVzdENoYWluIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImFjY3JlZGl0ZWRGb3IiOlt7InNjaGVtYUlkIjoiaHR0cHM6Ly9yZXNvbHZlci5jaGVxZC5uZXQvMS4wL2lkZW50aWZpZXJzL2RpZDpjaGVxZDp0ZXN0bmV0OjBhNWI5NGQwLWE0MTctNDhlZC1hNmY1LTRhYmM5ZTk1ODg4ZD9yZXNvdXJjZU5hbWU9TXVzZXVtUGFzc0NyZWRlbnRpYWxTY2hlbWEmcmVzb3VyY2VUeXBlPUpzb25TY2hlbWFWYWxpZGF0b3IyMDE4IiwidHlwZSI6Ik11c2V1bVBhc3NDcmVkZW50aWFsIn1dfSwidGVybXNPZlVzZSI6eyJ0eXBlIjoiVmVyaWZpYWJsZUF1dGhvcmlzYXRpb25Gb3JUcnVzdENoYWluIiwidHJ1c3RGcmFtZXdvcmsiOiJodHRwczovL2xlYXJuLmNoZXFkLmlvL2dvdmVybmFuY2Uvc3RhcnQiLCJ0cnVzdEZyYW1ld29ya0lkIjoiY2hlcWQgR292ZXJuYW5jZSBGcmFtZXdvcmsifX0sInN1YiI6ImRpZDpjaGVxZDp0ZXN0bmV0OjZhZjQxMmQ3LTJmMDQtNGUxMi1hNDI0LWU2NzE5ZGI0ODdhZCIsIm5iZiI6MTcyODk2NTIwNywiaXNzIjoiZGlkOmNoZXFkOnRlc3RuZXQ6YjAwM2RmNmYtZWM4ZS00OGRkLTlhMmItNzAxMWM1Y2YwYTVlIn0.6dKE9-y2Id852onu1_WnD6aJnDtxgFZcjCbCfQ8MT1ACsHY8ox5jiKP4QUJNmhwesLidC99Qa0uyCrUhvHc2Bg"
  }
}

"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": "did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e",
  "subjectDid": "did:cheqd:testnet:6af412d7-2f04-4e12-a424-e6719db487ad",
  "schemas": [
    {
      "types": "AIAgentAuthorisation",
      "url": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:c6630f1e-9248-4af6-b7ac-5bcaf646f213?resourceName=AIAgentAuthorisation&resourceType=JSONSchemaValidator2020"
    },
    {
      "uri": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e?resourceName=VerifiableAccreditation&resourceType=JSONSchemaValidator2020",
      "types": [
          "VerifiableCredential",
          "VerifiableAccreditation",
          "VerifiableAccreditationToAccredit"
        ]
      },
      {
       "uri": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e?resourceName=VerifiableAttestation&resourceType=JSONSchemaValidator2020",
       "types": [
          "VerifiableCredential",
          "VerifiableAttestation",
          "VerifiableAccreditationToAttest"
        ]
      }
  ],
  "format": "jwt",
  "accreditationName": "accreditationToAttestTest",
  "parentAccreditation": "did:cheqd:testnet:15b74787-6e48-4fd5-8020-eab24e990578?resourceName=accreditAccreditation&resourceType=VerifiableAccreditationToAccredit",
  "rootAuthorization": "did:cheqd:testnet:5RpEg66jhhbmASWPXJRWrA?resourceName=authorizeAccreditation&resourceType=VerifiableAuthorisationForTrustChain",
}
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1"
  ],
  "type": [
    "VerifiableCredential",
    "VerifiableAccreditationToAccredit"
  ],
  "issuer": {
    "id": "did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e"
  },
  "credentialSubject": {
    "accreditedFor": [
      {
        "schemaId": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d?resourceName=MuseumPassCredentialSchema&resourceType=JsonSchemaValidator2018",
        "type": "MuseumPassCredential"
      }
    ],
    "id": "did:cheqd:testnet:6af412d7-2f04-4e12-a424-e6719db487ad"
  },
  "issuanceDate": "2024-10-15T04:06:47.000Z",
  "termsOfUse": {
    "type": "VerifiableAuthorisationForTrustChain",
    "parentAccreditation": "did:cheqd:testnet:15b74787-6e48-4fd5-8020-eab24e990578?resourceName=accreditAccreditation&resourceType=VerifiableAccreditationToAccredit",
    "rootAuthorization": "did:cheqd:testnet:5RpEg66jhhbmASWPXJRWrA?resourceName=authorizeAccreditation&resourceType=VerifiableAuthorisationForTrustChain",
  },
  "proof": {
    "type": "JwtProof2020",
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiVmVyaWZpYWJsZUF1dGhvcmlzYXRpb25Gb3JUcnVzdENoYWluIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImFjY3JlZGl0ZWRGb3IiOlt7InNjaGVtYUlkIjoiaHR0cHM6Ly9yZXNvbHZlci5jaGVxZC5uZXQvMS4wL2lkZW50aWZpZXJzL2RpZDpjaGVxZDp0ZXN0bmV0OjBhNWI5NGQwLWE0MTctNDhlZC1hNmY1LTRhYmM5ZTk1ODg4ZD9yZXNvdXJjZU5hbWU9TXVzZXVtUGFzc0NyZWRlbnRpYWxTY2hlbWEmcmVzb3VyY2VUeXBlPUpzb25TY2hlbWFWYWxpZGF0b3IyMDE4IiwidHlwZSI6Ik11c2V1bVBhc3NDcmVkZW50aWFsIn1dfSwidGVybXNPZlVzZSI6eyJ0eXBlIjoiVmVyaWZpYWJsZUF1dGhvcmlzYXRpb25Gb3JUcnVzdENoYWluIiwidHJ1c3RGcmFtZXdvcmsiOiJodHRwczovL2xlYXJuLmNoZXFkLmlvL2dvdmVybmFuY2Uvc3RhcnQiLCJ0cnVzdEZyYW1ld29ya0lkIjoiY2hlcWQgR292ZXJuYW5jZSBGcmFtZXdvcmsifX0sInN1YiI6ImRpZDpjaGVxZDp0ZXN0bmV0OjZhZjQxMmQ3LTJmMDQtNGUxMi1hNDI0LWU2NzE5ZGI0ODdhZCIsIm5iZiI6MTcyODk2NTIwNywiaXNzIjoiZGlkOmNoZXFkOnRlc3RuZXQ6YjAwM2RmNmYtZWM4ZS00OGRkLTlhMmItNzAxMWM1Y2YwYTVlIn0.6dKE9-y2Id852onu1_WnD6aJnDtxgFZcjCbCfQ8MT1ACsHY8ox5jiKP4QUJNmhwesLidC99Qa0uyCrUhvHc2Bg"
  }
}

"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

Issue Credentials

Issue W3C conformant Verifiable Credentials easily over REST API.

Verify Credentials

Verify whether Credentials are valid, have been tampered or have expired.

Verify Presentations

Verify whether a combination of Credentials are valid, have been tampered or have expired.

SD-JWT

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

AnonCreds

AnonCreds is a credential format maintained by the Hyperledger Foundation, with functionality for zero knowledge proofs (ZKPs) and selective disclosure.

JSON (JWT)

JSON Web Token (JWT) Credentials are a simple way to transmit Trusted Data as a JSON object.

JSON-LD

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

Set Up Your Account

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

Create an Issuer DID

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

Create a Subject DID

Create an off-ledger did:key or did:vda Subject DID to receive a Verifiable Credential.

Setup Verida Wallet

Learn about setting up your Verida wallet to receive a did:vda address.

Set up your account

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

Create an Issuer DID

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

Create DID-Linked Resource

Link resources such as schemas to your DID, publishing as a DID-Linked Resource.

Issue Verifiable Credentials to AI Agent

Issue a Verifiable Credential to your AI Agent referencing the parentAccreditation and rootAuthorisation for the trust chain.

Cover

Credo

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

Cover

ACA-Py

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

Cover

cheqd Studio

Our API product supports simple credential issuance in JSON and JSON-LD formats.

Cover

Veramo

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

Cover

Walt.id Community Stack

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

Cover

Paradym

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

Cover

Truvera (Dock)

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

Cover

Hovi

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

Cover

Cloud Platform

Cloud Platform by Walt.id similarly fully supports EU Architecture & Reference Framework standards with cheqd under the hood.

📚
Verifiable Credentials and Presentations are, please go over to our learning site here.
set up your account with cheqd Studio
syntax defined in the Verifiable Credential Data Model
@contexts section of the Verifiable Credential Data Model
types section of the Verifiable Credential Data Model
expiration section of the Verifiable Credentials Data Model
unencrypted Status Lists
encrypted Status Lists
/trust-registry/accreditation/issue
Step 2
Step
3

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.

Cover
Cover
Cover
Cover
Cover
Cover

✔️

✔️

✔️

✔️

✔️

✔️

✔️

✔️

✔️

✔️

❌

✔️

✔️

❌

❌

❌

✔️

⌛(roadmap)

⌛(roadmap)

✔️

Veramo SDK Plugin

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

Credo

ACA-Py

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

Walt.id SSI Kit

Setup Verida Wallet

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.

Verida Wallet

Subject DID

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

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

Rendering credentials

  1. A scannable QR code

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

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

Privacy Considerations

Understand how privacy is protected throughout the credential payment flow.

Privacy considerations

There are multiple areas within this flow where privacy needs to be maintained:

  1. Verifier pays Issuer: Any payment for decrypting a Status List should not be correlatable to a Holder presenting or sharing a Credential.

Status List construction

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.

Verifier pays Issuer

As part of the Access Control Condition setup, the Issuer can set a single payment fee for meeting the Access Control Conditions and decrypting a particular Status List.

Through setting a flat price for decryption, there is no price variation from checking one persons' credential status versus another's. This means that for a particular Status List, all payments on the network will be made at the same price.

Once again, this creates a layer of "Herd Privacy" for the Holder, since the Credential index itself is decoupled from the payment fee. Therefore. while transactions will be visible on the network, there will be no way for a third party to surveil the network or draw conclusions about who's Credential status is being checked.

If there was a variation in the price per Credential status check within the same status list, this would be more likely to become correlatable, alongside other information, back to a specific individual.

Continual improvement

We will continue to improve and assess the privacy considerations as we roll out Credential Payments. Some areas we believe there may be scope for privacy leakage are as follows:

  • Holders' Credential index is doxxed: If a Holder has a particular Credential index doxxed, as well as a link to the status list, there may be scope to monitor the Credential Status of that individual, through a payment. However, third parties will not know when that Holder is using their Credentials.

  • Issuer creates single entry Status List with specific unlock price: If an Issuer does not use our preset Status List length and creates their own resource with a single or few entries, they may provide a higher likelihood of doxxing when an individual uses their Credential. This is why cheqd, and the specification, has enforced a minimum Status List length.

Understanding Credential Payments

Learn how cheqd's Credential Payments work.

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

Learn about Credential Payments

Get started

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

t

Access Control Conditions

Understand how cheqd's Payment Rails work with Access Control Conditions.

Access Control Conditions

The Access Control Conditions outlined in this section establish a secure and structured framework for unlocking encrypted Status Lists and other DID-Linked Resource.

By employing a combination of Decentralised Identifiers (DIDs), DID-Linked Resources, encryption, and timed payment mechanisms, these access control conditions safeguard the integrity of the Resource, promote transparency, and control access to its data.

Request format: Payment conditions

For Credential Payments, the predominant Access Control Condition is a payment made from the Verifier of a Credential back to the Issuer.

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.

Response format: Access Control Conditions

If a Payment Condition is set upon creation of a Status List or other Resource, this will populate an Access Control Condition which is broadcasted across series of nodes to monitor whether the conditions have been met. The Access Control Condition uses query language to directly fetch information from the cheqd ledger, and is fully derived from the inputs made into the Payment Condition.

Each of these conditions are defined as follows:

Once an Access Control Condition has been set, the decryption keys are sharded between an array of nodes to prevent any single node or few malicious nodes from decrypting the data. This comprehensive setup ensures secure and controlled access to the specified resource based on specified criteria and events from the cheqd blockchain.

Get started

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

Charge for Verifiable Credentials

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

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

Get started

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

Learn more

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

Alternatives

Below are a list of alternatives for using Credential Payments.

Bulk Update or Rotate Encryption Keys

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

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

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

Charge for Status List

Create an encrypted Status List Resource using cheqd Studio.

To create an encrypted Verifiable Credential Status List with a set of Access Control Conditions, an Issuer will need to follow the steps below:

Step 1: Set up your account

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

Step 2: Create an Issuer DID

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

Step 3: Select the encrypted Status List API

/credential-status/create/encrypted

Using this API will encrypt the bitstring of the Status List, meaning that a set of Payment Conditions will need to be met in order to access the Status List contents.

/credential-status/create/unencrypted

Using this API will create a regular Status List on-ledger, where the contents of the Status List are visible to any users who queries the blockchain.

Step 4: Create encrypted Status List

Using the /credential-status/create/encrypted API, users have two options for creating an encrypted Status List on-ledger:

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

  2. Compiling a Status List payload yourself using the application/json option on the Swagger UI.

Option 1. Choose from a few variables and we will compile the Status List for you

This is the easiest way to create encrypted Status Lists on cheqd and is recommended for users who are not overly familiar with compiling JSON objects.

Using the application/x-www-url-form-encoded option on the Swagger UI, users are able to choose between the following variables and options to create an encrypted Status List on-ledger:

statusPurpose (required)
  • revocation (creates a Status List where each entry refers to revocation status)

  • suspension (creates a Status List where each entry refers to suspension status. Note that suspended Credentials may become unsuspended).

did (required)
statusListName (required)

This is the name of your Status List. This will also need to be kept consistent for all future updates of the same Status List. For example:

feePaymentAddress (required)

The cheqd payment address where payments to unlock the encrypted StatusList2021 DID-Linked Resource need to be sent. For example:

feePaymentAmount (required)

The amount in CHEQ tokens to unlocked the encrypted StatusList2021 DID-Linked Resource. For example:

feePaymentWindow (required)

Time window (in minutes) within which the payment to unlock the encrypted StatusList2021 DID-Linked Resource is considered valid. For example:

length (optional)

The length of the Status List to be created. The default and minimum length is 140000 which is 16kb. For example:

encoding (optional)

The encoding format of the encrypted StatusList DID-Linked Resource to be created.

  • base64url

  • base64

  • hex

statusListVersion (optional)

A user set value to represent the version of the Status List. For example:

alsoKnownAs (optional)

A user set field to assign a set of alternative URIs where the DID-Linked Resource can be fetched from. For example:

From this request, cheqd Studio will automatically create and publish an encrypted Status List to the ledger with set Payment Conditions required to be met to unlock.

Option 2. Publish a JSON payload yourself

Instead of using simple form variables, you can create an encrypted Status List using a JSON payload yourself using the application/json option on the Swagger UI.

Request format

An example of the JSON payload needed to be submitted is below:

The table below expands on some of the required parameters:

Step 5: Hit the API

Once the Issuer has populated the requisite information for the encrypted Status List request, they can use the API below to submit it to the ledger.

Encrypted Status List Response format

The following code snippet shows an example of an encrypted Status List response format, which will be published to the ledger:

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.

Graphic showing the Bitstring for a Status List

This works by tying each issued Credential with a position and index on the bitstring, so that a Verifier will be able to check the value within the Credential against the public bitstring to ascertain whether the Credential has been revoked or not, using a 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 ().

Parameter
Value
Description
Parameter
Value
Description

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:

Parameter
Example value
Description

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.

Universal Registrar
spec
spec
spec
spec
credential schema
DID-Linked Resources
Personally Identifiable Information (PII)
Bitstring Status List specification
bitstrings
verifiable credential
validate algorithm
bitstring expansion algorithm
Bitstring Status List specification

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.

    "paymentConditions": [
        {
            "type": "timelockPayment",
            "feePaymentAddress": "cheqd1xl5wccz667lk06ahama26pdqvrkz5aws6m0ztp",
            "feePaymentAmount": "147603000000000ncheq",
            "intervalInSeconds": 3153600000
        }
    ],

"type"

"timelockPayment"

Indicates that a timelock payment mechanism is employed. Currently, this is the only type that is supported.

"feePaymentAddress"

"cheqd1xl5wccz667lk06ahama26pdqvrkz5aws6m0ztp"

Specifies the cheqd address to which the payment fee should be sent. This address is associated with the entity managing the Status List (Issuer) and who will receive the payment.

"feePaymentAmount"

"147603000000000ncheq"

Defines the amount of the payment fee. In this case, the fee is specified in the smallest unit of CHEQ, (ncheq).

"intervalInSeconds"

3153600000

Sets the duration of the timelock interval, measured in seconds. The verifier must make the payment within the specified time frame relative to a particular block-time on the cheqd blockchain. If the payment is successfully confirmed within this interval, the Verifier's access to the Resource is granted. However, if the payment claim is made outside of this window, it may be considered invalid, and the verifier's access to the Resource may be denied.

{
    "unifiedAccessControlCondition": {
        "conditionType": "cosmos",
        "path": "/cosmos/tx/v1beta1/txs?events=transfer.recipient='cheqd1xl5wccz667lk06ahama26pdqvrkz5aws6m0ztp'&events=transfer.amount='147603000000000ncheq'&order_by=2&pagination.limit=1",
        "chain": "cheqdMainnet",
        "method": "timelock",
        "parameters": ["latest"],
        "returnValueTest": {
            "key": "$.tx_responses.*.timestamp",
            "comparator": "<=",
            "value": "3153600000"
        }
    },
    "returnTxResponse": true
}

"conditionType"

"cosmos"

Specifies the type of condition being employed, indicating that the access control condition is related to the Cosmos blockchain ecosystem

"path"

"/cosmos/tx/v1beta1/txs?events=transfer.recipient='cheqd1xl5wccz667lk06ahama26pdqvrkz5aws6m0ztp'&events=transfer.amount='147603000000000ncheq'&order_by=2&pagination.limit=1"

Defines the query path to retrieve specific transaction events from the cheqd blockchain. It filters transactions with a recipient address and amount matching certain criteria, orders the results, and limits the query to one transaction.

"chain"

"cheqdMainnet"

Specifies the blockchain network (chain) being used, indicating that the condition applies to the cheqd Mainnet.

"method"

"timelock"

Specifies the access control method being utilized, which is a timelock mechanism.

"parameters"

"latest"

Provides parameters for the access control method. In this case, it refers to the "latest" state on the blockchain

"key"

"$.tx_responses.*.timestamp"

Specifies the key path within the transaction responses to extract the timestamp of the transaction.

"comparator"

"<="

This checks if the extracted timestamp is less than or equal to the provided value.

"value"

"3153600000"

Defines the value (in seconds) against which the extracted timestamp is compared. This value represents a time interval.

https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e?resourceName=VerifiableAttestation&resourceType=JSONSchemaValidator2020resolver.cheqd.net
https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e?resourceName=VerifiableAccreditation&resourceType=JSONSchemaValidator2020resolver.cheqd.net
did:cheqd:testnet:0ff9df5d-653b-4f77-a66c-0035abc34d63
employmentCredentialRevocationList
cheqd1qs0nhyk868c246defezhz5eymlt0dmajna2csg
100
10
140000
1.0
https://www.foo.com
{
  "did": "did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e",
  "statusListName": "cheqd-employee-credentials-encrypted",
  "paymentConditions": [
    {
      "feePaymentAddress": "cheqd1qs0nhyk868c246defezhz5eymlt0dmajna2csg",
      "feePaymentAmount": 20,
      "feePaymentWindow": 10
    }
  ]
}

"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.

{
  "created": true,
  "resource": {
    "StatusList2021": {
      "encodedList": "496fdfbeb745b4db03fcdb40566f9c4c4a1c0f184b31255e641b6e7bdfb9b6946c12be87ca3763be0393c00b67ac1e8737c106b32f46ef59c765754415b5e8cc7c65fccaa3374620430ea476301a5e0dd63340e7a27a68bc627518471f22e4a2",
      "type": "StatusList2021Revocation",
      "validFrom": "2023-06-26T11:45:19.349Z"
    },
    "metadata": {
      "type": "StatusList2021Revocation",
      "encoding": "base64url",
      "encrypted": true,
      "encryptedSymmetricKey": "b11182dc524b8181f9a6aef4c4ad0a1c14e40033b9112dffd8d1bcf6cc3b85abc07ded2205ee94068a99f4202502cb0855f322583fa6ce1534d3a05bf36891766ea2c5f90a982b3040680762977d404d758a2370224a239c8279aa7d21e980931c42055b17ca4c7dbffa4782480a8b6279cf989b2f166d5fdb4b2c1b5a63927200000000000000203018dcaba26df45a415bb599218b27ca853a70289d7a3ed3ed0e3730452e8f8d9af91b6e71312565d2c069341f6660ab",
      "paymentConditions": [
        {
          "feePaymentAddress": "cheqd1qs0nhyk868c246defezhz5eymlt0dmajna2csg",
          "feePaymentAmount": "20000000000ncheq",
          "intervalInSeconds": 600,
          "type": "timelockPayment"
        }
      ]
    },
    "resourceMetadata": {
      "resourceURI": "did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e/resources/5945233a-a4b5-422b-b893-eaed5cedd2dc",
      "resourceCollectionId": "7c2b990c-3d05-4ebf-91af-f4f4d0091d2e",
      "resourceId": "5945233a-a4b5-422b-b893-eaed5cedd2dc",
      "resourceName": "cheqd-revocation-encrypted-1",
      "resourceType": "StatusList2021Revocation",
      "mediaType": "application/json",
      "resourceVersion": "2023-06-26T11:45:19.349Z",
      "created": "2023-06-26T11:45:20Z",
      "checksum": "909e22e371a41afbb96c330a97752cf7c8856088f1f937f87decbef06cbe9ca2",
      "previousVersionId": null,
      "nextVersionId": null
    },
    "symmetricKey": "dfe204ee95ae74ea5d74b94c3d8ff782273905b07fbc9f8c3d961c3b43849f18"
  }
}

Charge for Status List

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

Issue Credential with Encrypted Status List

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

Verifier pays Issuer

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

Charge for Status List

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

Issue Credential with Encrypted Status List

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

Verifier pays Issuer

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

Bulk Update or Rotate Encryption Keys

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

Understanding Credential Payments

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

Why are we payment gating Status Lists?

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

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.

Verida wallet

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

Cover
Cover

Veramo SDK Plugin

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

Root Authorisations

Learn about establishing Root Authorisations for Trust Registries on cheqd.

What is a Root Authorisation?

A Root Authorisation — formally a Verifiable Authorisation for Trust Chain — defines the governance framework and trust rules for an entire decentralized trust ecosystem.

It serves as the starting point for all Verifiable Accreditations and Verifiable Credentials issued within a trust chain. Every accreditation and attestation must ultimately trace back to a valid Root Authorisation to establish its legitimacy.

The Root Authorisation anchors the root entity — the Root Trusted Accreditation Organisation (rTAO) — to a specific Trust Framework Policy, and enables verifiers to traverse the full chain of trust.


Purpose of a Root Authorisation

Function

Description

Define governance

Specifies the trust framework, operational rules, and any regulatory requirements for the ecosystem

Anchor trust

Establishes a verifiable starting point for all trust chains

Enable validation

Allows verifiers to confirm that any credential ultimately aligns with an approved governance framework


Key Characteristics

  • Credential Type: Must be of type VerifiableAuthorisationForTrustChain.

  • Issuer: The DID of the Root Trusted Accreditation Organisation (rTAO).

  • Credential Subject: The DID being authorised — this can either be:

    • The same DID as the issuer (self-authorisation), or

    • A different DID (delegated root authority to another trusted organisation).

  • Terms of Use: Must include a TrustFrameworkPolicy, referencing:

    • The name of the governance framework

    • A link (URL) to the full, published governance framework document


Required Fields

Field

Description

Example

Issuer

DID of the rTAO

did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e

Credential Subject

DID of the entity being root-authorised (same as issuer for self-authorisation, or a different trusted DID)

did:cheqd:testnet:6af412d7-2f04-4e12-a424-e6719db487ad

termsOfUse

Must include a TrustFrameworkPolicy with a governance framework reference

See Policies


Example of a Root Authorisation

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1"
  ],
  "issuer": {
    "id": "did:cheqd:testnet:c6630f1e-9248-4af6-b7ac-5bcaf646f213"
  },
  "type": [
    "VerifiableCredential",
    "VerifiableAuthorisationForTrustChain"
  ],
  "issuanceDate": "2025-04-01T07:19:55.000Z",
  "credentialSubject": {
    "id": "did:cheqd:testnet:0a35d559-00ff-41b6-81ad-f64faa522771",
    "accreditedFor": [
      {
        "schemaId": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:c6630f1e-9248-4af6-b7ac-5bcaf646f213?resourceName=AIAgentAuthorisation&resourceType=JSONSchemaValidator2020",
        "types": [
          "VerifiableCredential",
          "AIAgentAuthorisation"
        ]
      },
      {
        "schemaId": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e?resourceName=VerifiableAccreditation&resourceType=JSONSchemaValidator2020",
        "types": [
          "VerifiableCredential",
          "VerifiableAccreditation",
          "VerifiableAccreditationToAccredit"
        ]
      },
      {
        "schemaId": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e?resourceName=VerifiableAttestation&resourceType=JSONSchemaValidator2020",
        "types": [
          "VerifiableCredential",
          "VerifiableAttestation",
          "VerifiableAccreditationToAttest"
        ]
      }
    ]
  },
  "termsOfUse": {
    "type": "TrustFrameworkPolicy",
    "trustFramework": "DAIAA Governance Framework",
    "trustFrameworkId": "https://medium.com/quantum-economics/why-we-started-the-decentralized-ai-agent-alliance-6eb0938d7bc5"
  },
  "proof": {
    "type": "JwtProof2020",
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9..."
  }
}

Important Notes

  • Self-Authorisation: When the issuer and subject are the same DID, the rTAO self-declares adherence to the trust framework.

  • Delegated Root Authorisation: When the subject is a different DID, the rTAO is immediately empowering another trusted entity to operate under the framework.

  • Policy Binding: All downstream Verifiable Accreditations and Attestations must reference a chain of authorisations and accreditations back to this Root Authorisation.

  • DID-Linked Resource: The Root Authorisation should be published as a DID-Linked Resource (DLR) attached to the rTAO’s DID for discoverability and validation.


Visual Flow

Root Authorisation (rTAO defines framework)
         ↓
Verifiable Accreditation (TAO is authorised to operate)
         ↓
Verifiable Accreditation (Trusted Issuer is authorised)
         ↓
Verifiable Credential (End-user receives attestation)

Summary

Concept

Root Authorisation

Defines

The trust framework and governance for the ecosystem

Issued by

rTAO

Subject

Either rTAO itself or another trusted entity

Credential Type

VerifiableAuthorisationForTrustChain

Linked Policy

Trust Framework Policy

supports ZKCreds (AnonCreds)
European Architecture and Reference Framework (ARF)
creating a Status List
follow the tutorial here
updating encrypted Status List operations
Access Control Conditions
see section below on creating an encrypted Status List
created in Step 2

Issue Credential with Encrypted Status List

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

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

Step 1: Set up your account

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

Step 2: Create an Issuer DID

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

Step 3: Create an Encrypted Status List

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

Step 4: Specify the encrypted Status List within Credential body

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

Create Verifier Pays Issuer flow

How a Verifier pays an Issuer to decrypt an encrypted Status List.

cheqd Studio supports payments for verifying Credential Status. This is an innovative feature that is also commonly known as cheqd's Payment Rails. Using the API in this tutorial, there are multiple ways for a Verifier to pay an Issuer to unlock and verify a Credential's status.

Step 1: Set up an account

A Verifier will need a cheqd Studio account to take advantage of the /credential-status/check API and easily use cheqd's Credential Payments. Make sure you are set up and are logged in, using our guide below:

Step 2: Set parameters for check

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

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

  2. Compiling the JSON transaction yourself using the application/json option on the Swagger UI.

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

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

statusPurpose

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

  • revocation

  • suspension

did

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

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

statusListName

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

employmentCredentialRevocationList
index

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

10

Option 1: Automatically paying an Issuer to unlock a Credential Status

To automatically make a payment to an Issuer in order to verify an encrypted Status List, there is an additional variable:

makeFeePayment

This will automatically make the fee payment to the issuer (if required) based on payment conditions to unlock encrypted StatusList2021 DID-Linked Resource. This can be set to:

  • true (automatically make fee payment)

  • false (do not automatically make fee payment)

If there is sufficient CHEQ in the account of the Verifier, this will automatically make a payment to the Issuer and meet the Access Control Conditions.

Step 3: Hit the API

In the same action, the Credential Service will perform a verification check on the Credential Status and pay the issuer the fee specified in the Payment Conditions.

Response format

The response format below will indicate clearly whether the check is successful and whether the Credential index in question is revoked / suspended or not.

{
  "checked": true,
  "revoked": false
}

Option 2: Manually Paying an Issuer to unlock a Credential Status

If a Verifier does not want to automatically pay the Issuer using the API, they can choose to make a manual payment to unlock the Credential Status information to build a higher level of trust within the Credential presented to them.

Step 1: Locating Issuers' payment address and conditions

If a Verifier wants to unlock access to the Resource, to gain access to additional information about a Credential presented to them, such as the Credential Status, firstly, the Verifier will be presented Credential, including a link to the Status List within the "credentialStatus" section of the Credential body.

Through following the link in"credentialStatus" section of the Credential body. the The Verifier will be directed to an on-ledger Resource, identifiable through a DID URL, for example:

This on-ledger Resource will contain:

  • An encrypted potion of the Resource, such as a Status List bitstring. identified by the "encodedList" property.

  • Unencrypted metadata about the Resource, including the issuers' payment address "feePayerAddress" and and the Payment Conditions, "feePaymentAmount" and "intervalInSeconds".

This gives the verifier requisite information they need in order to pay the Issuer to unlock the Credential Status. You can learn more about Access Control Conditions below.

Step 2: Pay the Issuer

This payment should be made in CHEQ.

Note that the "feePaymentAmount" may be specified in ncheq. This is lowest denomination of the CHEQ token, "nano" CHEQ which is 1 x 10^-9 CHEQ.

Step 3: Hit the API

cheqd Studio will perform a verification check on the Credential Status and pay the issuer the fee specified in the Payment Conditions.

Note the "intervalInSeconds" which is the amount of time after making the payment that the Verifier has to hit the API and request access to the encrypted Status List.

Response format

The response format below will indicate clearly whether the check is successful and whether the Credential index in question is revoked / suspended or not.

{
  "checked": true,
  "revoked": false
}

Alternatively, if Verifiers have made the payment manually they can also use the /credential/verify API in the tutorial below:

Build Trust Registries

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

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

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

cheqd’s Trust Registry Model

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

  • ✅ DID-resolvable

  • 📜 Cryptographically signed and verifiable

  • 🌍 Publicly discoverable using DID-Linked Resources

  • 🔗 Linked to governance frameworks

Learn about cheqd Trust Registries

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

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

  • Root Authorisations define the governance framework and root of trust

  • Verifiable Accreditations delegate authority to trusted organisations

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

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

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

Get started

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

  • Create and manage Root Authorisations, Accreditations, and Attestations

  • Resolve trust chains in real time using standard DID resolution

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

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

Decentralized Trust Chains (DTCs)

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.

Note: This lack of trusted issuer infrastructure is a critical blocker for many digital credential ecosystems — and a common reason why solutions stall before reaching production.

To fully establish trust, relying parties must be able to:

  • Identify who issued a credential

  • Understand whether the issuer was authorised to issue it

  • Trace who accredited the issuer, and under what governance framework

Introducing Decentralized Trust Chains (DTCs)

To solve this challenge, cheqd introduces a verifiable trust infrastructure called Decentralized Trust Chains (DTCs) — a model that complements and extends approaches like the EBSI Trust Chain Framework.

DTCs allow participants to create hierarchical chains of trust, where:

  • A Root Trusted Accreditation Organisation (rTAO) defines the governance model

  • Verifiable Accreditations delegate authority to other legal entities (e.g., TAOs, Trusted Issuers)

  • Verifiable Credentials are issued by accredited issuers, with embedded metadata that references the trust chain

Together, these components form a decentralized trust registry for each ecosystem.

Publicly Verifiable, Policy-Governed Trust

cheqd’s DTC model introduces both permissions and policies:

  • Permissions define what an entity is allowed to do (e.g. issue or accredit)

  • Policies define who granted that permission, under what framework, and with what legal or operational requirements.

This infrastructure is made publicly resolvable by publishing all authorisations and accreditations as DID-Linked Resources on the cheqd ledger. This means:

  • 🧩 Trust relationships are machine-verifiable

  • 🔍 Verifiers do not need prior knowledge of each entity

  • 🛠️ Resolution follows W3C standards like DID-Core, DID Resolution and DID-Linked Resources.

The result: A scalable, cryptographically verifiable way to determine whether an issuer — and the credential they issue — can be trusted.

There are many terms used within this guide, and as such, familiarise yourself or refer back to the concepts within the glossary below:

Abbreviation
Term
Description

-

Accreditation Policy

A machine-readable policy embedded in a Verifiable Accreditation that defines the scope, conditions, and governance under which an entity is authorised to accredit others or issue Verifiable Credentials.

-

Attestation Policy

A machine-readable policy embedded in a Verifiable Credential that links the credential to the issuer’s accreditation and root authorisation, enabling verifiers to validate that the issuer was authorised to make the attestation.

DID

Decentralized Identifier

Legal entity identifier for Trust Registry, cannot be natural person in context of Trust Infrastructure

GA

Governance Authority

The legal entity or consortia responsible for writing the Governance Framework. In many instances the Governance Authority is also a Root TAO

GF

Governance Framework

A policy document outlining the purpose, roles, scopes and permissions for a given ecosystem using the Trust Infrastructure.

Root TAO (rTAO)

Root Trusted Accreditation Organization

A Root Trusted Accreditation Organisation (rTAO) is the top-level authority in a Decentralized Trust Chain responsible for defining the governance framework and issuing the Root Authorisation that anchors all downstream accreditations and attestations within the trust ecosystem.

TAO

Trusted Accreditation Organization

A Trusted Accreditation Organisation (TAO) is an entity accredited by a Root Trusted Accreditation Organisation (rTAO) or another TAO to govern a segment of the trust chain by issuing accreditations to other entities or authorising the issuance of Verifiable Credentials within a defined scope.

-

Trust Chain

Hierarchy of Verifiable Accreditations. Multiple Trust Chains may comprise a Trust Registry.

TI

Trusted Issuer

A Trusted Issuer is an entity accredited within a Decentralized Trust Chain to issue domain-specific Verifiable Credentials, operating under the scope and governance defined by an upstream accreditation and the overarching trust framework.

-

Trust Infrastructure

The overall set of technical and governance components to establish end-to-end trust.

-

Verifiable Accreditation

A Verifiable Accreditation is a Verifiable Credential that delegates authority from one entity to another, specifying the types of credentials they are permitted to issue or the roles they are authorised to perform within a defined trust framework.

-

Verifiable Trust Model

Permissions with policies to either accredit, or to attest

Establishing a Trust Hierarchy

Decentralized Trust Chains are based on the concept of a hierarchical trust model, conceptually similar to traditional Public Key Infrastructure (PKI). At the top sits a Root of Trust, from which trust is delegated through a verifiable chain of credentials.

In this model, each participant is identified by a Decentralized Identifier (DID) and may be granted permission — via a Verifiable Accreditation — to accredit others or issue credentials themselves.

How the Hierarchy Works

Trust is delegated top-down through Verifiable Accreditations:

Role
Description

Root TAO (rTAO)

Issues Root Authorisations and initial Accreditations to other TAOs. Sets the governance baseline.

Trusted Accreditation Organisation (TAO)

Can accredit other TAOs or Trusted Issuers. Acts as an intermediary layer in larger ecosystems.

Trusted Issuer (TI)

Issues Verifiable Credentials to users/entities, based on permissions received from an upstream TAO.

The following diagram show how a Root TAO accredits two TAOs lower in the hierarchy:

Each role is cryptographically linked through issued Verifiable Credentials, creating a machine-verifiable trust path.

Verifiable Credentials & Policy Enforcement

  • Credentials are issued with a termsOfUse section that references an Attestation Policy, linking them back to the issuer’s accreditation and the root of trust.

  • Digital Wallets or agents can present these credentials for verification.

  • Verifiers can then resolve and validate the entire trust chain — from the issuer to the rTAO — using DID resolution and optional DNS anchoring.

Trust Infrastructure Roles and their Permissions

As shown in the diagram above, legal entities can play the following roles:

  • In a Decentralized Trust Chain, each legal entity assumes a defined role with clearly scoped permissions. While a single DID may represent multiple roles in simple ecosystems, every complete trust chain should include these three functional roles:

    • Root Trusted Accreditation Organisation (rTAO)

    • Trusted Accreditation Organisation (TAO)

    • Trusted Issuer (TI)

    Only the Trusted Issuer (TI) is permitted to issue domain-specific Verifiable Credentials (VCs).

Root Trusted Accreditation Organisation (rTAO)

The rTAO is the root of governance in a trust chain. It establishes the ecosystem’s rules and authorises who can issue or accredit within it.

Capabilities:

  • Issue a Root Authorisation that defines the Trust Framework

  • Self-accredit for governance or issuance

  • Accredit TAOs and TIs to delegate responsibility

  • Revoke accreditations from any participant in the trust chain

Credential Type:

  • VerifiableAuthorisationForTrustChain

Policy Type:

  • TrustFrameworkPolicy (included in termsOfUse)

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:

Policy Type
Used In
Purpose

TrustFrameworkPolicy

Root Authorisation

Defines the root governance model

AccreditationPolicy

Verifiable Accreditation

Constrains and describes the scope of authority

AttestationPolicy

Verifiable Credential

Links the credential back to the issuer’s accreditation and trust framework

How Policies are Linked

  • Root Authorisation includes a TrustFrameworkPolicy

  • Each Accreditation must reference:

    • A parent AccreditationPolicy, or

    • The original TrustFrameworkPolicy

  • Each Credential (Attestation) must reference:

    • The AttestationPolicy pointing back to the issuer’s accreditation

This layered policy model enables verifiers to traverse and validate the entire trust chain — from a single credential back to a rTAO (optionally anchored in DNS) — while ensuring that all participants adhere to consistent governance and operational standards.

Trust Types in Decentralized Trust Chains

Trust Chains are constructed from three verifiable building blocks:

1. Authorisations

  • Define the rules of the ecosystem

  • Issued by the rTAO as a VerifiableAuthorisationForTrustChain

  • Reference the root governance framework

2. Accreditations

  • Grant permission to accredit or issue

  • Are always domain-specific and non-transferable

  • Must include an AccreditationPolicy in termsOfUse

  • Allow entities to govern or issue only within the authorised scope

3. Credentials (Attestations)

  • Assert facts (identity, qualifications, rights)

  • Must include an AttestationPolicy that:

    • Links back to the issuer's accreditation

    • Establishes a trust path to the root authority

  • Issuable only by accredited Trusted Issuers

In Summary:

Element

Purpose

Authorisations

Define the governance and policy rules at the root of the trust chain

Accreditations

Delegate trust authority for accreditation or credential issuance

Credentials (Attestations)

Assert verifiable facts within the scope of a governed trust framework

Get Started

Get started

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

  • Create and manage Root Authorisations, Accreditations, and Attestations

  • Resolve trust chains in real time using standard DID resolution

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

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

Verify Verifiable Accreditation

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

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

Step 1: Issue Accreditation

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

Step 2: Use the Verify Accreditation API

RTAO -> TAO

Learn about structuring Verifiable Accreditations from a Root of Trust (rTAO) to a subordinate entity (TAO) on cheqd.

A Root Trusted Accreditation Organisation (rTAO) can delegate trust by issuing Verifiable Accreditations to Trusted Accreditation Organisations (TAOs). These accreditations define the permissions and scope under which the TAO can operate.

The Verifiable Accreditation should include:

Permissions

The credentialSubject of the accreditation, issued by issuer defines what the TAO is authorised to do — including which credential types they can issue and in which jurisdictions.

Field descriptions:

Policies

The Root TAO can also set polices known as the AccreditationPolicy within the termsOfUse section of the Verifiable Accreditation.

Whereby:

Example of fully formed Accreditation

The example below shows a Verifiable Accreditation that is issued by an rTAO to a TAO, specifying a schema under which the recipient is able to use for issuing their own accreditations.

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

To issue a Verifiable Accreditation, follow the tutorial below:

t

TAO -> SubTAO

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

A Trusted Accreditation Organisation (TAO) can extend trust further down the hierarchy by accrediting Sub-Trusted Accreditation Organisations (SubTAOs). These SubTAOs may then be authorised to issue further Verifiable Accreditations or Verifiable Attestations, subject to defined constraints.

The Verifiable Accreditation should include:

Permissions

The credentialSubject section outlines what the SubTAO is accredited to do — including supported credential types, relevant schemas, and jurisdictional constraints.

Whereby:

Policies

The termsOfUse field contains an AccreditationPolicy, which points back to both the parent accreditation and the original root authorisation. This maintains traceability through the full trust chain.

Whereby:

Example of fully formed Accreditation

The example below shows a Verifiable Accreditation that is issued by an TAO to a SubTAO, granting permission to issue further accreditations under a defined schema and policy chain.

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

To issue a Verifiable Accreditation, follow the tutorial below:

Issue Verifiable Accreditation

Issue Verifiable Accreditations as DID-Linked Resources using cheqd Studio.

Users are able to issue Verifiable Accreditations as DID-Linked Resources on-ledger, which may be used to verify whether a particular recipient of an accreditation is accredited to issue a certain type of credential, under the scope of a particular governance framework. This implementation on cheqd builds on the principles of the EBSI Trust Chain model, using DID-Linked Resources to create a more standardised format for storing, retrieving and dereferencing to trust registry entries.

Step 1: Set up your account

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

Step 2: Create a DID

Before you can create a Verifiable Accreditation, you need to create a DID which is used to link to one or multiple Verifiable Accreditations on-ledger. Use the API in the page below to create a DID:

Step 3: Choose the type of Accreditation

Verifiable Accreditations are JSON objects that take the form of the Verifiable Credential data model. There are three types of Verifiable Accreditation:

Step 4: Compile the appropriate request format for the API

For each accreditation type, the user will need to use a different request format for the API.

Verifiable Authorisation for Trust Chain

Request format for Verifiable Authorisation for Trust Chain
Response format for Verifiable Authorisation for Trust Chain

Verifiable Accreditation to Accredit

Request format for Verifiable Accreditation to Accredit
Response format for Verifiable Accreditation to Accredit

For a trusted ecosystem, these attestations are required to trace the legitimacy of a credential issuer to a root-of-trust.

Verifiable Accreditation to Attest

Request format for Verifiable Accreditation to Attest
Response format for 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.

Step 5: Make request to the API

Step 7: Reference the Verifiable Accreditation

Owing to the design of DID-Linked Resources, following the creation of the a Verifiable Accreditation, users are able to reference the specific version, or create a query to always fetch the latest version of the Accreditation.

Using a DID Resolver or the search DID endpoint, users can find the DID URL and unique resourceId of the Verifiable Accreditation. The unique resourceId allows users to specify this exact version of the Accreditation.

In the DID Document Metadata, users should find "linkedResourceMetadata", like the following snippet:

Specific version of the Verifiable Accreditation

Here, the "resourceURI" specifies the DID URL of the specific Verifiable Accreditation that was created.

Latest version of the Verifiable Accreditation

In order to reference the latest version of the Verifiable Accreditation, the following construction needs to be used:

did:cheqd:<namespace>:<resourceCollectionId>?resourceName=<resourceName>&resourceType=<resourceType>

For example:

did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d?resourceName=OxfordUniversityAccreditation&resourceType=VerifiableAccreditationToAccredit

Verifiable Accreditation at specific point in time

In order to reference the Verifiable Accreditation at a particular point in time, the following construction needs to be used:

did:cheqd:<namespace>:<resourceCollectionId>?resourceName=<resourceName>&resourceType=<resourceType>&resourceVerionTime=<XMLDateTime>

For example:

did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d?resourceName=OxfordUniversityAccreditation&resourceType=VerifiableAccreditationToAccredit&resourceVersionTime=2023-02-22T06:58:18.61Z

Set up Trust Chain

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

Overview

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

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

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

Why Build a Trust Chain?

Trust Chains enable decentralized ecosystems to:

  • Delegate authority without centralized registries

  • Define and enforce governance frameworks

  • Enable TRAIN to validate credentials against trusted policies

  • Optionally anchor trust using DNS or X.509 proofs

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


Key Roles in a Trust Chain


Trust Chain Structure


Steps to Set Up a Trust Chain

1. Create an rTAO DID

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

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

2. Publish a Root Authorisation for Trust Chain

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

  • A URI for the governance framework

  • A human-readable trust framework ID

  • Supported credential schemas for the ecosystem

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

3. Issue Verifiable Accreditations (VAs)

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

  • Reference the Root Authorisation

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

  • Optionally include expiration or other constraints

4. Delegate Further to Trusted Issuers

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


Example: Education Trust Chain

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


Optional: DNS Anchoring for rTAOs

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

Why Anchor Your rTAO in DNS?

Anchoring a DID in DNS provides:

  • 🔐 Cryptographic proof of domain control

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

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

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


How It Works: TDZM (Trust-DNS Zone Manager)

TDZM is a component that manages DNS zones where rTAOs can publish their DIDs as TXT or TLSA records. It integrates with DNS infrastructure to serve trust metadata for automated validation.

TRAIN uses TDZM to verify that:

  • The rTAO controls the claimed domain

  • The DID used in the trust chain is anchored in DNS

  • The governance framework is consistently represented

TAO -> Trusted Issuer (TI)

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

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

The Verifiable Accreditation should include:

Permissions

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

Field descriptions:

Policies

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

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:

Referencing Trust Registry within a Verifiable Credential

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

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

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

  • The Verifiable Accreditation that granted them permission

  • The Root Authorisation that anchors the governance framework

Why reference a trust registry?

Including a reference to a trust registry enables verifiers to:

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

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

  • Enforce domain-specific governance or regulatory policies.

Structure of termsOfUse

The termsOfUse field uses the AttestationPolicy type and typically includes:

Example: Credential referencing its trust registry via AttestationPolicy

What this enables

This embedded trust policy allows verifiers to:

  • Look up the parent accreditation and root authorisation.

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

  • Automate or enforce policy-based trust decisions.

Validating Trust Chains Using TRAIN

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

What does TRAIN do?

TRAIN is a trust validator that:

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

  • Resolves the issuer’s accreditation.

  • Traverses the trust chain to the root authorisation.

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

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


TRAIN Validation Input

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

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


TRAIN Validation Output

TRAIN returns a response like this:

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


Why use TRAIN?

  • Automates trust validation using standardized credential metadata.

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

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

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

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".

Introduction

Glossary

Trusted Accreditation Organisation (TAO)

Trusted Issuer (TI)

Policies Overview

Diagram showing different policy relationships in the trust chain
Field
Description
Example
Field
Description
Field
Description
Field
Description
Example
Field
Description
Field
Description
Type
Description
Request Parameter
Required
Description
Request Parameter
Required
Description
Request Parameter
Required
Description

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

Field
Description
Example
Field
Description
Field
Description
Field
Description

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.

cheqd's supported wallets
​
​

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.

​
created in Step 3

Issuer

DID of the Root of Trust (RTAO)

did:cheqd:testnet:8ea036da-f340-480d-8952-f5561ea1763c

Subject

DID of the TAO that is being accredited

did:cheqd:testnet:a2b675de-33d0-4044-8183-0d74f210cceb

Credential Subject

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

See below

Terms of use

A set of policies setting out the Governance Framework for the ecosystem

See below

"credentialSubject": {
  "id": "did:cheqd:testnet:a2b675de-33d0-4044-8183-0d74f210cceb",
  "accreditedFor": [
    {
      "schemaId": "did:cheqd:testnet:8ea036da-f340-480d-8952-f5561ea1763c/resources/b10146d7-0d0f-41e0-8ee3-c76db64890be",
      "types": [
        "VerifiableCredential",
        "VerifiableAccreditation",
        "VerifiableAttestation",
        "VerifiableAccreditationToAccredit"
      ],
      "limitJurisdiction": "https://publications.europa.eu/resource/authority/atu/FIN"
    }
  ]
}

schemaId

The schema the TAO is authorised to use when issuing accreditations or credentials

types

Credential types the TAO is permitted to issue

limitJurisdiction

(Optional) A geographic or regulatory restriction on where the accreditation is valid

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

type

Must be AccreditationPolicy

parentAccreditation

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

rootAuthoroisation

The DID URL of the Root of Trust Verifiable Authorsation

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://schema.org/schema.jsonld",
    "https://veramo.io/contexts/profile/v1"
  ],
  "issuer": {
    "id": "did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e"
  },
  "type": [
    "VerifiableCredential",
    "VerifiableAccreditationToAccredit"
  ],
  "issuanceDate": "2024-08-07T02:08:30.000Z",
  "credentialSubject": {
    "accreditedFor": [
      {
        "schemaId": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e?resourceName=VerifiableAccreditation&resourceType=JSONSchemaValidator2020",
        "types": [
          "VerifiableCredential",
          "VerifiableAccreditation",
          "VerifiableAttestation",
          "VerifiableAccreditationToAccredit"
        ]
      }
    ],
    "id": "did:cheqd:testnet:6af412d7-2f04-4e12-a424-e6719db487ad"
  },
  "termsOfUse": {
    "type": "AccreditationPolicy",
    "parentAccreditation": "did:cheqd:testnet:8ea036da-f340-480d-8952-f5561ea1763c/resources/18de60ec-bed1-42e5-980c-601c432bc60b",
    "rootAuthorisation": "did:cheqd:testnet:8ea036da-f340-480d-8952-f5561ea1763c/resources/18de60ec-bed1-42e5-980c-601c432bc60b"
  },
  "proof": {
    "type": "JwtProof2020",
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vc2NoZW1hLm9yZy9zY2hlbWEuanNvbmxkIiwiaHR0cHM6Ly92ZXJhbW8uaW8vY29udGV4dHMvcHJvZmlsZS92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiVmVyaWZpYWJsZUF1dGhvcmlzYXRpb25Gb3JUcnVzdENoYWluIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImFjY3JlZGl0ZWRGb3IiOlt7InNjaGVtYUlkIjoiZGlkOmNoZXFkOnRlc3RuZXQ6OGVhMDM2ZGEtZjM0MC00ODBkLTg5NTItZjU1NjFlYTE3NjNjL3Jlc291cmNlcy9iMTAxNDZkNy0wZDBmLTQxZTAtOGVlMy1jNzZkYjY0ODkwYmUiLCJ0eXBlcyI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIlZlcmlmaWFibGVBY2NyZWRpdGF0aW9uIiwiVmVyaWZpYWJsZUF0dGVzdGF0aW9uIiwiVmVyaWZpYWJsZUFjY3JlZGl0YXRpb25Ub0FjY3JlZGl0Il0sImxpbWl0SnVyaXNkaWN0aW9uIjoiaHR0cHM6Ly9wdWJsaWNhdGlvbnMuZXVyb3BhLmV1L3Jlc291cmNlL2F1dGhvcml0eS9hdHUvRklOIn1dfX0sInN1YiI6ImRpZDpjaGVxZDp0ZXN0bmV0OjZhZjQxMmQ3LTJmMDQtNGUxMi1hNDI0LWU2NzE5ZGI0ODdhZCIsIm5iZiI6MTcyMjk5NjUxMCwiaXNzIjoiZGlkOmNoZXFkOnRlc3RuZXQ6YjAwM2RmNmYtZWM4ZS00OGRkLTlhMmItNzAxMWM1Y2YwYTVlIn0.CrEirG-Yki2HCfY6GjNR_Oqx0ZV6uJr1NPpTTLnVWfG1Q9R3YASj7IyEZ3FtVGRmdSNhQ9v2pmPijVxeBnwPAg"
  }
}

Issuer

DID of the TAO

did:cheqd:testnet:a2b675de-33d0-4044-8183-0d74f210cceb

Subject

DID of the SubTAO that is being accredited

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

Credential Subject

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

See below

Terms of use

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

See below

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

schemaId

Schema of the Verifiable Accreditation that the SubTAO is accredited to issue themselves

types

Types of Credential that the SubTAO is accredited to issue

limitJurisdiction

(Optional) Permission that the TAO can set to limit the jurisdictional scope of the credentials issued in the ecosystem

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

type

Must be AccreditationPolicy

parentAccreditation

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

rootAuthoroisation

The DID URL of the Root of Trust Verifiable Authorsation

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://schema.org/schema.jsonld",
    "https://veramo.io/contexts/profile/v1"
  ],
  "issuer": {
    "id": "did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e"
  },
  "type": [
    "VerifiableCredential",
    "VerifiableAccreditationToAccredit"
  ],
  "issuanceDate": "2024-08-07T02:08:30.000Z",
  "credentialSubject": {
    "accreditedFor": [
      {
        "schemaId": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e?resourceName=VerifiableAccreditation&resourceType=JSONSchemaValidator2020",
        "types": [
          "VerifiableCredential",
          "VerifiableAccreditation",
          "VerifiableAttestation",
          "VerifiableAccreditationToAccredit"
        ]
      }
    ],
    "id": "did:cheqd:testnet:6af412d7-2f04-4e12-a424-e6719db487ad"
  },
  "termsOfUse": {
    "type": "AccreditationPolicy",
    "parentAccreditation": "did:cheqd:testnet:8ea036da-f340-480d-8952-f5561ea1763c/resources/18de60ec-bed1-42e5-980c-601c432bc60b",
    "rootAuthorisation": "did:cheqd:testnet:8ea036da-f340-480d-8952-f5561ea1763c/resources/18de60ec-bed1-42e5-980c-601c432bc60b"
  },
  "proof": {
    "type": "JwtProof2020",
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vc2NoZW1hLm9yZy9zY2hlbWEuanNvbmxkIiwiaHR0cHM6Ly92ZXJhbW8uaW8vY29udGV4dHMvcHJvZmlsZS92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiVmVyaWZpYWJsZUF1dGhvcmlzYXRpb25Gb3JUcnVzdENoYWluIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImFjY3JlZGl0ZWRGb3IiOlt7InNjaGVtYUlkIjoiZGlkOmNoZXFkOnRlc3RuZXQ6OGVhMDM2ZGEtZjM0MC00ODBkLTg5NTItZjU1NjFlYTE3NjNjL3Jlc291cmNlcy9iMTAxNDZkNy0wZDBmLTQxZTAtOGVlMy1jNzZkYjY0ODkwYmUiLCJ0eXBlcyI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIlZlcmlmaWFibGVBY2NyZWRpdGF0aW9uIiwiVmVyaWZpYWJsZUF0dGVzdGF0aW9uIiwiVmVyaWZpYWJsZUFjY3JlZGl0YXRpb25Ub0FjY3JlZGl0Il0sImxpbWl0SnVyaXNkaWN0aW9uIjoiaHR0cHM6Ly9wdWJsaWNhdGlvbnMuZXVyb3BhLmV1L3Jlc291cmNlL2F1dGhvcml0eS9hdHUvRklOIn1dfX0sInN1YiI6ImRpZDpjaGVxZDp0ZXN0bmV0OjZhZjQxMmQ3LTJmMDQtNGUxMi1hNDI0LWU2NzE5ZGI0ODdhZCIsIm5iZiI6MTcyMjk5NjUxMCwiaXNzIjoiZGlkOmNoZXFkOnRlc3RuZXQ6YjAwM2RmNmYtZWM4ZS00OGRkLTlhMmItNzAxMWM1Y2YwYTVlIn0.CrEirG-Yki2HCfY6GjNR_Oqx0ZV6uJr1NPpTTLnVWfG1Q9R3YASj7IyEZ3FtVGRmdSNhQ9v2pmPijVxeBnwPAg"
  }
}

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": "did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e",
  "subjectDid": "did:cheqd:testnet:6af412d7-2f04-4e12-a424-e6719db487ad",
  "schemas": [
    {
      "type": "MuseumPassCredential",
      "url": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d?resourceName=MuseumPassCredentialSchema&resourceType=JsonSchemaValidator2018"
    }
  ],
  "format": "jwt",
  "accreditationName": "authoriseAccreditationTest",
  "trustFramework": "https://learn.cheqd.io/governance/start",
  "trustFrameworkId": "cheqd Governance Framework"
}
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1"
  ],
  "type": [
    "VerifiableCredential",
    "VerifiableAuthorisationForTrustChain"
  ],
  "issuer": {
    "id": "did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e"
  },
  "credentialSubject": {
    "accreditedFor": [
      {
        "schemaId": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d?resourceName=MuseumPassCredentialSchema&resourceType=JsonSchemaValidator2018",
        "type": "MuseumPassCredential"
      }
    ],
    "id": "did:cheqd:testnet:6af412d7-2f04-4e12-a424-e6719db487ad"
  },
  "issuanceDate": "2024-10-15T04:06:47.000Z",
  "termsOfUse": {
    "type": "VerifiableAuthorisationForTrustChain",
    "trustFramework": "https://learn.cheqd.io/governance/start",
    "trustFrameworkId": "cheqd Governance Framework"
  },
  "proof": {
    "type": "JwtProof2020",
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiVmVyaWZpYWJsZUF1dGhvcmlzYXRpb25Gb3JUcnVzdENoYWluIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImFjY3JlZGl0ZWRGb3IiOlt7InNjaGVtYUlkIjoiaHR0cHM6Ly9yZXNvbHZlci5jaGVxZC5uZXQvMS4wL2lkZW50aWZpZXJzL2RpZDpjaGVxZDp0ZXN0bmV0OjBhNWI5NGQwLWE0MTctNDhlZC1hNmY1LTRhYmM5ZTk1ODg4ZD9yZXNvdXJjZU5hbWU9TXVzZXVtUGFzc0NyZWRlbnRpYWxTY2hlbWEmcmVzb3VyY2VUeXBlPUpzb25TY2hlbWFWYWxpZGF0b3IyMDE4IiwidHlwZSI6Ik11c2V1bVBhc3NDcmVkZW50aWFsIn1dfSwidGVybXNPZlVzZSI6eyJ0eXBlIjoiVmVyaWZpYWJsZUF1dGhvcmlzYXRpb25Gb3JUcnVzdENoYWluIiwidHJ1c3RGcmFtZXdvcmsiOiJodHRwczovL2xlYXJuLmNoZXFkLmlvL2dvdmVybmFuY2Uvc3RhcnQiLCJ0cnVzdEZyYW1ld29ya0lkIjoiY2hlcWQgR292ZXJuYW5jZSBGcmFtZXdvcmsifX0sInN1YiI6ImRpZDpjaGVxZDp0ZXN0bmV0OjZhZjQxMmQ3LTJmMDQtNGUxMi1hNDI0LWU2NzE5ZGI0ODdhZCIsIm5iZiI6MTcyODk2NTIwNywiaXNzIjoiZGlkOmNoZXFkOnRlc3RuZXQ6YjAwM2RmNmYtZWM4ZS00OGRkLTlhMmItNzAxMWM1Y2YwYTVlIn0.6dKE9-y2Id852onu1_WnD6aJnDtxgFZcjCbCfQ8MT1ACsHY8ox5jiKP4QUJNmhwesLidC99Qa0uyCrUhvHc2Bg"
  }
}

"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": "did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e",
  "subjectDid": "did:cheqd:testnet:6af412d7-2f04-4e12-a424-e6719db487ad",
  "schemas": [
    {
      "type": "MuseumPassCredential",
      "url": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d?resourceName=MuseumPassCredentialSchema&resourceType=JsonSchemaValidator2018"
    }
  ],
  "format": "jwt",
  "accreditationName": "accreditationToAttestTest",
  "parentAccreditation": "did:cheqd:testnet:15b74787-6e48-4fd5-8020-eab24e990578?resourceName=accreditAccreditation&resourceType=VerifiableAccreditationToAccredit",
  "rootAuthorization": "did:cheqd:testnet:5RpEg66jhhbmASWPXJRWrA?resourceName=authorizeAccreditation&resourceType=VerifiableAuthorisationForTrustChain",
}
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1"
  ],
  "type": [
    "VerifiableCredential",
    "VerifiableAccreditationToAccredit"
  ],
  "issuer": {
    "id": "did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e"
  },
  "credentialSubject": {
    "accreditedFor": [
      {
        "schemaId": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d?resourceName=MuseumPassCredentialSchema&resourceType=JsonSchemaValidator2018",
        "type": "MuseumPassCredential"
      }
    ],
    "id": "did:cheqd:testnet:6af412d7-2f04-4e12-a424-e6719db487ad"
  },
  "issuanceDate": "2024-10-15T04:06:47.000Z",
  "termsOfUse": {
    "type": "VerifiableAuthorisationForTrustChain",
    "parentAccreditation": "did:cheqd:testnet:15b74787-6e48-4fd5-8020-eab24e990578?resourceName=accreditAccreditation&resourceType=VerifiableAccreditationToAccredit",
    "rootAuthorization": "did:cheqd:testnet:5RpEg66jhhbmASWPXJRWrA?resourceName=authorizeAccreditation&resourceType=VerifiableAuthorisationForTrustChain",
  },
  "proof": {
    "type": "JwtProof2020",
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiVmVyaWZpYWJsZUF1dGhvcmlzYXRpb25Gb3JUcnVzdENoYWluIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImFjY3JlZGl0ZWRGb3IiOlt7InNjaGVtYUlkIjoiaHR0cHM6Ly9yZXNvbHZlci5jaGVxZC5uZXQvMS4wL2lkZW50aWZpZXJzL2RpZDpjaGVxZDp0ZXN0bmV0OjBhNWI5NGQwLWE0MTctNDhlZC1hNmY1LTRhYmM5ZTk1ODg4ZD9yZXNvdXJjZU5hbWU9TXVzZXVtUGFzc0NyZWRlbnRpYWxTY2hlbWEmcmVzb3VyY2VUeXBlPUpzb25TY2hlbWFWYWxpZGF0b3IyMDE4IiwidHlwZSI6Ik11c2V1bVBhc3NDcmVkZW50aWFsIn1dfSwidGVybXNPZlVzZSI6eyJ0eXBlIjoiVmVyaWZpYWJsZUF1dGhvcmlzYXRpb25Gb3JUcnVzdENoYWluIiwidHJ1c3RGcmFtZXdvcmsiOiJodHRwczovL2xlYXJuLmNoZXFkLmlvL2dvdmVybmFuY2Uvc3RhcnQiLCJ0cnVzdEZyYW1ld29ya0lkIjoiY2hlcWQgR292ZXJuYW5jZSBGcmFtZXdvcmsifX0sInN1YiI6ImRpZDpjaGVxZDp0ZXN0bmV0OjZhZjQxMmQ3LTJmMDQtNGUxMi1hNDI0LWU2NzE5ZGI0ODdhZCIsIm5iZiI6MTcyODk2NTIwNywiaXNzIjoiZGlkOmNoZXFkOnRlc3RuZXQ6YjAwM2RmNmYtZWM4ZS00OGRkLTlhMmItNzAxMWM1Y2YwYTVlIn0.6dKE9-y2Id852onu1_WnD6aJnDtxgFZcjCbCfQ8MT1ACsHY8ox5jiKP4QUJNmhwesLidC99Qa0uyCrUhvHc2Bg"
  }
}

"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": "did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e",
  "subjectDid": "did:cheqd:testnet:6af412d7-2f04-4e12-a424-e6719db487ad",
  "schemas": [
    {
      "type": "MuseumPassCredential",
      "url": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d?resourceName=MuseumPassCredentialSchema&resourceType=JsonSchemaValidator2018"
    }
  ],
  "format": "jwt",
  "accreditationName": "accreditationToAttestTest",
  "parentAccreditation": "did:cheqd:testnet:15b74787-6e48-4fd5-8020-eab24e990578?resourceName=accreditAccreditation&resourceType=VerifiableAccreditationToAccredit",
  "rootAuthorization": "did:cheqd:testnet:5RpEg66jhhbmASWPXJRWrA?resourceName=authorizeAccreditation&resourceType=VerifiableAuthorisationForTrustChain",
}
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1"
  ],
  "type": [
    "VerifiableCredential",
    "VerifiableAccreditationToAccredit"
  ],
  "issuer": {
    "id": "did:cheqd:testnet:b003df6f-ec8e-48dd-9a2b-7011c5cf0a5e"
  },
  "credentialSubject": {
    "accreditedFor": [
      {
        "schemaId": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d?resourceName=MuseumPassCredentialSchema&resourceType=JsonSchemaValidator2018",
        "type": "MuseumPassCredential"
      }
    ],
    "id": "did:cheqd:testnet:6af412d7-2f04-4e12-a424-e6719db487ad"
  },
  "issuanceDate": "2024-10-15T04:06:47.000Z",
  "termsOfUse": {
    "type": "VerifiableAuthorisationForTrustChain",
    "parentAccreditation": "did:cheqd:testnet:15b74787-6e48-4fd5-8020-eab24e990578?resourceName=accreditAccreditation&resourceType=VerifiableAccreditationToAccredit",
    "rootAuthorization": "did:cheqd:testnet:5RpEg66jhhbmASWPXJRWrA?resourceName=authorizeAccreditation&resourceType=VerifiableAuthorisationForTrustChain",
  },
  "proof": {
    "type": "JwtProof2020",
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiVmVyaWZpYWJsZUF1dGhvcmlzYXRpb25Gb3JUcnVzdENoYWluIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImFjY3JlZGl0ZWRGb3IiOlt7InNjaGVtYUlkIjoiaHR0cHM6Ly9yZXNvbHZlci5jaGVxZC5uZXQvMS4wL2lkZW50aWZpZXJzL2RpZDpjaGVxZDp0ZXN0bmV0OjBhNWI5NGQwLWE0MTctNDhlZC1hNmY1LTRhYmM5ZTk1ODg4ZD9yZXNvdXJjZU5hbWU9TXVzZXVtUGFzc0NyZWRlbnRpYWxTY2hlbWEmcmVzb3VyY2VUeXBlPUpzb25TY2hlbWFWYWxpZGF0b3IyMDE4IiwidHlwZSI6Ik11c2V1bVBhc3NDcmVkZW50aWFsIn1dfSwidGVybXNPZlVzZSI6eyJ0eXBlIjoiVmVyaWZpYWJsZUF1dGhvcmlzYXRpb25Gb3JUcnVzdENoYWluIiwidHJ1c3RGcmFtZXdvcmsiOiJodHRwczovL2xlYXJuLmNoZXFkLmlvL2dvdmVybmFuY2Uvc3RhcnQiLCJ0cnVzdEZyYW1ld29ya0lkIjoiY2hlcWQgR292ZXJuYW5jZSBGcmFtZXdvcmsifX0sInN1YiI6ImRpZDpjaGVxZDp0ZXN0bmV0OjZhZjQxMmQ3LTJmMDQtNGUxMi1hNDI0LWU2NzE5ZGI0ODdhZCIsIm5iZiI6MTcyODk2NTIwNywiaXNzIjoiZGlkOmNoZXFkOnRlc3RuZXQ6YjAwM2RmNmYtZWM4ZS00OGRkLTlhMmItNzAxMWM1Y2YwYTVlIn0.6dKE9-y2Id852onu1_WnD6aJnDtxgFZcjCbCfQ8MT1ACsHY8ox5jiKP4QUJNmhwesLidC99Qa0uyCrUhvHc2Bg"
  }
}

"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

"linkedResourceMetadata": [
      {
        "resourceURI": "did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d/resources/4e1104f9-2ee9-4bde-adc2-ab8ba72b124a",
        "resourceCollectionId": "0a5b94d0-a417-48ed-a6f5-4abc9e95888d",
        "resourceId": "4e1104f9-2ee9-4bde-adc2-ab8ba72b124a",
        "resourceName": "OxfordUniversityAccreditation",
        "resourceType": "VerifiableAccreditationToAccredit",
        "mediaType": "application/json",
        "resourceVersion": "",
        "created": "2023-03-24T12:13:45Z",
        "checksum": "6819aaecd4073173b159fedf8077c38e14939d03d58e7f4e2a0ddfe034eb2ed4",
        "previousVersionId": null,
        "nextVersionId": null
      } 

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.

Root Authorisation for Trust Chain (published by rTAO)
    ↓
Verifiable Accreditation from rTAO to TAO
    ↓
Verifiable Accreditation from TAO to Trusted Issuer
    ↓
Verifiable Credential (Attestation) issued to subject
TAO: did:cheqd:gov-edu                    ← Department of Education
    └── Root Authorisation → "cheqd Governance Framework"
    ↓
TAO:  did:cheqd:state-certifier            ← State Certification Body
    ↓
Trusted Issuer: did:cheqd:university-123   ← Accredited University
    ↓
Verifiable Credential: Bachelor of Science

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

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

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

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

type

Must be AccreditationPolicy

parentAccreditation

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

rootAuthoroisation

The DID URL of the Root of Trust Verifiable Authorsation

type

Must be "AttestationPolicy"

parentAccreditation

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

rootAuthorisation

DID URL referencing the original Root Authorisation for the trust chain

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

Issue Verifiable Accreditation

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

DID-Linked Resources

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

Issue Verifiable Accreditation

Issue a Verifiable Accreditation to start a trust registry on cheqd

DID-Linked Resources

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

Issue Verifiable Accreditation

Issue a Verifiable Accreditation to start a trust registry on cheqd

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.

Issue Verifiable Accreditation

Issue a type of Verifiable Accreditation, including authorisations for the trust chain, and subordinate accreditations

Issue Verifiable Accreditation

Issue a type of Verifiable Accreditation, including authorisations for the trust chain, and subordinate accreditations

DID-Linked Resources

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

Issue Verifiable Accreditation

Issue a Verifiable Accreditation to start a trust registry on cheqd

Decentralized Trust Chains (DTCs)

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

Cover

Set up Trust Chain

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

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.

Cover
Cover
Cover

Set up Trust Chain

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

Get started with TRAIN

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

Cover
Cover
Cover

Deploy TRAIN and Anchor rTAO in DNS

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

Cover

Get Started with TRAIN

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

https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:322761ea-587d-454a-a955-745200301b99?resourceName=revocation-list-encrypted-inverse-timelock&resourceType=StatusList2021Revocationresolver.cheqd.net
Example of encrypted Status List identifiable via a DID URL
TRAIN

Bitstring Status List

Get started

Understanding Bitstring Status List

Figure 1: Graphic showing the Bitstring Status List bitstring

Where is the StatusList usually published?

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

Where does cheqd store the Status List?

Create Bitstring Status List

Create a Bitstring Status List as a DID-Linked Resource (DLR) on cheqd, using cheqd Studio.

Users are able to create Bitstring Status List entries on-ledger, in order to revoke or suspend Verifiable Credentials. This is a derivation from the core spec made by cheqd to support a more decentralized and resilient approach to storing Status Lists.

Step 1: Set up your account

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

Step 2: Create a DID

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

Step 3: Select the unencrypted Status List API

/credential-status/create/encrypted

Using this API will encrypt the bitstring of the Status List, meaning that a set of Payment Conditions will need to be met in order to access the Status List contents.

/credential-status/create/unencrypted

Using this API will create a regular Status List on-ledger, where the contents of the Status List are visible to any users who queries the blockchain.

Step 4: Create unencrypted Status List

Using the /credential-status/create/unencrypted API, users have two options for creating an encrypted Status List on-ledger:

  1. Filling out a simple form using the application/x-www-url-form-encoded option within an API client of your choice.

  2. Compiling a Status List payload yourself using the application/json option within an API client of your choice.

Option 1. Choose from a few variables and we will compile the Status List for you

This is the easiest way to create unencrypted Status Lists on cheqd and is recommended for users who are not overly familiar with compiling JSON objects.

Using the application/x-www-url-form-encoded option, users are able to choose between the following variables and options to create an unencrypted Status List on-ledger:

statusPurpose (required)
  • revocation (creates a Status List where each entry refers to revocation status)

  • suspension (creates a Status List where each entry refers to suspension status. Note that suspended Credentials may become unsuspended).

did (required)
did:cheqd:testnet:0ff9df5d-653b-4f77-a66c-0035abc34d63
statusListName (required)

This is the name of your Status List. This will also need to be kept consistent for all future updates of the same Status List. For example:

employmentCredentialRevocationList
length (optional)

The length of the Status List to be created. The default and minimum length is 140000 which is 16kb. For example:

140000
encoding (optional)

The encoding format of the encrypted StatusList DID-Linked Resource to be created.

  • base64url

  • base64

  • hex

statusListVersion (optional)

A user set value to represent the version of the Status List. For example:

1.0
alsoKnownAs (optional)

A user set field to assign a set of alternative URIs where the DID-Linked Resource can be fetched from. For example:

https://www.foo.com

Option 2. Publish a JSON payload yourself

Instead of using simple form variables, you can create an encrypted Status List using a JSON payload yourself using the application/json option on the Swagger UI.

Request format

An example of the JSON payload needed to be submitted is below:

{
  "did": "did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e",
  "statusListName": "cheqd-employee-credentials",
  "length": 140000,
  "encoding": "base64url"
}

Step 5: Hit the API

Once the Issuer has populated the requisite information for the unencrypted Status List request, they can use the API below to submit it to the ledger.

Get Started with TRAIN

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

What is 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.


How TDZM and the TRAIN Trust Validator Work Together

Component
Purpose

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


Step-by-Step: Setting Up Trust and Validation

1. Deploy Trust-DNS Zone Manager (TDZM)

Run the TDZM backend and UI using:

  • Docker Compose (for testing or development)

  • Helm Charts in Kubernetes (for production)

TDZM includes:

  • A DNS nameserver to manage your trust zone

  • A backend API and UI for managing records

  • Optional OIDC authentication


2. Delegate DNS Control to TDZM

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

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

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

Example:

trust.federation1.com. NS ns1.trust.federation1.com.
ns1.trust.federation1.com. A 203.0.113.10

3. Anchor the rTAO DID in DNS

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

Example:

_did.trust.federation1.com. TXT "did:cheqd:mainnet:rtao123"

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


4. Build the Trust Chain

  • Publish a Root Authorisation for Trust Chain from the rTAO

  • Issue Verifiable Accreditations from rTAO → TAOs → Trusted Issuers

  • Define governance rules and credential schema policies as needed


5. Use the TRAIN Trust Validator (TTV)

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

  • Traverse the Verifiable Accreditation chain

  • Verify structural and policy compliance

  • Optionally confirm the root via DNS lookups

  • Return a structured verification result


Summary

Goal
Component

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 TRAIN and Anchor rTAO in DNS

Deploy the DNS Zone Manager and anchor your Root DID in a DNS Zone.

Overview

To enable DNS-based verification of root authorities in your trust ecosystem, TRAIN relies on a component called the TDZM (Trust-DNS Zone Manager). This component manages DNS zones where Root Trusted Accreditation Organisations (rTAOs) can anchor their DIDs using TXT or TLSA records.

This page explains how to deploy TDZM, anchor your rTAO, and configure the environment to support trust chain resolution using DNS.


Why Anchor Your rTAO in DNS?

Anchoring your rTAO in DNS enhances trustworthiness and auditability by:

  • Providing cryptographic proof of domain control

  • Allowing trust validators (like TRAIN) to verify the root of the trust chain against public DNS records

  • Increasing assurance in ecosystems where DNS-based trust is required (e.g., public sector, federated networks)


Deployment Options

You can deploy TDZM in two ways:

  1. Locally using Docker Compose

  2. In a Kubernetes Cluster using Helm charts


Option 1: Run Locally with Docker Compose

This is the easiest way to run TDZM for development and testing.

Steps:

  1. Navigate to the deploy/local directory in the TDZM repository.

  2. Run the deployment script:

bashCopyEdit./deploy.sh build

The build flag is optional but recommended to ensure you’re running the latest version.

This will launch:

  • A Keycloak instance for authentication

  • The TDZM backend

  • The TDZM UI

Local Access


Option 2: Deploy in Kubernetes (Production)

TDZM can be deployed in a Kubernetes cluster using Helm charts for both the backend and UI.

Prerequisites

  • Kubernetes cluster with Nginx Ingress Controller

  • TLS certificates available as Kubernetes secrets OR A Let’s Encrypt cert issuer setup via Ingress


Configure DNS Delegation

Before TDZM can manage your trust zone, you must configure your DNS provider:

  1. NS Record in the parent zone pointing to your TDZM instance Example:

    CopyEdittrust.federation1.com. NS ns1.trust.federation1.com.
  2. A Record resolving the nameserver to your TDZM server’s IP Example:

    cssCopyEditns1.trust.federation1.com. A 192.0.2.4

These records must be added in the parent zone (e.g., federation1.com) for your trust zone to be valid (trust.federation1.com).


Helm Configuration: TDZM Backend

When deploying the backend, set the following values in your Helm values.yaml file:

Property

Description

Example

zoneConfig.TF_DOMAIN_NAME

DNS zone managed by TDZM

trust.federation1.com

zoneConfig.TF_DOMAIN_IP

IP address for the NS server

192.0.2.4

zoneConfig.PRIMARY_SERVER_NSD

Domain of the primary nameserver

ns1.trust.federation1.com

zoneConfig.PRIMARY_SERVER_IP

IP of the primary nameserver

192.0.2.4

authConfigFileContent.ISSUER_URL

OIDC issuer for JWT validation

https://auth.federation1.com

authConfigFileContent.CLIENT_ID

Allowed client ID

tzdm-client

authConfigFileContent.ALLOW_UNSAFE_SSL

Skip SSL validation (not recommended)

false

Note: TDZM requires a shared volume (ReadWriteMany) for pod scaling. Ensure your cluster supports this (e.g., via NFS).


Helm Configuration: TDZM UI

UI configuration options:

Property

Description

Example

zonemgr_url

Backend URL

http://tdzm-backend.namespace.svc.cluster.local

oidc_issuer_url

OIDC server URL

https://auth.federation1.com

oidc_client_id

OIDC client ID

tzdm-ui-client

oidc_client_secret

Client secret

super-secret-value

ui_host

Public UI domain

ui.trust.federation1.com

app_base_url_path

Must be /ui

/ui


Next Step: Anchor Your rTAO DID

Once TDZM is running and DNS is delegated:

  1. Add a TXT record under your trust zone with the content linking your rTAO DID to the domain.

  2. Example DNS entry:

arduinoCopyEdit_did.trust.federation1.com. TXT "did:cheqd:mainnet:rtao123"

This DNS record will allow TRAIN to resolve and validate the rTAO’s DID during trust chain verification.


Summary

Component
Description

TDZM Backend

Manages DNS records and trust zones

TDZM UI

Provides web interface to manage delegations

TRAIN

Uses TDZM-managed DNS records to validate rTAO identities

DNS Provider

Must delegate NS and A records to the TDZM zone manager


Validate Trust Chain

Validate the trust chain of a credential using TRAIN, to recursively traverse back to a Root of Trust, and determine the accreditations and authorizations of an issuer Decentralized Identifier (DID).

Overview

TRAIN is a trust validation service that evaluates the trustworthiness of Verifiable Credentials (VCs) by checking whether the issuer's Decentralized Identifier (DID) can be traced back to a trusted source—known as a root of trust.

Get started with TRAIN TTV API

Use the TRAIN APIs below to validate your trust chain:

What TRAIN Does

TRAIN's Trust Validator (TTV) validates credentials by:

  1. Taking a Verifiable Credential (VC) as input.

  2. Identifying the issuer DID from the credential.

  3. Following the credential's trust chain, resolving links between DIDs, Verifiable Accreditations, and Trust Anchors.

  4. Verifying whether the top-level (root) entity in the chain is a trusted source (e.g., DNS-anchored entity, government body, industry group).

  5. Producing a trust assessment (e.g., valid/invalid, verified/unverified) that can be consumed by relying parties.

How TRAIN Uses the cheqd Trust Anchor

Within the cheqd network, Trust Anchors represent root entities that can authorize other issuers via Verifiable Accreditations. These accreditations form Decentralized Trust Chains, which TRAIN evaluates to determine if a credential is trustworthy.

TRAIN integrates the cheqd Trust Anchor model by:

  • Recognizing VerifiableAccreditation credentials as establishing authority between entities.

  • Resolving these links recursively up the chain until it reaches a root-level DID.

  • Checking whether the root DID is associated with a DNS-anchored Trust Anchor using DNSTrustFrameworkPointer entries.

Validation Logic

When TRAIN evaluates a credential issued within cheqd's ecosystem, it performs the following checks:

  1. Credential Verification Validates the signature and schema of the input Verifiable Credential.

  2. Trust Chain Resolution Follows the termsOfUse field and associated VerifiableAccreditation resources to build the credential’s trust chain.

  3. Anchor Resolution Locates the root DID and evaluates whether it has a valid DNSTrustFrameworkPointer or other proof-of-authority reference (e.g., X.509 linkage).

  4. Anchor Validation Confirms that the root DID’s association with a domain name is cryptographically anchored using DNS-based proofs (e.g., DNS TXT records or TLSA).

  5. Policy Compliance (optional) Validates that the trust chain complies with local or domain-specific policy requirements (e.g., only accept credentials rooted in .gov domains).

TRAIN Trust Validator (TTV) Request Format

The following fields are used when submitting a request to the TRAIN Trustworthiness Validator (TTV). This validator checks whether the issuer of a Verifiable Credential is trustworthy by tracing their accreditations up a trust chain. The fields below are passed as JSON in the request body and instruct TRAIN on how to resolve and validate the issuer's authority and compliance with a defined trust policy.

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" ]

TRAIN Trust Valdiator (TTV) Response Format

When a trust validation request is submitted, the TRAIN Trust Validator returns a structured JSON response describing the outcome of the trust chain evaluation. This includes the result of DNS anchoring checks (if requested) and the discovered trust framework that governs the credential's validation.

Below is a breakdown of each field returned in the response:

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

Benefits of Using TRAIN with cheqd

  • Decentralized Assurance: No need to trust a single registry—chains of accreditations are independently verifiable.

  • DNS Anchoring: Leverages globally resolvable domain infrastructure to provide high-assurance validation.

  • Interoperable: Built on open standards like DIDs, VCs, and JSON-LD for compatibility with other ecosystems.

Sequence Diagram for Validation

Below is a sequence diagram showing how a request is fully validated.

Create Status Lists

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.

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

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

Get started with cheqd Studio

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

Update Bitstring Status List

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

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

Search Bitstring Status List

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

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

Step 1: Set Status List Search Filters

Users are able to filter by:

did (required)

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

statusPurpose

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

  • revocation

  • suspension

statusListName

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

Step 2: Hit the API

Execute the filters from Step 1 on the API below:

Token Status List

Get Started

Understanding Token Status List

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

Update Token Status List

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

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

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

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

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

Step 2: Encode the updated file

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

Expected output:

Step 3: Set the same Resource Name and Type

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

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

For example:

Step 4: Populate the request inputs and hit the API

Check Bitstring Status List

Query Bitstring Status List entries or indices using cheqd Studio.

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

Step 1: Set parameters for check

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

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

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

Option 1. Choose from a few variables

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

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

statusPurpose

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

  • revocation

  • suspension

index

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

Make Fee Payment

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

Option 2. Publish a JSON Payload

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

Step 2: Execute the API request

Execute the API request using the API below:

Create Token Status List

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

Users are able to create Token Status List entries on-ledger, which may be used to represent whether a Verifiable Credential is active, inactive or suspended. This implementation on cheqd is a derivation from the core spec made by cheqd to support a more decentralised and resilient approach to storing Token Status Lists.

Step 1: Set up your account

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

Step 2: Create a DID

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

Step 3. Create your Status List JWT/CWT and save the file locally

Token Status Lists are JWT or CWT files that reference lists of bits formatted in JSON or CBOR.

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

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

Step 4: Encode the file

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

Expected output:

Step 5: Set the resource name and type

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

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

For example:

Step 6: Populate the request inputs and hit the API

Ensure that you link this Token Status List to the DID that you created in step 3. This will sign the resource with the same verification method keys in your DID Document, ensuring cryptographic integrity and Controllership of the Status List.

As a DID-Linked Resource, the Token Status List will have a fully resolvable DID URL which can be referenced within the body of Verifiable Credentials, and queried by verification policies to establish the status of the specific credential.

Step 7: Reference the Token Status List

Owing to the design of DID-Linked Resources, following the creation of the Token Status List, users are able to reference the specific version, or create a query to always fetch the latest version of the Token Status List.

Using a DID Resolver or the search DID endpoint, users can find the DID URL and unique resourceId of the Token Status List. The unique resourceId allows users to specify this exact version of the Token Status List.

In the DID Document Metadata, users should find "linkedResourceMetadata", like the following snippet:

Specific version of the Token Status List

Here, the "resourceURI" specifies the DID URL of the specific Token Status List that was created.

Latest version of the Token Status List

In order to reference the latest version of the Token Status List, the following construction needs to be used:

did:cheqd:<namespace>:<resourceCollectionId>?resourceName=<resourceName>&resourceType=<resourceType>

For example:

did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d?resourceName=DegreeCredentialStatus&resourceType=TokenStatusList

Token Status List at specific point in time

In order to reference the Token Status List at a particular point in time, the following construction needs to be used:

did:cheqd:<namespace>:<resourceCollectionId>?resourceName=<resourceName>&resourceType=<resourceType>&resourceVerionTime=<XMLDateTime>

For example:

did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d?resourceName=DegreeCredentialStatus&resourceType=TokenStatusList&resourceVersionTime=2023-02-22T06:58:18.61Z

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.

Graphic showing the StatusList2021 bitstring

Each issued Credential correlates with a position and index on the bitstring, so that a verifier will be able to correlate the value within the Credential against the public bitstring to ascertain whether the Credential has been revoked or not, using a 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 .

Non-normative example for a Status List Token in JWT format
Non-normative example for a Status List Token in CWT format (not including the type header yet)
did

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

statusListName

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

Non-normative example for a Status List Token in JWT format
Non-normative example for a Status List Token in CWT format (not including the type header yet)

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

bitstrings
verifiable credential
validate algorithm
bitstring expansion algorithm
DID-Linked Resource
the context for creating DID-Linked Resources

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.

creating a Status List
follow the tutorial here
Fraunhofer Institute

Deploy TRAIN and Anchor rTAO in DNS

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

http://localhost:16001
http://localhost:8001/ui
cheqd ecosystem

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.

created in Step 2
{
  "alg": "ES256",
  "kid": "12",
  "typ": "statuslist+jwt"
}
.
{
  "exp": 2291720170,
  "iat": 1686920170,
  "iss": "https://example.com",
  "status_list": {
    "bits": 3,
    "lst": "eNrbuRgAAhcBXQHutdpRiBFREinSjQfeTpXmdQfwefegD"
  },
  "sub": "https://example.com/statuslists/1"
}
d28453a20126106e7374617475736c6973742b637774a1044231325860a502782168
747470733a2f2f6578616d706c652e636f6d2f7374617475736c697374732f310173
68747470733a2f2f6578616d706c652e636f6d061a648c5bea041a8898dfea19fffe
56a2646269747301636c73744a78dadbb918000217015d58400f2ca3772e10b09d5d
6ed56461f7cba1a816c6234072d1bb693db277048e5db5a4e64444492a9b781d6c7a
c9714db99cc7aadb3812ec90cab7794170bab5b473
$ base64 -w 0 resource.json
<path-to-the-resource-file>
$ base64 -w 0 resource.json
HfSynOpmBrhgfYguING
{
    "data": "HfSynOpmBrhgfYguING",
    "encoding": "base64url",
    "name": "DegreeCredentialStatus",
    "type": "TokenStatusList"
}
did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0
employmentCredentialRevocationList
10
{
  "did": "string",
  "statusListName": "string",
  "index": 0,
  "makeFeePayment": false
}
{
  "alg": "ES256",
  "kid": "12",
  "typ": "statuslist+jwt"
}
.
{
  "exp": 2291720170,
  "iat": 1686920170,
  "iss": "https://example.com",
  "status_list": {
    "bits": 1,
    "lst": "eNrbuRgAAhcBXQ"
  },
  "sub": "https://example.com/statuslists/1"
}
d28453a20126106e7374617475736c6973742b637774a1044231325860a502782168
747470733a2f2f6578616d706c652e636f6d2f7374617475736c697374732f310173
68747470733a2f2f6578616d706c652e636f6d061a648c5bea041a8898dfea19fffe
56a2646269747301636c73744a78dadbb918000217015d58400f2ca3772e10b09d5d
6ed56461f7cba1a816c6234072d1bb693db277048e5db5a4e64444492a9b781d6c7a
c9714db99cc7aadb3812ec90cab7794170bab5b473
$ base64 -w 0 resource.json
<path-to-the-resource-file>
$ base64 -w 0 resource.json
SGVsbG8sIHdvcmxk
{
    "data": "SGVsbG8sIHdvcmxk",
    "encoding": "base64url",
    "name": "DegreeCredentialStatus",
    "type": "TokenStatusList"
}
"linkedResourceMetadata": [
      {
        "resourceURI": "did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d/resources/4e1104f9-2ee9-4bde-adc2-ab8ba72b124a",
        "resourceCollectionId": "0a5b94d0-a417-48ed-a6f5-4abc9e95888d",
        "resourceId": "4e1104f9-2ee9-4bde-adc2-ab8ba72b124a",
        "resourceName": "DegreeCredentialStatus",
        "resourceType": "TokenStatusList",
        "mediaType": "application/json",
        "resourceVersion": "",
        "created": "2023-03-24T12:13:45Z",
        "checksum": "6819aaecd4073173b159fedf8077c38e14939d03d58e7f4e2a0ddfe034eb2ed4",
        "previousVersionId": null,
        "nextVersionId": null
      } 

Create Token Status List

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

Update Token Status List

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

Verifier pays Issuer

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

Set up your account

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

Create an Issuer DID

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

Set up Trust Chain

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

Cover

Validate Trust Chain

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

Cover

cheqd Studio

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

Credo

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

Veramo

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

Walt.id Community Stack

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

Cover
Cover
Cover
Cover
link to the specification may be found here

Create DID-Linked Resources

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

Get started

Alternatives

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

Partner SaaS support

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

DID-Linked Resource Write Pricing

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

Referencing DID-Linked Resources in VCs

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.

IIW Example

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.

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

Dereferencing the schema

The schema in the above Credential dereferences to the following data:

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

Understanding DID-Linked Resources

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

Overview

Contents

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

Architecture for DID-Linked Resources

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

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

Support for AnonCreds using DID-Linked Resources

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

Create DID-Linked Resource

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

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

  1. Schemas

  2. Credential Definitions

  3. Trust Registries

  4. Status Lists

  5. Logos associated with DIDs

  6. Governance files

Step 1: Set up your account

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

Step 2: Create a DID

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

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

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

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

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

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

Step 4: Encode the file

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

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

Expected output:

$ base64 -w 0 resource.json
SGVsbG8sIHdvcmxk

Step 5: Set a consistent name and type

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

Step 6: Populate the request inputs and hit the API

Context for developing DID-Linked Resources

Understand the context and design decisions around why cheqd developed DID-Linked Resources (DLRs).

Understanding "Resources" in decentralised identity

For example, common types of resources that might be required to issue and validate Verifiable Credentials are:

  • Schemas;

  • Status lists;

  • Trust registries;

  • Visual Representations of Verifiable Credentials;

  • Documents; or

  • Logos

Schemas

{ 
    "@type": "http://schema.org/Person", 
    "http://schema.org/address": {   
        "@type": "http://schema.org/PostalAddress",   
        "http://schema.org/streetAddress": "123 Main St.",   
        "http://schema.org/addressLocality": "Blacksburg",   
        "http://schema.org/addressRegion": "VA",   
        "http://schema.org/postalCode": "24060",   
        "http://schema.org/addressCountry": "US" 
    }
}

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.

Status and Revocation Lists

Trust registries

Visual representations for Verifiable Credentials

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.

Documents

More broadly, there are other types of resources that might be relevant for companies beyond SSI vendors, that want a way to represent information about themselves in an immutable and trustworthy way.

Logos

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.

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

By clicking the image below, you will see that this is actually being pulled and resolved from the cheqd ledger:

Rationale for storing resources on-ledger

What are the problems with the way resources are stored?

The issue of centralisation affects resources providing extra context and information to support Verifiable Credentials. These resources, such as schemas and revocation lists, are often stored and referenced using centralised hosting providers.

Using centralised hosting providers to store resources may have a significant difference in the longevity and authenticity of Verifiable Credentials. For example, a passport (which typically has a 5–10 year validity) issued as a Verifiable Credential anchored to a DID (regardless of whether the DID was on-ledger or not) might stop working if the credential schema, visual presentation format, or other necessary resources were stored off-ledger on traditional centralised storage.

  • DIDs could be tampered by compromising the hosting provider: DIDs and DID Documents ("DIDDocs") stored at a centralised web endpoint can be compromised and replaced by malicious actors.

  • Hosting providers could unilaterally cease to host particular clients: Hosting providers could terminate accounts due to factors such as non-payment of fees, violation of Terms of Service, etc.

  • Single point-of-failure in resiliency: Even for highly-trusted and sophisticated hosting providers who may not present a risk of infrastructure being compromised, a service outage at the hosting provider can make a DID anchored on their systems inaccessible.

Single points of failure

Even for highly-trusted and sophisticated hosting providers who may not present a risk of infrastructure being compromised, a service outage at the hosting provider can make a resource anchored on their systems inaccessible.

Link rot

This illustrates that link rot can affect a significant proportion of links in a relatively small amount of time, and once again, looking at how resources are currently stored in SSI ecosystems, if the resource locations are moved and the links are broken, the Verifiable Credentials relying on these resources become unusable. Therefore, resources, once defined, should be architected to be used and referenced indefinitely, without being changed.

Tamper-evident changes and censorship resistance

Finally, the centralised way that resources are currently stored and managed is not immutable, and as a result, it is liable to tampering. For example, if a hosting provider is compromised, or if malicious actors are working for the company, resources may be changed and previous resource versions may be purged from the central database.

As we move towards a new web infrastructure with Web 3 (and beyond…), and as more projects leverage blockchain and distributed ledgers, it’s important not to port the previous issues of the web, and instead find novel ways to better manage information, with longevity in mind. This is why at cheqd, we have decided to redesign the way resources are captured on the ledger.

Semantic Linkage

Solutions that do currently store schemas on ledger (e.g., Hyperledger Indy) don't have semantic linkage between old and new versions. In this instance, current ledgers allow new versions to be made but don't offer an easy way for client apps to discover linkages as they evolve over time.

Addressing risk vectors using DID-Linked Resources

We took the following design principles into consideration, along with an explanation of how we addressed them:

  1. Built using existing, familiar DID Core Spec patterns: Wherever possible, our design attempts to utilise existing patterns and behaviours within the W3C DID Core specification (such as the use of DID URLs to identify resources), instead of trying to implement proprietary/custom approaches. We believe that similar designs could be adopted by other DID methods if they choose.

  2. Protection against linkrot for long-term retrieval: Any Resource stored on-ledger is replicated across multiple nodes.

    1. If any individual node or endpoint is down, lookup requests can be sent to any other node on the network.

    2. In a catastrophic scenario where the network itself stops to exist, e.g., companies shutting down, getting acquired etc the on-ledger data can still be restored by digital archivists using ledger snapshots. A practical example of this is how Cosmos Hub makes historical chain archives available which can be restored. While this can be cumbersome, we wanted to design for this as a fail-safe.

  3. Extensible by default: Our objective was to build a flexible design pattern that allowed developers to define and extend their own resource types. Trying to control what kinds of resources could be written to ledger would make the ledger-side logic complex. Instead, we opted for a design where the cheqd ledger acts agnostically to store resources, as long as correctly authorised, as a permanently-accessible endpoint.

  4. Design for DID-spec "dumb" as well as DID-spec "smart" client applications: Many approaches in this space assume that client applications must be adept at parsing DIDDocs and resolving complex inter-DIDDoc relationships. We saw describing resources using DIDDocs as metadata about the resource which could be independently-parsed by "smart" client applications; while also providing a fallback approach for "dumb" client applications. We internally considered this as "What if an identity wallet understood how to parse JSON, but didn't understand the DID Core spec?"

  5. Version controlled: The ability to evolve a resource over time is critical for identity use cases. As described above, examples of this include when identity document schemas change, logos evolve, etc. Current approaches (such as Hyperledger Indy CredDefs) deal with this by creating entirely new, unlinked resources. We designed to make it easy, using existing DID Core specification techniques, so that client applications could query "What was the version of a resource with this name on this date/time?"

Technical composition of DID-Linked Resources

Understand the technical composition of DID-Linked Resources (DLRs) on cheqd.

Formatting a Resource

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.

Understanding the DID and Collection relationship

Resources are organised into groups called "Collections". Each DID may have an associated Collection, and the Collection ID is derived from the unique identifier of the DID.

Collections can store any type of Resource, but for the purpose of this documentation we will focus on the use case where the Collection is used for storing a set of schemas.

The most important concept used in this design is that each on-ledger Collection is identified using a DID and is described using a DID Document.

The DID Document acts as metadata, providing information about the Collection, such as who is able to update it, when it was created and what are the latest and deprecated versions of Resources within the Collection.

For example, the following DID:

did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d

will derive the Collection ID: 1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d

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.

Creating a Resource inside a Collection, associated with a DID

To create a "DID-Linked Resource", you must already have created a 'parent' DID, from which the Collection ID can be derived. When you carry out the createResource transaction, you must:

  1. Generate a new, unique UUID for the Resources

  2. Specify the same Collection ID as the unique identifier of the parent DID

  3. Sign the createResource transaction with the Verification Method keys of the parent DID.

This is shown in the diagram below:

Figure 3: Relationship between a DID and DID-linked Resource

Example of createResource transaction using Veramo SDK:

{
    "kms": "local",
    "payload": {
        "collectionId": "1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d",
        "id": "f3d39687-69f5-4046-a960-3aae86a0d3ca",
        "name": "PassportSchema",
        "version": "", // optional
        "resourceType": "CL-Schema",
        "alsoKnownAs": [], // optional alternative URIs
        "data": "SGVsbG8sIHdvcmxk" // base 64 encoded file 
    },
    "signInputs": [{
        "verificationMethodId": "did:cheqd:testnet:z4ZUuPbs1xyK7y8d#key-1",
        "keyType": "Ed25519",
        "privateKeyHex": "0f5c124886178037952e87e0cdc55d185732577fca19ae877e64ac9ab24a0cc534e5326e70f1a42d785d93048aee806c359ec75a7b06f39253befd1746708438"
    }]
}

Linking DIDs to Resources and Collections

Multiple, DID-Linked Resources can be stored in a Collection, for example, this could be different versions of the same Resource over a period of time or semantically-linked resources. This enables unique resources to be stored directly on-ledger and be retrievable through DID resolution and dereferencing.

Once you have created a resource, the DID Document will automatically reference the resource and the collection within the didDocumentMetadata in a newly defined section called linkedResourceMetadata.

This relationship is shown in the diagram below:

Figure 4: DID Document metadata with DID-linked Resource metadata

For simplicity, we will focus on the use case where a Resource is a schema. The same logic used in fetching schemas from the ledger can be applied to any of the aforementioned types of Resources.

The syntax of a Resource metadata for a single schema is as follows:

"linkedResourceMetadata": [
  {
    "resourceURI": "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d/resources/f3d39687-69f5-4046-a960-3aae86a0d3ca",
    "resourceCollectionId": "1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d",
    "resourceId": "f3d39687-69f5-4046-a960-3aae86a0d3ca",
    "resourceName": "PassportSchema", // First version of a Resource called PassportSchema
    "resourceType": "CL-Schema",
    "mediaType": "application/json",
    "created": "2022-07-19T08:40:00Z",
    "checksum": "7b2022636f6e74656e74223a202274657374206461746122207d0ae3b0c44298",
    "previousVersionId": "", // empty string if no previous version, otherwise, resourceId of previous version
    "nextVersionId": "", // null if no new version, otherwise, resourceId of new version
  }
]

Media Types allowed in Resources

Resource Request Parameters

The following list defines which specific parameters a resource request format may contain:

Parameter
Description

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.

Resource Response Parameters

The following list defines which specific parameters a resource response format may contain:

Parameter
Description

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.

Example of a resolved DID with an associated Resource

Let’s take a look at a fully resolved output response for a DID with a Collection and single associated Resource:

{
  "@context": "https://w3id.org/did-resolution/v1",
  "didResolutionMetadata": {
    "contentType": "application/did+ld+json",
    "retrieved": "2022-11-28T05:01:50Z",
    "did": {
      "didString": "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d",
      "methodSpecificId": "1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d",
      "method": "cheqd"
    }
  },
  "didDocument": {
    "@context": [
      "https://www.w3.org/ns/did/v1"
    ],
    "id": "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d",
    "controller": [
      "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d"
    ],
    "verificationMethod": [
      {
        "id": "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d#verKey1",
        "type": "Ed25519VerificationKey2020",
        "controller": "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d",
        "publicKeyMultibase": "zB5wPyMGYL4LbT424Z7yXHm6nZrrLqZZg9eWtVmedodys"
      },
    ],
    "authentication": [
      "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d#verKey1"
    ]
  },
  "didDocumentMetadata": {
    "created": "2015-04-10T11:51:40Z",
    "versionId": "ea2b76cf-a118-403a-8f49-244e56c9dcb8",
    "linkedResourceMetadata": [
      { // First version of a Resource called PassportSchema
        "resourceURI": "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d/resources/f3d39687-69f5-4046-a960-3aae86a0d3ca",
        "resourceCollectionId": "1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d", // Derived Collection ID
        "resourceId": "f3d39687-69f5-4046-a960-3aae86a0d3ca",
        "resourceName": "PassportSchema",
        "resourceType": "CL-Schema",
        "mediaType": "application/json",
        "created": "2015-04-16T14:01:42Z",
        "checksum": "72f9d4f96c6f4fedcfd5d1691b10d60d14a008cace269ddb35342aa8d43a30fc",
        "previousVersionId": null, // No previous or next versions
        "nextVersionId": null // No previous or next versions
      }
    ]
  }
}

Example of DID Document with multiple versions of the same resource

Let’s take a look at a fully resolved output response for a DID with a Collection and multiple associated Resources:

{
  "@context": "https://w3id.org/did-resolution/v1",
  "didResolutionMetadata": {
    "contentType": "application/did+ld+json",
    "retrieved": "2022-11-28T05:01:50Z",
    "did": {
      "didString": "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d",
      "methodSpecificId": "1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d",
      "method": "cheqd"
    }
  },
  "didDocument": {
    "@context": [
      "https://www.w3.org/ns/did/v1"
    ],
    "id": "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d",
    "controller": [
      "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d"
    ],
    "verificationMethod": [
      {
        "id": "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d#verKey1",
        "type": "Ed25519VerificationKey2020",
        "controller": "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d",
        "publicKeyMultibase": "zB5wPyMGYL4LbT424Z7yXHm6nZrrLqZZg9eWtVmedodys"
      },
    ],
    "authentication": [
      "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d#verKey1"
    ]
  },
  "didDocumentMetadata": {
    "created": "2015-04-10T11:51:40Z",
    "versionId": "9D760202FF2BD4A12344283627FF251BE6C48812C7626C3564C1C2843CAB9085",
    "linkedResourceMetadata": [
      { // First version of a Resource called PassportSchema
        "resourceURI": "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d/resources/f3d39687-69f5-4046-a960-3aae86a0d3ca",
        "resourceCollectionId": "1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d", // Derived Collection ID
        "resourceId": "f3d39687-69f5-4046-a960-3aae86a0d3ca",
        "resourceName": "PassportSchema", // Resource name remains the same
        "resourceType": "CL-Schema", // Resource type remains the same
        "mediaType": "application/json",
        "created": "2015-04-16T14:01:42Z",
        "checksum": "72f9d4f96c6f4fedcfd5d1691b10d60d14a008cace269ddb35342aa8d43a30fc",
        "previousVersionId": null,
        "nextVersionId": "8f86d7aa-dc6a-4cee-ac37-97956542d587"
      },
      { // Second version of a Resource called PassportSchema
        "resourceURI": "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d/resources/8f86d7aa-dc6a-4cee-ac37-97956542d587",
        "resourceCollectionId": "1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d", // Derived Collection ID
        "resourceId": "8f86d7aa-dc6a-4cee-ac37-97956542d587",
        "resourceName": "PassportSchema", // Resource name remains the same
        "resourceType": "CL-Schema", // Resource type remains the same
        "mediaType": "application/json",
        "created": "2020-06-16T14:02:39Z",
        "checksum": "ec54f8019b869d5511b42678ea859b9dc185f487bf1776cb079fda0930331689",
        "previousVersionId": "f3d39687-69f5-4046-a960-3aae86a0d3ca",
        "nextVersionId": "bd128013-636d-4240-b48b-fc88bf9ee8de"
      },
      { // Third version of a Resource called PassportSchema
        "resourceURI": "did:cheqd:mainnet:1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d/resources/bd128013-636d-4240-b48b-fc88bf9ee8de",
        "resourceCollectionId": "1f8e08a2-eeb6-40c3-9e01-33e4a0d1479d", // Derived Collection ID
        "resourceId": "bd128013-636d-4240-b48b-fc88bf9ee8de",
        "resourceName": "PassportSchema", // Resource name remains the same
        "resourceType": "CL-Schema", // Resource type remains the same
        "mediaType": "application/json",
        "created": "2022-09-16T14:10:46Z",
        "checksum": "cc187364f3bf071e5411cb6074d9c44a1b416a32b8eea581d113e486d1d586cf",
        "previousVersionId": "8f86d7aa-dc6a-4cee-ac37-97956542d587",
        "nextVersionId": null
      }
    ]
  }
}

Collections are identified by a Collection ID which is a unique identifier of the linked, parent DID. Within the DID Document Metadata of the Collection DIDDoc, the Linked Resource metadata describes Resources within this Collection:

Note that the Linked Resource output above does not show the actual data / schema attributes when displaying all Resources in this Collection. It only shows Resource metadata.

This logic prevents GetResourceCollection requests returning large quantities of data, which may be stored across multiple Resources within a Collection.

In order to fetch the actual data, it is necessary to query the specific Resource, rather than the entire Collection.

Versioning and Archiving Resources

As shown in the examples above, there may be previous and next versions of the Resource ID.

Whenever a Resource is updated, a new UUID must be generated. The new Resource references the older version, so the UUID is effectively a version number.

Importantly, the collectionId, resourceName and the resourceType of the Resource must remain the same.

For example, a Resource with the name PassportSchema must always have the same name and resource type to be considered for previous/next version linking.

This could be used, for example, to find the version active at a particular point in time:

Query based dereferencing

Fetching resources using DID resolvers and DID URLs is hugely desirable. Up until this point, we have shown resources identified using path-based syntax.

However, query-based syntax should also be enabled to allow more granular and specific searches within a particular Collection.

IMPORTANT: DID URL queries should be fully qualified so that they uniquely identify a single resource, or single resource version unless expressly specified.

Search DID-Linked Resource

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

Create a did:cheqd DID using the Credo Agent.

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

⚠️ Prerequisites

Before you begin:

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

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

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

Method Overview

Credo supports two approaches to creating a DID:

Option 1 – Manually construct a full DID Document

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

Option 2 – Auto-generate the DID Document

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

Create DID

  1. method*: cheqd

  2. secret

  3. options*

  4. didDocument

Option 1: Create a DID from a full DID Document

  1. First, generate a key pair:

  1. 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 the testnet unless you specify "mainnet" in options.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.

What’s Next?

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

Choosing the right SDK

Understand cheqd's SDK suite and choose the best fit for your project.

Integrate with a cheqd supported SDK

cheqd has integrated into a suite of SDKs to enable third parties to create DIDs and DID-Linked Resources; and, issue and verify Verifiable Credentials, using cheqd DIDs.

Choose a software stack to suit your needs

cheqd is continually integrating into different software development kits to suit the needs of different partners and their clients.

Below is a comparison between our supported SDKs, including: Credo, ACA-Py, Veramo SDK plugin and Walt.id's Community Stack.

Get started

Choose one of our SDKs below and started building cheqd into your existing or new product:

Credo

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

Get Started with Credo

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

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

This integration showcases Credo’s expanding support for:

  • Multiple credential formats

  • Diverse DID methods

  • Interoperable ledger technologies

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

Key Features

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

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

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

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

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

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

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

Breaking New Ground: Credo + cheqd

This includes:

  • Issuance of Verifiable Credentials using cheqd DIDs

  • Creation of Credential Schemas and Credential Definitions

  • Support for the cheqd AnonCreds Object Method

  • Native DID and resource support for did:cheqd

Get started

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

Supported Credential types

Credo supports the following Credential formats:

Watch our demo video

Setup Credo Agent

Setup your Credo Agent to get started.

This guide walks you through the setup process for a Credo Agent with support for cheqd DIDs and AnonCreds.

Prerequisites

Before you begin, make sure you have the following:

  • Node.js v16 or v18

  • Yarn or npm installed

  • A working Node.js or React Native project

  • Follow the Getting Started guide if you're new to Credo

Installing Cheqd

To enable cheqd in your agent, install the required package:

This package provides everything needed to register, resolve, and interact with did:cheqd identifiers and AnonCreds objects.

React Native Support

If you're using React Native, additional steps are needed to support cosmjs:

1. Use cosmjs-rn packages

Update your package.json using npm overrides or Yarn resolutions:

Example (NPM overrides):

Example (Yarn resolutions):

2. Add Buffer Polyfill

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:

Next steps

Now that your Credo agent is successfully set up to work with cheqd, try following our tutorials for creating a new DID or issuing Verifiable Credentials.

"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.

Image showing a formatted DID URL for a cheqd resource

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.

Image of Overlay Capture Architecture

Figure 1:

Image of British airways tickets in digital visual format

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 .

Cloud provider market share

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.

Graph showing drop in Facebook traffic from their global service outage in 2021

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.

Link rot analysis over time

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.

A pie chart showing an analysis of why link rot happens

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".

Image showing a formatted DID URL for a cheqd resource
Relation between a DID and Resource Collection

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 .

Relationship between a DID and DID-linked Resource
DID Document metadata with linked Resource metadata

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 .

Parameters

Option 2

Functionality
Credo
Veramo
ACA-Py
Walt.id SSI Kit

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.

Adding cheqd to the Agent

did:cheqd Decentralized Identifier
Universally Unique Identifier (UUID)

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 Resources
W3C DID Core standard

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.

W3C Verifiable Credentials
Verifiable Presentations
the fields and content types in a credential
schema.org
Hyperledger Indy schema objects
schema.org
Schema.org
Hyperledger AnonCreds SCHEMA objects
check the status of a credential
Bitstring Status List
Hyperledger AnonCreds Revocation
ToIP Trust Registry Query Protocol
EBSI Trust Chains
Overlays Capture Architecture (OCA) specification
Apple Wallet PassKit
Google Wallet Pass
Overlay Capture Architecture (OCA)
internationalisation (“i18n”) translations
Overlays Capture Architecture Specification Version 1.0.0
British Airways media centre
example above from British Airways
Trust over IP (ToIP) recommends making Governance Frameworks available through DID URLs
Markdown file
key-publishing sites like Keybase.io
Cosmos SDK block explorers such as our own
favicons
cheqd
Hyperledger Indy
IPFS
Sidetree
KERI
did:web
did:git
65 per cent in nearly all regions (outside of China)
CoinTelegraph
Facebook outage of 2021
took down apps that used “Login with Facebook”
a different Facebook outage took down Spotify, TikTok, Pinterest
Kentik
Verifiable Credentials
DID Authentication
an analysis by The New York Times of linkrot
Columbia Journalism Review / New York Times
at least 66.5% of links to sites in the last 9 years are dead
The Internet Archive
Wayback Machine
Ahrefs
Schema.org
restricts the block size for an individual block to ~200 KB
our first DID on cheqd network
a 7+ MB image accessible via IPFS
technical details on learn how we have architected DID-Linked resources
did:cheqd Decentralized Identifier
Universally Unique Identifier (UUID)
Universally Unique Identifier (UUID)
cheqd DID method
valid IANA Media Type
IPFS
Golang library is used to derive and set media type
ADR on Resources on ledger
DID URL
DID method
DID URL
VDR
DID URL
DID document
const key = await agent.wallet.createKey({
  keyType: KeyType.Ed25519,
})

const ed25519PublicKeyBase58 = key.publicKeyBase58
import { DidDocument } from '@credo-ts/core'

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

Create DID-Linked Resource

Associate DID-Linked Resources to your DID using Credo.

Issue Verifiable Credentials

Issue Credentials using your cheqd DID using Credo.

yarn add @credo-ts/cheqd
# or
npm install @credo-ts/cheqd
{
  "overrides": {
    "@cosmjs/amino": "npm:@cosmjs-rn/amino@^0.27.1",
    "@cosmjs/encoding": "npm:@cosmjs-rn/encoding@^0.27.1",
    "@cosmjs/math": "npm:@cosmjs-rn/math@^0.27.1",
    "@cosmjs/stargate": "npm:@cosmjs-rn/stargate@^0.27.1",
    "@cosmjs/tendermint-rpc": "npm:@cosmjs-rn/tendermint-rpc@^0.27.1",
    "@cosmjs/utils": "npm:@cosmjs-rn/utils@^0.27.1",
    "@cosmjs/proto-signing": "npm:@cosmjs-rn/proto-signing@^0.27.1",
    "@cosmjs/crypto": "npm:@cosmjs-rn/crypto@^0.27.1"
  }
}
{
  "resolutions": {
    "@cosmjs/amino": "npm:@cosmjs-rn/amino@^0.27.1",
    "@cosmjs/encoding": "npm:@cosmjs-rn/encoding@^0.27.1",
    "@cosmjs/math": "npm:@cosmjs-rn/math@^0.27.1",
    "@cosmjs/stargate": "npm:@cosmjs-rn/stargate@^0.27.1",
    "@cosmjs/tendermint-rpc": "npm:@cosmjs-rn/tendermint-rpc@^0.27.1",
    "@cosmjs/utils": "npm:@cosmjs-rn/utils@^0.27.1",
    "@cosmjs/proto-signing": "npm:@cosmjs-rn/proto-signing@^0.27.1",
    "@cosmjs/crypto": "npm:@cosmjs-rn/crypto@^0.27.1"
  }
}
bashCopyEdityarn add buffer
tsCopyEditimport { Buffer } from 'buffer'
global.Buffer = Buffer
tsCopyEditimport './shim'
import { Agent, DidsModule, KeyType, DidDocument } from '@credo-ts/core'
import { agentDependencies } from '@credo-ts/node'
import { AskarModule } from '@credo-ts/askar'
import { askar } from '@openwallet-foundation/askar-nodejs'
import {
  ConnectionsModule,
  V2ProofProtocol,
  V2CredentialProtocol,
  ProofsModule,
  AutoAcceptProof,
  AutoAcceptCredential,
  CredentialsModule,
  HttpOutboundTransport,
  getDefaultDidcommModules,
} from '@credo-ts/didcomm'
import {
  CheqdAnonCredsRegistry,
  CheqdDidRegistrar,
  CheqdDidResolver,
  CheqdModule,
  CheqdModuleConfig,
} from '@credo-ts/cheqd'
import { AnonCredsModule } from '@credo-ts/anoncreds'
import { anoncreds } from '@hyperledger/anoncreds-nodejs'

const agent = new Agent({
  config,
  dependencies: agentDependencies,
  modules: {
    dids: new DidsModule({
      registrars: [new CheqdDidRegistrar()],
      resolvers: [new CheqdDidResolver()],
    }),

    // AnonCreds
    anoncreds: new AnonCredsModule({
      registries: [new CheqdAnonCredsRegistry()],
      anoncreds,
    }),

    // Add cheqd module
    cheqd: new CheqdModule(
      new CheqdModuleConfig({
        networks: [
          {
            network: '<mainnet or testnet>',
            cosmosPayerSeed: '<cosmos payer seed or mnemonic>',
          },
        ],
      })
    ),
    // Indy VDR can optionally be used with Askar as wallet and storage implementation
    askar: new AskarModule({
      askar,
    }),
    connections: new ConnectionsModule({
      autoAcceptConnections: true,
    }),
    credentials: new CredentialsModule({
      autoAcceptCredentials: AutoAcceptCredential.ContentApproved,
      credentialProtocols: [
        new V2CredentialProtocol({
          credentialFormats: [new LegacyIndyCredentialFormatService(), new AnonCredsCredentialFormatService()],
        }),
      ],
    }),
  },
})

Setup your Credo Agent

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

Create a Decentralized Identifier (DID)

Use the cheqd DID module to start creating cheqd DIDs.

Create DID-Linked Resources (DLRs)

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

Issue a Verifiable Credential

Issue and present Verifiable Credentials using a cheqd DID.

AnonCreds

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

SD-JWT

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

JSON-LD

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

Create a DID

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

Issue a Verifiable Credential

Issue a Verifiable Credential (AnonCreds) using Credo signed by a did:cheqd DID.

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.

Cover
Cover

Identity Write Pricing

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

Cover
Cover

Leap Wallet

Manage your CHEQ natively through the Leap Wallet with full support on desktop, browser and mobile.

Deactivate a DID

Deactivate a did:cheqd DID using the Credo Agent.

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

Prerequisites

Before deactivating a DID, ensure that:

  • The Credo agent is configured with cheqd support

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

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

Behavior of Deactivated DIDs

  • Deactivated DIDs remain resolvable

  • DID resolvers will indicate that the DID is deactivated

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

  • Deactivation is permanent

Parameters

Parameter
Required
Description

did

✅

The full did:cheqd identifier you wish to deactivate

options

❌

Optional settings, including a versionId to track the update

Example: Deactivate a cheqd DID

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

Notes

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

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

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

Image being pulled from the cheqd ledger using the resource module

Create DID-Linked Resource

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

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

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

Required Parameters

Field
Required
Description

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

Example

await agent.modules.cheqd.createResource(
  'did:cheqd:testnet:92874297-d824-40ea-8ae5-364a1ec9237d',
  {
    id: '6de33634-6439-4e46-aa3f-bfe03606b000',
    name: 'exampleTrustRegistry',
    resourceType: 'TrustRegistry',
    version: '1.0',
    data: {
      name: 'Example Org',
      jurisdiction: 'EU',
    },
  }
)

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

Recommendations

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

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

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

  • Use version to manage changes to the resource over time

Update a DID

Update a did:cheqd DID using the Credo Agent.

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

Prerequisites

Before you begin, make sure:

  • ✅ Your Credo agent is already configured with cheqd support

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

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

How DID Updates Work

To update a did:cheqd, you must:

  1. Fetch the current DID Document

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

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

Example: Add a New Service and Verification Method

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

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

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

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

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

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

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

Parameters Reference

Parameter
Required
Description

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)

RFC3986 URIs
RFC3986 URIs
​
​
cheqd
cheqd
​
cheqd and Animo AnonCreds demo

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.

Cover
Cover
Cover
Cover
Cover

✔️

✔️

✔️

✔️

cheqd Credential Payments

❌

✔️

❌

❌

❌

✔️

✔️

✔️

✔️

✔️

✔️

✔️

✔️

❌

✔️

❌

✔️

⌛(roadmap)

✔️

✔️

✔️

✔️

✔️

❌

✔️

❌

✔️

❌

✔️

✔️

✔️

❌

✔️

✔️

✔️

❌

✔️

❌

✔️

❌

✔️

❌

✔️

❌

✔️

❌

✔️

❌

✔️

⌛(roadmap)

❌

✔️

✔️

⌛(roadmap)

❌

✔️

✔️

⌛(roadmap)

❌

✔️

❌

✔️

✔️

✔️

✔️

❌

✔️

✔️

✔️

❌

✔️

❌

✔️

❌

✔️

❌

✔️

❌

✔️

❌

✔️

❌

✔️

❌

✔️

✔️

✔️

✔️

✔️

❌

✔️

❌

DID-Linked Trust Registries

❌

⌛(roadmap)

⌛(roadmap)

❌

Cover

Credo

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

Cover

ACA-Py

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

Cover

Veramo

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

Cover

Walt.id Community Stack

Decentralized Identifiers (DIDs)

Create Decentralized Identifiers (DIDs) on cheqd using Credo.

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

Get started

Alternatives

Below are a list of alternatives for creating cheqd DIDs.

Resolve DID-Linked Resource

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

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

Resolution Methods

1. Resolve by Resource ID (UUID)

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

await agent.modules.cheqd.resolveResource(
  'did:cheqd:testnet:92874297-d824-40ea-8ae5-364a1ec9237d/resources/6de33634-6439-4e46-aa3f-bfe03606b000'
)

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


2. Resolve by Resource Name and Type

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

await agent.modules.cheqd.resolveResource(
  'did:cheqd:testnet:92874297-d824-40ea-8ae5-364a1ec9237d?resourceName=exampleTrustRegistry&resourceType=TrustRegistry'
)

This method is useful when:

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

  • You don’t have or track the UUID

3. Fetch the Resource Version Closest to a Specific Time

await agent.modules.cheqd.resolveResource(
  'did:cheqd:testnet:<uuid>?resourceName=example&resourceType=exampleType&resourceVersionTime=2023-01-01T00:00:00Z'
)

4. Alternative parameters

DID-Linked Resources

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

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

Applications can retrieve these resources using either:

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

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

Common Use Cases

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

  • Trust Registry entries

  • Status Lists (e.g. credential revocation)

  • Logos and brand assets

  • Governance and policy documents

  • Credential Schemas and Definitions

Get started

Alternatives

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

Create AnonCreds Schema

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

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

⚠️ Before you begin...

Import a DID (optional)

Register a Schema

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

Parameters

schema (mandatory)

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

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

"name": Name of the Schema

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

options (optional)

Optional Key-Value pairs of additional options.

Create AnonCreds Credential Definition

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

Register a Credential Definition

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

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

Parameters

credential_definition (mandatory)

"issuerId": DID of the Issuer.

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

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

options (optional)

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

"revocation_registry_size": Maximum size of the Revocation Registry.

Verifiable Credentials and Presentations

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

Get started

Alternatives

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

Issue a Verifiable Credential (AnonCreds)

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

Step 1: Create a Connection with Holder

1a: Issuer Creates Connection Invite

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

1b: Holder receives invitation

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

Step 2: Prepare and Send Credential Offer

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

Step 3: Holder accepts credential offer

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

Summary

Present a Verifiable Credential (AnonCreds)

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

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

Prerequisites

Before presenting a credential:

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

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

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

  • Both agents are configured with:

    • @credo-ts/anoncreds

    • @credo-ts/didcomm

Step 1: Create a Connection with Holder

Step 2: Send Proof Request

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

Step 3: Holder sends Presentation Proof

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

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

What’s Happening Behind the Scenes?

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

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

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

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

Next Steps

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.

Step
Action

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 .

Universal Registrar
ADR
spec
spec
spec
spec
ADR
spec
spec
spec
RFC 0023
RFC 0160
RFC 0434
spec
spec
spec
spec
spec
spec
spec
RFC 0036
RFC 0453
spec
spec
DIDs are, please go over to our learning site here.

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.

ADR-005

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.

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

await agent.dids.import({
  did: cheqdDid,
  overwrite: true,
  privateKeys: [
    {
      privateKey: seed,
      keyType: KeyType.Ed25519,
    },
  ],
})
Issuer
const schemaResult = await agent.modules.anoncreds.registerSchema({
  schema: {
    attrNames: ['name', 'degree', 'date'],
    issuerId: '<did>',
    name: 'Example Schema to register',
    version: '1.0.0',
  },
  options: {},
})

if (schemaResult.schemaState.state === 'failed') {
  throw new Error(`Error creating schema: ${schemaResult.schemaState.reason}`)
}
Issuer
const credentialDefinitionResult = await agent.modules.anoncreds.registerCredentialDefinition({
  credentialDefinition: {
    tag: 'default',
    issuerId: '<did>',
    schemaId: schemaResult.schemaState.schemaId,
  },
  options: {
    supportRevocation: false,
  },
})

if (credentialDefinitionResult.credentialDefinitionState.state === 'failed') {
  throw new Error(
    `Error creating credential definition: ${credentialDefinitionResult.credentialDefinitionState.reason}`
  )
}
Issuer
const createNewInvitation = async (agent: Agent) => {
  const outOfBandRecord = await agent.modules.oob.createInvitation()

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

1

Create and accept a secure connection between Issuer and Holder

2

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

3

Holder accepts and stores the credential automatically or via UI

Verifier/Issuer
await this.agent.modules.proofs.requestProof({
  protocolVersion: 'v2',
  connectionId: connectionRecord.id,
  proofFormats: {
    anoncreds: {
      name: 'proof-request',
      version: '1.0',
      requested_attributes: {
        name: {
          name: 'name',
          restrictions: [
            {
              cred_def_id: this.credentialDefinition?.credentialDefinitionId,
            },
          ],
        },
      },
    },
  },
})
Holder
this.agent.events.on(ProofEventTypes.ProofStateChanged
  async ({ payload }: ProofStateChangedEvent) => {
    if (payload.proofRecord.state === ProofState.RequestReceived) {
      const requestedCredentials = await this.agent.modules.proofs.selectCredentialsForRequest({
        proofRecordId: payload.proofRecord.id,
      })
      await this.agent.modules.proofs.acceptRequest({
        proofRecordId: proofRecord.id,
        proofFormats: requestedCredentials.proofFormats,
      })
    }
})

Setup Credo Agent

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

Issue Credentials

Issue Verifiable Credentials signed by cheqd DIDs using Credo.

Present Credentials

Present Verifiable Credentials using Credo.

📚
European Architecture and Reference Framework (ARF)
the Credo agent with cheqd
here
Tails Server
Verifiable Credentials and Presentations are, please go over to our learning site here.
out-of-band protocol
Credo Docs
out-of-band protocol
Issue a Verifiable Credential

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.

Cover
Cover
Cover
Cover
Cover

Deactivate a DID

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

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

⚠️ Important...

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

Deactivate DID

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

Update a DID

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

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

⚠️ Important...

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

Update DID

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

Decentralized Identifiers (DIDs)

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

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

Get started

Alternatives

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

Create a DID

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

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

⚠️ Before you begin...

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

Create DID

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

Request Body

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

features (optional)

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

options (optional)

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

"network": testnet or mainnet

"key_type": "ed25519" or "bls12381g2"

List DIDs associated with your wallet

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

ACA-Py

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

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

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


DID and Credential Support

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

  • AnonCreds

  • W3C Verifiable Credentials (JSON-LD)

  • DIDComm v1 & v2

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


ACA-Py + cheqd: Modern Verifiable Credential Issuance

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

  • Create and resolve did:cheqd identifiers

  • Publish Credential Schemas and Credential Definitions to cheqd

  • Issue and verify AnonCreds credentials using cheqd 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.


Universal Registrar Integration

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

Benefits of Using Universal Registrar:

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

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

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

Get started

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

Setup ACA-Py Agent

Set up your ACA-Py agent to start using cheqd.

Pre-requisites

Before you begin, ensure you have a DID registrar and resolver running.

  • For mainnet, you must run your own cheqd DID registrar driver with the correct mnemonic configuration. Details are provided below.

Configuration

Cheqd DID Registrar Driver

Steps to deploy the Cheqd Registrar Driver

  1. Add the following under services section of your docker-compose file.

    driver-did-cheqd:
        image: ghcr.io/cheqd/did-registrar:production-latest
        platform: linux/amd64
        ports:
          - "9089:3000"
        restart: on-failure
        environment:
          - FEE_PAYER_TESTNET_MNEMONIC=${FEE_PAYER_TESTNET_MNEMONIC}
          - FEE_PAYER_MAINNET_MNEMONIC=${FEE_PAYER_MAINNET_MNEMONIC}
  2. Set the environment variables.

    export FEE_PAYER_TESTNET_MNEMONIC="your testnet mnemonic phrase ..."
    export FEE_PAYER_MAINNET_MNEMONIC="your mainnet mnemonic phrase ..."
  3. Run the driver.

    docker-compose up -d

The Cheqd Registrar must be run as driver-did-cheqd because the Universal Registrar is configured with that name by default.

Universal Registrar Setup

Steps to setup Universal Registrar for Cheqd

  1. Add the following under services section of your docker-compose file.

    did_registrar:
        image: universalregistrar/uni-registrar-web:latest
        platform: linux/amd64
        ports:
          - "9080:9080"
        depends_on:
          - driver-did-cheqd
  2. Start the Universal Registrar Service.

    docker-compose up -d
  3. Confirm that the Cheqd Driver properties are correct and matches your settings.

    curl -X GET http://localhost:9080/1.0/properties

Cheqd DID Resolver

To run your own DID Resolver, the following settings must be added to your docker-compose file

Steps to deploy the Cheqd Resolver

  1. Add the following under services section of your docker-compose file.

    did_resolver:
        image: ghcr.io/cheqd/did-resolver:latest
        platform: linux/amd64
        ports:
          - target: 8080
            published: 8080
            mode: host
        restart: on-failure
        environment:
          MAINNET_ENDPOINT: "grpc.cheqd.net:443,true,5s"
          TESTNET_ENDPOINT: "grpc.cheqd.network:443,true,5s"
          LOG_LEVEL: "warn"
          RESOLVER_LISTENER: "0.0.0.0:8080"
  2. Run the resolver.

    docker-compose up -d

Plugin Configuration

Cheqd ACA-Py Plugin supports configuring the Universal Registrar and DID Resolver URLs via a plugin-config.yml file. These settings define how the agent interacts with the Cheqd network for DID operations.

Example plugin-config.yml:

resolver_url: "http://localhost:8080/1.0/identifiers/"
registrar_url: "http://localhost:9080/1.0/"

Update the URLs if you have your hosted versions or using the Universal Resolver.

Wallet Compatibility

The Cheqd plugin only works with the askar-anoncreds wallet type. Askar-anoncreds is the preferred wallet due to its support for AnonCreds and enhanced security features.

Setting Up Askar Wallet in ACA-Py

When starting ACA-Py, ensure that the wallet-type is set to askar. Example:

aca-py start --wallet-type askar-anoncreds --wallet-storage-type postgres_storage

Recommended Wallet Storage: PostgreSQL

Using PostgreSQL as a wallet storage backend is recommended for scalability and data persistence.

Setting Up PostgreSQL for ACA-Py

  1. Install PostgreSQL and create a database for ACA-Py.

  2. Configure ACA-Py to use PostgreSQL, add the following to ./configs/settings.yml:

    wallet-name: issuer
    wallet-key: somesecret
    wallet-storage-type: postgres_storage
    wallet-storage-creds: '{"account":"postgres","password":"postgres","admin_account":"postgres","admin_password":"postgres"}'
    wallet-storage-config: '{"url":"localhost:5432","max_connections":5}'
  3. Start ACA-Py with PostgreSQL-backed wallet storage.

    aca-py start --arg-file ./configs/settings.yml

Build the Agent and deploy

  1. Example Dockerfile:

    FROM ghcr.io/openwallet-foundation/acapy:py3.12-1.1.0
    
    USER root
    
    # install plugins as binaries
    RUN pip install git+https://github.com/openwallet-foundation/acapy-plugins@main#subdirectory=cheqd
    
    USER $user
    COPY ./configs configs
    
    ENTRYPOINT ["aca-py"]
  2. Build the ACA-Py Agent docker image with the plugin.

    docker build -t issuer-agent .
  3. Deploy the agent. Sample docker-compose is below.

    issuer:
        image: issuer-agent:latest
        ports:
          - "3001:3001"
          - "3002:3002"
        command: >
          start --arg-file ./configs/settings.yml
        healthcheck:
          test: curl -s -o /dev/null -w '%{http_code}' "http://localhost:3001/status/live" | grep "200" > /dev/null
          start_period: 30s
          interval: 7s
          timeout: 5s
          retries: 5
        depends_on:
          - did_registrar
          - did_resolver
  4. Run the Agent.

    docker-compose up -d

Next steps

Now that your ACA-Py agent is successfully set up to work with cheqd, try following our tutorials for creating a new DID or issuing Verifiable Credentials.

Create AnonCreds Credential Definition

Create a Credential Definition as a DID-Linked Resource (DLR) on cheqd for issuing AnonCreds.

Create Credential Definition

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

Request Body

credential_definition (mandatory)

"issuerId": DID of the Issuer.

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

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

options (optional)

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

"revocation_registry_size": Maximum size of the Revocation Registry.

Check the new Credential Definition

Verifiable Credentials and Presentations

Issue and present Verifiable Credentials, signed by cheqd Decentralized Identifiers (DIDs), using ACA-Py.

Get started

Alternatives

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

Present a Verifiable Credential

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.

Step 1: Create a Connection with Holder

Step 2: Send Proof Request

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

Sample Request Body

The request body will depend on the credential, but here is a sample.

Step 3: Holder sends Presentation Proof

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

Step 4: Verifier verifies Presentation

Verifier receives the presentation via the connection, and can use the following API to verify. The response must have verified: true .

DID-Linked Resources

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

Get started

Alternatives

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

t

Create AnonCreds Schema

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

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

Create Schema

Request Body

options (optional)

Optional Key-Value pairs of additional options.

schema (mandatory)

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

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

"name": Name of the Schema

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

Check the new Schema

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.

Cover
Cover
Cover
Cover
Cover
Cover
Cover

cheqd Studio

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

Cover

ACA-Py

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

Cover

Veramo

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

Cover

Walt.id Community Stack

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

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.

Universal Registrar
European Architecture and Reference Framework (ARF)
Universal Registrar
DIDs are, please go over to our learning site here.

Create DID

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

Update DID

Update a did:cheqd DID using ACA-Py.

Deactivate DID

Deactivate a did:cheqd DID using ACA-Py.

configured the cheqd plugin's agent settings

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.

Universal Registrar
DID registrar
resolver
here
GitHub repository
Universal Registrar GitHub repository
here

Create a DID

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

Issue a Verifiable Credential

Issue a Verifiable Credential using ACA-Py signed by a cheqd DID.

{
  "connection_id": "<verifier-to-holder-conn-id>",
  "auto_verify": false,
  "auto_remove": false,
  "comment": "Presentation request from Issuer",
  "presentation_request": {
    "anoncreds": {
        "name": "proof",
        "version": "1.0",
        "requested_predicates": {
            "additionalProp1": {
                "name": "score",
                "p_value": 40,
                "p_type": ">",
                "restrictions": [{"cred_def_id": "<cred-def-id>"}]
            }
        },
        "requested_attributes": {},
        "non_revoked": {"to": <some-time-in-future>}
    }
  },
  "trace": false
}

Setup ACA-Py Agent

Before you get started, you need to setup your ACA-Py Agent.

Issue Credentials

Issue Verifiable Credentials signed by cheqd DIDs using ACA-Py .

Present Credentials

Present Verifiable Credentials using ACA-Py.

Understanding DLRs

More details about DID-Linked Resources on Cheqd.

Understanding AnonCreds

More details about AnonCreds Object Method.

Create Schema

Create an AnonCreds Schema.

Create Credential Definition

Create an AnonCreds Credential Definition

📚
European Architecture and Reference Framework (ARF)
Tails Server
Verifiable Credentials and Presentations are, please go over to our learning site here.
did:cheqd Decentralized Identifier
Universally Unique Identifier (UUID)
DID-Linked Resource

Revoke a Verifiable Credential

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:

Step 1: Issuer identifies Credential to be revoked

The Issuer must determine the credential that needs to be revoked by getting the list of issued credentials and the connection id.

Step 2: Revoke Credential

Initiate the credential revocation process by supplying the necessary credential identifiers like the connection id and the credential exchange id.

Sample Request Body

Step 3: Verify Revocation

Veramo

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

Overview

Get started

Utilise cheqd's identity functionality through the Veramo SDK Plugin by installing the Veramo CLI and getting started below:

Why did we choose Veramo?

We chose to build a cheqd plugin into Veramo SDK for a few key reasons.

  1. 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.

  2. 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).

  3. 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.

  4. 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:

  1. Identity functionality to be carried out through a native CLI interface; or

  2. 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.

did:cheqd-specific functionality

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.

Architecture

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.

Supported Credential types

Working with Veramo SDK for cheqd outside of Veramo CLI

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:

Setup Veramo CLI for cheqd

Step 1: Install requisite packages

1.1. Install Veramo CLI

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.

1.2. Install the did-provider-cheqd package

Install the did-provider-cheqd NPM package in a similar fashion:

You can check all of your NPM package versions by running the command:

Step 2: Modify the cheqd plugin Agent configuration file

2.1. Get the agent.yml configuration file

You can do this in terminal through:

2.2. Open the agent.yml file in an editor to customise the config

You 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.

2.3. Generate a new local database encryption key

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.

2.4. Set your DID Resolver endpoint

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.

Alternative/Optional: Use Universal Resolver instead

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:

2.5. Add cheqd-testnet to your Keplr wallet

In order to add cheqd-testnet to your Keplr extension, please follow the following instructions:

2.6. Configure your cheqd/Cosmos account keys and RPC endpoints

You need to configure this in under didManager section as shown above, where you'll need to edit:

  1. 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.

2.7. Save the agent.yml file and exit

Make sure all your edits above are persisted and saved to a file that you can access.

Step 3: Verify your configuration file is correct

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.

Next steps

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.

Cover
Cover
Cover
Cover
Cover
Cover
Cover

cheqd Cosmos CLI

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

Cover

cheqd Studio

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

Cover

Credo

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

Cover

DID Registrar

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

Cover

Veramo

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

Cover

cheqd Studio

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

Cover

Credo

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

Cover

Veramo

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

Cover

Walt.id Community Stack

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

out-of-band protocol

Fetch custodian-mode client details.

get

This endpoint returns the custodian-mode client details for authenticated users.

Authorizations
Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
get

Fetch an identity key pair.

get

This endpoint fetches an identity key pair's details for a given key ID. Only the user account associated with the custodian-mode client can fetch the key pair.

Authorizations
Path parameters
kidstringRequired

Key ID of the identity key pair to fetch.

Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
application/json
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
application/json
get

Fetch DIDs associated with an account.

get

This endpoint returns the list of DIDs controlled by the account.

Authorizations
Responses
200
The request was successful.
application/json
Responsestring[]
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
get

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 .

Universal Registrar
European Architecture and Reference Framework (ARF)
{
    "comment": "Revoke issued credential",
    "connection_id": "<issuer--to-holder-conn-id>",
    "cred_ex_id": "<issuer-cred-exchange-id>",
    "notify": true,
    "publish": true
}
npm i @veramo/cli@latest -g
veramo -v
x.x.x
npm install @cheqd/did-provider-cheqd@latest -g
npm list -g
wget -c https://raw.githubusercontent.com/cheqd/did-provider-cheqd/main/agent.yml
nano <path/to/>agent.yml
$ veramo config gen-key

X25519 raw private key (hex encoded):

4a5aeb56c7956dd6f3312e7094130a03afc060b95621fa3a86577aaf2b67cc1d

You can use this key with @veramo/kms-local#SecretBox
or replace the default agent.yml 'dbEncryptionKey' constant
did-cheqd-resolver:
    $require: '@cheqd/did-provider-cheqd?t=function&p=/cheqd#getResolver'
    $args:
        - url: 'https://resolver.cheqd.net/1.0/identifiers/'
# DID resolvers
didResolver:
    $require: '@veramo/did-resolver#DIDResolverPlugin'
    $args:
        - resolver:
              $require: did-resolver#Resolver
              $args:
                  - key:
                        $ref: /did-key-resolver
                    # cheqd:
                    #  $ref: /did-cheqd-resolver
                    cheqd:
                        $ref: /universal-resolver
# did-cheqd-resolver:
#   $require: '@cheqd/did-provider-cheqd?t=function&p=/cheqd#getResolver'
#   $args:
#     - url: 'https://resolver.cheqd.net/1.0/identifiers/'
universal-resolver:
    $require: '@veramo/did-resolver#UniversalResolver'
    $args:
        - url: https://dev.uniresolver.io/1.0/identifiers/
{
    "chainId": "cheqd-testnet-6",
    "chainName": "cheqd Testnet",
    "rpc": "https://rpc.cheqd.network",
    "rest": "https://api.cheqd.network",
    "stakeCurrency": {
        "coinDenom": "CHEQ",
        "coinMinimalDenom": "ncheq",
        "coinDecimals": 9,
        "coinGeckoId": "cheqd-network"
    },
    "walletUrlForStaking": "https://wallet.cheqd.io",
    "bip44": {
        "coinType": 118
    },
    "bech32Config": {
        "bech32PrefixAccAddr": "cheqd",
        "bech32PrefixAccPub": "cheqdpub",
        "bech32PrefixValAddr": "cheqdvaloper",
        "bech32PrefixValPub": "cheqdvaloperpub",
        "bech32PrefixConsAddr": "cheqdvalcons",
        "bech32PrefixConsPub": "cheqdvalconspub"
    },
    "currencies": [
        {
            "coinDenom": "CHEQ",
            "coinMinimalDenom": "ncheq",
            "coinDecimals": 9,
            "coinGeckoId": "cheqd-network"
        }
    ],
    "feeCurrencies": [
        {
            "coinDenom": "CHEQ",
            "coinMinimalDenom": "ncheq",
            "coinDecimals": 9,
            "coinGeckoId": "cheqd-network",
            "gasPriceStep": {
                "low": 25,
                "average": 50,
                "high": 100
            }
        }
    ],
    "coinType": 118,
    "beta": true
}
# DID Manager
didManager:
---
defaultProvider: did:cheqd:testnet
providers:
    did:cheqd:mainnet:
        $require: '@cheqd/did-provider-cheqd#CheqdDIDProvider'
        $args:
            - defaultKms: local
              cosmosPayerMnemonic: <your_cosmos_mnemonic_paying_for_did_txs>
              networkType: mainnet
              rpcUrl: 'https://rpc.cheqd.net'
    did:cheqd:testnet:
        $require: '@cheqd/did-provider-cheqd#CheqdDIDProvider'
        $args:
            - defaultKms: local
              cosmosPayerMnemonic: <your_cosmos_mnemonic_paying_for_did_txs>
              networkType: testnet
              rpcUrl: 'https://rpc.cheqd.network'
$ veramo config check -f <path/to/>agent.yml

Your Veramo configuration seems fine. An agent can be created and the 'agent.execute()' method can be called on it.
GET /account HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Accept: */*
{
  "customer": {
    "customerId": "text",
    "name": "text"
  },
  "paymentAccount": {
    "mainnet": "text",
    "testnet": "text"
  }
}
GET /key/read/{kid} HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Accept: */*
{
  "kid": "text",
  "type": "Ed25519",
  "publicKeyHex": "text"
}
GET /did/list HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Accept: */*
[
  "text"
]

Setup Veramo CLI

Set up the Veramo CLI and required packages to use the Veramo SDK Plugin for cheqd.

Create Decentralised Identifiers (DIDs)

Create fully W3C conformant Decentralised Identifiers (DIDs) on cheqd.

Issue Credentials and Presentations

Issue fully W3C conformant Verifiable Credentials and Presentations

Charge for Credentials

Gate encrypted Status Lists with CHEQ using Payment Conditions.

Create Status Lists

Create Verifiable Credential Status List v2021 on-ledger, using DID-Linked Resources

Create DID-Linked Resources

Create a variety of DID-Linked Resources, including schemas, status lists and trust registries on cheqd.

JSON (JWT)

JSON Web Token (JWT) Credentials are a simple way to transmit Trusted Data as a JSON object.

JSON-LD

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

Veramo SDK for cheqd architecture
European Architecture and Reference Framework (ARF)
Universal Registrar
Present a Verifiable Credential
Veramo SDK
@cheqd/did-provider-cheqd NPM package
Veramo SDK Agent methods
Veramo CLI NPM package
Veramo Core NPM package
did:ethr
configure and setup Veramo CLI for working with cheqd
Veramo CLI setup guide
editable Draw.io version
@cheqd/sdk NPM package
@veramo/core
@veramo/cli
@veramo/credential-w3c
Veramo's Key Management System (KMS)
other Veramo plug-ins in their official documentation
Veramo SDK Plugin
setup guide for working with cheqd network using Veramo CLI
Veramo Node.js tutorial
Veramo React tutorial
Veramo React Native tutorial
official Veramo CLI setup guide
here
as described in Veramo CLI docs
agent.yml
cloning
did-provider-cheqd
cheqd DID Resolver
a Universal Resolver instance
any DID method supported by Universal Resolver
Axelar to add a custom network
create/update a DID
Mnemonic associated with your cheqd/Cosmos SDK account
a different hosted RPC endpoint for cheqd
troubleshooting guide for Veramo CLI setup
creating a new DID
querying existing DIDs
Issue a Verifiable Credential

Issue a Verifiable Credential

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.

Step 1: Create a Connection with Holder

1a: Issuer Creates Connection Invite

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

Parameters and Request Body

For automated acceptance, pass the following parameters:

auto_accept

Set this to true

A simple request body is below:

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

1b: Holder receives invitation

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.

Parameters and Request Body

auto_accept

Set this to true

alias

Pass an alias for the connection

use_existing_connection

Set this to true

The request body should be the invitation value from the /create-invitation call by the Issuer.

Step 2: Prepare Credential Offer

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.

Step 3: Holder accepts credential offer

The Holder has to retrieve the credential exchange id, and call this API to accept the offer.

Step 4: Issue Credential

Once the credential request is received and validated, issue the credential using the /issue-credential-2.0/records/<exchange-id>/issue API endpoint.

Step 5: Holder stores Credential

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.

out-of-band protocol
postgres.env file

Create an identity key pair.

post

This endpoint creates an identity key pair associated with the user's account for custodian-mode clients.

Authorizations
Query parameters
typestring · enumOptional

Key type of the identity key pair to create.

Possible values:
Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
application/json
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
application/json
post
POST /key/create HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Accept: */*
{
  "kid": "text",
  "type": "Ed25519",
  "publicKeyHex": "text"
}

Fetch StatusList2021 DID-Linked Resource based on search criteria.

get
Authorizations
Query parameters
didstringRequired

The DID of the issuer of the status list.

statusPurposestring · enumOptional

The purpose of the status list. Can be either revocation or suspension.

Possible values:
statusListNamestringOptional

The name of the StatusList2021 DID-Linked Resource.

Responses
200
The request was successful.
application/json
Responseall of
and
one ofOptional
or
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
get
GET /credential-status/search?did=text HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Accept: */*
{
  "found": true,
  "resource": {
    "StatusList2021": {
      "encodedList": "H4sIAAAAAAAAA-3BAQ0AAADCoPdPbQ8HFAAAAAAAAAAAAAAAAAAAAADwaDhDr_xcRAAA",
      "type": "StatusList2021Revocation",
      "validFrom": "2023-06-26T11:45:19.349Z"
    },
    "metadata": {
      "type": "StatusList2021Revocation",
      "encoding": "base64url",
      "encrypted": false
    }
  },
  "resourceMetadata": {
    "resourceURI": "did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e/resources/5945233a-a4b5-422b-b893-eaed5cedd2dc",
    "resourceCollectionId": "7c2b990c-3d05-4ebf-91af-f4f4d0091d2e",
    "resourceId": "5945233a-a4b5-422b-b893-eaed5cedd2dc",
    "resourceName": "cheqd-employee-credentials",
    "resourceType": "StatusList2021Revocation",
    "mediaType": "application/json",
    "resourceVersion": "1.0.0",
    "created": "2023-06-26T11:45:20Z",
    "checksum": "909e22e371a41afbb96c330a97752cf7c8856088f1f937f87decbef06cbe9ca2",
    "previousVersionId": null,
    "nextVersionId": null
  }
}

Get a DID-Linked Resource.

get

This endpoint returns the DID-Linked Resource for a given DID identifier and resource identifier.

Authorizations
Path parameters
didstringRequired

DID identifier

Example: did:cheqd:mainnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0
Query parameters
resourceIdstring · uuidOptional

Fetch a DID-Linked Resource by Resource ID unique identifier. Since this is a unique identifier, other Resource query parameters are not required. See DID-Linked Resources for more details.

Example: 3ccde6ba-6ba5-56f2-9f4f-8825561a9860
resourceNamestringOptional

Filter a DID-Linked Resource query by Resource Name. See DID-Linked Resources for more details.

Example: cheqd-issuer-logo
resourceTypestringOptional

Filter a DID-Linked Resource query by Resource Type. See DID-Linked Resources for more details.

Example: CredentialArtwork
resourceVersionstringOptional

Filter a DID-Linked Resource query by Resource Version, which is an optional free-text field used by issuers (e.g., "v1", "Final Version", "1st January 1970" etc). See DID-Linked Resources for more details.

Example: v1
resourceVersionTimestring · date-timeOptional

Filter a DID-Linked Resource query which returns the closest version of the Resource at or before specified time. See DID-Linked Resources for more details.

Example: 1970-01-01T00:00:00Z
checksumstringOptional

Request integrity check against a given DID-Linked Resource by providing a SHA-256 checksum hash. See DID-Linked Resources for more details.

Example: dc64474d062ed750a66bad58cb609928de55ed0d81defd231a4a4bf97358e9ed
resourceMetadatabooleanOptional

Return only metadata of DID-Linked Resource instead of actual DID-Linked Resource. Mutually exclusive with some of the other parameters.

Responses
200
The request was successful.
any
Responseobject
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
get
GET /resource/search/{did} HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Accept: */*
{}

Issue a Verifiable Credential

post

This endpoint issues a Verifiable Credential. As input it takes the list of issuerDid, subjectDid, attributes, and other parameters of the credential to be issued.

Authorizations
Body

Input fields for the creating a Verifiable Credential.

issuerDidstringRequired

DID of the Verifiable Credential issuer. This needs to be a did:cheqd DID.

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

DID of the Verifiable Credential holder/subject. This needs to be a did:key DID.

Example: did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK
attributesobjectRequired

JSON object containing the attributes to be included in the credential.

Example: {"name":"Bob","gender":"male"}
@contextstring[]Optional

Optional properties to be included in the @context property of the credential.

Example: ["https://schema.org/schema.jsonld","https://veramo.io/contexts/profile/v1"]
typestring[]Optional

Optional properties to be included in the type property of the credential.

Example: ["Person"]
expirationDatestring · date-timeOptional

Optional expiration date according to the <a href=https://www.w3.org/TR/vc-data-model/#expiration> VC Data Model specification.

Example: 2023-06-08T13:49:28.000Z
formatstring · enumOptional

Format of the Verifiable Credential. Defaults to VC-JWT.

Example: jwtPossible values:
termsOfUseobject[]Optional

Terms of use can be utilized by an issuer or a holder to communicate the terms under which a verifiable credential was issued.

Example: {"type":"IssuerPolicy","id":"http://example.com/policies/credential/4","profile":"http://example.com/profiles/credential","prohibition":[{"assigner":"https://example.edu/issuers/14","assignee":"AllVerifiers","target":"http://example.edu/credentials/3732","action":["Archival"]}]}
refreshServiceobject[]Optional

RefreshService property MUST be one or more refresh services that provides enough information to the recipient's software such that the recipient can refresh the verifiable credential.

Example: {"type":"ManualRefreshService2018","id":"https://example.edu/refresh/3732"}
evidenceobject[]Optional

Evidence property MUST be one or more evidence schemes providing enough information for a verifier to determine whether the evidence gathered by the issuer meets its confidence requirements for relying on the credential.

Example: {"type":["DocumentVerification"],"id":"https://example.edu/evidence/f2aeec97-fc0d-42bf-8ca7-0548192d4231","verifier":"https://example.edu/issuers/14","evidenceDocument":"DriversLicense","subjectPresence":"Physical","documentPresence":"Physical","licenseNumber":"123AB4567"}
Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential/issue HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 364

"issuerDid='did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0'&subjectDid='did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK'&attributes={'gender':'male','name':'Bob'}&@context=['https://schema.org']&type=['Person']&format='jwt'&credentialStatus={'statusPurpose':'revocation','statusListName':'employee-credentials','statusListIndex':10}"
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://schema.org",
    "https://veramo.io/contexts/profile/v1"
  ],
  "credentialSubject": {
    "gender": "male",
    "id": "did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK",
    "name": "Bob"
  },
  "credentialStatus": {
    "id": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e?resourceName=cheqd-suspension-1&resourceType=StatusList2021Suspension#20",
    "statusIndex": 20,
    "statusPurpose": "suspension",
    "type": "StatusList2021Entry"
  },
  "issuanceDate": "2023-06-08T13:49:28.000Z",
  "issuer": {
    "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0"
  },
  "proof": {
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJkaWQ6Y2hlcWQ6dGVzdG5ldDo3YmY4MWEyMC02MzNjLTRjYzctYmM0YS01YTQ1ODAxMDA1ZTAiLCJuYmYiOjE2ODYyMzIxNjgsInN1YiI6ImRpZDprZXk6ejZNa2hhWGdCWkR2b3REa0w1MjU3ZmFpenRpR2lDMlF0S0xHcGJubkVHdGEyZG9LIiwidmMiOnsiQGNvbnRleHQiOlsiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvdjEiLCJodHRwczovL3NjaGVtYS5vcmciLCJodHRwczovL3ZlcmFtby5pby9jb250ZXh0cy9wcm9maWxlL3YxIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImdlbmRlciI6Im1hbGUiLCJuYW1lIjoiQm9iIn0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJQZXJzb24iXX19.wMfdR6RtyAZA4eoWya5Aw97wwER2Cm5Guk780Xw8H9fA3sfudIJeLRLboqixpTchqSbYeA7KbuCTAnLgXTD_Cg",
    "type": "JwtProof2020"
  },
  "type": [
    "VerifiableCredential",
    "Person"
  ]
}

Deactivate a DID Document.

post

This endpoint deactivates a DID Document by taking the DID identifier as input. Must be called and signed by the DID owner.

Authorizations
Path parameters
didstringRequired

DID identifier to deactivate.

Body
publicKeyHexsstring[]Optional

List of key references (publicKeys) which will be used for signing the message. The should be in hexadecimal format and placed in the wallet of current user.

Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /did/deactivate/{did} HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 26

"publicKeyHexs=['text']"
{
  "@context": "https://w3id.org/did-resolution/v1",
  "didDidResolutionMetadata": {
    "contentType": "application/did+ld+json",
    "retrieved": "2021-09-01T12:00:00Z",
    "did": {
      "didString": "did:cheqd:testnet:55dbc8bf-fba3-4117-855c-1e0dc1d3bb47",
      "method": "cheqd",
      "methodSpecificId": "55dbc8bf-fba3-4117-855c-1e0dc1d3bb47"
    }
  },
  "didDocument": {
    "@context": [
      "https://www.w3.org/ns/did/v1"
    ],
    "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0",
    "controller": [
      "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0"
    ],
    "verificationMethod": [
      {
        "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#key-1",
        "type": "Ed25519VerificationKey2018",
        "controller": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0",
        "publicKeyBase58": "z6MkkVbyHJLLjdjU5B62DaJ4mkdMdUkttf9UqySSkA9bVTeZ"
      }
    ],
    "authentication": [
      "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#key-1"
    ],
    "service": [
      {
        "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#service-1",
        "type": "LinkedDomains",
        "serviceEndpoint": [
          "https://example.com"
        ]
      }
    ]
  },
  "didDocumentMetadata": {
    "created": "2021-09-01T12:00:00Z",
    "deactivated": true,
    "updated": "2021-09-10T12:00:00Z",
    "versionId": "3ccde6ba-6ba5-56f2-9f4f-8825561a9860",
    "linkedResourceMetadata": [
      {
        "resourceURI": "did:cheqd:testnet:55dbc8bf-fba3-4117-855c-1e0dc1d3bb47/resources/398cee0a-efac-4643-9f4c-74c48c72a14b",
        "resourceCollectionId": "55dbc8bf-fba3-4117-855c-1e0dc1d3bb47",
        "resourceId": "398cee0a-efac-4643-9f4c-74c48c72a14b",
        "resourceName": "cheqd-issuer-logo",
        "resourceType": "CredentialArtwork",
        "mediaType": "image/png",
        "resourceVersion": "1.0",
        "checksum": "a95380f460e63ad939541a57aecbfd795fcd37c6d78ee86c885340e33a91b559",
        "created": "2021-09-01T12:00:00Z",
        "nextVersionId": "d4829ac7-4566-478c-a408-b44767eddadc",
        "previousVersionId": "ad7a8442-3531-46eb-a024-53953ec6e4ff"
      }
    ]
  }
}

Verify a Verifiable Credential.

post

This endpoint verifies a Verifiable Credential passed to it. As input, it can take the VC-JWT as a string or the entire credential itself.

Authorizations
Query parameters
verifyStatusbooleanOptional

If set to true the verification will also check the status of the credential. Requires the VC to have a credentialStatus property.

Default: false
fetchRemoteContextsbooleanOptional

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

Default: false
allowDeactivatedDidbooleanOptional

If set to true allow to verify credential which based on deactivated DID.

Default: false
Body
credentialobjectOptional

Verifiable Credential to be verified as a VC-JWT string or a JSON object.

Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential/verify HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 88

"credential={}&policies={'issuanceDate':true,'expirationDate':true,'audience':true}"
{
  "verified": true,
  "polices": {},
  "issuer": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0",
  "signer": {
    "controller": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0",
    "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#key-1",
    "publicKeyBase58": "BTJiso1S4iSiReP6wGksSneGfiKHxz9SYcm2KknpqBJt",
    "type": "Ed25519VerificationKey2018"
  }
}

Create a DID Document.

post

This endpoint creates a DID and associated DID Document. As input, it can take the DID Document parameters via a form, or the fully-assembled DID Document itself.

Authorizations
Body
networkstring · enumOptional

Network to create the DID on (testnet or mainnet)

Possible values:
identifierFormatTypestring · enumOptional

Algorithm to use for generating the method-specific ID. The two styles supported are UUIDs and Indy-style Base58. See cheqd DID method documentation for more details.

Possible values:
verificationMethodTypestring · enumOptional

Type of verification method to use for the DID. See DID Core specification for more details. Only the types listed below are supported.

Possible values:
keystringOptional

The unique identifier in hexadecimal public key format used in the verification method to create the DID.

@contextstring[]OptionalExample: ["https://www.w3.org/ns/did/v1"]
Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
application/json
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
application/json
post
POST /did/create HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 266

"network='testnet'&identifierFormatType='uuid'&verificationMethodType='Ed25519VerificationKey2018'&service=[{'idFragment':'service-1','type':'LinkedDomains','serviceEndpoint':['https://example.com']}]&key='text'&@context=['https://www.w3.org/ns/did/v1']"
{
  "did": "text",
  "controllerKeyId": "text",
  "keys": [
    {}
  ],
  "services": [
    {
      "id": "did:cheqd:mainnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#service-1",
      "type": "LinkedDomains",
      "serviceEndpoint": [
        "https://example.com"
      ]
    }
  ]
}

Update a DID Document.

post

This endpoint updates a DID Document. As an input, it can take JUST the sections/parameters that need to be updated in the DID Document (in this scenario, it fetches the current DID Document and applies the updated section). Alternatively, it take the fully-assembled DID Document with updated sections as well as unchanged sections.

Authorizations
Body
didstringOptional

DID identifier to be updated.

Example: did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0
authenticationstring[]Optional

Authentication section of the DID Document.

publicKeyHexsstring[]Optional

List of key references (publicKeys) which will be used for signing the message. The should be in hexadecimal format and placed in the wallet of current user.

Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /did/update HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 1226

"did='did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0'&service=[{'id':'did:cheqd:mainnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#service-1','type':'LinkedDomains','serviceEndpoint':['https://example.com']}]&verificationMethod=[{'controller':'did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0','id':'did:cheqd:testnet :7bf81a20-633c-4cc7-bc4a-5a45801005e0#key-1','publicKeyBase58':'BTJiso1S4iSiReP6wGksSneGfiKHxz9SYcm2KknpqBJt','type':'Ed25519VerificationKey2018'}]&authentication=['text']&publicKeyHexs=['text']&didDocument={'@context':['https://www.w3.org/ns/did/v1'],'id':'did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0','controller':['did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0'],'verificationMethod':[{'id':'did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#key-1','type':'Ed25519VerificationKey2018','controller':'did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0','publicKeyBase58':'z6MkkVbyHJLLjdjU5B62DaJ4mkdMdUkttf9UqySSkA9bVTeZ'}],'authentication':['did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#key-1'],'service':[{'id':'did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#service-1','type':'LinkedDomains','serviceEndpoint':['https://example.com']}]}"
{
  "did": "text",
  "controllerKeyId": "text",
  "keys": [
    {}
  ],
  "services": [
    {
      "id": "did:cheqd:mainnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#service-1",
      "type": "LinkedDomains",
      "serviceEndpoint": [
        "https://example.com"
      ]
    }
  ],
  "controllerKeyRefs": [
    "text"
  ],
  "controllerKeys": [
    "text"
  ]
}

Revoke a Verifiable Credential.

post

This endpoint revokes a given Verifiable Credential. As input, it can take the VC-JWT as a string or the entire credential itself. The StatusList2021 resource should already be setup in the VC and credentialStatus property present in the VC.

Authorizations
Query parameters
publishbooleanRequired

Set whether the StatusList2021 resource should be published to the ledger or not. If set to false, the StatusList2021 publisher should manually publish the resource.

Default: true
Body
credentialone ofOptional

Verifiable Credential to be revoked as a VC-JWT string or a JSON object.

objectOptional
or
stringOptional
symmetricKeystringOptional

The symmetric key used to encrypt the StatusList2021 DID-Linked Resource. Required if the StatusList2021 DID-Linked Resource is encrypted.

Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential/revoke?publish=true HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 39

"credential={}&symmetricKey='text'"
{
  "revoked": true
}

Suspend a Verifiable Credential.

post

This endpoint suspends a given Verifiable Credential. As input, it can take the VC-JWT as a string or the entire credential itself.

Authorizations
Query parameters
publishbooleanOptional

Set whether the StatusList2021 resource should be published to the ledger or not. If set to false, the StatusList2021 publisher should manually publish the resource.

Body
credentialone ofOptional

Verifiable Credential to be revoked as a VC-JWT string or a JSON object.

objectOptional
or
stringOptional
symmetricKeystringOptional

The symmetric key used to encrypt the StatusList2021 DID-Linked Resource. Required if the StatusList2021 DID-Linked Resource is encrypted.

Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential/suspend HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 39

"credential={}&symmetricKey='text'"
{
  "suspended": true
}

Reinstate a suspended Verifiable Credential.

post

Set whether the StatusList2021 resource should be published to the ledger or not. If set to false, the StatusList2021 publisher should manually publish the resource.

Authorizations
Query parameters
publishbooleanOptional

Set whether the StatusList2021 resource should be published to the ledger or not. If set to false, the StatusList2021 publisher should manually publish the resource.

Body
credentialone ofOptional

Verifiable Credential to be revoked as a VC-JWT string or a JSON object.

objectOptional
or
stringOptional
symmetricKeystringOptional

The symmetric key used to encrypt the StatusList2021 DID-Linked Resource. Required if the StatusList2021 DID-Linked Resource is encrypted.

Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential/reinstate HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 39

"credential={}&symmetricKey='text'"
{
  "unsuspended": true
}

Issue a Verifiable Credential

post

This endpoint issues a Verifiable Credential. As input it takes the list of issuerDid, subjectDid, attributes, and other parameters of the credential to be issued.

Authorizations
Body

Input fields for the creating a Verifiable Credential.

issuerDidstringRequired

DID of the Verifiable Credential issuer. This needs to be a did:cheqd DID.

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

DID of the Verifiable Credential holder/subject. This needs to be a did:key DID.

Example: did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK
attributesobjectRequired

JSON object containing the attributes to be included in the credential.

Example: {"name":"Bob","gender":"male"}
@contextstring[]Optional

Optional properties to be included in the @context property of the credential.

Example: ["https://schema.org/schema.jsonld","https://veramo.io/contexts/profile/v1"]
typestring[]Optional

Optional properties to be included in the type property of the credential.

Example: ["Person"]
expirationDatestring · date-timeOptional

Optional expiration date according to the <a href=https://www.w3.org/TR/vc-data-model/#expiration> VC Data Model specification.

Example: 2023-06-08T13:49:28.000Z
formatstring · enumOptional

Format of the Verifiable Credential. Defaults to VC-JWT.

Example: jwtPossible values:
termsOfUseobject[]Optional

Terms of use can be utilized by an issuer or a holder to communicate the terms under which a verifiable credential was issued.

Example: {"type":"IssuerPolicy","id":"http://example.com/policies/credential/4","profile":"http://example.com/profiles/credential","prohibition":[{"assigner":"https://example.edu/issuers/14","assignee":"AllVerifiers","target":"http://example.edu/credentials/3732","action":["Archival"]}]}
refreshServiceobject[]Optional

RefreshService property MUST be one or more refresh services that provides enough information to the recipient's software such that the recipient can refresh the verifiable credential.

Example: {"type":"ManualRefreshService2018","id":"https://example.edu/refresh/3732"}
evidenceobject[]Optional

Evidence property MUST be one or more evidence schemes providing enough information for a verifier to determine whether the evidence gathered by the issuer meets its confidence requirements for relying on the credential.

Example: {"type":["DocumentVerification"],"id":"https://example.edu/evidence/f2aeec97-fc0d-42bf-8ca7-0548192d4231","verifier":"https://example.edu/issuers/14","evidenceDocument":"DriversLicense","subjectPresence":"Physical","documentPresence":"Physical","licenseNumber":"123AB4567"}
Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential/issue HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 364

"issuerDid='did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0'&subjectDid='did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK'&attributes={'gender':'male','name':'Bob'}&@context=['https://schema.org']&type=['Person']&format='jwt'&credentialStatus={'statusPurpose':'revocation','statusListName':'employee-credentials','statusListIndex':10}"
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://schema.org",
    "https://veramo.io/contexts/profile/v1"
  ],
  "credentialSubject": {
    "gender": "male",
    "id": "did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK",
    "name": "Bob"
  },
  "credentialStatus": {
    "id": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e?resourceName=cheqd-suspension-1&resourceType=StatusList2021Suspension#20",
    "statusIndex": 20,
    "statusPurpose": "suspension",
    "type": "StatusList2021Entry"
  },
  "issuanceDate": "2023-06-08T13:49:28.000Z",
  "issuer": {
    "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0"
  },
  "proof": {
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJkaWQ6Y2hlcWQ6dGVzdG5ldDo3YmY4MWEyMC02MzNjLTRjYzctYmM0YS01YTQ1ODAxMDA1ZTAiLCJuYmYiOjE2ODYyMzIxNjgsInN1YiI6ImRpZDprZXk6ejZNa2hhWGdCWkR2b3REa0w1MjU3ZmFpenRpR2lDMlF0S0xHcGJubkVHdGEyZG9LIiwidmMiOnsiQGNvbnRleHQiOlsiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvdjEiLCJodHRwczovL3NjaGVtYS5vcmciLCJodHRwczovL3ZlcmFtby5pby9jb250ZXh0cy9wcm9maWxlL3YxIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImdlbmRlciI6Im1hbGUiLCJuYW1lIjoiQm9iIn0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJQZXJzb24iXX19.wMfdR6RtyAZA4eoWya5Aw97wwER2Cm5Guk780Xw8H9fA3sfudIJeLRLboqixpTchqSbYeA7KbuCTAnLgXTD_Cg",
    "type": "JwtProof2020"
  },
  "type": [
    "VerifiableCredential",
    "Person"
  ]
}

Issue a Verifiable Credential

post

This endpoint issues a Verifiable Credential. As input it takes the list of issuerDid, subjectDid, attributes, and other parameters of the credential to be issued.

Authorizations
Body

Input fields for the creating a Verifiable Credential.

issuerDidstringRequired

DID of the Verifiable Credential issuer. This needs to be a did:cheqd DID.

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

DID of the Verifiable Credential holder/subject. This needs to be a did:key DID.

Example: did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK
attributesobjectRequired

JSON object containing the attributes to be included in the credential.

Example: {"name":"Bob","gender":"male"}
@contextstring[]Optional

Optional properties to be included in the @context property of the credential.

Example: ["https://schema.org/schema.jsonld","https://veramo.io/contexts/profile/v1"]
typestring[]Optional

Optional properties to be included in the type property of the credential.

Example: ["Person"]
expirationDatestring · date-timeOptional

Optional expiration date according to the <a href=https://www.w3.org/TR/vc-data-model/#expiration> VC Data Model specification.

Example: 2023-06-08T13:49:28.000Z
formatstring · enumOptional

Format of the Verifiable Credential. Defaults to VC-JWT.

Example: jwtPossible values:
termsOfUseobject[]Optional

Terms of use can be utilized by an issuer or a holder to communicate the terms under which a verifiable credential was issued.

Example: {"type":"IssuerPolicy","id":"http://example.com/policies/credential/4","profile":"http://example.com/profiles/credential","prohibition":[{"assigner":"https://example.edu/issuers/14","assignee":"AllVerifiers","target":"http://example.edu/credentials/3732","action":["Archival"]}]}
refreshServiceobject[]Optional

RefreshService property MUST be one or more refresh services that provides enough information to the recipient's software such that the recipient can refresh the verifiable credential.

Example: {"type":"ManualRefreshService2018","id":"https://example.edu/refresh/3732"}
evidenceobject[]Optional

Evidence property MUST be one or more evidence schemes providing enough information for a verifier to determine whether the evidence gathered by the issuer meets its confidence requirements for relying on the credential.

Example: {"type":["DocumentVerification"],"id":"https://example.edu/evidence/f2aeec97-fc0d-42bf-8ca7-0548192d4231","verifier":"https://example.edu/issuers/14","evidenceDocument":"DriversLicense","subjectPresence":"Physical","documentPresence":"Physical","licenseNumber":"123AB4567"}
Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential/issue HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 364

"issuerDid='did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0'&subjectDid='did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK'&attributes={'gender':'male','name':'Bob'}&@context=['https://schema.org']&type=['Person']&format='jwt'&credentialStatus={'statusPurpose':'revocation','statusListName':'employee-credentials','statusListIndex':10}"
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://schema.org",
    "https://veramo.io/contexts/profile/v1"
  ],
  "credentialSubject": {
    "gender": "male",
    "id": "did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK",
    "name": "Bob"
  },
  "credentialStatus": {
    "id": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e?resourceName=cheqd-suspension-1&resourceType=StatusList2021Suspension#20",
    "statusIndex": 20,
    "statusPurpose": "suspension",
    "type": "StatusList2021Entry"
  },
  "issuanceDate": "2023-06-08T13:49:28.000Z",
  "issuer": {
    "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0"
  },
  "proof": {
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJkaWQ6Y2hlcWQ6dGVzdG5ldDo3YmY4MWEyMC02MzNjLTRjYzctYmM0YS01YTQ1ODAxMDA1ZTAiLCJuYmYiOjE2ODYyMzIxNjgsInN1YiI6ImRpZDprZXk6ejZNa2hhWGdCWkR2b3REa0w1MjU3ZmFpenRpR2lDMlF0S0xHcGJubkVHdGEyZG9LIiwidmMiOnsiQGNvbnRleHQiOlsiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvdjEiLCJodHRwczovL3NjaGVtYS5vcmciLCJodHRwczovL3ZlcmFtby5pby9jb250ZXh0cy9wcm9maWxlL3YxIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImdlbmRlciI6Im1hbGUiLCJuYW1lIjoiQm9iIn0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJQZXJzb24iXX19.wMfdR6RtyAZA4eoWya5Aw97wwER2Cm5Guk780Xw8H9fA3sfudIJeLRLboqixpTchqSbYeA7KbuCTAnLgXTD_Cg",
    "type": "JwtProof2020"
  },
  "type": [
    "VerifiableCredential",
    "Person"
  ]
}

Verify a Verifiable Presentation generated from credential(s).

post

This endpoint verifies the Verifiable Presentation generated from credential(s). As input, it can take the Verifiable Presentation JWT as a string or the entire Verifiable Presentation itself.

Authorizations
Query parameters
verifyStatusbooleanOptional

If set to true the verification will also check the status of the presentation. Requires the VP to have a credentialStatus property.

Default: false
fetchRemoteContextsbooleanOptional

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

Default: false
allowDeactivatedDidbooleanOptional

If set to true allow to verify credential which based on deactivated DID.

Default: false
Body
presentationobjectRequired

Verifiable Presentation to be verified as a VP-JWT string or a JSON object.

verifierDidstringOptional

Provide an optional verifier DID (also known as 'domain' parameter), if the verifier DID in the presentation is not managed in the wallet.

makeFeePaymentbooleanOptional

Automatically make fee payment (if required) based on payment conditions to unlock encrypted StatusList2021 DID-Linked Resource.

Default: false
Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /presentation/verify HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 133

"presentation={}&verifierDid='text'&makeFeePayment=true&policies={'issuanceDate':true,'expirationDate':true,'audience':true}"
{
  "verified": true,
  "issuer": "text",
  "signer": {},
  "jwt": "text",
  "verifiableCredential": {}
}

Publish a verifiable accreditation for a DID.

post

Generate and publish a Verifiable Accreditation for a subject DID as a DID Linked resource.

Authorizations
Query parameters
accreditationTypestring · enumRequired

Select the type of accreditation to be issued.

Possible values:
Body

Input fields for the creating a Verifiable Accreditation.

issuerDidstringRequired

DID of the Verifiable Accreditation issuer. This needs to be a did:cheqd DID.

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

DID of the Verifiable Accreditation holder/subject. This needs to be a did:cheqd DID.

Example: did:cheqd:testnet:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK
accreditationNamestringRequired

Unique name of the Verifiable Accreditation.

attributesobjectOptional

JSON object containing the attributes to be included in the Accreditation.

@contextstring[]Optional

Optional properties to be included in the @context property of the Accreditation.

Example: ["https://schema.org/schema.jsonld","https://veramo.io/contexts/profile/v1"]
parentAccreditationstringOptional

DID URL of the parent Verifiable Accreditation, required for accredit/attest operation.

rootAuthorisationstringOptional

DID URL of the root Verifiable Accreditation, required for accredit/attest operation.

trustFrameworkstringOptional

Name or Type of the Trust Framework, required for authorise operation.

trustFrameworkIdstringOptional

Url of the Trust Framework, required for authorise operation.

typestring[]Optional

Optional properties to be included in the type property of the Accreditation.

Example: ["Person"]
expirationDatestring · date-timeOptional

Optional expiration date according to the <a href=https://www.w3.org/TR/vc-data-model/#expiration> VC Data Model specification.

Example: 2023-06-08T13:49:28.000Z
formatstring · enumOptional

Format of the Verifiable Accreditation. Defaults to VC-JWT.

Example: jwtPossible values:
termsOfUseobject[]Optional

Terms of use can be utilized by an issuer or a holder to communicate the terms under which a verifiable credential was issued.

Example: {"type":"IssuerPolicy","id":"http://example.com/policies/credential/4","profile":"http://example.com/profiles/credential","prohibition":[{"assigner":"https://example.edu/issuers/14","assignee":"AllVerifiers","target":"http://example.edu/credentials/3732","action":["Archival"]}]}
refreshServiceobject[]Optional

RefreshService property MUST be one or more refresh services that provides enough information to the recipient's software such that the recipient can refresh the verifiable credential.

Example: {"type":"ManualRefreshService2018","id":"https://example.edu/refresh/3732"}
evidenceobject[]Optional

Evidence property MUST be one or more evidence schemes providing enough information for a verifier to determine whether the evidence gathered by the issuer meets its confidence requirements for relying on the credential.

Example: {"type":["DocumentVerification"],"id":"https://example.edu/evidence/f2aeec97-fc0d-42bf-8ca7-0548192d4231","verifier":"https://example.edu/issuers/14","evidenceDocument":"DriversLicense","subjectPresence":"Physical","documentPresence":"Physical","licenseNumber":"123AB4567"}
Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /trust-registry/accreditation/issue?accreditationType=authorise HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 955

"issuerDid='did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0'&subjectDid='did:cheqd:testnet:2582fe17-9b25-45e4-8104-1cfca430f0c3'&schemas=[{'type':'MuseumPassCredential','url':'https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d?resourceName=MuseumPassCredentialSchema&resourceType=JsonSchemaValidator2018'}]&format='jwt'&accreditationName='authoriseAccreditation'&trustFramework='https://learn.cheqd.io/governance/start'&trustFrameworkId='cheqd Governance Framework'&parentAccreditation='did:cheqd:testnet:15b74787-6e48-4fd5-8020-eab24e990578?resourceName=accreditAccreditation&resourceType=VerifiableAccreditationToAccredit'&rootAuthorisation='did:cheqd:testnet:5RpEg66jhhbmASWPXJRWrA?resourceName=authoriseAccreditation&resourceType=VerifiableAuthorisationForTrustChain'&credentialStatus={'statusPurpose':'revocation','statusListName':'employee-credentials','statusListIndex':10}"
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://schema.org",
    "https://veramo.io/contexts/profile/v1"
  ],
  "credentialSubject": {
    "gender": "male",
    "id": "did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK",
    "name": "Bob"
  },
  "credentialStatus": {
    "id": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e?resourceName=cheqd-suspension-1&resourceType=StatusList2021Suspension#20",
    "statusIndex": 20,
    "statusPurpose": "suspension",
    "type": "StatusList2021Entry"
  },
  "issuanceDate": "2023-06-08T13:49:28.000Z",
  "issuer": {
    "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0"
  },
  "proof": {
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJkaWQ6Y2hlcWQ6dGVzdG5ldDo3YmY4MWEyMC02MzNjLTRjYzctYmM0YS01YTQ1ODAxMDA1ZTAiLCJuYmYiOjE2ODYyMzIxNjgsInN1YiI6ImRpZDprZXk6ejZNa2hhWGdCWkR2b3REa0w1MjU3ZmFpenRpR2lDMlF0S0xHcGJubkVHdGEyZG9LIiwidmMiOnsiQGNvbnRleHQiOlsiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvdjEiLCJodHRwczovL3NjaGVtYS5vcmciLCJodHRwczovL3ZlcmFtby5pby9jb250ZXh0cy9wcm9maWxlL3YxIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImdlbmRlciI6Im1hbGUiLCJuYW1lIjoiQm9iIn0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJQZXJzb24iXX19.wMfdR6RtyAZA4eoWya5Aw97wwER2Cm5Guk780Xw8H9fA3sfudIJeLRLboqixpTchqSbYeA7KbuCTAnLgXTD_Cg",
    "type": "JwtProof2020"
  },
  "type": [
    "VerifiableCredential",
    "Person"
  ]
}

Update an existing encrypted StatusList2021 credential status list.

post
Authorizations
Query parameters
statusActionstring · enumRequired

The update action to be performed on the encrypted status list, can be revoke, suspend or reinstate

Possible values:
Body
all ofOptional
Responses
200
The request was successful.
application/json
Responseall of
and
one ofOptional
or
or
and
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential-status/update/encrypted?statusAction=revoke HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 225

"did='https://example.com'&statusListName='text'&indices=[1]&statusListVersion='text'&symmetricKey='text'&feePaymentAddress='cheqd1qs0nhyk868c246defezhz5eymlt0dmajna2csg'&feePaymentAmount=1&feePaymentWindow=1"
{
  "updated": true,
  "revoked": true,
  "resource": {
    "StatusList2021": {
      "encodedList": "496fdfbeb745b4db03fcdb40566f9c4c4a1c0f184b31255e641b6e7bdfb9b6946c12be87ca3763be0393c00b67ac1e8737c106b32f46ef59c765754415b5e8cc7c65fccaa3374620430ea476301a5e0dd63340e7a27a68bc627518471f22e4a2",
      "type": "StatusList2021Revocation",
      "validFrom": "2023-06-26T11:45:19.349Z"
    },
    "metadata": {
      "type": "StatusList2021Revocation",
      "encoding": "base64url",
      "encrypted": true,
      "encryptedSymmetricKey": "b11182dc524b8181f9a6aef4c4ad0a1c14e40033b9112dffd8d1bcf6cc3b85abc07ded2205ee94068a99f4202502cb0855f322583fa6ce1534d3a05bf36891766ea2c5f90a982b3040680762977d404d758a2370224a239c8279aa7d21e980931c42055b17ca4c7dbffa4782480a8b6279cf989b2f166d5fdb4b2c1b5a63927200000000000000203018dcaba26df45a415bb599218b27ca853a70289d7a3ed3ed0e3730452e8f8d9af91b6e71312565d2c069341f6660ab",
      "paymentConditions": [
        {
          "feePaymentAddress": "cheqd1qs0nhyk868c246defezhz5eymlt0dmajna2csg",
          "feePaymentAmount": "20000000000ncheq",
          "intervalInSeconds": 600,
          "type": "timelockPayment"
        }
      ]
    },
    "resourceMetadata": {
      "resourceURI": "did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e/resources/5945233a-a4b5-422b-b893-eaed5cedd2dc",
      "resourceCollectionId": "7c2b990c-3d05-4ebf-91af-f4f4d0091d2e",
      "resourceId": "5945233a-a4b5-422b-b893-eaed5cedd2dc",
      "resourceName": "cheqd-revocation-encrypted-1",
      "resourceType": "StatusList2021Revocation",
      "mediaType": "application/json",
      "resourceVersion": "2023-06-26T11:45:19.349Z",
      "created": "2023-06-26T11:45:20Z",
      "checksum": "909e22e371a41afbb96c330a97752cf7c8856088f1f937f87decbef06cbe9ca2",
      "previousVersionId": null,
      "nextVersionId": null
    },
    "symmetricKey": "dfe204ee95ae74ea5d74b94c3d8ff782273905b07fbc9f8c3d961c3b43849f18"
  }
}

Update an existing encrypted StatusList2021 credential status list.

post
Authorizations
Query parameters
statusActionstring · enumRequired

The update action to be performed on the encrypted status list, can be revoke, suspend or reinstate

Possible values:
Body
all ofOptional
Responses
200
The request was successful.
application/json
Responseall of
and
one ofOptional
or
or
and
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential-status/update/encrypted?statusAction=revoke HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 225

"did='https://example.com'&statusListName='text'&indices=[1]&statusListVersion='text'&symmetricKey='text'&feePaymentAddress='cheqd1qs0nhyk868c246defezhz5eymlt0dmajna2csg'&feePaymentAmount=1&feePaymentWindow=1"
{
  "updated": true,
  "revoked": true,
  "resource": {
    "StatusList2021": {
      "encodedList": "496fdfbeb745b4db03fcdb40566f9c4c4a1c0f184b31255e641b6e7bdfb9b6946c12be87ca3763be0393c00b67ac1e8737c106b32f46ef59c765754415b5e8cc7c65fccaa3374620430ea476301a5e0dd63340e7a27a68bc627518471f22e4a2",
      "type": "StatusList2021Revocation",
      "validFrom": "2023-06-26T11:45:19.349Z"
    },
    "metadata": {
      "type": "StatusList2021Revocation",
      "encoding": "base64url",
      "encrypted": true,
      "encryptedSymmetricKey": "b11182dc524b8181f9a6aef4c4ad0a1c14e40033b9112dffd8d1bcf6cc3b85abc07ded2205ee94068a99f4202502cb0855f322583fa6ce1534d3a05bf36891766ea2c5f90a982b3040680762977d404d758a2370224a239c8279aa7d21e980931c42055b17ca4c7dbffa4782480a8b6279cf989b2f166d5fdb4b2c1b5a63927200000000000000203018dcaba26df45a415bb599218b27ca853a70289d7a3ed3ed0e3730452e8f8d9af91b6e71312565d2c069341f6660ab",
      "paymentConditions": [
        {
          "feePaymentAddress": "cheqd1qs0nhyk868c246defezhz5eymlt0dmajna2csg",
          "feePaymentAmount": "20000000000ncheq",
          "intervalInSeconds": 600,
          "type": "timelockPayment"
        }
      ]
    },
    "resourceMetadata": {
      "resourceURI": "did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e/resources/5945233a-a4b5-422b-b893-eaed5cedd2dc",
      "resourceCollectionId": "7c2b990c-3d05-4ebf-91af-f4f4d0091d2e",
      "resourceId": "5945233a-a4b5-422b-b893-eaed5cedd2dc",
      "resourceName": "cheqd-revocation-encrypted-1",
      "resourceType": "StatusList2021Revocation",
      "mediaType": "application/json",
      "resourceVersion": "2023-06-26T11:45:19.349Z",
      "created": "2023-06-26T11:45:20Z",
      "checksum": "909e22e371a41afbb96c330a97752cf7c8856088f1f937f87decbef06cbe9ca2",
      "previousVersionId": null,
      "nextVersionId": null
    },
    "symmetricKey": "dfe204ee95ae74ea5d74b94c3d8ff782273905b07fbc9f8c3d961c3b43849f18"
  }
}

Update an existing encrypted StatusList2021 credential status list.

post
Authorizations
Query parameters
statusActionstring · enumRequired

The update action to be performed on the encrypted status list, can be revoke, suspend or reinstate

Possible values:
Body
all ofOptional
Responses
200
The request was successful.
application/json
Responseall of
and
one ofOptional
or
or
and
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential-status/update/encrypted?statusAction=revoke HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 225

"did='https://example.com'&statusListName='text'&indices=[1]&statusListVersion='text'&symmetricKey='text'&feePaymentAddress='cheqd1qs0nhyk868c246defezhz5eymlt0dmajna2csg'&feePaymentAmount=1&feePaymentWindow=1"
{
  "updated": true,
  "revoked": true,
  "resource": {
    "StatusList2021": {
      "encodedList": "496fdfbeb745b4db03fcdb40566f9c4c4a1c0f184b31255e641b6e7bdfb9b6946c12be87ca3763be0393c00b67ac1e8737c106b32f46ef59c765754415b5e8cc7c65fccaa3374620430ea476301a5e0dd63340e7a27a68bc627518471f22e4a2",
      "type": "StatusList2021Revocation",
      "validFrom": "2023-06-26T11:45:19.349Z"
    },
    "metadata": {
      "type": "StatusList2021Revocation",
      "encoding": "base64url",
      "encrypted": true,
      "encryptedSymmetricKey": "b11182dc524b8181f9a6aef4c4ad0a1c14e40033b9112dffd8d1bcf6cc3b85abc07ded2205ee94068a99f4202502cb0855f322583fa6ce1534d3a05bf36891766ea2c5f90a982b3040680762977d404d758a2370224a239c8279aa7d21e980931c42055b17ca4c7dbffa4782480a8b6279cf989b2f166d5fdb4b2c1b5a63927200000000000000203018dcaba26df45a415bb599218b27ca853a70289d7a3ed3ed0e3730452e8f8d9af91b6e71312565d2c069341f6660ab",
      "paymentConditions": [
        {
          "feePaymentAddress": "cheqd1qs0nhyk868c246defezhz5eymlt0dmajna2csg",
          "feePaymentAmount": "20000000000ncheq",
          "intervalInSeconds": 600,
          "type": "timelockPayment"
        }
      ]
    },
    "resourceMetadata": {
      "resourceURI": "did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e/resources/5945233a-a4b5-422b-b893-eaed5cedd2dc",
      "resourceCollectionId": "7c2b990c-3d05-4ebf-91af-f4f4d0091d2e",
      "resourceId": "5945233a-a4b5-422b-b893-eaed5cedd2dc",
      "resourceName": "cheqd-revocation-encrypted-1",
      "resourceType": "StatusList2021Revocation",
      "mediaType": "application/json",
      "resourceVersion": "2023-06-26T11:45:19.349Z",
      "created": "2023-06-26T11:45:20Z",
      "checksum": "909e22e371a41afbb96c330a97752cf7c8856088f1f937f87decbef06cbe9ca2",
      "previousVersionId": null,
      "nextVersionId": null
    },
    "symmetricKey": "dfe204ee95ae74ea5d74b94c3d8ff782273905b07fbc9f8c3d961c3b43849f18"
  }
}

Check a StatusList2021 index for a given Verifiable Credential.

post

This endpoint checks a StatusList2021 index for a given Verifiable Credential and reports whether it is revoked or suspended. It offers a standalone method for checking an index without passing the entire Verifiable Credential or Verifiable Presentation.

Authorizations
Query parameters
statusPurposestring · enumRequired

The purpose of the status list. Can be either revocation or suspension.

Possible values:
Body
didstring · uriRequired

DID of the StatusList2021 publisher.

statusListNamestringRequired

The name of the StatusList2021 DID-Linked Resource to be checked.

indexintegerRequired

Credential status index to be checked for revocation or suspension.

makeFeePaymentbooleanOptional

Automatically make fee payment (if required) based on payment conditions to unlock encrypted StatusList2021 DID-Linked Resource.

Default: true
Responses
200
The request was successful.
application/json
Responseone of
or
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential-status/check?statusPurpose=revocation HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 85

"did='https://example.com'&statusListName='text'&index=1&makeFeePayment=true"
{
  "checked": true,
  "revoked": false
}

Check a StatusList2021 index for a given Verifiable Credential.

post

This endpoint checks a StatusList2021 index for a given Verifiable Credential and reports whether it is revoked or suspended. It offers a standalone method for checking an index without passing the entire Verifiable Credential or Verifiable Presentation.

Authorizations
Query parameters
statusPurposestring · enumRequired

The purpose of the status list. Can be either revocation or suspension.

Possible values:
Body
didstring · uriRequired

DID of the StatusList2021 publisher.

statusListNamestringRequired

The name of the StatusList2021 DID-Linked Resource to be checked.

indexintegerRequired

Credential status index to be checked for revocation or suspension.

makeFeePaymentbooleanOptional

Automatically make fee payment (if required) based on payment conditions to unlock encrypted StatusList2021 DID-Linked Resource.

Default: true
Responses
200
The request was successful.
application/json
Responseone of
or
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential-status/check?statusPurpose=revocation HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 85

"did='https://example.com'&statusListName='text'&index=1&makeFeePayment=true"
{
  "checked": true,
  "revoked": false
}

Check a StatusList2021 index for a given Verifiable Credential.

post

This endpoint checks a StatusList2021 index for a given Verifiable Credential and reports whether it is revoked or suspended. It offers a standalone method for checking an index without passing the entire Verifiable Credential or Verifiable Presentation.

Authorizations
Query parameters
statusPurposestring · enumRequired

The purpose of the status list. Can be either revocation or suspension.

Possible values:
Body
didstring · uriRequired

DID of the StatusList2021 publisher.

statusListNamestringRequired

The name of the StatusList2021 DID-Linked Resource to be checked.

indexintegerRequired

Credential status index to be checked for revocation or suspension.

makeFeePaymentbooleanOptional

Automatically make fee payment (if required) based on payment conditions to unlock encrypted StatusList2021 DID-Linked Resource.

Default: true
Responses
200
The request was successful.
application/json
Responseone of
or
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential-status/check?statusPurpose=revocation HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 85

"did='https://example.com'&statusListName='text'&index=1&makeFeePayment=true"
{
  "checked": true,
  "revoked": false
}

Verify a verifiable accreditation for a DID.

post

Generate and publish a Verifiable Accreditation for a subject DID as a DID Linked resource.

Authorizations
Query parameters
verifyStatusbooleanOptional

If set to true the verification will also check the status of the accreditation. Requires the VC to have a credentialStatus property.

Default: false
allowDeactivatedDidbooleanOptional

If set to true allow to verify accreditation which based on deactivated DID.

Default: false
Body
subjectDidstringRequired

DID of the Verifiable Accreditation holder/subject. This needs to be a did:key DID.

Example: did:cheqd:testnet:5efa5126-c070-420f-a9c2-d22ae6eefb92
didUrlstringOptional

DID URL of the Verifiable Accreditation to be verified as a VC-JWT string or a JSON object.

Example: did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e?resourceName=cheqd-issuer-logo&resourceType=CredentialArtwork
didstringOptional

DID of the Verifiable Accreditation holder/subject

Example: did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e
resourceIdstringOptional

Unique resource identifier of the Verifiable Accreditation

Example: 398cee0a-efac-4643-9f4c-74c48c72a14b
resourceNamestringOptional

Resource name of the Verifiable Accreditation

Example: cheqd-issuer-logo
resourceTypestringOptional

Resource type of the Verifiable Accreditation

Example: CredentialArtwork
Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /trust-registry/accreditation/verify HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 497

"subjectDid='did:cheqd:testnet:5efa5126-c070-420f-a9c2-d22ae6eefb92'&didUrl='did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e?resourceName=cheqd-issuer-logo&resourceType=CredentialArtwork'&did='did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e'&resourceId='398cee0a-efac-4643-9f4c-74c48c72a14b'&resourceName='cheqd-issuer-logo'&resourceType='CredentialArtwork'&schemas=[{'types':'text','url':'text'}]&policies={'issuanceDate':true,'expirationDate':true,'audience':true}"
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://schema.org",
    "https://veramo.io/contexts/profile/v1"
  ],
  "credentialSubject": {
    "gender": "male",
    "id": "did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK",
    "name": "Bob"
  },
  "credentialStatus": {
    "id": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e?resourceName=cheqd-suspension-1&resourceType=StatusList2021Suspension#20",
    "statusIndex": 20,
    "statusPurpose": "suspension",
    "type": "StatusList2021Entry"
  },
  "issuanceDate": "2023-06-08T13:49:28.000Z",
  "issuer": {
    "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0"
  },
  "proof": {
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJkaWQ6Y2hlcWQ6dGVzdG5ldDo3YmY4MWEyMC02MzNjLTRjYzctYmM0YS01YTQ1ODAxMDA1ZTAiLCJuYmYiOjE2ODYyMzIxNjgsInN1YiI6ImRpZDprZXk6ejZNa2hhWGdCWkR2b3REa0w1MjU3ZmFpenRpR2lDMlF0S0xHcGJubkVHdGEyZG9LIiwidmMiOnsiQGNvbnRleHQiOlsiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvdjEiLCJodHRwczovL3NjaGVtYS5vcmciLCJodHRwczovL3ZlcmFtby5pby9jb250ZXh0cy9wcm9maWxlL3YxIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImdlbmRlciI6Im1hbGUiLCJuYW1lIjoiQm9iIn0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJQZXJzb24iXX19.wMfdR6RtyAZA4eoWya5Aw97wwER2Cm5Guk780Xw8H9fA3sfudIJeLRLboqixpTchqSbYeA7KbuCTAnLgXTD_Cg",
    "type": "JwtProof2020"
  },
  "type": [
    "VerifiableCredential",
    "Person"
  ]
}

Publish a verifiable accreditation for a DID.

post

Generate and publish a Verifiable Accreditation for a subject DID as a DID Linked resource.

Authorizations
Query parameters
accreditationTypestring · enumRequired

Select the type of accreditation to be issued.

Possible values:
Body

Input fields for the creating a Verifiable Accreditation.

issuerDidstringRequired

DID of the Verifiable Accreditation issuer. This needs to be a did:cheqd DID.

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

DID of the Verifiable Accreditation holder/subject. This needs to be a did:cheqd DID.

Example: did:cheqd:testnet:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK
accreditationNamestringRequired

Unique name of the Verifiable Accreditation.

attributesobjectOptional

JSON object containing the attributes to be included in the Accreditation.

@contextstring[]Optional

Optional properties to be included in the @context property of the Accreditation.

Example: ["https://schema.org/schema.jsonld","https://veramo.io/contexts/profile/v1"]
parentAccreditationstringOptional

DID URL of the parent Verifiable Accreditation, required for accredit/attest operation.

rootAuthorisationstringOptional

DID URL of the root Verifiable Accreditation, required for accredit/attest operation.

trustFrameworkstringOptional

Name or Type of the Trust Framework, required for authorise operation.

trustFrameworkIdstringOptional

Url of the Trust Framework, required for authorise operation.

typestring[]Optional

Optional properties to be included in the type property of the Accreditation.

Example: ["Person"]
expirationDatestring · date-timeOptional

Optional expiration date according to the <a href=https://www.w3.org/TR/vc-data-model/#expiration> VC Data Model specification.

Example: 2023-06-08T13:49:28.000Z
formatstring · enumOptional

Format of the Verifiable Accreditation. Defaults to VC-JWT.

Example: jwtPossible values:
termsOfUseobject[]Optional

Terms of use can be utilized by an issuer or a holder to communicate the terms under which a verifiable credential was issued.

Example: {"type":"IssuerPolicy","id":"http://example.com/policies/credential/4","profile":"http://example.com/profiles/credential","prohibition":[{"assigner":"https://example.edu/issuers/14","assignee":"AllVerifiers","target":"http://example.edu/credentials/3732","action":["Archival"]}]}
refreshServiceobject[]Optional

RefreshService property MUST be one or more refresh services that provides enough information to the recipient's software such that the recipient can refresh the verifiable credential.

Example: {"type":"ManualRefreshService2018","id":"https://example.edu/refresh/3732"}
evidenceobject[]Optional

Evidence property MUST be one or more evidence schemes providing enough information for a verifier to determine whether the evidence gathered by the issuer meets its confidence requirements for relying on the credential.

Example: {"type":["DocumentVerification"],"id":"https://example.edu/evidence/f2aeec97-fc0d-42bf-8ca7-0548192d4231","verifier":"https://example.edu/issuers/14","evidenceDocument":"DriversLicense","subjectPresence":"Physical","documentPresence":"Physical","licenseNumber":"123AB4567"}
Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /trust-registry/accreditation/issue?accreditationType=authorise HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 955

"issuerDid='did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0'&subjectDid='did:cheqd:testnet:2582fe17-9b25-45e4-8104-1cfca430f0c3'&schemas=[{'type':'MuseumPassCredential','url':'https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:0a5b94d0-a417-48ed-a6f5-4abc9e95888d?resourceName=MuseumPassCredentialSchema&resourceType=JsonSchemaValidator2018'}]&format='jwt'&accreditationName='authoriseAccreditation'&trustFramework='https://learn.cheqd.io/governance/start'&trustFrameworkId='cheqd Governance Framework'&parentAccreditation='did:cheqd:testnet:15b74787-6e48-4fd5-8020-eab24e990578?resourceName=accreditAccreditation&resourceType=VerifiableAccreditationToAccredit'&rootAuthorisation='did:cheqd:testnet:5RpEg66jhhbmASWPXJRWrA?resourceName=authoriseAccreditation&resourceType=VerifiableAuthorisationForTrustChain'&credentialStatus={'statusPurpose':'revocation','statusListName':'employee-credentials','statusListIndex':10}"
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://schema.org",
    "https://veramo.io/contexts/profile/v1"
  ],
  "credentialSubject": {
    "gender": "male",
    "id": "did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK",
    "name": "Bob"
  },
  "credentialStatus": {
    "id": "https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e?resourceName=cheqd-suspension-1&resourceType=StatusList2021Suspension#20",
    "statusIndex": 20,
    "statusPurpose": "suspension",
    "type": "StatusList2021Entry"
  },
  "issuanceDate": "2023-06-08T13:49:28.000Z",
  "issuer": {
    "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0"
  },
  "proof": {
    "jwt": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJkaWQ6Y2hlcWQ6dGVzdG5ldDo3YmY4MWEyMC02MzNjLTRjYzctYmM0YS01YTQ1ODAxMDA1ZTAiLCJuYmYiOjE2ODYyMzIxNjgsInN1YiI6ImRpZDprZXk6ejZNa2hhWGdCWkR2b3REa0w1MjU3ZmFpenRpR2lDMlF0S0xHcGJubkVHdGEyZG9LIiwidmMiOnsiQGNvbnRleHQiOlsiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvdjEiLCJodHRwczovL3NjaGVtYS5vcmciLCJodHRwczovL3ZlcmFtby5pby9jb250ZXh0cy9wcm9maWxlL3YxIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImdlbmRlciI6Im1hbGUiLCJuYW1lIjoiQm9iIn0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJQZXJzb24iXX19.wMfdR6RtyAZA4eoWya5Aw97wwER2Cm5Guk780Xw8H9fA3sfudIJeLRLboqixpTchqSbYeA7KbuCTAnLgXTD_Cg",
    "type": "JwtProof2020"
  },
  "type": [
    "VerifiableCredential",
    "Person"
  ]
}

Create an unencrypted StatusList2021 credential status list.

post

This endpoint creates an unencrypted StatusList2021 credential status list. The StatusList is published as a DID-Linked Resource on ledger. As input, it can can take input parameters needed to create the status list via a form, or a pre-assembled status list in JSON format. Status lists can be created as either encrypted or unencrypted; and with purpose as either revocation or suspension.

Authorizations
Query parameters
statusPurposestring · enumRequired

The purpose of the status list. Can be either revocation or suspension. Once this is set, it cannot be changed. A new status list must be created to change the purpose.

Possible values:
Body
all ofOptionalExample: {"did":"did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e","statusListName":"cheqd-employee-credentials","length":140000,"encoding":"base64url"}
Responses
200
The request was successful.
application/json
Responseall of
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential-status/create/unencrypted?statusPurpose=revocation HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 149

"did='did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e'&statusListName='cheqd-employee-credentials'&length=140000&encoding='base64url'"
{
  "created": true,
  "resource": {
    "StatusList2021": {
      "encodedList": "H4sIAAAAAAAAA-3BAQ0AAADCoPdPbQ8HFAAAAAAAAAAAAAAAAAAAAADwaDhDr_xcRAAA",
      "type": "StatusList2021Revocation",
      "validFrom": "2023-06-26T11:45:19.349Z"
    },
    "metadata": {
      "type": "StatusList2021Revocation",
      "encoding": "base64url",
      "encrypted": false
    }
  },
  "resourceMetadata": {
    "resourceURI": "did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e/resources/5945233a-a4b5-422b-b893-eaed5cedd2dc",
    "resourceCollectionId": "7c2b990c-3d05-4ebf-91af-f4f4d0091d2e",
    "resourceId": "5945233a-a4b5-422b-b893-eaed5cedd2dc",
    "resourceName": "cheqd-employee-credentials",
    "resourceType": "StatusList2021Revocation",
    "mediaType": "application/json",
    "resourceVersion": "1.0.0",
    "created": "2023-06-26T11:45:20Z",
    "checksum": "909e22e371a41afbb96c330a97752cf7c8856088f1f937f87decbef06cbe9ca2",
    "previousVersionId": null,
    "nextVersionId": null
  }
}

Create an unencrypted StatusList2021 credential status list.

post

This endpoint creates an unencrypted StatusList2021 credential status list. The StatusList is published as a DID-Linked Resource on ledger. As input, it can can take input parameters needed to create the status list via a form, or a pre-assembled status list in JSON format. Status lists can be created as either encrypted or unencrypted; and with purpose as either revocation or suspension.

Authorizations
Query parameters
statusPurposestring · enumRequired

The purpose of the status list. Can be either revocation or suspension. Once this is set, it cannot be changed. A new status list must be created to change the purpose.

Possible values:
Body
all ofOptionalExample: {"did":"did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e","statusListName":"cheqd-employee-credentials","length":140000,"encoding":"base64url"}
Responses
200
The request was successful.
application/json
Responseall of
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential-status/create/unencrypted?statusPurpose=revocation HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 149

"did='did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e'&statusListName='cheqd-employee-credentials'&length=140000&encoding='base64url'"
{
  "created": true,
  "resource": {
    "StatusList2021": {
      "encodedList": "H4sIAAAAAAAAA-3BAQ0AAADCoPdPbQ8HFAAAAAAAAAAAAAAAAAAAAADwaDhDr_xcRAAA",
      "type": "StatusList2021Revocation",
      "validFrom": "2023-06-26T11:45:19.349Z"
    },
    "metadata": {
      "type": "StatusList2021Revocation",
      "encoding": "base64url",
      "encrypted": false
    }
  },
  "resourceMetadata": {
    "resourceURI": "did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e/resources/5945233a-a4b5-422b-b893-eaed5cedd2dc",
    "resourceCollectionId": "7c2b990c-3d05-4ebf-91af-f4f4d0091d2e",
    "resourceId": "5945233a-a4b5-422b-b893-eaed5cedd2dc",
    "resourceName": "cheqd-employee-credentials",
    "resourceType": "StatusList2021Revocation",
    "mediaType": "application/json",
    "resourceVersion": "1.0.0",
    "created": "2023-06-26T11:45:20Z",
    "checksum": "909e22e371a41afbb96c330a97752cf7c8856088f1f937f87decbef06cbe9ca2",
    "previousVersionId": null,
    "nextVersionId": null
  }
}

Update an existing unencrypted StatusList2021 credential status list.

post
Authorizations
Query parameters
statusActionstring · enumRequired

The update action to be performed on the unencrypted status list, can be revoke, suspend or reinstate

Possible values:
Body
all ofOptionalExample: {"did":"did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e","statusListName":"cheqd-employee-credentials","indices":[10,3199,12109,130999]}
Responses
200
The request was successful.
application/json
Responseall of
and
one ofOptional
or
or
and
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential-status/update/unencrypted?statusAction=revoke HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 143

"did='did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e'&statusListName='cheqd-employee-credentials'&indices=[10,3199,12109,130999]"
{
  "updated": true,
  "revoked": true,
  "resource": {
    "StatusList2021": {
      "encodedList": "H4sIAAAAAAAAA-3BAQ0AAADCoPdPbQ8HFAAAAAAAAAAAAAAAAAAAAADwaDhDr_xcRAAA",
      "type": "StatusList2021Revocation",
      "validFrom": "2023-06-26T11:45:19.349Z"
    },
    "metadata": {
      "type": "StatusList2021Revocation",
      "encoding": "base64url",
      "encrypted": false
    }
  },
  "resourceMetadata": {
    "resourceURI": "did:cheqd:testnet:7c2b990c-3d05-4ebf-91af-f4f4d0091d2e/resources/5945233a-a4b5-422b-b893-eaed5cedd2dc",
    "resourceCollectionId": "7c2b990c-3d05-4ebf-91af-f4f4d0091d2e",
    "resourceId": "5945233a-a4b5-422b-b893-eaed5cedd2dc",
    "resourceName": "cheqd-employee-credentials",
    "resourceType": "StatusList2021Revocation",
    "mediaType": "application/json",
    "resourceVersion": "1.0.0",
    "created": "2023-06-26T11:45:20Z",
    "checksum": "909e22e371a41afbb96c330a97752cf7c8856088f1f937f87decbef06cbe9ca2",
    "previousVersionId": null,
    "nextVersionId": null
  }
}

Create a DID-Linked Resource.

post

This endpoint creates a DID-Linked Resource. As input, it can take the DID identifier and the resource parameters via a form, or the fully-assembled resource itself.

Authorizations
Path parameters
didstringRequired

DID identifier to link the resource to.

Body

Input fields for DID-Linked Resource creation.

datastringRequired

Encoded string containing the data to be stored in the DID-Linked Resource.

encodingstring · enumRequired

Encoding format used to encode the data.

Possible values:
namestringRequired

Name of DID-Linked Resource.

typestringRequired

Type of DID-Linked Resource. This is NOT the same as the media type, which is calculated automatically ledger-side.

versionstringOptional

Optional field to assign a human-readable version in the DID-Linked Resource.

publicKeyHexsstring[]Optional

List of key references (publicKeys) which will be used for signing the message. The should be in hexadecimal format and placed in the wallet of current user.

Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /resource/create/{did} HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 94

"data='SGVsbG8gV29ybGQ='&encoding='base64url'&name='ResourceName'&type='TextDocument'"
{
  "resourceURI": "did:cheqd:testnet:55dbc8bf-fba3-4117-855c-1e0dc1d3bb47/resources/398cee0a-efac-4643-9f4c-74c48c72a14b",
  "resourceCollectionId": "55dbc8bf-fba3-4117-855c-1e0dc1d3bb47",
  "resourceId": "398cee0a-efac-4643-9f4c-74c48c72a14b",
  "resourceName": "cheqd-issuer-logo",
  "resourceType": "CredentialArtwork",
  "mediaType": "image/png",
  "resourceVersion": "1.0",
  "checksum": "a95380f460e63ad939541a57aecbfd795fcd37c6d78ee86c885340e33a91b559",
  "created": "2021-09-01T12:00:00Z",
  "nextVersionId": "d4829ac7-4566-478c-a408-b44767eddadc",
  "previousVersionId": "ad7a8442-3531-46eb-a024-53953ec6e4ff"
}

Check a StatusList2021 index for a given Verifiable Credential.

post

This endpoint checks a StatusList2021 index for a given Verifiable Credential and reports whether it is revoked or suspended. It offers a standalone method for checking an index without passing the entire Verifiable Credential or Verifiable Presentation.

Authorizations
Query parameters
statusPurposestring · enumRequired

The purpose of the status list. Can be either revocation or suspension.

Possible values:
Body
didstring · uriRequired

DID of the StatusList2021 publisher.

statusListNamestringRequired

The name of the StatusList2021 DID-Linked Resource to be checked.

indexintegerRequired

Credential status index to be checked for revocation or suspension.

makeFeePaymentbooleanOptional

Automatically make fee payment (if required) based on payment conditions to unlock encrypted StatusList2021 DID-Linked Resource.

Default: true
Responses
200
The request was successful.
application/json
Responseone of
or
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /credential-status/check?statusPurpose=revocation HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 85

"did='https://example.com'&statusListName='text'&index=1&makeFeePayment=true"
{
  "checked": true,
  "revoked": false
}

Create a DID-Linked Resource.

post

This endpoint creates a DID-Linked Resource. As input, it can take the DID identifier and the resource parameters via a form, or the fully-assembled resource itself.

Authorizations
Path parameters
didstringRequired

DID identifier to link the resource to.

Body

Input fields for DID-Linked Resource creation.

datastringRequired

Encoded string containing the data to be stored in the DID-Linked Resource.

encodingstring · enumRequired

Encoding format used to encode the data.

Possible values:
namestringRequired

Name of DID-Linked Resource.

typestringRequired

Type of DID-Linked Resource. This is NOT the same as the media type, which is calculated automatically ledger-side.

versionstringOptional

Optional field to assign a human-readable version in the DID-Linked Resource.

publicKeyHexsstring[]Optional

List of key references (publicKeys) which will be used for signing the message. The should be in hexadecimal format and placed in the wallet of current user.

Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /resource/create/{did} HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 94

"data='SGVsbG8gV29ybGQ='&encoding='base64url'&name='ResourceName'&type='TextDocument'"
{
  "resourceURI": "did:cheqd:testnet:55dbc8bf-fba3-4117-855c-1e0dc1d3bb47/resources/398cee0a-efac-4643-9f4c-74c48c72a14b",
  "resourceCollectionId": "55dbc8bf-fba3-4117-855c-1e0dc1d3bb47",
  "resourceId": "398cee0a-efac-4643-9f4c-74c48c72a14b",
  "resourceName": "cheqd-issuer-logo",
  "resourceType": "CredentialArtwork",
  "mediaType": "image/png",
  "resourceVersion": "1.0",
  "checksum": "a95380f460e63ad939541a57aecbfd795fcd37c6d78ee86c885340e33a91b559",
  "created": "2021-09-01T12:00:00Z",
  "nextVersionId": "d4829ac7-4566-478c-a408-b44767eddadc",
  "previousVersionId": "ad7a8442-3531-46eb-a024-53953ec6e4ff"
}

Create a DID-Linked Resource.

post

This endpoint creates a DID-Linked Resource. As input, it can take the DID identifier and the resource parameters via a form, or the fully-assembled resource itself.

Authorizations
Path parameters
didstringRequired

DID identifier to link the resource to.

Body

Input fields for DID-Linked Resource creation.

datastringRequired

Encoded string containing the data to be stored in the DID-Linked Resource.

encodingstring · enumRequired

Encoding format used to encode the data.

Possible values:
namestringRequired

Name of DID-Linked Resource.

typestringRequired

Type of DID-Linked Resource. This is NOT the same as the media type, which is calculated automatically ledger-side.

versionstringOptional

Optional field to assign a human-readable version in the DID-Linked Resource.

publicKeyHexsstring[]Optional

List of key references (publicKeys) which will be used for signing the message. The should be in hexadecimal format and placed in the wallet of current user.

Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
post
POST /resource/create/{did} HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 94

"data='SGVsbG8gV29ybGQ='&encoding='base64url'&name='ResourceName'&type='TextDocument'"
{
  "resourceURI": "did:cheqd:testnet:55dbc8bf-fba3-4117-855c-1e0dc1d3bb47/resources/398cee0a-efac-4643-9f4c-74c48c72a14b",
  "resourceCollectionId": "55dbc8bf-fba3-4117-855c-1e0dc1d3bb47",
  "resourceId": "398cee0a-efac-4643-9f4c-74c48c72a14b",
  "resourceName": "cheqd-issuer-logo",
  "resourceType": "CredentialArtwork",
  "mediaType": "image/png",
  "resourceVersion": "1.0",
  "checksum": "a95380f460e63ad939541a57aecbfd795fcd37c6d78ee86c885340e33a91b559",
  "created": "2021-09-01T12:00:00Z",
  "nextVersionId": "d4829ac7-4566-478c-a408-b44767eddadc",
  "previousVersionId": "ad7a8442-3531-46eb-a024-53953ec6e4ff"
}

Resolve a DID Document.

get

Resolve a DID Document by DID identifier. Also supports DID Resolution Queries as defined in the .

Authorizations
Path parameters
didstringRequired

DID identifier to resolve.

Example: did:cheqd:mainnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0
Query parameters
metadatabooleanOptional

Return only metadata of DID Document instead of actual DID Document.

versionIdstring · uuidOptional

Unique UUID version identifier of DID Document. Allows for fetching a specific version of the DID Document. See cheqd DID Method Specification for more details.

Example: 3ccde6ba-6ba5-56f2-9f4f-8825561a9860
versionTimestring · date-timeOptional

Returns the closest version of the DID Document at or before specified time. See DID Resolution handling for did:cheqd for more details.

Example: 1970-01-01T00:00:00Z
transformKeysstring · enumOptional

This directive transforms the Verification Method key format from the version in the DID Document to the specified format chosen below.

Possible values:
servicestringOptional

Query DID Document for a specific Service Endpoint by Service ID (e.g., service-1 in did:cheqd:mainnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#service-1). This will typically redirect to the Service Endpoint based on DID Resolution specification algorithm.

Example: service-1
relativeRefstringOptional

Relative reference is a query fragment appended to the Service Endpoint URL. Must be used along with the service query property above. See DID Resolution specification algorithm for more details.

Example: /path/to/file
Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
get
GET /did/search/{did} HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Accept: */*
{
  "@context": "https://w3id.org/did-resolution/v1",
  "didDidResolutionMetadata": {
    "contentType": "application/did+ld+json",
    "retrieved": "2021-09-01T12:00:00Z",
    "did": {
      "didString": "did:cheqd:testnet:55dbc8bf-fba3-4117-855c-1e0dc1d3bb47",
      "method": "cheqd",
      "methodSpecificId": "55dbc8bf-fba3-4117-855c-1e0dc1d3bb47"
    }
  },
  "didDocument": {
    "@context": [
      "https://www.w3.org/ns/did/v1"
    ],
    "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0",
    "controller": [
      "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0"
    ],
    "verificationMethod": [
      {
        "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#key-1",
        "type": "Ed25519VerificationKey2018",
        "controller": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0",
        "publicKeyBase58": "z6MkkVbyHJLLjdjU5B62DaJ4mkdMdUkttf9UqySSkA9bVTeZ"
      }
    ],
    "authentication": [
      "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#key-1"
    ],
    "service": [
      {
        "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#service-1",
        "type": "LinkedDomains",
        "serviceEndpoint": [
          "https://example.com"
        ]
      }
    ]
  },
  "didDocumentMetadata": {
    "created": "2021-09-01T12:00:00Z",
    "deactivated": false,
    "updated": "2021-09-10T12:00:00Z",
    "versionId": "3ccde6ba-6ba5-56f2-9f4f-8825561a9860",
    "linkedResourceMetadata": [
      {
        "resourceURI": "did:cheqd:testnet:55dbc8bf-fba3-4117-855c-1e0dc1d3bb47/resources/398cee0a-efac-4643-9f4c-74c48c72a14b",
        "resourceCollectionId": "55dbc8bf-fba3-4117-855c-1e0dc1d3bb47",
        "resourceId": "398cee0a-efac-4643-9f4c-74c48c72a14b",
        "resourceName": "cheqd-issuer-logo",
        "resourceType": "CredentialArtwork",
        "mediaType": "image/png",
        "resourceVersion": "1.0",
        "checksum": "a95380f460e63ad939541a57aecbfd795fcd37c6d78ee86c885340e33a91b559",
        "created": "2021-09-01T12:00:00Z",
        "nextVersionId": "d4829ac7-4566-478c-a408-b44767eddadc",
        "previousVersionId": "ad7a8442-3531-46eb-a024-53953ec6e4ff"
      }
    ]
  }
}

Resolve a DID Document.

get

Resolve a DID Document by DID identifier. Also supports DID Resolution Queries as defined in the .

Authorizations
Path parameters
didstringRequired

DID identifier to resolve.

Example: did:cheqd:mainnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0
Query parameters
metadatabooleanOptional

Return only metadata of DID Document instead of actual DID Document.

versionIdstring · uuidOptional

Unique UUID version identifier of DID Document. Allows for fetching a specific version of the DID Document. See cheqd DID Method Specification for more details.

Example: 3ccde6ba-6ba5-56f2-9f4f-8825561a9860
versionTimestring · date-timeOptional

Returns the closest version of the DID Document at or before specified time. See DID Resolution handling for did:cheqd for more details.

Example: 1970-01-01T00:00:00Z
transformKeysstring · enumOptional

This directive transforms the Verification Method key format from the version in the DID Document to the specified format chosen below.

Possible values:
servicestringOptional

Query DID Document for a specific Service Endpoint by Service ID (e.g., service-1 in did:cheqd:mainnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#service-1). This will typically redirect to the Service Endpoint based on DID Resolution specification algorithm.

Example: service-1
relativeRefstringOptional

Relative reference is a query fragment appended to the Service Endpoint URL. Must be used along with the service query property above. See DID Resolution specification algorithm for more details.

Example: /path/to/file
Responses
200
The request was successful.
application/json
400
A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
401
Access token is missing or invalid
500
An internal error has occurred. Additional state information plus metadata may be available in the response body.
get
GET /did/search/{did} HTTP/1.1
Host: 
x-api-key: YOUR_API_KEY
Accept: */*
{
  "@context": "https://w3id.org/did-resolution/v1",
  "didDidResolutionMetadata": {
    "contentType": "application/did+ld+json",
    "retrieved": "2021-09-01T12:00:00Z",
    "did": {
      "didString": "did:cheqd:testnet:55dbc8bf-fba3-4117-855c-1e0dc1d3bb47",
      "method": "cheqd",
      "methodSpecificId": "55dbc8bf-fba3-4117-855c-1e0dc1d3bb47"
    }
  },
  "didDocument": {
    "@context": [
      "https://www.w3.org/ns/did/v1"
    ],
    "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0",
    "controller": [
      "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0"
    ],
    "verificationMethod": [
      {
        "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#key-1",
        "type": "Ed25519VerificationKey2018",
        "controller": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0",
        "publicKeyBase58": "z6MkkVbyHJLLjdjU5B62DaJ4mkdMdUkttf9UqySSkA9bVTeZ"
      }
    ],
    "authentication": [
      "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#key-1"
    ],
    "service": [
      {
        "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#service-1",
        "type": "LinkedDomains",
        "serviceEndpoint": [
          "https://example.com"
        ]
      }
    ]
  },
  "didDocumentMetadata": {
    "created": "2021-09-01T12:00:00Z",
    "deactivated": false,
    "updated": "2021-09-10T12:00:00Z",
    "versionId": "3ccde6ba-6ba5-56f2-9f4f-8825561a9860",
    "linkedResourceMetadata": [
      {
        "resourceURI": "did:cheqd:testnet:55dbc8bf-fba3-4117-855c-1e0dc1d3bb47/resources/398cee0a-efac-4643-9f4c-74c48c72a14b",
        "resourceCollectionId": "55dbc8bf-fba3-4117-855c-1e0dc1d3bb47",
        "resourceId": "398cee0a-efac-4643-9f4c-74c48c72a14b",
        "resourceName": "cheqd-issuer-logo",
        "resourceType": "CredentialArtwork",
        "mediaType": "image/png",
        "resourceVersion": "1.0",
        "checksum": "a95380f460e63ad939541a57aecbfd795fcd37c6d78ee86c885340e33a91b559",
        "created": "2021-09-01T12:00:00Z",
        "nextVersionId": "d4829ac7-4566-478c-a408-b44767eddadc",
        "previousVersionId": "ad7a8442-3531-46eb-a024-53953ec6e4ff"
      }
    ]
  }
}
W3C DID Resolution specification
W3C DID Resolution specification

Fetch all credential exchange records

get
Query parameters
connection_idstringOptional

Connection identifier

Example: {"value":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}
limitintegerOptional

Number of results to return

Example: {"value":50}
offsetintegerOptional

Offset for pagination

Example: {"value":0}
rolestring · enumOptional

Role assigned in credential exchange

Possible values:
statestring · enumOptional

Credential exchange state

Possible values:
thread_idstringOptional

Thread identifier

Example: {"value":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}
Responses
200Success
application/json
get
GET /issue-credential-2.0/records HTTP/1.1
Host: 
Accept: */*
200Success
{
  "results": [
    {
      "cred_ex_record": {
        "auto_issue": false,
        "auto_offer": false,
        "auto_remove": false,
        "by_format": {
          "cred_issue": {},
          "cred_offer": {},
          "cred_proposal": {},
          "cred_request": {}
        },
        "connection_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "created_at": "2021-12-31T23:59:59Z",
        "cred_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "cred_issue": {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "@type": "https://didcomm.org/my-family/1.0/my-message-type",
          "comment": "text",
          "credentials~attach": [
            {
              "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "byte_count": 1234,
              "data": {
                "base64": "ey4uLn0=",
                "json": "{\"sample\": \"content\"}",
                "jws": {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0",
                  "signatures": [
                    {
                      "header": {
                        "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                      },
                      "protected": "ey4uLn0",
                      "signature": "ey4uLn0"
                    }
                  ]
                },
                "links": [
                  "https://link.to/data"
                ],
                "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
              },
              "description": "view from doorway, facing east, with lights off",
              "filename": "IMG1092348.png",
              "lastmod_time": "2021-12-31T23:59:59Z",
              "mime-type": "image/png"
            }
          ],
          "formats": [
            {
              "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "format": "aries/ld-proof-vc-detail@v1.0"
            }
          ],
          "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
        },
        "cred_offer": {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "@type": "https://didcomm.org/my-family/1.0/my-message-type",
          "comment": "text",
          "credential_preview": {
            "@type": "issue-credential/2.0/credential-preview",
            "attributes": [
              {
                "mime-type": "image/jpeg",
                "name": "favourite_drink",
                "value": "martini"
              }
            ]
          },
          "formats": [
            {
              "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "format": "aries/ld-proof-vc-detail@v1.0"
            }
          ],
          "offers~attach": [
            {
              "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "byte_count": 1234,
              "data": {
                "base64": "ey4uLn0=",
                "json": "{\"sample\": \"content\"}",
                "jws": {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0",
                  "signatures": [
                    {
                      "header": {
                        "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                      },
                      "protected": "ey4uLn0",
                      "signature": "ey4uLn0"
                    }
                  ]
                },
                "links": [
                  "https://link.to/data"
                ],
                "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
              },
              "description": "view from doorway, facing east, with lights off",
              "filename": "IMG1092348.png",
              "lastmod_time": "2021-12-31T23:59:59Z",
              "mime-type": "image/png"
            }
          ],
          "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
        },
        "cred_preview": {
          "@type": "issue-credential/2.0/credential-preview",
          "attributes": [
            {
              "mime-type": "image/jpeg",
              "name": "favourite_drink",
              "value": "martini"
            }
          ]
        },
        "cred_proposal": {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "@type": "https://didcomm.org/my-family/1.0/my-message-type",
          "comment": "text",
          "credential_preview": {
            "@type": "issue-credential/2.0/credential-preview",
            "attributes": [
              {
                "mime-type": "image/jpeg",
                "name": "favourite_drink",
                "value": "martini"
              }
            ]
          },
          "filters~attach": [
            {
              "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "byte_count": 1234,
              "data": {
                "base64": "ey4uLn0=",
                "json": "{\"sample\": \"content\"}",
                "jws": {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0",
                  "signatures": [
                    {
                      "header": {
                        "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                      },
                      "protected": "ey4uLn0",
                      "signature": "ey4uLn0"
                    }
                  ]
                },
                "links": [
                  "https://link.to/data"
                ],
                "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
              },
              "description": "view from doorway, facing east, with lights off",
              "filename": "IMG1092348.png",
              "lastmod_time": "2021-12-31T23:59:59Z",
              "mime-type": "image/png"
            }
          ],
          "formats": [
            {
              "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "format": "aries/ld-proof-vc-detail@v1.0"
            }
          ]
        },
        "cred_request": {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "@type": "https://didcomm.org/my-family/1.0/my-message-type",
          "comment": "text",
          "formats": [
            {
              "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "format": "aries/ld-proof-vc-detail@v1.0"
            }
          ],
          "requests~attach": [
            {
              "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "byte_count": 1234,
              "data": {
                "base64": "ey4uLn0=",
                "json": "{\"sample\": \"content\"}",
                "jws": {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0",
                  "signatures": [
                    {
                      "header": {
                        "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                      },
                      "protected": "ey4uLn0",
                      "signature": "ey4uLn0"
                    }
                  ]
                },
                "links": [
                  "https://link.to/data"
                ],
                "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
              },
              "description": "view from doorway, facing east, with lights off",
              "filename": "IMG1092348.png",
              "lastmod_time": "2021-12-31T23:59:59Z",
              "mime-type": "image/png"
            }
          ]
        },
        "error_msg": "The front fell off",
        "initiator": "self",
        "parent_thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "role": "issuer",
        "state": "done",
        "thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "trace": true,
        "updated_at": "2021-12-31T23:59:59Z"
      },
      "indy": {
        "created_at": "2021-12-31T23:59:59Z",
        "cred_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "cred_ex_indy_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "cred_id_stored": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "cred_request_metadata": {},
        "cred_rev_id": "12345",
        "rev_reg_id": "WgWxqztrNooG92RXvxSTWv:4:WgWxqztrNooG92RXvxSTWv:3:CL:20:tag:CL_ACCUM:0",
        "state": "active",
        "updated_at": "2021-12-31T23:59:59Z"
      },
      "ld_proof": {
        "created_at": "2021-12-31T23:59:59Z",
        "cred_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "cred_ex_ld_proof_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "cred_id_stored": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "state": "active",
        "updated_at": "2021-12-31T23:59:59Z"
      },
      "vc_di": {
        "auto_issue": false,
        "auto_offer": false,
        "auto_remove": false,
        "by_format": {
          "cred_issue": {},
          "cred_offer": {},
          "cred_proposal": {},
          "cred_request": {}
        },
        "connection_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "created_at": "2021-12-31T23:59:59Z",
        "cred_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "cred_issue": {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "@type": "https://didcomm.org/my-family/1.0/my-message-type",
          "comment": "text",
          "credentials~attach": [
            {
              "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "byte_count": 1234,
              "data": {
                "base64": "ey4uLn0=",
                "json": "{\"sample\": \"content\"}",
                "jws": {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0",
                  "signatures": [
                    {
                      "header": {
                        "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                      },
                      "protected": "ey4uLn0",
                      "signature": "ey4uLn0"
                    }
                  ]
                },
                "links": [
                  "https://link.to/data"
                ],
                "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
              },
              "description": "view from doorway, facing east, with lights off",
              "filename": "IMG1092348.png",
              "lastmod_time": "2021-12-31T23:59:59Z",
              "mime-type": "image/png"
            }
          ],
          "formats": [
            {
              "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "format": "aries/ld-proof-vc-detail@v1.0"
            }
          ],
          "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
        },
        "cred_offer": {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "@type": "https://didcomm.org/my-family/1.0/my-message-type",
          "comment": "text",
          "credential_preview": {
            "@type": "issue-credential/2.0/credential-preview",
            "attributes": [
              {
                "mime-type": "image/jpeg",
                "name": "favourite_drink",
                "value": "martini"
              }
            ]
          },
          "formats": [
            {
              "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "format": "aries/ld-proof-vc-detail@v1.0"
            }
          ],
          "offers~attach": [
            {
              "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "byte_count": 1234,
              "data": {
                "base64": "ey4uLn0=",
                "json": "{\"sample\": \"content\"}",
                "jws": {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0",
                  "signatures": [
                    {
                      "header": {
                        "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                      },
                      "protected": "ey4uLn0",
                      "signature": "ey4uLn0"
                    }
                  ]
                },
                "links": [
                  "https://link.to/data"
                ],
                "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
              },
              "description": "view from doorway, facing east, with lights off",
              "filename": "IMG1092348.png",
              "lastmod_time": "2021-12-31T23:59:59Z",
              "mime-type": "image/png"
            }
          ],
          "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
        },
        "cred_preview": {
          "@type": "issue-credential/2.0/credential-preview",
          "attributes": [
            {
              "mime-type": "image/jpeg",
              "name": "favourite_drink",
              "value": "martini"
            }
          ]
        },
        "cred_proposal": {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "@type": "https://didcomm.org/my-family/1.0/my-message-type",
          "comment": "text",
          "credential_preview": {
            "@type": "issue-credential/2.0/credential-preview",
            "attributes": [
              {
                "mime-type": "image/jpeg",
                "name": "favourite_drink",
                "value": "martini"
              }
            ]
          },
          "filters~attach": [
            {
              "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "byte_count": 1234,
              "data": {
                "base64": "ey4uLn0=",
                "json": "{\"sample\": \"content\"}",
                "jws": {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0",
                  "signatures": [
                    {
                      "header": {
                        "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                      },
                      "protected": "ey4uLn0",
                      "signature": "ey4uLn0"
                    }
                  ]
                },
                "links": [
                  "https://link.to/data"
                ],
                "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
              },
              "description": "view from doorway, facing east, with lights off",
              "filename": "IMG1092348.png",
              "lastmod_time": "2021-12-31T23:59:59Z",
              "mime-type": "image/png"
            }
          ],
          "formats": [
            {
              "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "format": "aries/ld-proof-vc-detail@v1.0"
            }
          ]
        },
        "cred_request": {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "@type": "https://didcomm.org/my-family/1.0/my-message-type",
          "comment": "text",
          "formats": [
            {
              "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "format": "aries/ld-proof-vc-detail@v1.0"
            }
          ],
          "requests~attach": [
            {
              "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              "byte_count": 1234,
              "data": {
                "base64": "ey4uLn0=",
                "json": "{\"sample\": \"content\"}",
                "jws": {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0",
                  "signatures": [
                    {
                      "header": {
                        "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                      },
                      "protected": "ey4uLn0",
                      "signature": "ey4uLn0"
                    }
                  ]
                },
                "links": [
                  "https://link.to/data"
                ],
                "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
              },
              "description": "view from doorway, facing east, with lights off",
              "filename": "IMG1092348.png",
              "lastmod_time": "2021-12-31T23:59:59Z",
              "mime-type": "image/png"
            }
          ]
        },
        "error_msg": "The front fell off",
        "initiator": "self",
        "parent_thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "role": "issuer",
        "state": "done",
        "thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "trace": true,
        "updated_at": "2021-12-31T23:59:59Z"
      }
    }
  ]
}

Fetch all present-proof exchange records

get
Query parameters
connection_idstringOptional

Connection identifier

Example: {"value":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}
limitintegerOptional

Number of results to return

Example: {"value":50}
offsetintegerOptional

Offset for pagination

Example: {"value":0}
rolestring · enumOptional

Role assigned in presentation exchange

Possible values:
statestring · enumOptional

Presentation exchange state

Possible values:
thread_idstringOptional

Thread identifier

Example: {"value":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}
Responses
200Success
application/json
get
GET /present-proof-2.0/records HTTP/1.1
Host: 
Accept: */*
200Success
{
  "results": [
    {
      "auto_present": false,
      "auto_remove": false,
      "auto_verify": true,
      "by_format": {
        "pres": {},
        "pres_proposal": {},
        "pres_request": {}
      },
      "connection_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "created_at": "2021-12-31T23:59:59Z",
      "error_msg": "Invalid structure",
      "initiator": "self",
      "pres": {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "@type": "https://didcomm.org/my-family/1.0/my-message-type",
        "comment": "text",
        "formats": [
          {
            "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
            "format": "dif/presentation-exchange/submission@v1.0"
          }
        ],
        "presentations~attach": [
          {
            "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
            "byte_count": 1234,
            "data": {
              "base64": "ey4uLn0=",
              "json": "{\"sample\": \"content\"}",
              "jws": {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0",
                "signatures": [
                  {
                    "header": {
                      "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                    },
                    "protected": "ey4uLn0",
                    "signature": "ey4uLn0"
                  }
                ]
              },
              "links": [
                "https://link.to/data"
              ],
              "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
            },
            "description": "view from doorway, facing east, with lights off",
            "filename": "IMG1092348.png",
            "lastmod_time": "2021-12-31T23:59:59Z",
            "mime-type": "image/png"
          }
        ]
      },
      "pres_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "pres_proposal": {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "@type": "https://didcomm.org/my-family/1.0/my-message-type",
        "comment": "text",
        "formats": [
          {
            "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
            "format": "dif/presentation-exchange/submission@v1.0"
          }
        ],
        "proposals~attach": [
          {
            "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
            "byte_count": 1234,
            "data": {
              "base64": "ey4uLn0=",
              "json": "{\"sample\": \"content\"}",
              "jws": {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0",
                "signatures": [
                  {
                    "header": {
                      "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                    },
                    "protected": "ey4uLn0",
                    "signature": "ey4uLn0"
                  }
                ]
              },
              "links": [
                "https://link.to/data"
              ],
              "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
            },
            "description": "view from doorway, facing east, with lights off",
            "filename": "IMG1092348.png",
            "lastmod_time": "2021-12-31T23:59:59Z",
            "mime-type": "image/png"
          }
        ]
      },
      "pres_request": {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "@type": "https://didcomm.org/my-family/1.0/my-message-type",
        "comment": "text",
        "formats": [
          {
            "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
            "format": "dif/presentation-exchange/submission@v1.0"
          }
        ],
        "request_presentations~attach": [
          {
            "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
            "byte_count": 1234,
            "data": {
              "base64": "ey4uLn0=",
              "json": "{\"sample\": \"content\"}",
              "jws": {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0",
                "signatures": [
                  {
                    "header": {
                      "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                    },
                    "protected": "ey4uLn0",
                    "signature": "ey4uLn0"
                  }
                ]
              },
              "links": [
                "https://link.to/data"
              ],
              "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
            },
            "description": "view from doorway, facing east, with lights off",
            "filename": "IMG1092348.png",
            "lastmod_time": "2021-12-31T23:59:59Z",
            "mime-type": "image/png"
          }
        ],
        "will_confirm": true
      },
      "role": "prover",
      "state": "proposal-sent",
      "thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "trace": true,
      "updated_at": "2021-12-31T23:59:59Z",
      "verified": "true",
      "verified_msgs": [
        "text"
      ]
    }
  ]
}

Fetch credentials from wallet for presentation request

get
Path parameters
pres_ex_idstringRequired

Presentation exchange identifier

Example: {"value":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}Pattern: [a-fA-F0-9]{8}-[a-fA-F0-9]{4}-4[a-fA-F0-9]{3}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}
Query parameters
countstringOptional

Maximum number to retrieve

Example: {"value":"1"}Pattern: ^[1-9][0-9]*$
extra_querystringOptional

(JSON) object mapping referents to extra WQL queries

Example: {"value":"{\"0_drink_uuid\": {\"attr::drink::value\": \"martini\"}}"}Pattern: ^{\s*".*?"\s*:\s*{.*?}\s*(,\s*".*?"\s*:\s*{.*?}\s*)*\s*}$
referentstringOptional

Proof request referents of interest, comma-separated

Example: {"value":"1_name_uuid,2_score_uuid"}
startstringOptional

Start index

Example: {"value":"0"}Pattern: ^[0-9]*$
Responses
200Success
application/json
get
GET /present-proof-2.0/records/{pres_ex_id}/credentials HTTP/1.1
Host: 
Accept: */*
200Success
[
  {
    "cred_info": {
      "attrs": {
        "ANY_ADDITIONAL_PROPERTY": "alice"
      },
      "cred_def_id": "WgWxqztrNooG92RXvxSTWv:3:CL:20:tag",
      "cred_rev_id": "12345",
      "referent": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "rev_reg_id": "WgWxqztrNooG92RXvxSTWv:4:WgWxqztrNooG92RXvxSTWv:3:CL:20:tag:CL_ACCUM:0",
      "schema_id": "WgWxqztrNooG92RXvxSTWv:2:schema_name:1.0"
    },
    "interval": {
      "from": 1640995199,
      "to": 1640995199
    },
    "presentation_referents": [
      "1_age_uuid"
    ]
  }
]

List wallet DIDs

get
Query parameters
didstringOptional

DID of interest

Example: {"value":"did:peer:WgWxqztrNooG92RXvxSTWv"}Pattern: ^(did:sov:)?[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{21,22}$|^did:([a-zA-Z0-9_]+)(:[a-zA-Z0-9_.%-]+)?:([a-zA-Z0-9_.%-]+(:[a-zA-Z0-9_.%-]+)*)((;[a-zA-Z0-9_.:%-]+=[a-zA-Z0-9_.:%-]*)*)(\/[^#?]*)?([?][^#]*)?(\#.*)?$$
key_typestring · enumOptional

Key type to query for.

Example: {"value":"ed25519"}Possible values:
methodstringOptional

DID method to query for. e.g. sov to only fetch indy/sov DIDs

Example: {"value":"key"}
posturestring · enumOptional

Whether DID is current public DID, posted to ledger but current public DID, or local to the wallet

Example: {"value":"wallet_only"}Possible values:
verkeystringOptional

Verification key of interest

Example: {"value":"H3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV"}Pattern: ^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{43,44}$
Responses
200Success
application/json
get
GET /wallet/did HTTP/1.1
Host: 
Accept: */*
200Success
{
  "results": [
    {
      "did": "did:peer:WgWxqztrNooG92RXvxSTWv",
      "key_type": "ed25519",
      "metadata": {},
      "method": "sov",
      "posture": "wallet_only",
      "verkey": "H3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV"
    }
  ]
}

Retrieve an individual credential definition details

get
Path parameters
cred_def_idstringRequired

Credential definition identifier

Example: {"value":"did:(method):3:CL:20:tag"}
Responses
200Success
application/json
get
GET /anoncreds/credential-definition/{cred_def_id} HTTP/1.1
Host: 
Accept: */*
200Success
{
  "credential_definition": {
    "issuerId": "did:(method):WgWxqztrNooG92RXvxSTWv",
    "schemaId": "did:(method):2:schema_name:1.0",
    "tag": "default",
    "type": "CL",
    "value": {
      "primary": {
        "n": "0",
        "r": {},
        "rctxt": "0",
        "s": "0",
        "z": "0"
      },
      "revocation": {
        "g": "1 1F14F&ECB578F 2 095E45DDF417D",
        "g_dash": "1 1D64716fCDC00C 1 0C781960FA66E3D3 2 095E45DDF417D",
        "h": "1 16675DAE54BFAE8 2 095E45DD417D",
        "h0": "1 21E5EF9476EAF18 2 095E45DDF417D",
        "h1": "1 236D1D99236090 2 095E45DDF417D",
        "h2": "1 1C3AE8D1F1E277 2 095E45DDF417D",
        "h_cap": "1 1B2A32CF3167 1 2490FEBF6EE55 1 0000000000000000",
        "htilde": "1 1D8549E8C0F8 2 095E45DDF417D",
        "pk": "1 142CD5E5A7DC 1 153885BD903312 2 095E45DDF417D",
        "u": "1 0C430AAB2B4710 1 1CB3A0932EE7E 1 0000000000000000",
        "y": "1 153558BD903312 2 095E45DDF417D 1 0000000000000000"
      }
    }
  },
  "credential_definition_id": "did:(method):3:CL:20:tag",
  "credential_definitions_metadata": {},
  "resolution_metadata": {}
}

Verify a received presentation

post
Path parameters
pres_ex_idstringRequired

Presentation exchange identifier

Example: {"value":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}Pattern: [a-fA-F0-9]{8}-[a-fA-F0-9]{4}-4[a-fA-F0-9]{3}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}
Responses
200Success
application/json
post
POST /present-proof-2.0/records/{pres_ex_id}/verify-presentation HTTP/1.1
Host: 
Accept: */*
200Success
{
  "auto_present": false,
  "auto_remove": false,
  "auto_verify": true,
  "by_format": {
    "pres": {},
    "pres_proposal": {},
    "pres_request": {}
  },
  "connection_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "created_at": "2021-12-31T23:59:59Z",
  "error_msg": "Invalid structure",
  "initiator": "self",
  "pres": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "comment": "text",
    "formats": [
      {
        "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "format": "dif/presentation-exchange/submission@v1.0"
      }
    ],
    "presentations~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ]
  },
  "pres_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "pres_proposal": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "comment": "text",
    "formats": [
      {
        "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "format": "dif/presentation-exchange/submission@v1.0"
      }
    ],
    "proposals~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ]
  },
  "pres_request": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "comment": "text",
    "formats": [
      {
        "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "format": "dif/presentation-exchange/submission@v1.0"
      }
    ],
    "request_presentations~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ],
    "will_confirm": true
  },
  "role": "prover",
  "state": "proposal-sent",
  "thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "trace": true,
  "updated_at": "2021-12-31T23:59:59Z",
  "verified": "true",
  "verified_msgs": [
    "text"
  ]
}

Retrieve an individual schemas details

get
Path parameters
schema_idstringRequired

Schema identifier

Example: {"value":"did:(method):2:schema_name:1.0"}
Responses
200Success
application/json
get
GET /anoncreds/schema/{schema_id} HTTP/1.1
Host: 
Accept: */*
200Success
{
  "resolution_metadata": {},
  "schema": {
    "attrNames": [
      "score"
    ],
    "issuerId": "did:(method):WgWxqztrNooG92RXvxSTWv",
    "name": "Example schema",
    "version": "1.0"
  },
  "schema_id": "did:(method):2:schema_name:1.0",
  "schema_metadata": {}
}

Create a new connection invitation

post
Query parameters
auto_acceptbooleanOptional

Auto-accept connection (defaults to configuration)

create_unique_didbooleanOptional

Create unique DID for this invitation (default false)

multi_usebooleanOptional

Create invitation for multiple use (default false)

Body
acceptstring[]Optional

List of mime type in order of preference that should be use in responding to the message

Example: ["didcomm/aip1","didcomm/aip2;env=rfc19"]
aliasstringOptional

Alias for connection

Example: Barry
goalstringOptional

A self-attested string that the receiver may want to display to the user about the context-specific goal of the out-of-band message

Example: To issue a Faber College Graduate credential
goal_codestringOptional

A self-attested code the receiver may want to display to the user or use in automatically deciding what to do with the out-of-band message

Example: issue-vc
handshake_protocolsstring[]Optional

Handshake protocol to specify in invitation

mediation_idstringOptional

Identifier for active mediation record to be used

Example: 3fa85f64-5717-4562-b3fc-2c963f66afa6Pattern: [a-fA-F0-9]{8}-[a-fA-F0-9]{4}-4[a-fA-F0-9]{3}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}
metadataobjectOptional

Optional metadata to attach to the connection created with the invitation

my_labelstringOptional

Label for connection invitation

Example: Invitation to Barry
protocol_versionstringOptional

OOB protocol version

Example: 1.1
use_didstringOptional

DID to use in invitation

Example: did:example:123
use_did_methodstring · enumOptional

DID method to use in invitation

Example: did:peer:2Possible values:
use_public_didbooleanOptional

Whether to use public DID in invitation

Responses
200Success
application/json
post
POST /out-of-band/create-invitation HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 475

{
  "accept": [
    "didcomm/aip1",
    "didcomm/aip2;env=rfc19"
  ],
  "alias": "Barry",
  "attachments": [
    {
      "id": "attachment-0",
      "type": "present-proof"
    }
  ],
  "goal": "To issue a Faber College Graduate credential",
  "goal_code": "issue-vc",
  "handshake_protocols": [
    "https://didcomm.org/didexchange/1.0"
  ],
  "mediation_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "metadata": {},
  "my_label": "Invitation to Barry",
  "protocol_version": "1.1",
  "use_did": "did:example:123",
  "use_did_method": "did:peer:2",
  "use_public_did": false
}
200Success
{
  "created_at": "2021-12-31T23:59:59Z",
  "invi_msg_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "invitation": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "accept": [
      "didcomm/aip1",
      "didcomm/aip2;env=rfc19"
    ],
    "goal": "To issue a Faber College Graduate credential",
    "goal_code": "issue-vc",
    "handshake_protocols": [
      "https://didcomm.org/didexchange/1.0"
    ],
    "imageUrl": "http://192.168.56.101/img/logo.jpg",
    "label": "Bob",
    "requests~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ],
    "services": [
      {
        "did": "WgWxqztrNooG92RXvxSTWv",
        "id": "string",
        "recipientKeys": [
          "did:key:z6MkpTHR8VNsBxYAAWHut2Geadd9jSwuBV8xRoAnwWsdvktH"
        ],
        "routingKeys": [
          "did:key:z6MkpTHR8VNsBxYAAWHut2Geadd9jSwuBV8xRoAnwWsdvktH"
        ],
        "serviceEndpoint": "http://192.168.56.101:8020",
        "type": "string"
      },
      "did:sov:WgWxqztrNooG92RXvxSTWv"
    ]
  },
  "invitation_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "invitation_url": "https://example.com/endpoint?c_i=eyJAdHlwZSI6ICIuLi4iLCAiLi4uIjogIi4uLiJ9XX0=",
  "oob_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "state": "await_response",
  "trace": true,
  "updated_at": "2021-12-31T23:59:59Z"
}

Send issuer a credential request

post
Path parameters
cred_ex_idstringRequired

Credential exchange identifier

Example: {"value":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}Pattern: [a-fA-F0-9]{8}-[a-fA-F0-9]{4}-4[a-fA-F0-9]{3}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}
Body
auto_removebooleanOptional

Whether to remove the credential exchange record on completion (overrides --preserve-exchange-records configuration setting)

holder_didstringOptional

Holder DID to substitute for the credentialSubject.id

Example: did:key:ahsdkjahsdkjhaskjdhakjshdkajhsdkjahs
Responses
200Success
application/json
post
POST /issue-credential-2.0/records/{cred_ex_id}/send-request HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 80

{
  "auto_remove": true,
  "holder_did": "did:key:ahsdkjahsdkjhaskjdhakjshdkajhsdkjahs"
}
200Success
{
  "auto_issue": false,
  "auto_offer": false,
  "auto_remove": false,
  "by_format": {
    "cred_issue": {},
    "cred_offer": {},
    "cred_proposal": {},
    "cred_request": {}
  },
  "connection_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "created_at": "2021-12-31T23:59:59Z",
  "cred_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "cred_issue": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "comment": "text",
    "credentials~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ],
    "formats": [
      {
        "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "format": "aries/ld-proof-vc-detail@v1.0"
      }
    ],
    "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
  },
  "cred_offer": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "comment": "text",
    "credential_preview": {
      "@type": "issue-credential/2.0/credential-preview",
      "attributes": [
        {
          "mime-type": "image/jpeg",
          "name": "favourite_drink",
          "value": "martini"
        }
      ]
    },
    "formats": [
      {
        "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "format": "aries/ld-proof-vc-detail@v1.0"
      }
    ],
    "offers~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ],
    "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
  },
  "cred_preview": {
    "@type": "issue-credential/2.0/credential-preview",
    "attributes": [
      {
        "mime-type": "image/jpeg",
        "name": "favourite_drink",
        "value": "martini"
      }
    ]
  },
  "cred_proposal": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "comment": "text",
    "credential_preview": {
      "@type": "issue-credential/2.0/credential-preview",
      "attributes": [
        {
          "mime-type": "image/jpeg",
          "name": "favourite_drink",
          "value": "martini"
        }
      ]
    },
    "filters~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ],
    "formats": [
      {
        "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "format": "aries/ld-proof-vc-detail@v1.0"
      }
    ]
  },
  "cred_request": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "comment": "text",
    "formats": [
      {
        "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "format": "aries/ld-proof-vc-detail@v1.0"
      }
    ],
    "requests~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ]
  },
  "error_msg": "The front fell off",
  "initiator": "self",
  "parent_thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "role": "issuer",
  "state": "done",
  "thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "trace": true,
  "updated_at": "2021-12-31T23:59:59Z"
}

Store a received credential

post
Path parameters
cred_ex_idstringRequired

Credential exchange identifier

Example: {"value":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}Pattern: [a-fA-F0-9]{8}-[a-fA-F0-9]{4}-4[a-fA-F0-9]{3}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}
Body
credential_idstringOptional
Responses
200Success
application/json
post
POST /issue-credential-2.0/records/{cred_ex_id}/store HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 24

{
  "credential_id": "text"
}
200Success
{
  "cred_ex_record": {
    "auto_issue": false,
    "auto_offer": false,
    "auto_remove": false,
    "by_format": {
      "cred_issue": {},
      "cred_offer": {},
      "cred_proposal": {},
      "cred_request": {}
    },
    "connection_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "created_at": "2021-12-31T23:59:59Z",
    "cred_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "cred_issue": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "credentials~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ],
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/ld-proof-vc-detail@v1.0"
        }
      ],
      "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
    },
    "cred_offer": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "credential_preview": {
        "@type": "issue-credential/2.0/credential-preview",
        "attributes": [
          {
            "mime-type": "image/jpeg",
            "name": "favourite_drink",
            "value": "martini"
          }
        ]
      },
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/ld-proof-vc-detail@v1.0"
        }
      ],
      "offers~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ],
      "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
    },
    "cred_preview": {
      "@type": "issue-credential/2.0/credential-preview",
      "attributes": [
        {
          "mime-type": "image/jpeg",
          "name": "favourite_drink",
          "value": "martini"
        }
      ]
    },
    "cred_proposal": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "credential_preview": {
        "@type": "issue-credential/2.0/credential-preview",
        "attributes": [
          {
            "mime-type": "image/jpeg",
            "name": "favourite_drink",
            "value": "martini"
          }
        ]
      },
      "filters~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ],
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/ld-proof-vc-detail@v1.0"
        }
      ]
    },
    "cred_request": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/ld-proof-vc-detail@v1.0"
        }
      ],
      "requests~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ]
    },
    "error_msg": "The front fell off",
    "initiator": "self",
    "parent_thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "role": "issuer",
    "state": "done",
    "thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "trace": true,
    "updated_at": "2021-12-31T23:59:59Z"
  },
  "indy": {
    "created_at": "2021-12-31T23:59:59Z",
    "cred_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "cred_ex_indy_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "cred_id_stored": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "cred_request_metadata": {},
    "cred_rev_id": "12345",
    "rev_reg_id": "WgWxqztrNooG92RXvxSTWv:4:WgWxqztrNooG92RXvxSTWv:3:CL:20:tag:CL_ACCUM:0",
    "state": "active",
    "updated_at": "2021-12-31T23:59:59Z"
  },
  "ld_proof": {
    "created_at": "2021-12-31T23:59:59Z",
    "cred_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "cred_ex_ld_proof_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "cred_id_stored": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "state": "active",
    "updated_at": "2021-12-31T23:59:59Z"
  },
  "vc_di": {
    "auto_issue": false,
    "auto_offer": false,
    "auto_remove": false,
    "by_format": {
      "cred_issue": {},
      "cred_offer": {},
      "cred_proposal": {},
      "cred_request": {}
    },
    "connection_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "created_at": "2021-12-31T23:59:59Z",
    "cred_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "cred_issue": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "credentials~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ],
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/ld-proof-vc-detail@v1.0"
        }
      ],
      "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
    },
    "cred_offer": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "credential_preview": {
        "@type": "issue-credential/2.0/credential-preview",
        "attributes": [
          {
            "mime-type": "image/jpeg",
            "name": "favourite_drink",
            "value": "martini"
          }
        ]
      },
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/ld-proof-vc-detail@v1.0"
        }
      ],
      "offers~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ],
      "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
    },
    "cred_preview": {
      "@type": "issue-credential/2.0/credential-preview",
      "attributes": [
        {
          "mime-type": "image/jpeg",
          "name": "favourite_drink",
          "value": "martini"
        }
      ]
    },
    "cred_proposal": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "credential_preview": {
        "@type": "issue-credential/2.0/credential-preview",
        "attributes": [
          {
            "mime-type": "image/jpeg",
            "name": "favourite_drink",
            "value": "martini"
          }
        ]
      },
      "filters~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ],
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/ld-proof-vc-detail@v1.0"
        }
      ]
    },
    "cred_request": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/ld-proof-vc-detail@v1.0"
        }
      ],
      "requests~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ]
    },
    "error_msg": "The front fell off",
    "initiator": "self",
    "parent_thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "role": "issuer",
    "state": "done",
    "thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "trace": true,
    "updated_at": "2021-12-31T23:59:59Z"
  }
}

Sends a proof presentation

post
Path parameters
pres_ex_idstringRequired

Presentation exchange identifier

Example: {"value":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}Pattern: [a-fA-F0-9]{8}-[a-fA-F0-9]{4}-4[a-fA-F0-9]{3}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}
Body
anoncredsall ofOptional

Presentation specification for anoncreds

auto_removebooleanOptional

Whether to remove the presentation exchange record on completion (overrides --preserve-exchange-records configuration setting)

difall ofOptional

Optional Presentation specification for DIF, overrides the PresentationExchange record's PresRequest

indyall ofOptional

Presentation specification for indy

tracebooleanOptional

Record trace information, based on agent configuration

Responses
200Success
application/json
post
POST /present-proof-2.0/records/{pres_ex_id}/send-presentation HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 2418

{
  "anoncreds": {
    "requested_attributes": {
      "ANY_ADDITIONAL_PROPERTY": {
        "cred_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "revealed": true
      }
    },
    "requested_predicates": {
      "ANY_ADDITIONAL_PROPERTY": {
        "cred_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "timestamp": 1640995199
      }
    },
    "self_attested_attributes": {
      "ANY_ADDITIONAL_PROPERTY": "self_attested_value"
    },
    "trace": false
  },
  "auto_remove": true,
  "dif": {
    "issuer_id": "text",
    "presentation_definition": {
      "format": {
        "di_vc": {},
        "jwt": {},
        "jwt_vc": {},
        "jwt_vp": {},
        "ldp": {},
        "ldp_vc": {},
        "ldp_vp": {}
      },
      "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "input_descriptors": [
        {
          "constraints": {
            "fields": [
              {
                "filter": {
                  "const": null,
                  "enum": [],
                  "exclusiveMaximum": null,
                  "exclusiveMinimum": null,
                  "format": "text",
                  "maxLength": 1234,
                  "maximum": null,
                  "minLength": 1234,
                  "minimum": null,
                  "not": false,
                  "pattern": "text",
                  "type": "text"
                },
                "id": "text",
                "path": [
                  "text"
                ],
                "predicate": "required",
                "purpose": "text"
              }
            ],
            "is_holder": [
              {
                "directive": "required",
                "field_id": [
                  "3fa85f64-5717-4562-b3fc-2c963f66afa6"
                ]
              }
            ],
            "limit_disclosure": "text",
            "status_active": "required",
            "status_revoked": "required",
            "status_suspended": "required",
            "subject_is_issuer": "required"
          },
          "group": [
            "text"
          ],
          "id": "text",
          "metadata": {},
          "name": "text",
          "purpose": "text",
          "schema": {
            "oneof_filter": [
              [
                {
                  "uri": "https://www.w3.org/Test1#Test1"
                },
                {
                  "uri": "https://www.w3.org/Test2#Test2"
                }
              ],
              {
                "oneof_filter": [
                  [
                    {
                      "uri": "https://www.w3.org/Test1#Test1"
                    }
                  ],
                  [
                    {
                      "uri": "https://www.w3.org/Test2#Test2"
                    }
                  ]
                ]
              }
            ]
          }
        }
      ],
      "name": "text",
      "purpose": "text",
      "submission_requirements": [
        {
          "count": 1234,
          "from": "text",
          "from_nested": "[Circular Reference]",
          "max": 1234,
          "min": 1234,
          "name": "text",
          "purpose": "text",
          "rule": "all"
        }
      ]
    },
    "record_ids": {
      "<input descriptor id_1>": [
        "<record id_1>",
        "<record id_2>"
      ],
      "<input descriptor id_2>": [
        "<record id>"
      ]
    },
    "reveal_doc": {
      "@context": [
        "https://www.w3.org/2018/credentials/v1",
        "https://w3id.org/security/bbs/v1"
      ],
      "@explicit": true,
      "@requireAll": true,
      "credentialSubject": {
        "@explicit": true,
        "@requireAll": true,
        "Observation": [
          {
            "effectiveDateTime": {},
            "@explicit": true,
            "@requireAll": true
          }
        ]
      },
      "issuanceDate": {},
      "issuer": {},
      "type": [
        "VerifiableCredential",
        "LabReport"
      ]
    }
  },
  "indy": {
    "requested_attributes": {
      "ANY_ADDITIONAL_PROPERTY": {
        "cred_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "revealed": true
      }
    },
    "requested_predicates": {
      "ANY_ADDITIONAL_PROPERTY": {
        "cred_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "timestamp": 1640995199
      }
    },
    "self_attested_attributes": {
      "ANY_ADDITIONAL_PROPERTY": "self_attested_value"
    },
    "trace": false
  },
  "trace": true
}
200Success
{
  "auto_present": false,
  "auto_remove": false,
  "auto_verify": true,
  "by_format": {
    "pres": {},
    "pres_proposal": {},
    "pres_request": {}
  },
  "connection_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "created_at": "2021-12-31T23:59:59Z",
  "error_msg": "Invalid structure",
  "initiator": "self",
  "pres": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "comment": "text",
    "formats": [
      {
        "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "format": "dif/presentation-exchange/submission@v1.0"
      }
    ],
    "presentations~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ]
  },
  "pres_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "pres_proposal": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "comment": "text",
    "formats": [
      {
        "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "format": "dif/presentation-exchange/submission@v1.0"
      }
    ],
    "proposals~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ]
  },
  "pres_request": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "comment": "text",
    "formats": [
      {
        "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "format": "dif/presentation-exchange/submission@v1.0"
      }
    ],
    "request_presentations~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ],
    "will_confirm": true
  },
  "role": "prover",
  "state": "proposal-sent",
  "thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "trace": true,
  "updated_at": "2021-12-31T23:59:59Z",
  "verified": "true",
  "verified_msgs": [
    "text"
  ]
}

Deactivate a did:cheqd

post
Body
didstringRequired

DID to deactivate

Example: did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86Pattern: ^(did:cheqd:(testnet|mainnet):(?:(?:[a-zA-Z0-9]{21,22}|([a-z,0-9,-]{36,36}))*:)*((?:[a-zA-Z0-9]{21,22}|([a-z,0-9,-]{36,36}))+)((;[a-zA-Z0-9_.:%-]+=[a-zA-Z0-9_.:%-]*)*)([?][^#]*)?|did:cheqd:(testnet|mainnet):(?:(?:[a-zA-Z0-9]{21,22}|([a-z,0-9,-]{36,36}))*:)*((?:[a-zA-Z0-9]{21,22}|([a-z,0-9,-]{36,36}))+)/resources/([a-z,0-9,-]{36,36})([?][^#]*)?)$
optionsobjectOptional

Additional configuration options

Example: {"network":"testnet"}
Responses
200Success
application/json
post
POST /did/cheqd/deactivate HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 96

{
  "did": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
  "options": {
    "network": "testnet"
  }
}
200Success
{
  "did": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
  "didState": {
    "did": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
    "didDocument": {
      "authentication": [
        "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86#key-1"
      ],
      "controller": [
        "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86"
      ],
      "id": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
      "verificationMethod": [
        {
          "id": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86#key-1",
          "type": "Ed25519VerificationKey2020",
          "controller": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
          "publicKeyMultibase": "z6Mk..."
        }
      ]
    },
    "secret": {
      "signingResponse": [
        {
          "kid": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86#key-1",
          "signature": "SHFz..."
        }
      ]
    },
    "state": "finished"
  },
  "success": true
}

Update a did:cheqd

post
Body
didstringRequired

DID to update

Example: did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86Pattern: ^(did:cheqd:(testnet|mainnet):(?:(?:[a-zA-Z0-9]{21,22}|([a-z,0-9,-]{36,36}))*:)*((?:[a-zA-Z0-9]{21,22}|([a-z,0-9,-]{36,36}))+)((;[a-zA-Z0-9_.:%-]+=[a-zA-Z0-9_.:%-]*)*)([?][^#]*)?|did:cheqd:(testnet|mainnet):(?:(?:[a-zA-Z0-9]{21,22}|([a-z,0-9,-]{36,36}))*:)*((?:[a-zA-Z0-9]{21,22}|([a-z,0-9,-]{36,36}))+)/resources/([a-z,0-9,-]{36,36})([?][^#]*)?)$
didDocumentall ofRequired

DID Document to update

Example: {"authentication":["did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86#key-1"],"controller":["did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86"],"id":"did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86","service":[{"id":"did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86#service-1","type":"MessagingService","serviceEndpoint":["https://example.com/service"]}],"verificationMethod":[{"id":"did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86#key-1","type":"Ed25519VerificationKey2018","controller":"did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86","publicKeyMultibase":"z6Mk..."}]}
optionsobjectOptional

Additional configuration options

Example: {"network":"testnet"}
Responses
200Success
application/json
post
POST /did/cheqd/update HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 720

{
  "did": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
  "didDocument": {
    "authentication": [
      "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86#key-1"
    ],
    "controller": [
      "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86"
    ],
    "id": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
    "service": [
      {
        "id": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86#service-1",
        "type": "MessagingService",
        "serviceEndpoint": [
          "https://example.com/service"
        ]
      }
    ],
    "verificationMethod": [
      {
        "id": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86#key-1",
        "type": "Ed25519VerificationKey2018",
        "controller": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
        "publicKeyMultibase": "z6Mk..."
      }
    ]
  },
  "options": {
    "network": "testnet"
  }
}
200Success
{
  "did": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
  "didState": {
    "did": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
    "didDocument": {
      "authentication": [
        "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86#key-1"
      ],
      "controller": [
        "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86"
      ],
      "id": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
      "verificationMethod": [
        {
          "id": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86#key-1",
          "type": "Ed25519VerificationKey2020",
          "controller": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
          "publicKeyMultibase": "z6Mk..."
        }
      ]
    },
    "secret": {
      "signingResponse": [
        {
          "kid": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86#key-1",
          "signature": "SHFz..."
        }
      ]
    },
    "state": "finished"
  },
  "success": true
}

Create a did:cheqd

post
Body
featuresobjectOptional

Additional features to enable for the did.

Example: {}
optionsobjectOptional

Additional configuration options

Example: {"key_type":"ed25519","method_specific_id_algo":"uuid","network":"testnet"}
Responses
200Success
application/json
post
POST /did/cheqd/create HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 103

{
  "features": "{}",
  "options": {
    "key_type": "ed25519",
    "method_specific_id_algo": "uuid",
    "network": "testnet"
  }
}
200Success
{
  "did": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
  "didState": {
    "did": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
    "didDocument": {
      "authentication": [
        "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86#key-1"
      ],
      "controller": [
        "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86"
      ],
      "id": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
      "verificationMethod": [
        {
          "id": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86#key-1",
          "type": "Ed25519VerificationKey2020",
          "controller": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86",
          "publicKeyMultibase": "z6Mk..."
        }
      ]
    },
    "secret": {
      "signingResponse": [
        {
          "kid": "did:cheqd:testnet:099be283-4302-40cc-9850-22016bcd1d86#key-1",
          "signature": "SHFz..."
        }
      ]
    },
    "state": "finished"
  },
  "success": true,
  "verkey": "BnSWTUQmdYCewSGFrRUhT6LmKdcCcSzRGqWXMPnEP168"
}

Create a credential definition on the connected datastore

post
Body
Responses
200Success
application/json
post
POST /anoncreds/credential-definition HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 310

{
  "credential_definition": {
    "issuerId": "did:(method):WgWxqztrNooG92RXvxSTWv",
    "schemaId": "did:(method):2:schema_name:1.0",
    "tag": "default"
  },
  "options": {
    "create_transaction_for_endorser": false,
    "endorser_connection_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "revocation_registry_size": 1000,
    "support_revocation": true
  }
}
200Success
{
  "credential_definition_metadata": {},
  "credential_definition_state": {
    "credential_definition": {
      "issuerId": "did:(method):WgWxqztrNooG92RXvxSTWv",
      "schemaId": "did:(method):2:schema_name:1.0",
      "tag": "default",
      "type": "CL",
      "value": {
        "primary": {
          "n": "0",
          "r": {},
          "rctxt": "0",
          "s": "0",
          "z": "0"
        },
        "revocation": {
          "g": "1 1F14F&ECB578F 2 095E45DDF417D",
          "g_dash": "1 1D64716fCDC00C 1 0C781960FA66E3D3 2 095E45DDF417D",
          "h": "1 16675DAE54BFAE8 2 095E45DD417D",
          "h0": "1 21E5EF9476EAF18 2 095E45DDF417D",
          "h1": "1 236D1D99236090 2 095E45DDF417D",
          "h2": "1 1C3AE8D1F1E277 2 095E45DDF417D",
          "h_cap": "1 1B2A32CF3167 1 2490FEBF6EE55 1 0000000000000000",
          "htilde": "1 1D8549E8C0F8 2 095E45DDF417D",
          "pk": "1 142CD5E5A7DC 1 153885BD903312 2 095E45DDF417D",
          "u": "1 0C430AAB2B4710 1 1CB3A0932EE7E 1 0000000000000000",
          "y": "1 153558BD903312 2 095E45DDF417D 1 0000000000000000"
        }
      }
    },
    "credential_definition_id": "did:(method):3:CL:20:tag",
    "state": "finished"
  },
  "job_id": "text",
  "registration_metadata": {}
}

Sends a free presentation request not bound to any proposal

post
Body
auto_removebooleanOptional

Whether to remove the presentation exchange record on completion (overrides --preserve-exchange-records configuration setting)

auto_verifybooleanOptional

Verifier choice to auto-verify proof presentation

commentstringOptional
connection_idstringRequired

Connection identifier

Example: 3fa85f64-5717-4562-b3fc-2c963f66afa6
tracebooleanOptional

Whether to trace event (default false)

Responses
200Success
application/json
post
POST /present-proof-2.0/send-request HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 2482

{
  "auto_remove": true,
  "auto_verify": false,
  "comment": "text",
  "connection_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "presentation_request": {
    "anoncreds": {
      "name": "Proof request",
      "non_revoked": {
        "from": 1640995199,
        "to": 1640995199
      },
      "nonce": "1",
      "requested_attributes": {
        "ANY_ADDITIONAL_PROPERTY": {
          "name": "favouriteDrink",
          "names": [
            "age"
          ],
          "non_revoked": {
            "from": 1640995199,
            "to": 1640995199
          },
          "restrictions": [
            {
              "ANY_ADDITIONAL_PROPERTY": "did:(method):3:CL:20:tag"
            }
          ]
        }
      },
      "requested_predicates": {
        "ANY_ADDITIONAL_PROPERTY": {
          "name": "index",
          "non_revoked": {
            "from": 1640995199,
            "to": 1640995199
          },
          "p_type": ">=",
          "p_value": 1,
          "restrictions": [
            {
              "ANY_ADDITIONAL_PROPERTY": "did:(method):3:CL:20:tag"
            }
          ]
        }
      },
      "version": "1.0"
    },
    "dif": {
      "options": {
        "challenge": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "domain": "4jt78h47fh47"
      },
      "presentation_definition": {
        "format": {
          "di_vc": {},
          "jwt": {},
          "jwt_vc": {},
          "jwt_vp": {},
          "ldp": {},
          "ldp_vc": {},
          "ldp_vp": {}
        },
        "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "input_descriptors": [
          {
            "constraints": {
              "fields": [
                {
                  "filter": {
                    "const": null,
                    "enum": [],
                    "exclusiveMaximum": null,
                    "exclusiveMinimum": null,
                    "format": "text",
                    "maxLength": 1234,
                    "maximum": null,
                    "minLength": 1234,
                    "minimum": null,
                    "not": false,
                    "pattern": "text",
                    "type": "text"
                  },
                  "id": "text",
                  "path": [
                    "text"
                  ],
                  "predicate": "required",
                  "purpose": "text"
                }
              ],
              "is_holder": [
                {
                  "directive": "required",
                  "field_id": [
                    "3fa85f64-5717-4562-b3fc-2c963f66afa6"
                  ]
                }
              ],
              "limit_disclosure": "text",
              "status_active": "required",
              "status_revoked": "required",
              "status_suspended": "required",
              "subject_is_issuer": "required"
            },
            "group": [
              "text"
            ],
            "id": "text",
            "metadata": {},
            "name": "text",
            "purpose": "text",
            "schema": {
              "oneof_filter": [
                [
                  {
                    "uri": "https://www.w3.org/Test1#Test1"
                  },
                  {
                    "uri": "https://www.w3.org/Test2#Test2"
                  }
                ],
                {
                  "oneof_filter": [
                    [
                      {
                        "uri": "https://www.w3.org/Test1#Test1"
                      }
                    ],
                    [
                      {
                        "uri": "https://www.w3.org/Test2#Test2"
                      }
                    ]
                  ]
                }
              ]
            }
          }
        ],
        "name": "text",
        "purpose": "text",
        "submission_requirements": [
          "[Circular Reference]"
        ]
      },
      "ANY_ADDITIONAL_PROPERTY": "anything"
    },
    "indy": {
      "name": "Proof request",
      "non_revoked": {
        "from": 1640995199,
        "to": 1640995199
      },
      "nonce": "1",
      "requested_attributes": {
        "ANY_ADDITIONAL_PROPERTY": {
          "name": "favouriteDrink",
          "names": [
            "age"
          ],
          "non_revoked": {
            "from": 1640995199,
            "to": 1640995199
          },
          "restrictions": [
            {
              "ANY_ADDITIONAL_PROPERTY": "WgWxqztrNooG92RXvxSTWv:3:CL:20:tag"
            }
          ]
        }
      },
      "requested_predicates": {
        "ANY_ADDITIONAL_PROPERTY": {
          "name": "index",
          "non_revoked": {
            "from": 1640995199,
            "to": 1640995199
          },
          "p_type": ">=",
          "p_value": 1,
          "restrictions": [
            {
              "ANY_ADDITIONAL_PROPERTY": "WgWxqztrNooG92RXvxSTWv:3:CL:20:tag"
            }
          ]
        }
      },
      "version": "1.0"
    }
  },
  "trace": false
}
200Success
{
  "auto_present": false,
  "auto_remove": false,
  "auto_verify": true,
  "by_format": {
    "pres": {},
    "pres_proposal": {},
    "pres_request": {}
  },
  "connection_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "created_at": "2021-12-31T23:59:59Z",
  "error_msg": "Invalid structure",
  "initiator": "self",
  "pres": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "comment": "text",
    "formats": [
      {
        "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "format": "dif/presentation-exchange/submission@v1.0"
      }
    ],
    "presentations~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ]
  },
  "pres_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "pres_proposal": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "comment": "text",
    "formats": [
      {
        "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "format": "dif/presentation-exchange/submission@v1.0"
      }
    ],
    "proposals~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ]
  },
  "pres_request": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "comment": "text",
    "formats": [
      {
        "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "format": "dif/presentation-exchange/submission@v1.0"
      }
    ],
    "request_presentations~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ],
    "will_confirm": true
  },
  "role": "prover",
  "state": "proposal-sent",
  "thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "trace": true,
  "updated_at": "2021-12-31T23:59:59Z",
  "verified": "true",
  "verified_msgs": [
    "text"
  ]
}

Sends a proof presentation

post
Path parameters
pres_ex_idstringRequired

Presentation exchange identifier

Example: {"value":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}Pattern: [a-fA-F0-9]{8}-[a-fA-F0-9]{4}-4[a-fA-F0-9]{3}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}
Body
anoncredsall ofOptional

Presentation specification for anoncreds

auto_removebooleanOptional

Whether to remove the presentation exchange record on completion (overrides --preserve-exchange-records configuration setting)

difall ofOptional

Optional Presentation specification for DIF, overrides the PresentationExchange record's PresRequest

indyall ofOptional

Presentation specification for indy

tracebooleanOptional

Record trace information, based on agent configuration

Responses
200Success
application/json
post
POST /present-proof-2.0/records/{pres_ex_id}/send-presentation HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 2418

{
  "anoncreds": {
    "requested_attributes": {
      "ANY_ADDITIONAL_PROPERTY": {
        "cred_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "revealed": true
      }
    },
    "requested_predicates": {
      "ANY_ADDITIONAL_PROPERTY": {
        "cred_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "timestamp": 1640995199
      }
    },
    "self_attested_attributes": {
      "ANY_ADDITIONAL_PROPERTY": "self_attested_value"
    },
    "trace": false
  },
  "auto_remove": true,
  "dif": {
    "issuer_id": "text",
    "presentation_definition": {
      "format": {
        "di_vc": {},
        "jwt": {},
        "jwt_vc": {},
        "jwt_vp": {},
        "ldp": {},
        "ldp_vc": {},
        "ldp_vp": {}
      },
      "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "input_descriptors": [
        {
          "constraints": {
            "fields": [
              {
                "filter": {
                  "const": null,
                  "enum": [],
                  "exclusiveMaximum": null,
                  "exclusiveMinimum": null,
                  "format": "text",
                  "maxLength": 1234,
                  "maximum": null,
                  "minLength": 1234,
                  "minimum": null,
                  "not": false,
                  "pattern": "text",
                  "type": "text"
                },
                "id": "text",
                "path": [
                  "text"
                ],
                "predicate": "required",
                "purpose": "text"
              }
            ],
            "is_holder": [
              {
                "directive": "required",
                "field_id": [
                  "3fa85f64-5717-4562-b3fc-2c963f66afa6"
                ]
              }
            ],
            "limit_disclosure": "text",
            "status_active": "required",
            "status_revoked": "required",
            "status_suspended": "required",
            "subject_is_issuer": "required"
          },
          "group": [
            "text"
          ],
          "id": "text",
          "metadata": {},
          "name": "text",
          "purpose": "text",
          "schema": {
            "oneof_filter": [
              [
                {
                  "uri": "https://www.w3.org/Test1#Test1"
                },
                {
                  "uri": "https://www.w3.org/Test2#Test2"
                }
              ],
              {
                "oneof_filter": [
                  [
                    {
                      "uri": "https://www.w3.org/Test1#Test1"
                    }
                  ],
                  [
                    {
                      "uri": "https://www.w3.org/Test2#Test2"
                    }
                  ]
                ]
              }
            ]
          }
        }
      ],
      "name": "text",
      "purpose": "text",
      "submission_requirements": [
        {
          "count": 1234,
          "from": "text",
          "from_nested": "[Circular Reference]",
          "max": 1234,
          "min": 1234,
          "name": "text",
          "purpose": "text",
          "rule": "all"
        }
      ]
    },
    "record_ids": {
      "<input descriptor id_1>": [
        "<record id_1>",
        "<record id_2>"
      ],
      "<input descriptor id_2>": [
        "<record id>"
      ]
    },
    "reveal_doc": {
      "@context": [
        "https://www.w3.org/2018/credentials/v1",
        "https://w3id.org/security/bbs/v1"
      ],
      "@explicit": true,
      "@requireAll": true,
      "credentialSubject": {
        "@explicit": true,
        "@requireAll": true,
        "Observation": [
          {
            "effectiveDateTime": {},
            "@explicit": true,
            "@requireAll": true
          }
        ]
      },
      "issuanceDate": {},
      "issuer": {},
      "type": [
        "VerifiableCredential",
        "LabReport"
      ]
    }
  },
  "indy": {
    "requested_attributes": {
      "ANY_ADDITIONAL_PROPERTY": {
        "cred_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "revealed": true
      }
    },
    "requested_predicates": {
      "ANY_ADDITIONAL_PROPERTY": {
        "cred_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "timestamp": 1640995199
      }
    },
    "self_attested_attributes": {
      "ANY_ADDITIONAL_PROPERTY": "self_attested_value"
    },
    "trace": false
  },
  "trace": true
}
200Success
{
  "auto_present": false,
  "auto_remove": false,
  "auto_verify": true,
  "by_format": {
    "pres": {},
    "pres_proposal": {},
    "pres_request": {}
  },
  "connection_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "created_at": "2021-12-31T23:59:59Z",
  "error_msg": "Invalid structure",
  "initiator": "self",
  "pres": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "comment": "text",
    "formats": [
      {
        "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "format": "dif/presentation-exchange/submission@v1.0"
      }
    ],
    "presentations~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ]
  },
  "pres_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "pres_proposal": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "comment": "text",
    "formats": [
      {
        "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "format": "dif/presentation-exchange/submission@v1.0"
      }
    ],
    "proposals~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ]
  },
  "pres_request": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "comment": "text",
    "formats": [
      {
        "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "format": "dif/presentation-exchange/submission@v1.0"
      }
    ],
    "request_presentations~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ],
    "will_confirm": true
  },
  "role": "prover",
  "state": "proposal-sent",
  "thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "trace": true,
  "updated_at": "2021-12-31T23:59:59Z",
  "verified": "true",
  "verified_msgs": [
    "text"
  ]
}

Create a schema on the connected datastore

post
Body
Responses
200Success
application/json
post
POST /anoncreds/schema HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 239

{
  "options": {
    "create_transaction_for_endorser": false,
    "endorser_connection_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
  },
  "schema": {
    "attrNames": [
      "score"
    ],
    "issuerId": "did:(method):WgWxqztrNooG92RXvxSTWv",
    "name": "Example schema",
    "version": "1.0"
  }
}
200Success
{
  "job_id": "text",
  "registration_metadata": {},
  "schema_metadata": {},
  "schema_state": {
    "schema": {
      "attrNames": [
        "score"
      ],
      "issuerId": "did:(method):WgWxqztrNooG92RXvxSTWv",
      "name": "Example schema",
      "version": "1.0"
    },
    "schema_id": "did:(method):2:schema_name:1.0",
    "state": "finished"
  }
}

Revoke an issued credential

post
Body
commentstringOptional

Optional comment to include in revocation notification

connection_idstringOptional

Connection ID to which the revocation notification will be sent; required if notify is true

Example: 3fa85f64-5717-4562-b3fc-2c963f66afa6Pattern: [a-fA-F0-9]{8}-[a-fA-F0-9]{4}-4[a-fA-F0-9]{3}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}
cred_ex_idstringOptional

Credential exchange identifier

Example: 3fa85f64-5717-4562-b3fc-2c963f66afa6Pattern: [a-fA-F0-9]{8}-[a-fA-F0-9]{4}-4[a-fA-F0-9]{3}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}
cred_rev_idstringOptional

Credential revocation identifier

Example: 12345Pattern: ^[1-9][0-9]*$
notifybooleanOptional

Send a notification to the credential recipient

notify_versionstring · enumOptional

Specify which version of the revocation notification should be sent

Possible values:
publishbooleanOptional

(True) publish revocation to ledger immediately, or (default, False) mark it pending

rev_reg_idstringOptional

Revocation registry identifier

Example: did:(method):4:did:<method>:3:CL:20:tag:CL_ACCUM:0Pattern: ^(.+$)
thread_idstringOptional

Thread ID of the credential exchange message thread resulting in the credential now being revoked; required if notify is true

Responses
200Success
application/json
Responseobject
post
POST /anoncreds/revocation/revoke HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 285

{
  "comment": "text",
  "connection_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "cred_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "cred_rev_id": "12345",
  "notify": true,
  "notify_version": "v1_0",
  "publish": true,
  "rev_reg_id": "did:(method):4:did:<method>:3:CL:20:tag:CL_ACCUM:0",
  "thread_id": "text"
}
200Success
{}

Create a new connection invitation

post
Query parameters
auto_acceptbooleanOptional

Auto-accept connection (defaults to configuration)

create_unique_didbooleanOptional

Create unique DID for this invitation (default false)

multi_usebooleanOptional

Create invitation for multiple use (default false)

Body
acceptstring[]Optional

List of mime type in order of preference that should be use in responding to the message

Example: ["didcomm/aip1","didcomm/aip2;env=rfc19"]
aliasstringOptional

Alias for connection

Example: Barry
goalstringOptional

A self-attested string that the receiver may want to display to the user about the context-specific goal of the out-of-band message

Example: To issue a Faber College Graduate credential
goal_codestringOptional

A self-attested code the receiver may want to display to the user or use in automatically deciding what to do with the out-of-band message

Example: issue-vc
handshake_protocolsstring[]Optional

Handshake protocol to specify in invitation

mediation_idstringOptional

Identifier for active mediation record to be used

Example: 3fa85f64-5717-4562-b3fc-2c963f66afa6Pattern: [a-fA-F0-9]{8}-[a-fA-F0-9]{4}-4[a-fA-F0-9]{3}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}
metadataobjectOptional

Optional metadata to attach to the connection created with the invitation

my_labelstringOptional

Label for connection invitation

Example: Invitation to Barry
protocol_versionstringOptional

OOB protocol version

Example: 1.1
use_didstringOptional

DID to use in invitation

Example: did:example:123
use_did_methodstring · enumOptional

DID method to use in invitation

Example: did:peer:2Possible values:
use_public_didbooleanOptional

Whether to use public DID in invitation

Responses
200Success
application/json
post
POST /out-of-band/create-invitation HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 475

{
  "accept": [
    "didcomm/aip1",
    "didcomm/aip2;env=rfc19"
  ],
  "alias": "Barry",
  "attachments": [
    {
      "id": "attachment-0",
      "type": "present-proof"
    }
  ],
  "goal": "To issue a Faber College Graduate credential",
  "goal_code": "issue-vc",
  "handshake_protocols": [
    "https://didcomm.org/didexchange/1.0"
  ],
  "mediation_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "metadata": {},
  "my_label": "Invitation to Barry",
  "protocol_version": "1.1",
  "use_did": "did:example:123",
  "use_did_method": "did:peer:2",
  "use_public_did": false
}
200Success
{
  "created_at": "2021-12-31T23:59:59Z",
  "invi_msg_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "invitation": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "accept": [
      "didcomm/aip1",
      "didcomm/aip2;env=rfc19"
    ],
    "goal": "To issue a Faber College Graduate credential",
    "goal_code": "issue-vc",
    "handshake_protocols": [
      "https://didcomm.org/didexchange/1.0"
    ],
    "imageUrl": "http://192.168.56.101/img/logo.jpg",
    "label": "Bob",
    "requests~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ],
    "services": [
      {
        "did": "WgWxqztrNooG92RXvxSTWv",
        "id": "string",
        "recipientKeys": [
          "did:key:z6MkpTHR8VNsBxYAAWHut2Geadd9jSwuBV8xRoAnwWsdvktH"
        ],
        "routingKeys": [
          "did:key:z6MkpTHR8VNsBxYAAWHut2Geadd9jSwuBV8xRoAnwWsdvktH"
        ],
        "serviceEndpoint": "http://192.168.56.101:8020",
        "type": "string"
      },
      "did:sov:WgWxqztrNooG92RXvxSTWv"
    ]
  },
  "invitation_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "invitation_url": "https://example.com/endpoint?c_i=eyJAdHlwZSI6ICIuLi4iLCAiLi4uIjogIi4uLiJ9XX0=",
  "oob_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "state": "await_response",
  "trace": true,
  "updated_at": "2021-12-31T23:59:59Z"
}

Receive a new connection invitation

post
Query parameters
aliasstringOptional

Alias for connection

Example: {"value":"Barry"}
auto_acceptbooleanOptional

Auto-accept connection (defaults to configuration)

mediation_idstringOptional

Identifier for active mediation record to be used

Example: {"value":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}Pattern: [a-fA-F0-9]{8}-[a-fA-F0-9]{4}-4[a-fA-F0-9]{3}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}
use_existing_connectionbooleanOptional

Use an existing connection, if possible

Body
@idstringOptional

Message identifier

Example: 3fa85f64-5717-4562-b3fc-2c963f66afa6
@typestringOptional

Message type

Example: https://didcomm.org/my-family/1.0/my-message-type
acceptstring[]Optional

List of mime type in order of preference

Example: ["didcomm/aip1","didcomm/aip2;env=rfc19"]
goalstringOptional

A self-attested string that the receiver may want to display to the user about the context-specific goal of the out-of-band message

Example: To issue a Faber College Graduate credential
goal_codestringOptional

A self-attested code the receiver may want to display to the user or use in automatically deciding what to do with the out-of-band message

Example: issue-vc
handshake_protocolsstring[]Optional

Handshake protocol

imageUrlstring · urlOptional

Optional image URL for out-of-band invitation

Example: http://192.168.56.101/img/logo.jpg
labelstringOptional

Optional label

Example: Bob
Responses
200Success
application/json
post
POST /out-of-band/receive-invitation HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 1305

{
  "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "@type": "https://didcomm.org/my-family/1.0/my-message-type",
  "accept": [
    "didcomm/aip1",
    "didcomm/aip2;env=rfc19"
  ],
  "goal": "To issue a Faber College Graduate credential",
  "goal_code": "issue-vc",
  "handshake_protocols": [
    "https://didcomm.org/didexchange/1.0"
  ],
  "imageUrl": "http://192.168.56.101/img/logo.jpg",
  "label": "Bob",
  "requests~attach": [
    {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "byte_count": 1234,
      "data": {
        "base64": "ey4uLn0=",
        "json": "{\"sample\": \"content\"}",
        "jws": {
          "header": {
            "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
          },
          "protected": "ey4uLn0",
          "signature": "ey4uLn0",
          "signatures": [
            {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0"
            }
          ]
        },
        "links": [
          "https://link.to/data"
        ],
        "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
      },
      "description": "view from doorway, facing east, with lights off",
      "filename": "IMG1092348.png",
      "lastmod_time": "2021-12-31T23:59:59Z",
      "mime-type": "image/png"
    }
  ],
  "services": [
    {
      "did": "WgWxqztrNooG92RXvxSTWv",
      "id": "string",
      "recipientKeys": [
        "did:key:z6MkpTHR8VNsBxYAAWHut2Geadd9jSwuBV8xRoAnwWsdvktH"
      ],
      "routingKeys": [
        "did:key:z6MkpTHR8VNsBxYAAWHut2Geadd9jSwuBV8xRoAnwWsdvktH"
      ],
      "serviceEndpoint": "http://192.168.56.101:8020",
      "type": "string"
    },
    "did:sov:WgWxqztrNooG92RXvxSTWv"
  ]
}
200Success
{
  "attach_thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "connection_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "created_at": "2021-12-31T23:59:59Z",
  "invi_msg_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "invitation": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "accept": [
      "didcomm/aip1",
      "didcomm/aip2;env=rfc19"
    ],
    "goal": "To issue a Faber College Graduate credential",
    "goal_code": "issue-vc",
    "handshake_protocols": [
      "https://didcomm.org/didexchange/1.0"
    ],
    "imageUrl": "http://192.168.56.101/img/logo.jpg",
    "label": "Bob",
    "requests~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ],
    "services": [
      {
        "did": "WgWxqztrNooG92RXvxSTWv",
        "id": "string",
        "recipientKeys": [
          "did:key:z6MkpTHR8VNsBxYAAWHut2Geadd9jSwuBV8xRoAnwWsdvktH"
        ],
        "routingKeys": [
          "did:key:z6MkpTHR8VNsBxYAAWHut2Geadd9jSwuBV8xRoAnwWsdvktH"
        ],
        "serviceEndpoint": "http://192.168.56.101:8020",
        "type": "string"
      },
      "did:sov:WgWxqztrNooG92RXvxSTWv"
    ]
  },
  "multi_use": true,
  "oob_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "our_recipient_key": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "role": "receiver",
  "state": "await-response",
  "their_service": {
    "recipientKeys": [
      "H3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV"
    ],
    "routingKeys": [
      "H3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV"
    ],
    "serviceEndpoint": "http://192.168.56.101:8020"
  },
  "trace": true,
  "updated_at": "2021-12-31T23:59:59Z"
}

Send holder a credential offer, independent of any proposal

post
Body
auto_issuebooleanOptional

Whether to respond automatically to credential requests, creating and issuing requested credentials

auto_removebooleanOptional

Whether to remove the credential exchange record on completion (overrides --preserve-exchange-records configuration setting)

commentstringOptional

Human-readable comment

connection_idstringRequired

Connection identifier

Example: 3fa85f64-5717-4562-b3fc-2c963f66afa6
filterall ofRequired

Credential specification criteria by format

replacement_idstringOptional

Optional identifier used to manage credential replacement

Example: 3fa85f64-5717-4562-b3fc-2c963f66afa6
tracebooleanOptional

Record trace information, based on agent configuration

Responses
200Success
application/json
post
POST /issue-credential-2.0/send-offer HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 1703

{
  "auto_issue": true,
  "auto_remove": true,
  "comment": "text",
  "connection_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "credential_preview": {
    "@type": "issue-credential/2.0/credential-preview",
    "attributes": [
      {
        "mime-type": "image/jpeg",
        "name": "favourite_drink",
        "value": "martini"
      }
    ]
  },
  "filter": {
    "anoncreds": {
      "cred_def_id": "did:(method):3:CL:20:tag",
      "issuer_id": "did:(method):WgWxqztrNooG92RXvxSTWv",
      "schema_id": "did:(method):2:schema_name:1.0",
      "schema_issuer_id": "did:(method):WgWxqztrNooG92RXvxSTWv",
      "schema_name": "preferences",
      "schema_version": "1.0"
    },
    "indy": {
      "cred_def_id": "WgWxqztrNooG92RXvxSTWv:3:CL:20:tag",
      "issuer_did": "WgWxqztrNooG92RXvxSTWv",
      "schema_id": "WgWxqztrNooG92RXvxSTWv:2:schema_name:1.0",
      "schema_issuer_did": "WgWxqztrNooG92RXvxSTWv",
      "schema_name": "preferences",
      "schema_version": "1.0"
    },
    "ld_proof": {
      "credential": {
        "@context": [
          "https://www.w3.org/2018/credentials/v1",
          "https://w3id.org/citizenship/v1"
        ],
        "credentialSubject": {
          "familyName": "SMITH",
          "gender": "Male",
          "givenName": "JOHN",
          "type": [
            "PermanentResident",
            "Person"
          ]
        },
        "description": "Government of Example Permanent Resident Card.",
        "identifier": "83627465",
        "issuanceDate": "2019-12-03T12:19:52Z",
        "issuer": "did:key:z6MkmjY8GnV5i9YTDtPETC2uUAW6ejw3nk5mXF5yci5ab7th",
        "name": "Permanent Resident Card",
        "type": [
          "VerifiableCredential",
          "PermanentResidentCard"
        ]
      },
      "options": {
        "proofType": "Ed25519Signature2018"
      },
      "ANY_ADDITIONAL_PROPERTY": "anything"
    },
    "vc_di": {
      "cred_def_id": "WgWxqztrNooG92RXvxSTWv:3:CL:20:tag",
      "issuer_did": "WgWxqztrNooG92RXvxSTWv",
      "schema_id": "WgWxqztrNooG92RXvxSTWv:2:schema_name:1.0",
      "schema_issuer_did": "WgWxqztrNooG92RXvxSTWv",
      "schema_name": "preferences",
      "schema_version": "1.0"
    }
  },
  "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "trace": true
}
200Success
{
  "auto_issue": false,
  "auto_offer": false,
  "auto_remove": false,
  "by_format": {
    "cred_issue": {},
    "cred_offer": {},
    "cred_proposal": {},
    "cred_request": {}
  },
  "connection_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "created_at": "2021-12-31T23:59:59Z",
  "cred_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "cred_issue": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "comment": "text",
    "credentials~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ],
    "formats": [
      {
        "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "format": "aries/ld-proof-vc-detail@v1.0"
      }
    ],
    "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
  },
  "cred_offer": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "comment": "text",
    "credential_preview": {
      "@type": "issue-credential/2.0/credential-preview",
      "attributes": [
        {
          "mime-type": "image/jpeg",
          "name": "favourite_drink",
          "value": "martini"
        }
      ]
    },
    "formats": [
      {
        "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "format": "aries/ld-proof-vc-detail@v1.0"
      }
    ],
    "offers~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ],
    "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
  },
  "cred_preview": {
    "@type": "issue-credential/2.0/credential-preview",
    "attributes": [
      {
        "mime-type": "image/jpeg",
        "name": "favourite_drink",
        "value": "martini"
      }
    ]
  },
  "cred_proposal": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "comment": "text",
    "credential_preview": {
      "@type": "issue-credential/2.0/credential-preview",
      "attributes": [
        {
          "mime-type": "image/jpeg",
          "name": "favourite_drink",
          "value": "martini"
        }
      ]
    },
    "filters~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ],
    "formats": [
      {
        "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "format": "aries/ld-proof-vc-detail@v1.0"
      }
    ]
  },
  "cred_request": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "comment": "text",
    "formats": [
      {
        "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "format": "aries/ld-proof-vc-detail@v1.0"
      }
    ],
    "requests~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ]
  },
  "error_msg": "The front fell off",
  "initiator": "self",
  "parent_thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "role": "issuer",
  "state": "done",
  "thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "trace": true,
  "updated_at": "2021-12-31T23:59:59Z"
}

Send issuer a credential request

post
Path parameters
cred_ex_idstringRequired

Credential exchange identifier

Example: {"value":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}Pattern: [a-fA-F0-9]{8}-[a-fA-F0-9]{4}-4[a-fA-F0-9]{3}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}
Body
auto_removebooleanOptional

Whether to remove the credential exchange record on completion (overrides --preserve-exchange-records configuration setting)

holder_didstringOptional

Holder DID to substitute for the credentialSubject.id

Example: did:key:ahsdkjahsdkjhaskjdhakjshdkajhsdkjahs
Responses
200Success
application/json
post
POST /issue-credential-2.0/records/{cred_ex_id}/send-request HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 80

{
  "auto_remove": true,
  "holder_did": "did:key:ahsdkjahsdkjhaskjdhakjshdkajhsdkjahs"
}
200Success
{
  "auto_issue": false,
  "auto_offer": false,
  "auto_remove": false,
  "by_format": {
    "cred_issue": {},
    "cred_offer": {},
    "cred_proposal": {},
    "cred_request": {}
  },
  "connection_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "created_at": "2021-12-31T23:59:59Z",
  "cred_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "cred_issue": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "comment": "text",
    "credentials~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ],
    "formats": [
      {
        "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "format": "aries/ld-proof-vc-detail@v1.0"
      }
    ],
    "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
  },
  "cred_offer": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "comment": "text",
    "credential_preview": {
      "@type": "issue-credential/2.0/credential-preview",
      "attributes": [
        {
          "mime-type": "image/jpeg",
          "name": "favourite_drink",
          "value": "martini"
        }
      ]
    },
    "formats": [
      {
        "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "format": "aries/ld-proof-vc-detail@v1.0"
      }
    ],
    "offers~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ],
    "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
  },
  "cred_preview": {
    "@type": "issue-credential/2.0/credential-preview",
    "attributes": [
      {
        "mime-type": "image/jpeg",
        "name": "favourite_drink",
        "value": "martini"
      }
    ]
  },
  "cred_proposal": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "comment": "text",
    "credential_preview": {
      "@type": "issue-credential/2.0/credential-preview",
      "attributes": [
        {
          "mime-type": "image/jpeg",
          "name": "favourite_drink",
          "value": "martini"
        }
      ]
    },
    "filters~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ],
    "formats": [
      {
        "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "format": "aries/ld-proof-vc-detail@v1.0"
      }
    ]
  },
  "cred_request": {
    "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "@type": "https://didcomm.org/my-family/1.0/my-message-type",
    "comment": "text",
    "formats": [
      {
        "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "format": "aries/ld-proof-vc-detail@v1.0"
      }
    ],
    "requests~attach": [
      {
        "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "byte_count": 1234,
        "data": {
          "base64": "ey4uLn0=",
          "json": "{\"sample\": \"content\"}",
          "jws": {
            "header": {
              "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
            },
            "protected": "ey4uLn0",
            "signature": "ey4uLn0",
            "signatures": [
              {
                "header": {
                  "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                },
                "protected": "ey4uLn0",
                "signature": "ey4uLn0"
              }
            ]
          },
          "links": [
            "https://link.to/data"
          ],
          "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
        },
        "description": "view from doorway, facing east, with lights off",
        "filename": "IMG1092348.png",
        "lastmod_time": "2021-12-31T23:59:59Z",
        "mime-type": "image/png"
      }
    ]
  },
  "error_msg": "The front fell off",
  "initiator": "self",
  "parent_thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "role": "issuer",
  "state": "done",
  "thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "trace": true,
  "updated_at": "2021-12-31T23:59:59Z"
}

Send holder a credential

post
Path parameters
cred_ex_idstringRequired

Credential exchange identifier

Example: {"value":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}Pattern: [a-fA-F0-9]{8}-[a-fA-F0-9]{4}-4[a-fA-F0-9]{3}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}
Body
commentstringOptional

Human-readable comment

Responses
200Success
application/json
post
POST /issue-credential-2.0/records/{cred_ex_id}/issue HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 18

{
  "comment": "text"
}
200Success
{
  "cred_ex_record": {
    "auto_issue": false,
    "auto_offer": false,
    "auto_remove": false,
    "by_format": {
      "cred_issue": {},
      "cred_offer": {},
      "cred_proposal": {},
      "cred_request": {}
    },
    "connection_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "created_at": "2021-12-31T23:59:59Z",
    "cred_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "cred_issue": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "credentials~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ],
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/ld-proof-vc-detail@v1.0"
        }
      ],
      "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
    },
    "cred_offer": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "credential_preview": {
        "@type": "issue-credential/2.0/credential-preview",
        "attributes": [
          {
            "mime-type": "image/jpeg",
            "name": "favourite_drink",
            "value": "martini"
          }
        ]
      },
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/ld-proof-vc-detail@v1.0"
        }
      ],
      "offers~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ],
      "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
    },
    "cred_preview": {
      "@type": "issue-credential/2.0/credential-preview",
      "attributes": [
        {
          "mime-type": "image/jpeg",
          "name": "favourite_drink",
          "value": "martini"
        }
      ]
    },
    "cred_proposal": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "credential_preview": {
        "@type": "issue-credential/2.0/credential-preview",
        "attributes": [
          {
            "mime-type": "image/jpeg",
            "name": "favourite_drink",
            "value": "martini"
          }
        ]
      },
      "filters~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ],
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/ld-proof-vc-detail@v1.0"
        }
      ]
    },
    "cred_request": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/ld-proof-vc-detail@v1.0"
        }
      ],
      "requests~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ]
    },
    "error_msg": "The front fell off",
    "initiator": "self",
    "parent_thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "role": "issuer",
    "state": "done",
    "thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "trace": true,
    "updated_at": "2021-12-31T23:59:59Z"
  },
  "indy": {
    "created_at": "2021-12-31T23:59:59Z",
    "cred_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "cred_ex_indy_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "cred_id_stored": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "cred_request_metadata": {},
    "cred_rev_id": "12345",
    "rev_reg_id": "WgWxqztrNooG92RXvxSTWv:4:WgWxqztrNooG92RXvxSTWv:3:CL:20:tag:CL_ACCUM:0",
    "state": "active",
    "updated_at": "2021-12-31T23:59:59Z"
  },
  "ld_proof": {
    "created_at": "2021-12-31T23:59:59Z",
    "cred_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "cred_ex_ld_proof_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "cred_id_stored": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "state": "active",
    "updated_at": "2021-12-31T23:59:59Z"
  },
  "vc_di": {
    "auto_issue": false,
    "auto_offer": false,
    "auto_remove": false,
    "by_format": {
      "cred_issue": {},
      "cred_offer": {},
      "cred_proposal": {},
      "cred_request": {}
    },
    "connection_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "created_at": "2021-12-31T23:59:59Z",
    "cred_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "cred_issue": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "credentials~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ],
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/ld-proof-vc-detail@v1.0"
        }
      ],
      "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
    },
    "cred_offer": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "credential_preview": {
        "@type": "issue-credential/2.0/credential-preview",
        "attributes": [
          {
            "mime-type": "image/jpeg",
            "name": "favourite_drink",
            "value": "martini"
          }
        ]
      },
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/ld-proof-vc-detail@v1.0"
        }
      ],
      "offers~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ],
      "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
    },
    "cred_preview": {
      "@type": "issue-credential/2.0/credential-preview",
      "attributes": [
        {
          "mime-type": "image/jpeg",
          "name": "favourite_drink",
          "value": "martini"
        }
      ]
    },
    "cred_proposal": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "credential_preview": {
        "@type": "issue-credential/2.0/credential-preview",
        "attributes": [
          {
            "mime-type": "image/jpeg",
            "name": "favourite_drink",
            "value": "martini"
          }
        ]
      },
      "filters~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ],
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/ld-proof-vc-detail@v1.0"
        }
      ]
    },
    "cred_request": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/ld-proof-vc-detail@v1.0"
        }
      ],
      "requests~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ]
    },
    "error_msg": "The front fell off",
    "initiator": "self",
    "parent_thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "role": "issuer",
    "state": "done",
    "thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "trace": true,
    "updated_at": "2021-12-31T23:59:59Z"
  }
}

Store a received credential

post
Path parameters
cred_ex_idstringRequired

Credential exchange identifier

Example: {"value":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}Pattern: [a-fA-F0-9]{8}-[a-fA-F0-9]{4}-4[a-fA-F0-9]{3}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}
Body
credential_idstringOptional
Responses
200Success
application/json
post
POST /issue-credential-2.0/records/{cred_ex_id}/store HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 24

{
  "credential_id": "text"
}
200Success
{
  "cred_ex_record": {
    "auto_issue": false,
    "auto_offer": false,
    "auto_remove": false,
    "by_format": {
      "cred_issue": {},
      "cred_offer": {},
      "cred_proposal": {},
      "cred_request": {}
    },
    "connection_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "created_at": "2021-12-31T23:59:59Z",
    "cred_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "cred_issue": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "credentials~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ],
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/ld-proof-vc-detail@v1.0"
        }
      ],
      "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
    },
    "cred_offer": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "credential_preview": {
        "@type": "issue-credential/2.0/credential-preview",
        "attributes": [
          {
            "mime-type": "image/jpeg",
            "name": "favourite_drink",
            "value": "martini"
          }
        ]
      },
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/ld-proof-vc-detail@v1.0"
        }
      ],
      "offers~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ],
      "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
    },
    "cred_preview": {
      "@type": "issue-credential/2.0/credential-preview",
      "attributes": [
        {
          "mime-type": "image/jpeg",
          "name": "favourite_drink",
          "value": "martini"
        }
      ]
    },
    "cred_proposal": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "credential_preview": {
        "@type": "issue-credential/2.0/credential-preview",
        "attributes": [
          {
            "mime-type": "image/jpeg",
            "name": "favourite_drink",
            "value": "martini"
          }
        ]
      },
      "filters~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ],
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/ld-proof-vc-detail@v1.0"
        }
      ]
    },
    "cred_request": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/ld-proof-vc-detail@v1.0"
        }
      ],
      "requests~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ]
    },
    "error_msg": "The front fell off",
    "initiator": "self",
    "parent_thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "role": "issuer",
    "state": "done",
    "thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "trace": true,
    "updated_at": "2021-12-31T23:59:59Z"
  },
  "indy": {
    "created_at": "2021-12-31T23:59:59Z",
    "cred_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "cred_ex_indy_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "cred_id_stored": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "cred_request_metadata": {},
    "cred_rev_id": "12345",
    "rev_reg_id": "WgWxqztrNooG92RXvxSTWv:4:WgWxqztrNooG92RXvxSTWv:3:CL:20:tag:CL_ACCUM:0",
    "state": "active",
    "updated_at": "2021-12-31T23:59:59Z"
  },
  "ld_proof": {
    "created_at": "2021-12-31T23:59:59Z",
    "cred_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "cred_ex_ld_proof_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "cred_id_stored": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "state": "active",
    "updated_at": "2021-12-31T23:59:59Z"
  },
  "vc_di": {
    "auto_issue": false,
    "auto_offer": false,
    "auto_remove": false,
    "by_format": {
      "cred_issue": {},
      "cred_offer": {},
      "cred_proposal": {},
      "cred_request": {}
    },
    "connection_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "created_at": "2021-12-31T23:59:59Z",
    "cred_ex_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "cred_issue": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "credentials~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ],
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/ld-proof-vc-detail@v1.0"
        }
      ],
      "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
    },
    "cred_offer": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "credential_preview": {
        "@type": "issue-credential/2.0/credential-preview",
        "attributes": [
          {
            "mime-type": "image/jpeg",
            "name": "favourite_drink",
            "value": "martini"
          }
        ]
      },
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/ld-proof-vc-detail@v1.0"
        }
      ],
      "offers~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ],
      "replacement_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
    },
    "cred_preview": {
      "@type": "issue-credential/2.0/credential-preview",
      "attributes": [
        {
          "mime-type": "image/jpeg",
          "name": "favourite_drink",
          "value": "martini"
        }
      ]
    },
    "cred_proposal": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "credential_preview": {
        "@type": "issue-credential/2.0/credential-preview",
        "attributes": [
          {
            "mime-type": "image/jpeg",
            "name": "favourite_drink",
            "value": "martini"
          }
        ]
      },
      "filters~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ],
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/ld-proof-vc-detail@v1.0"
        }
      ]
    },
    "cred_request": {
      "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "@type": "https://didcomm.org/my-family/1.0/my-message-type",
      "comment": "text",
      "formats": [
        {
          "attach_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "format": "aries/ld-proof-vc-detail@v1.0"
        }
      ],
      "requests~attach": [
        {
          "@id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
          "byte_count": 1234,
          "data": {
            "base64": "ey4uLn0=",
            "json": "{\"sample\": \"content\"}",
            "jws": {
              "header": {
                "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
              },
              "protected": "ey4uLn0",
              "signature": "ey4uLn0",
              "signatures": [
                {
                  "header": {
                    "kid": "did:sov:LjgpST2rjsoxYegQDRm7EL#keys-4"
                  },
                  "protected": "ey4uLn0",
                  "signature": "ey4uLn0"
                }
              ]
            },
            "links": [
              "https://link.to/data"
            ],
            "sha256": "617a48c7c8afe0521efdc03e5bb0ad9e655893e6b4b51f0e794d70fba132aacb"
          },
          "description": "view from doorway, facing east, with lights off",
          "filename": "IMG1092348.png",
          "lastmod_time": "2021-12-31T23:59:59Z",
          "mime-type": "image/png"
        }
      ]
    },
    "error_msg": "The front fell off",
    "initiator": "self",
    "parent_thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "role": "issuer",
    "state": "done",
    "thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "trace": true,
    "updated_at": "2021-12-31T23:59:59Z"
  }
}