Virtual Terminal

The Virtual Terminal API allows you to accept in-person payments without a POS device.

Create Virtual Terminal

Create a Virtual Terminal on your integration

Headers

authorization
String

Set value to Bearer SECRET_KEY

content-type
String

Set value to application/json

Body Parameters

name
String

Name of the Virtual Terminal

destinations
Array

An array of objects containing the notification recipients for payments to the Virtual Terminal. Each object includes a target parameter for the Whatsapp phone number to send notifications to, and a name parameter for a descriptive label.

metadata
Array

Stringified JSON object of custom data. Kindly check the Metadata page for more information

currency
Array

The transaction currency for the Virtual Terminal. Defaults to your integration currency

custom_fields
Array

An array of objects representing custom fields to display on the form. Each object contains a display_name parameter, representing what will be displayed on the Virtual Terminal page, and variable_name parameter for referencing the custom field programmatically

POST/virtual_terminal
cURL
1#!/bin/sh
2url="https://api.paystack.co/virtual_terminal"
3authorization="Authorization: Bearer SECRET_KEY"
4content_type="Content-Type: application/json"
5data='{
6"name": "Sample Terminal",
7"destinations": [
8 {
9 "target": "+27639022319",
10 "name": "Phone Destination"
11 }
12]
13}'
14
15curl "$url" -H "$authorization" -H "$content_type" -X POST -d "$data"
16
17
Sample Response
200 Ok
1{
2 "status": true,
3 "message": "Virtual Terminal created",
4 "data": {
5 "id": 27691,
6 "name": "Sample Terminal",
7 "integration": 530700,
8 "domain": "test",
9 "code": "VT_LJK5892Z",
10 "paymentMethods": [],
11 "active": true,
12 "metadata": null,
13 "destinations": [
14 {
15 "target": "+27639022319",
16 "type": "whatsapp",
17 "name": "Phone Destination"
18 }
19 ],
20 "currency": "ZAR"
21 }
22}

List Virtual Terminals

List Virtual Terminals on your integration

Headers

authorization
String

Set value to Bearer SECRET_KEY

Query Parameters

status
String

Filter by status ('active' or 'inactive')

perPage
Integer

Number of records per page

search
String
optional

Search query string

next
String
optional

Cursor for next page

previous
String
optional

Cursor for previous page

GET/virtual_terminal
cURL
1#!/bin/sh
2url="https://api.paystack.co/virtual_terminal"
3authorization="Authorization: Bearer SECRET_KEY"
4
5curl "$url" -H "$authorization" -X GET
Sample Response
200 Ok
1{
2 "status": true,
3 "message": "Virtual Terminals retrieved",
4 "data": [
5 {
6 "id": 26740,
7 "code": "VT_SOUAPKJZ",
8 "name": "Sales Point #3",
9 "integration": 530790,
10 "domain": "test",
11 "paymentMethods": [],
12 "active": true,
13 "created_at": "2025-01-16T14:09:11.000Z",
14 "currency": "ZAR"
15 },
16 {
17 "id": 26592,
18 "code": "VT_NG3LPU2I",
19 "name": "Sales Point #4",
20 "integration": 530790,
21 "domain": "test",
22 "paymentMethods": [],
23 "active": true,
24 "created_at": "2025-01-14T16:35:58.000Z",
25 "currency": "ZAR"
26 }
27 ],
28 "meta": {
29 "next": null,
30 "previous": null,
31 "perPage": 50
32 }
33}

Fetch Virtual Terminal

Fetch a Virtual Terminal on your integration

Headers

authorization
String

Set value to Bearer SECRET_KEY

Path Parameters

code
String

Code of the Virtual Terminal

