Skip to main content
This reference documents all webhook events, their payloads, and possible status values.

Common Fields

All webhook events include these fields:
FieldTypeDescription
eventIdstringUnique event identifier (use for deduplication)
eventTypestringEvent type (see below)
timestampstringISO 8601 timestamp
projectIdstringYour project ID
dataobjectEvent-specific payload

INTENT_STATUS_CHANGED

Fired when an intent transitions to a new status.

Payload

{
  "eventId": "evt_abc123",
  "eventType": "INTENT_STATUS_CHANGED",
  "timestamp": "2026-03-29T10:00:00.000Z",
  "projectId": "proj_xyz789",
  "data": {
    "intentId": "int_def456",
    "customerId": "user-12345",
    "status": "COMPLIANCE_APPROVED",
    "previousStatus": "COMPLIANCE_IN_PROGRESS",
    "failureReason": null
  }
}

Status Values

StatusDescription
CREATEDIntent created, waiting to start compliance
COMPLIANCE_IN_PROGRESSCustomer completing onboarding/KYC
COMPLIANCE_APPROVEDCompliance passed
COMPLIANCE_FAILEDKYC/compliance rejected
PENDING_PAYMENTReady for transaction execution
TRANSACTION_IN_PROGRESSTransaction executing with provider
TRANSACTION_FAILEDTransaction failed at provider
COMPLETEDFunds settled successfully
EXPIREDIntent timed out
CANCELLEDIntent cancelled

Failure Reasons

When status is COMPLIANCE_FAILED or TRANSACTION_FAILED, the failureReason field contains details:
{
  "data": {
    "intentId": "int_def456",
    "status": "COMPLIANCE_FAILED",
    "failureReason": "KYC verification rejected - document expired"
  }
}

COMPLIANCE_UPDATED

Fired when a compliance requirement status changes.

Payload

{
  "eventId": "evt_ghi789",
  "eventType": "COMPLIANCE_UPDATED",
  "timestamp": "2026-03-29T10:01:00.000Z",
  "projectId": "proj_xyz789",
  "data": {
    "intentId": "int_def456",
    "customerId": "user-12345",
    "requirementCode": "KYC_VERIFICATION",
    "status": "COMPLETED",
    "previousStatus": "IN_PROGRESS"
  }
}

Status Values

StatusDescription
PENDINGRequirement not yet started
IN_PROGRESSUser actively completing requirement
COMPLETEDRequirement satisfied
FAILEDRequirement failed

MONEY_MOVEMENT_UPDATED

Fired when a transaction status changes.

Payload

{
  "eventId": "evt_jkl012",
  "eventType": "MONEY_MOVEMENT_UPDATED",
  "timestamp": "2026-03-29T10:05:00.000Z",
  "projectId": "proj_xyz789",
  "data": {
    "intentId": "int_def456",
    "customerId": "user-12345",
    "transactionId": "txn_mno345",
    "status": "SUCCESS",
    "previousStatus": "IN_PROGRESS"
  }
}

Status Values

StatusDescription
PENDINGTransaction created, waiting for user action
IN_PROGRESSProcessing (funds detected or transfer initiated)
SUCCESSTransaction completed successfully
FAILEDTransaction failed
CANCELLEDTransaction was cancelled

Example: Handling Events

app.post('/webhooks/gnosis-ramp', (req, res) => {
  verifyWebhook(req, process.env.CLIENT_SECRET);

  const { eventType, data, eventId } = req.body;

  // Check for duplicate
  if (await isDuplicate(eventId)) {
    return res.status(200).send('OK');
  }

  switch (eventType) {
    case 'INTENT_STATUS_CHANGED':
      await handleIntentStatusChange(data);
      break;

    case 'COMPLIANCE_UPDATED':
      await handleComplianceUpdate(data);
      break;

    case 'MONEY_MOVEMENT_UPDATED':
      await handleTransactionUpdate(data);
      break;
  }

  await markProcessed(eventId);
  res.status(200).send('OK');
});

async function handleIntentStatusChange({ intentId, status, failureReason }) {
  switch (status) {
    case 'COMPLETED':
      await notifyUser(intentId, 'Your transfer is complete!');
      break;
    case 'COMPLIANCE_FAILED':
    case 'TRANSACTION_FAILED':
      await notifyUser(intentId, `Transfer failed: ${failureReason}`);
      break;
  }
}

async function handleTransactionUpdate({ intentId, status }) {
  if (status === 'SUCCESS') {
    await updateOrderStatus(intentId, 'completed');
  }
}

Next Steps

Signature Verification

Secure your webhook endpoint.

Intent Overview

Understand intent state transitions.