--- description: >- Create a Decentralized Identifier (DID) with the did:cheqd DID method using cheqd Studio. --- # Create a DID In cheqd Studio, you can easily create and publish a `did:cheqd` DID to the **cheqd testnet or mainnet**, anchoring it on-ledger with associated public keys and metadata. This DID can then be used to: * Sign and issue verifiable credentials as an 'issuer'. * Establish a trusted identity on cheqd for entities like organisations, digital products or AI Agents. * Serve as the parent identifier for DID-Linked Resources (e.g. status lists, trust registries). This tutorial walks through the process of creating an Issuer DID using cheqd Studio's API or interface, including how to configure your keys, DID Document, and optional service endpoints. > 🔐 Once registered, the DID becomes publicly resolvable and forms the cryptographic foundation of your identity as an issuer in decentralized ecosystems. ## Step 1: Set up your account Make sure you have set up your account with **cheqd Studio** and have generated an API key to authenticate with our APIs, using our guides below:
Set Up Your AccountSet up your account with cheqd Studio and get your API key to start using the APIs.set-up-account.md
Create API KeysCreate one or more API keys used to authenticate with the cheqd Studio APIs.api-keys.md
## Step 2: Create a DID and associated DID Document Using the `/did/create` API, users have two options for creating a `did:cheqd` DID and associated DID Document on-ledger: 1. **Filling out a simple form** using the `application/x-www-url-form-encoded` or `application/json` option within an API client of your choice. 2. **Compiling a full DID Document body yourself** using the `application/json` option, using already created identity keys, within an API client of your choice. ### Option 1. Choose from a few variables and we will compile the DID for you This is the easiest way to create DIDs on cheqd and is recommended for users who are not overly familiar with compiling DID Documents. #### Using application/x-www-url-form-encoded Using the `application/x-www-url-form-encoded` option, users are able to choose between the following variables to compile your DID:
network (required) * "testnet" (recommended for testing) * "mainnet" (recommended for production)
identifierFormatType (required) * "uuid" - this is a Universally Unique Identifier (recommended) * "base58btc" - this is an identifier which is commonly used for Hyperledger Indy transactions
verificationMethodType (required) * "Ed25519VerificationKey2018" (recommended) * "Ed25519VerificationKey2020" * "JSONWebKey2020"
service (optional) This input field contains the required inputs for adding in a `service` section to the DID Document upon creation. ```json { "idFragment": "service-1", "type": "LinkedDomains", "serviceEndpoint": [ "https://example.com" ] } ```
From this request, cheqd Studio **will automatically create and publish a DID and associated DID Document to the ledger** and return it as a response.
Expected response format ```json { "did": "did:cheqd:testnet:ca029356-69dc-4cb4-a4c6-13b959ffaad6", "keys": [ { "kid": "1a07cb379cd6f2d9acddf9a6d6af4e930d5696818a38020bde2b6ead5cd85039", "kms": "postgres", "type": "Ed25519", "publicKeyHex": "1a07cb379cd6f2d9acddf9a6d6af4e930d5696818a38020bde2b6ead5cd85039", "meta": { "algorithms": [ "EdDSA", "Ed25519" ] }, "controller": "did:cheqd:testnet:ca029356-69dc-4cb4-a4c6-13b959ffaad6" } ], "services": [], "provider": "did:cheqd:testnet", "controllerKeyRefs": [ "1a07cb379cd6f2d9acddf9a6d6af4e930d5696818a38020bde2b6ead5cd85039" ], "controllerKeys": [ { "kid": "1a07cb379cd6f2d9acddf9a6d6af4e930d5696818a38020bde2b6ead5cd85039", "kms": "postgres", "type": "Ed25519", "publicKeyHex": "1a07cb379cd6f2d9acddf9a6d6af4e930d5696818a38020bde2b6ead5cd85039", "meta": { "algorithms": [ "EdDSA", "Ed25519" ] }, "controller": "did:cheqd:testnet:ca029356-69dc-4cb4-a4c6-13b959ffaad6" } ], "controllerKeyId": "1a07cb379cd6f2d9acddf9a6d6af4e930d5696818a38020bde2b6ead5cd85039" } ```
#### Using application/json Alternatively, you can use the `application/json` option and pass only a few specific inputs, for example: ```json { "network": "testnet", "identifierFormatType": "uuid", "options": { "verificationMethodType": "Ed25519VerificationKey2018" } } ``` Or, if you have [created a keypair already](create-identity-keys.md) that you want to use, you can reference the created key ID, `kid`, in the request: ```json { "network": "testnet", "identifierFormatType": "uuid", "options": { "key": "8255ddadd75695e01f3d98fcec8ccc7861a030b317d4326b0e48a4d579ddc43a", // Pass kid if you have created a key separately "verificationMethodType": "Ed25519VerificationKey2018" } } ``` {% hint style="info" %} Note that if you are passing a `kid` that is already created, you must also specify the `verificationMethodType` within `options`. {% endhint %} Using the `application/json` option, users are able to choose between the following variables to compile your DID:
network (required) * "testnet" (recommended for testing) * "mainnet" (recommended for production)
identifierFormatType (required) * "uuid" - this is a Universally Unique Identifier (recommended) * "base58btc" - this is an identifier which is commonly used for Hyperledger Indy transactions
verificationMethodType (required) * "Ed25519VerificationKey2018" (recommended) * "Ed25519VerificationKey2020" * "JSONWebKey2020" _Note that this should be nested under `options`_
key (optional) * "8255ddadd75695e01f3d98fcec8ccc7861a030b317d4326b0e48a4d579ddc43a" * This is a `kid` that should have been created using our [Key Create API](create-identity-keys.md). _Note that this should be nested under `options`_
### Option 2. Publish a fully compiled DID Document body yourself Instead of generating a DID Document using simple parameters, you can create a fully formatted DID Document yourself. Before, submitting a manually created DID, you will need to have [created a set of identity keys](create-subject-did.md) to input the key material into the DID document. #### Step 1: Create a new keypair Use the [`/key/create` API](create-subject-did.md) to generate a new keypair within the Credential Service key management store. Copy the `publicKeyHex`. #### Step 2 (option 1): Utilise the DID Document template helper To simplify this process of formatting a DID Document using your own keys, we've created a [Helper Tool in our DID Registrar here](https://did-registrar.cheqd.net/api-docs/#/Cheqd%20Helpers/get_did_document). Simply paste in your `publicKeyHex` and choose the variables to compile your DID Document template. #### Step 3: Paste the response Within the `/did/create` JSON payload, paste the response of your DID Document template, with your own signing keys. **Request format:** ```json { "didDocument": { "id": "did:cheqd:testnet:0ff9df5d-653b-4f77-a66c-0035abc34d63", "controller": [ "did:cheqd:testnet:0ff9df5d-653b-4f77-a66c-0035abc34d63" ], "verificationMethod": [ { "id": "did:cheqd:testnet:0ff9df5d-653b-4f77-a66c-0035abc34d63#key-1", "type": "JsonWebKey2020", "controller": "did:cheqd:testnet:0ff9df5d-653b-4f77-a66c-0035abc34d63", "publicKeyJwk": { "crv": "Ed25519", "kty": "OKP", "x": "BFSLOxwMJgpmWRtTUuo0JAvz6VXGp4WDDcN0dFfCQKo" } } ], "authentication": [ "did:cheqd:testnet:0ff9df5d-653b-4f77-a66c-0035abc34d63#key-1" ] } } ``` #### Step 2 (option 2) Use application/json options Alternatively, you can use the `application/json` request format below. You can use the `kid` created from Step 1 within the options section, and then compile the remainder of tour DID Document. ```json "options": { "key": "8255ddadd75695e01f3d98fcec8ccc7861a030b317d4326b0e48a4d579ddc43a", "verificationMethodType": "Ed25519VerificationKey2018" }, "didDocument": { "@context": [ "https://www.w3.org/ns/did/v1" ], "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0", "controller": [ "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0" ], "authentication": [ "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#key-1" ], "service": [ { "id": "did:cheqd:testnet:7bf81a20-633c-4cc7-bc4a-5a45801005e0#service-1", "type": "LinkedDomains", "serviceEndpoint": [ "https://example.com" ] } ] } } ``` ## Step 3: Hit execute on the API Hit execute on the API below to create your `did:cheqd` DID and associated DID Document. {% openapi-operation spec="cheqd-studio-api" path="/did/create" method="post" %} [Broken link](broken-reference) {% endopenapi-operation %} ## 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. {% openapi src="https://raw.githubusercontent.com/cheqd/credential-service/main/src/static/swagger-api.json" path="/did/list" method="get" expanded="true" %} [https://raw.githubusercontent.com/cheqd/credential-service/main/src/static/swagger-api.json](https://raw.githubusercontent.com/cheqd/credential-service/main/src/static/swagger-api.json) {% endopenapi %} ## Alternatives Below are a list of alternatives for creating cheqd DIDs.
CredoCredo is an SDK which supports the European Architecture and Reference Framework (ARF) standards as well as AnonCreds with full cheqd support for DIDs. credoCredo.png
ACA-PyACA-Py plugin supports full cheqd support for DIDs as well as Verifiable Credentials. aca-pyACA-Py.png
VeramoThe Veramo SDK Plugin supports JSON, JSON-LD credentials as well as cheqd Credential Payments in an SDK.veramoveramo logo.png
DID RegistrarSimple setup for building cheqd DIDs into existing applications using REST APIs, building into the Universal Registrar.did-registrarcheqd_logo_card.jpg
Walt.id Community StackWalt.id Community Stack is an SDK that supports the European Architecture and Reference Framework (ARF) standards for identity, with full cheqd support. walt-id.mdwalt.id logo.png
cheqd Cosmos CLICosmos CLI which directly communicates with the cheqd network. This should only be used for testing environments.cheqd-node-clicosmos and cheqd.png