Generate KYC Link
curl --request POST \
--url https://api.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}/kyc-link \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}/kyc-link"
headers = {"X-API-Key": "<api-key>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}/kyc-link', 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}/kyc-link",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://api.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}/kyc-link"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
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.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}/kyc-link")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}/kyc-link")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"status": 201,
"message": "KYC link generated successfully",
"success": true,
"data": {
"token": "969e35c36f99f9d511863c89cea0d4082bc3bf66b5484d9a70d79a7c39d6fe74",
"url": "https://app.rolla.xyz/en/kyc/director/969e35c36f99f9d511863c89cea0d4082bc3bf66b5484d9a70d79a7c39d6fe74",
"status": "active",
"expiresAt": "2026-09-20T23:32:12.902Z",
"relatedPersonId": "a3d4f21e-f499-488f-8508-43228dfea485"
}
}{
"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": 400,
"message": "Validation failed",
"code": "ACCOUNT_RESTRICTED",
"errors": [
{
"path": [
"amount"
],
"message": "amount must be a whole number of smallest currency units (e.g. cents)"
}
]
}Verification & KYC
Generate KYC Link
Generates a hosted identity verification link for a related person. Share the link with the person so they can upload their ID and complete a liveness check. Generating a new link invalidates the previous one. Links expire after 72 hours.
POST
/
accounts
/
{accountId}
/
related-persons
/
{personId}
/
kyc-link
Generate KYC Link
curl --request POST \
--url https://api.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}/kyc-link \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}/kyc-link"
headers = {"X-API-Key": "<api-key>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}/kyc-link', 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}/kyc-link",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://api.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}/kyc-link"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
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.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}/kyc-link")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}/kyc-link")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"status": 201,
"message": "KYC link generated successfully",
"success": true,
"data": {
"token": "969e35c36f99f9d511863c89cea0d4082bc3bf66b5484d9a70d79a7c39d6fe74",
"url": "https://app.rolla.xyz/en/kyc/director/969e35c36f99f9d511863c89cea0d4082bc3bf66b5484d9a70d79a7c39d6fe74",
"status": "active",
"expiresAt": "2026-09-20T23:32:12.902Z",
"relatedPersonId": "a3d4f21e-f499-488f-8508-43228dfea485"
}
}{
"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": 400,
"message": "Validation failed",
"code": "ACCOUNT_RESTRICTED",
"errors": [
{
"path": [
"amount"
],
"message": "amount must be a whole number of smallest currency units (e.g. cents)"
}
]
}Generates a hosted identity verification link for a related person. Share the link with the person — it opens a Rolla-hosted page where they upload an ID document and complete a liveness check. Their verification status is reflected in Get Requirements.
Already verify these people in your own onboarding? Submit Representative KYC Reliance lets you upload the passport and liveness capture you collected instead of sending them through this hosted flow. It is enabled per partner, and can be mixed with hosted links across the same account.
Example Request
curl -X POST "https://api.rolla.xyz/api/v1/external/accounts/eec3cbed-79d8-4370-87a0-b6be9e287337/related-persons/a3d4f21e-f499-488f-8508-43228dfea485/kyc-link" \
-H "X-API-Key: your_api_key_here"
Example Response
{
"status": 201,
"message": "KYC link generated successfully",
"success": true,
"data": {
"token": "969e35c36f99f9d511863c89cea0d4082bc3bf66b5484d9a70d79a7c39d6fe74",
"url": "https://app.rolla.xyz/en/kyc/director/969e35c36f99f9d511863c89cea0d4082bc3bf66b5484d9a70d79a7c39d6fe74",
"status": "active",
"expiresAt": "2026-09-20T23:32:12.902Z",
"relatedPersonId": "a3d4f21e-f499-488f-8508-43228dfea485"
}
}
Key Behaviours
Links expire after 72 hours. Generating a new link for the same person invalidates the previous one.
The link
status becomes completed once the person passes verification, or rejected if it fails.After a failure, generate a fresh link and the previous failed attempt is cleared for you, so that person can try again. You do not need to contact Rolla. A link already marked rejected never becomes usable again — always send them the new one. A person who has already passed is left untouched: generating a link never discards a good verification.Authorizations
Your Rolla API key
Path Parameters
Identifier of an account owned by the same user as your API key's business
Related person identifier, as returned by Add Related Person