curl --request POST \
--url https://api.jenzy.com/v2/payouts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"amount": "10000.00",
"asset": "KES",
"destination": {
"type": "bank",
"institution_id": "kes-bank-kenya-commercial-bank-limited",
"account_number": "1000012345",
"beneficiary_name": "Jane Doe"
},
"source_asset": "USDT"
}
'import requests
url = "https://api.jenzy.com/v2/payouts"
payload = {
"amount": "10000.00",
"asset": "KES",
"destination": {
"type": "bank",
"institution_id": "kes-bank-kenya-commercial-bank-limited",
"account_number": "1000012345",
"beneficiary_name": "Jane Doe"
},
"source_asset": "USDT"
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
amount: '10000.00',
asset: 'KES',
destination: {
type: 'bank',
institution_id: 'kes-bank-kenya-commercial-bank-limited',
account_number: '1000012345',
beneficiary_name: 'Jane Doe'
},
source_asset: 'USDT'
})
};
fetch('https://api.jenzy.com/v2/payouts', 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://api.jenzy.com/v2/payouts",
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([
'amount' => '10000.00',
'asset' => 'KES',
'destination' => [
'type' => 'bank',
'institution_id' => 'kes-bank-kenya-commercial-bank-limited',
'account_number' => '1000012345',
'beneficiary_name' => 'Jane Doe'
],
'source_asset' => 'USDT'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$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://api.jenzy.com/v2/payouts"
payload := strings.NewReader("{\n \"amount\": \"10000.00\",\n \"asset\": \"KES\",\n \"destination\": {\n \"type\": \"bank\",\n \"institution_id\": \"kes-bank-kenya-commercial-bank-limited\",\n \"account_number\": \"1000012345\",\n \"beneficiary_name\": \"Jane Doe\"\n },\n \"source_asset\": \"USDT\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
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://api.jenzy.com/v2/payouts")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"amount\": \"10000.00\",\n \"asset\": \"KES\",\n \"destination\": {\n \"type\": \"bank\",\n \"institution_id\": \"kes-bank-kenya-commercial-bank-limited\",\n \"account_number\": \"1000012345\",\n \"beneficiary_name\": \"Jane Doe\"\n },\n \"source_asset\": \"USDT\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.jenzy.com/v2/payouts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"amount\": \"10000.00\",\n \"asset\": \"KES\",\n \"destination\": {\n \"type\": \"bank\",\n \"institution_id\": \"kes-bank-kenya-commercial-bank-limited\",\n \"account_number\": \"1000012345\",\n \"beneficiary_name\": \"Jane Doe\"\n },\n \"source_asset\": \"USDT\"\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "pending",
"asset": "KES",
"amount": "10000.00",
"source_asset": "USDT",
"source_amount": "77.8875",
"fee": "0.8",
"rate": "0.00778875",
"destination": {
"type": "bank",
"institution_id": "<string>",
"account_number": "<string>",
"beneficiary_name": "<string>"
},
"failure": {
"code": "recipient_account_invalid",
"message": "<string>"
},
"created_at": "2023-11-07T05:31:56Z",
"terminal_at": "2023-11-07T05:31:56Z"
}{
"error": {
"code": "validation_error",
"message": "<string>"
}
}{
"error": {
"code": "validation_error",
"message": "<string>"
}
}{
"error": {
"code": "validation_error",
"message": "<string>"
}
}{
"error": {
"code": "validation_error",
"message": "<string>"
}
}{
"error": {
"code": "validation_error",
"message": "<string>"
}
}{
"error": {
"code": "validation_error",
"message": "<string>"
}
}Create a payout
Reserve the money and pay a beneficiary in asset. amount is what they receive; your source_asset balance is debited source_amount plus fee. The destination is validated before any money is reserved, so a refusal (422) leaves nothing behind. The response is the payout as it stands after the payment network has answered — normally pending; a payout may be failed in its creation response, with the reserved money already released. Requires an Idempotency-Key.
curl --request POST \
--url https://api.jenzy.com/v2/payouts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"amount": "10000.00",
"asset": "KES",
"destination": {
"type": "bank",
"institution_id": "kes-bank-kenya-commercial-bank-limited",
"account_number": "1000012345",
"beneficiary_name": "Jane Doe"
},
"source_asset": "USDT"
}
'import requests
url = "https://api.jenzy.com/v2/payouts"
payload = {
"amount": "10000.00",
"asset": "KES",
"destination": {
"type": "bank",
"institution_id": "kes-bank-kenya-commercial-bank-limited",
"account_number": "1000012345",
"beneficiary_name": "Jane Doe"
},
"source_asset": "USDT"
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
amount: '10000.00',
asset: 'KES',
destination: {
type: 'bank',
institution_id: 'kes-bank-kenya-commercial-bank-limited',
account_number: '1000012345',
beneficiary_name: 'Jane Doe'
},
source_asset: 'USDT'
})
};
fetch('https://api.jenzy.com/v2/payouts', 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://api.jenzy.com/v2/payouts",
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([
'amount' => '10000.00',
'asset' => 'KES',
'destination' => [
'type' => 'bank',
'institution_id' => 'kes-bank-kenya-commercial-bank-limited',
'account_number' => '1000012345',
'beneficiary_name' => 'Jane Doe'
],
'source_asset' => 'USDT'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$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://api.jenzy.com/v2/payouts"
payload := strings.NewReader("{\n \"amount\": \"10000.00\",\n \"asset\": \"KES\",\n \"destination\": {\n \"type\": \"bank\",\n \"institution_id\": \"kes-bank-kenya-commercial-bank-limited\",\n \"account_number\": \"1000012345\",\n \"beneficiary_name\": \"Jane Doe\"\n },\n \"source_asset\": \"USDT\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
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://api.jenzy.com/v2/payouts")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"amount\": \"10000.00\",\n \"asset\": \"KES\",\n \"destination\": {\n \"type\": \"bank\",\n \"institution_id\": \"kes-bank-kenya-commercial-bank-limited\",\n \"account_number\": \"1000012345\",\n \"beneficiary_name\": \"Jane Doe\"\n },\n \"source_asset\": \"USDT\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.jenzy.com/v2/payouts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"amount\": \"10000.00\",\n \"asset\": \"KES\",\n \"destination\": {\n \"type\": \"bank\",\n \"institution_id\": \"kes-bank-kenya-commercial-bank-limited\",\n \"account_number\": \"1000012345\",\n \"beneficiary_name\": \"Jane Doe\"\n },\n \"source_asset\": \"USDT\"\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "pending",
"asset": "KES",
"amount": "10000.00",
"source_asset": "USDT",
"source_amount": "77.8875",
"fee": "0.8",
"rate": "0.00778875",
"destination": {
"type": "bank",
"institution_id": "<string>",
"account_number": "<string>",
"beneficiary_name": "<string>"
},
"failure": {
"code": "recipient_account_invalid",
"message": "<string>"
},
"created_at": "2023-11-07T05:31:56Z",
"terminal_at": "2023-11-07T05:31:56Z"
}{
"error": {
"code": "validation_error",
"message": "<string>"
}
}{
"error": {
"code": "validation_error",
"message": "<string>"
}
}{
"error": {
"code": "validation_error",
"message": "<string>"
}
}{
"error": {
"code": "validation_error",
"message": "<string>"
}
}{
"error": {
"code": "validation_error",
"message": "<string>"
}
}{
"error": {
"code": "validation_error",
"message": "<string>"
}
}Authorizations
Your Jenzy API key: Authorization: Bearer jz_live_…
Headers
Required. A key you mint per payout intent (a UUID works). Replays of the same key + body return the original response; the same key with a different body is a 409.
Body
What the beneficiary receives, in asset. Fees and any FX are on top, in source_asset.
"10000.00"
The asset the beneficiary receives.
1"KES"
- Option 1
- Option 2
- Option 3
Show child attributes
Show child attributes
The asset you pay from. Defaults to asset. A stablecoin balance can pay a fiat beneficiary (the FX payout); any other mixed pair is unsupported_pair.
1"USDT"
Response
Created. status is normally pending; it can be held (the payment network has not yet acknowledged — poll) or already failed.
Payout id — your handle for polling and support.
Lifecycle: held (money reserved, the payment network has not yet acknowledged) → pending → succeeded | failed. succeeded, failed and reversed are terminal. A payout may already be failed in its creation response: the destination was accepted but the payment network refused it at once, and the reserved money is released. reversed means the payout succeeded and was then clawed back — it is not a failure and carries no failure object.
received, validated, held, submitted, pending, succeeded, failed, reversed "pending"
An asset code as GET /v2/assets lists it — uppercase, never compound (KES, USDT; never USDT-TRON). Network and rail live on the payment object.
1"KES"
What the beneficiary receives, as an exact decimal string in asset.
"10000.00"
What you paid from.
1"USDT"
What is debited from your source_asset balance for the beneficiary amount, FX included; equals amount when the assets are the same. Your fee is on top.
"77.8875"
Jenzy’s payout fee, one total, in source_asset. Known at creation.
"0.8"
source_amount ÷ amount at 8 decimal places — source_asset per 1 asset — when the assets differ; null otherwise. Informational: the two amounts are the contract.
"0.00778875"
- Option 1
- Option 2
- Option 3
Show child attributes
Show child attributes
Set only when status is failed: one of the published codes with its fixed message. Detail from the payment network is never included.
Show child attributes
Show child attributes
When the payout reached succeeded, failed or reversed; null while in flight.