BEARER_TOKEN="your_jwt_token_here"
REF_NO="550e8400-e29b-41d4-a716-446655440000"
curl -X PUT "https://kyc.sbx.moduluslabs.io/v2/onboard/${REF_NO}" \
-H "Authorization: Bearer ${BEARER_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"merchantName": "Acme Store",
"businessHandle": "acme-store",
"modeOfPayments": ["CREDIT_CARD", "DEBIT_CARD", "GCASH"],
"currency": "PHP",
"tin": "123456789012",
"industry": "Retail",
"serviceDescription": "Online retail store selling electronics and gadgets",
"isBrickAndMortarStore": true,
"address": {
"office": {
"city": "Manila",
"line1": "123 Main Street",
"buildingNameAndNumber": "Building A",
"state": "Metro Manila",
"postalCode": "1000",
"contactNumber": "639171234567",
"barangay": "Barangay 1"
}
},
"representatives": {
"authorized": {
"firstName": "Juan",
"lastName": "Dela Cruz",
"emailAddress": "juan@acme.com",
"contactNumber": "639171234567",
"dateOfBirth": "1985-05-15",
"position": "CEO"
}
},
"banks": [
{
"accountDepositType": "BANK",
"accountType": "SAVINGS",
"bankName": "BDO",
"accountName": "Acme Corporation",
"accountNumber": "1234567890",
"currency": "PHP",
"preferredSettlementRail": "instapay"
}
]
}'
const axios = require('axios');
const BEARER_TOKEN = process.env.BEARER_TOKEN;
const REF_NO = '550e8400-e29b-41d4-a716-446655440000';
const updateData = {
merchantName: 'Acme Store',
businessHandle: 'acme-store',
modeOfPayments: ['CREDIT_CARD', 'DEBIT_CARD', 'GCASH'],
currency: 'PHP',
tin: '123456789012',
industry: 'Retail',
serviceDescription: 'Online retail store selling electronics and gadgets',
isBrickAndMortarStore: true,
address: {
office: {
city: 'Manila',
line1: '123 Main Street',
buildingNameAndNumber: 'Building A',
state: 'Metro Manila',
postalCode: '1000',
contactNumber: '639171234567',
barangay: 'Barangay 1'
}
},
representatives: {
authorized: {
firstName: 'Juan',
lastName: 'Dela Cruz',
emailAddress: 'juan@acme.com',
contactNumber: '639171234567',
dateOfBirth: '1985-05-15',
position: 'CEO'
}
},
banks: [
{
accountDepositType: 'BANK',
accountType: 'SAVINGS',
bankName: 'BDO',
accountName: 'Acme Corporation',
accountNumber: '1234567890',
currency: 'PHP',
preferredSettlementRail: 'instapay'
}
]
};
async function updateOnboardingData() {
try {
const response = await axios.put(
`https://kyc.sbx.moduluslabs.io/v2/onboard/${REF_NO}`,
updateData,
{
headers: {
'Authorization': `Bearer ${BEARER_TOKEN}`,
'Content-Type': 'application/json'
}
}
);
console.log(' Update successful!');
console.log('New Status:', response.data.onboardingStatus);
console.log('Reference Number:', response.data.onboardingReferenceNumber);
} catch (error) {
if (error.response) {
console.error(' Update failed:', error.response.data.message);
console.error('Status Code:', error.response.status);
} else {
console.error(' Error:', error.message);
}
}
}
updateOnboardingData();
import os
import requests
BEARER_TOKEN = os.getenv('BEARER_TOKEN')
REF_NO = '550e8400-e29b-41d4-a716-446655440000'
update_data = {
'merchantName': 'Acme Store',
'businessHandle': 'acme-store',
'modeOfPayments': ['CREDIT_CARD', 'DEBIT_CARD', 'GCASH'],
'currency': 'PHP',
'tin': '123456789012',
'industry': 'Retail',
'serviceDescription': 'Online retail store selling electronics and gadgets',
'isBrickAndMortarStore': True,
'address': {
'office': {
'city': 'Manila',
'line1': '123 Main Street',
'buildingNameAndNumber': 'Building A',
'state': 'Metro Manila',
'postalCode': '1000',
'contactNumber': '639171234567',
'barangay': 'Barangay 1'
}
},
'representatives': {
'authorized': {
'firstName': 'Juan',
'lastName': 'Dela Cruz',
'emailAddress': 'juan@acme.com',
'contactNumber': '639171234567',
'dateOfBirth': '1985-05-15',
'position': 'CEO'
}
},
'banks': [
{
'accountDepositType': 'BANK',
'accountType': 'SAVINGS',
'bankName': 'BDO',
'accountName': 'Acme Corporation',
'accountNumber': '1234567890',
'currency': 'PHP',
'preferredSettlementRail': 'instapay'
}
]
}
def update_onboarding_data():
try:
response = requests.put(
f'https://kyc.sbx.moduluslabs.io/v2/onboard/{REF_NO}',
json=update_data,
headers={
'Authorization': f'Bearer {BEARER_TOKEN}',
'Content-Type': 'application/json'
}
)
response.raise_for_status()
data = response.json()
print(' Update successful!')
print(f"New Status: {data['onboardingStatus']}")
print(f"Reference Number: {data['onboardingReferenceNumber']}")
except requests.exceptions.HTTPError as error:
print(f" Update failed: {error.response.json().get('message', 'Unknown error')}")
print(f"Status Code: {error.response.status_code}")
except Exception as error:
print(f" Error: {str(error)}")
if __name__ == '__main__':
update_onboarding_data()
<?php
$bearerToken = getenv('BEARER_TOKEN');
$refNo = '550e8400-e29b-41d4-a716-446655440000';
$updateData = [
'merchantName' => 'Acme Store',
'businessHandle' => 'acme-store',
'modeOfPayments' => ['CREDIT_CARD', 'DEBIT_CARD', 'GCASH'],
'currency' => 'PHP',
'tin' => '123456789012',
'industry' => 'Retail',
'serviceDescription' => 'Online retail store selling electronics and gadgets',
'isBrickAndMortarStore' => true,
'address' => [
'office' => [
'city' => 'Manila',
'line1' => '123 Main Street',
'buildingNameAndNumber' => 'Building A',
'state' => 'Metro Manila',
'postalCode' => '1000',
'contactNumber' => '639171234567',
'barangay' => 'Barangay 1'
]
],
'representatives' => [
'authorized' => [
'firstName' => 'Juan',
'lastName' => 'Dela Cruz',
'emailAddress' => 'juan@acme.com',
'contactNumber' => '639171234567',
'dateOfBirth' => '1985-05-15',
'position' => 'CEO'
]
],
'banks' => [
[
'accountDepositType' => 'BANK',
'accountType' => 'SAVINGS',
'bankName' => 'BDO',
'accountName' => 'Acme Corporation',
'accountNumber' => '1234567890',
'currency' => 'PHP',
'preferredSettlementRail' => 'instapay'
]
]
];
$ch = curl_init("https://kyc.sbx.moduluslabs.io/v2/onboard/{$refNo}");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($updateData));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $bearerToken,
'Content-Type: application/json'
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$data = json_decode($response, true);
if ($httpCode === 200) {
echo " Update successful!\n";
echo "New Status: {$data['onboardingStatus']}\n";
echo "Reference Number: {$data['onboardingReferenceNumber']}\n";
} else {
echo " Update failed: {$data['message']}\n";
echo "Status Code: {$httpCode}\n";
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import org.json.JSONObject;
import org.json.JSONArray;
public class UpdateOnboardingData {
private static final String BEARER_TOKEN = System.getenv("BEARER_TOKEN");
private static final String REF_NO = "550e8400-e29b-41d4-a716-446655440000";
public static void main(String[] args) {
try {
JSONObject updateData = new JSONObject();
updateData.put("merchantName", "Acme Store");
updateData.put("businessHandle", "acme-store");
updateData.put("modeOfPayments", new JSONArray()
.put("CREDIT_CARD")
.put("DEBIT_CARD")
.put("GCASH"));
updateData.put("currency", "PHP");
updateData.put("tin", "123456789012");
updateData.put("industry", "Retail");
updateData.put("serviceDescription", "Online retail store selling electronics and gadgets");
updateData.put("isBrickAndMortarStore", true);
JSONObject office = new JSONObject()
.put("city", "Manila")
.put("line1", "123 Main Street")
.put("buildingNameAndNumber", "Building A")
.put("state", "Metro Manila")
.put("postalCode", "1000")
.put("contactNumber", "639171234567")
.put("barangay", "Barangay 1");
updateData.put("address", new JSONObject().put("office", office));
JSONObject authorized = new JSONObject()
.put("firstName", "Juan")
.put("lastName", "Dela Cruz")
.put("emailAddress", "juan@acme.com")
.put("contactNumber", "639171234567")
.put("dateOfBirth", "1985-05-15")
.put("position", "CEO");
updateData.put("representatives", new JSONObject().put("authorized", authorized));
JSONObject bank = new JSONObject()
.put("accountDepositType", "BANK")
.put("accountType", "SAVINGS")
.put("bankName", "BDO")
.put("accountName", "Acme Corporation")
.put("accountNumber", "1234567890")
.put("currency", "PHP")
.put("preferredSettlementRail", "instapay");
updateData.put("banks", new JSONArray().put(bank));
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://kyc.sbx.moduluslabs.io/v2/onboard/" + REF_NO))
.header("Authorization", "Bearer " + BEARER_TOKEN)
.header("Content-Type", "application/json")
.PUT(HttpRequest.BodyPublishers.ofString(updateData.toString()))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
if (response.statusCode() == 200) {
JSONObject data = new JSONObject(response.body());
System.out.println(" Update successful!");
System.out.println("New Status: " + data.getString("onboardingStatus"));
System.out.println("Reference Number: " + data.getString("onboardingReferenceNumber"));
} else {
JSONObject error = new JSONObject(response.body());
System.err.println(" Update failed: " + error.getString("message"));
System.err.println("Status Code: " + response.statusCode());
}
} catch (Exception e) {
System.err.println(" Error: " + e.getMessage());
e.printStackTrace();
}
}
}
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
"os"
)
type UpdateData struct {
MerchantName string `json:"merchantName"`
BusinessHandle string `json:"businessHandle"`
ModeOfPayments []string `json:"modeOfPayments"`
Currency string `json:"currency"`
Tin string `json:"tin"`
Industry string `json:"industry"`
ServiceDescription string `json:"serviceDescription"`
IsBrickAndMortarStore bool `json:"isBrickAndMortarStore"`
Address Address `json:"address"`
Representatives Representatives `json:"representatives"`
Banks []BankAccount `json:"banks"`
}
type Address struct {
Office OfficeAddress `json:"office"`
}
type OfficeAddress struct {
City string `json:"city"`
Line1 string `json:"line1"`
BuildingNameAndNumber string `json:"buildingNameAndNumber"`
State string `json:"state"`
PostalCode string `json:"postalCode"`
ContactNumber string `json:"contactNumber"`
Barangay string `json:"barangay"`
}
type Representatives struct {
Authorized AuthorizedRep `json:"authorized"`
}
type AuthorizedRep struct {
FirstName string `json:"firstName"`
LastName string `json:"lastName"`
EmailAddress string `json:"emailAddress"`
ContactNumber string `json:"contactNumber"`
DateOfBirth string `json:"dateOfBirth"`
Position string `json:"position"`
}
type BankAccount struct {
AccountDepositType string `json:"accountDepositType"`
AccountType string `json:"accountType"`
BankName string `json:"bankName"`
AccountName string `json:"accountName"`
AccountNumber string `json:"accountNumber"`
Currency string `json:"currency"`
PreferredSettlementRail string `json:"preferredSettlementRail"`
}
type Response struct {
OnboardingStatus string `json:"onboardingStatus"`
OnboardingReferenceNumber string `json:"onboardingReferenceNumber"`
}
type ErrorResponse struct {
StatusCode int `json:"statusCode"`
Message string `json:"message"`
Error string `json:"error"`
}
func main() {
bearerToken := os.Getenv("BEARER_TOKEN")
refNo := "550e8400-e29b-41d4-a716-446655440000"
updateData := UpdateData{
MerchantName: "Acme Store",
BusinessHandle: "acme-store",
ModeOfPayments: []string{"CREDIT_CARD", "DEBIT_CARD", "GCASH"},
Currency: "PHP",
Tin: "123456789012",
Industry: "Retail",
ServiceDescription: "Online retail store selling electronics and gadgets",
IsBrickAndMortarStore: true,
Address: Address{
Office: OfficeAddress{
City: "Manila",
Line1: "123 Main Street",
BuildingNameAndNumber: "Building A",
State: "Metro Manila",
PostalCode: "1000",
ContactNumber: "639171234567",
Barangay: "Barangay 1",
},
},
Representatives: Representatives{
Authorized: AuthorizedRep{
FirstName: "Juan",
LastName: "Dela Cruz",
EmailAddress: "juan@acme.com",
ContactNumber: "639171234567",
DateOfBirth: "1985-05-15",
Position: "CEO",
},
},
Banks: []BankAccount{
{
AccountDepositType: "BANK",
AccountType: "SAVINGS",
BankName: "BDO",
AccountName: "Acme Corporation",
AccountNumber: "1234567890",
Currency: "PHP",
PreferredSettlementRail: "instapay",
},
},
}
jsonData, err := json.Marshal(updateData)
if err != nil {
fmt.Printf(" Error marshaling JSON: %v\n", err)
return
}
url := fmt.Sprintf("https://kyc.sbx.moduluslabs.io/v2/onboard/%s", refNo)
req, err := http.NewRequest("PUT", url, bytes.NewBuffer(jsonData))
if err != nil {
fmt.Printf(" Error creating request: %v\n", err)
return
}
req.Header.Set("Authorization", "Bearer "+bearerToken)
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Printf(" Error making request: %v\n", err)
return
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Printf(" Error reading response: %v\n", err)
return
}
if resp.StatusCode == 200 {
var response Response
if err := json.Unmarshal(body, &response); err != nil {
fmt.Printf(" Error parsing response: %v\n", err)
return
}
fmt.Println(" Update successful!")
fmt.Printf("New Status: %s\n", response.OnboardingStatus)
fmt.Printf("Reference Number: %s\n", response.OnboardingReferenceNumber)
} else {
var errorResponse ErrorResponse
if err := json.Unmarshal(body, &errorResponse); err != nil {
fmt.Printf(" Error parsing error response: %v\n", err)
return
}
fmt.Printf(" Update failed: %s\n", errorResponse.Message)
fmt.Printf("Status Code: %d\n", resp.StatusCode)
}
}
using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
class Program
{
private static readonly string BEARER_TOKEN = Environment.GetEnvironmentVariable("BEARER_TOKEN");
private static readonly string REF_NO = "550e8400-e29b-41d4-a716-446655440000";
static async Task Main(string[] args)
{
var updateData = new
{
merchantName = "Acme Store",
businessHandle = "acme-store",
modeOfPayments = new[] { "CREDIT_CARD", "DEBIT_CARD", "GCASH" },
currency = "PHP",
tin = "123456789012",
industry = "Retail",
serviceDescription = "Online retail store selling electronics and gadgets",
isBrickAndMortarStore = true,
address = new
{
office = new
{
city = "Manila",
line1 = "123 Main Street",
buildingNameAndNumber = "Building A",
state = "Metro Manila",
postalCode = "1000",
contactNumber = "639171234567",
barangay = "Barangay 1"
}
},
representatives = new
{
authorized = new
{
firstName = "Juan",
lastName = "Dela Cruz",
emailAddress = "juan@acme.com",
contactNumber = "639171234567",
dateOfBirth = "1985-05-15",
position = "CEO"
}
},
banks = new[]
{
new
{
accountDepositType = "BANK",
accountType = "SAVINGS",
bankName = "BDO",
accountName = "Acme Corporation",
accountNumber = "1234567890",
currency = "PHP",
preferredSettlementRail = "instapay"
}
}
};
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", $"Bearer {BEARER_TOKEN}");
var json = JsonSerializer.Serialize(updateData);
var content = new StringContent(json, Encoding.UTF8, "application/json");
try
{
var response = await client.PutAsync(
$"https://kyc.sbx.moduluslabs.io/v2/onboard/{REF_NO}",
content
);
var responseBody = await response.Content.ReadAsStringAsync();
if (response.IsSuccessStatusCode)
{
using var doc = JsonDocument.Parse(responseBody);
var root = doc.RootElement;
Console.WriteLine(" Update successful!");
Console.WriteLine($"New Status: {root.GetProperty("onboardingStatus").GetString()}");
Console.WriteLine($"Reference Number: {root.GetProperty("onboardingReferenceNumber").GetString()}");
}
else
{
using var doc = JsonDocument.Parse(responseBody);
var root = doc.RootElement;
Console.WriteLine($" Update failed: {root.GetProperty("message").GetString()}");
Console.WriteLine($"Status Code: {(int)response.StatusCode}");
}
}
catch (Exception ex)
{
Console.WriteLine($" Error: {ex.Message}");
}
}
}
{
"onboardingReferenceNumber": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"statusCode": 123,
"message": "<string>",
"error": "<string>",
"details": {}
}{
"statusCode": 123,
"message": "<string>",
"error": "<string>",
"details": {}
}Update Onboarding Data
Update merchant onboarding data after being declined
BEARER_TOKEN="your_jwt_token_here"
REF_NO="550e8400-e29b-41d4-a716-446655440000"
curl -X PUT "https://kyc.sbx.moduluslabs.io/v2/onboard/${REF_NO}" \
-H "Authorization: Bearer ${BEARER_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"merchantName": "Acme Store",
"businessHandle": "acme-store",
"modeOfPayments": ["CREDIT_CARD", "DEBIT_CARD", "GCASH"],
"currency": "PHP",
"tin": "123456789012",
"industry": "Retail",
"serviceDescription": "Online retail store selling electronics and gadgets",
"isBrickAndMortarStore": true,
"address": {
"office": {
"city": "Manila",
"line1": "123 Main Street",
"buildingNameAndNumber": "Building A",
"state": "Metro Manila",
"postalCode": "1000",
"contactNumber": "639171234567",
"barangay": "Barangay 1"
}
},
"representatives": {
"authorized": {
"firstName": "Juan",
"lastName": "Dela Cruz",
"emailAddress": "juan@acme.com",
"contactNumber": "639171234567",
"dateOfBirth": "1985-05-15",
"position": "CEO"
}
},
"banks": [
{
"accountDepositType": "BANK",
"accountType": "SAVINGS",
"bankName": "BDO",
"accountName": "Acme Corporation",
"accountNumber": "1234567890",
"currency": "PHP",
"preferredSettlementRail": "instapay"
}
]
}'
const axios = require('axios');
const BEARER_TOKEN = process.env.BEARER_TOKEN;
const REF_NO = '550e8400-e29b-41d4-a716-446655440000';
const updateData = {
merchantName: 'Acme Store',
businessHandle: 'acme-store',
modeOfPayments: ['CREDIT_CARD', 'DEBIT_CARD', 'GCASH'],
currency: 'PHP',
tin: '123456789012',
industry: 'Retail',
serviceDescription: 'Online retail store selling electronics and gadgets',
isBrickAndMortarStore: true,
address: {
office: {
city: 'Manila',
line1: '123 Main Street',
buildingNameAndNumber: 'Building A',
state: 'Metro Manila',
postalCode: '1000',
contactNumber: '639171234567',
barangay: 'Barangay 1'
}
},
representatives: {
authorized: {
firstName: 'Juan',
lastName: 'Dela Cruz',
emailAddress: 'juan@acme.com',
contactNumber: '639171234567',
dateOfBirth: '1985-05-15',
position: 'CEO'
}
},
banks: [
{
accountDepositType: 'BANK',
accountType: 'SAVINGS',
bankName: 'BDO',
accountName: 'Acme Corporation',
accountNumber: '1234567890',
currency: 'PHP',
preferredSettlementRail: 'instapay'
}
]
};
async function updateOnboardingData() {
try {
const response = await axios.put(
`https://kyc.sbx.moduluslabs.io/v2/onboard/${REF_NO}`,
updateData,
{
headers: {
'Authorization': `Bearer ${BEARER_TOKEN}`,
'Content-Type': 'application/json'
}
}
);
console.log(' Update successful!');
console.log('New Status:', response.data.onboardingStatus);
console.log('Reference Number:', response.data.onboardingReferenceNumber);
} catch (error) {
if (error.response) {
console.error(' Update failed:', error.response.data.message);
console.error('Status Code:', error.response.status);
} else {
console.error(' Error:', error.message);
}
}
}
updateOnboardingData();
import os
import requests
BEARER_TOKEN = os.getenv('BEARER_TOKEN')
REF_NO = '550e8400-e29b-41d4-a716-446655440000'
update_data = {
'merchantName': 'Acme Store',
'businessHandle': 'acme-store',
'modeOfPayments': ['CREDIT_CARD', 'DEBIT_CARD', 'GCASH'],
'currency': 'PHP',
'tin': '123456789012',
'industry': 'Retail',
'serviceDescription': 'Online retail store selling electronics and gadgets',
'isBrickAndMortarStore': True,
'address': {
'office': {
'city': 'Manila',
'line1': '123 Main Street',
'buildingNameAndNumber': 'Building A',
'state': 'Metro Manila',
'postalCode': '1000',
'contactNumber': '639171234567',
'barangay': 'Barangay 1'
}
},
'representatives': {
'authorized': {
'firstName': 'Juan',
'lastName': 'Dela Cruz',
'emailAddress': 'juan@acme.com',
'contactNumber': '639171234567',
'dateOfBirth': '1985-05-15',
'position': 'CEO'
}
},
'banks': [
{
'accountDepositType': 'BANK',
'accountType': 'SAVINGS',
'bankName': 'BDO',
'accountName': 'Acme Corporation',
'accountNumber': '1234567890',
'currency': 'PHP',
'preferredSettlementRail': 'instapay'
}
]
}
def update_onboarding_data():
try:
response = requests.put(
f'https://kyc.sbx.moduluslabs.io/v2/onboard/{REF_NO}',
json=update_data,
headers={
'Authorization': f'Bearer {BEARER_TOKEN}',
'Content-Type': 'application/json'
}
)
response.raise_for_status()
data = response.json()
print(' Update successful!')
print(f"New Status: {data['onboardingStatus']}")
print(f"Reference Number: {data['onboardingReferenceNumber']}")
except requests.exceptions.HTTPError as error:
print(f" Update failed: {error.response.json().get('message', 'Unknown error')}")
print(f"Status Code: {error.response.status_code}")
except Exception as error:
print(f" Error: {str(error)}")
if __name__ == '__main__':
update_onboarding_data()
<?php
$bearerToken = getenv('BEARER_TOKEN');
$refNo = '550e8400-e29b-41d4-a716-446655440000';
$updateData = [
'merchantName' => 'Acme Store',
'businessHandle' => 'acme-store',
'modeOfPayments' => ['CREDIT_CARD', 'DEBIT_CARD', 'GCASH'],
'currency' => 'PHP',
'tin' => '123456789012',
'industry' => 'Retail',
'serviceDescription' => 'Online retail store selling electronics and gadgets',
'isBrickAndMortarStore' => true,
'address' => [
'office' => [
'city' => 'Manila',
'line1' => '123 Main Street',
'buildingNameAndNumber' => 'Building A',
'state' => 'Metro Manila',
'postalCode' => '1000',
'contactNumber' => '639171234567',
'barangay' => 'Barangay 1'
]
],
'representatives' => [
'authorized' => [
'firstName' => 'Juan',
'lastName' => 'Dela Cruz',
'emailAddress' => 'juan@acme.com',
'contactNumber' => '639171234567',
'dateOfBirth' => '1985-05-15',
'position' => 'CEO'
]
],
'banks' => [
[
'accountDepositType' => 'BANK',
'accountType' => 'SAVINGS',
'bankName' => 'BDO',
'accountName' => 'Acme Corporation',
'accountNumber' => '1234567890',
'currency' => 'PHP',
'preferredSettlementRail' => 'instapay'
]
]
];
$ch = curl_init("https://kyc.sbx.moduluslabs.io/v2/onboard/{$refNo}");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($updateData));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $bearerToken,
'Content-Type: application/json'
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$data = json_decode($response, true);
if ($httpCode === 200) {
echo " Update successful!\n";
echo "New Status: {$data['onboardingStatus']}\n";
echo "Reference Number: {$data['onboardingReferenceNumber']}\n";
} else {
echo " Update failed: {$data['message']}\n";
echo "Status Code: {$httpCode}\n";
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import org.json.JSONObject;
import org.json.JSONArray;
public class UpdateOnboardingData {
private static final String BEARER_TOKEN = System.getenv("BEARER_TOKEN");
private static final String REF_NO = "550e8400-e29b-41d4-a716-446655440000";
public static void main(String[] args) {
try {
JSONObject updateData = new JSONObject();
updateData.put("merchantName", "Acme Store");
updateData.put("businessHandle", "acme-store");
updateData.put("modeOfPayments", new JSONArray()
.put("CREDIT_CARD")
.put("DEBIT_CARD")
.put("GCASH"));
updateData.put("currency", "PHP");
updateData.put("tin", "123456789012");
updateData.put("industry", "Retail");
updateData.put("serviceDescription", "Online retail store selling electronics and gadgets");
updateData.put("isBrickAndMortarStore", true);
JSONObject office = new JSONObject()
.put("city", "Manila")
.put("line1", "123 Main Street")
.put("buildingNameAndNumber", "Building A")
.put("state", "Metro Manila")
.put("postalCode", "1000")
.put("contactNumber", "639171234567")
.put("barangay", "Barangay 1");
updateData.put("address", new JSONObject().put("office", office));
JSONObject authorized = new JSONObject()
.put("firstName", "Juan")
.put("lastName", "Dela Cruz")
.put("emailAddress", "juan@acme.com")
.put("contactNumber", "639171234567")
.put("dateOfBirth", "1985-05-15")
.put("position", "CEO");
updateData.put("representatives", new JSONObject().put("authorized", authorized));
JSONObject bank = new JSONObject()
.put("accountDepositType", "BANK")
.put("accountType", "SAVINGS")
.put("bankName", "BDO")
.put("accountName", "Acme Corporation")
.put("accountNumber", "1234567890")
.put("currency", "PHP")
.put("preferredSettlementRail", "instapay");
updateData.put("banks", new JSONArray().put(bank));
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://kyc.sbx.moduluslabs.io/v2/onboard/" + REF_NO))
.header("Authorization", "Bearer " + BEARER_TOKEN)
.header("Content-Type", "application/json")
.PUT(HttpRequest.BodyPublishers.ofString(updateData.toString()))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
if (response.statusCode() == 200) {
JSONObject data = new JSONObject(response.body());
System.out.println(" Update successful!");
System.out.println("New Status: " + data.getString("onboardingStatus"));
System.out.println("Reference Number: " + data.getString("onboardingReferenceNumber"));
} else {
JSONObject error = new JSONObject(response.body());
System.err.println(" Update failed: " + error.getString("message"));
System.err.println("Status Code: " + response.statusCode());
}
} catch (Exception e) {
System.err.println(" Error: " + e.getMessage());
e.printStackTrace();
}
}
}
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
"os"
)
type UpdateData struct {
MerchantName string `json:"merchantName"`
BusinessHandle string `json:"businessHandle"`
ModeOfPayments []string `json:"modeOfPayments"`
Currency string `json:"currency"`
Tin string `json:"tin"`
Industry string `json:"industry"`
ServiceDescription string `json:"serviceDescription"`
IsBrickAndMortarStore bool `json:"isBrickAndMortarStore"`
Address Address `json:"address"`
Representatives Representatives `json:"representatives"`
Banks []BankAccount `json:"banks"`
}
type Address struct {
Office OfficeAddress `json:"office"`
}
type OfficeAddress struct {
City string `json:"city"`
Line1 string `json:"line1"`
BuildingNameAndNumber string `json:"buildingNameAndNumber"`
State string `json:"state"`
PostalCode string `json:"postalCode"`
ContactNumber string `json:"contactNumber"`
Barangay string `json:"barangay"`
}
type Representatives struct {
Authorized AuthorizedRep `json:"authorized"`
}
type AuthorizedRep struct {
FirstName string `json:"firstName"`
LastName string `json:"lastName"`
EmailAddress string `json:"emailAddress"`
ContactNumber string `json:"contactNumber"`
DateOfBirth string `json:"dateOfBirth"`
Position string `json:"position"`
}
type BankAccount struct {
AccountDepositType string `json:"accountDepositType"`
AccountType string `json:"accountType"`
BankName string `json:"bankName"`
AccountName string `json:"accountName"`
AccountNumber string `json:"accountNumber"`
Currency string `json:"currency"`
PreferredSettlementRail string `json:"preferredSettlementRail"`
}
type Response struct {
OnboardingStatus string `json:"onboardingStatus"`
OnboardingReferenceNumber string `json:"onboardingReferenceNumber"`
}
type ErrorResponse struct {
StatusCode int `json:"statusCode"`
Message string `json:"message"`
Error string `json:"error"`
}
func main() {
bearerToken := os.Getenv("BEARER_TOKEN")
refNo := "550e8400-e29b-41d4-a716-446655440000"
updateData := UpdateData{
MerchantName: "Acme Store",
BusinessHandle: "acme-store",
ModeOfPayments: []string{"CREDIT_CARD", "DEBIT_CARD", "GCASH"},
Currency: "PHP",
Tin: "123456789012",
Industry: "Retail",
ServiceDescription: "Online retail store selling electronics and gadgets",
IsBrickAndMortarStore: true,
Address: Address{
Office: OfficeAddress{
City: "Manila",
Line1: "123 Main Street",
BuildingNameAndNumber: "Building A",
State: "Metro Manila",
PostalCode: "1000",
ContactNumber: "639171234567",
Barangay: "Barangay 1",
},
},
Representatives: Representatives{
Authorized: AuthorizedRep{
FirstName: "Juan",
LastName: "Dela Cruz",
EmailAddress: "juan@acme.com",
ContactNumber: "639171234567",
DateOfBirth: "1985-05-15",
Position: "CEO",
},
},
Banks: []BankAccount{
{
AccountDepositType: "BANK",
AccountType: "SAVINGS",
BankName: "BDO",
AccountName: "Acme Corporation",
AccountNumber: "1234567890",
Currency: "PHP",
PreferredSettlementRail: "instapay",
},
},
}
jsonData, err := json.Marshal(updateData)
if err != nil {
fmt.Printf(" Error marshaling JSON: %v\n", err)
return
}
url := fmt.Sprintf("https://kyc.sbx.moduluslabs.io/v2/onboard/%s", refNo)
req, err := http.NewRequest("PUT", url, bytes.NewBuffer(jsonData))
if err != nil {
fmt.Printf(" Error creating request: %v\n", err)
return
}
req.Header.Set("Authorization", "Bearer "+bearerToken)
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Printf(" Error making request: %v\n", err)
return
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Printf(" Error reading response: %v\n", err)
return
}
if resp.StatusCode == 200 {
var response Response
if err := json.Unmarshal(body, &response); err != nil {
fmt.Printf(" Error parsing response: %v\n", err)
return
}
fmt.Println(" Update successful!")
fmt.Printf("New Status: %s\n", response.OnboardingStatus)
fmt.Printf("Reference Number: %s\n", response.OnboardingReferenceNumber)
} else {
var errorResponse ErrorResponse
if err := json.Unmarshal(body, &errorResponse); err != nil {
fmt.Printf(" Error parsing error response: %v\n", err)
return
}
fmt.Printf(" Update failed: %s\n", errorResponse.Message)
fmt.Printf("Status Code: %d\n", resp.StatusCode)
}
}
using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
class Program
{
private static readonly string BEARER_TOKEN = Environment.GetEnvironmentVariable("BEARER_TOKEN");
private static readonly string REF_NO = "550e8400-e29b-41d4-a716-446655440000";
static async Task Main(string[] args)
{
var updateData = new
{
merchantName = "Acme Store",
businessHandle = "acme-store",
modeOfPayments = new[] { "CREDIT_CARD", "DEBIT_CARD", "GCASH" },
currency = "PHP",
tin = "123456789012",
industry = "Retail",
serviceDescription = "Online retail store selling electronics and gadgets",
isBrickAndMortarStore = true,
address = new
{
office = new
{
city = "Manila",
line1 = "123 Main Street",
buildingNameAndNumber = "Building A",
state = "Metro Manila",
postalCode = "1000",
contactNumber = "639171234567",
barangay = "Barangay 1"
}
},
representatives = new
{
authorized = new
{
firstName = "Juan",
lastName = "Dela Cruz",
emailAddress = "juan@acme.com",
contactNumber = "639171234567",
dateOfBirth = "1985-05-15",
position = "CEO"
}
},
banks = new[]
{
new
{
accountDepositType = "BANK",
accountType = "SAVINGS",
bankName = "BDO",
accountName = "Acme Corporation",
accountNumber = "1234567890",
currency = "PHP",
preferredSettlementRail = "instapay"
}
}
};
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", $"Bearer {BEARER_TOKEN}");
var json = JsonSerializer.Serialize(updateData);
var content = new StringContent(json, Encoding.UTF8, "application/json");
try
{
var response = await client.PutAsync(
$"https://kyc.sbx.moduluslabs.io/v2/onboard/{REF_NO}",
content
);
var responseBody = await response.Content.ReadAsStringAsync();
if (response.IsSuccessStatusCode)
{
using var doc = JsonDocument.Parse(responseBody);
var root = doc.RootElement;
Console.WriteLine(" Update successful!");
Console.WriteLine($"New Status: {root.GetProperty("onboardingStatus").GetString()}");
Console.WriteLine($"Reference Number: {root.GetProperty("onboardingReferenceNumber").GetString()}");
}
else
{
using var doc = JsonDocument.Parse(responseBody);
var root = doc.RootElement;
Console.WriteLine($" Update failed: {root.GetProperty("message").GetString()}");
Console.WriteLine($"Status Code: {(int)response.StatusCode}");
}
}
catch (Exception ex)
{
Console.WriteLine($" Error: {ex.Message}");
}
}
}
{
"onboardingReferenceNumber": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"statusCode": 123,
"message": "<string>",
"error": "<string>",
"details": {}
}{
"statusCode": 123,
"message": "<string>",
"error": "<string>",
"details": {}
}Overview
Updates the onboarding data for a merchant using the onboarding reference number. This endpoint allows merchants to correct and resubmit their information after their application has been declined.Authentication
This endpoint requires JWT Bearer Token authentication.Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Authorization Rules
| User Role | Required Merchant Status | Result Status After Update |
|---|---|---|
| Regular User | DECLINED | PENDING |
| Super Admin | APPROVED | APPROVED (no status change) |
| Settlement/Checker Roles | N/A | Not Allowed |
Path Parameters
"550e8400-e29b-41d4-a716-446655440000"referenceNumber returned from the Onboard Merchant endpoint.Request Body
All fields from the original onboarding request are required, except those marked as optional.Core Business Information
"Acme Corporation Inc.""Acme Store""acme-store"CREDIT_CARD, DEBIT_CARD, GCASH, GRABPAY, PAYMAYA, BANK_TRANSFERExample: ["CREDIT_CARD", "DEBIT_CARD", "GCASH"]PHP, USDExample: "PHP""123456789012""Retail""Online retail store selling electronics and gadgets"trueOptional Business Fields
"AUB123456""100000-500000"falsefalsefalseIncorporators
Show Incorporator Properties
Show Incorporator Properties
city, line1, buildingNameAndNumber, state, postalCode, barangaySignatories
Address
Show Office Address (Required)
Show Office Address (Required)
Show Registered Address (Optional)
Show Registered Address (Optional)
Websites
Representatives
Show Authorized Representative (Required)
Show Authorized Representative (Required)
MALE or FEMALE)Show Escalation Representative (Optional)
Show Escalation Representative (Optional)
firstName, lastName, emailAddress, contactNumber, dateOfBirth, tin (9 digits), sss (10 digits), positionBank Accounts
Show Bank Account Properties
Show Bank Account Properties
BANK, PAYMAYA, GCASH, NO_ACCOUNTSAVINGS, CHECKING_CURRENTRequired when: accountDepositType is BANKaccountDepositType is not NO_ACCOUNTaccountDepositType is not NO_ACCOUNTaccountDepositType is not NO_ACCOUNTPHP or USD)instapay, pesonet^[A-Z0-9]{8,11}$BEARER_TOKEN="your_jwt_token_here"
REF_NO="550e8400-e29b-41d4-a716-446655440000"
curl -X PUT "https://kyc.sbx.moduluslabs.io/v2/onboard/${REF_NO}" \
-H "Authorization: Bearer ${BEARER_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"merchantName": "Acme Store",
"businessHandle": "acme-store",
"modeOfPayments": ["CREDIT_CARD", "DEBIT_CARD", "GCASH"],
"currency": "PHP",
"tin": "123456789012",
"industry": "Retail",
"serviceDescription": "Online retail store selling electronics and gadgets",
"isBrickAndMortarStore": true,
"address": {
"office": {
"city": "Manila",
"line1": "123 Main Street",
"buildingNameAndNumber": "Building A",
"state": "Metro Manila",
"postalCode": "1000",
"contactNumber": "639171234567",
"barangay": "Barangay 1"
}
},
"representatives": {
"authorized": {
"firstName": "Juan",
"lastName": "Dela Cruz",
"emailAddress": "juan@acme.com",
"contactNumber": "639171234567",
"dateOfBirth": "1985-05-15",
"position": "CEO"
}
},
"banks": [
{
"accountDepositType": "BANK",
"accountType": "SAVINGS",
"bankName": "BDO",
"accountName": "Acme Corporation",
"accountNumber": "1234567890",
"currency": "PHP",
"preferredSettlementRail": "instapay"
}
]
}'
const axios = require('axios');
const BEARER_TOKEN = process.env.BEARER_TOKEN;
const REF_NO = '550e8400-e29b-41d4-a716-446655440000';
const updateData = {
merchantName: 'Acme Store',
businessHandle: 'acme-store',
modeOfPayments: ['CREDIT_CARD', 'DEBIT_CARD', 'GCASH'],
currency: 'PHP',
tin: '123456789012',
industry: 'Retail',
serviceDescription: 'Online retail store selling electronics and gadgets',
isBrickAndMortarStore: true,
address: {
office: {
city: 'Manila',
line1: '123 Main Street',
buildingNameAndNumber: 'Building A',
state: 'Metro Manila',
postalCode: '1000',
contactNumber: '639171234567',
barangay: 'Barangay 1'
}
},
representatives: {
authorized: {
firstName: 'Juan',
lastName: 'Dela Cruz',
emailAddress: 'juan@acme.com',
contactNumber: '639171234567',
dateOfBirth: '1985-05-15',
position: 'CEO'
}
},
banks: [
{
accountDepositType: 'BANK',
accountType: 'SAVINGS',
bankName: 'BDO',
accountName: 'Acme Corporation',
accountNumber: '1234567890',
currency: 'PHP',
preferredSettlementRail: 'instapay'
}
]
};
async function updateOnboardingData() {
try {
const response = await axios.put(
`https://kyc.sbx.moduluslabs.io/v2/onboard/${REF_NO}`,
updateData,
{
headers: {
'Authorization': `Bearer ${BEARER_TOKEN}`,
'Content-Type': 'application/json'
}
}
);
console.log(' Update successful!');
console.log('New Status:', response.data.onboardingStatus);
console.log('Reference Number:', response.data.onboardingReferenceNumber);
} catch (error) {
if (error.response) {
console.error(' Update failed:', error.response.data.message);
console.error('Status Code:', error.response.status);
} else {
console.error(' Error:', error.message);
}
}
}
updateOnboardingData();
import os
import requests
BEARER_TOKEN = os.getenv('BEARER_TOKEN')
REF_NO = '550e8400-e29b-41d4-a716-446655440000'
update_data = {
'merchantName': 'Acme Store',
'businessHandle': 'acme-store',
'modeOfPayments': ['CREDIT_CARD', 'DEBIT_CARD', 'GCASH'],
'currency': 'PHP',
'tin': '123456789012',
'industry': 'Retail',
'serviceDescription': 'Online retail store selling electronics and gadgets',
'isBrickAndMortarStore': True,
'address': {
'office': {
'city': 'Manila',
'line1': '123 Main Street',
'buildingNameAndNumber': 'Building A',
'state': 'Metro Manila',
'postalCode': '1000',
'contactNumber': '639171234567',
'barangay': 'Barangay 1'
}
},
'representatives': {
'authorized': {
'firstName': 'Juan',
'lastName': 'Dela Cruz',
'emailAddress': 'juan@acme.com',
'contactNumber': '639171234567',
'dateOfBirth': '1985-05-15',
'position': 'CEO'
}
},
'banks': [
{
'accountDepositType': 'BANK',
'accountType': 'SAVINGS',
'bankName': 'BDO',
'accountName': 'Acme Corporation',
'accountNumber': '1234567890',
'currency': 'PHP',
'preferredSettlementRail': 'instapay'
}
]
}
def update_onboarding_data():
try:
response = requests.put(
f'https://kyc.sbx.moduluslabs.io/v2/onboard/{REF_NO}',
json=update_data,
headers={
'Authorization': f'Bearer {BEARER_TOKEN}',
'Content-Type': 'application/json'
}
)
response.raise_for_status()
data = response.json()
print(' Update successful!')
print(f"New Status: {data['onboardingStatus']}")
print(f"Reference Number: {data['onboardingReferenceNumber']}")
except requests.exceptions.HTTPError as error:
print(f" Update failed: {error.response.json().get('message', 'Unknown error')}")
print(f"Status Code: {error.response.status_code}")
except Exception as error:
print(f" Error: {str(error)}")
if __name__ == '__main__':
update_onboarding_data()
<?php
$bearerToken = getenv('BEARER_TOKEN');
$refNo = '550e8400-e29b-41d4-a716-446655440000';
$updateData = [
'merchantName' => 'Acme Store',
'businessHandle' => 'acme-store',
'modeOfPayments' => ['CREDIT_CARD', 'DEBIT_CARD', 'GCASH'],
'currency' => 'PHP',
'tin' => '123456789012',
'industry' => 'Retail',
'serviceDescription' => 'Online retail store selling electronics and gadgets',
'isBrickAndMortarStore' => true,
'address' => [
'office' => [
'city' => 'Manila',
'line1' => '123 Main Street',
'buildingNameAndNumber' => 'Building A',
'state' => 'Metro Manila',
'postalCode' => '1000',
'contactNumber' => '639171234567',
'barangay' => 'Barangay 1'
]
],
'representatives' => [
'authorized' => [
'firstName' => 'Juan',
'lastName' => 'Dela Cruz',
'emailAddress' => 'juan@acme.com',
'contactNumber' => '639171234567',
'dateOfBirth' => '1985-05-15',
'position' => 'CEO'
]
],
'banks' => [
[
'accountDepositType' => 'BANK',
'accountType' => 'SAVINGS',
'bankName' => 'BDO',
'accountName' => 'Acme Corporation',
'accountNumber' => '1234567890',
'currency' => 'PHP',
'preferredSettlementRail' => 'instapay'
]
]
];
$ch = curl_init("https://kyc.sbx.moduluslabs.io/v2/onboard/{$refNo}");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($updateData));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $bearerToken,
'Content-Type: application/json'
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$data = json_decode($response, true);
if ($httpCode === 200) {
echo " Update successful!\n";
echo "New Status: {$data['onboardingStatus']}\n";
echo "Reference Number: {$data['onboardingReferenceNumber']}\n";
} else {
echo " Update failed: {$data['message']}\n";
echo "Status Code: {$httpCode}\n";
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import org.json.JSONObject;
import org.json.JSONArray;
public class UpdateOnboardingData {
private static final String BEARER_TOKEN = System.getenv("BEARER_TOKEN");
private static final String REF_NO = "550e8400-e29b-41d4-a716-446655440000";
public static void main(String[] args) {
try {
JSONObject updateData = new JSONObject();
updateData.put("merchantName", "Acme Store");
updateData.put("businessHandle", "acme-store");
updateData.put("modeOfPayments", new JSONArray()
.put("CREDIT_CARD")
.put("DEBIT_CARD")
.put("GCASH"));
updateData.put("currency", "PHP");
updateData.put("tin", "123456789012");
updateData.put("industry", "Retail");
updateData.put("serviceDescription", "Online retail store selling electronics and gadgets");
updateData.put("isBrickAndMortarStore", true);
JSONObject office = new JSONObject()
.put("city", "Manila")
.put("line1", "123 Main Street")
.put("buildingNameAndNumber", "Building A")
.put("state", "Metro Manila")
.put("postalCode", "1000")
.put("contactNumber", "639171234567")
.put("barangay", "Barangay 1");
updateData.put("address", new JSONObject().put("office", office));
JSONObject authorized = new JSONObject()
.put("firstName", "Juan")
.put("lastName", "Dela Cruz")
.put("emailAddress", "juan@acme.com")
.put("contactNumber", "639171234567")
.put("dateOfBirth", "1985-05-15")
.put("position", "CEO");
updateData.put("representatives", new JSONObject().put("authorized", authorized));
JSONObject bank = new JSONObject()
.put("accountDepositType", "BANK")
.put("accountType", "SAVINGS")
.put("bankName", "BDO")
.put("accountName", "Acme Corporation")
.put("accountNumber", "1234567890")
.put("currency", "PHP")
.put("preferredSettlementRail", "instapay");
updateData.put("banks", new JSONArray().put(bank));
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://kyc.sbx.moduluslabs.io/v2/onboard/" + REF_NO))
.header("Authorization", "Bearer " + BEARER_TOKEN)
.header("Content-Type", "application/json")
.PUT(HttpRequest.BodyPublishers.ofString(updateData.toString()))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
if (response.statusCode() == 200) {
JSONObject data = new JSONObject(response.body());
System.out.println(" Update successful!");
System.out.println("New Status: " + data.getString("onboardingStatus"));
System.out.println("Reference Number: " + data.getString("onboardingReferenceNumber"));
} else {
JSONObject error = new JSONObject(response.body());
System.err.println(" Update failed: " + error.getString("message"));
System.err.println("Status Code: " + response.statusCode());
}
} catch (Exception e) {
System.err.println(" Error: " + e.getMessage());
e.printStackTrace();
}
}
}
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
"os"
)
type UpdateData struct {
MerchantName string `json:"merchantName"`
BusinessHandle string `json:"businessHandle"`
ModeOfPayments []string `json:"modeOfPayments"`
Currency string `json:"currency"`
Tin string `json:"tin"`
Industry string `json:"industry"`
ServiceDescription string `json:"serviceDescription"`
IsBrickAndMortarStore bool `json:"isBrickAndMortarStore"`
Address Address `json:"address"`
Representatives Representatives `json:"representatives"`
Banks []BankAccount `json:"banks"`
}
type Address struct {
Office OfficeAddress `json:"office"`
}
type OfficeAddress struct {
City string `json:"city"`
Line1 string `json:"line1"`
BuildingNameAndNumber string `json:"buildingNameAndNumber"`
State string `json:"state"`
PostalCode string `json:"postalCode"`
ContactNumber string `json:"contactNumber"`
Barangay string `json:"barangay"`
}
type Representatives struct {
Authorized AuthorizedRep `json:"authorized"`
}
type AuthorizedRep struct {
FirstName string `json:"firstName"`
LastName string `json:"lastName"`
EmailAddress string `json:"emailAddress"`
ContactNumber string `json:"contactNumber"`
DateOfBirth string `json:"dateOfBirth"`
Position string `json:"position"`
}
type BankAccount struct {
AccountDepositType string `json:"accountDepositType"`
AccountType string `json:"accountType"`
BankName string `json:"bankName"`
AccountName string `json:"accountName"`
AccountNumber string `json:"accountNumber"`
Currency string `json:"currency"`
PreferredSettlementRail string `json:"preferredSettlementRail"`
}
type Response struct {
OnboardingStatus string `json:"onboardingStatus"`
OnboardingReferenceNumber string `json:"onboardingReferenceNumber"`
}
type ErrorResponse struct {
StatusCode int `json:"statusCode"`
Message string `json:"message"`
Error string `json:"error"`
}
func main() {
bearerToken := os.Getenv("BEARER_TOKEN")
refNo := "550e8400-e29b-41d4-a716-446655440000"
updateData := UpdateData{
MerchantName: "Acme Store",
BusinessHandle: "acme-store",
ModeOfPayments: []string{"CREDIT_CARD", "DEBIT_CARD", "GCASH"},
Currency: "PHP",
Tin: "123456789012",
Industry: "Retail",
ServiceDescription: "Online retail store selling electronics and gadgets",
IsBrickAndMortarStore: true,
Address: Address{
Office: OfficeAddress{
City: "Manila",
Line1: "123 Main Street",
BuildingNameAndNumber: "Building A",
State: "Metro Manila",
PostalCode: "1000",
ContactNumber: "639171234567",
Barangay: "Barangay 1",
},
},
Representatives: Representatives{
Authorized: AuthorizedRep{
FirstName: "Juan",
LastName: "Dela Cruz",
EmailAddress: "juan@acme.com",
ContactNumber: "639171234567",
DateOfBirth: "1985-05-15",
Position: "CEO",
},
},
Banks: []BankAccount{
{
AccountDepositType: "BANK",
AccountType: "SAVINGS",
BankName: "BDO",
AccountName: "Acme Corporation",
AccountNumber: "1234567890",
Currency: "PHP",
PreferredSettlementRail: "instapay",
},
},
}
jsonData, err := json.Marshal(updateData)
if err != nil {
fmt.Printf(" Error marshaling JSON: %v\n", err)
return
}
url := fmt.Sprintf("https://kyc.sbx.moduluslabs.io/v2/onboard/%s", refNo)
req, err := http.NewRequest("PUT", url, bytes.NewBuffer(jsonData))
if err != nil {
fmt.Printf(" Error creating request: %v\n", err)
return
}
req.Header.Set("Authorization", "Bearer "+bearerToken)
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Printf(" Error making request: %v\n", err)
return
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Printf(" Error reading response: %v\n", err)
return
}
if resp.StatusCode == 200 {
var response Response
if err := json.Unmarshal(body, &response); err != nil {
fmt.Printf(" Error parsing response: %v\n", err)
return
}
fmt.Println(" Update successful!")
fmt.Printf("New Status: %s\n", response.OnboardingStatus)
fmt.Printf("Reference Number: %s\n", response.OnboardingReferenceNumber)
} else {
var errorResponse ErrorResponse
if err := json.Unmarshal(body, &errorResponse); err != nil {
fmt.Printf(" Error parsing error response: %v\n", err)
return
}
fmt.Printf(" Update failed: %s\n", errorResponse.Message)
fmt.Printf("Status Code: %d\n", resp.StatusCode)
}
}
using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
class Program
{
private static readonly string BEARER_TOKEN = Environment.GetEnvironmentVariable("BEARER_TOKEN");
private static readonly string REF_NO = "550e8400-e29b-41d4-a716-446655440000";
static async Task Main(string[] args)
{
var updateData = new
{
merchantName = "Acme Store",
businessHandle = "acme-store",
modeOfPayments = new[] { "CREDIT_CARD", "DEBIT_CARD", "GCASH" },
currency = "PHP",
tin = "123456789012",
industry = "Retail",
serviceDescription = "Online retail store selling electronics and gadgets",
isBrickAndMortarStore = true,
address = new
{
office = new
{
city = "Manila",
line1 = "123 Main Street",
buildingNameAndNumber = "Building A",
state = "Metro Manila",
postalCode = "1000",
contactNumber = "639171234567",
barangay = "Barangay 1"
}
},
representatives = new
{
authorized = new
{
firstName = "Juan",
lastName = "Dela Cruz",
emailAddress = "juan@acme.com",
contactNumber = "639171234567",
dateOfBirth = "1985-05-15",
position = "CEO"
}
},
banks = new[]
{
new
{
accountDepositType = "BANK",
accountType = "SAVINGS",
bankName = "BDO",
accountName = "Acme Corporation",
accountNumber = "1234567890",
currency = "PHP",
preferredSettlementRail = "instapay"
}
}
};
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", $"Bearer {BEARER_TOKEN}");
var json = JsonSerializer.Serialize(updateData);
var content = new StringContent(json, Encoding.UTF8, "application/json");
try
{
var response = await client.PutAsync(
$"https://kyc.sbx.moduluslabs.io/v2/onboard/{REF_NO}",
content
);
var responseBody = await response.Content.ReadAsStringAsync();
if (response.IsSuccessStatusCode)
{
using var doc = JsonDocument.Parse(responseBody);
var root = doc.RootElement;
Console.WriteLine(" Update successful!");
Console.WriteLine($"New Status: {root.GetProperty("onboardingStatus").GetString()}");
Console.WriteLine($"Reference Number: {root.GetProperty("onboardingReferenceNumber").GetString()}");
}
else
{
using var doc = JsonDocument.Parse(responseBody);
var root = doc.RootElement;
Console.WriteLine($" Update failed: {root.GetProperty("message").GetString()}");
Console.WriteLine($"Status Code: {(int)response.StatusCode}");
}
}
catch (Exception ex)
{
Console.WriteLine($" Error: {ex.Message}");
}
}
}
Response
Success Response
Status Code:200 OK
PENDING (for regular users)Regular users: Status changes from DECLINED → PENDING
Super Admins: Status remains APPROVED"550e8400-e29b-41d4-a716-446655440000"{
"onboardingStatus": "PENDING",
"onboardingReferenceNumber": "550e8400-e29b-41d4-a716-446655440000"
}
Error Responses
400 Bad Request - Not Declined (Regular User)
400 Bad Request - Not Declined (Regular User)
400{
"statusCode": 400,
"message": "Unable to update. Merchant is not in declined status.",
"error": "Bad Request"
}
400 Bad Request - Not Approved (Super Admin)
400 Bad Request - Not Approved (Super Admin)
400{
"statusCode": 400,
"message": "Unable to update. Merchant is not in approved status.",
"error": "Bad Request"
}
400 Bad Request - Validation Error
400 Bad Request - Validation Error
400{
"statusCode": 400,
"message": "merchantName is required.",
"error": "Bad Request"
}
400 Bad Request - Business Handle Taken
400 Bad Request - Business Handle Taken
400{
"statusCode": 400,
"message": "Business handle is not available",
"error": "Bad Request"
}
400 Bad Request - Invalid Reference Number
400 Bad Request - Invalid Reference Number
400{
"statusCode": 400,
"message": "Invalid onboarding reference number format",
"error": "Bad Request",
"details": {
"refNumReceived": "invalid-uuid"
}
}
400 Bad Request - Record Does Not Exist
400 Bad Request - Record Does Not Exist
400{
"statusCode": 400,
"message": "Onboarding record does not exist",
"error": "Bad Request"
}
400 Bad Request - Reference Number Mismatch
400 Bad Request - Reference Number Mismatch
400{
"statusCode": 400,
"message": "Onboarding reference number mismatch",
"error": "Bad Request",
"details": {
"refNumReceived": "550e8400-e29b-41d4-a716-446655440000"
}
}
400 Bad Request - Update Failed
400 Bad Request - Update Failed
400{
"statusCode": 400,
"message": "Failed to update onboarding record",
"error": "Bad Request"
}
401 Unauthorized
401 Unauthorized
401{
"statusCode": 401,
"message": "Account not found",
"error": "Unauthorized"
}
Transaction Behavior
- Validating all request parameters
- Checking user authorization and merchant status
- Updating business information
- Updating incorporators and signatories
- Updating addresses and representatives
- Updating bank accounts
- Changing status to PENDING (for regular users)
Validation Rules Summary
Business Type
legalName and businessHandleBank Accounts
NO_ACCOUNT: bankName, accountName, accountNumber, currency requiredBank Type
accountDepositType is BANK: accountType is also requiredWebsite
businessWebsiteUrl provided: isBusinessWebsiteUnderDevelopment requiredStatus Change Flow
Merchant is DECLINED
Merchant Updates Data
Status Changes to PENDING
Admin Re-reviews
Best Practices
Retrieve Current Data First
Retrieve Current Data First
// 1. Get current data
const currentData = await retrieveOnboardingData(refNo);
// 2. Let user edit the data
const updatedData = await showEditForm(currentData);
// 3. Submit the update
const result = await updateOnboardingData(refNo, updatedData);
Check Declined Reason
Check Declined Reason
const status = await getOnboardingStatus(refNo);
if (status.onboardingStatus === 'DECLINED') {
console.log('Reason:', status.declinedReason);
// Show decline reason to user
// Highlight fields that need correction
}
Validate Before Submitting
Validate Before Submitting
function validateOnboardingData(data) {
const errors = [];
if (!data.merchantName) {
errors.push('Merchant name is required');
}
if (!data.tin || !/^\d+$/.test(data.tin)) {
errors.push('TIN must contain only numbers');
}
if (data.banks.length === 0) {
errors.push('At least one bank account is required');
}
return errors;
}
Handle Business Handle Conflicts
Handle Business Handle Conflicts
async function updateWithRetry(refNo, data) {
try {
return await updateOnboardingData(refNo, data);
} catch (error) {
if (error.message.includes('Business handle is not available')) {
// Suggest alternative handles
data.businessHandle = `${data.businessHandle}-${Date.now()}`;
return await updateOnboardingData(refNo, data);
}
throw error;
}
}
Preserve Optional Fields
Preserve Optional Fields
// Don't just update changed fields
const updateData = {
...currentData, // Start with all current data
...changedFields, // Override with changes
// This preserves optional fields like websites, signatories, etc.
};
Use Cases
Fix Declined Application
Update Business Info
Add Missing Documents
Correct Validation Errors
Troubleshooting
Cannot Update APPROVED Merchant
Cannot Update APPROVED Merchant
Unable to update. Merchant is not in declined status.Issue: Regular users cannot update approved merchantsSolution:- Only DECLINED merchants can be updated by regular users
- If you need to update an APPROVED merchant, contact a Super Admin
- To update business details after approval, create a new onboarding request
Transaction Keeps Rolling Back
Transaction Keeps Rolling Back
Failed to update onboarding recordPossible Causes:- Database connectivity issues
- Data integrity constraints violated
- Concurrent updates from multiple sources
- Retry the request after a short delay
- Ensure no concurrent updates are happening
- Contact support if issue persists
Validation Errors on Update
Validation Errors on Update
merchantName is requiredSolution:- Ensure ALL required fields from original onboarding are included
- Don’t just send changed fields - send complete data
- Use retrieve endpoint to get current data first
- Validate against the same rules as initial onboarding
Field Validation Reference
- Text Fields
- Enums
- Patterns
- Arrays
- First/Middle/Last Names: 1-100 chars, Unicode letters, spaces, hyphens, apostrophes
- Email: Valid email format, max 100 chars
- TIN: Numbers only, max 20 chars
- Postal Code: 4-10 digits, numbers only
- Contact Number: Numbers only, max 30 chars
- SSS: Exactly 10 digits
- accountDepositType: BANK, PAYMAYA, GCASH, NO_ACCOUNT
- accountType: SAVINGS, CHECKING_CURRENT
- currency: PHP, USD
- gender: MALE, FEMALE
- settlementRail: instapay, pesonet
- businessHandle:
^([A-Za-z]|[0-9]|_|-)+$ - bankCode:
^[A-Z0-9]{8,11}$ - tin:
^\d+$ - postalCode:
^\d+$ - contactNumber:
^\d+$
- modeOfPayments: Min 1 item
- banks: Min 1, Max 2 items
- incorporators: Min 1, Max 5 items (non-STARTER only)
- signatories: Min 1, Max 5 items
Next Steps
Retrieve Onboarding Data
Retrieve Status
Onboard Merchant
Error Handling
Authorizations
JWT Bearer token authentication
Path Parameters
The onboarding reference number (UUID v4 format)
Body
Trading name or DBA (Doing Business As) name
500List of accepted payment modes
1CREDIT_CARD, DEBIT_CARD, GCASH, GRABPAY, PAYMAYA, BANK_TRANSFER Primary currency for transactions
PHP, USD Tax Identification Number
20^\d+$Business industry category
200Description of services or products offered
Whether the business has a physical store location
Show child attributes
Show child attributes
Show child attributes
Show child attributes
List of bank accounts for settlement
1 - 2 elementsShow child attributes
Show child attributes
Legal registered name of the business (required for non-STARTER types)
500Unique business handle/slug for payment links (required for non-STARTER types)
^([A-Za-z]|[0-9]|_|-)+$List of business incorporators (for non-STARTER types)
1 - 5 elementsShow child attributes
Show child attributes
List of authorized signatories
1 - 5 elementsShow child attributes
Show child attributes
Show child attributes
Show child attributes
Was this page helpful?