NiriPayDocs
Dashboard
DocumentationAPI referenceGuidesMerchant API v1 / v2

Your first integration

Go from a merchant API key to a confirmed payment.

1. Prepare your account#

Retrieve your API key from the merchant dashboard. Add your backend server’s public egress IP to API Key & IP Whitelist. Your merchant account must be approved.

Keep the key on your server. Never include it in frontend bundles or mobile applications.

2. Create a payment#

Send a unique merchant transaction_id, an INR amount, and your webhook_url to the create deposit endpoint. Persist your request and the returned identifiers before redirecting your customer.

Build your requestExample generator · no requests sent

cURL
Fill in the fields and select Generate example.

3. Open hosted checkout#

Redirect the customer to data.payment_page from the create response. Checkout handles the available payment options and any required evidence submission.

A return to your return_url is navigation, not proof that a payment succeeded.

4. Verify the notification#

Receive the webhook on your server. Verify its HMAC-SHA256 signature against the exact raw body, check the timestamp, and store the event idempotently. See webhook verification for a complete Node.js example.

5. Reconcile the payment#

Query deposit status with your original transaction ID. Only fulfill the order when its payment status is success. Apply each financial effect once, including when a callback repeats.

JavaScript
const response = await fetch(
  "https://api.niripay.com/api/v1/merchant/deposits/status",
  {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.NIRIPAY_API_KEY}`,
      "Content-Type": "application/json"
    },
    body: JSON.stringify({ transaction_id: "ORDER-2026-001" })
  }
);
const result = await response.json();
if (!response.ok || result.status !== "success") {
  throw new Error(result.message || "Status lookup failed");
}
// An accepted status lookup may still describe a pending payment.
if (result.data.status === "success") {
  // Persist payment and fulfillment idempotently in your database.
}

If a response is delayed#

Keep the original transaction ID and check its status. Do not blindly create a replacement payment or payout after a timeout. Use capped backoff for polling and escalate unresolved records with sanitized details.

NiriPay developer documentationSource reviewed · 27 Oct 2026