curl --request POST \
--url https://hg.cash/api/v1/ve/transactions/outbound \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"accountId": "YOUR_ACCOUNT_UUID",
"amount": "25.5",
"firstName": "Ada",
"lastName": "Example",
"email": "payer@example.com",
"documentoIdentidad": "00000000",
"tipoDocumento": "V",
"prefijoTelefono": "+58",
"numeroTelefono": "0000000000",
"direccion": "Example street",
"ciudad": "Example city",
"pais": "VE",
"banco": "BANK_VALUE",
"tipoCuenta": "ACCOUNT_TYPE_VALUE",
"numeroCuenta": "00000000000000000000",
"nombreTitular": "Ada",
"apellidoTitular": "Example"
}
'import requests
url = "https://hg.cash/api/v1/ve/transactions/outbound"
payload = {
"accountId": "YOUR_ACCOUNT_UUID",
"amount": "25.5",
"firstName": "Ada",
"lastName": "Example",
"email": "payer@example.com",
"documentoIdentidad": "00000000",
"tipoDocumento": "V",
"prefijoTelefono": "+58",
"numeroTelefono": "0000000000",
"direccion": "Example street",
"ciudad": "Example city",
"pais": "VE",
"banco": "BANK_VALUE",
"tipoCuenta": "ACCOUNT_TYPE_VALUE",
"numeroCuenta": "00000000000000000000",
"nombreTitular": "Ada",
"apellidoTitular": "Example"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
accountId: 'YOUR_ACCOUNT_UUID',
amount: '25.5',
firstName: 'Ada',
lastName: 'Example',
email: 'payer@example.com',
documentoIdentidad: '00000000',
tipoDocumento: 'V',
prefijoTelefono: '+58',
numeroTelefono: '0000000000',
direccion: 'Example street',
ciudad: 'Example city',
pais: 'VE',
banco: 'BANK_VALUE',
tipoCuenta: 'ACCOUNT_TYPE_VALUE',
numeroCuenta: '00000000000000000000',
nombreTitular: 'Ada',
apellidoTitular: 'Example'
})
};
fetch('https://hg.cash/api/v1/ve/transactions/outbound', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://hg.cash/api/v1/ve/transactions/outbound",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'accountId' => 'YOUR_ACCOUNT_UUID',
'amount' => '25.5',
'firstName' => 'Ada',
'lastName' => 'Example',
'email' => 'payer@example.com',
'documentoIdentidad' => '00000000',
'tipoDocumento' => 'V',
'prefijoTelefono' => '+58',
'numeroTelefono' => '0000000000',
'direccion' => 'Example street',
'ciudad' => 'Example city',
'pais' => 'VE',
'banco' => 'BANK_VALUE',
'tipoCuenta' => 'ACCOUNT_TYPE_VALUE',
'numeroCuenta' => '00000000000000000000',
'nombreTitular' => 'Ada',
'apellidoTitular' => 'Example'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://hg.cash/api/v1/ve/transactions/outbound"
payload := strings.NewReader("{\n \"accountId\": \"YOUR_ACCOUNT_UUID\",\n \"amount\": \"25.5\",\n \"firstName\": \"Ada\",\n \"lastName\": \"Example\",\n \"email\": \"payer@example.com\",\n \"documentoIdentidad\": \"00000000\",\n \"tipoDocumento\": \"V\",\n \"prefijoTelefono\": \"+58\",\n \"numeroTelefono\": \"0000000000\",\n \"direccion\": \"Example street\",\n \"ciudad\": \"Example city\",\n \"pais\": \"VE\",\n \"banco\": \"BANK_VALUE\",\n \"tipoCuenta\": \"ACCOUNT_TYPE_VALUE\",\n \"numeroCuenta\": \"00000000000000000000\",\n \"nombreTitular\": \"Ada\",\n \"apellidoTitular\": \"Example\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://hg.cash/api/v1/ve/transactions/outbound")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"accountId\": \"YOUR_ACCOUNT_UUID\",\n \"amount\": \"25.5\",\n \"firstName\": \"Ada\",\n \"lastName\": \"Example\",\n \"email\": \"payer@example.com\",\n \"documentoIdentidad\": \"00000000\",\n \"tipoDocumento\": \"V\",\n \"prefijoTelefono\": \"+58\",\n \"numeroTelefono\": \"0000000000\",\n \"direccion\": \"Example street\",\n \"ciudad\": \"Example city\",\n \"pais\": \"VE\",\n \"banco\": \"BANK_VALUE\",\n \"tipoCuenta\": \"ACCOUNT_TYPE_VALUE\",\n \"numeroCuenta\": \"00000000000000000000\",\n \"nombreTitular\": \"Ada\",\n \"apellidoTitular\": \"Example\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://hg.cash/api/v1/ve/transactions/outbound")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"accountId\": \"YOUR_ACCOUNT_UUID\",\n \"amount\": \"25.5\",\n \"firstName\": \"Ada\",\n \"lastName\": \"Example\",\n \"email\": \"payer@example.com\",\n \"documentoIdentidad\": \"00000000\",\n \"tipoDocumento\": \"V\",\n \"prefijoTelefono\": \"+58\",\n \"numeroTelefono\": \"0000000000\",\n \"direccion\": \"Example street\",\n \"ciudad\": \"Example city\",\n \"pais\": \"VE\",\n \"banco\": \"BANK_VALUE\",\n \"tipoCuenta\": \"ACCOUNT_TYPE_VALUE\",\n \"numeroCuenta\": \"00000000000000000000\",\n \"nombreTitular\": \"Ada\",\n \"apellidoTitular\": \"Example\"\n}"
response = http.request(request)
puts response.read_body{
"id": "550e8400-e29b-41d4-a716-446655440000",
"status": "processing"
}Create outbound transaction (Venezuela)
Create a USDT payout. amount is a positive decimal string, not a JSON number. Up to 8 fractional digits may be present.
Required: accountId, amount, firstName, lastName, email, documentoIdentidad, tipoDocumento,
prefijoTelefono, numeroTelefono, direccion, ciudad, pais (VE), banco, tipoCuenta, numeroCuenta,
nombreTitular, apellidoTitular.
Optional: celular, webhookUrl. celular is required when tipoCuenta is Pago Móvil (13, Pago Móvil, or pago_movil).
Send banco, tipoCuenta, and tipoDocumento as the catalogue value from GET /ve/banks. String labels are accepted.
BANK_VALUE and ACCOUNT_TYPE_VALUE in the example are placeholders for those catalogue values.
documentoIdentidad is digits only. The letter belongs in tipoDocumento (V, J, P, or E). A matching prefix is stripped.
Insufficient balance returns 409 with code: INSUFFICIENT_NET_BALANCE.
If the recipient still needs identity verification, the response is 201 with status: pending_kyc, kyc_url when a URL was stored,
and kyc_expires_at (24 hours from create). That amount and its outbound fee stay reserved. The account balance is not debited.
No payout order is created until verification is approved.
Approved verification with a usable bank account returns 201 with status: processing.
Declined verification, verification that finished without approval, an email whose document does not match, a rejected document,
or a rejected bank account does not create a transaction and returns 400 with code
KOLLAT_KYC_DECLINED, KOLLAT_KYC_NOT_APPROVED, KOLLAT_IDENTITY_UNCONFIRMED, KOLLAT_INVALID_DOCUMENT,
KOLLAT_INVALID_BANK, missing_cuenta_id, or missing_terms.
The error string says what to fix for a bank-account or document failure.
A missing account returns 404. No access returns 403. Bloqueada or Cerrada returns 403 with code: ACCOUNT_NOT_OPERATIVE.
An unsupported account or a non-USDT currency returns 400.
curl --request POST \
--url https://hg.cash/api/v1/ve/transactions/outbound \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"accountId": "YOUR_ACCOUNT_UUID",
"amount": "25.5",
"firstName": "Ada",
"lastName": "Example",
"email": "payer@example.com",
"documentoIdentidad": "00000000",
"tipoDocumento": "V",
"prefijoTelefono": "+58",
"numeroTelefono": "0000000000",
"direccion": "Example street",
"ciudad": "Example city",
"pais": "VE",
"banco": "BANK_VALUE",
"tipoCuenta": "ACCOUNT_TYPE_VALUE",
"numeroCuenta": "00000000000000000000",
"nombreTitular": "Ada",
"apellidoTitular": "Example"
}
'import requests
url = "https://hg.cash/api/v1/ve/transactions/outbound"
payload = {
"accountId": "YOUR_ACCOUNT_UUID",
"amount": "25.5",
"firstName": "Ada",
"lastName": "Example",
"email": "payer@example.com",
"documentoIdentidad": "00000000",
"tipoDocumento": "V",
"prefijoTelefono": "+58",
"numeroTelefono": "0000000000",
"direccion": "Example street",
"ciudad": "Example city",
"pais": "VE",
"banco": "BANK_VALUE",
"tipoCuenta": "ACCOUNT_TYPE_VALUE",
"numeroCuenta": "00000000000000000000",
"nombreTitular": "Ada",
"apellidoTitular": "Example"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
accountId: 'YOUR_ACCOUNT_UUID',
amount: '25.5',
firstName: 'Ada',
lastName: 'Example',
email: 'payer@example.com',
documentoIdentidad: '00000000',
tipoDocumento: 'V',
prefijoTelefono: '+58',
numeroTelefono: '0000000000',
direccion: 'Example street',
ciudad: 'Example city',
pais: 'VE',
banco: 'BANK_VALUE',
tipoCuenta: 'ACCOUNT_TYPE_VALUE',
numeroCuenta: '00000000000000000000',
nombreTitular: 'Ada',
apellidoTitular: 'Example'
})
};
fetch('https://hg.cash/api/v1/ve/transactions/outbound', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://hg.cash/api/v1/ve/transactions/outbound",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'accountId' => 'YOUR_ACCOUNT_UUID',
'amount' => '25.5',
'firstName' => 'Ada',
'lastName' => 'Example',
'email' => 'payer@example.com',
'documentoIdentidad' => '00000000',
'tipoDocumento' => 'V',
'prefijoTelefono' => '+58',
'numeroTelefono' => '0000000000',
'direccion' => 'Example street',
'ciudad' => 'Example city',
'pais' => 'VE',
'banco' => 'BANK_VALUE',
'tipoCuenta' => 'ACCOUNT_TYPE_VALUE',
'numeroCuenta' => '00000000000000000000',
'nombreTitular' => 'Ada',
'apellidoTitular' => 'Example'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://hg.cash/api/v1/ve/transactions/outbound"
payload := strings.NewReader("{\n \"accountId\": \"YOUR_ACCOUNT_UUID\",\n \"amount\": \"25.5\",\n \"firstName\": \"Ada\",\n \"lastName\": \"Example\",\n \"email\": \"payer@example.com\",\n \"documentoIdentidad\": \"00000000\",\n \"tipoDocumento\": \"V\",\n \"prefijoTelefono\": \"+58\",\n \"numeroTelefono\": \"0000000000\",\n \"direccion\": \"Example street\",\n \"ciudad\": \"Example city\",\n \"pais\": \"VE\",\n \"banco\": \"BANK_VALUE\",\n \"tipoCuenta\": \"ACCOUNT_TYPE_VALUE\",\n \"numeroCuenta\": \"00000000000000000000\",\n \"nombreTitular\": \"Ada\",\n \"apellidoTitular\": \"Example\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://hg.cash/api/v1/ve/transactions/outbound")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"accountId\": \"YOUR_ACCOUNT_UUID\",\n \"amount\": \"25.5\",\n \"firstName\": \"Ada\",\n \"lastName\": \"Example\",\n \"email\": \"payer@example.com\",\n \"documentoIdentidad\": \"00000000\",\n \"tipoDocumento\": \"V\",\n \"prefijoTelefono\": \"+58\",\n \"numeroTelefono\": \"0000000000\",\n \"direccion\": \"Example street\",\n \"ciudad\": \"Example city\",\n \"pais\": \"VE\",\n \"banco\": \"BANK_VALUE\",\n \"tipoCuenta\": \"ACCOUNT_TYPE_VALUE\",\n \"numeroCuenta\": \"00000000000000000000\",\n \"nombreTitular\": \"Ada\",\n \"apellidoTitular\": \"Example\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://hg.cash/api/v1/ve/transactions/outbound")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"accountId\": \"YOUR_ACCOUNT_UUID\",\n \"amount\": \"25.5\",\n \"firstName\": \"Ada\",\n \"lastName\": \"Example\",\n \"email\": \"payer@example.com\",\n \"documentoIdentidad\": \"00000000\",\n \"tipoDocumento\": \"V\",\n \"prefijoTelefono\": \"+58\",\n \"numeroTelefono\": \"0000000000\",\n \"direccion\": \"Example street\",\n \"ciudad\": \"Example city\",\n \"pais\": \"VE\",\n \"banco\": \"BANK_VALUE\",\n \"tipoCuenta\": \"ACCOUNT_TYPE_VALUE\",\n \"numeroCuenta\": \"00000000000000000000\",\n \"nombreTitular\": \"Ada\",\n \"apellidoTitular\": \"Example\"\n}"
response = http.request(request)
puts response.read_body{
"id": "550e8400-e29b-41d4-a716-446655440000",
"status": "processing"
}Authorizations
User API authentication token with format cash_<64-char-hex>. Sample value cash_16cdc3b6f83c72d9d2680adca4f430962981f6bf32613a129dded0aa060387d2.
Body
"YOUR_ACCOUNT_UUID"
Positive USDT decimal string. Not a JSON number. Up to 8 fractional digits may be present. VES amounts are not this field.
^\d+(\.\d+)?$"100.5"
"Ada"
"Example"
"payer@example.com"
"00000000"
Catalogue value from country.documentTypes.
"V"
"+58"
"0000000000"
"Example street"
"Example city"
VE Catalogue value from country.banks. Placeholder BANK_VALUE.
"BANK_VALUE"
Catalogue value from country.accountTypes. Placeholder ACCOUNT_TYPE_VALUE. celular is required for Pago Móvil (13, Pago Móvil, or pago_movil).
"ACCOUNT_TYPE_VALUE"
"00000000000000000000"
"Ada"
"Example"
Required for Pago Móvil. Placeholder +580000000000.
"+580000000000"
Response
processing when verification is approved and a bank account is usable. pending_kyc when verification is still required. The amount and outbound fee stay reserved. The balance is not debited and no payout order is created until verification is approved. kyc_expires_at is 24 hours from create.

