> ## Documentation Index
> Fetch the complete documentation index at: https://docs.minisend.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# Wallet API webhooks

> Get notified the moment a wallet you created receives funds, with wallet.deposit.received.

Minisend detects deposits to every address you create and notifies you. Configure a webhook URL once in **Settings** and it's shared across checkout, off-ramp, onramp, and the Wallet API.

## wallet.deposit.received

Fires once for every deposit to a wallet you created, signed the same way as every other Minisend webhook: HMAC-SHA256 in `X-Minisend-Signature`, using your `webhook_secret`. See [webhook verification](/webhooks/verification).

```json theme={null}
{
  "event": "wallet.deposit.received",
  "deposit_id": "7b2e1a3f-...",
  "wallet_id": "3f6b2e1a-...",
  "wallet_ref": "user-9214",
  "address": "0xabc1230000000000000000000000000000dead",
  "chain": "MATIC",
  "token": "USDC",
  "amount": "10.500000",
  "tx_hash": "0x55a572efe1720250e442f38741477a4fc3f7f152e5cd208cc52f8222a1c2a13b",
  "from_address": "0x9f2c...",
  "state": "confirmed",
  "detected_at": "2026-08-07T09:12:03.000Z",
  "created_at": "2026-08-07T09:12:03.000Z"
}
```

<ResponseField name="deposit_id" type="string" required>
  Use as an idempotency key. A late finality update redelivers the same `deposit_id`, not a new one.
</ResponseField>

<ResponseField name="wallet_ref" type="string" required>
  Your own identifier for the wallet, exactly as you passed it when you created the address.
</ResponseField>

<ResponseField name="chain" type="string" required>
  The chain the funds actually landed on. Addresses from this API are identical across every EVM chain, so a wallet you created on Base can still receive on Polygon, Arbitrum, or anywhere else supported. Always read this field instead of assuming it matches the chain you issued the wallet on.
</ResponseField>

<ResponseField name="amount" type="string" required>
  A string, not a number. Compare and store it as a decimal in your own system rather than parsing it as a float.
</ResponseField>

<ResponseField name="tx_hash" type="string">
  The on-chain transaction. May briefly be `null` on the very first notification for a deposit.
</ResponseField>

<ResponseField name="state" type="string" required>
  `confirmed` or `complete`. You may receive `confirmed` first and `complete` moments later for the same `deposit_id` — both are safe to treat as "funds have arrived."
</ResponseField>

<Note>
  Deposits are also readable over the API without waiting for a webhook. See [get wallet deposits](/api-reference/wallet-api/get-wallet-deposits) and [list all deposits](/api-reference/wallet-api/list-deposits) — useful for catching up after downtime, or if you'd rather poll.
</Note>

## What this doesn't cover yet

The Wallet API detects and reports incoming funds. It does not yet move them: there is no transfer or sweep endpoint, so funds stay at the address until that capability ships. Plan your integration around reading balances and deposits, not withdrawing programmatically.
