curl --request POST \
--url https://api.rheon.io/v1/bank/deposit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"accountId": "acct_8f2c91d0a4",
"walletId": "wlt_5b71e0c3",
"fiatCurrency": "EUR",
"fiatAmount": "500.00",
"reference": "payout-2026-09-02-115"
}
'import requests
url = "https://api.rheon.io/v1/bank/deposit"
payload = {
"accountId": "acct_8f2c91d0a4",
"walletId": "wlt_5b71e0c3",
"fiatCurrency": "EUR",
"fiatAmount": "500.00",
"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({
accountId: 'acct_8f2c91d0a4',
walletId: 'wlt_5b71e0c3',
fiatCurrency: 'EUR',
fiatAmount: '500.00',
reference: 'payout-2026-09-02-115'
})
};
fetch('https://api.rheon.io/v1/bank/deposit', 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/bank/deposit",
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' => 'acct_8f2c91d0a4',
'walletId' => 'wlt_5b71e0c3',
'fiatCurrency' => 'EUR',
'fiatAmount' => '500.00',
'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/bank/deposit"
payload := strings.NewReader("{\n \"accountId\": \"acct_8f2c91d0a4\",\n \"walletId\": \"wlt_5b71e0c3\",\n \"fiatCurrency\": \"EUR\",\n \"fiatAmount\": \"500.00\",\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/bank/deposit")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"accountId\": \"acct_8f2c91d0a4\",\n \"walletId\": \"wlt_5b71e0c3\",\n \"fiatCurrency\": \"EUR\",\n \"fiatAmount\": \"500.00\",\n \"reference\": \"payout-2026-09-02-115\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rheon.io/v1/bank/deposit")
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\": \"acct_8f2c91d0a4\",\n \"walletId\": \"wlt_5b71e0c3\",\n \"fiatCurrency\": \"EUR\",\n \"fiatAmount\": \"500.00\",\n \"reference\": \"payout-2026-09-02-115\"\n}"
response = http.request(request)
puts response.read_body{
"environment": "sandbox",
"mock": true,
"id": "bdp_3a71f0c9e4d2b581",
"details": {
"iban": "IE00MOCK12345678901234",
"bic": "MOCKIE2D",
"beneficiary": "Rheon Payments",
"reference": "RHN-3A71F0C9"
},
"rail": "sepa",
"expiresAt": "2026-09-15T17:30:00.000Z",
"status": "awaiting_deposit"
}{
"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"
}
}
}Take a one-off bank deposit
Bank details for ONE incoming transfer, without opening a virtual account: for a user who pays once, or where you would rather not issue permanent details. The details follow the currency’s rail (GET /v1/currencies) and carry the reference the transfer must quote. reference on the request makes the call idempotent.
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/bank/deposit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"accountId": "acct_8f2c91d0a4",
"walletId": "wlt_5b71e0c3",
"fiatCurrency": "EUR",
"fiatAmount": "500.00",
"reference": "payout-2026-09-02-115"
}
'import requests
url = "https://api.rheon.io/v1/bank/deposit"
payload = {
"accountId": "acct_8f2c91d0a4",
"walletId": "wlt_5b71e0c3",
"fiatCurrency": "EUR",
"fiatAmount": "500.00",
"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({
accountId: 'acct_8f2c91d0a4',
walletId: 'wlt_5b71e0c3',
fiatCurrency: 'EUR',
fiatAmount: '500.00',
reference: 'payout-2026-09-02-115'
})
};
fetch('https://api.rheon.io/v1/bank/deposit', 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/bank/deposit",
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' => 'acct_8f2c91d0a4',
'walletId' => 'wlt_5b71e0c3',
'fiatCurrency' => 'EUR',
'fiatAmount' => '500.00',
'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/bank/deposit"
payload := strings.NewReader("{\n \"accountId\": \"acct_8f2c91d0a4\",\n \"walletId\": \"wlt_5b71e0c3\",\n \"fiatCurrency\": \"EUR\",\n \"fiatAmount\": \"500.00\",\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/bank/deposit")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"accountId\": \"acct_8f2c91d0a4\",\n \"walletId\": \"wlt_5b71e0c3\",\n \"fiatCurrency\": \"EUR\",\n \"fiatAmount\": \"500.00\",\n \"reference\": \"payout-2026-09-02-115\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rheon.io/v1/bank/deposit")
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\": \"acct_8f2c91d0a4\",\n \"walletId\": \"wlt_5b71e0c3\",\n \"fiatCurrency\": \"EUR\",\n \"fiatAmount\": \"500.00\",\n \"reference\": \"payout-2026-09-02-115\"\n}"
response = http.request(request)
puts response.read_body{
"environment": "sandbox",
"mock": true,
"id": "bdp_3a71f0c9e4d2b581",
"details": {
"iban": "IE00MOCK12345678901234",
"bic": "MOCKIE2D",
"beneficiary": "Rheon Payments",
"reference": "RHN-3A71F0C9"
},
"rail": "sepa",
"expiresAt": "2026-09-15T17:30:00.000Z",
"status": "awaiting_deposit"
}{
"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"
}
}
}network from GET /v1/config). Known limits: only the EUR/IBAN rail is wired for the simulated pay-in, and identity checks run on test-mode applicants. 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
The user paying. Onboard them first (POST /v1/fiat/onboard).
1"acct_8f2c91d0a4"
The registered wallet the settled stablecoin is delivered to (from onboarding).
1"wlt_5b71e0c3"
ISO 4217 code the user pays in. Must be a currency the bank rails take (GET /v1/currencies, fiat); others are refused with no_route.
^[A-Za-z]{3}$"EUR"
What the user will send, decimal string in major units. The details are issued for this amount.
^\d+(\.\d+)?$"500.00"
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 details to show the payer.
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 deposit id. Poll it on POST /v1/bank/deposit/status.
"bdp_3a71f0c9e4d2b581"
The bank details to display, shaped by the rail (an iban and bic for SEPA, an accountNumber for account-number rails, a clabe for SPEI, a key for PIX), always with the beneficiary and the payment reference the transfer must carry. Render what comes back rather than assuming a shape. While the provider is being connected the details are self-labelled test values that accept nothing.
Show child attributes
Show child attributes
{
"iban": "IE00MOCK12345678901234",
"bic": "MOCKIE2D",
"beneficiary": "Rheon Payments",
"reference": "RHN-3A71F0C9"
}
The rail these details are on, as GET /v1/currencies names it.
"sepa"
ISO 8601. After this the details stop accepting money; a transfer already in flight still settles.
"2026-09-15T17:30:00.000Z"
awaiting_deposit on creation - the bank vocabulary GET /v1/statuses lists.
awaiting_deposit, funded