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

# India overview

> Everything to integrate INR payins, payouts and remittance, on one page.

India runs payins, payouts and remittance in INR. This page takes you through an India integration from start to finish. Each step links to the full guide when you need more detail.

## At a glance

| | India |
| - | - |
| Fiat | INR |
| Payin methods | `IMPS`, `UPI` |
| Payout rails (`bank_account_type`) | `ACCOUNT_DETAILS` (account number and IFSC), `UPI` (VPA) |
| Remittance | A standard payout, or the RDA remittance payout API (`ACCOUNT_DETAILS` only) |
| Payin reference | UTR, sent as `transaction_reference_id` (12 or 16 characters). Required |
| KYC | [KYC sharing](/guides/customers/kyc-sharing) or [KYC SDK](/guides/customers/kyc-sdk) |

## 1. Onboard the customer

<Steps>
  <Step title="Create the customer" icon="user-plus">
    ```json POST /cms/api/v1/customer/create theme={"theme":{"light":"css-variables","dark":"css-variables"}}
    {
      "client_reference_id": "user-001",
      "full_name": "Priya Sharma",
      "phone": "9911002211",
      "alpha_3_country_code": "IND"
    }
    ```

    Save the returned `id` as `customer_id`.
  </Step>

  <Step title="Verify identity" icon="id-card">
    Pick one method. With **KYC sharing**, you send data you already verified with [`POST /kyc/add-kyc-data`](/guides/customers/kyc-sharing). With the **KYC SDK**, you redirect the user to a hosted link from [`POST /kyc/generate-link`](/guides/customers/kyc-sdk). Either way, wait for the `CUSTOMER` webhook with `VERIFIED`.
  </Step>

  <Step title="Add the bank account" icon="building-columns">
    ```json POST /cms/api/v1/bank/create theme={"theme":{"light":"css-variables","dark":"css-variables"}}
    {
      "customer_id": "075986f3-282b-4555-bfcd-fad973e32596",
      "bank_account_type": "ACCOUNT_DETAILS",
      "identifiers": { "account_number": "7627389201", "ifsc": "SBIN0001829" }
    }
    ```

    For UPI, send `"bank_account_type": "UPI"` and `"identifiers": { "vpa": "priya@oksbi" }`. Save the returned `id` as `bank_id` once the `BANK` webhook says `VERIFIED`.
  </Step>
</Steps>

### KYC documents

| Document | `document_type` | Notes |
| - | - | - |
| Aadhaar | `AADHAAR` | No images needed with KYC sharing. In the SDK, the user authenticates with DigiLocker |
| Passport | `PASSPORT` | Front and back images |
| Voter ID | `VOTER_ID` | Front and back images |
| Driving licence | `DRIVING_LICENSE` | Front and back images |

* Send `document_details.document_number` for every Indian customer.
* The PAN goes in `tax_number`. It's checked against the name and date of birth.
* Your organization's configuration can limit these documents. Check [`GET /kyc/configuration/{customer_id}`](/api-reference-exchange/endpoint/kyc/configuration-\{customer_id}).

## 2. Payins (INR to stablecoins)

