Afriex SDK
API Reference

Webhooks

Afriex sends webhook notifications for key events. The SDK validates signatures and triggers test events in sandbox.

Setup

Pass your webhook public key during initialization:

const afriex = new AfriexSDK({
  apiKey: "your-api-key",
  webhookPublicKey: "your-afriex-public-key",
});

Verify and Parse

Validate signature and parse payload in one call:

app.post("/webhook", (req, res) => {
  const signature = req.headers["x-webhook-signature"];
  const payload = req.body; // Raw string body

  try {
    const event = afriex.webhooks.verifyAndParse(payload, signature);

    switch (event.event) {
      case "CUSTOMER.CREATED":
      case "CUSTOMER.UPDATED":
      case "CUSTOMER.DELETED":
        console.log("Customer created:", event.data);
        break;
      case "TRANSACTION.CREATED":
      case "TRANSACTION.UPDATED":
        console.log("Transaction created:", event.data);
        break;
      case "PAYMENT_METHOD.CREATED":
      case "PAYMENT_METHOD.UPDATED":
      case "PAYMENT_METHOD.DELETED":
        console.log("Payment method created:", event.data);
        break;
      case "CHECKOUT_SESSION.CREATED":
        console.log("Checkout session created:", event.data);
        break;
    }

    res.status(200).send("OK");
  } catch (error) {
    console.error("Invalid signature");
    res.status(400).send("Invalid signature");
  }
});

Verify Only

Validate signature without parsing:

const isValid = afriex.webhooks.verify(payload, signature);

if (isValid) {
  const event = JSON.parse(payload);
  // Handle event
}

Trigger Test Webhook (Sandbox)

Send a test webhook to your endpoint in sandbox:

const result = await afriex.webhooks.triggerTestWebhook({
  event: "TRANSACTION.UPDATED",
  resourceId: "transaction-id",
});

// Check your webhook endpoint for the test event
console.log(result); // { success: true, message: "..." }

For CHECKOUT_SESSION.CREATED, use the checkout session UUID as resourceId.

Supported Events:

EventResource Type
CUSTOMER.CREATEDCustomer ID
CUSTOMER.UPDATEDCustomer ID
CUSTOMER.DELETEDCustomer ID
TRANSACTION.CREATEDTransaction ID
TRANSACTION.UPDATEDTransaction ID
PAYMENT_METHOD.CREATEDPayment Method ID
PAYMENT_METHOD.UPDATEDPayment Method ID
PAYMENT_METHOD.DELETEDPayment Method ID
CHECKOUT_SESSION.CREATEDCheckout Session UUID

Test webhook triggers only work in sandbox environment.

Event Types

Customer Events

EventDescription
CUSTOMER.CREATEDCustomer created
CUSTOMER.UPDATEDCustomer updated
CUSTOMER.DELETEDCustomer deleted

Payload:

{
  event: 'CUSTOMER.CREATED',
  data: {
    customerId: string,
    name: string,
    email: string,
    phone: string,
    countryCode: string
  }
}

Transaction Events

EventDescription
TRANSACTION.CREATEDTransaction created
TRANSACTION.UPDATEDTransaction status changed

Payload:

{
  event: 'TRANSACTION.UPDATED',
  data: {
    transactionId: string,
    customerId: string,
    destinationId: string,
    status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | ...,
    type: string,
    sourceAmount: string,
    sourceCurrency: string,
    destinationAmount: string,
    destinationCurrency: string,
    meta: { idempotencyKey, reference, narration?, invoice?, merchantId? },
    createdAt: string,
    updatedAt: string
  }
}

Payment Method Events

EventDescription
PAYMENT_METHOD.CREATEDPayment method created
PAYMENT_METHOD.UPDATEDPayment method updated
PAYMENT_METHOD.DELETEDPayment method deleted

Payload:

{
  event: 'PAYMENT_METHOD.CREATED',
  data: {
    paymentMethodId: string,
    channel: string,
    customerId: string,
    accountName: string,
    accountNumber: string,
    countryCode: string,
    institution: { institutionId?, institutionName?, institutionCode? },
    recipient: { recipientName?, recipientEmail?, recipientPhone? }
  }
}

Checkout Session Events

EventDescription
CHECKOUT_SESSION.CREATEDCheckout session created

Payload:

{
  event: 'CHECKOUT_SESSION.CREATED',
  data: Record<string, unknown>
}

On this page