Page cover image

API Specifications

Specification For Virtual Accounts

API KEYS (Test Environment)

  1. Create an account on our sandbox environment: sandbox.squadco.com

  2. Retrieve keys from the bottom of the Get Started Page

Authorization Any request made without the authorization key will fail with a 401 (Service Not Authorized) response code.

Authorization would be done via Headers using Keys gotten from your dashboard.

Example: Authorization: Bearer sandbox_sk_94f2b798466408ef4d19e848ee1a4d1a3e93f104046f

This API specification helps you create a virtual account and also integrates payment reconciliation for your customers.

You can also trace payments to virtual accounts and link them up with customer details.

Reconciliation: For instant settlement when using our Virtual Account, All merchant and beneficiary accounts must be GTCO Bank Accounts.

Creating Virtual Account

You need to make a POST Request to a dedicated endpoint containing your customer information.

IMPORTANT NOTICE

Kindly share your preferred prefix with your Technical Account Manager to configure before going Live. The prefix must be a portion of your business name or an abbreviation of your business name as one word.

Customer Model

This endpoint is used to create virtual accounts for individuals/customers on your platform. Please note that there is a strict validation of the BVN against the names, Date of Birth and Phone Number. (B2C) The implication of this is that if any of the details mentioned above doesn't tally with what you have on the BVN passed, an account will not be generated. Please note that you can create virtual accounts for individuals regardless of the type of bank you provided during KYC.

Creating Virtual Accounts for Customers

POST https://sandbox-api-d.squadco.com/virtual-account

*Asterisks are required and mandatory.

Request Body

{
    "customer_identifier": "CCC",
    "first_name": "Techzilla- Joesph",
    "last_name": "Okoye",
    "mobile_num": "08139011943",
    "email": "ayo@gmail.com",
    "bvn": "12343211654",
    "dob": "30/10/1990",
    "address": "22 Kota street, UK",
    "gender": "1",
    "beneficiary_account": "4920299492"
}

Sample Request

{
    "customer_identifier": "CCC",
    "first_name": "Joesph",
    "last_name": "Ayodele",
    "mobile_num": "08139011943",
    "email": "ayo@gmail.com",
    "bvn": "22110011001",
    "dob": "30/10/1990",
    "address": "22 Kota street, UK",
    "gender": "1",
    "beneficiary_account": "4920299492"
}
{
    "success": true,
    "message": "Success",
    "data": {
        "first_name": "Joesph",
        "last_name": "Ayodele",
        "bank_code": "058",
        "virtual_account_number": "7834927713",
        "beneficiary_account": "4920299492",
        "customer_identifier": "CCC",
        "created_at": "2022-03-29T13:17:52.832Z",
        "updated_at": "2022-03-29T13:17:52.832Z"
    }
}

Business Model

This API allows you to create virtual accounts for your customers who are businesses and not individuals. That is, these customers are actually businesses (B2B) or other merchants. Please note that due to CBN's Guidelines on validation before account creation as well as other related Fraud concerns, you are required to request for profiling before you can have access to create accounts for businesses. Once profiled, you can go ahead and keep creating accounts for your businesses. Please note that to create virtual accounts for BUSINESSES, your KYC account needs to be a GTB account number and is mapped to the BVN provided. This doesn't apply if you are creating for individuals. For clarity: you need GTB if you are creating accounts for other businesses say you want to create an account for Chicken Fish Limited but if you are creating for Individual say Emeka Joseph, you don't necessarily need to have a GTB account.

Sample Request

{
    "customer_identifier": "CCC",
    "business_name": "Chicken Limited",
    "mobile_num": "08139011943",
    "bvn": "22110011001",
    "beneficiary_account": "4920299492"
}

Creating Virtual Accounts for businesses

POST https://sandbox-api-d.squadco.com/virtual-account/business

Request Body

{
    "status": 400,
    "success": false,
    "message": "\"customer_identifier\" is required",
    "data": {}
}

Transaction Notification Service

WEBHOOK: If a webhook is not provided, notifications won't be sent.

KINDLY ENSURE YOU HAVE A TRANSACTION REFERENCE CHECKER WHEN IMPLEMENTING WEBHOOKS TO AVOID GIVING DOUBLE VALUE ON TRANSACTIONS.

