Enter at least two characters to search. Searching documentation… No matching sections. Try an endpoint, field or event name.
Payout addresses
View as MarkdownWhere your share of each payment is sent: one plain address per network, kept apart for live and test mode. Every network with coins on offer is listed, with no address where you have not given one yet. They are changed under Payment settings in the dashboard, and through the API only once an owner allows it.
On this page
The payout address object
| Field | Type | Description |
|---|---|---|
object
"payout_address"
|
"payout_address" | The kind of object. |
network
string
|
string | The network the address is on, one of bitcoin, litecoin, dogecoin, bitcoincash, evm, bsc, tron, monero, solana. One address takes every coin of its network. |
name
string
|
string | The network's name, as the dashboard shows it. |
address
string|null
|
string|null | Where payouts on this network go. Null while the account has none: a paid charge in one of its coins then waits for one before it is paid out. |
assets
array
|
array | The coins on offer on this network, such as ETH, USDT and USDC on evm. |
payouts_held_until
string|null
|
string|null | After an address is changed on an account that has been paid out before, payouts to it wait 48 hours; this is when they resume. |
updated_at
string|null
|
string|null | When the address was last saved, as an ISO 8601 timestamp in UTC. |
Endpoints
-
GET
/v1/payout-addressesOne entry per network with coins on offer in the mode of the key, with meta.mode and meta.api_payout_address_changes. Needs payout_addresses:read. -
PUT
/v1/payout-addresses/{id}Set the address of one network, whose name is the id, such as bitcoin, from {"address": "…"}. Needs payout_addresses:write and the owner's switch. -
DELETE
/v1/payout-addresses/{id}Remove the address of one network. Needs payout_addresses:write and the owner's switch.
Example: read the payout addresses
Copy failed. Select the code and copy it manually.
curl 'https://api.velirapay.com/v1/payout-addresses' \
--fail-with-body --silent --show-error --max-time 30 \
-H "Authorization: Bearer ${VELIRAPAY_API_KEY:?Set VELIRAPAY_API_KEY}" \
-H 'Accept: application/json'
<?php
use VeliraPay\VeliraPayClient;
require __DIR__.'/vendor/autoload.php';
$apiKey = getenv('VELIRAPAY_API_KEY') ?: throw new RuntimeException('Set VELIRAPAY_API_KEY.');
$velirapay = new VeliraPayClient($apiKey, baseUrl: 'https://api.velirapay.com');
$addresses = $velirapay->payoutAddresses->list();
echo json_encode($addresses, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_THROW_ON_ERROR), PHP_EOL;
use VeliraPay\Laravel\Facades\VeliraPay;
$addresses = VeliraPay::payoutAddresses()->list();
const secretKey = process.env.VELIRAPAY_API_KEY;
if (!secretKey) throw new Error('Set VELIRAPAY_API_KEY.');
const response = await fetch('https://api.velirapay.com/v1/payout-addresses', {
headers: {
Authorization: `Bearer ${secretKey}`,
Accept: 'application/json',
},
redirect: 'error',
signal: AbortSignal.timeout(30_000),
});
if (!response.ok) {
throw new Error(`VeliraPay ${response.status}: ${await response.text()}`);
}
const addresses = response.status === 204 ? null : (await response.json()).data;
console.log(JSON.stringify(addresses, null, 2));
import json
import os
import requests
api_key = os.environ["VELIRAPAY_API_KEY"]
response = requests.get(
"https://api.velirapay.com/v1/payout-addresses",
headers={
"Authorization": f"Bearer {api_key}",
"Accept": "application/json",
},
timeout=(5, 30),
allow_redirects=False,
)
if not 200 <= response.status_code < 300:
raise RuntimeError(f"VeliraPay {response.status_code}: {response.text}")
addresses = None if response.status_code == 204 else response.json()["data"]
print(json.dumps(addresses, indent=2))
using System;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text.Json;
var secretKey = Environment.GetEnvironmentVariable("VELIRAPAY_API_KEY")
?? throw new InvalidOperationException("Set VELIRAPAY_API_KEY.");
using var client = new HttpClient(new HttpClientHandler { AllowAutoRedirect = false })
{
Timeout = TimeSpan.FromSeconds(30),
};
using var request = new HttpRequestMessage(HttpMethod.Get, "https://api.velirapay.com/v1/payout-addresses");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", secretKey);
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
using var response = await client.SendAsync(request);
var responseBody = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
{
throw new HttpRequestException($"VeliraPay {(int)response.StatusCode}: {responseBody}");
}
JsonElement? addresses = null;
if (response.StatusCode != HttpStatusCode.NoContent)
{
using var document = JsonDocument.Parse(responseBody);
addresses = document.RootElement.GetProperty("data").Clone();
}
Console.WriteLine(addresses?.GetRawText() ?? "null");
Copy failed. Select the code and copy it manually.
{
"data": [
{
"object": "payout_address",
"network": "bitcoin",
"name": "Bitcoin",
"address": "bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4",
"assets": ["BTC"],
"payouts_held_until": null,
"updated_at": "2026-10-02T08:14:51.000000Z"
},
{
"object": "payout_address",
"network": "evm",
"name": "Ethereum",
"address": null,
"assets": ["ETH", "USDT", "USDC"],
"payouts_held_until": null,
"updated_at": null
}
],
"meta": { "mode": "live" }
}
Changing an address
Where the money goes is the one setting a mistake cannot undo, so changing it through the API takes three things: a restricted key with payout_addresses:write ticked, made by someone who is still an owner or admin; an owner having switched on Let API keys and AI apps change payout addresses under Payment settings in the dashboard; and an address of the network named in the path, of the key's mode. Until the switch is on, both endpoints answer 403 saying so, whatever they are sent.
Only the network named changes. Every owner and admin of the account is emailed about it, naming the key, as for a change in the dashboard; once the account has been paid out, payouts to a new address wait 48 hours; and payouts that were waiting for an address on that network go to the new one. Both answer with the payout address as it now stands.
Copy failed. Select the code and copy it manually.
curl -X PUT 'https://api.velirapay.com/v1/payout-addresses/bitcoin' \
--fail-with-body --silent --show-error --max-time 30 \
-H "Authorization: Bearer ${VELIRAPAY_API_KEY:?Set VELIRAPAY_API_KEY}" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{"address": "bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4"}'
<?php
use VeliraPay\VeliraPayClient;
require __DIR__.'/vendor/autoload.php';
$apiKey = getenv('VELIRAPAY_API_KEY') ?: throw new RuntimeException('Set VELIRAPAY_API_KEY.');
$velirapay = new VeliraPayClient($apiKey, baseUrl: 'https://api.velirapay.com');
$address = $velirapay->payoutAddresses->update('bitcoin', ['address' => 'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4']);
echo json_encode($address, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_THROW_ON_ERROR), PHP_EOL;
use VeliraPay\Laravel\Facades\VeliraPay;
$address = VeliraPay::payoutAddresses()->update('bitcoin', ['address' => 'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4']);
const secretKey = process.env.VELIRAPAY_API_KEY;
if (!secretKey) throw new Error('Set VELIRAPAY_API_KEY.');
const response = await fetch('https://api.velirapay.com/v1/payout-addresses/bitcoin', {
method: 'PUT',
headers: {
Authorization: `Bearer ${secretKey}`,
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({ address: 'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4' }),
redirect: 'error',
signal: AbortSignal.timeout(30_000),
});
if (!response.ok) {
throw new Error(`VeliraPay ${response.status}: ${await response.text()}`);
}
const address = response.status === 204 ? null : (await response.json()).data;
console.log(JSON.stringify(address, null, 2));
import json
import os
import requests
api_key = os.environ["VELIRAPAY_API_KEY"]
response = requests.put(
"https://api.velirapay.com/v1/payout-addresses/bitcoin",
headers={
"Authorization": f"Bearer {api_key}",
"Accept": "application/json",
},
json={"address": "bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4"},
timeout=(5, 30),
allow_redirects=False,
)
if not 200 <= response.status_code < 300:
raise RuntimeError(f"VeliraPay {response.status_code}: {response.text}")
address = None if response.status_code == 204 else response.json()["data"]
print(json.dumps(address, indent=2))
using System;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
var secretKey = Environment.GetEnvironmentVariable("VELIRAPAY_API_KEY")
?? throw new InvalidOperationException("Set VELIRAPAY_API_KEY.");
using var client = new HttpClient(new HttpClientHandler { AllowAutoRedirect = false })
{
Timeout = TimeSpan.FromSeconds(30),
};
using var request = new HttpRequestMessage(HttpMethod.Put, "https://api.velirapay.com/v1/payout-addresses/bitcoin");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", secretKey);
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
request.Content = new StringContent("""
{"address": "bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4"}
""", Encoding.UTF8, "application/json");
using var response = await client.SendAsync(request);
var responseBody = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
{
throw new HttpRequestException($"VeliraPay {(int)response.StatusCode}: {responseBody}");
}
JsonElement? address = null;
if (response.StatusCode != HttpStatusCode.NoContent)
{
using var document = JsonDocument.Parse(responseBody);
address = document.RootElement.GetProperty("data").Clone();
}
Console.WriteLine(address?.GetRawText() ?? "null");