Table of contents

DebiCheck

DebiCheck is an authenticated debit order system that requires customers to electronically confirm mandate details before collections can be processed.

Overview

DebiCheck provides:

  • Reduced disputability: Authenticated mandates are harder to dispute
  • Higher success rates: Early processing window priority
  • Account tracking: Monitor accounts for up to 10 days post-action date
  • Electronic mandate storage: Banks store authenticated mandates

How DebiCheck Works

  1. Mandate Creation: Submit the mandate request with the customer details
  2. Authentication: Customer receives and approves the mandate via their bank
  3. Confirmation: Mandate status changes to COMPLETED
  4. Collection: Create collections against authenticated mandates

Authentication Types

|Type|Code|Description|Response Time| |---|---|---|---| |Real-Time|TT1|USSD push notification|120 seconds| |Delayed Real-Time|TT1b|Extended approval window|Same day until 20:00| |Batch|TT2|Overnight processing|Up to 48 hours|

Real-Time (TT1)

Customer receives an immediate USSD/push notification and must approve within 120 seconds.

JSON

{
 "authenticationType": "REALTIME",
 "realtimeAuthRetries": 0
}

Delayed Real-Time (TT1b)

Mandate is lodged within 60 seconds, the customer has until 20:00 the same day to approve.

JSON

{
 "authenticationType": "DELAYED"
}

Batch (TT2)

Mandate submitted overnight, the customer has until 19:00 the following day to approve.

JSON

{
 "authenticationType": "BATCH"
}

Mandates

Create DebiCheck Mandate

Endpoint

POST /v2/mandate/debicheck/

Request (Fixed Value)

BASH

curl -X POST https://dev.api.revio.co.za/v2/mandate/debicheck/ \
 -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "initiationDate": "2024-01-15T10:00:00.000Z",
   "valueType": "FIXED",
   "debitSequence": "RCUR",
   "maxAmountCents": 10000,
   "amountCents": 10000,
   "allowDateAdjustment": true,
   "adjustmentCategory": "NEVER",
   "authenticationType": "REALTIME",
   "realtimeAuthRetries": 0,
   "fallbackAuthenticationType": "DELAYED_WITHOUT_AUTH",
   "profileCode": "TEST1",
   "abbreviatedName": "TESTMERCH1",
   "contractReference": "DC001",
   "debtor": {
     "accountNumber": "010553922",
     "accountType": "CURRENT",
     "bank": "ABSA",
     "branchCode": "632500",
     "firstName": "John",
     "lastName": "Smith",
     "identification": {
       "emailAddress": "john@example.com",
       "idNumber": "2001014800086",
       "phoneNumber": "+27-123456789",
       "passportNumber": ""
     }
   },
   "creditor": {
     "accountNumber": "12345678",
     "accountType": "CURRENT",
     "branchCode": "051001",
     "name": "TEST MERCHANT 1",
     "bank": "STANDARDBANK",
     "phoneNumber": "+27-615333440",
     "emailAddress": "merchant@test.com"
   },
   "releaseDate": "2024-12-31T00:00:00.000Z",
   "frequency": "MONTHLY",
   "collectionDay": 20,
   "currency": "ZAR",
   "entryClass": "21",
   "verifyAccount": false
 }'

Request Fields

