Actapay/Webhooks

Webhook Security, Event Types, & Best Practices

Webhook Signature Verification

To ensure authenticity, Acta signs every webhook request using HMAC-SHA256. You must verify this signature to confirm that the payload came from Acta and wasn't tampered with.

Headers in Every Webhook Request:

HeaderDescription
x-actalink-signatureFinal HMAC-SHA256 signature of the timestamp and payload
x-actalink-timestampUnix timestamp (in milliseconds) used in the signature

How to Verify the Webhook Signature:

Extract the following from the request

  • x-actalink-signature header (Acta's signature)
  • x-actalink-timestamp header (timestamp used during signing)
  • Raw JSON request body (exactly as received, not parsed)

Recompute the signature

  • Wrap the raw payload in an object.
  • Serialize it with JSON.stringify() (no added whitespace).
  • Compute HMAC-SHA256 of the stringified wrapper using your webhook secret.
  • Concatenate the timestamp + "." + that hash.
  • Compute HMAC-SHA256 of that final string.

Compare your computed signature with the one from x-actalink-signature.

Optionally, reject the webhook if the timestamp is too old (e.g. older than 5 minutes) to prevent replay attacks.

Node.js Example

const crypto = require("crypto");
 
function verifyWebhookSignature({
  rawBody,
  timestamp,
  receivedSignature,
  secret,
}) {
  const payload = JSON.parse(rawBody);
 
  const wrapped = JSON.stringify({ payload });
 
  const intermediateSig = crypto
    .createHmac("sha256", secret)
    .update(wrapped)
    .digest("hex");
 
  const finalSig = crypto
    .createHmac("sha256", secret)
    .update(`${timestamp}.${intermediateSig}`)
    .digest("hex");
 
  return crypto.timingSafeEqual(
    Buffer.from(finalSig),
    Buffer.from(receivedSignature)
  );
}
 
const rawBody = JSON.stringify({
  id: "event_pJMZK1AFhyX1YiZkVgTjVWg3ctLEdcXP",
  eventType: "onetime.executed",
  eventData: {
    data: {
      id: "txn_WiBf4VPq2wlSprD1hZFKNKirIo426Q3p",
      token: {
        name: "USD Coin",
        amount: "0x1adb0",
        symbol: "USDC",
        address: "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
        chainId: 137,
        fiatISO: "USD",
        logoURI: "https://api.acta.link/deposit/v1/logos/usdc.png",
        decimals: 6,
        logoSourceURI: "https://api.acta.link/deposit/v1/logos/usdc.png"
      },
      status: "EXECUTED",
      chainId: 137,
      network: {
        name: "Polygon",
        chainId: 137
      },
      currency: "USDC",
      transaction: {
        id: "txn_WiBf4VPq2wlSprD1hZFKNKirIo426Q3p",
        fee: "0x2f70e",
        hash: "0x5232e8c53c2c0f62e219916fb23101c9fdbb69e18b01610edb13e1460568ccf1",
        amount: "0x1adb0",
        status: "EXECUTED",
        chainId: 137,
        paylinkId: "paylink_tixaLwAU3faVtUyvDpae3wlpAe7vxQ1e",
        executedAt: "2025-11-19T07:03:02.875Z",
        executedBy: "0x061BA68bc8208F4AddBeE86F74F17D77129cCF70",
        paymentType: "one-time",
        feeInclusive: true,
        tokenAddress: "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
        senderAddress: "0x061BA68bc8208F4AddBeE86F74F17D77129cCF70",
        organizationId: "XfYmaVOEpKy0NhPD4u0ue9sZAAQNxGej",
        receiverAddress: "0xEBFa37194fA74bA3e8195446948FC3B9c72E08AB"
      },
      feeInclusive: true,
      tokenAddress: "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
      senderAddress: "0x061BA68bc8208F4AddBeE86F74F17D77129cCF70",
      receiverAddress: "0xEBFa37194fA74bA3e8195446948FC3B9c72E08AB"
    },
    plan: {
      id: "prod_QcrUFbyqgYmDXxSzOiLBN6sFdYQ5CE2R",
      name: "Hooli Music",
      price: {
        id: "price_Yv0kUdyx3r8BYwTasqmPnUKoA502YcnM",
        price: "0.11",
        currency: "USDC",
        currencyType: "crypto"
      },
      status: "ACTIVE",
      imageUrl: "",
      description: "One time plan for Hooli music\n,
      paymentType: "one-time"
    },
    type: "one-time",
    orderId: "ord_sBRUGvh5GtiMxAhLIgGMtmcJdztAMBDU",
    paylink: {
      id: "paylink_tixaLwAU3faVtUyvDpae3wlpAe7vxQ1e",
      name: "Hooli Suite",
      status: "active",
      paylinkType: "combo"
    },
    metadata: null,
    orderStatus: "PAID",
    organisationId: "XfYmaVOEpKy0NhPD4u0ue9sZAAQNxGej"
  },
  createdAt: "2025-11-19T07:03:02.869Z"
});
 
const timestamp = 1755354122183; // x-actalink-timestamp
const receivedSignature =
  "e5d8cf0d6cd3294adec97c1eaa2cfa42a5d3e6a9f421530d231bdf57a56222af"; // x-actalink-signature
const secret = "..."; // from Actapay dashboard
 
const result = verifyWebhookSignature({
  rawBody,
  timestamp,
  receivedSignature,
  secret,
});
 
if (result) {
  console.log("✅  Signature is valid");
} else {
  console.log("❌ Signature is invalid");
}

Webhook Event Types

Acta Deposit supports the following webhook event types:

onetime.executed

{
  "id": "event_pJMZK1AFhyX1YiZkVgTjVWg3ctLEdcXP",
  "eventType": "onetime.executed",
  "eventData": {
    "data": {
      "id": "txn_WiBf4VPq2wlSprD1hZFKNKirIo426Q3p",
      "token": {
        "name": "USD Coin",
        "amount": "0x1adb0",
        "symbol": "USDC",
        "address": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
        "chainId": 137,
        "fiatISO": "USD",
        "logoURI": "https://api.acta.link/deposit/v1/logos/usdc.png",
        "decimals": 6,
        "logoSourceURI": "https://api.acta.link/deposit/v1/logos/usdc.png"
      },
      "status": "EXECUTED",
      "chainId": 137,
      "network": {
        "name": "Polygon",
        "chainId": 137
      },
      "currency": "USDC",
      "transaction": {
        "id": "txn_WiBf4VPq2wlSprD1hZFKNKirIo426Q3p",
        "fee": "0x2f70e",
        "hash": "0x5232e8c53c2c0f62e219916fb23101c9fdbb69e18b01610edb13e1460568ccf1",
        "amount": "0x1adb0",
        "status": "EXECUTED",
        "chainId": 137,
        "paylinkId": "paylink_tixaLwAU3faVtUyvDpae3wlpAe7vxQ1e",
        "executedAt": "2025-11-19T07:03:02.875Z",
        "executedBy": "0x061BA68bc8208F4AddBeE86F74F17D77129cCF70",
        "paymentType": "one-time",
        "feeInclusive": true,
        "tokenAddress": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
        "senderAddress": "0x061BA68bc8208F4AddBeE86F74F17D77129cCF70",
        "organizationId": "XfYmaVOEpKy0NhPD4u0ue9sZAAQNxGej",
        "receiverAddress": "0xEBFa37194fA74bA3e8195446948FC3B9c72E08AB"
      },
      "feeInclusive": true,
      "tokenAddress": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
      "senderAddress": "0x061BA68bc8208F4AddBeE86F74F17D77129cCF70",
      "receiverAddress": "0xEBFa37194fA74bA3e8195446948FC3B9c72E08AB"
    },
    "plan": {
      "id": "prod_QcrUFbyqgYmDXxSzOiLBN6sFdYQ5CE2R",
      "name": "Hooli Music",
      "price": {
        "id": "price_Yv0kUdyx3r8BYwTasqmPnUKoA502YcnM",
        "price": "0.11",
        "currency": "USDC",
        "currencyType": "crypto"
      },
      "status": "ACTIVE",
      "imageUrl": "",
      "description": "One time plan for Hooli music\n",
      "paymentType": "one-time"
    },
    "type": "one-time",
    "orderId": "ord_sBRUGvh5GtiMxAhLIgGMtmcJdztAMBDU",
    "paylink": {
      "id": "paylink_tixaLwAU3faVtUyvDpae3wlpAe7vxQ1e",
      "name": "Hooli Suite",
      "status": "active",
      "paylinkType": "combo"
    },
    "metadata": null,
    "orderStatus": "PAID",
    "organisationId": "XfYmaVOEpKy0NhPD4u0ue9sZAAQNxGej"
  },
  "createdAt": "2025-11-19T07:03:02.869Z"
}

subscription.created

{
  "id": "event_x7aa4JV7xOyKJDy72qGCXhZ7ntHvmHvB",
  "eventType": "subscription.created",
  "eventData": {
    "data": {
      "id": "sub_aD4l7L8L3Xua0xOU2sthQDVFR2h7R3Du",
      "token": {
        "name": "USD Coin",
        "amount": "0x249f0",
        "symbol": "USDC",
        "address": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
        "chainId": 137,
        "fiatISO": "USD",
        "logoURI": "https://api.acta.link/deposit/v1/logos/usdc.png",
        "decimals": 6,
        "logoSourceURI": "https://api.acta.link/deposit/v1/logos/usdc.png"
      },
      "status": "ONGOING",
      "chainId": 137,
      "network": {
        "name": "Polygon",
        "chainId": 137
      },
      "currency": "USDC",
      "startedAt": "2025-11-19T07:04:37.000Z",
      "transaction": {
        "id": "txn_6itVBHGHo6eCnDlY3RfOALhKRtZfqZFA",
        "fee": "0x46815",
        "hash": "0xfe322ff2e45667f9ebba2bb9a99ee6a1ad0f21871ae118dc1249aa26d7800165",
        "amount": "0x249f0",
        "status": "EXECUTED",
        "chainId": 137,
        "paylinkId": "paylink_tixaLwAU3faVtUyvDpae3wlpAe7vxQ1e",
        "executedAt": "2025-11-19T07:04:39.547Z",
        "executedBy": "0xFF01d8625923C382c4e6fb1307749f10c48908AF",
        "paymentType": "subscription",
        "feeInclusive": true,
        "tokenAddress": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
        "senderAddress": "0x061BA68bc8208F4AddBeE86F74F17D77129cCF70",
        "organizationId": "XfYmaVOEpKy0NhPD4u0ue9sZAAQNxGej",
        "receiverAddress": "0xEBFa37194fA74bA3e8195446948FC3B9c72E08AB"
      },
      "feeInclusive": true,
      "intervalUnit": "5mins",
      "tokenAddress": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
      "intervalCount": 288,
      "senderAddress": "0x061BA68bc8208F4AddBeE86F74F17D77129cCF70",
      "nextExecutionAt": "2025-11-19T07:09:39.500Z",
      "receiverAddress": "0xEBFa37194fA74bA3e8195446948FC3B9c72E08AB",
      "latestIntervalCount": 0
    },
    "plan": {
      "id": "prod_ckOS3oJiVaE4fBkFAQgBNzJaG0qsMvXL",
      "name": "Hooli music small",
      "price": {
        "id": "price_54SgwQJfPAO7odbEwY6qTYRoHflX4RZR",
        "price": "0.15",
        "currency": "USDC",
        "currencyType": "crypto",
        "intervalUnit": "5mins",
        "intervalCount": 288
      },
      "status": "ACTIVE",
      "imageUrl": "https://example.com/image.png",
      "description": "5min subscription product 1",
      "paymentType": "recurring"
    },
    "type": "subscription",
    "orderId": "ord_IoqUG9lBvMVckePsgm9fAEjDdeaEtANC",
    "paylink": {
      "id": "paylink_tixaLwAU3faVtUyvDpae3wlpAe7vxQ1e",
      "name": "Hooli Suite",
      "status": "active",
      "paylinkType": "combo"
    },
    "metadata": null,
    "orderStatus": "ONGOING",
    "organisationId": "XfYmaVOEpKy0NhPD4u0ue9sZAAQNxGej"
  },
  "createdAt": "2025-11-19T07:04:50.441Z"
}

subscription.executed

{
  "id": "event_jVARjRPiqfIUaYrvwk1fIMNRlGq7PT8G",
  "eventType": "subscription.executed",
  "eventData": {
    "data": {
      "id": "sub_aD4l7L8L3Xua0xOU2sthQDVFR2h7R3Du",
      "token": {
        "name": "USD Coin",
        "amount": "0x249f0",
        "symbol": "USDC",
        "address": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
        "chainId": 137,
        "fiatISO": "USD",
        "logoURI": "https://api.acta.link/deposit/v1/logos/usdc.png",
        "decimals": 6,
        "logoSourceURI": "https://api.acta.link/deposit/v1/logos/usdc.png"
      },
      "status": "ONGOING",
      "chainId": 137,
      "network": {
        "name": "Polygon",
        "chainId": 137
      },
      "currency": "USDC",
      "startedAt": "2025-11-19T07:04:37.000Z",
      "transaction": {
        "id": "txn_TGJe2GUmdMNlgoo1E78p1ulFUfIMDeHX",
        "fee": "0x46815",
        "hash": "0x179c4b31aa92ed27461d1385d012927c40702398834c6e5edce76d4a8fda5793",
        "amount": "0x249f0",
        "status": "EXECUTED",
        "chainId": 137,
        "paylinkId": "paylink_tixaLwAU3faVtUyvDpae3wlpAe7vxQ1e",
        "executedAt": "2025-11-19T07:10:02.295Z",
        "executedBy": "0xFF01d8625923C382c4e6fb1307749f10c48908AF",
        "paymentType": "subscription",
        "feeInclusive": true,
        "tokenAddress": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
        "senderAddress": "0x061BA68bc8208F4AddBeE86F74F17D77129cCF70",
        "organizationId": "XfYmaVOEpKy0NhPD4u0ue9sZAAQNxGej",
        "receiverAddress": "0xEBFa37194fA74bA3e8195446948FC3B9c72E08AB"
      },
      "feeInclusive": true,
      "intervalUnit": "5mins",
      "tokenAddress": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
      "intervalCount": 288,
      "senderAddress": "0x061BA68bc8208F4AddBeE86F74F17D77129cCF70",
      "nextExecutionAt": "2025-11-19T07:15:02.285Z",
      "receiverAddress": "0xEBFa37194fA74bA3e8195446948FC3B9c72E08AB",
      "effectedInterval": 1,
      "latestIntervalCount": 1
    },
    "plan": {
      "id": "prod_ckOS3oJiVaE4fBkFAQgBNzJaG0qsMvXL",
      "name": "Hooli music small",
      "price": {
        "id": "price_54SgwQJfPAO7odbEwY6qTYRoHflX4RZR",
        "price": "0.15",
        "currency": "USDC",
        "currencyType": "crypto",
        "intervalUnit": "5mins",
        "intervalCount": 288
      },
      "status": "ACTIVE",
      "imageUrl": "https://example.com/image.png",
      "description": "5min subscription product 1",
      "paymentType": "recurring"
    },
    "type": "subscription",
    "orderId": "ord_IoqUG9lBvMVckePsgm9fAEjDdeaEtANC",
    "paylink": {
      "id": "paylink_tixaLwAU3faVtUyvDpae3wlpAe7vxQ1e",
      "name": "Hooli Suite",
      "status": "active",
      "paylinkType": "combo"
    },
    "orderStatus": "ONGOING",
    "organisationId": "XfYmaVOEpKy0NhPD4u0ue9sZAAQNxGej"
  },
  "createdAt": "2025-11-19T07:10:13.197Z"
}

subscription.due

{
  "id": "event_3QPe01CWEY0QOk7bCNp9wCsxp63u2SLc",
  "eventType": "subscription.due",
  "eventData": {
    "data": {
      "id": "sub_aD4l7L8L3Xua0xOU2sthQDVFR2h7R3Du",
      "token": {
        "name": "USD Coin",
        "amount": "0x249f0",
        "symbol": "USDC",
        "address": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
        "chainId": 137,
        "fiatISO": "USD",
        "logoURI": "https://api.acta.link/deposit/v1/logos/usdc.png",
        "decimals": 6,
        "logoSourceURI": "https://api.acta.link/deposit/v1/logos/usdc.png"
      },
      "reason": "BALANCE",
      "status": "DUE",
      "chainId": 137,
      "network": {
        "name": "Polygon",
        "chainId": 137
      },
      "attempts": 0,
      "currency": "USDC",
      "transaction": null,
      "feeInclusive": true,
      "intervalUnit": "5mins",
      "tokenAddress": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
      "intervalCount": 288,
      "senderAddress": "0x061BA68bc8208F4AddBeE86F74F17D77129cCF70",
      "nextExecutionAt": "2025-11-19T10:45:01.230Z",
      "receiverAddress": "0xEBFa37194fA74bA3e8195446948FC3B9c72E08AB",
      "effectedInterval": 36,
      "expectedExecutionAt": "2025-11-19T10:39:01.123Z",
      "latestIntervalCount": 36
    },
    "plan": {
      "id": "prod_ckOS3oJiVaE4fBkFAQgBNzJaG0qsMvXL",
      "name": "Hooli music small",
      "price": {
        "id": "price_54SgwQJfPAO7odbEwY6qTYRoHflX4RZR",
        "price": "0.15",
        "currency": "USDC",
        "currencyType": "crypto",
        "intervalUnit": "5mins",
        "intervalCount": 288
      },
      "status": "ACTIVE",
      "imageUrl": "https://example.com/image.png",
      "description": "5min subscription product 1",
      "paymentType": "recurring"
    },
    "type": "subscription",
    "orderId": "ord_IoqUG9lBvMVckePsgm9fAEjDdeaEtANC",
    "paylink": {
      "id": "paylink_tixaLwAU3faVtUyvDpae3wlpAe7vxQ1e",
      "name": "Hooli Suite",
      "status": "active",
      "paylinkType": "combo"
    },
    "orderStatus": "ONGOING",
    "organisationId": "XfYmaVOEpKy0NhPD4u0ue9sZAAQNxGej"
  },
  "createdAt": "2025-11-19T10:40:01.277Z"
}

subscription.failed

{
  "id": "event_HiAYCdyfLem78UYVEXM7TrOeTnoAIXYL",
  "eventType": "subscription.failed",
  "eventData": {
    "data": {
      "id": "sub_aD4l7L8L3Xua0xOU2sthQDVFR2h7R3Du",
      "token": {
        "name": "USD Coin",
        "amount": "0x249f0",
        "symbol": "USDC",
        "address": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
        "chainId": 137,
        "fiatISO": "USD",
        "logoURI": "https://api.acta.link/deposit/v1/logos/usdc.png",
        "decimals": 6,
        "logoSourceURI": "https://api.acta.link/deposit/v1/logos/usdc.png"
      },
      "reason": "BALANCE",
      "status": "ONGOING",
      "chainId": 137,
      "network": {
        "name": "Polygon",
        "chainId": 137
      },
      "attempts": 3,
      "currency": "USDC",
      "startedAt": "2025-11-19T07:04:37.000Z",
      "transaction": null,
      "feeInclusive": true,
      "intervalUnit": "5mins",
      "tokenAddress": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
      "intervalCount": 288,
      "senderAddress": "0x061BA68bc8208F4AddBeE86F74F17D77129cCF70",
      "nextExecutionAt": "2025-11-19T10:33:01.234Z",
      "receiverAddress": "0xEBFa37194fA74bA3e8195446948FC3B9c72E08AB",
      "effectedInterval": 10,
      "latestIntervalCount": 34
    },
    "plan": {
      "id": "price_54SgwQJfPAO7odbEwY6qTYRoHflX4RZR",
      "price": "0.15",
      "currency": "USDC",
      "currencyType": "crypto",
      "intervalUnit": "5mins",
      "intervalCount": 288
    },
    "type": "subscription",
    "orderId": "ord_IoqUG9lBvMVckePsgm9fAEjDdeaEtANC",
    "paylink": {
      "id": "paylink_tixaLwAU3faVtUyvDpae3wlpAe7vxQ1e",
      "name": "Hooli Suite",
      "status": "active",
      "paylinkType": "combo"
    },
    "orderStatus": "ONGOING",
    "organisationId": "XfYmaVOEpKy0NhPD4u0ue9sZAAQNxGej"
  },
  "createdAt": "2025-11-19T10:32:01.581Z"
}

subscription.completed

{
  "id": "cf8b4861-4411-4f54-89e8-c31447ceb7a9",
  "eventType": "subscription.completed",
  "eventData": {
    "data": {
      "id": "sub_7M9lH66tShtMfLtDyz38WCuoWCuJnBt7",
      "token": {
        "name": "USD Coin",
        "amount": "0x249f0",
        "symbol": "USDC",
        "address": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
        "chainId": 137,
        "fiatISO": "USD",
        "logoURI": "https://api.acta.link/deposit/v1/logos/usdc.png",
        "decimals": 6,
        "logoSourceURI": "https://api.acta.link/deposit/v1/logos/usdc.png"
      },
      "status": "COMPLETED",
      "chainId": 137,
      "network": {
        "name": "Polygon",
        "chainId": 137
      },
      "currency": "USDC",
      "startedAt": "2025-08-29T15:15:22.000Z",
      "transaction": {
        "id": "txn_vAVKHctT5NWRgrhOI8yv8KdSbonsaAI2",
        "fee": "0x4aaa8",
        "hash": "0x56485d8331f8a6041e17eb6a0a52a3aac38b6d6ca5f916cecc9028eba43c6b77",
        "amount": "0x249f0",
        "status": "EXECUTED",
        "chainId": 137,
        "paylinkId": "paylink_xsOVX8sNubCCpPSsmMlmy7llRAkhHyvM",
        "executedAt": "2025-08-29T15:22:03.507Z",
        "executedBy": "0xFF01d8625923C382c4e6fb1307749f10c48908AF",
        "paymentType": "subscription",
        "feeInclusive": false,
        "tokenAddress": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
        "senderAddress": "0x061BA68bc8208F4AddBeE86F74F17D77129cCF70",
        "organizationId": "SwHuo5b9UCc43wFCphlC0uQCkQQVvcga",
        "receiverAddress": "0xEBFa37194fA74bA3e8195446948FC3B9c72E08AB"
      },
      "feeInclusive": false,
      "intervalUnit": "5mins",
      "tokenAddress": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
      "intervalCount": 2,
      "senderAddress": "0x061BA68bc8208F4AddBeE86F74F17D77129cCF70",
      "nextExecutionAt": "2025-08-29T15:27:03.500Z",
      "receiverAddress": "0xEBFa37194fA74bA3e8195446948FC3B9c72E08AB",
      "effectedInterval": 2,
      "latestIntervalCount": 2
    },
    "plan": {
      "id": "prod_jy7Z3JdTuTf1uBqhFFl7x23AdoPJjIRX",
      "name": "Hooi Nucleus",
      "price": {
        "id": "price_kBN95XmlS6kUCNJu98ZpAoc4WT6UX3A2",
        "price": "0.15",
        "currency": "USDC",
        "currencyType": "crypto",
        "intervalUnit": "5mins",
        "intervalCount": 2
      },
      "status": "ACTIVE",
      "imageUrl": "",
      "description": "Monthly subscription for Hooli Nucleus",
      "paymentType": "recurring"
    },
    "type": "subscription",
    "orderId": "ord_7NcE60Ug3muZXHkVkaOefvf4pRYO1I3i",
    "paylink": {
      "id": "paylink_xsOVX8sNubCCpPSsmMlmy7llRAkhHyvM",
      "name": "Hooli Nucleus Subscription",
      "status": "active",
      "paylinkType": "subscription"
    },
    "orderStatus": "PAID",
    "organisationId": "SwHuo5b9UCc43wFCphlC0uQCkQQVvcga"
  },
  "createdAt": "2025-08-29T15:22:09.237Z"
}

subscription.cancelled

{
  "id": "event_OawsAPQfMwJaauWCN0WgsLVPgmgSWvVS",
  "eventType": "subscription.cancelled",
  "eventData": {
    "data": {
      "id": "sub_aD4l7L8L3Xua0xOU2sthQDVFR2h7R3Du",
      "token": {
        "name": "USD Coin",
        "amount": "0x249f0",
        "symbol": "USDC",
        "address": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
        "chainId": 137,
        "fiatISO": "USD",
        "logoURI": "https://api.acta.link/deposit/v1/logos/usdc.png",
        "decimals": 6,
        "logoSourceURI": "https://api.acta.link/deposit/v1/logos/usdc.png"
      },
      "status": "CANCELLED",
      "chainId": 137,
      "network": {
        "name": "Polygon",
        "chainId": 137
      },
      "currency": "USDC",
      "startedAt": "2025-11-19T07:04:37.000Z",
      "transaction": null,
      "feeInclusive": true,
      "intervalUnit": "5mins",
      "tokenAddress": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
      "intervalCount": 288,
      "senderAddress": "0x061BA68bc8208F4AddBeE86F74F17D77129cCF70",
      "nextExecutionAt": null,
      "receiverAddress": "0xEBFa37194fA74bA3e8195446948FC3B9c72E08AB",
      "latestIntervalCount": 37
    },
    "plan": {
      "id": "prod_ckOS3oJiVaE4fBkFAQgBNzJaG0qsMvXL",
      "name": "Hooli music small",
      "price": {
        "id": "price_54SgwQJfPAO7odbEwY6qTYRoHflX4RZR",
        "price": "0.15",
        "currency": "USDC",
        "currencyType": "crypto",
        "intervalUnit": "5mins",
        "intervalCount": 288
      },
      "status": "ACTIVE",
      "imageUrl": "https://example.com/image.png",
      "description": "5min subscription product 1",
      "paymentType": "recurring"
    },
    "type": "subscription",
    "orderId": "ord_IoqUG9lBvMVckePsgm9fAEjDdeaEtANC",
    "paylink": {
      "id": "paylink_tixaLwAU3faVtUyvDpae3wlpAe7vxQ1e",
      "name": "Hooli Suite",
      "status": "active",
      "paylinkType": "combo"
    },
    "orderStatus": "CANCELLED",
    "organisationId": "XfYmaVOEpKy0NhPD4u0ue9sZAAQNxGej"
  },
  "createdAt": "2025-11-19T10:51:16.800Z"
}

Best Practices for Webhooks

Always verify the webhook signature to avoid spoofed requests.

Respond quickly with a 200 OK — don’t wait for downstream logic to finish.

Handle retries properly. If Acta doesn't receive a 2xx status, we retry using exponential backoff.

Retry Strategy

  • Max Attempts: 10
  • Initial Delay: 30 seconds
  • Backoff Strategy: Exponential (doubles every attempt)
  • No Delay Cap: Keeps doubling until final attempt
  • Total Retry Window: ~4h 16m

Retry schedule

AttemptDelay (s)Delay (min)Cumulative Time
1st300.50:00:30
2nd6010:01:30
3rd12020:03:30
4th24040:07:30
5th48080:15:30
6th960160:31:30
7th1920321:03:30
8th3840642:07:30
9th76801284:15:30
10th153602568:31:30

🔁 If all retries fail, the webhook is marked as unsuccessful.