API v1
Merchant Login Get API Keys

Webhooks

Receive real-time server-to-server notifications when payout status changes.

For bank payouts, PayGo saves status notifications and delivers them through the server scheduler. Configure your public HTTPS callback or webhook URL in the merchant panel. Failed deliveries retry with increasing delays up to one hour. Duplicate deliveries are possible: deduplicate by event_id (also in X-Webhook-Id). A later refund confirmation has a new event ID.

Payout Events

EventWhen
payout.pendingPayout created
payout.processingBeing sent to bank/UPI
payout.successBeneficiary received funds
payout.failedPayout failed or refund progressed; inspect refund_status and wallet_refunded.
payout.reversedPayout reversed

Webhook Payload

{
  "event": "payout.success",
  "reference_id": "PAY-2024-001",
  "payout_id": "POXXXXXXXXXXXX",
  "amount": 1000,
  "platform_fee": 15,
  "total_debited": 1015,
  "status": "success",
  "utr": "123456789012",
  "timestamp": "2024-06-02T14:35:00+00:00"
}

Signature Verification

Bank payout notifications use X-Webhook-Signature-Version: v2. Verify X-Webhook-Signature as HMAC-SHA256 of the exact raw request body using your active merchant Secret Key. Do not re-encode JSON before verification. Legacy events still use the API key and have no version header.

$payload = file_get_contents('php://input');
$expected = hash_hmac('sha256', $payload, getenv('PAYGO_SECRET_KEY'));
if (!hash_equals($expected, $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'])) {
    http_response_code(401); exit;
}
Always verify signatures and store the event durably before returning HTTP 200 within 10 seconds. Notifications include event_id, refund_status, refund_transaction_id and wallet_refunded. Query the status endpoint if events arrive out of order; never overwrite a terminal status with a stale pending event. A payout failure does not by itself confirm a wallet refund.