Affinidi Portal (Affinidi-hosted)

Affinidi offers a fully managed, hosted Control Plane for participant discovery and secure connections between individuals, businesses, and agents.

You can deploy with customisable configurations and choose from predefined appliance sizes to match your workload: Dev, Small, Medium, or Large.

Log in to the Affinidi Portal and follow these steps.

1. Create Control Plane configuration

  1. Log in to the Affinidi Portal and select the project where you want to set up the Control Plane. If you are new to the Affinidi Portal, it automatically creates a default project for you.

  2. Go to Affinidi Meeting Place in the left sidebar, then click Create configuration.

Affinidi Portal - Meeting Place

Create Meeting Place Configuration page

  1. Set the following details to create the instance.
FieldDescription
NameThe name for your Control Plane instance. If left blank, one will be autogenerated.
Description
[Optional]
A short note on the purpose of the Control Plane instance.
Appliance sizeThe compute size for your instance. Choose Dev, Small, Medium, or Large based on your expected workload. You cannot update this field after creation.

Review the configuration and click Create. Deployment typically takes 2–5 minutes.

Once deployment is complete, Affinidi Portal displays the following details.

FieldDescription
Control Plane DIDThe Decentralised Identifier (DID) for this instance. Pass this to the Meeting Place SDK as controlPlaneDid.
Control Plane URLThe Control Plane API server URL. Use this for direct REST API connections.

When Deployment Status shows Complete, open your Control Plane URL in a browser. The following page confirms your instance is active.

Control Plane API Server running

Control Plane API Server

2. Test the Control Plane connection

Use either approach below to confirm the server responds correctly.

2.1 Run the SDK client test

A running DIDComm Mediator is required for this test. See Mediator deployment options.

  1. Install Dart SDK version >=3.6.0.

  2. Create a new Dart project.

dart create my_project_name
  1. Add the required packages.
dart pub add meeting_place_control_plane
dart pub add ssi
  1. Create controlPlane.dart with the following code. Replace <REPLACE_CONTROLPLANE_DID> and <REPLACE_MEDIATOR_DID> with the values from the Affinidi Portal.
import 'package:meeting_place_control_plane/meeting_place_control_plane.dart';
import 'package:ssi/ssi.dart';

void main() async {
  final wallet = PersistentWallet(InMemoryKeyStore());

  final didManager = DidKeyManager(
    wallet: wallet,
    store: InMemoryDidStore(),
  );

  await didManager.addVerificationMethod(
    (await wallet.generateKey()).id,
  );

  final controlPlaneDid = '<REPLACE_CONTROLPLANE_DID>';
  final mediatorDid = '<REPLACE_MEDIATOR_DID>';

  final sdk = ControlPlaneSDK(
    didManager: didManager,
    controlPlaneDid: controlPlaneDid,
    mediatorDid: mediatorDid,
    didResolver: UniversalDIDResolver(),
  );

  final command = AuthenticateCommand(controlPlaneDid: controlPlaneDid);
  final result = await sdk.execute(command);
  print('Generated Access Token: ${result.credentials.accessToken}');
}

For the Affinidi-hosted Control Plane, the DID values are shown on the configuration page:

final controlPlaneDid = 'did:web:<UNIQUE_ID>:mpx.affinidi.io';
final mediatorDid = 'did:web:<UNIQUE_ID>.atlas.affinidi.io:.well-known';
  1. Run the script.
dart run controlPlane.dart

Successful output shows the access token generated after authentication.

2.2 Send a REST challenge request

Replace <CONTROLPLANE_URL> with the Control Plane URL from the Affinidi Portal.

curl -X POST \
  -H "Content-Type: application/json" \
  -d '{"did": "did:peer:<UNIQUE_ID>"}' \
  <CONTROLPLANE_URL>/v1/authenticate/challenge

Expected response:

{"challenge":"<JWT>"}

A challenge response confirms the server is accepting requests. For the full REST API reference, see the Control Plane OSS repository.

What’s next

  Integrate Affinidi Meeting Place into your applications

  Configure DIDComm Mediator to send messages