Webhook Validation

Method 1 (Hash Comparison)

The webhook notification sent carry the x-squad-signature in the header. The hash value (x-squad-signature) is an HMAC SHA512 signature of the webhook payload signed using your secret key. You are expected to create a hash and compare the value of the hash created with the hash sent in the header of the POST request sent to your webhook URL. To create the hash, you use the entire payload sent via the webhook.

Sample Implementations

using System;
using System.Text;
using System.Security.Cryptography;
using Newtonsoft.Json;
					
public class Program
{
	public static void Main()
	{
				var chargeResponse = new VirtualAccount_VM()
				{
					  transaction_reference = "REFE52ARZHTS/1668421222619_1",
					  virtual_account_number = "2129125316",
					  principal_amount = "222.00",
					  settled_amount = "221.78",
					  fee_charged = "0.22",
					  transaction_date = "2022-11-14T10:20:22.619Z",
					  customer_identifier = "SBN1EBZEQ8",
					  transaction_indicator = "C",
					  remarks =  "Transfer FROM sandbox sandbox | [SBN1EBZEQ8] TO sandbox sandbox",
					  currency = "NGN",
					  channel =  "virtual-account",
					  meta =  new MetaBody_VM()
					  {
						freeze_transaction_ref =  null,
						reason_for_frozen_transaction =  null
					  },
					  encrypted_body = "ViASuHLhO+SP3KtmcdAOis+3Obg54d5SgCFPFMcguYfkkYs/i44jeT5Dbx52TcOvHRp9HlnCoFwbATkEihzv2C8UyPoC38sRb90S5Z9Fq7vRwjDQz/hYi/nKbWA0btPr3A+UXhX1Nu5ek+TL0ENUC8W1ZX/FrowX3HQaYiwe3tU/Kfr2XvAGwT7IAx5CQBhpzL34faHP4jbwSVmSgVYmW5rd2ClWQ7WWJjDMakrqYJva8qd0vhkqSpyz2KywOV9t9zSHRx3VpbvlDsBdkNGr+4Axh/7Gspu3xo9mMOIdv73OzjN4VA/qQP+fQMCjU1pbS8oh81HjwkHjzC5SBhzR8IU8bsmvFUyzJMfDoJuUB+fs09SLW7pdfODwK5vB8LtdKPnAuTPlv5dHVAPeMG/ubtl/HOqCZs4axjuO557srw0GpKk86bwaVKt4IQ17nY/QCJFC273HWU1CawP7d3nQasRZf/TU7ra+fOjQBHQ7Gtz2Pnfp3gLljBKenMT4Cabks1X2/6ZQpd/yGFkloYdS7ZW3kEvrorjcyma4WNDmJfhcdR9XGsom6Y/M/n/gMMa0z2KPbHDRoEBeRYbQHcnu5LnGWzBA4Y4RMSTDesD876PDB1bOnMzNPrWYam6ZVRHz"
				};
				
				String SerializedPayload = JsonConvert.SerializeObject(chargeResponse);
				Console.WriteLine(SerializedPayload);
                string result = "";
                var secretKeyBytes = Encoding.UTF8.GetBytes("sandbox_sk_9ac9418e847972dd45f5fe845b5716ef305589808eda");
                var inputBytes = Encoding.UTF8.GetBytes(SerializedPayload);
                var hmac = new HMACSHA512(secretKeyBytes);
                byte[] hashValue = hmac.ComputeHash(inputBytes);
                result = BitConverter.ToString(hashValue).Replace("-", string.Empty);
				Console.WriteLine(result);
		
				Console.WriteLine(result.ToLower() == "18b9eb6ca68f92ca9f058da7bce6545efb12660cf75f960e552cf6098bb5ee8e71f20331dcfe0dfaea07439cc6629f901850291a39f374a1bd076c4eff1026c8");
	}
}
public class VirtualAccount_VM
{
  public string transaction_reference { get; set; }
  public string virtual_account_number { get; set; }
  public string principal_amount { get; set; }
  public string settled_amount { get; set; }
  public string fee_charged { get; set; }
  public string transaction_date { get; set; }
  public string customer_identifier { get; set; }
  public string transaction_indicator { get; set; }
  public string remarks { get; set; }
  public string currency { get; set; }
  public string channel { get; set; }
  public MetaBody_VM meta { get; set; }
  public string encrypted_body { get; set; }
}
public class MetaBody_VM
    {
        public string freeze_transaction_ref { get; set; }
        public string reason_for_frozen_transaction { get; set; }
    }

