# Credentials

## Retrieve the list of issued credential offers

<mark style="color:green;">`GET`</mark> `/api/v1/vc/offers`

Retrieves the list of issued credential offers (no thid) or a specific offer (thid specified), either pending, accepted, or issued (point of view of Received or Issuer).

**Headers**

| Name          | Value                           |
| ------------- | ------------------------------- |
| Content-Type  | `application/json`              |
| Authorization | `apikey = {Alice or Bob's key}` |

**Query param**

| Name   | Type   | Description           |
| ------ | ------ | --------------------- |
| `thid` | string | The thid of the offer |

**Response**

{% tabs %}
{% tab title="200" %}

```json
{
"data": [
        {
            "recordId": "61faa8cb-7bc9-4c41-a0e5-7c10d81dd98f",
            "thid": "87323d88-51ec-424f-882a-a1f2655888db",
            "credentialFormat": "JWT",
            "validityPeriod": 3600,
            "claims": {
                "uid": "12345",
                "name": "Stable Diffusion SDXL"
            },
            "automaticIssuance": false,
            "createdAt": "2024-10-03T15:28:01.776806Z",
            "updatedAt": "2024-10-03T15:28:02.395132Z",
            "role": "Issuer",
            "protocolState": "OfferSent",
            "metaRetries": 5
        }
    ]
}
```

{% endtab %}

{% tab title="401" %}

```json
{
}
```

{% endtab %}
{% endtabs %}

## Get first Credential that matches a type&#x20;

point of view of Holder or Issuer

<mark style="color:green;">`GET`</mark> `/api/v1/vc/match/{type}`

**Headers**

| Name          | Value                           |
| ------------- | ------------------------------- |
| Content-Type  | `application/json`              |
| Authorization | `apikey = {Alice or Bob's key}` |

Params

| Name   | Type   | Description     |
| ------ | ------ | --------------- |
| `type` | string | the claim\_type |

**Response**

{% tabs %}
{% tab title="200" %}

