Skip to main content
Version: v4

VS Agent events

The agent notifies a backend of state changes through one webhook, configured with EVENTS_WEBHOOK_URL. An event is a notification, not a state transfer: the Admin API records are the source of truth, and a consumer that misses an event reads the record. Source: specification section Events API.

Delivery​

  • One HTTP POST per event, body is the envelope, Content-Type: application/json.
  • Authorization: Bearer <EVENTS_WEBHOOK_API_KEY> when the key is set.
  • Any 2xx response is a completed delivery. Anything else is logged and may be retried.
  • Delivery never blocks DIDComm, flows or Admin API requests.
  • Order is best effort and a retry can duplicate a delivery. Deduplicate on id.
  • Events can carry personal data. Use https:// whenever the path to the consumer leaves the trusted network.

Envelope​

{
"id": "0b9df6f4-3f0e-4b3a-9c26-6a5f8e2d1c47",
"type": "didcomm.credential-exchanges.state-updated",
"timestamp": "2026-08-28T12:00:00Z",
"data": { "credentialExchangeId": "…", "state": "request-received", "previousState": "offer-sent" }
}

Types follow {scope}.{module}.{event}, mirroring the Admin API paths. Two kinds exist:

  • state-updated: a record was created or changed state. data is the record as the get method returns it, plus previousState (null on creation). Automated transitions (autoAccept) emit it too. Deletions do not.
  • *-received: an inbound DIDComm message arrived. data is the received content.

vpr.notification is the one exception: it reports a transaction observed on the registry through the indexer.

Catalog​

TypeTriggerdata
didcomm.connections.state-updatedConnection created or changedConnection record plus previousState
didcomm.basic-messages.message-receivedBasic message receivedMessage record
didcomm.receipts.message-receipts-receivedReceipts message receivedconnectionId, receipts[] with messageId, state, timestamp
didcomm.reactions.message-reactions-receivedReactions message receivedconnectionId, reactions[] with messageId, emoji, action, timestamp
didcomm.user-profile.profile-receivedProfile receivedconnectionId, threadId, profile, sendBackYours
didcomm.user-profile.request-profile-receivedProfile requestedconnectionId, threadId, query
didcomm.media-sharing.share-media-receivedMedia sharedconnectionId, threadId, description, items
didcomm.media-sharing.request-media-receivedMedia requestedconnectionId, threadId, description, itemIds
didcomm.calls.call-offer-receivedCall offeredconnectionId, threadId, callType, parameters, description, offerStartTime, offerExpirationTime
didcomm.calls.call-accept-receivedCall acceptedconnectionId, threadId, parameters
didcomm.calls.call-reject-receivedCall rejectedconnectionId, threadId
didcomm.calls.call-end-receivedCall endedconnectionId, threadId
didcomm.action-menu.menu-request-receivedMenu requestedconnectionId, threadId
didcomm.action-menu.perform-receivedMenu option performedconnectionId, threadId, name, params
didcomm.question-answer.answer-receivedAnswer receivedconnectionId, threadId, response
didcomm.mrtd.mrz-data-receivedMRZ data receivedconnectionId, threadId, mrzData
didcomm.mrtd.emrtd-data-receivedeMRTD data received and verifiedconnectionId, threadId, dataGroups
didcomm.mrtd.problem-report-receivedMRTD problem reportconnectionId, threadId, reason
didcomm.presentations.state-updatedPresentation record created or changedPresentation record plus previousState
didcomm.credential-exchanges.state-updatedCredential exchange created or changedCredential exchange record plus previousState
openid4vc.credential-exchanges.state-updatedOpenID4VCI issuance session changedSession record plus previousState
openid4vc.presentations.state-updatedOpenID4VP verification session changedSession record plus previousState
vt.flows.state-updatedA credential acquisition flow changed stateFlow record plus previousState
vpr.notificationThe agent processed an indexer transaction eventeventType, did, blockHeight, txHash, timestamp, payload (module, action, messageType, txIndex, messageIndex, sender, relatedDids, entityType, entityId), plus changes when resolved

vpr.notification is emitted for every processed indexer event even when the default handler of that event is disabled. A consumer that misses one recovers from the indexer's events endpoint with after_block_height: the indexer, not the agent, is the durable source of chain events.