# Credential Issuance

> Issue a Verifiable Credentials using Credential Issuance Service.

## Install Dependency

Package: affinidi_tdk_credential_issuance_client

```bash
dart pub add affinidi_tdk_credential_issuance_client
```

Check the latest version on [pub.dev](https://pub.dev/packages/affinidi_tdk_credential_issuance_client) or view the source on [GitHub](https://github.com/affinidi/affinidi-tdk-dart/tree/main/clients/credential_issuance_client).

## Classes and Methods

### Configuration API

Manage the issuance configuration for the project. Project only one issuance configuration.

#### createIssuanceConfig

Create an issuance configuration for the project.

Parameters

    createIssuanceConfigInput
    [CreateIssuanceConfigInput](https://github.com/affinidi/affinidi-tdk-dart/tree/main/clients/credential_issuance_client/doc/CreateIssuanceConfigInput.md)
    Required
  Details of the issuance configuration to create.

Example

```dart
import 'package:dio/dio.dart';
import 'package:built_collection/built_collection.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_issuance_client/affinidi_tdk_credential_issuance_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late ConfigurationApi configurationApi;

    final issuanceClient = AffinidiTdkCredentialIssuanceClient(
        dio: Dio(BaseOptions(
          baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
          connectTimeout: const Duration(seconds: 10),
          receiveTimeout: const Duration(seconds: 10),
        )),
        authTokenHook: authProvider.fetchProjectScopedToken);

      configurationApi = issuanceClient.getConfigurationApi();

      final name = "TestConfig";
      final description = "Test issuance config";
      final format = CreateIssuanceConfigInputFormatEnum.ldpVc;
      final credentialOfferDuration = 600;
      final metadata = SupportedCredentialMetadataBuilder()
        ..display = ListBuilder([
          SupportedCredentialMetadataDisplayInner((b) => b
            ..name = "Test Display"
            ..logo = (SupportedCredentialMetadataItemLogoBuilder()
              ..url = "https://example.com/logo.png"
              ..altText = "Logo"))
        ]);

        final credentialSupported = [
        CredentialSupportedObject((b) => b
          ..credentialTypeId = "SchemaOne"
          ..jsonSchemaUrl = "https://schema.affinidi.io/SchemaOne.json"
          ..jsonLdContextUrl = "https://schema.affinidi.io/SchemaOne.jsonld"
          ..metadata = metadata),

        CredentialSupportedObject((b) => b
          ..credentialTypeId = "SchemaTwo"
          ..jsonSchemaUrl = "https://schema.affinidi.io/SchemaTwo.json"
          ..jsonLdContextUrl = "https://schema.affinidi.io/SchemaTwo.jsonld"
          ..metadata = metadata),

        CredentialSupportedObject((b) => b
          ..credentialTypeId = "SchemaThree"
          ..jsonSchemaUrl = "https://schema.affinidi.io/SchemaThree.json"
          ..jsonLdContextUrl = "https://schema.affinidi.io/SchemaThree.jsonld"
          ..metadata = metadata),

        CredentialSupportedObject((b) => b
          ..credentialTypeId = "SchemaFour"
          ..jsonSchemaUrl = "https://schema.affinidi.io/SchemaFour.json"
          ..jsonLdContextUrl = "https://schema.affinidi.io/SchemaFour.jsonld"
          ..metadata = metadata),
      ];

      final configInputBuilder = CreateIssuanceConfigInputBuilder()
        ..issuerWalletId = ""
        ..name = name
        ..description = description
        ..format = format
        ..credentialOfferDuration = credentialOfferDuration
        ..credentialSupported = ListBuilder(credentialSupported);

      final response = (await configurationApi.createIssuanceConfig(createIssuanceConfigInput: configInputBuilder.build()));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

#### deleteIssuanceConfigById

Delete the issuance configuration by ID.

Parameters

    configurationId
    String
    Required
  ID of the issuance configuration to delete.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_issuance_client/affinidi_tdk_credential_issuance_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late ConfigurationApi configurationApi;

    final issuanceClient = AffinidiTdkCredentialIssuanceClient(
        dio: Dio(BaseOptions(
          baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
          connectTimeout: const Duration(seconds: 10),
          receiveTimeout: const Duration(seconds: 10),
        )),
        authTokenHook: authProvider.fetchProjectScopedToken);

      configurationApi = issuanceClient.getConfigurationApi();

    final configurationId = "";

    final response = (await configurationApi.deleteIssuanceConfigById(configurationId: configurationId));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

#### getIssuanceConfigById

Retrieves the issuance configuration details by ID.

Parameters

    configurationId
    String
    Required
  ID of the issuance configuration to retrieve.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_issuance_client/affinidi_tdk_credential_issuance_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late ConfigurationApi configurationApi;

    final issuanceClient = AffinidiTdkCredentialIssuanceClient(
        dio: Dio(BaseOptions(
          baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
          connectTimeout: const Duration(seconds: 10),
          receiveTimeout: const Duration(seconds: 10),
        )),
        authTokenHook: authProvider.fetchProjectScopedToken);

      configurationApi = issuanceClient.getConfigurationApi();

    final configurationId = "";

    final response = (await configurationApi.getIssuanceConfigById(configurationId: configurationId));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

#### getIssuanceConfigList

Get the list of issuance configurations for the current project.

No parameters required.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_issuance_client/affinidi_tdk_credential_issuance_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late ConfigurationApi configurationApi;

    final issuanceClient = AffinidiTdkCredentialIssuanceClient(
        dio: Dio(BaseOptions(
          baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
          connectTimeout: const Duration(seconds: 10),
          receiveTimeout: const Duration(seconds: 10),
        )),
        authTokenHook: authProvider.fetchProjectScopedToken);

      configurationApi = issuanceClient.getConfigurationApi();

    final response = (await configurationApi.getIssuanceConfigList());

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

#### updateIssuanceConfigById

Update the existing issuance configuration by ID.

Parameters

    configurationId
    String
    Required
  ID of the issuance configuration to update.

    updateIssuanceConfigInput
    [UpdateIssuanceConfigInput](https://github.com/affinidi/affinidi-tdk-dart/tree/main/clients/credential_issuance_client/doc/UpdateIssuanceConfigInput.md)
    Required
  Details to update in the issuance configuration.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_issuance_client/affinidi_tdk_credential_issuance_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late ConfigurationApi configurationApi;

    final issuanceClient = AffinidiTdkCredentialIssuanceClient(
        dio: Dio(BaseOptions(
          baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
          connectTimeout: const Duration(seconds: 10),
          receiveTimeout: const Duration(seconds: 10),
        )),
        authTokenHook: authProvider.fetchProjectScopedToken);

      configurationApi = issuanceClient.getConfigurationApi();

    final String updatedDescription = 'UpdatedDescription';
    final configurationId = "";

    final updateIssuanceConfigInput = UpdateIssuanceConfigInputBuilder()
        ..description = updatedDescription;

    final response = (await configurationApi.updateIssuanceConfigById(configurationId: configurationId, updateIssuanceConfigInput: updateIssuanceConfigInput.build())).data;

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

### Issuance API

Use to initiate issuance of the credential and check the status.

#### issuanceState

Retrieve the status of issuance.

Parameters

    issuanceId
    String
    Required
  ID of the initiated issuance.

    projectId
    String
    Required
  Project ID from where the issuance was initiated.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_issuance_client/affinidi_tdk_credential_issuance_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late IssuanceApi issuanceApi;

    final issuanceClient = AffinidiTdkCredentialIssuanceClient(
        dio: Dio(BaseOptions(
          baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
          connectTimeout: const Duration(seconds: 10),
          receiveTimeout: const Duration(seconds: 10),
        )),
        authTokenHook: authProvider.fetchProjectScopedToken);

      issuanceApi = issuanceClient.getIssuanceApi();

    final issuanceId = "";
    final projectId = "

";

    final response = (await issuanceApi.issuanceState(issuanceId: issuanceId, projectId: projectId));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

#### listIssuance

Get the list of issuances initiated in the project.

Parameters

    projectId
    String
    Required
  Project ID from where to list the issuances.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_issuance_client/affinidi_tdk_credential_issuance_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late IssuanceApi issuanceApi;

    final issuanceClient = AffinidiTdkCredentialIssuanceClient(
        dio: Dio(BaseOptions(
          baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
          connectTimeout: const Duration(seconds: 10),
          receiveTimeout: const Duration(seconds: 10),
        )),
        authTokenHook: authProvider.fetchProjectScopedToken);

      issuanceApi = issuanceClient.getIssuanceApi();

    final projectId = "

";

    final response = (await issuanceApi.listIssuance(projectId: projectId));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

#### startIssuance

Initiate the issuance of a credential.

Parameters

    projectId
    String
    Required
  Project ID from where to initiate the issuance.

    startIssuanceInput
    [StartIssuanceInput](https://github.com/affinidi/affinidi-tdk-dart/tree/main/clients/credential_issuance_client/doc/StartIssuanceInput.md)
    Required
  Details of the credentials to issue.

Example

```dart
import 'package:built_collection/built_collection.dart';
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_issuance_client/affinidi_tdk_credential_issuance_client.dart';
import 'package:dotenv/dotenv.dart';
import 'package:built_value/json_object.dart';

try {

    late IssuanceApi issuanceApi;

    final issuanceClient = AffinidiTdkCredentialIssuanceClient(
        dio: Dio(BaseOptions(
          baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
          connectTimeout: const Duration(seconds: 10),
          receiveTimeout: const Duration(seconds: 10),
        )),
        authTokenHook: authProvider.fetchProjectScopedToken);

      issuanceApi = issuanceClient.getIssuanceApi();

      final projectId =  "

";
      final credentialTypeId = "SchemaOne";

      final credentialData = {
         "first_name": "FirstName",
         "last_name": "LastName",
         "dob": "1970-01-01",
      };

      final credentialDataBuilder = MapBuilder(credentialData.map((key, value) => MapEntry(key, JsonObject(value))),);

      final data = StartIssuanceInputDataInnerBuilder()
        ..credentialTypeId = credentialTypeId
        ..credentialData.replace(credentialDataBuilder.build());

      final startIssuanceInput = StartIssuanceInputBuilder()
         ..holderDid = "did:key:holder-did-value"
         ..claimMode = StartIssuanceInputClaimModeEnum.FIXED_HOLDER
         ..data = ListBuilder([data.build()]);

      final response = (await issuanceApi.startIssuance(projectId: projectId, startIssuanceInput: startIssuanceInput.build()));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

### Credentials API

Issue a Verifiable Credentials to the users.

#### batchCredential

Allow digital wallets to claim multiple credentials at once.

Parameters

    projectId
    String
    Required
  Project ID from where you want to issue the credential.

    batchCredentialInput
    [BatchCredentialInput](https://github.com/affinidi/affinidi-tdk-dart/tree/main/clients/credential_issuance_client/doc/BatchCredentialInput.md)
    Required
  Details of the credentials to generate.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_issuance_client/affinidi_tdk_credential_issuance_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late CredentialsApi credentialsApi;

    final credentialsClient = AffinidiTdkCredentialIssuanceClient(
        dio: Dio(BaseOptions(
          baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
          connectTimeout: const Duration(seconds: 10),
          receiveTimeout: const Duration(seconds: 10),
        )),
        authTokenHook: authProvider.fetchProjectScopedToken);

      credentialsApi = credentialsClient.getCredentialsApi();

    final projectId =  "

";

    final proofType = CredentialProofProofTypeEnum.jwt;

    final proof = CredentialProofBuilder()
       ..proofType = proofType
       ..jwt = '

';

    final credentialRequests = ListBuilder();

    credentialRequests.add(
      BatchCredentialInputCredentialRequestsInner((b) => b
        ..credentialIdentifier = "credential_identifier"
        ..proof = proof));

    final batchCredentialInput = BatchCredentialInputBuilder()
        ..credentialRequests = credentialRequests;

    final response = (await credentialsApi.batchCredential(
      projectId: projectId, batchCredentialInput : batchCredentialInput.build()));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

#### generateCredentials

Generate and issue a credential offer to the user.

Parameters

    projectId
    String
    Required
  Project ID from where you want to issue the credential.

    createCredentialInput
    [CreateCredentialInput](https://github.com/affinidi/affinidi-tdk-dart/tree/main/clients/credential_issuance_client/doc/CreateCredentialInput.md)
    Required
  Details of the credential to generate.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_issuance_client/affinidi_tdk_credential_issuance_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late CredentialsApi credentialsApi;

    final credentialsClient = AffinidiTdkCredentialIssuanceClient(
        dio: Dio(BaseOptions(
          baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
          connectTimeout: const Duration(seconds: 10),
          receiveTimeout: const Duration(seconds: 10),
        )),
        authTokenHook: authProvider.fetchProjectScopedToken);

      credentialsApi = credentialsClient.getCredentialsApi();

    final projectId =  "

";

    final proofType = CredentialProofProofTypeEnum.jwt; 

    final proof = CredentialProofBuilder()
     .. proofType = proofType
     .. jwt = '

';

    final createCredentialInput = CreateCredentialInputBuilder()
      ..credentialIdentifier = "UniversityDegree-2024"
      ..proof = proof;

    final response = (await credentialsApi.generateCredentials(projectId: projectId, createCredentialInput: createCredentialInput.build()));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

#### getClaimedCredentials

Get claimed credentials in the specified range.

Parameters

    projectId
    String
    Required
  Project ID from where credentials were claimed.

    configurationId
    String
    Required
  Configuration ID for the issuance.

    rangeStartTime
    String
    Optional
  Start of the date range to filter credentials.

    rangeEndTime
    String
    Optional
  End of the date range to filter credentials.

    exclusiveStartKey
    String
    Optional
  Pagination key for the next page of results.

    limit
    Integer
    Optional
  Maximum number of records to return.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_issuance_client/affinidi_tdk_credential_issuance_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late CredentialsApi credentialsApi;

    final credentialsClient = AffinidiTdkCredentialIssuanceClient(
        dio: Dio(BaseOptions(
          baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
          connectTimeout: const Duration(seconds: 10),
          receiveTimeout: const Duration(seconds: 10),
        )),
        authTokenHook: authProvider.fetchProjectScopedToken);

      credentialsApi = credentialsClient.getCredentialsApi();

    final projectId =  "

";
    final configurationId =  "";
    final rangeStartTime =  "";
    final rangeEndTime   =  "";
    final exclusiveStartKey =  "";
    final limit =  10;

    final response = (await credentialsApi.getClaimedCredentials(
      projectId: projectId, configurationId : configurationId, rangeStartTime : rangeStartTime, rangeEndTime : rangeEndTime, exclusiveStartKey : exclusiveStartKey, limit: limit));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

### Default API

Revoke a revocable Verifiable Credentials issued to the users.

#### changeCredentialStatus

Updates the status of the credential (e.g., REVOKED).

Parameters

    projectId
    String
    Required
  Project ID from where the credential is issued.

    configurationId
    String
    Required
  Configuration ID from where the credential is issued.

    changeCredentialStatusInput
    [ChangeCredentialStatusInput](https://github.com/affinidi/affinidi-tdk-dart/tree/main/clients/credential_issuance_client/doc/ChangeCredentialStatusInput.md)
    Required
  Details of the credential to revoke.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_issuance_client/affinidi_tdk_credential_issuance_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late DefaultApi defaultApi;

    final defaultClient = AffinidiTdkCredentialIssuanceClient(
        dio: Dio(BaseOptions(
          baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
          connectTimeout: const Duration(seconds: 10),
          receiveTimeout: const Duration(seconds: 10),
        )),
        authTokenHook: authProvider.fetchProjectScopedToken);

      defaultApi = defaultClient.getDefaultApi();

    final projectId = "

";
    final configurationId = "";

    final changeCredentialStatusInput = ChangeCredentialStatusInputBuilder()
      ..changeReason = ChangeCredentialStatusInputChangeReasonEnum.INVALID_CREDENTIAL;

    final response = (await defaultApi.changeCredentialStatus(projectId: projectId, configurationId: configurationId, changeCredentialStatusInput: changeCredentialStatusInput.build()));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

#### listIssuanceDataRecords

Retrieves the list of records of revocable credentials.

Parameters

    projectId
    String
    Required
  Project ID from where the credential is issued.

    configurationId
    String
    Required
  Configuration ID from where the credential is issued.

    limit
    Integer
    Optional
  Maximum number of records to fetch in a list.

    exclusiveStartKey
    String
    Optional
  The base64url encoded key of the first item this operation will evaluate.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_issuance_client/affinidi_tdk_credential_issuance_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late DefaultApi defaultApi;

    final defaultClient = AffinidiTdkCredentialIssuanceClient(
        dio: Dio(BaseOptions(
          baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
          connectTimeout: const Duration(seconds: 10),
          receiveTimeout: const Duration(seconds: 10),
        )),
        authTokenHook: authProvider.fetchProjectScopedToken);

      defaultApi = defaultClient.getDefaultApi();

    final projectId = "

";
    final configurationId = "";

    final response = (await defaultApi.listIssuanceDataRecords(projectId: projectId, configurationId: configurationId));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

### Offer API

Used to get the credential offer initiated by the Issuance API.

#### getCredentialOffer

Retrieves the credential offer details.

Parameters

    projectId
    String
    Required
  Project ID from where the credential is issued.

    issuanceId
    String
    Required
  ID of the issuance initiated.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_issuance_client/affinidi_tdk_credential_issuance_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late OfferApi offerApi;

    final offerClient = AffinidiTdkCredentialIssuanceClient(
        dio: Dio(BaseOptions(
          baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
          connectTimeout: const Duration(seconds: 10),
          receiveTimeout: const Duration(seconds: 10),
        )),
        authTokenHook: authProvider.fetchProjectScopedToken);

      offerApi = offerClient.getOfferApi();

    final projectId = "

";
    final issuanceId = "";

    final response = (await offerApi.getCredentialOffer(issuanceId: issuanceId, projectId: projectId));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

### WellKnown API

Used to get the WellKnown OpenID Credential Issuer information.

#### getWellKnownOpenIdCredentialIssuer

Retrieves the credential issuer well-known configurations.

Parameters

    projectId
    String
    Required
  Project ID from where the credential is issued.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_issuance_client/affinidi_tdk_credential_issuance_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late WellKnownApi wellKnownApi;

    final wellKnownClient = AffinidiTdkCredentialIssuanceClient(
        dio: Dio(BaseOptions(
          baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
          connectTimeout: const Duration(seconds: 10),
          receiveTimeout: const Duration(seconds: 10),
        )),
        authTokenHook: authProvider.fetchProjectScopedToken);

      wellKnownApi = wellKnownClient.getWellKnownApi();

    final projectId = "

";

    final response = (await wellKnownApi.getWellKnownOpenIdCredentialIssuer(projectId: projectId));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```
