Symptom:401 Unauthorized response
Causes:
Solutions:
BASH
curl -X POST https://dev-payce.auth.eu-west-1.amazoncognito.com/oauth2/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-u "YOUR_CLIENT_ID:YOUR_CLIENT_SECRET" \
-d "grant_type=client_credentials"
Authorization: Bearer eyJraWQiOiJ...
Symptom:invalid_client error from the authentication endpoint
Causes:
Solutions:
BASH
# Correct format
-u "client_id:client_secret"
# Or manually encode
echo -n "client_id:client_secret" | base64
Symptom:400 Bad Request with verification failure details
Example Error:
JSON
{
"Message": "Debtor account verification failure: details={\"AccountExists\":true,\"AccountIsOpen\":false,...}"
}
Causes:
Solutions:
| Verification Field | Resolution |
|---|---|
AccountExists: false | Verify account number with customer |
AccountIsOpen: false | Customer needs to reactivate or provide different account |
AccountTypeMatches: false | Correct the accountType field (CURRENT/SAVINGS/TRANSMISSION) |
AccountAcceptsDebits: false | Account cannot receive debits, use different account |
IdNumberMatches: false | Verify ID number matches primary account holder |
Workaround: Set verifyAccount: false to skip verification (not recommended for production)
Symptom:400 Bad Request mentioning the bank field
Cause: Bank name not in the correct format
Solution: Use uppercase, single-word format:
| Incorrect | Correct |
|---|---|
Standard Bank | STANDARDBANK |
Absa | ABSA |
First National Bank | FNB |
capitec | CAPITEC |
Symptom:409 Conflict error
Cause: The externalReference value already exists
Solutions:
JSX
const externalReference = crypto.randomUUID();
JSX
const externalReference = `MAN-${Date.now()}-${sequenceNumber}`;
Symptom: Mandate status remains PENDING_AUTHENTICATION then becomes AUTH_FAILURE
Causes:
Solutions:
JSON
{
"authenticationType": "REALTIME",
"fallbackAuthenticationType": "DELAYED_WITHOUT_AUTH"
}
JSON
{
"authenticationType": "DELAYED"
}
JSON
{
"authenticationType": "BATCH"
}
Symptom: Status AUTH_FAILURE with rejection reason
Causes:
Solutions:
Symptom: Collection status UNPAID
Common Causes and Solutions:
| Reason | Solution |
|---|---|
| Insufficient funds | Wait for next mandated date to retry |
| Account closed | Contact customer for new account details |
| Payment stopped | Contact customer, may need new mandate |
| Not provided for | After 2 consecutive failures, obtain new mandate |
PASA Rules:
Symptom: Collection status DISPUTED
Causes:
Solutions:
Symptom: Collection not processed on the expected date
Cause: Submitted after bank processing cut-off time
Cut-off Times:
| Service | Weekday | Weekend |
|---|---|---|
| Same-day | 16:20 | 09:45 |
| One-day | 16:00 | 10:15 |
| Two-day | 14:30 (2 days prior) | 09:00 |
| DebiCheck | 16:00 (2 days prior) | 11:00 (2 days prior) |
Solutions:
Symptom: Payment rejected with "exceeds industry-imposed limits"
Cause: Payment amount ≥ R5,000,000
Solution: Route high-value payments through a real-time line (contact Precium support)
Symptom: Payment status FAILED
Causes:
Solutions:
Symptom: No callbacks received at registered URL
Causes:
Solutions:
BASH
# Register callback URL
curl -X POST https://dev.api.revio.co.za/v2/clientcallbackurl/ \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"clientId": YOUR_CLIENT_ID,
"url": "https://your-server.com/webhook",
"callbackType": "EFT_COLLECTION",
"callbackVersion": "V2"
}'
JSON
{
"url": "https://webhook.site/your-unique-id"
}
Symptom: Callbacks received but marked as failed
Cause: Webhook handler takes too long to respond
Solution: Return 200 immediately, process asynchronously:
JSX
app.post('/webhook', (req, res) => {
// Respond immediately
res.status(200).send('OK');
// Process in background
processWebhookAsync(req.body);
});
Symptom: Request rejected with validation error
Common Causes:
2024-01-15T10:00:00.000Z+27-XXXXXXXXX10000 = R100.00accountType, serviceType, frequency
Symptom: Resource not found error
Causes:
Solutions:
/v2/)
Symptom: Server error response
Actions:
x-request-id in response headers
Symptom: Unexpected behaviour, missing data, or authentication failures
Cause: Mixing sandbox and production credentials/endpoints
Environment Reference:
| Environment | Auth Endpoint | API Endpoint |
|---|---|---|
| Sandbox | dev-payce.auth.eu-west-1.amazoncognito.com | dev.api.revio.co.za |
| Production | prod-payce.auth.eu-west-1.amazoncognito.com | (provided at go-live) |
Solution: Use environment variables to manage configuration:
JSX
const config = {
authUrl: process.env.REVIO_AUTH_URL,
apiUrl: process.env.REVIO_API_URL,
clientId: process.env.REVIO_CLIENT_ID,
clientSecret: process.env.REVIO_CLIENT_SECRET
};
If you cannot resolve an issue:
© 2026 Precium. All rights reserved.