Every webhook has a type field you can switch on. Types follow a resource.action convention - subscribe to exact types, namespace wildcards (kyc.*), or everything (*).
KYC events
| Event | Description |
|---|
kyc.created | KYC record created for a user. |
kyc.status.changed | Verification status transitioned (for example pending → in_progress → review). |
kyc.completed | Verification passed. |
kyc.failed | Verification failed. data.reason explains. |
Example: kyc.completed
{
"id": "evt_01HX3ZJ...",
"type": "kyc.completed",
"tenantId": "tnt_01HX3Z8MQW...",
"data": {
"userId": "usr_01HX3ZAB...",
"status": "complete",
"result": {
"identity": "clear",
"document": "clear",
"liveness": "clear"
},
"completedAt": "2026-04-22T10:34:17.000Z"
},
"createdAt": "2026-04-22T10:34:18.000Z"
}
Transaction events
| Event | Description |
|---|
transaction.created | Transaction created. |
transaction.invited | Invitation delivered to counterparty. |
transaction.opened | Counterparty opened the invite link. |
transaction.accepted | Counterparty signed in and accepted. |
transaction.status.changed | Status transitioned - data.from and data.to name the change. |
transaction.disputed | Dispute opened. |
transaction.dispute.updated | Evidence added or note posted. |
transaction.deleted | Transaction removed before funding. |
Example: transaction.status.changed
{
"id": "evt_01HX3ZU...",
"type": "transaction.status.changed",
"tenantId": "tnt_01HX3Z8MQW...",
"data": {
"transactionId": "tx_01HX3ZM...",
"from": "accepted",
"to": "funded",
"changedBy": "usr_buyer_...",
"changedAt": "2026-04-22T11:40:02.000Z"
}
}
Source-of-funds events
| Event | Description |
|---|
source_of_funds.submitted | User submitted for review. |
source_of_funds.reviewed | Reviewer issued a decision. |
Example: source_of_funds.reviewed
{
"id": "evt_01HX3ZL...",
"type": "source_of_funds.reviewed",
"tenantId": "tnt_01HX3Z8MQW...",
"data": {
"userId": "usr_01HX3ZAB...",
"decision": "approved",
"reviewerNotes": "Bank statements match declared salary."
}
}
Document review events
| Event | Description |
|---|
document_review.submitted | Review created. |
document_review.approved | Reviewer approved. |
document_review.rejected | Reviewer rejected. |
document_review.revision_requested | Reviewer asked for more. |
Tenant events
| Event | Description |
|---|
tenant.created | Tenant provisioned. |
tenant.updated | Tenant settings changed. |
tenant.disabled | Tenant suspended. |
tenant.users.invite | User added to tenant via add-user or add-user-bulk. |
API key events
| Event | Description |
|---|
api_key.created | New key pair generated. |
api_key.revoked | Key pair revoked. |
api_key.regenerated | Key pair rotated. |
Payment events
| Event | Description |
|---|
payment_intent.succeeded | Funds captured. |
payment_intent.failed | Charge failed. data.reason explains. |
payment_method.attached | New method saved to a customer. |
payment_method.detached | Method removed. |
Pattern matching
You can subscribe to any mix of:
| Pattern | Matches |
|---|
kyc.completed | Exactly that one event. |
kyc.* | Every event starting with kyc. |
transaction.* | Every transaction event. |
* | Everything - useful for audit pipelines. |
Subscribing to * plus a handful of specific handlers is a common pattern: the specific handlers drive product logic, and the wildcard writes to an audit log.