```json
{
"data": {
        "recordId": "fde44892-7269-45fb-ab80-b88869450cd0",
        "vc": {
            "recordId": "fde44892-7269-45fb-ab80-b88869450cd0",
            "thid": "259caa16-25db-48d0-a0d9-4400818ab2e0",
            "credentialFormat": "JWT",
            "subjectId": "did:prism:ca602ff65d8021bb4b77cbce6df6917e0b062d73f8c5fb7d0d6c3cded5874d88",
            "claims": {
                "claim_type": "test",
                "object": "a simple test"
            },
            "createdAt": "2024-10-04T14:30:00.484157Z",
            "updatedAt": "2024-10-04T14:30:58.621911Z",
            "role": "Holder",
            "protocolState": "CredentialReceived",
            "credential": "ZXlKMGVYQWlPaUpLVjFRaUxDSmhiR2NpT2lKRlV6STFOa3NpZlEuZXlKcGMzTWlPaUprYVdRNmNISnBjMjA2WVRObFl6Y3hZVE01Wm1JMVltUTROMlF4T1Roa1lXTmhNVGM1TnpWbU5qTmpaalZpT1RVMk56YzBORGRsTlRjM05XRTVaV1JoWmpSak5XSXdORFE0WWpwRGJtOUxaVUpKTlVOblZuSmFXR3QwVFZKQlJWTnBORXREV0U1c1dUTkJlVTVVV25KTlVrbG9RV2M1VEMxa1UybExVRXBDVmpSWU9GQjNZa1pQTm1zemFtSlRlRlo0Y1ZOcFQyWnJTbVJXTnpkSVlXaEZhbk5MUWpJeGFHTXpVbXhqYWtGUlFWVnZkVU5uYkhwYVYwNTNUV3BWTW1GNlJWTkpVVTFwYjB0S05taHpWa0p4UlhkQ1VtdHplRzlxZVhkUGFIcDJSRm95U1RWaVZVcHZSalJxYUZOSFFUaEJJaXdpYzNWaUlqb2laR2xrT25CeWFYTnRPbU5oTmpBeVptWTJOV1E0TURJeFltSTBZamMzWTJKalpUWmtaalk1TVRkbE1HSXdOakprTnpObU9HTTFabUkzWkRCa05tTXpZMlJsWkRVNE56UmtPRGc2UTI1dlMyVkNTVFZEWjFaeVdsaHJkRTFvUVVWVGFUUkxRMWhPYkZrelFYbE9WRnB5VFZKSmFFRjZjak5pTFVwTU1HOHlRbVpmUWtsclRqTkZUWFJ5ZWprNFJHVTVXa2hPVm5WTmNVUnhRVU5LTW1jMFJXcHpTMEl5TVdoak0xSnNZMnBCVVVGVmIzVkRaMng2V2xkT2QwMXFWVEpoZWtWVFNWRk9kbGxMY1dWVGVXMW5kVUl5VUhoTGRGSnZWRmRzY1ZWelQwUkJhM0pQY1dGaE1FMVlZemxUWnpkbVFTSXNJbTVpWmlJNk1UY3lPREExTWpJMU5pd2laWGh3SWpveE56TXdOalEwTWpVMkxDSjJZeUk2ZXlKamNtVmtaVzUwYVdGc1UzVmlhbVZqZENJNmV5SmpiR0ZwYlY5MGVYQmxJam9pZEdWemRDSXNJbWxrSWpvaVpHbGtPbkJ5YVhOdE9tTmhOakF5Wm1ZMk5XUTRNREl4WW1JMFlqYzNZMkpqWlRaa1pqWTVNVGRsTUdJd05qSmtOek5tT0dNMVptSTNaREJrTm1NelkyUmxaRFU0TnpSa09EZzZRMjV2UzJWQ1NUVkRaMVp5V2xocmRFMW9RVVZUYVRSTFExaE9iRmt6UVhsT1ZGcHlUVkpKYUVGNmNqTmlMVXBNTUc4eVFtWmZRa2xyVGpORlRYUnllams0UkdVNVdraE9WblZOY1VSeFFVTktNbWMwUldwelMwSXlNV2hqTTFKc1kycEJVVUZWYjNWRFoyeDZXbGRPZDAxcVZUSmhla1ZUU1ZGT2RsbExjV1ZUZVcxbmRVSXlVSGhMZEZKdlZGZHNjVlZ6VDBSQmEzSlBjV0ZoTUUxWVl6bFRaemRtUVNJc0ltOWlhbVZqZENJNkltRWdjMmx0Y0d4bElIUmxjM1FpZlN3aWRIbHdaU0k2V3lKV1pYSnBabWxoWW14bFEzSmxaR1Z1ZEdsaGJDSmRMQ0pBWTI5dWRHVjRkQ0k2V3lKb2RIUndjenBjTDF3dmQzZDNMbmN6TG05eVoxd3ZNakF4T0Z3dlkzSmxaR1Z1ZEdsaGJITmNMM1l4SWwwc0ltbHpjM1ZsY2lJNkltUnBaRHB3Y21semJUcGhNMlZqTnpGaE16bG1ZalZpWkRnM1pERTVPR1JoWTJFeE56azNOV1kyTTJObU5XSTVOVFkzTnpRME4yVTFOemMxWVRsbFpHRm1OR00xWWpBME5EaGlPa051YjB0bFFrazFRMmRXY2xwWWEzUk5Va0ZGVTJrMFMwTllUbXhaTTBGNVRsUmFjazFTU1doQlp6bE1MV1JUYVV0UVNrSldORmc0VUhkaVJrODJhek5xWWxONFZuaHhVMmxQWm10S1pGWTNOMGhoYUVWcWMwdENNakZvWXpOU2JHTnFRVkZCVlc5MVEyZHNlbHBYVG5kTmFsVXlZWHBGVTBsUlRXbHZTMG8yYUhOV1FuRkZkMEpTYTNONGIycDVkMDlvZW5aRVdqSkpOV0pWU205R05HcG9VMGRCT0VFaUxDSmpjbVZrWlc1MGFXRnNVM1JoZEhWeklqcDdJbk4wWVhSMWMxQjFjbkJ2YzJVaU9pSlNaWFp2WTJGMGFXOXVJaXdpYzNSaGRIVnpUR2x6ZEVsdVpHVjRJam95Tml3aWFXUWlPaUpvZEhSd09sd3ZYQzlvYjNOMExtUnZZMnRsY2k1cGJuUmxjbTVoYkRvNE1UQXdYQzlqYkc5MVpDMWhaMlZ1ZEZ3dlkzSmxaR1Z1ZEdsaGJDMXpkR0YwZFhOY0x6azVOVFk1TWpnNExXTTJNR1V0TkdVd1ppMWhOREJtTFRBMU5ESXpOVEJsWldRMVlpTXlOaUlzSW5SNWNHVWlPaUpUZEdGMGRYTk1hWE4wTWpBeU1VVnVkSEo1SWl3aWMzUmhkSFZ6VEdsemRFTnlaV1JsYm5ScFlXd2lPaUpvZEhSd09sd3ZYQzlvYjNOMExtUnZZMnRsY2k1cGJuUmxjbTVoYkRvNE1UQXdYQzlqYkc5MVpDMWhaMlZ1ZEZ3dlkzSmxaR1Z1ZEdsaGJDMXpkR0YwZFhOY0x6azVOVFk1TWpnNExXTTJNR1V0TkdVd1ppMWhOREJtTFRBMU5ESXpOVEJsWldRMVlpSjlmWDAubmw1RnB6ZlJ1Z1FBZU5sdUNCM1drdnlITTcyUlBYNVE1d3NOYk5MalpGWFRTM0VjdE9tZE1nbll0YVVoMll3QmZ2WEZMQVQtWFZiVDNwRHFyR0s4TFE=",
            "metaRetries": 5
        }
    }
}
```

