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.

POST/api/v1/payment/verify
Header
Authorization: Bearer YOUR_API_KEY
Request body

Request fieldMeaning
utrUTR of the payment. Send this or transaction_id.
transaction_idTransaction ID of the payment. Send this or utr.
amountOptional. When sent, it must match exactly.
expected_nameOptional. The customer's KYC name. The payer name in the email must match it, otherwise the payment is rejected.
strict_nameOptional. true accepts only a full name match. Default accepts full or partial.
Response

FieldMeaning
successThe request itself went through.
receivedThe payment was found and matched.
amountAmount that came in. null when nothing matched.
transaction_idThe matched transaction ID.
utrUTR from the payment email, if it had one.
sender_nameName of the payer, or null.
already_verifiedSame payment was verified before. Never credit it twice.
name_matchOnly when expected_name was sent: full, partial or none.
HTTPWhen
200Verification ran. Read received for the result.
400Broken JSON, or a missing or badly formatted utr / transaction_id.
401API key missing or wrong.
402Subscription inactive.
500Server 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.

POST/api/v1/orders
Request body
{
  "amount": 28,
  "reference": "user_42",
  "expires_in_minutes": 5
}
Response (HTTP 201)
{
  "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.

GET/api/v1/orders/{order_id}
Response when paid
{
  "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."
}
statusWhat to do
pendingKeep asking every 5 seconds.
paidCredit the customer credit_amount. Stop asking.
expiredStop asking. If late_payment is present, a payment came too late: do not credit it.
HTTPWhen
400Bad amount, bad order id, or no saved UPI ID.
401API key missing or wrong.
402Subscription inactive.
404Order not found.
429Too many open orders for this amount. Try again in a few minutes.
500Server 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.

GET/api/v1/qr
Or use your saved UPI ID

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.

Response
Send a request to see the result.

QR generator

Make a payment QR for any UPI ID.

Preview
Enter a UPI ID and generate.