Sample Webhook Notification

{
  "transaction_reference": "REF2023022815174720339_1",
  "virtual_account_number": "0733848693",
  "principal_amount": "0.20",
  "settled_amount": "0.20",
  "fee_charged": "0.00",
  "transaction_date": "2023-02-28T00:00:00.000Z",
  "customer_identifier": "5UMKKK3R",
  "transaction_indicator": "C",
  "remarks": "Transfer FROM WILLIAM JAMES | [5UM2B63R] TO CHIZOBA ANTHONY OKOYE",
  "currency": "NGN",
  "channel": "virtual-account",
  "sender_name": "WILLIAM JAMES",
  "meta": {
    "freeze_transaction_ref": null,
    "reason_for_frozen_transaction": null
  },
  "encrypted_body": "DiPEa8Z4Cbfiqulhs3Q8lVJXGjMIFzbWwI2g7utVGbiI96TjcbjW+64iQrDR+kbZBwisMLMfB5l+Bn0/9kchGjB+xj6bLc6SnyCaku3pCMKmiVSkr/US1lsk+dBBI53nkGcUFkhige35wBYtXC7IpB/N2DCrzXTW5kEGnr9lCvpEFvDhZzDIUVeUCxV14V92vYYP/8O8Zjj3WR9keUc7Qq0H+fl/jmm7VwCtKMSp0OXNGMVPk5TJkLR52hQ8Rap+oorORLoNau1FRLzA24AW0d+nQfqbI+B4hf5+RztP7F1PpiRlo5qR7EthNpaHW6EMYp9fFUQdJRzsQNLbU/IfnH5oK9zFjHaOfKAa5rnoWP3N5IQjz6wobLq9T2KHei3UpCioFMcKYoigtJxple26auq0vCDkDoalPF6+YaqpuKFWdjX0mLz9+Xh5OCq4AI4u3GhioYFbpAvkrzk/Eyh5OdrEvDDLsbSu8lnXymOoiYXuS1Y4Y5jVZpzAArJ7wX7rdi1KLawHu8/m6fBkQLq/82olUuGLtGdPKF1JZnbv3eAXa7+IMhF4QUvsd52uMRnBdEHXfij+WHp7mz4jMP4Gxsx19Xzt7gyWqBhyswEJobDMSZhk/9GRcETwnT0dlSlWxVOL2pVSzKhc73ASxEQCZCO3/5/i1Nq6qSTjsbplLKuwP2Qr/15rP6TvVWAIpxa8"
}

Note: You are expected to send us a response confirming receipt of the request

{
    response_code:200,
    transaction_reference: 'unique reference sent through the post',
    response_description: 'Success'
}

WEBHOOK ERROR LOG

This API allows you to retrieve all your missed webhook transactions and use it to update your record without manual input.

  • The top 100 missed webhooks will always be returned by default and it

  • This flow involves integration of two(2) APIs

  • Once you have updated the record of a particular transaction, you are expected to use the second API to delete the record from the error log. If this is not done, the transaction will continuously be returned to you in the first 100 transactions until you delete it.

  • This will only work for those who respond correctly to our webhook calls.

  • Also, ensure you have a transaction duplicate checker to ensure you don't update a record twice or update a record you have updated using the webhook or the transaction API.

Authorization Any request made without the authorization key (secret key) will fail with a 401 (Unauthorized) response code.

The authorization key is sent via the request header as Bearer Token Authorization

Example: Authorization: Bearer sandbox_sk_94f2b798466408ef4d19e848ee1a4d1a3e93f104046f

Get Webhook Error Log

This API returns an array of transactions from the webhook error log

GET https://sandbox-api-d.squadco.com/virtual-account/webhook/logs

Query Parameters