GET/virtual_terminal/:code
cURL
1#!/bin/sh
2url="https://api.paystack.co/virtual_terminal/:code"
3authorization="Authorization: Bearer SECRET_KEY"
4
5curl "$url" -H "$authorization" -X GET
Sample Response
200 Ok
1{
2 "status": true,
3 "message": "Virtual Terminal retrieved",
4 "data": {
5 "id": 27691,
6 "code": "VT_MCK5292Z",
7 "name": "Sample Terminal",
8 "integration": 730720,
9 "domain": "test",
10 "paymentMethods": [],
11 "active": true,
12 "created_at": "2025-02-04T12:56:56.000Z",
13 "connect_account_id": null,
14 "destinations": [
15 {
16 "target": "+27639091249",
17 "type": "whatsapp",
18 "name": "Sales Point #1",
19 "created_at": "2025-02-04T12:56:56.000Z"
20 }
21 ],
22 "currency": "ZAR"
23 }
24}

Update Virtual Terminal

Update a Virtual Terminal on your integration

Headers

authorization
String

Set value to Bearer SECRET_KEY

content-type
String

Set value to application/json

Path Parameters

code
String

Code of the Virtual Terminal to update

Body Parameters

name
String

Name of the Virtual Terminal

PUT/virtual_terminal/:code
cURL
1#!/bin/sh
2url="https://api.paystack.co/virtual_terminal/:code"
3authorization="Authorization: Bearer SECRET_KEY"
4content_type="Content-Type: application/json"
5data='{
6 "name": "New terminal name"
7}'
8
9curl "$url" -H "$authorization" -H "$content_type" -X PUT -d "$data"
Sample Response
400 Bad Request
1{
2 "status": false,
3 "message": "\"name\" is required",
4 "meta": {
5 "nextStep": "Provide all required params "
6 },
7 "type": "validation_error",
8 "code": "missing_params"
9}

Deactivate Virtual Terminal

Deactivate a Virtual Terminal on your integration

Headers

authorization
String

Set value to Bearer SECRET_KEY

Path Parameters

code
String

Code of the Virtual Terminal to deactivate

PUT/virtual_terminal/:code/deactivate
cURL
1#!/bin/sh
2url="https://api.paystack.co/virtual_terminal/:code/deactivate"
3authorization="Authorization: Bearer SECRET_KEY"
4
5curl "$url" -H "$authorization" -X PUT
Sample Response
200 Ok
1{
2 "status": true,
3 "message": "Terminal set to inactive"
4}

Assign Destination to Virtual Terminal

Add a destination (WhatsApp number) to a Virtual Terminal on your integration

Headers

authorization
String

Set value to Bearer SECRET_KEY

content-type
String

Set value to application/json

Path Parameters

code
String

Code of the Virtual Terminal

Body Parameters

destinations
Array

An array of objects containing the notification recipients for payments to the Virtual Terminal. Each object includes a target parameter for the Whatsapp phone number to send notifications to, and a name parameter for a descriptive label.

POST/virtual_terminal/:code/destination/assign
cURL
1#!/bin/sh
2url="https://api.paystack.co/virtual_terminal/:code/destination/assign"
3authorization="Authorization: Bearer SECRET_KEY"
4content_type="Content-Type: application/json"
5data='{
6 "destinations": [
7 {
8 "target": "+2341234567890",
9 "name": "Another one"
10 }
11 ]
12}'
13
14curl "$url" -H "$authorization" -H "$content_type" -X POST -d "$data"
Sample Response
200 Ok
1{
2 "status": true,
3 "message": "Destinations assigned successfully",
4 "data": [
5 {
6 "integration": 530700,
7 "target": "2341234567890",
8 "name": "Another one",
9 "type": "whatsapp",
10 "id": 27934,
11 "createdAt": "2025-02-04T13:26:35.278Z",
12 "updatedAt": "2025-02-04T13:26:35.278Z"
13 }
14 ]
15}

Unassign Destination from Virtual Terminal

Unassign a destination (WhatsApp Number) summary of transactions from a Virtual Terminal on your integration

Headers

authorization
String

Set value to Bearer SECRET_KEY

content-type
String

Set value to application/json

Path Parameters

code
String

Code of the Virtual Terminal

Body Parameters

targets
Array

Array of destination targets to unassign

