Skip to content

Webhooks

Real-time event notifications for your application.

Overview

Webhooks deliver events to your application as they happen:

Event Types

Contract Events

EventDescription
contract.createdNew contract created
contract.activatedContract activated
contract.payment.receivedPayment received
contract.maturedContract reached maturity
contract.closedContract closed

KYC Events

EventDescription
kyc.submittedKYC submission received
kyc.verifiedKYC verified
kyc.rejectedKYC rejected
kyc.expiredKYC expired

Compliance Events

EventDescription
compliance.alertCompliance alert triggered
compliance.review.requiredManual review needed

Webhook Payload

json
{
  "id": "evt_abc123",
  "type": "contract.created",
  "created": "2024-01-15T10:30:00Z",
  "data": {
    "object": {
      "id": "contract_xyz",
      "type": "MURABAHA",
      "status": "draft"
    }
  },
  "metadata": {
    "workspaceId": "ws_123",
    "tenantId": "tenant_456"
  }
}

Creating Endpoints

typescript
const endpoint = await iof.webhooks.createEndpoint({
  url: "https://yourapp.com/webhooks",
  events: ["contract.*", "kyc.verified"],
  secret: "whsec_...",
});

Handling Webhooks

typescript
app.post("/webhooks", async (req, res) => {
  // Verify signature
  const isValid = iof.webhooks.verify(
    req.rawBody,
    req.headers["x-iof-signature"],
    process.env.WEBHOOK_SECRET,
  );

  if (!isValid) {
    return res.status(401).send("Invalid signature");
  }

  const event = req.body;

  switch (event.type) {
    case "contract.created":
      await handleContractCreated(event.data.object);
      break;
    case "kyc.verified":
      await handleKycVerified(event.data.object);
      break;
  }

  res.status(200).send("OK");
});

Retry Policy

Failed deliveries are retried with exponential backoff:

AttemptDelay
1Immediate
21 minute
35 minutes
430 minutes
52 hours

Next Steps

Licensed under the Apache License 2.0