Skip to main content
Version: v4

vt-flow protocol

vt-flow 1.0 is the DIDComm protocol through which an applicant agent and a validator agent run an onboarding process or a direct credential issuance. The on-chain part (participant entries) is done on the registry; vt-flow carries the off-chain part: the request, evidence collection, out-of-band steps, validation, and the credential issuance that follows. Normative source: the vt-flow protocol specification and the flow sections of the VS Agent specification.

Two flows​

FlowWhenOn-chain anchor
Onboarding processThe schema's onboarding mode for the requested role is an onboarding process (ecosystem or grantor).The applicant creates the participant entry in PENDING (StartParticipantOP) before connecting; the validator sets it to VALIDATED. A credential is issued only when the validated role is HOLDER.
Direct issuanceThe applicant already holds the participant entry (or the schema is permissionless for holders) and asks an authorized issuer for the credential.None beyond the issuer's accreditation.

In OPEN mode nothing runs over vt-flow: the applicant self-creates its participant entry on chain.

Messages​

MessageDirectionPurpose
onboarding-requestapplicant to validatorNames the pending participant entry (participant_session_id) and proposes claims. Resent unchanged after a reconnection.
issuance-requestapplicant to validatorAsks for a credential of a schema the applicant is entitled to.
oob-linkvalidator to applicantA link the applicant completes out of band (forms, documents, identity checks). Puts the flow in OOB_PENDING.
validatingvalidator to applicantThe validator resumed off-chain validation.
Issue Credential 2.0validator to applicantThe credential, once the entry is validated or the issuance request accepted.
CRED_STATE_CHANGEvalidator to applicantA later update, today REVOKED: the applicant removes the linked presentation and deletes the credential.

The validator accepts a connection from a not-yet-verifiable applicant only when a pending participant entry on an ECS schema names the validator, so the purpose is established from the registry and not from the peer's claim.

Flow states​

StateSideMeaning
AWAITING_OPapplicantWaiting for StartParticipantOP or RenewParticipantOP on chain
OR_SENT, IR_SENTapplicantRequest sent
AWAITING_OR, AWAITING_IRvalidatorRequest expected, or last one rejected
OOB_PENDINGbothAn out-of-band step is open
VALIDATINGbothOff-chain validation in progress
AWAITING_VALIDATION_TX, VALIDATION_TX_SUBMITTED, VALIDATION_TX_FAILEDvalidatorRefinements of validating around the SetParticipantOPToValidated transaction; the applicant sees none of them
VALIDATEDbothEntry validated on chain; terminal unless the role is HOLDER
VALIDATED_PENDING_CLAIMSvalidatorValidated, role HOLDER, claims missing or invalid; waits for editCredentialClaims then validateFlow
CRED_OFFEREDbothIssue Credential 2.0 in flight
COMPLETEDbothCredential accepted; the connection stays open for updates; a renewal re-enters from here
CRED_REVOKED, PARTICIPANT_REVOKED, PARTICIPANT_SLASHEDbothPost-issuance outcomes
TERMINATED_BY_VALIDATOR, TERMINATED_BY_APPLICANT, ERRORbothTerminal

Connection state is tracked separately: NOT_CONNECTED, ESTABLISHED, TERMINATED. After a reconnection the applicant resends its request with the same participant_session_id and the validator reassigns the flow to the new connection.

Where the Admin API drives it​

Validator side: listFlows, getFlow, editCredentialClaims, sendOobLink, startValidation, validateFlow, rejectFlow under /v2/vt/flows. Applicant side: the agent runs the flow itself once the on-chain entry exists, and reports through vt.flows.state-updated events.