IMPS payment API for India
Take IMPS bank transfers and send IMPS pay-outs through the ATLAS API. A pay-in hands the buyer an account number and an IFSC code, a pay-out needs the same two plus the bank, and everything settles in USDT.
- Account number 40145477128
- IFSC HDFC0001234
- Bank HDFC Bank
- Account holder Demo Receiver
Transfer via IMPS or NEFT from your banking app; add the beneficiary first if your bank requires it.
IMPS bank transfers, from a merchant's side
IMPS, the Immediate Payment Service, is NPCI's interbank transfer service in India. The sender pays from a bank app or net banking to a beneficiary identified by an account number and an IFSC, the 11-character code of the bank branch, in the form AAAA0XXXXXX.
For a merchant, IMPS covers two cases. On pay-ins it suits a buyer who pays from a banking app rather than a UPI app. On pay-outs it is the default rail for India in ATLAS: a request without a paymentMethod goes out by IMPS.
paymentMethod imps
- WaitingPayment Account number and IFSC sent to the buyer
- UTR 417598765432 Checked against the amount and the time
- Completed Credited to your USDT balance
How a buyer pays by IMPS through ATLAS
-
Create an IMPS order
Your server creates a pay-in with the IMPS method code and an amount in whole rupees.
-
Get an account and an IFSC
The response carries the account number, the IFSC, the bank and the account holder, the name the buyer's bank asks for when adding a beneficiary.
-
The buyer sends an IMPS transfer
In their banking app the buyer enters the account, the IFSC and the exact amount, and sends an IMPS transfer.
-
The 12-digit UTR comes back
The bank shows a 12-digit reference for the transfer. You relay it, or the buyer types it on the hosted page.
-
The UTR closes the order
Once the transfer is confirmed, the pay-in completes and the completion webhook arrives with the UTR.
{ "amount": 12500, "currency": "INR", "geo": 3, "expiresIn": 900, "paymentMethod": "imps", "merchantOrderId": "order-12345", "clientReference": "customer-7781"} { "event": "pay_in.completed", "payInId": "1c75c312-93f3-4b34-903e-10fb38a56bec", "displayId": "PI00000992", "merchantOrderId": "order-12345", "status": "Completed", "geo": "India", "utr": "417598765432"} What the API returns for an IMPS order
An IMPS pay-in returns bank details and nothing else to render. There is no QR and no upiIntentLink, and if you send includeUpiAppLinks: true on an IMPS order the flag is ignored without an error. The response only carries keys that apply to the order, so read them by name.
Two rules are worth building in early. Amounts are whole rupees: a fractional amount gets 400 VALIDATION_ERROR and is never rounded. And an IMPS amount is never adjusted. On UPI, an account with amount adjustment can serve an order slightly off the request, within a range set for that account. An IMPS buyer types the amount by hand, so an IMPS order keeps exactly what you asked for.
{ "amount": 5000, "currency": "INR", "geo": 3, "expiresIn": 900, "merchantOrderId": "order-in-imps-12345", "clientReference": "customer-7781", "paymentMethod": "imps"} { "displayId": "PI00000992", "ownerName": "Demo Receiver", "bankName": "HDFC Bank", "accountNumber": "40145477128", "ifscCode": "HDFC0001234", "amount": 5000, "requiresManualConfirmation": true} The UTR on an IMPS order
In India no pay-in is confirmed without a UTR, and IMPS is no exception. Relay the buyer's reference with POST /api/merchant/pay-in/{payInId}/utr, or ATLAS records it when it confirms the incoming payment. ATLAS records it on the order and checks it against the amount and the time.
The hosted page helps buyers who grab the wrong number. It takes the first run of 12 digits from whatever they paste, and when the paste is a 16-character alphanumeric reference, which is how NEFT and RTGS references look, it says so instead of submitting it.
IMPS on the hosted payment page
You don't have to draw the bank details yourself. Add a checkout object to the pay-in and send the buyer to checkout.url. One page serves upi, upi_intent and imps, and for IMPS it shows the account number, IFSC, bank and account holder, each with its own copy button, plus a one-line hint for the transfer. The page speaks English and Hindi and returns the buyer to your site when the payment is done. More on the hosted payment page, or put the same page inside your checkout with embedded checkout.
IMPS pay-outs to Indian bank accounts
To pay an account, call POST /api/merchant/pay-out and either leave paymentMethod out or send imps. The recipient is three fields: recipientAccountNumber (5 to 20 digits, hyphens and spaces accepted), recipientBank and recipientIfsc. Don't add recipientUpiVpa; a field from the other rail gets 400 VALIDATION_ERROR. Amounts are whole rupees.
The pay-out is funded from your USDT balance. It moves through Pending, Claimed and PendingValidation to Completed, and pay_out.completed echoes the account number, bank and IFSC you sent. The full flow, with funding and failures, is on the pay-outs page.
{ "recipientAccountNumber": "40145477128", "recipientBank": "HDFC Bank", "recipientIfsc": "HDFC0001234", "recipientName": "Demo Receiver", "amount": 10000, "currency": "INR", "geo": 3, "expiresIn": 1800, "merchantOrderId": "payout-in-12345", "clientReference": "customer-7781"} { "payOutId": "770e8400-e29b-41d4-a716-446655440111", "displayId": "PO00000041", "amountFiat": 10000, "currency": "INR", "expiresAt": "2026-09-09T16:00:00Z"} IMPS or UPI
The two rails sit side by side in India and answer different needs. UPI sends the buyer to a UPI ID, through a QR, an app button or the ID itself, with the amount pre-filled wherever the app allows. IMPS asks the buyer to enter an account and an IFSC in their bank app, which takes more typing but needs no UPI app at all. Both are NPCI systems and both close on a UTR in ATLAS. On pay-outs the gap is in the fields: UPI needs one, a VPA, and IMPS needs the account, the bank and the IFSC.
From bank transfer to USDT
An IMPS pay-in waits in WaitingPayment for its UTR, then ends in Completed, Expired or Failed. Credit the order on the signed webhook, and see webhook signatures and retries for verification.
Each completed pay-in adds USDT to your balance. Auto-settle or a withdrawal on request takes it to your TRC-20 wallet. For UPI, the hosted page in Hindi and the rest of the market, see payments in India.
FAQ
Which fields does an IMPS pay-out need?
recipientAccountNumber, recipientBank and recipientIfsc, plus the common fields such as recipientName and the amount in whole rupees.
Is IMPS the default for India pay-outs?
Yes. Leave paymentMethod out, or send imps. Send upi only when you pay a UPI ID.
Does an IMPS pay-in come with a QR code?
No. An IMPS order returns an account number, IFSC, bank and account holder. QR codes and app links belong to the UPI rail.
Do I need the buyer's UTR for an IMPS pay-in?
The order is confirmed against a UTR. You relay it through the API, the buyer types it on the hosted page, or ATLAS records it when it confirms the payment.
Can ATLAS change the amount of an IMPS order?
No. Amount adjustment applies to UPI orders only, because an IMPS buyer types the amount by hand.
Can I use the hosted page for IMPS?
Yes. Send checkout with paymentMethod: "imps"; the page shows the bank details with copy buttons, in English or Hindi.