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
authorization String | Set value to Bearer SECRET_KEY |
content-type String | Set value to application/json |
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/sh2url="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}'1415curl "$url" -H "$authorization" -H "$content_type" -X POST -d "$data"1617
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
authorization String | Set value to Bearer SECRET_KEY |
status String | Filter by status ('active' or 'inactive') | |
perPage Integer | Number of records per page | |
search String | Search query string | |
next String | Cursor for next page | |
previous String | Cursor for previous page | |
Show optional parameters |
---|
GET/virtual_terminal
cURL
1#!/bin/sh2url="https://api.paystack.co/virtual_terminal"3authorization="Authorization: Bearer SECRET_KEY"45curl "$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": 5032 }33}
Fetch Virtual Terminal
Fetch a Virtual Terminal on your integration
authorization String | Set value to Bearer SECRET_KEY |
code String | Code of the Virtual Terminal |
GET/virtual_terminal/:code
cURL
1#!/bin/sh2url="https://api.paystack.co/virtual_terminal/:code"3authorization="Authorization: Bearer SECRET_KEY"45curl "$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
authorization String | Set value to Bearer SECRET_KEY |
content-type String | Set value to application/json |
code String | Code of the Virtual Terminal to update |
name String | Name of the Virtual Terminal |
PUT/virtual_terminal/:code
cURL
1#!/bin/sh2url="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}'89curl "$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
authorization String | Set value to Bearer SECRET_KEY |
code String | Code of the Virtual Terminal to deactivate |
PUT/virtual_terminal/:code/deactivate
cURL
1#!/bin/sh2url="https://api.paystack.co/virtual_terminal/:code/deactivate"3authorization="Authorization: Bearer SECRET_KEY"45curl "$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
authorization String | Set value to Bearer SECRET_KEY |
content-type String | Set value to application/json |
code String | Code 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. |
POST/virtual_terminal/:code/destination/assign
cURL
1#!/bin/sh2url="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}'1314curl "$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
authorization String | Set value to Bearer SECRET_KEY |
content-type String | Set value to application/json |
code String | Code of the Virtual Terminal |
targets Array | Array of destination targets to unassign |
POST/virtual_terminal/:code/destination/unassign
cURL
1#!/bin/sh2url="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
authorization String | Set value to Bearer SECRET_KEY |
content-type String | Set value to application/json |
code String | Code of the Virtual Terminal |
split_code String | Split code to be added to the Virtual Terminal |
PUT/virtual_terminal/:code/split_code
cURL
1#!/bin/sh2url="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}'89curl "$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": 160034 },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": 9840050 }51 ],52 "total_subaccounts": 253 }54}
Remove Split Code from Virtual Terminal
Remove a split code from a Virtual Terminal on your integration
authorization String | Set value to Bearer SECRET_KEY |
content-type String | Set value to application/json |
code String | Code of the Virtual Terminal |
split_code String | Split code to be removed from the Virtual Terminal |
DELETE/virtual_terminal/:code/split_code
cURL
1#!/bin/sh2url="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}'89curl "$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}