curl --request POST \
--url https://api.rheon.io/v1/card/payout \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"quoteId": "<string>",
"accountId": "acct_8f2c91d0a4",
"card": {
"token": "tok_9c14ba7e02",
"cardId": "<string>"
},
"reference": "payout-2026-09-02-115"
}
'import requests
url = "https://api.rheon.io/v1/card/payout"
payload = {
"quoteId": "<string>",
"accountId": "acct_8f2c91d0a4",
"card": {
"token": "tok_9c14ba7e02",
"cardId": "<string>"
},
"reference": "payout-2026-09-02-115"
}
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({
quoteId: '<string>',
accountId: 'acct_8f2c91d0a4',
card: {token: 'tok_9c14ba7e02', cardId: '<string>'},
reference: 'payout-2026-09-02-115'
})
};
fetch('https://api.rheon.io/v1/card/payout', 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.rheon.io/v1/card/payout",
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([
'quoteId' => '<string>',
'accountId' => 'acct_8f2c91d0a4',
'card' => [
'token' => 'tok_9c14ba7e02',
'cardId' => '<string>'
],
'reference' => 'payout-2026-09-02-115'
]),
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://api.rheon.io/v1/card/payout"
payload := strings.NewReader("{\n \"quoteId\": \"<string>\",\n \"accountId\": \"acct_8f2c91d0a4\",\n \"card\": {\n \"token\": \"tok_9c14ba7e02\",\n \"cardId\": \"<string>\"\n },\n \"reference\": \"payout-2026-09-02-115\"\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://api.rheon.io/v1/card/payout")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"quoteId\": \"<string>\",\n \"accountId\": \"acct_8f2c91d0a4\",\n \"card\": {\n \"token\": \"tok_9c14ba7e02\",\n \"cardId\": \"<string>\"\n },\n \"reference\": \"payout-2026-09-02-115\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rheon.io/v1/card/payout")
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 \"quoteId\": \"<string>\",\n \"accountId\": \"acct_8f2c91d0a4\",\n \"card\": {\n \"token\": \"tok_9c14ba7e02\",\n \"cardId\": \"<string>\"\n },\n \"reference\": \"payout-2026-09-02-115\"\n}"
response = http.request(request)
puts response.read_body{
"environment": "sandbox",
"mock": true,
"id": "bpo_77c2e1f4309a6d5b",
"depositAddress": "0x0000000000000000000000000000000000000000",
"depositAmount": "1234567.89",
"chain": 42161,
"status": "pending",
"expiresAt": "2026-09-08T18:14:12.000Z"
}{
"environment": "sandbox",
"error": {
"code": "invalid_request",
"message": "amount must be a decimal string of the token's smallest unit.",
"fields": {
"applicantInfo.nationality": "iso3166_1_alpha2"
}
}
}{
"environment": "sandbox",
"error": {
"code": "invalid_request",
"message": "amount must be a decimal string of the token's smallest unit.",
"fields": {
"applicantInfo.nationality": "iso3166_1_alpha2"
}
}
}{
"environment": "sandbox",
"error": {
"code": "invalid_request",
"message": "amount must be a decimal string of the token's smallest unit.",
"fields": {
"applicantInfo.nationality": "iso3166_1_alpha2"
}
}
}{
"environment": "sandbox",
"error": {
"code": "invalid_request",
"message": "amount must be a decimal string of the token's smallest unit.",
"fields": {
"applicantInfo.nationality": "iso3166_1_alpha2"
}
}
}{
"environment": "sandbox",
"error": {
"code": "invalid_request",
"message": "amount must be a decimal string of the token's smallest unit.",
"fields": {
"applicantInfo.nationality": "iso3166_1_alpha2"
}
}
}Create a card payout
Creates the payout against a quote and answers where the user sends the stablecoins. Nothing moves until they send. reference makes the call idempotent: the same reference answers the same payout.
The provider behind this endpoint is currently being connected, docs updating. Until then every answer carries mock: true, every money figure is the placeholder 1234567.89, and ids and shapes are real and deterministic from your input.
curl --request POST \
--url https://api.rheon.io/v1/card/payout \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"quoteId": "<string>",
"accountId": "acct_8f2c91d0a4",
"card": {
"token": "tok_9c14ba7e02",
"cardId": "<string>"
},
"reference": "payout-2026-09-02-115"
}
'import requests
url = "https://api.rheon.io/v1/card/payout"
payload = {
"quoteId": "<string>",
"accountId": "acct_8f2c91d0a4",
"card": {
"token": "tok_9c14ba7e02",
"cardId": "<string>"
},
"reference": "payout-2026-09-02-115"
}
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({
quoteId: '<string>',
accountId: 'acct_8f2c91d0a4',
card: {token: 'tok_9c14ba7e02', cardId: '<string>'},
reference: 'payout-2026-09-02-115'
})
};
fetch('https://api.rheon.io/v1/card/payout', 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.rheon.io/v1/card/payout",
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([
'quoteId' => '<string>',
'accountId' => 'acct_8f2c91d0a4',
'card' => [
'token' => 'tok_9c14ba7e02',
'cardId' => '<string>'
],
'reference' => 'payout-2026-09-02-115'
]),
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://api.rheon.io/v1/card/payout"
payload := strings.NewReader("{\n \"quoteId\": \"<string>\",\n \"accountId\": \"acct_8f2c91d0a4\",\n \"card\": {\n \"token\": \"tok_9c14ba7e02\",\n \"cardId\": \"<string>\"\n },\n \"reference\": \"payout-2026-09-02-115\"\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://api.rheon.io/v1/card/payout")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"quoteId\": \"<string>\",\n \"accountId\": \"acct_8f2c91d0a4\",\n \"card\": {\n \"token\": \"tok_9c14ba7e02\",\n \"cardId\": \"<string>\"\n },\n \"reference\": \"payout-2026-09-02-115\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rheon.io/v1/card/payout")
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 \"quoteId\": \"<string>\",\n \"accountId\": \"acct_8f2c91d0a4\",\n \"card\": {\n \"token\": \"tok_9c14ba7e02\",\n \"cardId\": \"<string>\"\n },\n \"reference\": \"payout-2026-09-02-115\"\n}"
response = http.request(request)
puts response.read_body{
"environment": "sandbox",
"mock": true,
"id": "bpo_77c2e1f4309a6d5b",
"depositAddress": "0x0000000000000000000000000000000000000000",
"depositAmount": "1234567.89",
"chain": 42161,
"status": "pending",
"expiresAt": "2026-09-08T18:14:12.000Z"
}{
"environment": "sandbox",
"error": {
"code": "invalid_request",
"message": "amount must be a decimal string of the token's smallest unit.",
"fields": {
"applicantInfo.nationality": "iso3166_1_alpha2"
}
}
}{
"environment": "sandbox",
"error": {
"code": "invalid_request",
"message": "amount must be a decimal string of the token's smallest unit.",
"fields": {
"applicantInfo.nationality": "iso3166_1_alpha2"
}
}
}{
"environment": "sandbox",
"error": {
"code": "invalid_request",
"message": "amount must be a decimal string of the token's smallest unit.",
"fields": {
"applicantInfo.nationality": "iso3166_1_alpha2"
}
}
}{
"environment": "sandbox",
"error": {
"code": "invalid_request",
"message": "amount must be a decimal string of the token's smallest unit.",
"fields": {
"applicantInfo.nationality": "iso3166_1_alpha2"
}
}
}{
"environment": "sandbox",
"error": {
"code": "invalid_request",
"message": "amount must be a decimal string of the token's smallest unit.",
"fields": {
"applicantInfo.nationality": "iso3166_1_alpha2"
}
}
}completed (it stops at processing), the settlement asset is the sandbox’s, not production’s (read cryptoCurrency from GET /v1/config), and the EUR window is unpublished (GET /v1/card/limits says window: unpublished). Every response says which environment answered in its environment field.mock: true: ids, shapes and statuses are real and deterministic from your input, every money figure is the placeholder 1234567.89, and nothing is sent to a provider. Integrate against the shape; do not compute anything from the figures.Authorizations
Your API key, issued by us and shown once at creation.
Body
From POST /v1/card/payout/quote.
1The user being paid out - the same id as the incoming direction.
1"acct_8f2c91d0a4"
Where the money lands: exactly one of token or cardId. Raw card numbers are never accepted.
Show child attributes
Show child attributes
Your idempotency key, up to 64 characters. A retry carrying the same value answers the original object instead of creating a second one.
64"payout-2026-09-02-115"
Response
The payout and where to send.
Which environment answered. sandbox: at least one money upstream is the provider's sandbox - no real money moves there, and the card corridor is the sandbox's asset (read GET /v1/config), not the documented production one. production: every configured upstream is real. Derived from the configured upstream hosts at boot, never a flag.
sandbox, production "sandbox"
Always true on this endpoint: the provider behind it is currently being connected, docs updating. Ids, shapes and statuses are real and deterministic from your input; every money figure is the placeholder 1234567.89; nothing is sent to a provider. The field disappears the day the provider is wired, so branch on its presence, not its value.
true
The payout id. Poll it on the matching status endpoint.
"bpo_77c2e1f4309a6d5b"
Where the user sends the stablecoins. While the payout providers are being connected this is the zero address and nothing must be sent to it; wired, it is a single-use address derived per payout.
^0x[0-9a-fA-F]{40}$"0x0000000000000000000000000000000000000000"
Placeholder while the provider is being connected: always 1234567.89, never a price. Do not compute anything from it. When the provider is wired this becomes a decimal string in major units.
"1234567.89""1234567.89"
The chain depositAddress lives on - the chain the quote was made for.
x <= 900719925474099142161
pending: created, waiting for the user's stablecoin at the deposit address. converting: the stablecoin landed and is being converted. sent: left the provider, NOT arrived. settled: reached the card or bank account - the one state to tell the user about. rejected: the provider refused it. returned: sent and came back. While the payout providers are being connected every payout answers pending.
pending, converting, sent, settled, rejected, returned "pending"
ISO 8601. Stablecoins arriving after this convert at the rate current on arrival, not the quoted one.
"2026-09-08T18:14:12.000Z"