Payouts
At any time you can pay out funds from you Virtual Account to an external account.
Initiating Payout
You can initiate Payout in the following way:
- From Merchant Portal, Balances section
- Using Volume API
Initiating Payout in Merchant Portal
In order to make a Payout, please go to Balances section and press Make Payout next to the account you want to make payment from.


Once you've made the payment and it has been finished, you'll see change in balance reflected in the same Balances page.

Payout status
Payout status is delivered to you by Payout Webhooks.
Payout status has following values:
| Status | Description |
|---|---|
| IN_PROGRESS | payment is in progress |
| PROCESSED | payment is was processed (does not mean delivered) |
| CANCELLED | payment was cancelled |
| FAILED | payment failed |
| HELD | payment is held and may require contact with volume for it's further processing |
| RETURNED | payment was delivered to destination account and returned |
Payout status delivered by Webhooks
Once you've configured Payout Webhook URL in Merchant Portal, in Settings->Webhooks And Callbacks section, you will be provided with a Webhook for any status change.
Delivery guarantee
Each webhook is delivered until your endpoint answers with 200 OK.
Body
Webhook calls will be delivered as PUT REST call with following payload
{
"eventTimeUtc" : "2024-11-07T07:55:27.004128Z",
"applicationId" : "62b36790-f8cd-4764-8e19-2e19ada49cb1",
"payoutId" : "50cb26b8-1a2d-4455-ba2a-f1c229779500",
"payoutAmount" : 0.30,
"payoutCurrency" : "GBP",
"payoutReference" : "241107073325914PYB",
"payoutStatus" : "IN_PROGRESS",
"payoutStatusDescription" : "",
"payoutWebhookDeliveryAttempt" : 0,
"destination" : {
"type" : "SCAN",
"name" : "John Smith",
"accountNumber" : "12345678",
"sortCode" : "123456"
}
}Important headers
Expect this call with following headers:
| Header | Value |
|---|---|
| Content-Type | application/json |
| Accept | application/json |
| Authorization | signature of the request calculated as described here |
Security
You can verify webhook integrity by checking it's signature passed via Authorization header. Mechanism is identical to signature verification if regular payment webhooks. You can find description here
Initiating Payout using Volume API
You can also initiate a Payout using Volume's API.
Please contact your Customer Success Manager or send us an email at support@getvolume.com to request access to this feature.
Prerequisites
In order to initiate a payout via the API, you would need to obtain the details below:
- Application ID - can be found in your Merchant Portal -> Settings -> Security (opens in a new tab) -> Application ID.
- Application Secret - If you don't have it already, you can generate it in Merchant Portal -> Settings -> Security (opens in a new tab) -> Primary private key -> Reset.
- payInAccountSelector - Reach out to support@getvolume.com to obtain your pay-in selector ID.
- Enabled Payout API feature - In order to intiaite a payout via API a particualr feature flag has to be enabled. Reach out to your Customer Success Manager or support@getvolume.com to enable this feature.
Payout API Initiation
Request Example
curl --location --request POST 'https://api.sandbox.volumepay.io/api/payouts' \
--header 'Content-Type: application/vnd.volume.v1.0+json' \
--header 'x-application-id: application-id' \
--header 'x-application-secret: application-secret' \
--data '{
"applicationId": "41f75930-ef98-40d8-b6f7-5ee2b01bd3b3",
"payInAccountSelector": "gbp-va-o",
"amount": 100,
"destination": {
"destinationType": "toAccount",
"accountType": "SCAN",
"holderName": "John Doe",
"accountNumber": "12098709",
"sortCode": "185008"
}
}'API Request Properties
| argument | kind | type | description |
|---|---|---|---|
| Content-Type | header | String | application/vnd.volume.v0.7+json |
| x-application-id | header | UUID | id of the merchant application |
| x-application-secret | header | UUID | private key of the merchant application |
| applicationId | body | UUID | id of the merchant application |
| payInAccountSelector | body | String | source account ID |
| amount | body | Number | amount to pay |
| destinationType | body | String | type of the payout. Currently, only "toAccount" is supported |
| accountType | body | String | type of the destination account. Currently only "SCAN" is supported |
| holderName | body | String | destination account holder name |
| accountNumber | body | String | destination account number |
| sortCode | body | String | destination account sort code |
Response Example
{
"applicationId": "41f75930-ef98-40d8-b6f7-5ee2b01bd3b3",
"payoutId": "83c0c8a4-b087-4e09-acfa-952d58a62c98",
"createdAt": "2025-12-01T11:12:24.833190085Z",
"status": "IN_PROGRESS",
"amount": 100,
"reference": "25120111743381MRH2",
"currency": "GBP",
"source": {
"type": "SCAN",
"name": "Volume Demo",
"accountNumber": "10000101",
"sortCode": "001101",
"iban": null
},
"destination": {
"type": "SCAN",
"name": "John Doe",
"accountNumber": "12098709",
"sortCode": "185008",
"iban": null
},
"tracingId": "692d7817000000004039fae2c94c943c"
}API Response Properties
| argument | type | description |
|---|---|---|
| applicationId | UUID | id of the merchant application |
| payoutId | UUID | id of the payout |
| createdAt | string | id of the merchant application |
| status | string | initial payout status. Supported values: IN_PROGRESS, PROCESSED, FAILED, HELD, RETURNED |
| amount | Number | amount to pay |
| reference | string | reference of the payment |
| currency | string | currency of the payment |
| source.type | String | type of the source account |
| source.name | String | source account holder name |
| source.accountNumber | String | source account number |
| source.sortCode | String | source account sort code |
| source.iban | String | source iban |
| destination.type | String | type of the destination account |
| destination.name | String | destination account holder name |
| destination.accountNumber | String | destination account number |
| destination.sortCode | String | destination account sort code |
| destination.iban | String | destination iban |
| tracingId | String | API response tracing ID |
Payout API Status Request
You should rely on webhooks as your primary source for payout status updates. However, you may also use our GET API endpoint to retrieve real-time payout status when needed.
Request Example
curl --location --request GET 'https://api.sandbox.volumepay.io/api/payouts/{payoutId}' \
--header 'Content-Type: application/vnd.volume.v1.0+json' \
--header 'x-application-id: application-id' \
--header 'x-application-secret: application-secret' \Payout Statuses
| Status | Description |
|---|---|
| IN_PROGRESS | payout is in progress |
| PROCESSED | payout was processed (does not mean delivered) |
| FAILED | payout failed |
| HELD | payout is temporeraly held and may require contact with Volume for it's further processing |
| RETURNED | payment was delivered to destination account and returned |