ϟ STORMPAY

Developer documentation

Create a merchant account, wait for approval, connect your Gmail / UPI account, and create an API key in your dashboard.

Create an order

POST https://pay.stormxp999.com/api.php?action=create-order
Content-Type: application/json
X-Api-Key: YOUR_MERCHANT_KEY
Idempotency-Key: checkout-123

{"amount":"499.00","customer_name":"Your customer"}

The response contains data.order_id, data.checkout_url, data.upi_intent, data.amount and data.status. Open the checkout URL for your customer. API orders have a five-minute checkout window.

Verify on your backend

GET https://pay.stormxp999.com/api.php?action=verify-order&order_id=sx_...
X-Api-Key: YOUR_MERCHANT_KEY

Fulfill only when data.status is paid. Other states are pending and expired. Store INR amounts as decimal strings and use the returned amount. Never accept a screenshot or browser status as authoritative.

Webhook authentication

Configure your HTTPS receiver in the dashboard. Use your separate webhook secret to check HMAC-SHA256 over X-StormPay-Timestamp + "." + raw_body. Compare against X-StormPay-Signature with a constant-time comparison, reject timestamps older than five minutes, and durably deduplicate the event ID. Return a 2xx response only after safely processing or queuing the event.

Matching and delivery

Matching requires a Gmail-authenticated FamApp receipt. Only exact order-reference, amount and time matches auto-confirm; other receipts require merchant review. Confirmation queues payment.success. The one-minute worker delivers events with up to six attempts. A checkout’s expiry does not prevent late UPI transfers; reconcile those against the original order.

Keep your key private

Use header authentication from your backend. Do not put API keys in browser code, public repositories or URLs. Use a unique Idempotency-Key for each checkout and reuse it only when retrying an identical request.