{% endtab %}

{% tab title="401" %}

```json
{
}
```

{% endtab %}
{% endtabs %}

## Create a credential offer without using a referenced schema

<mark style="color:green;">`POST`</mark> `/api/v1/vc/offer-noschema`

**Headers**

| Name          | Value                    |
| ------------- | ------------------------ |
| Content-Type  | `application/json`       |
| Authorization | `apikey = {Alice's key}` |

**Body**

| Name         | Type        | Description                                                  |
| ------------ | ----------- | ------------------------------------------------------------ |
| `connection` | string      | didComm connection\_id for exchanging request (offer/accept) |
| `author`     | string      | published short DID of author for this offer                 |
| `validity`   | number      | offer valid for x seconds                                    |
| `claims`     | string JSON | the claims to be issued in the VC                            |

**Response**

{% tabs %}
{% tab title="200" %}

```json
{
    "data": {
        "recordId": "61faa8cb-7bc9-4c41-a0e5-7c10d81dd98f",
        "thid": "87323d88-51ec-424f-882a-a1f2655888db",
        "credentialFormat": "JWT",
        "validityPeriod": 3600,
        "claims": {
            "uid": "12345",
            "name": "Stable Diffusion SDXL"
        },
        "automaticIssuance": false,
        "createdAt": "2024-10-03T15:28:01.77680643Z",
        "role": "Issuer",
        "protocolState": "OfferPending",
        "metaRetries": 5
    }
}
```

{% endtab %}

{% tab title="401" %}

```json
{
}
```

{% endtab %}
{% endtabs %}

## Accept an offer and issue the credential

<mark style="color:green;">`POST`</mark> `/api/v1/vc/accept`

\<Description of the endpoint>

**Headers**

| Name          | Value                  |
| ------------- | ---------------------- |
| Content-Type  | `application/json`     |
| Authorization | `apikey = {Bob's key}` |