{
    "status": 200,
    "success": true,
    "message": "Success",
    "data": {
        "count": 2,
        "rows": [
            {
                "id": "229f9f3d-53e4-450e-a9e9-164a8b882a60",
                "payload": {
                    "hash": "659c24ba0b6c3ac324b587f2f079c8ee876c56609ff11b7106cd868f84674a5c37fcb088373859f8d900713f03c47d819de79623cde67e70bbca945fd20f3cb3",
                    "meta": {
                        "freeze_transaction_ref": null,
                        "reason_for_frozen_transaction": null
                    },
                    "channel": "virtual-account",
                    "remarks": "Transfer FROM OKOYE, CHIZOBA ANTHONY | [CCtyttytC] TO CHIZOBA ANTHONY OKOYE",
                    "currency": "NGN",
                    "fee_charged": "0.05",
                    "sender_name": "OKOYE, CHIZOBA ANTHONY",
                    "encrypted_body": "DiPEa8Z4Cbfiqulhs3Q8lVJXGjMIFzbWwI2g7utVGbhXihbtK3H2xsA/+ZnjOpFA0AU8vAN5LUTEH6elfrK58ub2wydaRk0ngvQXWUFz3iB19qWBcdGQRnppKAT/AB5xyy1iQZvEHP7zq3Y7na5zcx9ttkU1mZIeAIoisM9k+ghVLxkTeql4UvfFcLyDdGzMd/BC4YgJFyrZxifhfhKi073od7xJnz4Hhz08UBE/FAwNYMWkwWD9izlbcaaJtfh1VIN6t9rl1gotlb5qmNq/UytgoSvuN5uaEXxegdB3VWvmsDMHqoYwDs4oEuv0lp8zUUG3cZ9zPQ6xH3shGQjVOWErkuIfCk62fRzkwxya4Gu/x2KHMSQjutbvD4vNDjVGfuCIoHuZEXPThWrq1jpTy7cNMLc8ZZ8IowJnfwWHL+O6fuepxXxfrJHlswMCI35ZHSvef1AEXgbUlx2O7yzytceCogpUkY+QJ1yLddl1FeE1u2JKOM+casP3pfiT+t3Mv55aSCVQO7hUy46gd6H/bIHaSIp2K3CcjfdflZ/bxCZaZoe/sRqfVdVIzpSpTc0Lq5sOXM2gijOdeg+zex/CgnMIKGJdzUT9YUJtaaVrMmhk0EcM0rHRrqs0iM7xaSTdZ7K8hnzl0RPJhDXIhu5a/Y2NxS3ZTC2lYRVZd6I3lerpoMQG69VfmqvaVgW2k03f",
                    "settled_amount": "49.95",
                    "principal_amount": "50.00",
                    "transaction_date": "2023-09-01T00:00:00.000Z",
                    "customer_identifier": "CCtyttytC",
                    "transaction_indicator": "C",
                    "transaction_reference": "REF20230901162737156459_1",
                    "virtual_account_number": "0760640237"
                },
                "transaction_ref": "REF20230901162737156459_1"
            }
        ]
    }
}

Delete Webhook Error Log

This API enables you delete a processed transaction from the webhook error log

DELETE https://sandbox-api-d.squadco.com/virtual-account/webhook/logs/:transaction_ref

When you delete the transaction from the log, it won't be returned to you again. Failure to delete a transaction will result in the transaction being returned to you in the top 100 transactions returned each time you retry.

Path Parameters

{
    "status": 200,
    "success": true,
    "message": "Success",
    "data": 1
}

Query Customer Transaction by Customer Identifier

This is an endpoint to query the transactions a customer has made. This is done using the customer's identifier which was passed when creating the virtual account.

Query Customer Transactions

GET https://sandbox-api-d.squadco.com/virtual-account/customer/transactions/{{customer_identifier}}

Note: The customer identifier is to be passed via the endpoint being queried. That is: replace {{customer_identifier}} on the end point with the customer identifier of the customer whose transactions you want to query.

Path Parameters

Response expected from the API to show queried Virtual Accounts.

