Skip to main content

Signature verification

Webhook payloads are signed with HMAC-SHA256 using your endpoint secret. Always verify the signature before processing a payload.
const crypto = require('crypto');

function verifyWebhook(payload, signature, secret) {
  const expected = crypto
    .createHmac('sha256', secret)
    .update(payload)
    .digest('hex');
  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expected)
  );
}

// In your handler:
const signature = req.headers['x-multihopper-signature'];
const isValid = verifyWebhook(req.body, signature, whsec_secret);

Event types

EventDescription
transfer.quote_createdA transfer has been created and quoted
transfer.deposit_confirmedFunding transactions have been confirmed
transfer.processingTransfer is actively being processed
transfer.phase_changedTransfer moved to a new execution phase
transfer.hop_completeAn intermediate hop has completed
transfer.completedTransfer has arrived at the recipient
transfer.failedTransfer failed
transfer.expiredTransfer expired before funding was completed
transfer.refundedTransfer was refunded
transfer.recoverableTransfer failed with funds locked in on-chain accounts that can be rescued
transfer.rescuedLocked funds were successfully recovered to the sender
transfer.rent_reclaimedClosed on-chain step accounts; rent returned to sender
payout.completedAn integrator reward claim has settled

Retry schedule

If your endpoint fails to return a 2xx response, the event is retried on the following schedule:
AttemptDelayCumulative
1Immediate0s
230 seconds30s
35 minutes5m 30s
430 minutes35m 30s
52 hours2h 35m
After 5 failed attempts, the delivery is marked as permanently failed.