**Body**

| Name       | Type   | Description                                                                |
| ---------- | ------ | -------------------------------------------------------------------------- |
| `recordId` | string | id of the pending offer to accept (compulsory / point of view of receiver) |
| `did`      | string | did of the holder                                                          |

**Response**

{% tabs %}
{% tab title="200" %}

```json
{
 "data": {
        "recordId": "5aa7a5ec-35dc-4327-8e06-d9f51952c8ec",
        "thid": "87323d88-51ec-424f-882a-a1f2655888db",
        "credentialFormat": "JWT",
        "subjectId": "did:prism:ca602ff65d8021bb4b77cbce6df6917e0b062d73f8c5fb7d0d6c3cded5874d88",
        "claims": {
            "uid": "12345",
            "name": "Stable Diffusion SDXL"
        },
        "createdAt": "2024-10-03T15:28:02.385192Z",
        "updatedAt": "2024-10-04T14:42:23.328716Z",
        "role": "Holder",
        "protocolState": "RequestPending",
        "metaRetries": 5
    }
}
```

{% endtab %}

{% tab title="401" %}

```json
{
}
```

{% endtab %}
{% endtabs %}

## Issue the credential to the holder

<mark style="color:green;">`POST`</mark> `/api/v1/vc/issue`

Finalizes the credential issuance for the offer and officially issues the credential.

**Headers**

| Name          | Value                    |
| ------------- | ------------------------ |
| Content-Type  | `application/json`       |
| Authorization | `apikey = {Alice's key}` |

**Body**

| Name       | Type   | Description                                                              |
| ---------- | ------ | ------------------------------------------------------------------------ |
| `recordId` | string | id of the pending offer to accept (compulsory / point of view of issuer) |

**Response**

{% tabs %}
{% tab title="200" %}

```json
{
  "data": {
        "recordId": "61faa8cb-7bc9-4c41-a0e5-7c10d81dd98f",
        "thid": "87323d88-51ec-424f-882a-a1f2655888db",
        "credentialFormat": "JWT",
        "validityPeriod": 3600,
        "claims": {
            "uid": "12345",
            "name": "Stable Diffusion SDXL"
        },
        "automaticIssuance": false,
        "createdAt": "2024-10-03T15:28:01.776806Z",
        "updatedAt": "2024-10-04T14:45:04.421Z",
        "role": "Issuer",
        "protocolState": "CredentialPending",
        "metaRetries": 5
    }
}
```

{% endtab %}

{% tab title="401" %}

```json
{
}
```

{% endtab %}
{% endtabs %}

## Create a Credentials offer, accept it, and issue it to holder

<mark style="color:green;">`POST`</mark> `/api/v1/vc/issuance/custodial`

A full offer + accept + issue vc (used in custodial mode)

**Headers**

| Name          | Value              |
| ------------- | ------------------ |
| Content-Type  | `application/json` |
| Authorization | `None`             |

**Body**

| Name          | Type        | Description                                                                  |
| ------------- | ----------- | ---------------------------------------------------------------------------- |
| `connection`  | string      | the connectionId between issuer and holder (compulsory)                      |
| `key_peer1`   | string      | apikey of peer 1 (issuer)                                                    |
| `key_peer2`   | string      | apikey of peer 2 (holder)                                                    |
| `did_peer1`   | string      | published short DID of issuer                                                |
| `did_peer2`   | string      | published short DID of holder                                                |
| `validity`    | number      | Note: does not work well in Identus...                                       |
| `claims`      | string JSON | the claims to be issued in the VC                                            |
| `noDuplicate` | boolean     | if true, will not duplicate issuance of same type, but will reuse latest one |

**Response**

{% tabs %}
{% tab title="200" %}