{
    "status": 200,
    "success": true,
    "message": "Success",
    "data": [
        {
            "transaction_reference": "74902084jjjfksoi93004891_1",
            "virtual_account_number": "2224449991",
            "principal_amount": "30000.00",
            "settled_amount": "0.00",
            "fee_charged": "0.00",
            "transaction_date": "2022-04-21T09:00:00.000Z",
            "transaction_indicator": "C",
            "remarks": "Payment from 10A2 to 2224449991",
            "currency": "NGN",
            "frozen_transaction": {
                "freeze_transaction_ref": "afbd9b7f-fb98-41c3-bfe8-dc351cfb45c7",
                "reason": "Amount above 20000 when BVN not set"
            },
            "customer": {
                "customer_identifier": "SBN1EBZEQ8"
            }
        },
{
            "transaction_reference": "676767_1",
            "virtual_account_number": "2224449991",
            "principal_amount": "1050.00",
            "settled_amount": "1037.00",
            "fee_charged": "13.00",
            "transaction_date": "2022-03-21T09:00:00.000Z",
            "transaction_indicator": "C",
            "remarks": "Payment from 10A2 to 2224449991",
            "currency": "NGN",
            "froze_transaction": null,
            "customer": {
                "customer_identifier": "SBN1EBZEQ8"
            }
        }
    ]
}

Query All Merchant's Transactions

This is an endpoint to query all the merchant transactions over a period of time.

Query All Transactions

GET https://sandbox-api-d.squadco.com/virtual-account/merchant/transactions

Note: The endpoint is to be queried using just the authorization key from the dashboard

{
    "status": 200,
    "success": true,
    "message": "Success",
    "data": [
        {
            "transaction_reference": "4894fe1_1",
            "virtual_account_number": "2244441333",
            "principal_amount": "5000.00",
            "settled_amount": "0.00",
            "fee_charged": "0.00",
            "transaction_date": "2022-04-21T09:00:00.000Z",
            "transaction_indicator": "C",
            "remarks": "Payment from 15B8 to 2244441333",
            "currency": "NGN",
            "frozen_transaction": {
                "freeze_transaction_ref": "afbd9b7f-fb98-41c3-bfe8-dc351cfb45c7",
                "reason": "Amount above 20000 when BVN not set"
            },
            "customer": {
                "customer_identifier": "SBN1EBZEQ8"
            }
        },
{
            "transaction_reference": "676767_1",
            "virtual_account_number": "2224449991",
            "principal_amount": "30000.00",
            "settled_amount": "1037.00",
            "fee_charged": "13.00",
            "transaction_date": "2022-03-21T09:00:00.000Z",
            "transaction_indicator": "C",
            "remarks": "Payment from 10A2 to 2224449991",
            "currency": "NGN",
            "froze_transaction": null,
            "customer": {
                "customer_identifier": "SBN1EBZEQ8"
            }
        }
    ]
}

Query Single Transaction Using Transaction Ref

This endpoint allows you to query a single transaction using the system-generated transaction reference, which can be obtained from the webhook notification or dashboard.

GET https://api-d.squadco.com/virtual-account/merchant/transactions/all?transactionReference=REF202409181544489320003

The Ref to be inputted should be your unique ref

Query Parameters

{
    "status": 200,
    "success": true,
    "message": "Success",
    "data": {
        "count": 1,
        "rows": [
            {
                "transaction_reference": "REF202409181544489320003",
                "virtual_account_number": "0915079300",
                "principal_amount": "102.00",
                "settled_amount": "101.74",
                "fee_charged": "0.26",
                "transaction_date": "2024-09-18T00:00:00.000Z",
                "transaction_indicator": "C",
                "remarks": "Transfer FROM TEST ACCOUNT | [0915079300] TO UDOUSORO  WILLIAM JOSEPH",
                "currency": "NGN",
                "alerted_merchant": true,
                "merchant_settlement_date": "2024-09-18T14:45:56.290Z",
                "sender_name": "TEST ACCOUNT",
                "session_id": "100004240918144254119476359000",
                "frozen_transaction": null,
                "customer": {
                    "customer_identifier": "bde0810e-bf42-4dd1-a1d9-31a953b25000"
                },
                "virtual_account": {
                    "account_type": "dynamic"
                }
            }
        ],
        "query": {
            "transactionReference": "REF202409181544489320003"
        }
    }
}

Get Customer Details by Virtual Account Number

This is an endpoint to retrieve the details of a customer using the Virtual Account Number