|Field|Type|Required|Description| |---|---|---|---| |`initiationDate`|string|Yes|Date mandate is initiated| |`valueType`|string|Yes|Value type: `FIXED`, `VARIABLE`, `USAGEBASED`| |`debitSequence`|string|Yes|Sequence type: `RCUR`, `OOFF`, `FRST`, `FNAL`| |`maxAmountCents`|integer|Yes|Maximum collection amount in cents| |`amountCents`|integer|Yes|Standard collection amount in cents| |`allowDateAdjustment`|boolean|Yes|Allow collection date variation| |`adjustmentCategory`|string|Yes|Adjustment frequency| |`authenticationType`|string|Yes|Auth type: `REALTIME`, `DELAYED`, `BATCH`| |`realtimeAuthRetries`|integer|No|Number of real-time retry attempts| |`fallbackAuthenticationType`|string|No|Fallback if auth fails| |`profileCode`|string|Yes|Your merchant profile code| |`abbreviatedName`|string|Yes|Your PASA-registered name| |`contractReference`|string|Yes|Contract reference (max 14 chars)| |`debtor`|object|Yes|Customer details| |`creditor`|object|Yes|Merchant details| |`ultimateCreditor`|object|No|Split payment recipient| |`releaseDate`|string|No|Mandate release date| |`firstCollectionDate`|string|No|First collection date (if different)| |`firstCollectionAmountCents`|integer|No|First collection amount (if different)| |`frequency`|string|Yes|Collection frequency| |`collectionDay`|integer|Yes|Day of month (1-31)| |`trackingPeriod`|integer|No|Days to track account (0-10)| |`currency`|string|Yes|Currency (`ZAR`)| |`entryClass`|string|Yes|Always `21`| |`verifyAccount`|boolean|No|Perform account verification|

Value Types

|Type|Description|Max Amount Limit| |---|---|---| |`FIXED`|No amount adjustments allowed|Equal to `amountCents`| |`VARIABLE`|Amount adjustments allowed, disputable|1.5x `amountCents`| |`USAGEBASED`|Full flexibility, disputable|No specific limit|

Debit Sequence Types

|Type|Description| |---|---| |`FRST`|First collection of mandate| |`OOFF`|Once-off (single collection)| |`RCUR`|Recurring collection| |`RPRE`|Re-presented after failure| |`FNAL`|Final collection of mandate|

Adjustment Categories

|Value|Description| |---|---| |`NEVER`|No adjustments allowed| |`QUARTERLY`|Adjust every 3 months| |`BIANNUALLY`|Adjust every 6 months| |`ANNUALLY`|Adjust every year|

Fallback Authentication Types

Please note that fallback to DELAYED_WITHOUT_AUTH was deprecated in 2025 in line with PASA requirements.

|Value|Description| |---|---| |`DELAYED`|Fall back to TT2 batch| |`DELAYED_WITHOUT_AUTH`|Fall back without re-authentication|

Response

JSON

{
 "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
 "status": "PENDING_AUTHENTICATION",
 "authenticationType": "REALTIME",
 "valueType": "FIXED",
 "contractReference": "DC001",
 "debtor": { ... },
 "creditor": { ... }
}

Variable Value Mandate

JSON

{
 "valueType": "VARIABLE",
 "adjustmentCategory": "QUARTERLY",
 "adjustmentRate": "10.0",
 "maxAmountCents": 15000,
 "amountCents": 10000
}

Note: Use either adjustmentRate (percentage) OR adjustmentAmountCents, not both.

Usage-Based Mandate

JSON

{
 "valueType": "USAGEBASED",
 "adjustmentCategory": "NEVER",
 "maxAmountCents": 50000,
 "amountCents": 10000
}

Get Mandate Status

Endpoint

GET /v2/mandate/debicheck/{mandateId}/status/

Request

BASH

curl -X GET https://dev.api.revio.co.za/v2/mandate/debicheck/a1b2c3d4-e5f6-7890-abcd-ef1234567890/status/ \
 -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Response

JSON

{
 "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
 "status": "COMPLETED"
}

Mandate Statuses

|Status|Description| |---|---| |`NEW`|Mandate created, not yet submitted| |`PENDING_AUTHENTICATION`|Waiting for customer approval| |`COMPLETED`|Customer approved mandate| |`AUTH_FAILURE`|Authentication failed or rejected| |`CANCELLED`|Mandate cancelled| |`SUSPENDED`|Mandate temporarily suspended|

Get Mandate Details

Endpoint

GET /v2/mandate/debicheck/{mandateId}

Response

JSON

{
 "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
 "state": "COMPLETED",
 "referenceNumber": "REF123456",
 "authenticationReference": "AUTH789",
 "lastSuccessfulAuditId": "AUDIT456",
 "mandateReferenceNumber": "MRN001",
 ...
}

