Issue a refund

Refunds return funds to the customer's original payment method. You can refund the full remaining balance or a partial amount from Dashboard → Payments.

Refunds are issued in the Dashboard today. There is no public POST /v1/payments/:id/refund. Use GET /v1/payments/:id and the payment.refunded webhook to sync your app.

How refunds work

Only payments in succeeded or partially_refunded can be refunded. When the full amount is returned, status becomes refunded. Timing to the customer's statement depends on their bank; your Rollo balance adjusts when the refund is accepted.

Dashboard

Open Payments, find the charge, and choose Refund. Leave the amount blank to refund everything remaining, or enter a partial amount in cents.

Confirm after a dashboard refund

Example request

GET /v1/payments/pay_01H...
Authorization: Bearer rk_live_...

Example response

{
  "id": "pay_01H...",
  "object": "payment",
  "amount": 4900,
  "currency": "usd",
  "status": "partially_refunded",
  "fee": 339,
  "net_amount": 4561,
  "customer_email": "buyer@example.com",
  "refunded_amount": 1500,
  "created": 1723000000000,
  "livemode": true
}

How to handle it

Update order state from status and refunded_amount. Prefer the webhook below so you do not need to poll.

Webhook: payment.refunded

Example request

# Fired for full or partial refunds

Example response

{
  "id": "evt_...",
  "type": "payment.refunded",
  "created": 1723100000,
  "data": {
    "id": "pay_01H...",
    "amount_refunded": 1500,
    "refunded_total": 1500,
    "currency": "usd",
    "status": "partially_refunded"
  }
}

How to handle it

amount_refunded is this refund; refunded_total is the cumulative amount returned on the payment. Revoke or reduce delivered goods for that portion. Deduplicate with the event id.

See also Payments & fees.