Retrieve Virtual Account Details

GET https://sandbox-api-d.squadco.com/virtual-account/customer/{{virtual_account_number}}

Note: The virtual account number is to be passed via the endpoint being queried. That is: replace {{virtual_account_number}} on the end point with the virtual account number whose details you want to retrieve.

Path Parameters

{
    "status": 200,
    "success": true,
    "message": "Success",
    "data": {
        "first_name": "Timothy",
        "last_name": "Oke",
        "mobile_num": "08000000000",
        "email": "atioke@gmail.com",
        "customer_identifier": "CCtyttytC",
        "virtual_account_number": "0686786837"
    }
}

Get Customer Details Using Customer Identifier

This is an endpoint to retrieve the details of a customer'svirtual account using the Customer Identifier

Retrieve Virtual Account Details

GET https://sandbox-api-d.squadco.com/virtual-account/{{customer_identifier}}

Note: The customer_identifier is to be passed via the endpoint being queried. That is: replace {{customer_identifier}} on the end point with the customer identifier of the customer whose virtual account you want to retrieve.

Path Parameters

{
    "status": 200,
    "success": true,
    "message": "Success",
    "data": {
        "first_name": "Wisdom",
        "last_name": "Trudea",
        "bank_code": "737",
        "virtual_account_number": "555666777",
        "customer_identifier": "10D2",
        "created_at": "2022-01-13T11:03:54.252Z",
        "updated_at": "2022-01-13T11:09:51.657Z"
    }
}

Update Customer's BVN and Unfreeze Transaction

Update customer's BVN and unfreeze transaction

PATCH https://sandbox-api-d.squadco.com/virtual-account/update/bvn

Request Body

{
    "status": 200,
    "success": true,
    "message": "Success",
    "data": {}
}

Query All Merchant's Virtual Accounts

This is an endpoint to look-up the virtual account numbers related to a merchant.

Find All Virtual Account Number by Merchant

GET https://sandbox-api-d.squadco.com/virtual-account/merchant/accounts

This is an endpoint for merchants to query and retrieve all their virtual account.

Query Parameters

{
    "status": 200,
    "success": true,
    "message": "Success",
    "data": [
        {
            "bank_code": "058",
            "virtual_account_number": "2224449991",
            "beneficiary_account": "4829023412",
            "created_at": "2022-02-09T16:02:39.170Z",
            "updated_at": "2022-02-09T16:02:39.170Z",
            "customer": {
                "first_name": "Ifeanyi",
                "last_name": "Igweh",
                "customer_identifier": "10A2"
            }
        },
        {
            "bank_code": "058",
            "virtual_account_number": "111444999",
            "beneficiary_account": "9829023411",
            "created_at": "2022-02-09T16:02:39.170Z",
            "updated_at": "2022-02-09T16:02:39.170Z",
            "customer": {
                "first_name": "Paul",
                "last_name": "Aroso",
                "customer_identifier": "10B2"
            }
        }
    ]
}

Update Beneficiary Account

Sample Request

{
    "beneficiary_account":"1111111111",
    "virtual_account_number": "4683366555"  
}

This is used to update beneficiary account

PATCH https://sandbox-api-d.squadco.com/virtual-account/update/beneficiary/account

Request Body

{
    "status": 200,
    "success": true,
    "message": "Success",
    "data": {
        "first_name": "Sheena",
        "last_name": "Grace",
        "virtual_account_number": "3832649897",
        "beneficiary_account": "1234567890",
        "customer_identifier": "2086601683696"
    }
}

Simulate Payment

This is an endpoint to simulate payments

Simulate Payment

POST https://sandbox-api-d.squadco.com/virtual-account/simulate/payment

This is an endpoint to simulate payment

*asterisks are required and mandatory.

Headers

Request Body

{
    "success": true,
    "message": "Success",
    "data": {}
}

Go Live

To go live, simply:

1. Change the base URL for your endpoints from sandbox-api-d.squadco.com to api-d.squadco.com

2. Sign up on our Live Environment

3. Complete your KYC

4. Share the Merchant ID with the Technical Account Manager for Profiling

5. Use the secret keys provided on the dashboard to authenticate your live transactions

Last updated