curl --request POST \
--url https://skala-sandbox.ripio.com/api/v1/customers/{customerId}/investorProfile/ \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"questionnaireVersion": 1,
"answers": [
{
"questionId": "familiarity_experience",
"answerId": "invests_regularly"
},
{
"questionId": "investment_goal",
"answerId": "maximize_returns"
},
{
"questionId": "investment_horizon",
"answerId": "more_than_3_years"
},
{
"questionId": "drawdown_reaction",
"answerId": "buy_more"
},
{
"questionId": "savings_allocation",
"answerId": "most_savings"
}
]
}
'import requests
url = "https://skala-sandbox.ripio.com/api/v1/customers/{customerId}/investorProfile/"
payload = {
"questionnaireVersion": 1,
"answers": [
{
"questionId": "familiarity_experience",
"answerId": "invests_regularly"
},
{
"questionId": "investment_goal",
"answerId": "maximize_returns"
},
{
"questionId": "investment_horizon",
"answerId": "more_than_3_years"
},
{
"questionId": "drawdown_reaction",
"answerId": "buy_more"
},
{
"questionId": "savings_allocation",
"answerId": "most_savings"
}
]
}
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({
questionnaireVersion: 1,
answers: [
{questionId: 'familiarity_experience', answerId: 'invests_regularly'},
{questionId: 'investment_goal', answerId: 'maximize_returns'},
{questionId: 'investment_horizon', answerId: 'more_than_3_years'},
{questionId: 'drawdown_reaction', answerId: 'buy_more'},
{questionId: 'savings_allocation', answerId: 'most_savings'}
]
})
};
fetch('https://skala-sandbox.ripio.com/api/v1/customers/{customerId}/investorProfile/', 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://skala-sandbox.ripio.com/api/v1/customers/{customerId}/investorProfile/",
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([
'questionnaireVersion' => 1,
'answers' => [
[
'questionId' => 'familiarity_experience',
'answerId' => 'invests_regularly'
],
[
'questionId' => 'investment_goal',
'answerId' => 'maximize_returns'
],
[
'questionId' => 'investment_horizon',
'answerId' => 'more_than_3_years'
],
[
'questionId' => 'drawdown_reaction',
'answerId' => 'buy_more'
],
[
'questionId' => 'savings_allocation',
'answerId' => 'most_savings'
]
]
]),
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://skala-sandbox.ripio.com/api/v1/customers/{customerId}/investorProfile/"
payload := strings.NewReader("{\n \"questionnaireVersion\": 1,\n \"answers\": [\n {\n \"questionId\": \"familiarity_experience\",\n \"answerId\": \"invests_regularly\"\n },\n {\n \"questionId\": \"investment_goal\",\n \"answerId\": \"maximize_returns\"\n },\n {\n \"questionId\": \"investment_horizon\",\n \"answerId\": \"more_than_3_years\"\n },\n {\n \"questionId\": \"drawdown_reaction\",\n \"answerId\": \"buy_more\"\n },\n {\n \"questionId\": \"savings_allocation\",\n \"answerId\": \"most_savings\"\n }\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://skala-sandbox.ripio.com/api/v1/customers/{customerId}/investorProfile/")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"questionnaireVersion\": 1,\n \"answers\": [\n {\n \"questionId\": \"familiarity_experience\",\n \"answerId\": \"invests_regularly\"\n },\n {\n \"questionId\": \"investment_goal\",\n \"answerId\": \"maximize_returns\"\n },\n {\n \"questionId\": \"investment_horizon\",\n \"answerId\": \"more_than_3_years\"\n },\n {\n \"questionId\": \"drawdown_reaction\",\n \"answerId\": \"buy_more\"\n },\n {\n \"questionId\": \"savings_allocation\",\n \"answerId\": \"most_savings\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://skala-sandbox.ripio.com/api/v1/customers/{customerId}/investorProfile/")
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 \"questionnaireVersion\": 1,\n \"answers\": [\n {\n \"questionId\": \"familiarity_experience\",\n \"answerId\": \"invests_regularly\"\n },\n {\n \"questionId\": \"investment_goal\",\n \"answerId\": \"maximize_returns\"\n },\n {\n \"questionId\": \"investment_horizon\",\n \"answerId\": \"more_than_3_years\"\n },\n {\n \"questionId\": \"drawdown_reaction\",\n \"answerId\": \"buy_more\"\n },\n {\n \"questionId\": \"savings_allocation\",\n \"answerId\": \"most_savings\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"status": "VALID",
"deadline": null,
"investorProfile": {
"profile": "AGGRESSIVE",
"description": "Você tolera alta volatilidade e possíveis perdas em busca de maior rentabilidade.",
"questionnaireVersion": 1,
"createdAt": "2026-10-01T12:34:56.789012Z",
"validUntil": "2027-10-01T12:34:56.789012Z",
"answers": [
{
"questionId": "familiarity_experience",
"questionText": "Como você descreveria sua experiência e seu conhecimento com ativos virtuais?",
"answerId": "invests_regularly",
"answerText": "Invisto regularmente"
},
{
"questionId": "investment_goal",
"questionText": "Quando você investe, qual é o seu principal objetivo?",
"answerId": "maximize_returns",
"answerText": "Maximizar os ganhos, mesmo correndo algum risco"
},
{
"questionId": "investment_horizon",
"questionText": "Por quanto tempo você pretende manter seus ativos virtuais?",
"answerId": "more_than_3_years",
"answerText": "Mais de 3 anos"
},
{
"questionId": "drawdown_reaction",
"questionText": "Se o seu investimento caísse 30% em um mês, o que você faria?",
"answerId": "buy_more",
"answerText": "Aproveitaria para comprar mais barato"
},
{
"questionId": "savings_allocation",
"questionText": "Que parte das suas economias você pretende destinar a investimentos?",
"answerId": "most_savings",
"answerText": "A maior parte (mais de 50%)"
}
]
}
}Submit Investor Profile
Brazilian accounts only. Records the customer’s answers to the active investor questionnaire and returns the resulting profile. It does not depend on the KYC status — the recommended moment is right after KYC — but the customer must have an email set.
Every submission creates a new profile, valid for one year. It can be submitted at any time — including while EXPIRING_SOON, to renew — and the previous ones are kept as history.
curl --request POST \
--url https://skala-sandbox.ripio.com/api/v1/customers/{customerId}/investorProfile/ \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"questionnaireVersion": 1,
"answers": [
{
"questionId": "familiarity_experience",
"answerId": "invests_regularly"
},
{
"questionId": "investment_goal",
"answerId": "maximize_returns"
},
{
"questionId": "investment_horizon",
"answerId": "more_than_3_years"
},
{
"questionId": "drawdown_reaction",
"answerId": "buy_more"
},
{
"questionId": "savings_allocation",
"answerId": "most_savings"
}
]
}
'import requests
url = "https://skala-sandbox.ripio.com/api/v1/customers/{customerId}/investorProfile/"
payload = {
"questionnaireVersion": 1,
"answers": [
{
"questionId": "familiarity_experience",
"answerId": "invests_regularly"
},
{
"questionId": "investment_goal",
"answerId": "maximize_returns"
},
{
"questionId": "investment_horizon",
"answerId": "more_than_3_years"
},
{
"questionId": "drawdown_reaction",
"answerId": "buy_more"
},
{
"questionId": "savings_allocation",
"answerId": "most_savings"
}
]
}
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({
questionnaireVersion: 1,
answers: [
{questionId: 'familiarity_experience', answerId: 'invests_regularly'},
{questionId: 'investment_goal', answerId: 'maximize_returns'},
{questionId: 'investment_horizon', answerId: 'more_than_3_years'},
{questionId: 'drawdown_reaction', answerId: 'buy_more'},
{questionId: 'savings_allocation', answerId: 'most_savings'}
]
})
};
fetch('https://skala-sandbox.ripio.com/api/v1/customers/{customerId}/investorProfile/', 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://skala-sandbox.ripio.com/api/v1/customers/{customerId}/investorProfile/",
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([
'questionnaireVersion' => 1,
'answers' => [
[
'questionId' => 'familiarity_experience',
'answerId' => 'invests_regularly'
],
[
'questionId' => 'investment_goal',
'answerId' => 'maximize_returns'
],
[
'questionId' => 'investment_horizon',
'answerId' => 'more_than_3_years'
],
[
'questionId' => 'drawdown_reaction',
'answerId' => 'buy_more'
],
[
'questionId' => 'savings_allocation',
'answerId' => 'most_savings'
]
]
]),
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://skala-sandbox.ripio.com/api/v1/customers/{customerId}/investorProfile/"
payload := strings.NewReader("{\n \"questionnaireVersion\": 1,\n \"answers\": [\n {\n \"questionId\": \"familiarity_experience\",\n \"answerId\": \"invests_regularly\"\n },\n {\n \"questionId\": \"investment_goal\",\n \"answerId\": \"maximize_returns\"\n },\n {\n \"questionId\": \"investment_horizon\",\n \"answerId\": \"more_than_3_years\"\n },\n {\n \"questionId\": \"drawdown_reaction\",\n \"answerId\": \"buy_more\"\n },\n {\n \"questionId\": \"savings_allocation\",\n \"answerId\": \"most_savings\"\n }\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://skala-sandbox.ripio.com/api/v1/customers/{customerId}/investorProfile/")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"questionnaireVersion\": 1,\n \"answers\": [\n {\n \"questionId\": \"familiarity_experience\",\n \"answerId\": \"invests_regularly\"\n },\n {\n \"questionId\": \"investment_goal\",\n \"answerId\": \"maximize_returns\"\n },\n {\n \"questionId\": \"investment_horizon\",\n \"answerId\": \"more_than_3_years\"\n },\n {\n \"questionId\": \"drawdown_reaction\",\n \"answerId\": \"buy_more\"\n },\n {\n \"questionId\": \"savings_allocation\",\n \"answerId\": \"most_savings\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://skala-sandbox.ripio.com/api/v1/customers/{customerId}/investorProfile/")
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 \"questionnaireVersion\": 1,\n \"answers\": [\n {\n \"questionId\": \"familiarity_experience\",\n \"answerId\": \"invests_regularly\"\n },\n {\n \"questionId\": \"investment_goal\",\n \"answerId\": \"maximize_returns\"\n },\n {\n \"questionId\": \"investment_horizon\",\n \"answerId\": \"more_than_3_years\"\n },\n {\n \"questionId\": \"drawdown_reaction\",\n \"answerId\": \"buy_more\"\n },\n {\n \"questionId\": \"savings_allocation\",\n \"answerId\": \"most_savings\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"status": "VALID",
"deadline": null,
"investorProfile": {
"profile": "AGGRESSIVE",
"description": "Você tolera alta volatilidade e possíveis perdas em busca de maior rentabilidade.",
"questionnaireVersion": 1,
"createdAt": "2026-10-01T12:34:56.789012Z",
"validUntil": "2027-10-01T12:34:56.789012Z",
"answers": [
{
"questionId": "familiarity_experience",
"questionText": "Como você descreveria sua experiência e seu conhecimento com ativos virtuais?",
"answerId": "invests_regularly",
"answerText": "Invisto regularmente"
},
{
"questionId": "investment_goal",
"questionText": "Quando você investe, qual é o seu principal objetivo?",
"answerId": "maximize_returns",
"answerText": "Maximizar os ganhos, mesmo correndo algum risco"
},
{
"questionId": "investment_horizon",
"questionText": "Por quanto tempo você pretende manter seus ativos virtuais?",
"answerId": "more_than_3_years",
"answerText": "Mais de 3 anos"
},
{
"questionId": "drawdown_reaction",
"questionText": "Se o seu investimento caísse 30% em um mês, o que você faria?",
"answerId": "buy_more",
"answerText": "Aproveitaria para comprar mais barato"
},
{
"questionId": "savings_allocation",
"questionText": "Que parte das suas economias você pretende destinar a investimentos?",
"answerId": "most_savings",
"answerText": "A maior parte (mais de 50%)"
}
]
}
}Authorizations
Access token obtained via /oauth2/token/. Use as Authorization: Bearer <access_token>.
Path Parameters
Unique identifier for the customer.
Body
The version of the questionnaire the customer answered. It must still be the active one.
x >= 11
One answer per question, in any order. Every question must be answered exactly once.
1Show child attributes
Show child attributes
Response
Profile recorded. Same body as Get Investor Profile Status; a fresh profile is always VALID.
Where the customer stands. Only REQUIRED and EXPIRED block operations.
NOT_REQUIRED: the investor profile does not apply to your account (not a Brazilian account, or not enabled).REQUIRED_SOON: no valid profile yet, but enforcement has not started. The customer can still operate untildeadline.REQUIRED: no profile, and it is enforced. Orders, sessions and destination accounts are refused with20100.VALID: valid profile with more than 30 days left.EXPIRING_SOON: valid profile that expires within 30 days. The customer can still operate; ask them to renew beforedeadline.EXPIRED: the latest profile expired. Orders, sessions and destination accounts are refused with20100.
NOT_REQUIRED, REQUIRED_SOON, REQUIRED, VALID, EXPIRING_SOON, EXPIRED "VALID"
When the customer stops being able to operate without answering. Only set for REQUIRED_SOON (the start of enforcement) and EXPIRING_SOON (the profile's expiry, or the start of enforcement if that is later); null otherwise.
null
The customer's latest profile, or null if they never answered. For EXPIRED it is the expired profile, returned for reference. The profile belongs to the person, so it may also be present with NOT_REQUIRED if they answered it through another integration.
Show child attributes
Show child attributes
Was this page helpful?