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

# Deposit updated

> Sent when a deposit (fiat or crypto) changes state.

**Event type:** `balance.updated`

<Warning>
  `balance.updated` is deprecated and split into two specific events. It is still delivered during the migration, but will be removed on **15 November 2026**. Migrate to:

  * [`payin.updated`](/api-reference/webhooks/payin-updated) — fiat (bank-rail) deposits.
  * [`crypto_deposit.updated`](/api-reference/webhooks/crypto-deposit-updated) — on-chain crypto deposits.

  The payload is identical (plus a `data.eventId` for deduplication).
</Warning>

Covers both **fiat deposits** (bank rail) and **on-chain crypto deposits** — tell them apart by the event name above, or by the chain name in the `blockchain` field (e.g. `polygon`, `tron`, `stellar`) for crypto. See [Webhooks overview](/api-reference/webhooks/overview) for delivery, headers, and signature verification.

<Note>
  The fields below describe bank-rail and on-chain deposits. Deposits made through a **payment code** (PIX in Brazil, QR in Bolivia) are also delivered under this legacy name, but carry a different set of fields — no `payoutId`, `blockchain` or `txHash`, plus `id`, `method` and `creditedUsdc`, and a `previousState` that is not always `null`. See [Fiat deposit updated](/api-reference/webhooks/payin-updated) for that payload.
</Note>

### `data` fields

<ResponseField name="payoutId" type="string">The deposit identifier (named `payoutId` for transport consistency).</ResponseField>
<ResponseField name="companyId" type="string">Your company identifier.</ResponseField>
<ResponseField name="externalId" type="string">Your external reference, if one was provided.</ResponseField>
<ResponseField name="previousState" type="string | null">The state the deposit moved from. Always `null` for bank-rail and on-chain deposits: a single deposit still produces several events as it progresses, but each one is reported on its own, so rely on `state` rather than on the transition.</ResponseField>
<ResponseField name="state" type="string">The current deposit state.</ResponseField>
<ResponseField name="amount" type="number">The deposit amount, in minor units.</ResponseField>
<ResponseField name="currency" type="string">The deposit currency (e.g. `usdc`).</ResponseField>
<ResponseField name="blockchain" type="string">The settlement rail for fiat deposits, or the chain name (e.g. `polygon`, `tron`, `stellar`) for on-chain crypto deposits.</ResponseField>
<ResponseField name="txHash" type="string | null">On-chain transaction hash, when available.</ResponseField>
<ResponseField name="errorReason" type="string | null">Failure reason, when applicable.</ResponseField>
<ResponseField name="updatedAt" type="string">ISO 8601 last-update timestamp.</ResponseField>

<ResponseExample>
  ```json balance.updated theme={null}
  {
    "type": "balance.updated",
    "timestamp": "2026-06-23T12:00:00.000Z",
    "data": {
      "payoutId": "dep_9f86d081884c7d65",
      "companyId": "cmp_123",
      "externalId": "ext-009",
      "previousState": null,
      "state": "funds_received",
      "amount": 100000,
      "currency": "usdc",
      "blockchain": "polygon",
      "txHash": "0xdef456",
      "errorReason": null,
      "updatedAt": "2026-06-23T12:00:00.000Z"
    }
  }
  ```
</ResponseExample>
