Appearance
API overview
The vendor API uses /api/v1 on this production base URL:
https://redemption.fluxr.co.zaThe examples use BASE_URL and TOKEN as placeholders.
Supported voucher providers
| Provider | provider value | Type | How it's selected |
|---|---|---|---|
| OTT | ott | Retail voucher | Auto-detected from the code |
| 1Voucher (Flash) | onevoucher | Retail voucher | Auto-detected from the code |
| FNB Voucher (Flash) | fnb | Retail voucher | Explicit provider, or fallback when BluVoucher does not recognise a 16-digit code |
| BluVoucher | bluvoucher | Retail voucher | Auto-detected from the code |
| Standard Bank Instant Money | standard_bank | Bank cash-out | Explicit provider + pin |
| Nedbank CashOut | nedbank | Bank cash-out | Explicit provider + pin |
| Capitec | capitec | Bank cash-out | Explicit provider + pin |
All redemptions settle in ZAR.
Authentication
Every endpoint requires a Bearer token:
http
Accept: application/json
Content-Type: application/json
Authorization: Bearer {{TOKEN}}Create and manage API keys in the Fluxr console under Sign in > API keys. Keys can carry an optional expiry and scoped abilities (redeem, read:wallet, read:redemptions); the plaintext token is shown once at creation.
Keep API keys on your server:
- Store the token in an environment variable such as
FLUXR_API_TOKEN. - Do not commit it or ship it in a browser or mobile app.
- Revoke and replace a key as soon as you suspect it has been exposed.
dotenv
FLUXR_API_BASE_URL=https://redemption.fluxr.co.za
FLUXR_API_TOKEN=your_token_hereResponse envelopes
Success:
json
{
"success": true,
"message": "OK",
"data": {}
}Error:
json
{
"success": false,
"message": "Human-readable message",
"errors": {
"field": ["ERROR_CODE"]
}
}For redemption failures, branch on errors.provider[0]. The message contains display text for that response. See error codes.
Validation shape
Request validation that fails before the controller runs returns Laravel's raw validation response. It has message and errors, but no success key. Do not display these validation messages to customers without reviewing them first.
The redemption lifecycle
POST /api/v1/redemptions returns one of these outcomes:
| Outcome | HTTP | What to do |
|---|---|---|
| Succeeded | 201 for a new redemption or 200 for a completed re-submission | Credit your customer. Read the updated balance from data.wallet. |
| Already redeemed | 422 + ALREADY_REDEEMED | Show the message to the customer; do not retry. |
| Failed definitively | 422 + a code from Error Codes | Show the message; retry only where the code allows it. |
| Pending confirmation | 409 + PENDING_CONFIRMATION | Do not submit the voucher again. Poll GET /api/v1/redemptions/{id} until the status changes. |
Fluxr keeps the result for ALREADY_REDEEMED, EXPIRED, and CANCELLED, so a repeat submission does not call the provider. Fluxr checks INVALID_VOUCHER and INACTIVE again on a later submission because those states can change. You can retry PROVIDER_DOWN after a short delay.
Pagination
List endpoints return data.items plus a data.meta block:
json
{
"meta": {
"current_page": 1,
"last_page": 4,
"per_page": 15,
"total": 52
}
}Pass per_page from 1 to 100. The default is 15. Use ?page=N to request the next page.
Getting access
Integration is invite-based. Request access on WhatsApp at +263 77 922 2722 and we'll set up your vendor account and console access.

