API docs
Pick the system you want, copy its docs, and paste them into ChatGPT or Claude to build the integration.
The customer sends the UTR, you verify it.
Same as UTR verify, plus a payer name check.
No UTR needed. A QR with the amount, and the payment is detected by itself.
Verify a payment
Send a UTR or a transaction ID. Add the amount if it must match exactly.
/api/v1/payment/verifyAuthorization: Bearer YOUR_API_KEY
| Request field | Meaning |
|---|---|
| utr | UTR of the payment. Send this or transaction_id. |
| transaction_id | Transaction ID of the payment. Send this or utr. |
| amount | Optional. When sent, it must match exactly. |
| expected_name | Optional. The customer's KYC name. The payer name in the email must match it, otherwise the payment is rejected. |
| strict_name | Optional. true accepts only a full name match. Default accepts full or partial. |
| Field | Meaning |
|---|---|
| success | The request itself went through. |
| received | The payment was found and matched. |
| amount | Amount that came in. null when nothing matched. |
| transaction_id | The matched transaction ID. |
| utr | UTR from the payment email, if it had one. |
| sender_name | Name of the payer, or null. |
| already_verified | Same payment was verified before. Never credit it twice. |
| name_match | Only when expected_name was sent: full, partial or none. |
| HTTP | When |
|---|---|
| 200 | Verification ran. Read received for the result. |
| 400 | Broken JSON, or a missing or badly formatted utr / transaction_id. |
| 401 | API key missing or wrong. |
| 402 | Subscription inactive. |
| 500 | Server problem, usually the Gmail connection. |
Automatic payments (orders)
No UTR needed. Create an order, show the QR, and ErenApi finds the payment in the merchant's inbox by itself. Your server asks for the order status every 5 seconds.
/api/v1/orders{
"amount": 28,
"reference": "user_42",
"expires_in_minutes": 5
}
{
"success": true,
"order_id": "ord_9f2c1a7b3d40",
"status": "pending",
"amount": 28,
"pay_amount": 28.37,
"currency": "INR",
"reference": "user_42",
"expires_at": "2026-10-30T09:35:00.000Z",
"expires_in_seconds": 300,
"message": "Waiting for payment.",
"upi_link": "upi://pay?pa=you@fam&am=28.37&cu=INR",
"qr_url": "https://your-site/api/v1/qr?...&format=png"
}
The customer must pay exactly pay_amount. It has a few extra paise so every open order has its own amount. The QR already contains it. Credit the customer amount, not pay_amount.
/api/v1/orders/{order_id}{
"success": true,
"order_id": "ord_9f2c1a7b3d40",
"status": "paid",
"amount": 28,
"pay_amount": 28.37,
"credit_amount": 28,
"paid_at": "2026-10-30T09:32:10.000Z",
"payment": {
"amount": 28.37,
"transaction_id": "FMPIB2048117735",
"utr": "428917305561",
"sender_name": "RAHUL S",
"date": "2026-10-30T15:02:00+05:30"
},
"message": "Payment received. Credit the customer."
}
| status | What to do |
|---|---|
| pending | Keep asking every 5 seconds. |
| paid | Credit the customer credit_amount. Stop asking. |
| expired | Stop asking. If late_payment is present, a payment came too late: do not credit it. |
| HTTP | When |
|---|---|
| 400 | Bad amount, bad order id, or no saved UPI ID. |
| 401 | API key missing or wrong. |
| 402 | Subscription inactive. |
| 404 | Order not found. |
| 429 | Too many open orders for this amount. Try again in a few minutes. |
| 500 | Server problem, usually the Gmail connection. |
UPI QR (optional)
Returns a standard upi://pay QR as an SVG image. Skip it if you already have your own QR.
/api/v1/qr
Save your UPI ID once in the dashboard. Then skip upi_id and send your API key. Add format=png for a PNG image (works with Telegram).
Try it live
Use your own key. Don't paste it on a shared computer.
Send a request to see the result.
QR generator
Make a payment QR for any UPI ID.