Create Account
curl --request POST \
--url https://kyc.sbx.moduluslabs.io/v2/onboard/signup \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"contact": {
"email": "john.doe@example.com",
"phone": "9876543212"
},
"user": {
"firstName": "John",
"middleName": "Michael",
"lastName": "Doe",
"username": "johndoe123",
"password": "SecureP@ssw0rd!",
"pin": "1234"
}
}
'import requests
url = "https://kyc.sbx.moduluslabs.io/v2/onboard/signup"
payload = {
"contact": {
"email": "john.doe@example.com",
"phone": "9876543212"
},
"user": {
"firstName": "John",
"middleName": "Michael",
"lastName": "Doe",
"username": "johndoe123",
"password": "SecureP@ssw0rd!",
"pin": "1234"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
contact: {email: 'john.doe@example.com', phone: '9876543212'},
user: {
firstName: 'John',
middleName: 'Michael',
lastName: 'Doe',
username: 'johndoe123',
password: 'SecureP@ssw0rd!',
pin: '1234'
}
})
};
fetch('https://kyc.sbx.moduluslabs.io/v2/onboard/signup', 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://kyc.sbx.moduluslabs.io/v2/onboard/signup",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'contact' => [
'email' => 'john.doe@example.com',
'phone' => '9876543212'
],
'user' => [
'firstName' => 'John',
'middleName' => 'Michael',
'lastName' => 'Doe',
'username' => 'johndoe123',
'password' => 'SecureP@ssw0rd!',
'pin' => '1234'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://kyc.sbx.moduluslabs.io/v2/onboard/signup"
payload := strings.NewReader("{\n \"contact\": {\n \"email\": \"john.doe@example.com\",\n \"phone\": \"9876543212\"\n },\n \"user\": {\n \"firstName\": \"John\",\n \"middleName\": \"Michael\",\n \"lastName\": \"Doe\",\n \"username\": \"johndoe123\",\n \"password\": \"SecureP@ssw0rd!\",\n \"pin\": \"1234\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.post("https://kyc.sbx.moduluslabs.io/v2/onboard/signup")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"contact\": {\n \"email\": \"john.doe@example.com\",\n \"phone\": \"9876543212\"\n },\n \"user\": {\n \"firstName\": \"John\",\n \"middleName\": \"Michael\",\n \"lastName\": \"Doe\",\n \"username\": \"johndoe123\",\n \"password\": \"SecureP@ssw0rd!\",\n \"pin\": \"1234\"\n }\n}")
.asString();using RestSharp;
var options = new RestClientOptions("https://kyc.sbx.moduluslabs.io/v2/onboard/signup");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
request.AddJsonBody("{\n \"contact\": {\n \"email\": \"john.doe@example.com\",\n \"phone\": \"9876543212\"\n },\n \"user\": {\n \"firstName\": \"John\",\n \"middleName\": \"Michael\",\n \"lastName\": \"Doe\",\n \"username\": \"johndoe123\",\n \"password\": \"SecureP@ssw0rd!\",\n \"pin\": \"1234\"\n }\n}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
{
"id": 12345
}{
"statusCode": 123,
"message": "<string>",
"error": "<string>",
"details": {}
}{
"statusCode": 123,
"message": "<string>",
"error": "<string>",
"details": {}
}Onboarding API
Create Account
Create a new user account with contact information and credentials
POST
/
v2
/
onboard
/
signup
Create Account
curl --request POST \
--url https://kyc.sbx.moduluslabs.io/v2/onboard/signup \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"contact": {
"email": "john.doe@example.com",
"phone": "9876543212"
},
"user": {
"firstName": "John",
"middleName": "Michael",
"lastName": "Doe",
"username": "johndoe123",
"password": "SecureP@ssw0rd!",
"pin": "1234"
}
}
'import requests
url = "https://kyc.sbx.moduluslabs.io/v2/onboard/signup"
payload = {
"contact": {
"email": "john.doe@example.com",
"phone": "9876543212"
},
"user": {
"firstName": "John",
"middleName": "Michael",
"lastName": "Doe",
"username": "johndoe123",
"password": "SecureP@ssw0rd!",
"pin": "1234"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
contact: {email: 'john.doe@example.com', phone: '9876543212'},
user: {
firstName: 'John',
middleName: 'Michael',
lastName: 'Doe',
username: 'johndoe123',
password: 'SecureP@ssw0rd!',
pin: '1234'
}
})
};
fetch('https://kyc.sbx.moduluslabs.io/v2/onboard/signup', 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://kyc.sbx.moduluslabs.io/v2/onboard/signup",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'contact' => [
'email' => 'john.doe@example.com',
'phone' => '9876543212'
],
'user' => [
'firstName' => 'John',
'middleName' => 'Michael',
'lastName' => 'Doe',
'username' => 'johndoe123',
'password' => 'SecureP@ssw0rd!',
'pin' => '1234'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://kyc.sbx.moduluslabs.io/v2/onboard/signup"
payload := strings.NewReader("{\n \"contact\": {\n \"email\": \"john.doe@example.com\",\n \"phone\": \"9876543212\"\n },\n \"user\": {\n \"firstName\": \"John\",\n \"middleName\": \"Michael\",\n \"lastName\": \"Doe\",\n \"username\": \"johndoe123\",\n \"password\": \"SecureP@ssw0rd!\",\n \"pin\": \"1234\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.post("https://kyc.sbx.moduluslabs.io/v2/onboard/signup")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"contact\": {\n \"email\": \"john.doe@example.com\",\n \"phone\": \"9876543212\"\n },\n \"user\": {\n \"firstName\": \"John\",\n \"middleName\": \"Michael\",\n \"lastName\": \"Doe\",\n \"username\": \"johndoe123\",\n \"password\": \"SecureP@ssw0rd!\",\n \"pin\": \"1234\"\n }\n}")
.asString();using RestSharp;
var options = new RestClientOptions("https://kyc.sbx.moduluslabs.io/v2/onboard/signup");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
request.AddJsonBody("{\n \"contact\": {\n \"email\": \"john.doe@example.com\",\n \"phone\": \"9876543212\"\n },\n \"user\": {\n \"firstName\": \"John\",\n \"middleName\": \"Michael\",\n \"lastName\": \"Doe\",\n \"username\": \"johndoe123\",\n \"password\": \"SecureP@ssw0rd!\",\n \"pin\": \"1234\"\n }\n}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
{
"id": 12345
}{
"statusCode": 123,
"message": "<string>",
"error": "<string>",
"details": {}
}{
"statusCode": 123,
"message": "<string>",
"error": "<string>",
"details": {}
}Overview
Creates a new user account with associated contact information and credentials. This is the first step in the merchant onboarding process.Account approval required: New accounts require review and approval before they become active. Once approved, a merchant branch is created for the account.
Password security: Passwords expire after 90 days from creation. Credentials are stored securely.
Authentication
This endpoint requires JWT Bearer Token authentication.Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Account Lifecycle
1
Create Account
Call this endpoint to create a new user account
2
Pending Approval
Account is created and awaits review and approval
3
Admin Review
Modulus Labs admin reviews and approves the account
4
Account Activation
Upon approval, a new merchant branch is created and assigned to the account
5
Begin Onboarding
Use the account ID to generate JWT token and proceed with merchant onboarding
Security Notes
Password Security
Password Security
- Passwords are stored securely
- Passwords expire after 90 days and must be changed
- Never send passwords over unencrypted connections
- Implement strong password requirements on the client side
Troubleshooting
Username Already Taken
Username Already Taken
Error:
Username is not availableSolution:- Try a different username
- Add numbers or special characters (dots, underscores, hyphens)
- Consider using email prefix or unique identifiers
Password Validation Failed
Password Validation Failed
Error:
user.password must have at least 1 uppercase and lowercase character, a number, and special characterSolution:- Ensure password is 8-22 characters long
- Include at least one uppercase letter (A-Z)
- Include at least one lowercase letter (a-z)
- Include at least one number (0-9)
- Include at least one special character from: #?!@$%^&*-
SecurePass123!Next Steps
Generate JWT Token
Create a JWT Bearer Token for authentication
Onboard Merchant
Complete merchant onboarding with the account ID
Upload Documents
Upload required KYC documents
Error Handling
Learn about error codes and handling
Authorizations
JWT Bearer token authentication
Body
application/json
Response
Account created successfully
The new account id. Use it as the JWT sub for subsequent merchant-scoped calls and as merchantId for file upload.
Was this page helpful?