Skip to Content
đź‘‹ Welcome to 100Pay Developers
DocsWebhooksWallet Deposit Events

Wallet Deposit Events

Fired when funds arrive in one of your wallets.

EventTrigger
wallet.depositAn on-chain crypto deposit arrived at one of your wallet addresses
wallet.deposit.internalAn internal transfer from another 100Pay wallet was received

The two events share the same shape — transferType distinguishes them ("onchain" vs "internal").

Payload

interface WalletDepositWebhook { eventType: "wallet.deposit" | "wallet.deposit.internal"; transferType: "onchain" | "internal"; _id: string; // ledger transaction ID transactionHash: string; // on-chain tx hash, or internal transfer hash transactionSignature: string; status: "successful" | "pending" | "failed"; type: "credit"; amount: string; symbol: string; // e.g. "USDT", "NGN" network?: string; // e.g. "bsc", "ethereum" — on-chain deposits from: string; // sender address or wallet code to: string; // your receiving address or wallet code note?: string; // sender note (internal transfers) category: string; timestamp: string; accountId: string; appId: string; userId: string; metadata?: Record<string, unknown>; // wallet metadata you set at creation }

Example — wallet.deposit (on-chain)

{ "eventType": "wallet.deposit", "transferType": "onchain", "_id": "665f1c2e8b6a4a0012a4d960", "transactionHash": "0x9f8e7d6c5b4a39281706f5e4d3c2b1a0ffeeddccbbaa99887766554433221100", "transactionSignature": "0x9f8e...1100-credit-0xSenderAddr-0xYourAddr", "status": "successful", "type": "credit", "amount": "50.00", "symbol": "USDT", "network": "bsc", "from": "0x1234abcd5678ef901234abcd5678ef901234abcd", "to": "0xabcd1234ef567890abcd1234ef567890abcd1234", "category": "uncategorized", "timestamp": "2026-03-12T13:30:00.000Z", "accountId": "665f0aa18b6a4a0012a4d100", "appId": "62ee5dbfb029b7002d5b7453", "userId": "628b228b19ac52002c588525", "metadata": { "orderRef": "order_42" } }

metadata echoes back the metadata you attached when creating the wallet — use it to map deposits to users or orders in your system without a database lookup on the address.

Example — wallet.deposit.internal

{ "eventType": "wallet.deposit.internal", "transferType": "internal", "_id": "665f1c2e8b6a4a0012a4d970", "transactionHash": "internal-transfer-665f1c2e8b6a4a0012a4d96f", "transactionSignature": "internal-transfer-665f1c2e8b6a4a0012a4d96f-credit-625988-916698", "status": "successful", "type": "credit", "amount": "500", "symbol": "NGN", "from": "916698", "to": "625988", "note": "Hello there!", "category": "uncategorized", "timestamp": "2026-03-12T13:32:35.200Z", "accountId": "665f0aa18b6a4a0012a4d100", "appId": "62ee5dbfb029b7002d5b7453", "userId": "628b228b19ac52002c588525" }

Handling

async function handleWalletDeposit(event: WalletDepositWebhook) { if (event.status !== "successful") return; // Map to your user via wallet metadata or the receiving address const user = await findUserByWallet(event.to, event.metadata); await creditUser(user.id, { amount: event.amount, currency: event.symbol, ref: event.transactionHash, // idempotency key at the resource level onChain: event.transferType === "onchain", }); }

The sender of an internal transfer receives a separate transaction.withdrawal event — wallet.deposit.internal is delivered to the recipient’s app.

Last updated on