Skip to navigation

Purchase Data

View as Markdown

Buys a data bundle for a phone number.

Body (JSON):

FieldTypeRules
idempotencyKeystringrequired, 4–250 chars
serviceCategoryIdstringrequired, 4–250; an active Data category (network)
productIdstringrequired, 4–250; a categoryProductId belonging to that category
phoneNumberstringrequired, exactly 11 digits
settlementIdintegerrequired

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 new idempotencyKey.
  • 409 Duplicate request in flight — another request with the same idempotencyKey is being processed.
  • 200 Duplicate request — returning existing transaction — the idempotencyKey was 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.
idempotencyKeystringOptional
serviceCategoryIdstringOptional
productIdstringOptional
phoneNumberstringOptional
settlementIdintegerOptional

Response

Success / Pending (being confirmed) / Duplicate (existing transaction)

successbooleanOptional
dataobjectOptional
messagestringOptional

Errors

400
Bad Request Error
401
Unauthorized Error
403
Forbidden Error
409
Conflict Error