curl --request POST \
--url https://api.rheon.io/v1/fiat/onboard \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"authCode": "<string>",
"applicantInfo": {
"nationality": "US",
"phone": "+14155551234"
},
"wallet": "0x1111111111111111111111111111111111111111",
"individual": {
"name": "Jane Doe",
"email": "jane@example.com",
"country": "DE",
"category": "self_employed"
}
}
'import requests
url = "https://api.rheon.io/v1/fiat/onboard"
payload = {
"authCode": "<string>",
"applicantInfo": {
"nationality": "US",
"phone": "+14155551234"
},
"wallet": "0x1111111111111111111111111111111111111111",
"individual": {
"name": "Jane Doe",
"email": "jane@example.com",
"country": "DE",
"category": "self_employed"
}
}
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({
authCode: '<string>',
applicantInfo: {nationality: 'US', phone: '+14155551234'},
wallet: '0x1111111111111111111111111111111111111111',
individual: {
name: 'Jane Doe',
email: 'jane@example.com',
country: 'DE',
category: 'self_employed'
}
})
};
fetch('https://api.rheon.io/v1/fiat/onboard', 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/fiat/onboard",
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([
'authCode' => '<string>',
'applicantInfo' => [
'nationality' => 'US',
'phone' => '+14155551234'
],
'wallet' => '0x1111111111111111111111111111111111111111',
'individual' => [
'name' => 'Jane Doe',
'email' => 'jane@example.com',
'country' => 'DE',
'category' => 'self_employed'
]
]),
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/fiat/onboard"
payload := strings.NewReader("{\n \"authCode\": \"<string>\",\n \"applicantInfo\": {\n \"nationality\": \"US\",\n \"phone\": \"+14155551234\"\n },\n \"wallet\": \"0x1111111111111111111111111111111111111111\",\n \"individual\": {\n \"name\": \"Jane Doe\",\n \"email\": \"jane@example.com\",\n \"country\": \"DE\",\n \"category\": \"self_employed\"\n }\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/fiat/onboard")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"authCode\": \"<string>\",\n \"applicantInfo\": {\n \"nationality\": \"US\",\n \"phone\": \"+14155551234\"\n },\n \"wallet\": \"0x1111111111111111111111111111111111111111\",\n \"individual\": {\n \"name\": \"Jane Doe\",\n \"email\": \"jane@example.com\",\n \"country\": \"DE\",\n \"category\": \"self_employed\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rheon.io/v1/fiat/onboard")
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 \"authCode\": \"<string>\",\n \"applicantInfo\": {\n \"nationality\": \"US\",\n \"phone\": \"+14155551234\"\n },\n \"wallet\": \"0x1111111111111111111111111111111111111111\",\n \"individual\": {\n \"name\": \"Jane Doe\",\n \"email\": \"jane@example.com\",\n \"country\": \"DE\",\n \"category\": \"self_employed\"\n }\n}"
response = http.request(request)
puts response.read_body{
"environment": "sandbox",
"status": "onboarded",
"accountId": "<string>",
"walletId": "<string>",
"kycStatus": "pending"
}{
"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"
}
}
}{
"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"
}
}
}Onboard a bank-transfer user
Exchanges the identity provider’s one-time code, then either runs the bank provider’s sequence (account, shared verification, terms, wallet link) or, for every first-time user, answers consent_required with a session id for the hosted consent step.
curl --request POST \
--url https://api.rheon.io/v1/fiat/onboard \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"authCode": "<string>",
"applicantInfo": {
"nationality": "US",
"phone": "+14155551234"
},
"wallet": "0x1111111111111111111111111111111111111111",
"individual": {
"name": "Jane Doe",
"email": "jane@example.com",
"country": "DE",
"category": "self_employed"
}
}
'import requests
url = "https://api.rheon.io/v1/fiat/onboard"
payload = {
"authCode": "<string>",
"applicantInfo": {
"nationality": "US",
"phone": "+14155551234"
},
"wallet": "0x1111111111111111111111111111111111111111",
"individual": {
"name": "Jane Doe",
"email": "jane@example.com",
"country": "DE",
"category": "self_employed"
}
}
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({
authCode: '<string>',
applicantInfo: {nationality: 'US', phone: '+14155551234'},
wallet: '0x1111111111111111111111111111111111111111',
individual: {
name: 'Jane Doe',
email: 'jane@example.com',
country: 'DE',
category: 'self_employed'
}
})
};
fetch('https://api.rheon.io/v1/fiat/onboard', 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/fiat/onboard",
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([
'authCode' => '<string>',
'applicantInfo' => [
'nationality' => 'US',
'phone' => '+14155551234'
],
'wallet' => '0x1111111111111111111111111111111111111111',
'individual' => [
'name' => 'Jane Doe',
'email' => 'jane@example.com',
'country' => 'DE',
'category' => 'self_employed'
]
]),
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/fiat/onboard"
payload := strings.NewReader("{\n \"authCode\": \"<string>\",\n \"applicantInfo\": {\n \"nationality\": \"US\",\n \"phone\": \"+14155551234\"\n },\n \"wallet\": \"0x1111111111111111111111111111111111111111\",\n \"individual\": {\n \"name\": \"Jane Doe\",\n \"email\": \"jane@example.com\",\n \"country\": \"DE\",\n \"category\": \"self_employed\"\n }\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/fiat/onboard")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"authCode\": \"<string>\",\n \"applicantInfo\": {\n \"nationality\": \"US\",\n \"phone\": \"+14155551234\"\n },\n \"wallet\": \"0x1111111111111111111111111111111111111111\",\n \"individual\": {\n \"name\": \"Jane Doe\",\n \"email\": \"jane@example.com\",\n \"country\": \"DE\",\n \"category\": \"self_employed\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rheon.io/v1/fiat/onboard")
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 \"authCode\": \"<string>\",\n \"applicantInfo\": {\n \"nationality\": \"US\",\n \"phone\": \"+14155551234\"\n },\n \"wallet\": \"0x1111111111111111111111111111111111111111\",\n \"individual\": {\n \"name\": \"Jane Doe\",\n \"email\": \"jane@example.com\",\n \"country\": \"DE\",\n \"category\": \"self_employed\"\n }\n}"
response = http.request(request)
puts response.read_body{
"environment": "sandbox",
"status": "onboarded",
"accountId": "<string>",
"walletId": "<string>",
"kycStatus": "pending"
}{
"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"
}
}
}{
"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.Authorizations
Your API key, issued by us and shown once at creation.
Body
One-time authorization code from the identity provider's button in your UI.
1The two fields the identity provider does not share and the bank provider requires.
Show child attributes
Show child attributes
The user's EVM wallet - the non-custodial USDC destination.
^0x[0-9a-fA-F]{40}$"0x1111111111111111111111111111111111111111"
Show child attributes
Show child attributes
Response
Onboarded, or consent still needed.
- Option 1
- Option 2
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"
"onboarded"The user's account id at the bank provider.
The linked wallet id (the settlement destination).
KYC status right after creation.
"pending"