curl --request POST \
--url https://api.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}/kyc-reliance \
--header 'Content-Type: multipart/form-data' \
--header 'X-API-Key: <api-key>' \
--form documentType=ID_CARD \
--form document=@example-file \
--form documentBack=@example-file \
--form selfie=@example-file \
--form country=NG \
--form documentNumber=A01234567 \
--form issueDate=2020-03-14 \
--form expirationDate=2030-03-13 \
--form passport=@example-fileimport requests
url = "https://api.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}/kyc-reliance"
files = {
"document": ("example-file", open("example-file", "rb")),
"documentBack": ("example-file", open("example-file", "rb")),
"selfie": ("example-file", open("example-file", "rb")),
"passport": ("example-file", open("example-file", "rb"))
}
payload = {
"documentType": "ID_CARD",
"country": "NG",
"documentNumber": "A01234567",
"issueDate": "2020-03-14",
"expirationDate": "2030-03-13"
}
headers = {"X-API-Key": "<api-key>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('documentType', 'ID_CARD');
form.append('document', 'id-front.jpg');
form.append('documentBack', 'id-back.jpg');
form.append('selfie', 'selfie.jpg');
form.append('country', 'NG');
form.append('documentNumber', 'A01234567');
form.append('issueDate', '2020-03-14');
form.append('expirationDate', '2030-03-13');
form.append('passport', '{
"fileName": "example-file"
}');
const options = {method: 'POST', headers: {'X-API-Key': '<api-key>'}};
options.body = form;
fetch('https://api.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}/kyc-reliance', 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-reliance",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentType\"\r\n\r\nID_CARD\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"document\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\nid-front.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentBack\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\nid-back.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"selfie\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\nselfie.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"country\"\r\n\r\nNG\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentNumber\"\r\n\r\nA01234567\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"issueDate\"\r\n\r\n2020-03-14\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"expirationDate\"\r\n\r\n2030-03-13\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"passport\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data",
"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}/kyc-reliance"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentType\"\r\n\r\nID_CARD\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"document\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\nid-front.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentBack\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\nid-back.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"selfie\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\nselfie.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"country\"\r\n\r\nNG\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentNumber\"\r\n\r\nA01234567\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"issueDate\"\r\n\r\n2020-03-14\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"expirationDate\"\r\n\r\n2030-03-13\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"passport\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
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-reliance")
.header("X-API-Key", "<api-key>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentType\"\r\n\r\nID_CARD\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"document\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\nid-front.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentBack\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\nid-back.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"selfie\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\nselfie.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"country\"\r\n\r\nNG\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentNumber\"\r\n\r\nA01234567\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"issueDate\"\r\n\r\n2020-03-14\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"expirationDate\"\r\n\r\n2030-03-13\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"passport\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}/kyc-reliance")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentType\"\r\n\r\nID_CARD\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"document\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\nid-front.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentBack\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\nid-back.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"selfie\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\nselfie.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"country\"\r\n\r\nNG\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentNumber\"\r\n\r\nA01234567\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"issueDate\"\r\n\r\n2020-03-14\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"expirationDate\"\r\n\r\n2030-03-13\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"passport\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"status": 201,
"message": "KYC reliance submitted successfully",
"success": true,
"data": {
"relatedPersonId": "1c0742e5-5a58-4705-a473-ddd1ae213787",
"firstName": "Chidi",
"lastName": "Okafor",
"verification": "pending",
"readyToSubmit": false
}
}{
"status": 400,
"message": "Identity provider rejected the upload: document is unreadable (code 1002)"
}{
"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)"
}
]
}{
"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)"
}
]
}Submit Representative KYC Reliance
Submit an already-verified identity document and liveness capture for one representative (beneficial owner or director) of a business account, instead of sending them through Rolla’s hosted liveness check. One call per representative. Enabled per partner. A passport, national ID card, driver’s licence or residence permit is accepted — name it with documentType, and send documentBack as well for a two-sided document. The legacy passport file field still works in place of document. A rejected submission can be sent again for the same subject; one that already passed returns 409.
curl --request POST \
--url https://api.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}/kyc-reliance \
--header 'Content-Type: multipart/form-data' \
--header 'X-API-Key: <api-key>' \
--form documentType=ID_CARD \
--form document=@example-file \
--form documentBack=@example-file \
--form selfie=@example-file \
--form country=NG \
--form documentNumber=A01234567 \
--form issueDate=2020-03-14 \
--form expirationDate=2030-03-13 \
--form passport=@example-fileimport requests
url = "https://api.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}/kyc-reliance"
files = {
"document": ("example-file", open("example-file", "rb")),
"documentBack": ("example-file", open("example-file", "rb")),
"selfie": ("example-file", open("example-file", "rb")),
"passport": ("example-file", open("example-file", "rb"))
}
payload = {
"documentType": "ID_CARD",
"country": "NG",
"documentNumber": "A01234567",
"issueDate": "2020-03-14",
"expirationDate": "2030-03-13"
}
headers = {"X-API-Key": "<api-key>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('documentType', 'ID_CARD');
form.append('document', 'id-front.jpg');
form.append('documentBack', 'id-back.jpg');
form.append('selfie', 'selfie.jpg');
form.append('country', 'NG');
form.append('documentNumber', 'A01234567');
form.append('issueDate', '2020-03-14');
form.append('expirationDate', '2030-03-13');
form.append('passport', '{
"fileName": "example-file"
}');
const options = {method: 'POST', headers: {'X-API-Key': '<api-key>'}};
options.body = form;
fetch('https://api.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}/kyc-reliance', 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-reliance",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentType\"\r\n\r\nID_CARD\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"document\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\nid-front.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentBack\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\nid-back.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"selfie\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\nselfie.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"country\"\r\n\r\nNG\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentNumber\"\r\n\r\nA01234567\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"issueDate\"\r\n\r\n2020-03-14\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"expirationDate\"\r\n\r\n2030-03-13\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"passport\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data",
"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}/kyc-reliance"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentType\"\r\n\r\nID_CARD\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"document\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\nid-front.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentBack\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\nid-back.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"selfie\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\nselfie.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"country\"\r\n\r\nNG\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentNumber\"\r\n\r\nA01234567\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"issueDate\"\r\n\r\n2020-03-14\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"expirationDate\"\r\n\r\n2030-03-13\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"passport\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
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-reliance")
.header("X-API-Key", "<api-key>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentType\"\r\n\r\nID_CARD\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"document\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\nid-front.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentBack\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\nid-back.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"selfie\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\nselfie.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"country\"\r\n\r\nNG\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentNumber\"\r\n\r\nA01234567\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"issueDate\"\r\n\r\n2020-03-14\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"expirationDate\"\r\n\r\n2030-03-13\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"passport\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rolla.xyz/api/v1/external/accounts/{accountId}/related-persons/{personId}/kyc-reliance")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentType\"\r\n\r\nID_CARD\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"document\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\nid-front.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentBack\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\nid-back.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"selfie\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\nselfie.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"country\"\r\n\r\nNG\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentNumber\"\r\n\r\nA01234567\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"issueDate\"\r\n\r\n2020-03-14\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"expirationDate\"\r\n\r\n2030-03-13\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"passport\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"status": 201,
"message": "KYC reliance submitted successfully",
"success": true,
"data": {
"relatedPersonId": "1c0742e5-5a58-4705-a473-ddd1ae213787",
"firstName": "Chidi",
"lastName": "Okafor",
"verification": "pending",
"readyToSubmit": false
}
}{
"status": 400,
"message": "Identity provider rejected the upload: document is unreadable (code 1002)"
}{
"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)"
}
]
}{
"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)"
}
]
}documentType. Two-sided documents need both sides.
This is the per-representative parallel of Submit KYC Reliance, which covers individual accounts. Use it when the people behind a business have already completed identity verification on your side and re-verifying them would be redundant.
403. Contact your Rolla representative to have it turned on — enabling it means agreeing on the verification standard your own KYC meets.personId. Verifying one does not verify the others, and Submit Application still requires every one of them to pass.Request
Send asmultipart/form-data.
| Part | Type | Required | Description |
|---|---|---|---|
document | file | Yes | That representative’s identity document, image or PDF. Front side for a two-sided document |
documentBack | file | Conditional | The reverse side. Required for ID_CARD, DRIVER_LICENSE and RESIDENCE_PERMIT |
selfie | file | Yes | The selfie or liveness capture from your own verification. Image or video |
documentType | string | No | One of PASSPORT, INTERNATIONAL_PASSPORT, ID_CARD, DRIVER_LICENSE, RESIDENCE_PERMIT. Defaults to PASSPORT |
country | string | Yes | 2-letter ISO code of the country that issued the document, e.g. NG |
documentNumber | string | No | The document’s number |
issueDate | string | No | YYYY-MM-DD |
expirationDate | string | No | YYYY-MM-DD |
passport still works in place of document, so an integration built against the
earlier passport-only contract keeps running unchanged.personId is the id returned by Add Related Person — the same id used for the related-person KYC link and for that person’s document uploads.
Example Request
curl -X POST "https://api.rolla.xyz/api/v1/external/accounts/a55eb4aa-8356-4d6d-8c92-5f7a0e913d19/related-persons/1c0742e5-5a58-4705-a473-ddd1ae213787/kyc-reliance" \
-H "X-API-Key: your_api_key_here" \
-F "documentType=ID_CARD" \
-F "document=@/path/to/id-front.jpg" \
-F "documentBack=@/path/to/id-back.jpg" \
-F "selfie=@/path/to/selfie.jpg" \
-F "country=NG" \
-F "documentNumber=A01234567" \
-F "issueDate=2020-03-14" \
-F "expirationDate=2030-03-13"
Example Response
{
"status": 201,
"message": "KYC reliance submitted successfully",
"success": true,
"data": {
"relatedPersonId": "1c0742e5-5a58-4705-a473-ddd1ae213787",
"firstName": "Chidi",
"lastName": "Okafor",
"verification": "pending",
"readyToSubmit": false
}
}
verification is that representative’s own status — the same value Get Requirements reports for them under relatedPersons. readyToSubmit reflects the whole application — fields, documents and every representative’s KYC — so it stays false while any of them is outstanding.
Key Behaviours
verification commonly comes back as pending on the call that submits it. Poll Get Requirements until that person reads verified.409 KYC_INCOMPLETE until every representative’s review completes successfully — reliance replaces the hosted liveness step, not the requirement itself.409.Errors
| Status | Meaning |
|---|---|
400 | A file is missing, a two-sided document arrived without documentBack, documentType is not a recognised value, country is absent or not a 2-letter code, the account is an individual, or the identity provider rejected the upload |
403 | KYC reliance is not enabled for your business |
404 | Account not found, not owned by your API key’s business, or no representative with that personId |
409 | That representative is already verified, so reliance cannot be resubmitted for them |
{
"status": 400,
"message": "Identity provider rejected the upload: document is unreadable (code 1002)"
}
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 the related person, as returned by Add Related Person
Body
That representative's identity document, image or PDF. Front side for a two-sided document
Selfie or liveness capture from your own verification. Image or video
2-letter ISO code of the country that issued the document
2"NG"
Reverse side. Required for ID_CARD, DRIVER_LICENSE and RESIDENCE_PERMIT
Which identity document is being sent. Defaults to PASSPORT
PASSPORT, INTERNATIONAL_PASSPORT, ID_CARD, DRIVER_LICENSE, RESIDENCE_PERMIT "ID_CARD"
The document's number
1 - 64"A01234567"
YYYY-MM-DD
"2020-03-14"
YYYY-MM-DD
"2030-03-13"
Deprecated alias for document, kept so existing integrations keep working