Corporate APIv1

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.

Signed requests only. Once this service is switched on for your account, every call on this page must be signed with your signing secret (see Request signing). A call with the API token alone is refused with HTTP 401 and invalid_signature.

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).

Request
curl "https://apipe.in/api/corp/v1/dmt/banks" \
  -H "X-Api-Token: <your-token>"
Replace each <…> with your own value.

Look up a sender: registered, and the limit left

GET/api/corp/v1/dmt/remitter

Query parameters

NameDescription
mobilerequiredSender (customer) mobile number.
bankrequiredTransfer bank: ARTL, FINO, NSDL or JIO — one your account has (see /dmt/banks).
Request
curl "https://apipe.in/api/corp/v1/dmt/remitter?mobile=<mobile>&bank=<bank>" \
  -H "X-Api-Token: <your-token>"
Replace each <…> 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

NameDescription
mobilerequiredSender (customer) mobile number.
bankrequiredTransfer bank: ARTL, FINO, NSDL or JIO — one your account has (see /dmt/banks).
namerequiredSender's full name (at least 5 characters).
pincoderequiredSender's 6-digit pincode.
aadhaaroptionalWhere the bank asks for it (/dmt/banks), with bio_type and bio_pid for a fingerprint capture.
fieldsoptionalThe 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.

Request
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>"
  }'
Replace each <…> with your own value. Only the required fields are shown.

Complete sender registration with the OTP

Moves money

POST/api/corp/v1/dmt/remitter/verify

Body parameters

NameDescription
mobilerequiredSender (customer) mobile number.
bankrequiredTransfer bank: ARTL, FINO, NSDL or JIO — one your account has (see /dmt/banks).
otprequiredThe OTP the sender received.
registration_refrequiredFrom register.

Notes

The registration charge is taken once per sender and bank, only after the bank confirms.

Request
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>"
  }'
Replace each <…> with your own value. Only the required fields are shown.

Resend the registration OTP

POST/api/corp/v1/dmt/remitter/resend-otp

Body parameters

NameDescription
mobilerequiredSender (customer) mobile number.
bankrequiredTransfer bank: ARTL, FINO, NSDL or JIO — one your account has (see /dmt/banks).

Notes

At most 3 resends, 30 seconds apart.

Request
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>"
  }'
Replace each <…> with your own value. Only the required fields are shown.

Beneficiaries of a sender

GET/api/corp/v1/dmt/recipients

Query parameters

NameDescription
mobilerequiredSender (customer) mobile number.
bankrequiredTransfer bank: ARTL, FINO, NSDL or JIO — one your account has (see /dmt/banks).

Notes

Account numbers are masked to the last four digits.

Request
curl "https://apipe.in/api/corp/v1/dmt/recipients?mobile=<mobile>&bank=<bank>" \
  -H "X-Api-Token: <your-token>"
Replace each <…> 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

NameDescription
mobilerequiredSender (customer) mobile number.
bankrequiredTransfer 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.

Request
curl "https://apipe.in/api/corp/v1/dmt/beneficiary-banks?mobile=<mobile>&bank=<bank>" \
  -H "X-Api-Token: <your-token>"
Replace each <…> with your own value. Only the required fields are shown.

Bank, branch and address for an IFSC

GET/api/corp/v1/dmt/ifsc/{ifsc}

Request
curl "https://apipe.in/api/corp/v1/dmt/ifsc/<ifsc>" \
  -H "X-Api-Token: <your-token>"
Replace each <…> with your own value.

Branches (with IFSC) of a beneficiary's bank

GET/api/corp/v1/dmt/branches

Query parameters

NameDescription
namerequiredThe bank's name, as listed by /dmt/beneficiary-banks.
qoptionalBranch or city text.
Request
curl "https://apipe.in/api/corp/v1/dmt/branches?name=<name>" \
  -H "X-Api-Token: <your-token>"
Replace each <…> with your own value. Only the required fields are shown.

A bank's master IFSC

GET/api/corp/v1/dmt/master-ifsc

Query parameters

NameDescription
bank_coderequiredFrom /dmt/beneficiary-banks.
Request
curl "https://apipe.in/api/corp/v1/dmt/master-ifsc?bank_code=<bank_code>" \
  -H "X-Api-Token: <your-token>"
Replace each <…> with your own value. Only the required fields are shown.

Add a beneficiary

POST/api/corp/v1/dmt/recipient

Body parameters

NameDescription
mobilerequiredSender (customer) mobile number.
bankrequiredTransfer bank: ARTL, FINO, NSDL or JIO — one your account has (see /dmt/banks).
namerequiredBeneficiary name.
accountrequiredAccount number.
ifscrequiredIFSC.
bank_codeoptionalFrom /dmt/beneficiary-banks.
recipient_mobileoptionalBeneficiary mobile.

