Skip to main content

Debit Mandates

1.0 AUTHORIZATION​

Authorization to the APIs below requires an access token. To get more info on how to generate this access token, click on Generating Access Token

2.0 BASE URL​

All requests to the Wallet API in the test environment must be done using the web API URL below.

Test Environment: https://api-devapps.vfdbank.systems/vtech-mandate/api/v2/directdebit

LIVE Environment: https://api-apps.vfdbank.systems/vtech-mandate/api/v2/directdebit

3.1 DEBIT MANDATE APIS​

You have two options for collections via debit mandate. These options can both create a debit mandate

  1. DIRECT-MANDATE CREATE API : With this API, the payer's bank will typically contact the payer directly to confirm approval of the mandate. It also requires the payer's signature and a witness information.
  2. E-MANDATE CREATE API: With this API, an account number that needs to be funded with N50 is returned. The payer is meant to fund this account number to confirm approval of the mandate. It does not require the payer's signature and a witness information.

3.1.1 HOW TO USE THE DIRECT-MANDATE CREATE API​

  1. The developer calls the DIRECT-MANDATE CREATE API to set up the debit mandate on the customer's bank account
  2. The developer should then call the MANDATE-APPROVAL-STATUS API to confirm the status of the created mandate
  3. If the status returned from calling the MANDATE-APPROVAL-STATUS API is Bank Approved, the developer can then proceed to call the ACCOUNT DEBIT API to debit the customer's bank account where the mandate was setup

3.1.2 DIRECT-MANDATE CREATE API​

API Context: /mandate/setup

Description: This endpoint is used to setup a debit mandate on a customer's bank account.

API METHOD: POST

REQUEST HEADERS

KeyValue
AccessToken{{token}}

SAMPLE REQUEST

{
"reference": "rosapay-202308191",
"payerBank": "000007",
"payerAccountNumber": "6170778639",
"payerBvn": "222222222228",
"payerAddress": "5, Ade Street, Lagos",
"payerPhone": "09019056987",
"payerEmailAddress": "odtest@gmail.com",
"receiverBank": "999999",
"receiverBvn": "22222222222",
"receiverAccountNumber": "1001556881",
"amount": "1000",
"startDate": "02 June 2023",
"endDate": "17 July 2023",
"frequency": "1",
"witnessName": "Joe Adams",
"witnessAddress": "12, John Street, Lagos",
"witnessOccupation": "Software Engineer",
"payerSignature": "",
"witnessSignature": ""
}
FieldDescriptionStatus
referenceUnique Reference for transaction, Reference should have wallet Name as Prefix e.g rosapay-202308191Mandatory
payerAccountNummberThis is the account to initiate paymentMandatory
payerBankPayer's bank CodeMandatory
payerBvnPayer's BVNMandatory
payerAddressPayer's AddressMandatory
payerPhonePayer's PhoneMandatory
payerEmailAddressPayer's Email AddressMandatory
payerAccountnamePayer Account NameMandatory
receiverAccountNumberThis is the account to receive paymentMandatory
receiverBankReceiver's bank CodeMandatory
amountmaximum debit amountMandatory
startDateMandate Start Date e.g 02 June 2023 (Must be in this date format)Mandatory
endDateMandate End Date e.g 17 July 2023 (Must be in this date format)Mandatory
frequencyThe type of debit reoccurrence, can be daily (if you pass 1), weekly(if you pass 2) or monthly(if you pass 3)Mandatory
witnessNameName of WitnessMandatory
witnessAddressWitness House addressMandatory
witnessOccupationWitness OccupationMandatory
payerSignaturePayer's Signature base64 Picture ImageMandatory
witnessSignatureWitness Signature base64 Picture ImageMandatory
info

It's important to note that in the dev environment, the mandate should only be created with a test VFD account as the payerAccountNumber and receiverAccountNumber as creating a mandate on other bank accounts is not supported in dev

info

It's also important to note that mandates can only be setup on a commercial bank as the payerBank in the live environment.

info

It's also important to note that the least amount when creating a mandate is NGN1,000.


SAMPLE RESPONSE

{
"status": "00",
"message": "Mandate Created Successfully",
"data": {
"mandateCode": "RC1203338/1/19062023163120"
}
}

SAMPLE FAILED RESPONSE

{
"status": "99",
"message": "Invalid Payer Account Number"
}

SAMPLE REFERENCE EXIST RESPONSE

{
"status": "98",
"message": "Mandate Reference Exist"
}

SAMPLE SIGNATURE RESPONSE

{
"status": "99",
"message": "Witness Signature must be in base64"
}

3.1.3 HOW TO USE THE E-MANDATE CREATE API​

  1. The developer calls the E-MANDATE CREATE API to setup the debit mandate on the customer's bank account
  2. The developer should then call the MANDATE-APPROVAL-STATUS API to confirm the status of the created mandate
  3. If the status returned from calling the MANDATE-APPROVAL-STATUS API is Bank Approved, the developer can then proceed to call the ACCOUNT DEBIT API to debit the customer's bank account where the mandate was setup