POST/virtual_terminal/:code/destination/unassign
cURL
1#!/bin/sh
2url="https://api.paystack.co/virtual_terminal/:code/destination/unassign"
3authorization="Authorization: Bearer SECRET_KEY"
4content_type="Content-Type: application/json"
5data='{
6 "targets": ["+2348123456789"]
7}'
8curl "$url" -H "$authorization" -H "$content_type" -X POST -d "$data"
Sample Response
200 Ok
1{
2 "status": true,
3 "message": "Destination deleted successfully"
4}

Add Split Code to Virtual Terminal

Add a split code to a Virtual Terminal on your integration

Headers

authorization
String

Set value to Bearer SECRET_KEY

content-type
String

Set value to application/json

Path Parameters

code
String

Code of the Virtual Terminal

Body Parameters

split_code
String

Split code to be added to the Virtual Terminal

PUT/virtual_terminal/:code/split_code
cURL
1#!/bin/sh
2url="https://api.paystack.co/virtual_terminal/:code/split_code"
3authorization="Authorization: Bearer SECRET_KEY"
4content_type="Content-Type: application/json"
5data='{
6 "split_code": "SPL_98WF13Zu8w5"
7}'
8
9curl "$url" -H "$authorization" -H "$content_type" -X PUT -d "$data"
Sample Response
200 Ok
1{
2 "status": true,
3 "message": "Split code assigned",
4 "data": {
5 "id": 3025782,
6 "name": "Dynamic Split at 1729681745076",
7 "type": "flat",
8 "currency": "ZAR",
9 "integration": 530700,
10 "domain": "test",
11 "split_code": "SPL_HBaFCbbiyI",
12 "active": true,
13 "bearer_type": "subaccount",
14 "bearer_subaccount": 854043,
15 "createdAt": "2024-10-23T11:09:05.000Z",
16 "updatedAt": "2024-10-23T11:09:05.000Z",
17 "is_dynamic": true,
18 "subaccounts": [
19 {
20 "subaccount": {
21 "id": 523210,
22 "subaccount_code": "ACCT_r56edei4okmllle",
23 "business_name": "ABC Ventures",
24 "description": "ABC Ventures",
25 "primary_contact_name": null,
26 "primary_contact_email": null,
27 "primary_contact_phone": null,
28 "metadata": null,
29 "settlement_bank": "African Bank Limited",
30 "currency": "ZAR",
31 "account_number": "00000000000"
32 },
33 "share": 1600
34 },
35 {
36 "subaccount": {
37 "id": 854043,
38 "subaccount_code": "ACCT_n8m5vz2itt8y0f1",
39 "business_name": "Best Logistics",
40 "description": "Best Logistics",
41 "primary_contact_name": null,
42 "primary_contact_email": null,
43 "primary_contact_phone": null,
44 "metadata": null,
45 "settlement_bank": "Capitec Bank Limited",
46 "currency": "ZAR",
47 "account_number": "1051366984"
48 },
49 "share": 98400
50 }
51 ],
52 "total_subaccounts": 2
53 }
54}

Remove Split Code from Virtual Terminal

Remove a split code from a Virtual Terminal on your integration

Headers

authorization
String

Set value to Bearer SECRET_KEY

content-type
String

Set value to application/json

Path Parameters

code
String

Code of the Virtual Terminal

Body Parameters

split_code
String

Split code to be removed from the Virtual Terminal

DELETE/virtual_terminal/:code/split_code
cURL
1#!/bin/sh
2url="https://api.paystack.co/virtual_terminal/:code/split_code"
3authorization="Authorization: Bearer SECRET_KEY"
4content_type="Content-Type: application/json"
5data='{
6 "split_code": "SPL_98WF13Zu8w5"
7}'
8
9curl "$url" -H "$authorization" -H "$content_type" -X DELETE -d "$data"
Sample Response
400 Bad Request
1{
2 "status": false,
3 "message": "Payment method does not exist",
4 "meta": {
5 "nextStep": "Ensure that you're passing the correct reference for the requested resource that exists on this integration"
6 },
7 "type": "validation_error",
8 "code": "not_found"
9}