<Steps>
  <Step title="Create a quotation" icon="file-invoice-dollar">
    ```json POST /pis/api/v1/payin/quotation theme={"theme":{"light":"css-variables","dark":"css-variables"}}
    {
      "customer_id": "075986f3-282b-4555-bfcd-fad973e32596",
      "asset": "USDC",
      "fiat": "INR",
      "network": "polygon",
      "payment_method": "IMPS",
      "sending_amount": "10000",
      "risk_parameters": {
        "ip_address": "203.0.113.10",
        "device_id": "device-123",
        "suspicious_activity_report": false,
        "law_enforcement_agency_report": false
      }
    }
    ```

    The response has `deposit_instructions` (account number, IFSC and account name) and `expiry_time`. For `UPI`, it also has a `deep_link` you can show as a [UPI QR code](/guides/country-guides/india/qr-integration).
  </Step>

  <Step title="Collect the INR" icon="money-bill-wave">
    The user pays the exact `sending_amount` in one transfer, from a bank account in their own KYC name. Third-party payments and wrong amounts are refunded. Their bank gives them a 12-digit [UTR](/guides/country-guides/india/understanding-utr).
  </Step>

  <Step title="Initiate with the UTR" icon="arrow-down-to-line">
    ```json POST /pis/api/v1/payin/initiate theme={"theme":{"light":"css-variables","dark":"css-variables"}}
    {
      "quotation_id": "da43453c-f854-42ac-9a1e-619b37060bbc",
      "customer_id": "075986f3-282b-4555-bfcd-fad973e32596",
      "client_reference_id": "payin-001",
      "transaction_reference_id": "412345678901"
    }
    ```
  </Step>

  <Step title="Credit on SUCCESS" icon="bell">
    The `PAYIN` webhook moves to `SUCCESS` with the `transaction_hash`. Credit the user only then. See [Payins](/guides/payments/payins#6-track-the-result) for every status.
  </Step>
</Steps>

## 3. Payouts (stablecoins to INR)

<Steps>
  <Step title="Create a quotation" icon="file-invoice-dollar">
    ```json POST /pos/api/v1/payout/quotation theme={"theme":{"light":"css-variables","dark":"css-variables"}}
    {
      "customer_id": "075986f3-282b-4555-bfcd-fad973e32596",
      "bank_id": "cab47575-bbcb-4294-81a3-30774104f3b6",
      "asset": "usdt",
      "fiat": "inr",
      "network": "tron",
      "payment_method": "IMPS",
      "sending_amount": "60",
      "risk_parameters": {
        "ip_address": "203.0.113.10",
        "device_id": "device-123",
        "suspicious_activity_report": false,
        "law_enforcement_agency_report": false
      }
    }
    ```

    Use `UPI` as `payment_method` for a UPI bank account. The response has the `wallet_address` to fund and `expiry_time`.
  </Step>

  <Step title="Send the crypto" icon="coins">
    Send exactly `sending_amount` of the quoted asset, on the quoted network, to `wallet_address`. Keep the transaction hash.
  </Step>

  <Step title="Initiate the payout" icon="paper-plane">
    ```json POST /pos/api/v1/payout/initiate theme={"theme":{"light":"css-variables","dark":"css-variables"}}
    {
      "quotation_id": "59bf60c3-e9af-40a7-9d5c-2a1aa191e769",
      "customer_id": "075986f3-282b-4555-bfcd-fad973e32596",
      "client_reference_id": "payout-001",
      "transaction_hash": "0x9f2c3b1a..."
    }
    ```
  </Step>

  <Step title="Show the UTR" icon="bell">
    On `SUCCESS`, the `PAYOUT` webhook carries the bank `utr`. Show it to the user as proof of payment. Paying from a balance instead? See [Prefunded payouts](/guides/payments/prefunded-payouts).
  </Step>
</Steps>

* Bank accounts are verified with a penny drop. The holder's name must match the KYC name.
* NRE accounts are rejected (`ACCOUNT_TYPE_NRE`).

## 4. Remittance (RDA)

Money sent to India from abroad can use a standard payout ([step 3](#3-payouts-stablecoins-to-inr)) or the dedicated remittance payout API, settled through a Rupee Drawing Arrangement (RDA).

<Steps>
  <Step title="Onboard the beneficiary" icon="user-check">
    Create the customer, then run the light beneficiary KYC with [`POST /kyc/remittance-beneficiary-kyc`](/api-reference-exchange/endpoint/kyc/remittance-beneficiary-kyc).
  </Step>

  <Step title="Add the bank account" icon="building-columns">
    `POST /bank/create` with `ACCOUNT_DETAILS`. UPI isn't supported for remittance.
  </Step>

  <Step title="Create the remitter" icon="user-plus">
    [`POST /kyc/remitter/create`](/api-reference-exchange/endpoint/kyc/remitter/create) for the sender abroad. Reuse the remitter and beneficiary for every transfer between them.
  </Step>

  <Step title="Quote and pay out" icon="paper-plane">
    [`POST /remittance-payout/quotation`](/api-reference-exchange/endpoint/remittance-payout/quotation), then [`POST /remittance-payout/initiate`](/api-reference-exchange/endpoint/remittance-payout/initiate). Send `remitter_id` and `is_self_transfer` with the quotation, and `remitter_id` again when you initiate.
  </Step>
</Steps>

## 5. Test in sandbox

| What | How |
| - | - |
| Verify the customer | [Mock KYC Status](/api-reference-exchange/endpoint/kyc/mock-kyc-status) |
| Verify the bank account | [Mock Bank Verification](/api-reference-exchange/endpoint/bank/mock-bank-verification) |
| Payin | Initiate with any 12-digit `transaction_reference_id`, then [Mock Payin Status](/api-reference-exchange/endpoint/payin/order/mock-payin-status) |
| Payout | Quote on `sepolia`, send testnet stablecoins, then [Mock Payout Status](/api-reference-exchange/endpoint/payout/order/mock-payout-status) |

## Compliance

Indian AML rules can trigger [Enhanced Due Diligence](/guides/payments/limits-and-edd) when a user reaches volume thresholds or asks for higher limits. For which documents to collect for each purpose, see [EDD document requirements](/guides/country-guides/india/edd-guide).

<CardGroup cols={2}>
  <Card title="Understanding UTR numbers" icon="receipt" href="/guides/country-guides/india/understanding-utr">
    Formats by payment method, and where users find them.
  </Card>

  <Card title="UPI QR codes" icon="qrcode" href="/guides/country-guides/india/qr-integration">
    Turn the quotation's deep link into a scannable QR code.
  </Card>

  <Card title="EDD document requirements" icon="shield-halved" href="/guides/country-guides/india/edd-guide">
    The documents to collect for each declared purpose.
  </Card>

  <Card title="KYC SDK demo" icon="mobile-screen" href="/guides/customers/kyc-demo-india">
    The hosted KYC flow, screen by screen.
  </Card>
</CardGroup>


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