Notes

Free. Returns recipient_id.

Request
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>"
  }'
Replace each <…> with your own value. Only the required fields are shown.

Remove a beneficiary

POST/api/corp/v1/dmt/recipient/delete

Body parameters

NameDescription
mobilerequiredSender (customer) mobile number.
bankrequiredTransfer bank: ARTL, FINO, NSDL or JIO — one your account has (see /dmt/banks).
recipient_idrequiredFrom /dmt/recipients.
Request
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>"
  }'
Replace each <…> with your own value. Only the required fields are shown.

Check a beneficiary account (penny drop)

Moves money

POST/api/corp/v1/dmt/recipient/verify

Body parameters

NameDescription
mobilerequiredSender (customer) mobile number.
bankrequiredTransfer bank: ARTL, FINO, NSDL or JIO — one your account has (see /dmt/banks).
accountrequiredAccount number.
ifscrequiredIFSC.
confirmrequiredSend 1: you accept the charge.
request_idrequiredYour 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.

Request
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>"
  }'
Replace each <…> 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

NameDescription
mobilerequiredSender (customer) mobile number.
bankrequiredTransfer bank: ARTL, FINO, NSDL or JIO — one your account has (see /dmt/banks).
recipient_idrequiredBeneficiary.
amountrequiredRupees.
Request
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>"
  }'
Replace each <…> 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

NameDescription
mobilerequiredSender (customer) mobile number.
bankrequiredTransfer bank: ARTL, FINO, NSDL or JIO — one your account has (see /dmt/banks).
recipient_idrequiredBeneficiary.
amountrequiredRupees.
Request
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>"
  }'
Replace each <…> 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

NameDescription
mobilerequiredSender (customer) mobile number.
bankrequiredTransfer bank: ARTL, FINO, NSDL or JIO — one your account has (see /dmt/banks).
recipient_idrequiredBeneficiary.
amountrequiredRupees, 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.

Request
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>"
  }'
Replace each <…> with your own value. Only the required fields are shown.

Send the money

Moves money

POST/api/corp/v1/dmt/transfer

Body parameters

NameDescription
refrequiredThe transfer reference from /transfer/otp.
otprequiredThe OTP the sender received.
request_idrequiredYour 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.

Request
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>"
  }'
Replace each <…> 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

NameDescription
refrequiredThe 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).

Request
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>"
  }'
Replace each <…> 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.

Request
curl "https://apipe.in/api/corp/v1/dmt/transfer/<ref>" \
  -H "X-Api-Token: <your-token>"
Replace each <…> with your own value.

Find a transfer by your own reference

GET/api/corp/v1/dmt/transfer

Query parameters

NameDescription
request_idrequiredThe request_id you sent to /dmt/transfer.

Notes

Same answer as GET /dmt/transfer/{ref}.

Request
curl "https://apipe.in/api/corp/v1/dmt/transfer?request_id=<request_id>" \
  -H "X-Api-Token: <your-token>"
Replace each <…> 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

NameDescription
refrequiredA transfer whose status says refund_available.

Notes

At most 3 OTPs per transfer, sent by the bank to the sender.

Request
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>"
  }'
Replace each <…> with your own value. Only the required fields are shown.

Complete the refund with the sender's OTP

Moves money

POST/api/corp/v1/dmt/transfer/refund

Body parameters

NameDescription
refrequiredThe transfer.
otprequiredThe OTP the sender received.

Notes

The amount comes back to your wallet once, whatever you retry. Five OTP attempts per transfer per day.

Request
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>"
  }'
Replace each <…> with your own value. Only the required fields are shown.

Start a split transfer

POST/api/corp/v1/dmt/transfer/batch

Body parameters

NameDescription
mobilerequiredSender (customer) mobile number.
bankrequiredTransfer bank: ARTL, FINO, NSDL or JIO — one your account has (see /dmt/banks).
recipient_idrequiredBeneficiary.
amountrequiredThe whole amount, in rupees.
request_idrequiredYour unique reference.

Notes

Returns batch_ref and sends the OTP for the first part.

Request
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>"
  }'
Replace each <…> with your own value. Only the required fields are shown.

Send one part with its OTP

Moves money

POST/api/corp/v1/dmt/transfer/batch/otp

Body parameters

NameDescription
batch_refrequiredFrom batch.
otprequiredThe OTP for this part.
leg_refoptionalThe part, as the batch status names it.

Notes

Each part is debited and sent on its own; the reply says which part is next.

Request
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>"
  }'
Replace each <…> with your own value. Only the required fields are shown.

Progress of a split transfer

GET/api/corp/v1/dmt/transfer/batch/{ref}

Request
curl "https://apipe.in/api/corp/v1/dmt/transfer/batch/<ref>" \
  -H "X-Api-Token: <your-token>"
Replace each <…> with your own value.