Skip to main content
Network failures happen: a timeout after you called Withdraw Funds leaves you not knowing whether the payout was created. This page covers the tools the API gives you to retry safely.
The API does not support a global Idempotency-Key header. Blindly retrying a money-moving POST can create a second transaction. Use the patterns below instead.

Payouts: check before you retry

Give every withdrawal an externalReference — a unique ID from your system. description is required alongside it:
If the request times out or errors ambiguously, look the reference up before retrying. Get Transaction accepts your externalReference in place of a transaction ID:
  • Found → the payout was created; don’t resend.
  • 404 → it never landed; safe to retry with the same reference.
This pattern does not work for NGN or mobile money payouts. Those rails must carry a provider-formatted reference, so Rolla generates one (NG-XXXXXXXX / MM-XXXXXXXX) and your externalReference is not stored on the transaction — looking it up afterwards always returns 404, whether or not the payout was created. Send metadata with your own id instead, and recover by listing GET /wallet/transactions over the window in question and matching on the metadata you attached before you resend anything.

Naturally idempotent endpoints

Some creation endpoints are keyed on an identifier you supply and can be retried freely:

Webhooks: deduplicate on event_id

Webhook deliveries may arrive more than once (retries, redelivery). Every event carries a deterministic event_id — the same logical event always has the same ID — so store processed IDs and skip duplicates. See Delivery & Retries.

Retry etiquette

  • Retry 5xx and network errors with exponential backoff; treat 4xx (other than 429) as terminal — fix the request instead.
  • For money-moving calls, always run the lookup-then-retry pattern above rather than resending on a timer.