Reference fields by operation
Different operations use different reference fields:| Operation | Field | Where |
|---|---|---|
| Bill payment | requestRef | Request body |
| Bank transfer | transferCode | Generated by server, returned in response |
Bill payments — requestRef
When paying a bill, pass a requestRef in the request body. If the request times out or fails with a network error, retry using the same requestRef. The API and the upstream processor use this value to identify the transaction.
Always include
requestRef in bill payment requests. If omitted, the server auto-generates a reference that cannot be predicted — you will be unable to look up or retry the transaction safely.Bank transfers — transferCode
For bank transfers, the server generates a transferCode internally using a timestamp and prefix. The transferCode is returned in the response data object:
TransferCode to check the status of the transfer:
Generating unique references
A goodrequestRef is:
- Unique per transaction — never reuse a reference for a different payment
- Deterministic for retries — always reuse the same reference when retrying the same failed request
- 13 digits — matches the format expected by the upstream processor
Timestamp-based
Combine a Unix timestamp in milliseconds with a random suffix for a compact, collision-resistant 13-digit value.
UUID-derived
Take the first 13 digits of a UUID’s numeric representation, or hash a UUID down to 13 digits.
Which requests are idempotent
Not all requests are safe to retry unconditionally:| Request type | Idempotent? | Notes |
|---|---|---|
POST /api/v1/bills/pay with requestRef | Yes | Same requestRef maps to the same upstream transaction |
POST /api/v1/bills/pay without requestRef | No | A new unpredictable reference is generated each time |
POST /api/v1/transfers/initiate | No | The server generates a new transferCode on each call; always check status before retrying |
GET requests (status checks, lookups) | Yes | Safe to retry at any time |
POST /api/v1/verify/* (KYC) | No | Each call deducts from your balance |
Safe retry pattern
Generate a reference before the request
Create your
requestRef and store it in your database associated with the pending operation before you send the first request.Handle the response
If the response is successful (
success: true), mark the transaction as complete in your database.If the response is a network error or a 500, retry with the same requestRef. Apply exponential backoff between attempts.If the response is a 400, the request was rejected — do not retry with the same parameters. Fix the input and generate a new requestRef for the corrected request.Reference uniqueness across clients
References are scoped to your API credentials. You do not need to coordinate reference namespaces across different API keys. ArequestRef used by one client will not conflict with the same value used by a different client.