Two statuses, two different questions#
The top-level status tells you whether the API request succeeded. The transaction’s data.status tells you whether the payment is pending, successful, or failed. Manual verification is a separate workflow.
| Value | Meaning |
|---|---|
status: "success" | The API request was accepted or processed successfully |
data.status: "pending" | Payment has not reached a final successful state |
data.status: "success" | The transaction is recorded as successful |
manual_verification_status | The current evidence review state; not proof of funds |
Hosted checkout flow#
- 1Create an orderYour server → NiriPay
- 2Open checkoutYour customer pays
- 3Confirm paymentVerify & reconcile
After the customer pays, checkout may request a screenshot, a UTR, or additional documents. Browser OCR helps read details; it cannot confirm receipt of money.
Evidence matching#
The evidence workflow compares UTRs and recipient UPI details with eligible orders. Missing, conflicting, masked, or ambiguous details can require manual review. A screenshot can match an order without the payment being confirmed.
Use the v2 evidence endpoint for its documented evidence contract. The v1 screenshot endpoint remains a distinct compatibility flow with different fields and responses.
Complete the order once#
Verify callbacks, query status where needed, and enforce idempotency in your own ledger and fulfillment logic. A duplicate webhook or a repeated status check must not credit a customer twice.
Handle missing notifications#
Use the recovery guide to reconcile records when your server is unavailable or delivery is delayed.