Skip to main content
We POST a JSON event to every active endpoint you registered. Answer any 2xx within 10 seconds; do the work afterwards. A payment sends an event when it ends completed, failed or cancelled; one rejected at once sends none — the POST /payouts answer is its outcome.

Envelope

id is the event’s: dedupe on it. data of a payout.* event is the payment, as GET /payouts/{id} returns it — data.id is its po_ id. data of a deposit.* event is the deposit — the transfer, its amount and its status (pending, credited or in_review); data.id is its dep_ id.

Failure codes

A payment that ended unpaid carries error — {"code": "…", "message": "…"} — once it is failed, rejected or cancelled, otherwise null: in the POST /payouts answer, in GET /payouts/{id}, and as data.error on payout.failed and payout.cancelled. Branch on the code to tell the end user what happened; show the message if you like. New codes may be added: treat a code you don’t know by the status — nothing was debited unless it says otherwise.
payout.failed

Verify the signature

Every delivery carries X-Rampa-Signature: t=<unix seconds>,v1=<hex> and X-Rampa-Event-Id. v1 is HMAC-SHA256 of "<t>.<raw body>" with your endpoint’s secret. Verify over the raw bytes, compare in constant time, and reject stale timestamps.

Delivery

  • At least once. An event can arrive more than once. Dedupe on the event id (also in X-Rampa-Event-Id).
  • Order is not guaranteed. Trust the payment’s status, not arrival order; when in doubt, GET the payment.
  • Retries. A non-2xx, a timeout or a redirect is retried with backoff (30 s, doubling, up to 1 h), up to 8 attempts.
  • Auto-pause. After 5 events in a row exhaust their retries, the endpoint is paused. Events keep queueing for it. Fix it — POST /webhooks/{id}/test checks — then POST /webhooks/{id}/reactivate: what was queued is sent, and so is every delivery of the last 7 days that ran out of retries.
Sandbox note. While the sandbox rollout finishes, webhook delivery may be off. Every flow also works by polling GET /payouts/{id}, GET /wallets and GET /wallets/transactions — build polling as your fallback either way.