curl --request PUT \
--url https://api.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"ownershipPercentage": 75
}
'import requests
url = "https://api.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}"
payload = { "ownershipPercentage": 75 }
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({ownershipPercentage: 75})
};
fetch('https://api.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}', 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.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'ownershipPercentage' => 75
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}"
payload := strings.NewReader("{\n \"ownershipPercentage\": 75\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.put("https://api.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"ownershipPercentage\": 75\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"ownershipPercentage\": 75\n}"
response = http.request(request)
puts response.read_body{
"status": 200,
"message": "Related person updated successfully",
"success": true,
"data": {
"id": "a3d4f21e-f499-488f-8508-43228dfea485",
"firstName": "Jane",
"lastName": "Doe",
"roles": [
"Beneficial Owner",
"Director"
],
"email": "jane@betalogistics.com",
"phone": "+13025550124",
"dateOfBirth": "1985-09-21",
"ownershipPercentage": 75,
"currentAddress": {
"street": "5 Oak St",
"city": "Wilmington",
"state": "DE",
"postalCode": "19801",
"country": "US"
},
"taxId": "123456789"
}
}{
"status": 400,
"message": "Validation failed",
"code": "ACCOUNT_RESTRICTED",
"errors": [
{
"path": [
"amount"
],
"message": "amount must be a whole number of smallest currency units (e.g. cents)"
}
]
}{
"status": 400,
"message": "Validation failed",
"code": "ACCOUNT_RESTRICTED",
"errors": [
{
"path": [
"amount"
],
"message": "amount must be a whole number of smallest currency units (e.g. cents)"
}
]
}{
"status": 404,
"message": "Related person not found"
}Update Related Person
Updates a related person on a business account’s application. Every field is optional: the fields you send are merged into the stored record and the rest keep their values. currentAddress is all-or-nothing — send it and all five of its fields must be present.
curl --request PUT \
--url https://api.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"ownershipPercentage": 75
}
'import requests
url = "https://api.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}"
payload = { "ownershipPercentage": 75 }
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({ownershipPercentage: 75})
};
fetch('https://api.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}', 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.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'ownershipPercentage' => 75
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}"
payload := strings.NewReader("{\n \"ownershipPercentage\": 75\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.put("https://api.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"ownershipPercentage\": 75\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"ownershipPercentage\": 75\n}"
response = http.request(request)
puts response.read_body{
"status": 200,
"message": "Related person updated successfully",
"success": true,
"data": {
"id": "a3d4f21e-f499-488f-8508-43228dfea485",
"firstName": "Jane",
"lastName": "Doe",
"roles": [
"Beneficial Owner",
"Director"
],
"email": "jane@betalogistics.com",
"phone": "+13025550124",
"dateOfBirth": "1985-09-21",
"ownershipPercentage": 75,
"currentAddress": {
"street": "5 Oak St",
"city": "Wilmington",
"state": "DE",
"postalCode": "19801",
"country": "US"
},
"taxId": "123456789"
}
}{
"status": 400,
"message": "Validation failed",
"code": "ACCOUNT_RESTRICTED",
"errors": [
{
"path": [
"amount"
],
"message": "amount must be a whole number of smallest currency units (e.g. cents)"
}
]
}{
"status": 400,
"message": "Validation failed",
"code": "ACCOUNT_RESTRICTED",
"errors": [
{
"path": [
"amount"
],
"message": "amount must be a whole number of smallest currency units (e.g. cents)"
}
]
}{
"status": 404,
"message": "Related person not found"
}taxId can be patched onto an existing person — useful for representatives added before
the field existed, whose USD issuance is blocked until one is supplied. See
Add Related Person
for the per-country formats.Mandatory and optional fields
Every field is optional in this request — provided fields are merged, omitted fields keep their stored values. The same fields are mandatory before submission as on Add Related Person:firstName, lastName, email, phone, dateOfBirth, sourceOfWealthExplanation, a
government identifier, and all five currentAddress fields.
ownershipPercentage and roles stay optional throughout.
currentAddress is all-or-nothing. Send it and all five fields must be present —
there is no patching a single line of an address.Example Request
curl -X PUT "https://api.rolla.xyz/api/v1/external/accounts/eec3cbed-79d8-4370-87a0-b6be9e287337/related-persons/a3d4f21e-f499-488f-8508-43228dfea485" \
-H "X-API-Key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"ownershipPercentage": 75
}'
Example Response
{
"status": 200,
"message": "Related person updated successfully",
"success": true,
"data": {
"id": "a3d4f21e-f499-488f-8508-43228dfea485",
"firstName": "Jane",
"lastName": "Doe",
"roles": ["Beneficial Owner", "Director"],
"email": "jane@betalogistics.com",
"phone": "+13025550124",
"dateOfBirth": "1985-09-21",
"ownershipPercentage": 75,
"currentAddress": {
"street": "5 Oak St",
"city": "Wilmington",
"state": "DE",
"postalCode": "19801",
"country": "US"
},
"taxId": "123456789"
}
}
data is the whole merged record, not just the fields you sent.
Errors
| Status | When |
|---|---|
400 | Validation failed |
404 | Account not found, or no related person with that personId is on its application (Related person not found) |
Authorizations
Your Rolla API key
Path Parameters
Identifier of a business account owned by the same user as your API key's business
Identifier of a beneficial owner or director on this account
Body
1"Jane"
1"Doe"
The person's capacities on the business. Defaults to ["Beneficial Owner"] when omitted or empty, so the stored record always has at least one role.
Beneficial Owner, Director ["Beneficial Owner", "Director"]
Where this person’s KYC link is sent
"jane@betalogistics.com"
International format
1"+13025550124"
YYYY-MM-DD. The person must be 18 or older
"1985-09-21"
Ownership stake as a percentage, not a fraction: send 60 for 60%. A value between 0 and 1 is rejected.
0 <= x <= 10060
Residential address. All-or-nothing: whenever the object is sent, every one of the five fields must be present.
Show child attributes
Show child attributes
Free-text explanation of where the person’s wealth comes from. Accepted empty here; required before the application can be submitted.
"Salary and dividends from Beta Logistics LLC"
The person's government identifier, in the format their country of residence issues — Mainland China: 18-character resident ID; Hong Kong: HKID; United States: SSN or ITIN; elsewhere: the national ID or tax number as issued. Nigerian residents send nin instead. Required before the application can be submitted, and can be patched onto an existing person. The format is validated by the USD provider when the account is issued.
"123456789"
Bank Verification Number. Nigerian residents only; must be 11 digits when the person's currentAddress.country is NG.
"22345678901"
National Identification Number, accepted in place of taxId for Nigerian residents; must be 11 digits when the person's currentAddress.country is NG.
"12345678901"