3.1.4 E-MANDATE CREATE API​

API Context: /mandate/setup?e-mandate=true

Description: This endpoint is used to setup a debit mandate on a customer's bank account.

API METHOD: POST

REQUEST HEADERS

KeyValue
AccessToken{{token}}
Query ParametersDescriptionRequired
e-mandateThis determines if the merchant wants to create an e-mandate. Must be trueMandatory

SAMPLE REQUEST

{
"reference": "rosapay-202308191",
"payerBank": "999999",
"payerAccountNumber": "1001555949",
"payerPhone": "09019056987",
"payerEmailAddress": "test@gmail.com",
"payerAddress":"5, Johnson Street, Ikeja, Lagos",
"receiverBank": "999999",
"receiverAccountNumber": "1001556551",
"amount": "1000",
"startDate": "02 June 2023",
"endDate": "17 July 2023",
"frequency": "1"
}

FieldDescriptionStatus
referenceUnique Reference for transaction, Reference should have wallet Name as Prefix e.g rosapay-202308191Mandatory
payerAddressPayer's addressMandatory
payerAccountNumberThis is the account to initiate paymentMandatory
payerBankPayer's bank CodeMandatory
payerPhonePayer's PhoneMandatory
payerEmailAddressPayer's Email AddressMandatory
receiverAccountNumberThis is the account to receive paymentMandatory
receiverBankReceiver's bank CodeMandatory
amountmaximum debit amountMandatory
startDateMandate Start Date e.g 02 June 2023 (Must be in this date format)Mandatory
endDateMandate End Date e.g 17 July 2023 (Must be in this date format)Mandatory
frequencyThe type of debit reoccurrence, can be daily (if you pass 1), weekly(if you pass 2) or monthly(if you pass 3)Mandatory
info

It's important to note that in the live environment, the account the E-mandate is being set up on must be used for the N50 funding. This funding acts as the customer's approval of the mandate. Also note that the funding must be done within 7 days to prevent the mandate from expiring.

info

It's also important to note that mandates can only be setup on a commercial bank as the payerBank in the live environment. But the receiverBank can be a commercial bank or a non-commercial bank in both the live and test environments.

SAMPLE RESPONSE

{ 
"status":"00",
"message":"Welcome to NIBSS e-mandate authentication service, a seamless and convenient authentication experience. Kindly proceed with a token payment of N50:00 into account number \"1000000000\" with PAYSTACK - TITAN, Account name is NIGERIA INTERBANK SETTLEMENT SYSTEM PLC. Note: The payment should be done from the account on which the mandate is setup. This payment will trigger the authentication of your mandate. Thank You",
"data": {
"mandateCode":"RC1000000/1111/0001110111"
}
}

SAMPLE FAILED RESPONSE

{
"status": "99",
"message": "Invalid Payer Account Number"
}

SAMPLE REFERENCE EXIST RESPONSE

{
"status": "98",
"message": "Mandate Reference Exist"
}

3.1.5 TEST MANDATE PAYER AND RECEIVER ACCOUNTS​

S/NBank CodeAccount Number
10000021111111103
20000061111111111

4.0 ACCOUNT DEBIT​

API Context : /account/debit

Description: This endpoint allows you debit the customer's account.

API METHOD: POST

REQUEST HEADERS

KeyValue
AccessToken{{token}}

SAMPLE REQUEST

{
"amount": "1000",
"narration": "mandate test via nibsseasypay",
"mandateReference": "rosapay-2023089819319021212",
"transactionReference": "rosapay-202308981931902"
}
FieldDescriptionStatus
amountAmount to debit (must not be greater than the amount specified on mandate creation)Mandatory
narrationNarration of transactionsOptional
mandateReferenceReference used in mandate creation e.g rosapay-2023089819319021212Mandatory
transactionReferenceUnique Reference for transaction, Reference should have wallet Name as Prefix e.g rosapay-202308981931902Mandatory

SAMPLE RESPONSE

{
"status": "00",
"message": "Mandate Account Transfer",
"data": {
"sessionId": "99999903232323200620230840476432023",
"paymentReference": "BAAS-DD-2023062008452",
"mandateCode": "RC1203338/1/19062023163120"
}
}

SAMPLE INVALID RESPONSE

{
"status": "108",
"message": "Invalid Reference!"
}

4.1 ACCOUNT BALANCE​

API Context : /account/balance?reference={reference}

Description: This endpoint allows you get the payer's account balance of a created mandate.

API METHOD: GET

REQUEST HEADERS

KeyValue
AccessToken{{token}}
Query ParametersDescriptionRequired
referenceReference used in mandate creationMandatory

SAMPLE RESPONSE

{
"status": "200",
"message": "Account Balance Retrieval For - John Doe",
"data": {
"accountNo": "1001573671",
"availableBalance": "5000",
"sessionId": "099090322109909032210990903221"
}
}

SAMPLE INVALID RESPONSE

