---
title: "Initiate Transfer API Reference"
description: "Execute a DMT-Fino money transfer after OTP verification."
canonical: "https://eps.eko.in/docs/dmt-initiate-transfer"
---


> **Canonical URL:** https://eps.eko.in/docs/dmt-initiate-transfer
> This is a machine-readable Markdown version of the page for AI agents and LLMs. The primary (HTML) version lives at the canonical URL above.

# Initiate Transfer API Reference

`POST https://staging.eko.in/ekoapi/v3/customer/payment/dmt-fino`

Execute a DMT-Fino money transfer after OTP verification.

**Behaviour**

- **Moves money**: Moves real money and cannot be undone. After a timeout, confirm the outcome before ever re-sending.
- **[₹2.80 Eko charge / transfer](https://eps.eko.in/pricing?tab=dmt#dmt-calculator)**: Deducted from the sender's fee; the rest is your commission.
- **[Earns commission](https://eps.eko.in/pricing?tab=dmt#dmt-calculator)**: The sender's fee, less GST and the Eko charge, is your commission.

The final and only financial step in the DMT flow. Debits the agent's wallet and initiates an IMPS transfer to the registered recipient's bank account after OTP validation. Requires the otp and otp_ref_id from Send Transaction OTP plus a unique client_ref_id per attempt for reconciliation (it is NOT an idempotency key — on a timeout, look the attempt up via Transaction Inquiry with `client_ref_id=<ref>` before retrying). The response returns tid (Eko transaction ID) and bank_ref_num (the IMPS RRN/UTR). Use a fresh otp_ref_id and OTP for each attempt — a consumed OTP is rejected — and always persist tid, bank_ref_num, and your client_ref_id to reconcile before retrying.

> View product & pricing details: [Domestic Money Transfer (DMT)](https://eps.eko.in/products/dmt-api.md)

## Body parameters

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| initiator_id | string | yes | Registered mobile number of the API user (see Platform Credentials). e.g. 9962981729 |
| recipient_id | number | yes | Unique recipient ID from Add Recipient or Get Recipients. e.g. 117015428 |
| amount | number | yes | Transfer amount in INR (must match the amount sent to Send Transaction OTP). e.g. 100 |
| customer_id | string | yes | Sender's 10-digit mobile number. e.g. 9155927131 |
| otp | string | yes | OTP entered by the customer, received on their registered mobile. e.g. 4702 |
| otp_ref_id | string | yes | OTP reference ID from the Send Transaction OTP response. e.g. 667007109 |
| client_ref_id | string | yes | Unique partner reference for this transaction, used for reconciliation and Transaction Inquiry lookup (`client_ref_id=<ref>`). Use a fresh value per attempt; it is not an idempotency key. e.g. <unique_client_ref_id> |

## Headers

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| developer_key | string | yes | Static API key issued to your account after KYC. |
| secret-key | string | yes | Dynamic per-request signature: base64(HMAC-SHA256(timestamp, base64(access_key))). |
| secret-key-timestamp | string | yes | Current time in milliseconds since UNIX epoch, used to compute secret-key. Must match server time. |
| content-type | string | yes | application/json e.g. application/json |

## Response

⭐ marks fields highlighted as verifiable.

| Field | Type | Description |
| --- | --- | --- |
| status | number | Primary success indicator (0 = success). |
| message | string | Human-readable response / error message. |
| response_status_id | number | UI display hint only (-1/0 success, 1 failure, 2 initiated, 3 refund initiated, 4 refunded). Never branch on it — use `status` (and `tx_status` for financial APIs), or `response_type_id` where documented. |
| response_type_id | number | A unique id for every possible response shape (success or error) — useful for client logic branching and analytics. |
| tx_status | string | Transaction state: 0=Success, 1=Fail, 2=Initiated / Response Awaited (NEFT) — poll Transaction Inquiry, 3=Refund Pending, 4=Refunded, 6=Response Awaited — Transaction Inquiry required. |
| txstatus_desc | string | Human-readable transaction status. |
| data | object | API-specific response payload. |
| data.tx_status ⭐ | string | Transaction state within the data block: 0=Success, 1=Fail, 2=Initiated / Response Awaited (NEFT) — poll Transaction Inquiry, 3=Refund Pending, 4=Refunded, 6=Response Awaited — Transaction Inquiry required. |
| data.txstatus_desc | string | Human-readable transaction status. |
| data.tid ⭐ | string | Eko's internal transaction ID. Store for reconciliation and support queries. |
| data.bank_ref_num ⭐ | string | Bank reference number (RRN / UTR) for the IMPS transaction. |
| data.amount ⭐ | string | Amount transferred (INR). |
| data.fee | string | Fee charged for the transfer (INR). |
| data.collectable_amount | string | Total collectable from the sender (amount + fee). |
| data.service_tax | string | Service tax component on the fee (INR). |
| data.tds | string | Tax deducted at source on the agent's commission (INR). |
| data.commission | string | Commission earned by the agent on this transaction (INR). |
| data.sender_name | string | Name of the sender. |
| data.recipient_name ⭐ | string | Name of the beneficiary credited. |
| data.recipient_id | number | Recipient identifier credited. |
| data.bank | string | Beneficiary bank name. |
| data.account | string | Beneficiary account number credited. |
| data.channel_desc | string | Settlement channel used (e.g. IMPS). |
| data.balance ⭐ | string | Agent wallet balance after the transaction (INR). |
| data.client_ref_id | string | Echo of the partner reference sent in the request. |
| data.currency | string | Currency code. |
| data.timestamp | string | Server-side timestamp of the transaction. |

## Example request

```json
{
  "initiator_id": "9962981729",
  "recipient_id": 117015428,
  "amount": 100,
  "customer_id": "9155927131",
  "otp": "4702",
  "otp_ref_id": "667007109",
  "client_ref_id": "<unique_client_ref_id>"
}
```

## Example response

```json
{
  "status": 0,
  "response_status_id": 0,
  "message": "Transaction successful",
  "response_type_id": 325,
  "data": {
    "tx_status": "0",
    "txstatus_desc": "Success",
    "tid": "3570311831",
    "amount": "100.00",
    "fee": "10.0",
    "collectable_amount": "110.0",
    "service_tax": "1.53",
    "tds": "0.01",
    "commission": "0.47",
    "sender_name": "Rahul",
    "recipient_name": "Master YASHWANT BASNETT",
    "recipient_id": 117015428,
    "bank": "State Bank of India",
    "account": "38759149196",
    "channel_desc": "IMPS",
    "bank_ref_num": "620415011744",
    "balance": "10131.18",
    "client_ref_id": "<unique_client_ref_id>",
    "currency": "INR",
    "timestamp": "2026-07-23T09:46:35.396Z"
  }
}
```

## Error scenarios

| Status | response_type_id | Scenario |
| --- | --- | --- |
| 200 | `55` | Transaction declined — OTP already consumed |
| 200 | `55` | Transaction declined — insufficient balance in agent wallet |
| 200 | `55` | Transaction declined — wrong OTP entered |
| 200 | `55` | Transaction declined — sender monthly limit exhausted |
| 200 | — | Transaction awaited (non-final) — reconcile by tid before retrying |
