curl --request POST \
--url https://api.rheon.io/v1/fiat/consent/complete \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"consentSessionId": "<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/consent/complete"
payload = {
"consentSessionId": "<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({
consentSessionId: '<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/consent/complete', 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/consent/complete",
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([
'consentSessionId' => '<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/consent/complete"
payload := strings.NewReader("{\n \"consentSessionId\": \"<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/consent/complete")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"consentSessionId\": \"<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/consent/complete")
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 \"consentSessionId\": \"<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"
}
}
}Finish onboarding after consent
Same person and payload as onboarding, with the session id in place of the spent one-time code. A decline is a real outcome with its own code; the session survives it for a retry.
curl --request POST \
--url https://api.rheon.io/v1/fiat/consent/complete \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"consentSessionId": "<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/consent/complete"
payload = {
"consentSessionId": "<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({
consentSessionId: '<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/consent/complete', 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/consent/complete",
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([
'consentSessionId' => '<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/consent/complete"
payload := strings.NewReader("{\n \"consentSessionId\": \"<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/consent/complete")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"consentSessionId\": \"<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/consent/complete")
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 \"consentSessionId\": \"<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
1The two fields the identity provider does not share and the bank provider requires.
Show child attributes
Show child attributes
The same wallet the session was opened with; a different one is refused as an invalid session.
^0x[0-9a-fA-F]{40}$"0x1111111111111111111111111111111111111111"
Show child attributes
Show child attributes
Response
Onboarded.
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"