{
"status": "108",
"message": "Invalid Reference!"
}

4.2 MANDATE APPROVAL STATUS QUERY​

API Context : /mandate/status

Description: This endpoint is used to view the approval status of a mandate.

API METHOD: GET

REQUEST HEADERS

KeyValue
AccessToken{{token}}

QUERY PARAMETERS

referencetest-aqwsd111111dfegt
FieldDescriptionStatus
ReferenceReference used in mandate creationMandatory

SAMPLE RESPONSE

{
"status": "200",
"message": "Mandate Created Successfully",
"data": {
"mandateState": "ACTIVE",
"mandateWorkflowStatus": "MANDATE_APPROVED_BY_BANK",
"mandateWorkflowStatusDescription": "Bank Approved"
}
}

4.3 MANDATE DEBIT STATUS QUERY​

API Context : /transaction/status

Description: This endpoint is used to view the transaction status of a mandate debit.

API METHOD: GET

REQUEST HEADERS

KeyValue
AccessToken{{token}}

QUERY PARAMETERS

referencetest-aqwsd111111dfegt
FieldDescriptionStatus
referenceReference used in mandate debitMandatory

SAMPLE RESPONSE

{
"status": "00",
"message": "Successful Transaction Retrieval",
"data": {
"TxnId": "rosapay-098388438",
"amount": "1000.00",
"fromAccount": "1001648379",
"fromBank": "090110",
"toAccount": "1001649376",
"toBank": "090110",
"mandateReference": "rosapay-202308191509",
"transactionStatus": "00",
"transactionDate": "2025-05-28T17:39:11",
"sessionId": "99999903232323280520251839116472025"
}
}
note

The transactionStatus represents the mandate debit transaction status

4.4 CODES DESCRIPTION FOR DEBIT MANDATE​

4.4.1 This details both the response code and description.

S/NDescriptionCode
1Approved or completed successfully00
2Status unknown, please wait for settlement report01
3Invalid Sender03
4Do not honor05
5Dormant Account06
6Invalid Account07
7Account Name Mismatch08
8Request processing in progress09
9Invalid transaction12
10Invalid Amount13
11Invalid Batch Number14
12Invalid Session or Record15
13Unknown Bank Code16
14Invalid Channel17
15Wrong Method Call18
16No action taken21
17Unable to locate record25
18Duplicate record26
19Format error30
20Suspected fraud34
21Contact sending bank35
22EXPIRED MANDATE40
23DEBIT AMOUNT GREATER THAN MANDATE41
24PREMATURE MANDATE42
25UNAPPROVED MANDATE43
26SUSPENDED DELETED MANDATE44
27NOT VARIABLE FREQUENCY MANDATE45
28NOT VARIABLE AMOUNT MANDATE46
29No sufficient funds51
30Transaction not permitted to sender57
31Transaction not permitted on channel58
32Transfer limit Exceeded61
33Security violation63
34Exceeds withdrawal frequency65
35Response received too late68
36Unsuccessful Account/Amount block69
37Unsuccessful Account/Amount unblock70
38Empty Mandate Reference Number71
39Beneficiary Bank not available91
40Routing error92
41Duplicate94
42Payment was not completed. Contact the bank.95
43System malfunction96
44Timeout waiting for response from destination97
45Client DisabledA1
46Not foundA2
47Mandate ExpiredA3
48Empty ValueA4
49Invalid ValueA5
50Invalid Data ProvidedA6
51Remote IP not PermitedA7
52Invalid Client idA8
53Unable to Process request, please try againA9
54Mandate Bank MismatchB0
55Mandate Account MismatchB1

4.4.2 This details both the bank name and bank code.

S/NBankCode
1ACCESS BANK PLC000014
2CITI BANK000009
3Coronation Merchant Bank060001
4EcoBank Plc000010
5FBNQUEST Merchant Bank060002
6FIDELITY BANK PLC000007
7FIRST BANK OF NIGERIA PLC000016
8FIRST CITY MONUMENT BANK PLC000003
9FSDH MERCHANT BANK400001
10Globus Bank Ltd000027
11GUARANTY TRUST BANK PLC000013
12JAIIZ Bank000006
13KEYSTONE BANK PLC000002
14Kuda Microfinance Bank090267
15LOTUS Bank000029
16MAINSTREET BANK PLC999014
17OPTIMUS BANK LIMITED000036
18PARALLEX BANK000030
19POLARIS BANK LIMITED000008
20PremiumTrust Bank Limited000031
21Providus Bank000023
22Rand Merchant Bank000024
23Stanbic IBTC000012
24STANDARD CHARTERED BANK PLC000021
25STERLING BANK PLC000001
26SUNTRUST BANK000022
27TAJBank Ltd000026
28The Alternative Bank Limited000037
29TITAN TRUST BANK000025
30UBA Plc000004
31UNION BANK OF NIGERIA PLC000018
32UNITY BANK PLC000011
33Wema Bank000017
34ZENITH INTERNATIONAL BANK000015