Payout Webhooks

PayRam POSTs a JSON event to your webhook URL each time a payout changes status, so you don’t have to poll. Requires PayRam v3.1.1 or later.
Setup
Register an HTTPS URL for the project in the dashboard (Project → Webhooks) and set it to active. It must be publicly reachable and answer 2xx.
Which payouts send webhooks
Every merchant payout — API and dashboard. Dashboard payouts send their full lifecycle (PayRam Core v3.9.0 and later). The payload’s created_by field tells them apart: user for API payouts, system for dashboard payouts (PayRam Core v3.9.0 and later). Referral payouts do not send webhooks.
Event types
event_type
status
Meaning
payout.pending-approval
PENDING-APPROVAL
Created and held for approval. Sent again when an admin approves, while the approval code is awaited.
payout.approved
APPROVED
Queued to send (API status pending).
payout.initiated
INITIATED
Broadcast; tx_hash set.
payout.sent
SENT
Confirmed on chain — success. Carries the final tx_hash.
payout.failed
FAILED
Did not go through; see failure_reason.
payout.rejected
REJECTED
Rejected by an admin.
payout.cancelled
CANCELLED
Cancelled before sending.
There is no payout.pending and no payout.processed event — treat payout.sent as the final success event.
Payload
The body is snake_case JSON; timestamps are Unix seconds.
event_type
See Event types.
payout_id
The payout id — use it with GET Single Payout.
network / token
Network code and token.
amount / amount_usd
Amount in the token, and its USD value at creation.
email
Recipient email.
address
Recipient wallet.
from_address
Project hot wallet the payout is sent from.
tx_hash
Transaction hash; empty until initiated. Can change while initiated — keep the latest.
status
Uppercase status (see Event types).
withdrawal_type
Always payout_merchant.
created_by
user (API payout) or system (dashboard payout). (PayRam Core v3.9.0 and later)
currency_type
token or coin (native ETH, POL, TRX).
created_at / updated_at / timestamp
Unix seconds; timestamp equals updated_at.
failure_reason
Reason on payout.failed and payout.rejected; empty otherwise.
Verifying the signature
Each delivery carries X-Payram-Signature: sha256=<hex> — an HMAC-SHA256 of the raw request body, keyed with your project API key. The legacy API-KEY header (your key, verbatim) is also sent. Compute the HMAC over the exact raw bytes, not re-serialized JSON:
Delivery
Ping first. Before each delivery PayRam POSTs
{"event_type": "payout.ping", ...}to each URL. The ping carriesX-Webhook-Test: trueand is signed like every other webhook (PayRam Core v3.9.0 and later). Answer it2xx, or that URL is skipped for this event.3 attempts — immediately, after 2s, after 4s. A response of
400or above, or no response within 60 seconds, counts as a failure. There is no later redelivery: if all attempts fail, reconcile with GET Single Payout. The payout’swebhookStatusshows the last result.Be idempotent. Events can repeat. Key on
payout_id+status, answer2xxquickly and process asynchronously.
Last updated