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

# INR

> Send remittances to an Indian bank account in INR with a single API call, then track them through webhooks or status polling.

INR remittance lets you pay out Indian Rupees to a beneficiary's bank account in India. One request carries the sender, the beneficiary and the bank account, and the payout is processed asynchronously. Every remittance follows the same three steps: **Create Payout → Track Status → Reconcile.**

> [!NOTE]
>
> Sender, beneficiary and bank account details are sent inline. There are no separate Create User, KYC or Bank Account Linkage calls. Each stage runs inside the transaction and is reported as a status.

**1. Create Payout**

```http theme={null}
POST /api/v2/wallet/transaction/unified/pool/sell
```

Authenticate with your API key, timestamp and HMAC signature. See [API Authentication](https://guides.saber.money/getting-started/auth.md). Do not send `X-User-Id` on this endpoint.

```json theme={null}
{
  "idempotency_key": "00000000-0000-4000-8000-000000000002",
  "client_reference_id": "order-12345",
  "from_currency": "USDT",
  "to_currency": "INR",
  "from_amount": "1",
  "payment_method": "bank_transfer",
  "sender": {
    "type": "INDIVIDUAL",
    "travel_rule_data": {
      "first_name": "Test",
      "last_name": "Sender",
      "nationality": "IND",
      "address": { "line1": "1 Test Street", "country_iso3": "ARE" },
      "proof_of_identification_number": "T0000000"
    }
  },
  "beneficiary": {
    "type": "INDIVIDUAL",
    "relationship": "FAMILY",
    "travel_rule_data": {
      "first_name": "Test",
      "last_name": "Beneficiary",
      "nationality": "IND",
      "address": { "line1": "1 Test Street", "country_iso3": "IND" },
      "proof_of_identification_number": "T0000001"
    }
  },
  "beneficiary_instrument": {
    "type": "BANK_ACCOUNT",
    "bank_account": {
      "country": "IND",
      "account_number": "000012345678",
      "account_holder_name": "Test Beneficiary",
      "bank_code": "TEST0000001"
    }
  }
}
```

Response (`201 Created`):

```json theme={null}
{
  "success": true,
  "data": {
    "id": "00000000-0000-4000-8000-000000000001",
    "client_reference_id": "order-12345",
    "transaction_type": "POOL_SELL",
    "status": "CREATED",
    "from_currency": "USDT",
    "to_currency": "INR",
    "from_amount": "1",
    "to_amount": null,
    "exchange_rate": null,
    "created_at": 1793024948016,
    "updated_at": 1793024948016
  }
}
```

Save `id`. It identifies the remittance in every later call and webhook.

> [!WARNING]
>
> `idempotency_key` is single use, and `client_reference_id` must be unique per client. A repeated value is rejected rather than returning the original transaction.

> [!NOTE]
>
> Instead of resending party or bank details on later payouts, reuse the `sender_id`, `beneficiary_id` and `beneficiary_instrument_id` returned on the transaction as `sender.id`, `beneficiary.id` and `beneficiary_instrument.id`.

**2. Track Status**

The remittance moves through sender KYC, beneficiary KYC and bank account verification before the payout. Saber sends a webhook for each status change to the callback URL configured for your account. See [Webhook Configuration](https://guides.saber.money/client/dashboard/webhooks.md).

```mermaid theme={null}
stateDiagram-v2
[*] --> CREATED
CREATED --> SENDER_KYC_VERIFIED
SENDER_KYC_VERIFIED --> BENEFICIARY_KYC_VERIFIED
BENEFICIARY_KYC_VERIFIED --> BENEFICIARY_INSTRUMENT_VERIFIED
BENEFICIARY_INSTRUMENT_VERIFIED --> COMPLETED
CREATED --> FAILED
SENDER_KYC_VERIFIED --> FAILED
BENEFICIARY_KYC_VERIFIED --> FAILED
BENEFICIARY_INSTRUMENT_VERIFIED --> FAILED
COMPLETED --> [*]
FAILED --> [*]
```

Webhook body:

```json wrap theme={null}
{
  "event": "unified-transaction-pool-sell-completed",
  "data": { "id": "00000000-0000-4000-8000-000000000011", "status": "COMPLETED" }
}
```

`data` is the full transaction object, the same shape as the status endpoint returns.

> [!WARNING]
>
> The webhook body is not signed. Treat it as a notification and read the authoritative state with the status endpoint. Webhooks are delivered at least once and not in order. Deduplicate on `data.id` + `data.status`, and ignore any webhook whose `updated_at` is older than the state you hold.

**3. Reconcile**

Fetch a single remittance, or list remittances, to confirm state or recover a missed webhook. See [Checking status](#checking-status) below.

> [!TIP]
>
> Use `client_reference_id` to find the original transaction after a timeout or a duplicate-key rejection.

## Checking status

```http theme={null}
GET /api/v2/wallet/transaction/unified/{id}
```

| Status | Terminal | Webhook | Meaning |
| - | - | - | - |
| `CREATED` | No | No | Accepted. Sender being resolved and screened. |
| `SENDER_KYC_VERIFIED` | No | Yes | Sender KYC approved. Beneficiary being resolved and screened. |
| `BENEFICIARY_KYC_VERIFIED` | No | Yes | Beneficiary KYC approved. Bank account being verified. |
| `BENEFICIARY_INSTRUMENT_VERIFIED` | No | Yes | Bank account verified. Payout in progress. |
| `APPROVAL_REQUIRED` | No | No | Under compliance review. Poll the status endpoint to observe changes. |
| `COMPLETED` | Yes | Yes | Paid out. `to_amount`, `exchange_rate` and `bank_transaction_id` are set. |
| `FAILED` | Yes | Yes | Not paid out. `reason_code` says why. |

To list remittances:

```http theme={null}
GET /api/v2/wallet/transaction/unified?status=CREATED&status=FAILED&limit=20&offset=0
```

Newest first. Filter by `status` (repeat the parameter for several values), `client_reference_id`, `created_after` and `created_before`. Returns `transactions` and a `total` count.

> **Example status response**
>
> ```json theme={null}
> {
>   "success": true,
>   "data": {
>     "id": "00000000-0000-4000-8000-000000000011",
>     "status": "COMPLETED",
>     "from_currency": "USDT",
>     "to_currency": "INR",
>     "from_amount": "4.2796",
>     "to_amount": "411",
>     "exchange_rate": "96.0370128",
>     "bank_transaction_id": "TESTUTR00001",
>     "created_at": 1792676203000,
>     "updated_at": 1792676210000
>   }
> }
> ```

> [!NOTE]
>
> A `404` (`403026`, transaction not found) straight after the `201` for the same `id` is transient. Retry the request.

Poll until the status reaches a terminal state, or rely on webhooks to receive status changes instead.

## Mandatory fields

Fields not listed here are optional. For the sender, the beneficiary and the bank account, send either a saved `id` from an earlier transaction or the full details, not both.

### Request

| Field | Notes |
| - | - |
| `idempotency_key` | Unique UUID per request |
| `from_currency` | Source currency of your pool account |
| `to_currency` | `INR` |
| `from_amount` | Decimal string, greater than 0 |
| `payment_method` | `bank_transfer` |
| `sender` | `id` or `travel_rule_data` |
| `beneficiary` | `id` or `travel_rule_data` |
| `beneficiary_instrument` | `id` or `bank_account` |

### Sender and beneficiary details

Mandatory inside `travel_rule_data`:

| Field | Sender | Beneficiary |
| - | - | - |
| `type` (`INDIVIDUAL`) | Yes | Yes |
| `relationship` (e.g. `FAMILY`) | — | Yes, unless `beneficiary.id` equals `sender.id` (defaults to `SELF`) |
| `first_name` | Yes | Yes |
| `last_name` | Yes | Yes |
| `address.line1` | Yes | Yes |
| `address.country_iso3` | Yes | Yes |
| `proof_of_identification_number` | Yes | Optional |
| `nationality` (ISO 3166-1 alpha-3) | Yes | Required if an identification number is sent; otherwise `IND` if sent |

> [!WARNING]
>
> `last_name` is mandatory for both parties. A payout without it is rejected.

> [!NOTE]
>
> A beneficiary without a `proof_of_identification_number` is accepted only for clients enabled for it. Contact your Saber representative to have it enabled.

### Bank account

Mandatory inside `beneficiary_instrument`:

| Field | Notes |
| - | - |
| `type` | `BANK_ACCOUNT` |
| `bank_account.country` | `IND` |
| `bank_account.account_number` | 6 to 32 characters, no spaces |
| `bank_account.bank_code` | IFSC code |
| `bank_account.account_holder_name` | Must match the beneficiary |

### Optional fields

* **Request:** `client_reference_id`, `purpose_code`
* **Party details:** `proof_of_identification_type`, `proof_of_identification_name`, `proof_of_identification_validity`, `date_of_birth`, `email`, `phone`, `address.line2`, `address.city`, `address.state`, `address.postal_code`
* **Bank account:** `account_type`, `routing_type`, `bank_name`, `is_nre`

> [!NOTE]
>
> `email` and `phone` may be mandatory for your client account. Confirm with your Saber representative.

## Payout rails and settlement

* The remittance amount (`from_amount`) is debited from your pool account, so keep it funded. See [Pool Account Overview](https://guides.saber.money/client/pool-account/overview.md).
* Saber pays out in `INR` to an Indian bank account (`SAVINGS` , `NRE/NRO`or `CURRENT`) identified by IFSC. The payment method is `bank_transfer`.
* Amounts are decimal strings, timestamps are Unix epoch milliseconds, and absent values are `null`.
* `to_amount` and `exchange_rate` are `null` until the remittance is `COMPLETED`.
* A failed remittance is terminal. To retry, send a new payout with a new `idempotency_key` and a new `client_reference_id`.

## Related pages

> **[API Authentication](https://guides.saber.money/getting-started/auth.md)**

> **[Webhook Configuration](https://guides.saber.money/client/dashboard/webhooks.md)**

> **[Pool Account Overview](https://guides.saber.money/client/pool-account/overview.md)**

> **[INR Offramp](https://guides.saber.money/offramp/currencies/inr.md)**


## Related topics

- [INR Offramp](https://guides.saber.money/offramp/currencies/inr.md)
- [Frequently Asked Questions](https://guides.saber.money/faq.md)
- [Traditional Rails](https://guides.saber.money/offramp/currencies/inr-traditional.md)
- [User Creation](https://guides.saber.money/user/registration.md)
- [Available Flows](https://guides.saber.money/offramp/available-flows.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.