curl --request POST \
--url https://api.rach.finance/caas/v1/escrows \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"amount": "250.00",
"buyer_phone": "+2348012345678",
"rail": "TRON",
"reference": "chainzap-deal-8821",
"seller_phone": "+2348087654321",
"token": "USDT",
"auto_release_hours": 72,
"chain_id": 123
}
'import requests
url = "https://api.rach.finance/caas/v1/escrows"
payload = {
"amount": "250.00",
"buyer_phone": "+2348012345678",
"rail": "TRON",
"reference": "chainzap-deal-8821",
"seller_phone": "+2348087654321",
"token": "USDT",
"auto_release_hours": 72,
"chain_id": 123
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
amount: '250.00',
buyer_phone: '+2348012345678',
rail: 'TRON',
reference: 'chainzap-deal-8821',
seller_phone: '+2348087654321',
token: 'USDT',
auto_release_hours: 72,
chain_id: 123
})
};
fetch('https://api.rach.finance/caas/v1/escrows', 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.rach.finance/caas/v1/escrows",
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' => '250.00',
'buyer_phone' => '+2348012345678',
'rail' => 'TRON',
'reference' => 'chainzap-deal-8821',
'seller_phone' => '+2348087654321',
'token' => 'USDT',
'auto_release_hours' => 72,
'chain_id' => 123
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-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.rach.finance/caas/v1/escrows"
payload := strings.NewReader("{\n \"amount\": \"250.00\",\n \"buyer_phone\": \"+2348012345678\",\n \"rail\": \"TRON\",\n \"reference\": \"chainzap-deal-8821\",\n \"seller_phone\": \"+2348087654321\",\n \"token\": \"USDT\",\n \"auto_release_hours\": 72,\n \"chain_id\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.rach.finance/caas/v1/escrows")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"amount\": \"250.00\",\n \"buyer_phone\": \"+2348012345678\",\n \"rail\": \"TRON\",\n \"reference\": \"chainzap-deal-8821\",\n \"seller_phone\": \"+2348087654321\",\n \"token\": \"USDT\",\n \"auto_release_hours\": 72,\n \"chain_id\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rach.finance/caas/v1/escrows")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"amount\": \"250.00\",\n \"buyer_phone\": \"+2348012345678\",\n \"rail\": \"TRON\",\n \"reference\": \"chainzap-deal-8821\",\n \"seller_phone\": \"+2348087654321\",\n \"token\": \"USDT\",\n \"auto_release_hours\": 72,\n \"chain_id\": 123\n}"
response = http.request(request)
puts response.read_body{
"amount": "250000000",
"auto_release_at": "<string>",
"chain_id": 123,
"created_at": "<string>",
"dispute_reason": "<string>",
"disputed_at": "<string>",
"escrow_address": "<string>",
"funded_at": "<string>",
"funding_expires_at": "<string>",
"id": "<string>",
"network": "<string>",
"payout_pending": true,
"payout_tx_hash": "<string>",
"rail": "<string>",
"reference": "<string>",
"refunded_at": "<string>",
"released_at": "<string>",
"resolution_note": "<string>",
"state": "CREATED",
"token": "<string>",
"updated_at": "<string>"
}{}{}{}{}Open an escrow
Opens a dedicated Rach-custodied TRON USDT wallet between two already-provisioned, tenant-linked customers. This is not a TRON smart-contract escrow. New admission requires enabled deposits and sponsored payouts with a successful readiness check. Request amount is a whole-USDT decimal string; response amount is an integer base-unit string (6 decimals). The tenant-scoped reference is the create idempotency key; changed terms return 409. Omit chain_id. Optional auto_release_hours (0-8760) is persisted and measured from confirmed funding. Funding window defaults to 24 hours. Partial/excess/late deposits can be recovered by authorized Rach staff. Test keys simulate mutations without persistent escrows or custody wallets.
curl --request POST \
--url https://api.rach.finance/caas/v1/escrows \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"amount": "250.00",
"buyer_phone": "+2348012345678",
"rail": "TRON",
"reference": "chainzap-deal-8821",
"seller_phone": "+2348087654321",
"token": "USDT",
"auto_release_hours": 72,
"chain_id": 123
}
'import requests
url = "https://api.rach.finance/caas/v1/escrows"
payload = {
"amount": "250.00",
"buyer_phone": "+2348012345678",
"rail": "TRON",
"reference": "chainzap-deal-8821",
"seller_phone": "+2348087654321",
"token": "USDT",
"auto_release_hours": 72,
"chain_id": 123
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
amount: '250.00',
buyer_phone: '+2348012345678',
rail: 'TRON',
reference: 'chainzap-deal-8821',
seller_phone: '+2348087654321',
token: 'USDT',
auto_release_hours: 72,
chain_id: 123
})
};
fetch('https://api.rach.finance/caas/v1/escrows', 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.rach.finance/caas/v1/escrows",
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' => '250.00',
'buyer_phone' => '+2348012345678',
'rail' => 'TRON',
'reference' => 'chainzap-deal-8821',
'seller_phone' => '+2348087654321',
'token' => 'USDT',
'auto_release_hours' => 72,
'chain_id' => 123
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-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.rach.finance/caas/v1/escrows"
payload := strings.NewReader("{\n \"amount\": \"250.00\",\n \"buyer_phone\": \"+2348012345678\",\n \"rail\": \"TRON\",\n \"reference\": \"chainzap-deal-8821\",\n \"seller_phone\": \"+2348087654321\",\n \"token\": \"USDT\",\n \"auto_release_hours\": 72,\n \"chain_id\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.rach.finance/caas/v1/escrows")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"amount\": \"250.00\",\n \"buyer_phone\": \"+2348012345678\",\n \"rail\": \"TRON\",\n \"reference\": \"chainzap-deal-8821\",\n \"seller_phone\": \"+2348087654321\",\n \"token\": \"USDT\",\n \"auto_release_hours\": 72,\n \"chain_id\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rach.finance/caas/v1/escrows")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"amount\": \"250.00\",\n \"buyer_phone\": \"+2348012345678\",\n \"rail\": \"TRON\",\n \"reference\": \"chainzap-deal-8821\",\n \"seller_phone\": \"+2348087654321\",\n \"token\": \"USDT\",\n \"auto_release_hours\": 72,\n \"chain_id\": 123\n}"
response = http.request(request)
puts response.read_body{
"amount": "250000000",
"auto_release_at": "<string>",
"chain_id": 123,
"created_at": "<string>",
"dispute_reason": "<string>",
"disputed_at": "<string>",
"escrow_address": "<string>",
"funded_at": "<string>",
"funding_expires_at": "<string>",
"id": "<string>",
"network": "<string>",
"payout_pending": true,
"payout_tx_hash": "<string>",
"rail": "<string>",
"reference": "<string>",
"refunded_at": "<string>",
"released_at": "<string>",
"resolution_note": "<string>",
"state": "CREATED",
"token": "<string>",
"updated_at": "<string>"
}{}{}{}{}Authorizations
Your Rach B2B API key. Use rach_sk_live_* for production (on-chain) or rach_sk_test_* for sandbox (no-chain simulation).
Body
Deal terms
Amount is a decimal string in whole tokens, e.g. "250.00".
"250.00"
BuyerPhone and SellerPhone must be distinct E.164 numbers. Both customers must already have TRON wallets linked to this tenant through provisioning or the consent-based linking flow; escrow creation does not provision them.
"+2348012345678"
Only the TRON adapter is wired. EVM and SOLANA escrow are not available.
TRON "TRON"
Reference is the partner's own id for the deal. Reusing one returns the existing escrow rather than opening a second against the same order.
"chainzap-deal-8821"
"+2348087654321"
The supported escrow asset is USDT on TRON (TRC-20). Do not send USDC.
USDT "USDT"
Inspection window measured from confirmed funding. Zero disables automatic release in the current configuration. Maximum 8760 hours (365 days).
0 <= x <= 876072
Reserved for EVM escrow. Omit for TRON; a nonzero value is rejected.
Response
Created
Amount is in base units, unlike the create request's whole-token amount. For the implemented TRON USDT adapter, "250000000" means 250 USDT.
"250000000"
AutoReleaseAt is when a funded escrow releases to the seller with no further action. Absent means it never does and someone must decide.
EscrowAddress is where the buyer sends the money. It belongs to this deal alone and is never reused.
FundingExpiresAt is when an unpaid escrow closes.
PayoutPending is true while a payout has been authorised and dispatched but not yet confirmed. Surfaced rather than hidden because during this window the honest answer to "has the seller been paid" is "not yet".
PayoutTxHash is the on-chain transaction that moved the money out. It is the partner's evidence that a release or refund really happened.
Recorded admin reasoning once a disputed payout settles.
CREATED, FUNDED, DISPUTED, RELEASED, REFUNDED, EXPIRED, CANCELLED 
