API reference
Domestic money transfer
25 endpoints
Register the sender once per bank, add a beneficiary, then transfer with the sender's OTP. Requires full KYC on your account. Every amount is checked against the limits from /dmt/banks; a larger amount becomes several parts — use /transfer/plan and the split endpoints rather than splitting it yourself. A pending transfer comes back HTTP 200: money may be in flight, so never resend it — poll its status or wait for the callback.
HTTP 401 and invalid_signature.- GET
/dmt/banksYour transfer banks, limits and charges - GET
/dmt/remitterLook up a sender: registered, and the limit left - POST
/dmt/remitter/registerStart sender registration (sends the sender an OTP) - POST
/dmt/remitter/verifyComplete sender registration with the OTP - POST
/dmt/remitter/resend-otpResend the registration OTP - GET
/dmt/recipientsBeneficiaries of a sender - GET
/dmt/beneficiary-banksBanks a beneficiary may be at - GET
/dmt/ifsc/{ifsc}Bank, branch and address for an IFSC - GET
/dmt/branchesBranches (with IFSC) of a beneficiary's bank - GET
/dmt/master-ifscA bank's master IFSC - POST
/dmt/recipientAdd a beneficiary - POST
/dmt/recipient/deleteRemove a beneficiary - POST
/dmt/recipient/verifyCheck a beneficiary account (penny drop) - POST
/dmt/transfer/quoteCharges and totals for an amount (free) - POST
/dmt/transfer/planHow many parts an amount takes, and each part's fee - POST
/dmt/transfer/otpStart a transfer: sends the sender an OTP - POST
/dmt/transferSend the money - POST
/dmt/transfer/cancelCancel a transfer still waiting for its OTP - GET
/dmt/transfer/{ref}Status of one transfer - GET
/dmt/transferFind a transfer by your own reference - POST
/dmt/transfer/refund/otpRefund a parked transfer: sends the sender an OTP - POST
/dmt/transfer/refundComplete the refund with the sender's OTP - POST
/dmt/transfer/batchStart a split transfer - POST
/dmt/transfer/batch/otpSend one part with its OTP - GET
/dmt/transfer/batch/{ref}Progress of a split transfer
Your transfer banks, limits and charges
GET/api/corp/v1/dmt/banks
Notes
min_per_txn, max_per_txn, monthly_limit, the account-check and registration charges, and per bank what registration needs (register_fields, biometric, OTP length).
curl "https://apipe.in/api/corp/v1/dmt/banks" \
-H "X-Api-Token: <your-token>"<…> with your own value.Look up a sender: registered, and the limit left
GET/api/corp/v1/dmt/remitter
Query parameters
| Name | Description |
|---|---|
mobilerequired | Sender (customer) mobile number. |
bankrequired | Transfer bank: ARTL, FINO, NSDL or JIO — one your account has (see /dmt/banks). |
curl "https://apipe.in/api/corp/v1/dmt/remitter?mobile=<mobile>&bank=<bank>" \
-H "X-Api-Token: <your-token>"<…> with your own value. Only the required fields are shown.Start sender registration (sends the sender an OTP)
POST/api/corp/v1/dmt/remitter/register
Body parameters
| Name | Description |
|---|---|
mobilerequired | Sender (customer) mobile number. |
bankrequired | Transfer bank: ARTL, FINO, NSDL or JIO — one your account has (see /dmt/banks). |
namerequired | Sender's full name (at least 5 characters). |
pincoderequired | Sender's 6-digit pincode. |
aadhaaroptional | Where the bank asks for it (/dmt/banks), with bio_type and bio_pid for a fingerprint capture. |
fieldsoptional | The bank's extra register_fields, as an object. |
Notes
Returns registration_ref. A 202 registration_pending means the bank is still deciding — do not register again.
curl "https://apipe.in/api/corp/v1/dmt/remitter/register" \
-X POST \
-H "X-Api-Token: <your-token>" \
-H "Content-Type: application/json" \
-d '{
"mobile": "<mobile>",
"bank": "<bank>",
"name": "<name>",
"pincode": "<pincode>"
}'<…> with your own value. Only the required fields are shown.Complete sender registration with the OTP
Moves moneyPOST/api/corp/v1/dmt/remitter/verify
Body parameters
| Name | Description |
|---|---|
mobilerequired | Sender (customer) mobile number. |
bankrequired | Transfer bank: ARTL, FINO, NSDL or JIO — one your account has (see /dmt/banks). |
otprequired | The OTP the sender received. |
registration_refrequired | From register. |
Notes
The registration charge is taken once per sender and bank, only after the bank confirms.
curl "https://apipe.in/api/corp/v1/dmt/remitter/verify" \
-X POST \
-H "X-Api-Token: <your-token>" \
-H "Content-Type: application/json" \
-d '{
"mobile": "<mobile>",
"bank": "<bank>",
"otp": "<otp>",
"registration_ref": "<registration_ref>"
}'<…> with your own value. Only the required fields are shown.Resend the registration OTP
POST/api/corp/v1/dmt/remitter/resend-otp
Body parameters
| Name | Description |
|---|---|
mobilerequired | Sender (customer) mobile number. |
bankrequired | Transfer bank: ARTL, FINO, NSDL or JIO — one your account has (see /dmt/banks). |
Notes
At most 3 resends, 30 seconds apart.
curl "https://apipe.in/api/corp/v1/dmt/remitter/resend-otp" \
-X POST \
-H "X-Api-Token: <your-token>" \
-H "Content-Type: application/json" \
-d '{
"mobile": "<mobile>",
"bank": "<bank>"
}'<…> with your own value. Only the required fields are shown.Beneficiaries of a sender
GET/api/corp/v1/dmt/recipients
Query parameters
| Name | Description |
|---|---|
mobilerequired | Sender (customer) mobile number. |
bankrequired | Transfer bank: ARTL, FINO, NSDL or JIO — one your account has (see /dmt/banks). |
Notes
Account numbers are masked to the last four digits.
curl "https://apipe.in/api/corp/v1/dmt/recipients?mobile=<mobile>&bank=<bank>" \
-H "X-Api-Token: <your-token>"<…> with your own value. Only the required fields are shown.Banks a beneficiary may be at
GET/api/corp/v1/dmt/beneficiary-banks
Query parameters
| Name | Description |
|---|---|
mobilerequired | Sender (customer) mobile number. |
bankrequired | Transfer bank: ARTL, FINO, NSDL or JIO — one your account has (see /dmt/banks). |
Notes
Each with its bank_code and, where known, a master IFSC.
curl "https://apipe.in/api/corp/v1/dmt/beneficiary-banks?mobile=<mobile>&bank=<bank>" \
-H "X-Api-Token: <your-token>"<…> with your own value. Only the required fields are shown.Bank, branch and address for an IFSC
GET/api/corp/v1/dmt/ifsc/{ifsc}
curl "https://apipe.in/api/corp/v1/dmt/ifsc/<ifsc>" \
-H "X-Api-Token: <your-token>"<…> with your own value.Branches (with IFSC) of a beneficiary's bank
GET/api/corp/v1/dmt/branches
Query parameters
| Name | Description |
|---|---|
namerequired | The bank's name, as listed by /dmt/beneficiary-banks. |
qoptional | Branch or city text. |
curl "https://apipe.in/api/corp/v1/dmt/branches?name=<name>" \
-H "X-Api-Token: <your-token>"<…> with your own value. Only the required fields are shown.A bank's master IFSC
GET/api/corp/v1/dmt/master-ifsc
Query parameters
| Name | Description |
|---|---|
bank_coderequired | From /dmt/beneficiary-banks. |
curl "https://apipe.in/api/corp/v1/dmt/master-ifsc?bank_code=<bank_code>" \
-H "X-Api-Token: <your-token>"<…> with your own value. Only the required fields are shown.Add a beneficiary
POST/api/corp/v1/dmt/recipient
Body parameters
| Name | Description |
|---|---|
mobilerequired | Sender (customer) mobile number. |
bankrequired | Transfer bank: ARTL, FINO, NSDL or JIO — one your account has (see /dmt/banks). |
namerequired | Beneficiary name. |
accountrequired | Account number. |
ifscrequired | IFSC. |
bank_codeoptional | From /dmt/beneficiary-banks. |
recipient_mobileoptional | Beneficiary mobile. |
Notes
Free. Returns recipient_id.
curl "https://apipe.in/api/corp/v1/dmt/recipient" \
-X POST \
-H "X-Api-Token: <your-token>" \
-H "Content-Type: application/json" \
-d '{
"mobile": "<mobile>",
"bank": "<bank>",
"name": "<name>",
"account": "<account>",
"ifsc": "<ifsc>"
}'<…> with your own value. Only the required fields are shown.Remove a beneficiary
POST/api/corp/v1/dmt/recipient/delete
Body parameters
| Name | Description |
|---|---|
mobilerequired | Sender (customer) mobile number. |
bankrequired | Transfer bank: ARTL, FINO, NSDL or JIO — one your account has (see /dmt/banks). |
recipient_idrequired | From /dmt/recipients. |
curl "https://apipe.in/api/corp/v1/dmt/recipient/delete" \
-X POST \
-H "X-Api-Token: <your-token>" \
-H "Content-Type: application/json" \
-d '{
"mobile": "<mobile>",
"bank": "<bank>",
"recipient_id": "<recipient_id>"
}'<…> with your own value. Only the required fields are shown.Check a beneficiary account (penny drop)
Moves moneyPOST/api/corp/v1/dmt/recipient/verify
Body parameters
| Name | Description |
|---|---|
mobilerequired | Sender (customer) mobile number. |
bankrequired | Transfer bank: ARTL, FINO, NSDL or JIO — one your account has (see /dmt/banks). |
accountrequired | Account number. |
ifscrequired | IFSC. |
confirmrequired | Send 1: you accept the charge. |
request_idrequired | Your unique reference: a repeat is never charged twice. |
Notes
CHARGEABLE, also when the bank says the account is invalid; not charged when no answer came back. Returns the account holder's name.
curl "https://apipe.in/api/corp/v1/dmt/recipient/verify" \
-X POST \
-H "X-Api-Token: <your-token>" \
-H "Content-Type: application/json" \
-d '{
"mobile": "<mobile>",
"bank": "<bank>",
"account": "<account>",
"ifsc": "<ifsc>",
"confirm": "<confirm>",
"request_id": "<request_id>"
}'<…> with your own value. Only the required fields are shown.Charges and totals for an amount (free)
POST/api/corp/v1/dmt/transfer/quote
Body parameters
| Name | Description |
|---|---|
mobilerequired | Sender (customer) mobile number. |
bankrequired | Transfer bank: ARTL, FINO, NSDL or JIO — one your account has (see /dmt/banks). |
recipient_idrequired | Beneficiary. |
amountrequired | Rupees. |
curl "https://apipe.in/api/corp/v1/dmt/transfer/quote" \
-X POST \
-H "X-Api-Token: <your-token>" \
-H "Content-Type: application/json" \
-d '{
"mobile": "<mobile>",
"bank": "<bank>",
"recipient_id": "<recipient_id>",
"amount": "<amount>"
}'<…> with your own value. Only the required fields are shown.How many parts an amount takes, and each part's fee
POST/api/corp/v1/dmt/transfer/plan
Body parameters
| Name | Description |
|---|---|
mobilerequired | Sender (customer) mobile number. |
bankrequired | Transfer bank: ARTL, FINO, NSDL or JIO — one your account has (see /dmt/banks). |
recipient_idrequired | Beneficiary. |
amountrequired | Rupees. |
curl "https://apipe.in/api/corp/v1/dmt/transfer/plan" \
-X POST \
-H "X-Api-Token: <your-token>" \
-H "Content-Type: application/json" \
-d '{
"mobile": "<mobile>",
"bank": "<bank>",
"recipient_id": "<recipient_id>",
"amount": "<amount>"
}'<…> with your own value. Only the required fields are shown.Start a transfer: sends the sender an OTP
POST/api/corp/v1/dmt/transfer/otp
Body parameters
| Name | Description |
|---|---|
mobilerequired | Sender (customer) mobile number. |
bankrequired | Transfer bank: ARTL, FINO, NSDL or JIO — one your account has (see /dmt/banks). |
recipient_idrequired | Beneficiary. |
amountrequired | Rupees, within the bank's per-transfer limits. |
Notes
Returns the transfer ref; the OTP is valid for 15 minutes. Nothing is debited yet. The same beneficiary and amount again while it is open answers duplicate with that ref.
curl "https://apipe.in/api/corp/v1/dmt/transfer/otp" \
-X POST \
-H "X-Api-Token: <your-token>" \
-H "Content-Type: application/json" \
-d '{
"mobile": "<mobile>",
"bank": "<bank>",
"recipient_id": "<recipient_id>",
"amount": "<amount>"
}'<…> with your own value. Only the required fields are shown.Send the money
Moves moneyPOST/api/corp/v1/dmt/transfer
Body parameters
| Name | Description |
|---|---|
refrequired | The transfer reference from /transfer/otp. |
otprequired | The OTP the sender received. |
request_idrequired | Your unique reference (idempotency key). |
Notes
status is success | pending | failed. If you get no answer, send the SAME request again: a repeated request_id returns the original transfer, never a second one.
A failed answer with an empty order_id is a refusal (service off for your account, KYC, the service hours, a frozen wallet …): nothing was sent and nothing charged. The OTP step stays open until it expires, so once the cause is fixed you may submit it again — or cancel it.
curl "https://apipe.in/api/corp/v1/dmt/transfer" \
-X POST \
-H "X-Api-Token: <your-token>" \
-H "Content-Type: application/json" \
-d '{
"ref": "<ref>",
"otp": "<otp>",
"request_id": "<request_id>"
}'<…> with your own value. Only the required fields are shown.Cancel a transfer still waiting for its OTP
POST/api/corp/v1/dmt/transfer/cancel
Body parameters
| Name | Description |
|---|---|
refrequired | The transfer reference. |
Notes
For a lost or expired OTP: nothing was sent or charged, and you can start the transfer again at once for a fresh OTP. A transfer already submitted cannot be cancelled (409 cannot_cancel).
curl "https://apipe.in/api/corp/v1/dmt/transfer/cancel" \
-X POST \
-H "X-Api-Token: <your-token>" \
-H "Content-Type: application/json" \
-d '{
"ref": "<ref>"
}'<…> with your own value. Only the required fields are shown.Status of one transfer
GET/api/corp/v1/dmt/transfer/{ref}
Notes
With the bank reference (UTR) once sent, and refund_available when the bank has parked it for refund.
curl "https://apipe.in/api/corp/v1/dmt/transfer/<ref>" \
-H "X-Api-Token: <your-token>"<…> with your own value.Find a transfer by your own reference
GET/api/corp/v1/dmt/transfer
Query parameters
| Name | Description |
|---|---|
request_idrequired | The request_id you sent to /dmt/transfer. |
Notes
Same answer as GET /dmt/transfer/{ref}.
curl "https://apipe.in/api/corp/v1/dmt/transfer?request_id=<request_id>" \
-H "X-Api-Token: <your-token>"<…> with your own value. Only the required fields are shown.Refund a parked transfer: sends the sender an OTP
POST/api/corp/v1/dmt/transfer/refund/otp
Body parameters
| Name | Description |
|---|---|
refrequired | A transfer whose status says refund_available. |
Notes
At most 3 OTPs per transfer, sent by the bank to the sender.
curl "https://apipe.in/api/corp/v1/dmt/transfer/refund/otp" \
-X POST \
-H "X-Api-Token: <your-token>" \
-H "Content-Type: application/json" \
-d '{
"ref": "<ref>"
}'<…> with your own value. Only the required fields are shown.Complete the refund with the sender's OTP
Moves moneyPOST/api/corp/v1/dmt/transfer/refund
Body parameters
| Name | Description |
|---|---|
refrequired | The transfer. |
otprequired | The OTP the sender received. |
Notes
The amount comes back to your wallet once, whatever you retry. Five OTP attempts per transfer per day.
curl "https://apipe.in/api/corp/v1/dmt/transfer/refund" \
-X POST \
-H "X-Api-Token: <your-token>" \
-H "Content-Type: application/json" \
-d '{
"ref": "<ref>",
"otp": "<otp>"
}'<…> with your own value. Only the required fields are shown.Start a split transfer
POST/api/corp/v1/dmt/transfer/batch
Body parameters
| Name | Description |
|---|---|
mobilerequired | Sender (customer) mobile number. |
bankrequired | Transfer bank: ARTL, FINO, NSDL or JIO — one your account has (see /dmt/banks). |
recipient_idrequired | Beneficiary. |
amountrequired | The whole amount, in rupees. |
request_idrequired | Your unique reference. |
Notes
Returns batch_ref and sends the OTP for the first part.
curl "https://apipe.in/api/corp/v1/dmt/transfer/batch" \
-X POST \
-H "X-Api-Token: <your-token>" \
-H "Content-Type: application/json" \
-d '{
"mobile": "<mobile>",
"bank": "<bank>",
"recipient_id": "<recipient_id>",
"amount": "<amount>",
"request_id": "<request_id>"
}'<…> with your own value. Only the required fields are shown.Send one part with its OTP
Moves moneyPOST/api/corp/v1/dmt/transfer/batch/otp
Body parameters
| Name | Description |
|---|---|
batch_refrequired | From batch. |
otprequired | The OTP for this part. |
leg_refoptional | The part, as the batch status names it. |
Notes
Each part is debited and sent on its own; the reply says which part is next.
curl "https://apipe.in/api/corp/v1/dmt/transfer/batch/otp" \
-X POST \
-H "X-Api-Token: <your-token>" \
-H "Content-Type: application/json" \
-d '{
"batch_ref": "<batch_ref>",
"otp": "<otp>"
}'<…> with your own value. Only the required fields are shown.Progress of a split transfer
GET/api/corp/v1/dmt/transfer/batch/{ref}
curl "https://apipe.in/api/corp/v1/dmt/transfer/batch/<ref>" \
-H "X-Api-Token: <your-token>"<…> with your own value.