```json
{
    "data": {
        "wasOffered": true,
        "wasAccepted": true,
        "vc": {
            "recordId": "fde44892-7269-45fb-ab80-b88869450cd0",
            "thid": "259caa16-25db-48d0-a0d9-4400818ab2e0",
            "credentialFormat": "JWT",
            "subjectId": "did:prism:ca602ff65d8021bb4b77cbce6df6917e0b062d73f8c5fb7d0d6c3cded5874d88",
            "claims": {
                "claim_type": "test",
                "object": "a simple test"
            },
            "createdAt": "2024-10-04T14:30:00.484157Z",
            "updatedAt": "2024-10-04T14:30:58.621911Z",
            "role": "Holder",
            "protocolState": "CredentialReceived",
            "credential": "ZXlKMGVYQWlPaUpLVjFRaUxDSmhiR2NpT2lKRlV6STFOa3NpZlEuZXlKcGMzTWlPaUprYVdRNmNISnBjMjA2WVRObFl6Y3hZVE01Wm1JMVltUTROMlF4T1Roa1lXTmhNVGM1TnpWbU5qTmpaalZpT1RVMk56YzBORGRsTlRjM05XRTVaV1JoWmpSak5XSXdORFE0WWpwRGJtOUxaVUpKTlVOblZuSmFXR3QwVFZKQlJWTnBORXREV0U1c1dUTkJlVTVVV25KTlVrbG9RV2M1VEMxa1UybExVRXBDVmpSWU9GQjNZa1pQTm1zemFtSlRlRlo0Y1ZOcFQyWnJTbVJXTnpkSVlXaEZhbk5MUWpJeGFHTXpVbXhqYWtGUlFWVnZkVU5uYkhwYVYwNTNUV3BWTW1GNlJWTkpVVTFwYjB0S05taHpWa0p4UlhkQ1VtdHplRzlxZVhkUGFIcDJSRm95U1RWaVZVcHZSalJxYUZOSFFUaEJJaXdpYzNWaUlqb2laR2xrT25CeWFYTnRPbU5oTmpBeVptWTJOV1E0TURJeFltSTBZamMzWTJKalpUWmtaalk1TVRkbE1HSXdOakprTnpObU9HTTFabUkzWkRCa05tTXpZMlJsWkRVNE56UmtPRGc2UTI1dlMyVkNTVFZEWjFaeVdsaHJkRTFvUVVWVGFUUkxRMWhPYkZrelFYbE9WRnB5VFZKSmFFRjZjak5pTFVwTU1HOHlRbVpmUWtsclRqTkZUWFJ5ZWprNFJHVTVXa2hPVm5WTmNVUnhRVU5LTW1jMFJXcHpTMEl5TVdoak0xSnNZMnBCVVVGVmIzVkRaMng2V2xkT2QwMXFWVEpoZWtWVFNWRk9kbGxMY1dWVGVXMW5kVUl5VUhoTGRGSnZWRmRzY1ZWelQwUkJhM0pQY1dGaE1FMVlZemxUWnpkbVFTSXNJbTVpWmlJNk1UY3lPREExTWpJMU5pd2laWGh3SWpveE56TXdOalEwTWpVMkxDSjJZeUk2ZXlKamNtVmtaVzUwYVdGc1UzVmlhbVZqZENJNmV5SmpiR0ZwYlY5MGVYQmxJam9pZEdWemRDSXNJbWxrSWpvaVpHbGtPbkJ5YVhOdE9tTmhOakF5Wm1ZMk5XUTRNREl4WW1JMFlqYzNZMkpqWlRaa1pqWTVNVGRsTUdJd05qSmtOek5tT0dNMVptSTNaREJrTm1NelkyUmxaRFU0TnpSa09EZzZRMjV2UzJWQ1NUVkRaMVp5V2xocmRFMW9RVVZUYVRSTFExaE9iRmt6UVhsT1ZGcHlUVkpKYUVGNmNqTmlMVXBNTUc4eVFtWmZRa2xyVGpORlRYUnllams0UkdVNVdraE9WblZOY1VSeFFVTktNbWMwUldwelMwSXlNV2hqTTFKc1kycEJVVUZWYjNWRFoyeDZXbGRPZDAxcVZUSmhla1ZUU1ZGT2RsbExjV1ZUZVcxbmRVSXlVSGhMZEZKdlZGZHNjVlZ6VDBSQmEzSlBjV0ZoTUUxWVl6bFRaemRtUVNJc0ltOWlhbVZqZENJNkltRWdjMmx0Y0d4bElIUmxjM1FpZlN3aWRIbHdaU0k2V3lKV1pYSnBabWxoWW14bFEzSmxaR1Z1ZEdsaGJDSmRMQ0pBWTI5dWRHVjRkQ0k2V3lKb2RIUndjenBjTDF3dmQzZDNMbmN6TG05eVoxd3ZNakF4T0Z3dlkzSmxaR1Z1ZEdsaGJITmNMM1l4SWwwc0ltbHpjM1ZsY2lJNkltUnBaRHB3Y21semJUcGhNMlZqTnpGaE16bG1ZalZpWkRnM1pERTVPR1JoWTJFeE56azNOV1kyTTJObU5XSTVOVFkzTnpRME4yVTFOemMxWVRsbFpHRm1OR00xWWpBME5EaGlPa051YjB0bFFrazFRMmRXY2xwWWEzUk5Va0ZGVTJrMFMwTllUbXhaTTBGNVRsUmFjazFTU1doQlp6bE1MV1JUYVV0UVNrSldORmc0VUhkaVJrODJhek5xWWxONFZuaHhVMmxQWm10S1pGWTNOMGhoYUVWcWMwdENNakZvWXpOU2JHTnFRVkZCVlc5MVEyZHNlbHBYVG5kTmFsVXlZWHBGVTBsUlRXbHZTMG8yYUhOV1FuRkZkMEpTYTNONGIycDVkMDlvZW5aRVdqSkpOV0pWU205R05HcG9VMGRCT0VFaUxDSmpjbVZrWlc1MGFXRnNVM1JoZEhWeklqcDdJbk4wWVhSMWMxQjFjbkJ2YzJVaU9pSlNaWFp2WTJGMGFXOXVJaXdpYzNSaGRIVnpUR2x6ZEVsdVpHVjRJam95Tml3aWFXUWlPaUpvZEhSd09sd3ZYQzlvYjNOMExtUnZZMnRsY2k1cGJuUmxjbTVoYkRvNE1UQXdYQzlqYkc5MVpDMWhaMlZ1ZEZ3dlkzSmxaR1Z1ZEdsaGJDMXpkR0YwZFhOY0x6azVOVFk1TWpnNExXTTJNR1V0TkdVd1ppMWhOREJtTFRBMU5ESXpOVEJsWldRMVlpTXlOaUlzSW5SNWNHVWlPaUpUZEdGMGRYTk1hWE4wTWpBeU1VVnVkSEo1SWl3aWMzUmhkSFZ6VEdsemRFTnlaV1JsYm5ScFlXd2lPaUpvZEhSd09sd3ZYQzlvYjNOMExtUnZZMnRsY2k1cGJuUmxjbTVoYkRvNE1UQXdYQzlqYkc5MVpDMWhaMlZ1ZEZ3dlkzSmxaR1Z1ZEdsaGJDMXpkR0YwZFhOY0x6azVOVFk1TWpnNExXTTJNR1V0TkdVd1ppMWhOREJtTFRBMU5ESXpOVEJsWldRMVlpSjlmWDAubmw1RnB6ZlJ1Z1FBZU5sdUNCM1drdnlITTcyUlBYNVE1d3NOYk5MalpGWFRTM0VjdE9tZE1nbll0YVVoMll3QmZ2WEZMQVQtWFZiVDNwRHFyR0s4TFE=",
            "metaRetries": 5
        }
    }
}
```

{% endtab %}

{% tab title="400" %}

```json
{
  "error": "Invalid request"
}
```

{% endtab %}
{% endtabs %}
