How to build integrations that stay correct through timeouts and network hiccups: use idempotency keys, retry safely, and confirm the real outcome before acting on it.
Every money-moving request carries a client-generated identifier that makes it safe to retry. Send a unique value per operation, and reuse the same value if you need to retry that same operation.
| API | Idempotency key | Where it goes |
|---|---|---|
| International Money Transfer | Request-id | Request header (also usable as requestId in the status body) |
| Whish Pay | externalId | Request body |
| Direct Credit | externalId | Request body |
| Bills | externalId | Pay Bill request body |
| Variable Topup | externalId | Request body |
| Vouchers | externalId | Request body |
Generate the key on your side (for example a UUID or your own order reference) and store it with the order before you send the request, so you can reproduce it exactly on retry.
If you do not receive a response (timeout, dropped connection, or any communication issue), resend the same request with the same idempotency key. This never creates a duplicate:
How the "already processed" response looks differs by platform:
International Money Transfer (resend POST /api/woo/send/money with the same Request-id) returns the original response exactly as it was first returned. It does not add a retrieved flag.
The other Whish APIs (resend with the same externalId) return the response with retrieved: true to indicate it was already processed.
Do not assume an outcome from a missing response. Confirm it first, in this order:
sending.transfer.invalid.info, which means it does not exist yet, not that it failed.callbackUrl when the outcome is ready; treat that as your primary signal and use status polling as a fallback.All APIs return HTTP 200 with a status field. Branch on the body, not the HTTP code.
| Condition | Treat as |
|---|---|
status: true | Success |
status: false and code is not 500 | Failed (resolve automatically by error code) |
status: false and code: 500 | Pending (follow up with Whish Money) |
See the International Money Transfer handling guide for the full status interpretation, receipt rules, and the list of error codes to treat as final failures.
Checklist: unique key per operation · store it before sending · retry with the same key on no-response · confirm receipt before polling status · prefer callbacks · branch on status and code.