Skip to main content
You can cancel what the Cleo web app lets a payer cancel, and retry what it lets a payer retry. Both need payments:initiate and an Idempotency-Key, and both are money writes.

Cancel

POST /v1/payments/{paymentId}/cancel cancels a held or scheduled payment. You can send an optional reason (up to 500 characters), which is shown on the bill.
The answer is the payment after the cancel and a message that says where the money went: Any other status answers 409 payment_not_cancellable with details.status. A payment that changed while it was being cancelled answers the same way.

Retry

POST /v1/payables/{payableId}/retry-payment retries a bill whose payment failed. It takes no body: the retry runs on the failed payment’s rail, never on the business’s current default.
The answer has the same shape as POST /v1/payments. You can also retry by paying the failed bill with POST /v1/payments. Then name the failed payment’s rail, and on Dwolla the same bank. Anything else answers validation_error with the fields to send.

If the answer is lost

Cancel and retry never run twice under one key. If a cancel or retry fails in a way that may have moved money, every retry with that key answers 409 payment_unconfirmed. Check GET /v1/payments/{paymentId} or GET /v1/payments?payableId=... before you use a new key. See Idempotency.