Purchase Data
Buys a data bundle for a phone number.
Body (JSON):
No amount — the product’s price is charged (sending amount fails validation with "amount" is not allowed).
Purchase outcomes (shared flow):
- 200
data.status: "SUCCESS"— delivered. - 200
data.status: "PENDING"with message... purchase is being confirmed. Do not retry; check the transaction status.— provider outcome unknown; you have been debited and not refunded. Poll Fetch Single VTU Transaction; do not resend. - 400
... purchase failed. Your balance has been refunded.— provider definitively rejected; safe to retry with a newidempotencyKey. - 409
Duplicate request in flight— another request with the sameidempotencyKeyis being processed. - 200
Duplicate request — returning existing transaction— theidempotencyKeywas already used; the original transaction is returned and nothing is charged.
Your settlement balance must be strictly greater than the amount (balance <= amount is rejected as insufficient).
Error format: body validation failures (Joi) return { "status": "error", "message": "Validation error", "details": [ ... ] }; all other errors return { "success": false, "message": "..." }. Money fields (amount, fee) are Prisma Decimals and are serialized as strings (e.g. "1000").
Authentication
AuthorizationBearer
Access token from Generate Access Token (valid 15 minutes).
Request
This endpoint expects an object.
idempotencyKey
serviceCategoryId
productId
phoneNumber
settlementId
Response
Success / Pending (being confirmed) / Duplicate (existing transaction)
success
data
message
Errors
400
Bad Request Error
401
Unauthorized Error
403
Forbidden Error
409
Conflict Error
