With both a credential type and template defined, we can proceed to issue a credential.

1. Issue a Credential

First and foremost, the issuer must specify a valid recipient for the credential:

  • recipient (required): Issuer must specify a credential recipient. This can be done via email:${userEmail}:${chain} or {wallet address}.

In addition, the issuer must specify a credential object containing:

  • subject (required): Object matching a defined credential type’s schema, with values relevant to the recipient. The credential’s contents are identified by the “subject” key within the credential, following W3C naming standards.

The credential subject (credential.subject) must respect the schema of the chosen Verifiable Credential type. You cannot add additional fields, nor exclude any that were previously set.

  • expiresAt (required): Specify date, in form such as 2034-02-02 (ISO) or none to imply infinite expiration.
If you don’t include an expiration date, you must revoke the credential via burning to invalidate it.

Finally, the issuer can provide optional public metadata related to the specific credential, as such:

  • metadata (optional): NFT metadata is inherited from the VC template metadata. Metadata attributes can be set by the customer to override metadata definition inherited by baseURI.

To issue your first credential, copy the issueCredential.js file from below, add your API key, and templateId (that was returned to you in the previous step), and run the file from your terminal.

node issueCredential.js

2. Check the status of your credential

You can set up a webhook to know when the Verifiable Credential NFT minting is completed, or call the action status API with the returned actionId.

To check the template’s status you will need the nfts.create API scope and run the following code.

checkTemplateStatus.js
const actionId = "<YOUR_ACTION_ID>"; // Returned from previous step
const options = { method: "GET", headers: { "X-API-KEY": "<YOUR_API_KEY>" } };

fetch(`https://staging.crossmint.com/api/2022-06-09/actions/${actionId}`, options)
    .then((response) => response.json())
    .then((response) => console.log(response))
    .catch((err) => console.error(err));