Store these values for mandate amendments:

  • referenceNumber
  • authenticationReference
  • lastSuccessfulAuditId

Amend DebiCheck Mandate

Modify an existing authenticated mandate.

Endpoint

PUT /v2/mandate/debicheck/{mandateId}

Request

BASH

curl -X PUT https://dev.api.revio.co.za/v2/mandate/debicheck/a1b2c3d4-e5f6-7890-abcd-ef1234567890 \
 -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "state": "COMPLETED",
   "referenceNumber": "REF123456",
   "authenticationReference": "AUTH789",
   "lastSuccessfulAuditId": "AUDIT456",
   "maxAmountCents": 15000,
   ...
 }'

Amendment Outcomes

|Change|Result| |---|---| |ID Number, Names, Phone, Email|No re-authentication| |Tracking, First Collection, Abbreviated Name|Re-authentication required| |Collection Day, Contract Reference|Re-authentication required| |Debit Amounts (if outside bounds)|Re-authentication required| |Debtor Account Number|New mandate required (AUTH_FAILURE)| |Creditor Details|New mandate required (AUTH_FAILURE)|

Collections

Create DebiCheck Collection

Endpoint

POST /v2/collection/debicheck/from_mandate

Request

BASH

curl -X POST https://dev.api.revio.co.za/v2/collection/debicheck/from_mandate \
 -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "mandateId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
   "collectionDate": "2024-02-20T00:00:00.000Z",
   "cycleDate": "2024-02-20T00:00:00.000Z",
   "debitSequence": "RCUR",
   "amountCents": 10000,
   "trackingPeriod": 0
 }'

Request Fields

|Field|Type|Required|Description| |---|---|---|---| |`mandateId`|string|Yes|Authenticated mandate ID| |`collectionDate`|string|Yes|Collection date| |`cycleDate`|string|Yes|Billing cycle date| |`debitSequence`|string|Yes|Sequence type| |`amountCents`|integer|Yes|Amount in cents| |`trackingPeriod`|integer|No|Override mandate tracking days (0-10)|

Note: Use FRST for first/pro-rata collections, RCUR for recurring.

Response

JSON

{
 "id": "coll-123-456-789",
 "mandateId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
 "status": "PENDING",
 "collectionDate": "2024-02-20T00:00:00.000Z",
 "amountCents": 10000
}

Get Collection Status

Endpoint

GET /v2/collection/debicheck/{collectionId}/status

Cut-off Times

|Service|Weekday|Weekend| |---|---|---| |DebiCheck/RMS Collect|08:00 - 16:00 (2 days before)|08:00 - 11:00 (2 days before)| |DebiCheck TT1a/b|03:00 - 18:30|03:00 - 18:30| |DebiCheck TT2|03:00 - 18:30|03:00 - 18:30|

Important: DebiCheck mandates can only be obtained between 06:00 and 20:00 on weekdays.

Account Tracking

DebiCheck supports account tracking for up to 10 days post-action date:

JSON

{
 "trackingPeriod": 10
}

If a collection fails due to insufficient funds, the bank will monitor the account and retry when funds are available.

Best Practices

  1. Have a timing plan: Switch to TT2 for authentication outside business hours
  2. Handle failures: Implement a fallback to DELAYED_WITHOUT_AUTH
  3. Plan for ignores: Follow up with customers who don't respond to authentication
  4. Use correct value type: Choose FIXED, VARIABLE, or USAGEBASED based on your use case
  5. Set appropriate max amounts: Ensure maxAmountCents covers your needs
  6. Submit early: Present collections at least 2 calendar days before collection day
  7. Match collection days: Present collections for the authenticated collection day

Testing DebiCheck Mandates

Use these contract references to simulate scenarios:

|Contract Reference|Scenario| |---|---| |`NORESPONSE`|Customer doesn't respond within timeout| |`FAILINIT`|Bank error during authentication| |`REJECT`|Customer rejects mandate| |`TIMEOUT`|Authentication times out|

See Testing for more test scenarios.