Approve Account (Sandbox)
curl --request POST \
--url https://api-staging.rolla.xyz/api/v1/external/accounts/{accountId}/approve \
--header 'X-API-Key: <api-key>'import requests
url = "https://api-staging.rolla.xyz/api/v1/external/accounts/{accountId}/approve"
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-staging.rolla.xyz/api/v1/external/accounts/{accountId}/approve', 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-staging.rolla.xyz/api/v1/external/accounts/{accountId}/approve",
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-staging.rolla.xyz/api/v1/external/accounts/{accountId}/approve"
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-staging.rolla.xyz/api/v1/external/accounts/{accountId}/approve")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-staging.rolla.xyz/api/v1/external/accounts/{accountId}/approve")
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": 200,
"message": "Account approved",
"success": true,
"data": {
"accountId": "eec3cbed-79d8-4370-87a0-b6be9e287337",
"applicationStatus": "approved"
}
}{
"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": 409,
"message": "Account must be submitted before it can be approved (current status: draft). Complete onboarding and submit the application first.",
"code": "ACCOUNT_NOT_SUBMITTED"
}Sandbox
Approve Account (Sandbox)
Sandbox only: self-approve a submitted account so you can test the full flow (onboard, submit, approve, issue accounts, fund, payout) without waiting for Rolla’s manual review. Runs the same approval path as the Rolla admin dashboard, so wallets are provisioned and the account.approved webhook fires. The account must already be submitted (only possible once every onboarding requirement is complete). The route is not registered in production, where it returns 404.
POST
/
accounts
/
{accountId}
/
approve
Approve Account (Sandbox)
curl --request POST \
--url https://api-staging.rolla.xyz/api/v1/external/accounts/{accountId}/approve \
--header 'X-API-Key: <api-key>'import requests
url = "https://api-staging.rolla.xyz/api/v1/external/accounts/{accountId}/approve"
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-staging.rolla.xyz/api/v1/external/accounts/{accountId}/approve', 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-staging.rolla.xyz/api/v1/external/accounts/{accountId}/approve",
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-staging.rolla.xyz/api/v1/external/accounts/{accountId}/approve"
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-staging.rolla.xyz/api/v1/external/accounts/{accountId}/approve")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-staging.rolla.xyz/api/v1/external/accounts/{accountId}/approve")
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": 200,
"message": "Account approved",
"success": true,
"data": {
"accountId": "eec3cbed-79d8-4370-87a0-b6be9e287337",
"applicationStatus": "approved"
}
}{
"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": 409,
"message": "Account must be submitted before it can be approved (current status: draft). Complete onboarding and submit the application first.",
"code": "ACCOUNT_NOT_SUBMITTED"
}Self-approves a submitted account so you can test the entire onboarding-to-payout journey end to end without waiting for Rolla’s manual compliance review.
It runs the same approval path as the Rolla admin dashboard, so wallets are provisioned and the
The submission gate is re-run at approval time. If the account would no longer pass it, the call returns
Sandbox / testing only. This endpoint does not exist in production — calls to the production API return
404 Not Found. In production, accounts are approved by Rolla’s compliance team.account.approved webhook fires — exactly as a real approval would.
Prerequisites
The account must already besubmitted — which is only possible once every onboarding requirement is complete (see Submit Application). If it isn’t, the call returns 409 with code ACCOUNT_NOT_SUBMITTED:
{
"status": 409,
"message": "Account must be submitted before it can be approved (current status: draft). Complete onboarding and submit the application first.",
"code": "ACCOUNT_NOT_SUBMITTED"
}
400 whose message names the blocking requirement, the same message Submit Application reports.
Example Request
curl -X POST "https://api-staging.rolla.xyz/api/v1/external/accounts/eec3cbed-79d8-4370-87a0-b6be9e287337/approve" \
-H "X-API-Key: your_api_key_here"
Example Response
{
"status": 200,
"message": "Account approved",
"success": true,
"data": {
"accountId": "eec3cbed-79d8-4370-87a0-b6be9e287337",
"applicationStatus": "approved"
}
}
What happens
- The account’s application status moves from
submittedtoapproved. - Wallets are provisioned and the
account.approvedoutbound webhook is delivered to your endpoint. - You can now issue bank accounts (NGN/USD), fund them, and initiate payouts for the account.
Calling this on an already-approved account is a no-op and returns
applicationStatus: "approved" with alreadyApproved: true.Full sandbox test loop: create account → complete details + KYC → submit → approve (this endpoint) → issue USD/NGN account → simulate a deposit → initiate a payout.
Authorizations
Your Rolla API key
Path Parameters
Identifier of a submitted account owned by the same user as your API key's business
Example:
"eec3cbed-79d8-4370-87a0-b6be9e287337"