Get Requirements
curl --request GET \
--url https://api.rolla.xyz/api/v1/external/accounts/{accountId}/requirements \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.rolla.xyz/api/v1/external/accounts/{accountId}/requirements"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.rolla.xyz/api/v1/external/accounts/{accountId}/requirements', 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}/requirements",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
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}/requirements"
req, _ := http.NewRequest("GET", 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.get("https://api.rolla.xyz/api/v1/external/accounts/{accountId}/requirements")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rolla.xyz/api/v1/external/accounts/{accountId}/requirements")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"status": 200,
"message": "Requirements retrieved successfully",
"success": true,
"data": {
"entityType": "business",
"status": "draft",
"readyToSubmit": false,
"missingFields": [
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.taxId",
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.sourceOfWealthExplanation"
],
"missingDocuments": [
"certificate_of_incorporation",
"articles_of_association",
"proof_of_address",
"director_register",
"shareholder_register",
"bank_statement",
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.proof_of_address",
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.source_of_wealth_doc"
],
"submitBlocker": {
"code": "APPLICATION_INCOMPLETE",
"message": "Application is incomplete",
"details": {
"missingFields": [
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.taxId",
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.sourceOfWealthExplanation"
],
"missingDocuments": [
"certificate_of_incorporation",
"articles_of_association",
"proof_of_address",
"director_register",
"shareholder_register",
"bank_statement",
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.proof_of_address",
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.source_of_wealth_doc"
]
}
},
"relatedPersons": [
{
"id": "a3d4f21e-f499-488f-8508-43228dfea485",
"name": "Jane Doe",
"verification": "pending",
"missingFields": [
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.taxId",
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.sourceOfWealthExplanation"
],
"missingDocuments": [
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.proof_of_address",
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.source_of_wealth_doc"
]
}
]
}
}{
"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": "Account not found"
}Applications
Get Requirements
Returns a checklist of everything still required before the account’s application can be submitted: missing fields, missing documents and outstanding identity verifications.
GET
/
accounts
/
{accountId}
/
requirements
Get Requirements
curl --request GET \
--url https://api.rolla.xyz/api/v1/external/accounts/{accountId}/requirements \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.rolla.xyz/api/v1/external/accounts/{accountId}/requirements"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.rolla.xyz/api/v1/external/accounts/{accountId}/requirements', 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}/requirements",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
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}/requirements"
req, _ := http.NewRequest("GET", 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.get("https://api.rolla.xyz/api/v1/external/accounts/{accountId}/requirements")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rolla.xyz/api/v1/external/accounts/{accountId}/requirements")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"status": 200,
"message": "Requirements retrieved successfully",
"success": true,
"data": {
"entityType": "business",
"status": "draft",
"readyToSubmit": false,
"missingFields": [
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.taxId",
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.sourceOfWealthExplanation"
],
"missingDocuments": [
"certificate_of_incorporation",
"articles_of_association",
"proof_of_address",
"director_register",
"shareholder_register",
"bank_statement",
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.proof_of_address",
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.source_of_wealth_doc"
],
"submitBlocker": {
"code": "APPLICATION_INCOMPLETE",
"message": "Application is incomplete",
"details": {
"missingFields": [
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.taxId",
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.sourceOfWealthExplanation"
],
"missingDocuments": [
"certificate_of_incorporation",
"articles_of_association",
"proof_of_address",
"director_register",
"shareholder_register",
"bank_statement",
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.proof_of_address",
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.source_of_wealth_doc"
]
}
},
"relatedPersons": [
{
"id": "a3d4f21e-f499-488f-8508-43228dfea485",
"name": "Jane Doe",
"verification": "pending",
"missingFields": [
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.taxId",
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.sourceOfWealthExplanation"
],
"missingDocuments": [
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.proof_of_address",
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.source_of_wealth_doc"
]
}
]
}
}{
"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": "Account not found"
}Returns a live checklist of everything still required before the account’s application can be submitted: missing fields, missing documents and outstanding identity verifications. Use it to drive your own onboarding UI or to verify readiness before calling submit.
Missing data is reported first. Once the application is complete and identity verification is the only hold, the code becomes
For a business,
Example Request
curl -X GET "https://api.rolla.xyz/api/v1/external/accounts/eec3cbed-79d8-4370-87a0-b6be9e287337/requirements" \
-H "X-API-Key: your_api_key_here"
Example Response
Business account
{
"status": 200,
"message": "Requirements retrieved successfully",
"success": true,
"data": {
"entityType": "business",
"status": "draft",
"readyToSubmit": false,
"missingFields": [
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.taxId",
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.sourceOfWealthExplanation"
],
"missingDocuments": [
"certificate_of_incorporation",
"articles_of_association",
"proof_of_address",
"director_register",
"shareholder_register",
"bank_statement",
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.proof_of_address",
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.source_of_wealth_doc"
],
"submitBlocker": {
"code": "APPLICATION_INCOMPLETE",
"message": "Application is incomplete",
"details": {
"missingFields": [
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.taxId",
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.sourceOfWealthExplanation"
],
"missingDocuments": [
"certificate_of_incorporation",
"articles_of_association",
"proof_of_address",
"director_register",
"shareholder_register",
"bank_statement",
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.proof_of_address",
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.source_of_wealth_doc"
]
}
},
"relatedPersons": [
{
"id": "a3d4f21e-f499-488f-8508-43228dfea485",
"name": "Jane Doe",
"verification": "pending",
"missingFields": [
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.taxId",
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.sourceOfWealthExplanation"
],
"missingDocuments": [
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.proof_of_address",
"related_persons.a3d4f21e-f499-488f-8508-43228dfea485.source_of_wealth_doc"
]
}
]
}
}
Individual account
{
"status": 200,
"message": "Requirements retrieved successfully",
"success": true,
"data": {
"entityType": "individual",
"status": "draft",
"readyToSubmit": true,
"missingFields": [],
"missingDocuments": [],
"submitBlocker": null,
"identityVerification": "verified"
}
}
Why an account is not ready
WhenreadyToSubmit is false, submitBlocker names the reason — the same one Submit would return if you called it now. Check it instead of re-deriving the reason from the other fields.
{
"submitBlocker": {
"code": "APPLICATION_INCOMPLETE",
"message": "Application is incomplete",
"details": {
"missingFields": ["individualInfo.nin"],
"missingDocuments": ["proof_of_address"]
}
}
}
KYC_INCOMPLETE:
{
"submitBlocker": {
"code": "KYC_INCOMPLETE",
"message": "Identity verification is not complete",
"details": { "identityVerification": "pending" }
}
}
details.unverified lists who is outstanding:
{
"submitBlocker": {
"code": "KYC_INCOMPLETE",
"message": "Not every beneficial owner has completed KYC",
"details": {
"unverified": [
{ "personId": "a3d4f21e-f499-488f-8508-43228dfea485", "name": "Jane Doe" }
]
}
}
}
An account can have
identityVerification: "verified" and still not be submittable — a passed identity check does not mean the application data is complete. submitBlocker is what tells the two apart.Response Fields
| Field | Type | Description |
|---|---|---|
entityType | string | business or individual — decides which of the two shapes below you get |
status | string | Current application status (draft, submitted, approved, rejected, changes_requested) |
readyToSubmit | boolean | true only when everything is cleared: no missing fields, no missing documents, and identity verification complete — identityVerification for an individual, every entry in relatedPersons for a business |
missingFields | string[] | Required application fields not yet provided, e.g. business_info.legalName. Entries prefixed related_persons.<id>. belong to that person |
missingDocuments | string[] | Required document types not yet uploaded, including each related person’s own documents |
relatedPersons | object[] | Business only: each related person with their KYC verification state (verified, pending, unknown) and their own missingFields / missingDocuments |
identityVerification | string | Individual only: identity verification state (verified, pending, unknown) |
submitBlocker | object | null | null when the account is ready. Otherwise code (APPLICATION_INCOMPLETE or KYC_INCOMPLETE), a human-readable message, and details carrying the specifics |
A business must declare at least one beneficial owner or director. Until one is added,
missingFields contains related_persons.Authorizations
Your Rolla API key
Path Parameters
Identifier of an account owned by the same user as your API key's business
Response
Requirements retrieved successfully
Example:
200
Example:
"Requirements retrieved successfully"
Example:
true
Everything still required before the application can be submitted. relatedPersons is returned for a business account and identityVerification for an individual one.
Show child attributes
Show child attributes