Skip to main content
POST
/
v2
/
onboard
Onboard Merchant
curl --request POST \
  --url https://kyc.sbx.moduluslabs.io/v2/onboard \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "merchantName": "<string>",
  "modeOfPayments": [
    "CREDIT_CARD"
  ],
  "currency": "PHP",
  "tin": "<string>",
  "industry": "<string>",
  "serviceDescription": "<string>",
  "isBrickAndMortarStore": true,
  "address": {
    "office": {
      "city": "<string>",
      "line1": "<string>",
      "state": "<string>",
      "postalCode": "<string>",
      "contactNumber": "<string>",
      "barangay": "<string>",
      "buildingNameAndNumber": "<string>"
    },
    "registered": {
      "city": "<string>",
      "line1": "<string>",
      "state": "<string>",
      "postalCode": "<string>",
      "contactNumber": "<string>",
      "barangay": "<string>",
      "buildingNameAndNumber": "<string>"
    }
  },
  "representatives": {
    "authorized": {
      "firstName": "<string>",
      "lastName": "<string>",
      "emailAddress": "[email protected]",
      "contactNumber": "<string>",
      "dateOfBirth": "2023-12-25",
      "position": "<string>",
      "middleName": "<string>",
      "tin": "<string>",
      "sss": "<string>",
      "mothersMaidenName": "<string>",
      "gender": "MALE"
    },
    "escalation": {
      "firstName": "<string>",
      "lastName": "<string>",
      "emailAddress": "[email protected]",
      "contactNumber": "<string>",
      "dateOfBirth": "2023-12-25",
      "tin": "<string>",
      "sss": "<string>",
      "position": "<string>"
    }
  },
  "banks": [
    {
      "accountDepositType": "BANK",
      "currency": "PHP",
      "accountType": "SAVINGS",
      "bankName": "<string>",
      "accountName": "<string>",
      "accountNumber": "<string>",
      "preferredSettlementRail": "instapay",
      "bankCode": "<string>"
    }
  ],
  "legalName": "<string>",
  "businessHandle": "<string>",
  "incorporators": [
    {
      "firstName": "<string>",
      "lastName": "<string>",
      "emailAddress": "[email protected]",
      "contactNumber": "<string>",
      "dateOfBirth": "2023-12-25",
      "address": {
        "city": "<string>",
        "line1": "<string>",
        "state": "<string>",
        "postalCode": "<string>",
        "contactNumber": "<string>",
        "barangay": "<string>",
        "buildingNameAndNumber": "<string>"
      },
      "middleName": "<string>"
    }
  ],
  "signatories": [
    {
      "firstName": "<string>",
      "lastName": "<string>",
      "position": "<string>",
      "middleName": "<string>"
    }
  ],
  "websites": {
    "businessWebsiteUrl": "<string>",
    "isBusinessWebsiteUnderDevelopment": true,
    "facebookUrl": "<string>",
    "twitterUrl": "<string>",
    "instagramUrl": "<string>",
    "tiktokUrl": "<string>"
  }
}
'
{
  "referenceNumber": "0a17c362-fe5c-4889-9cb5-47df71dac425"
}

Overview

This endpoint onboards a merchant to accept various payment methods. Before calling this API, you must upload all required documents using the File Upload API based on the business type.
Document verification required: The API verifies that all required documents have been uploaded for the selected business type. If documents are missing, the request will fail.

Prerequisites

1

Create Account

Create a merchant account using the Create Account API to obtain an Account ID
2

Upload Documents

Upload required KYC documents via File Upload API (requirements vary by business type)
3

Generate JWT Token

Create a JWT Bearer Token with the Account ID and email (see Authentication)
4

Submit Onboarding

Call this endpoint with complete merchant details

Authentication

This endpoint requires JWT Bearer Token authentication. See the Authentication Guide for details.
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Request Parameters

Core Business Information

businessType
string
required
Type of business entity. Determines which fields are required.Values: STARTER, SOLE_PROPRIETOR, PARTNERSHIP, CORPORATIONSee Business Type Enum for details.Example: "STARTER"
Registered business or legal nameLength: 1-500 charactersRequired when: businessType is SOLE_PROPRIETOR, PARTNERSHIP, or CORPORATIONNot required for: STARTER business typeExample: "Starbucks Corporation"
merchantName
string
required
Merchant display name (used in customer-facing transactions)Length: 1-500 charactersExample: "Starbucks"
modeOfPayments
string[]
required
Payment methods to enable for the merchantValues: TERMINAL, ECOM, PAYMENT_LINK, QRPH, PAY_WITH_MAYAExample: ["ECOM", "QRPH"]See Mode of Payment Enum for descriptions.
currency
string
required
Currency for customer transactions (not settlement)Length: Exactly 3 charactersValues: PHP, USDDefault: PHPExample: "PHP"
tin
string
required
Company Tax Identification NumberLength: 9-12 digitsFormat: Numbers only (no dashes or spaces)Example: "455691852"
industry
string
required
Industry or sector of the businessLength: 1-200 charactersExample: "Food and Beverage"
serviceDescription
string
required
Brief description of business operations and servicesExample: "Coffee shop specializing in specialty beverages and light meals"
isBrickAndMortarStore
boolean
required
Indicates if business has a physical storefrontExample: true

Incorporators

incorporators
array
Array of business incorporators/ownersMin: 0, Max: 5Requirements by business type:
  • STARTER: Not required (don’t include this field)
  • SOLE_PROPRIETOR: Exactly 1 incorporator required
  • PARTNERSHIP: Exactly 2 incorporators required
  • CORPORATION: Minimum 3 incorporators required

Signatories

signatories
array
Array of authorized signatoriesMin: 0, Max: 5

Address

address
object
required
Business address information

Websites

websites
object
Business online presence

Representatives

representatives
object
required
Authorized representatives

Bank Accounts

banks
array
required
Settlement bank accounts (at least one required)

Response

Success Response

Status Code: 200 OK
referenceNumber
string
Unique reference number for the onboarding record generated by Modulus LabsUsage: Keep this reference number for status queries and support requestsExample: "0a17c362-fe5c-4889-9cb5-47df71dac425"
{
  "referenceNumber": "0a17c362-fe5c-4889-9cb5-47df71dac425"
}
{
  "referenceNumber": "0a17c362-fe5c-4889-9cb5-47df71dac425"
}

Error Responses

See Error Handling for complete error code reference.
{
  "code": "20000004",
  "error": "Please upload idsOfValidSignatories file/s before accessing this API.",
  "referenceNumber": "02383ca9-8d72-47e2-9dcb-23e535a96122"
}
Cause: Required documents not uploaded for the business typeSolution: Upload all required documents via File Upload API first
{
  "code": "20000005",
  "error": "Invalid incorporator count for CORPORATION business type. Minimum 3 required.",
  "referenceNumber": "abc123-def456-ghi789"
}
Cause: Request parameters don’t meet validation rulesSolution: Check business type requirements and parameter constraints
{
  "code": "20000001",
  "error": "Invalid or expired JWT token",
  "referenceNumber": "xyz789-abc123-def456"
}
Cause: JWT token is invalid or expiredSolution: Generate a new JWT token with correct credentials

Code Examples

# First, generate JWT token (use script or online tool)
TOKEN="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."

curl -X POST https://kyc.sbx.moduluslabs.io/v2/onboard \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "businessType": "STARTER",
    "merchantName": "Starbucks",
    "modeOfPayments": ["ECOM"],
    "currency": "PHP",
    "tin": "455691852",
    "industry": "Food and Beverage",
    "serviceDescription": "Specialty coffee retailer",
    "isBrickAndMortarStore": true,
    "address": {
      "office": {
        "city": "Portland",
        "line1": "111 Clarence Basler Rd",
        "state": "Oregon(OR)",
        "postalCode": "97030",
        "contactNumber": "639865748123",
        "barangay": "Wilmington II"
      }
    },
    "representatives": {
      "authorized": {
        "firstName": "David",
        "lastName": "Haven",
        "emailAddress": "[email protected]",
        "contactNumber": "09789364458",
        "dateOfBirth": "1988-02-12T16:00:00.000Z",
        "position": "Accountant"
      }
    },
    "banks": [
      {
        "accountDepositType": "GCASH",
        "bankName": "GCASH",
        "accountName": "Starbucks Corporation",
        "accountNumber": "09260000000"
      }
    ]
  }'

Business Type Examples

{
  "businessType": "STARTER",
  "merchantName": "My Coffee Shop",
  "modeOfPayments": ["ECOM", "QRPH"],
  "currency": "PHP",
  "tin": "123456789",
  "industry": "Food and Beverage",
  "serviceDescription": "Local coffee shop",
  "isBrickAndMortarStore": true,
  "address": {
    "office": { /* required */ }
  },
  "representatives": {
    "authorized": { /* required */ }
  },
  "banks": [ /* at least one required */ ]
}
Starter businesses don’t require legalName, incorporators, or registered address.

Best Practices

Upload Documents First

Always upload required KYC documents before calling this API

Validate Before Submit

Validate all parameters client-side to catch errors early

Use Correct Business Type

Choose the appropriate business type and provide required fields

Test with Sandbox

Test thoroughly in sandbox before going to production

Store Reference Number

Save the returned reference number for status tracking

Handle Errors Gracefully

Implement proper error handling and user feedback

Validation Checklist

Before submitting:
1

Business Type

✓ Business type matches merchant entity type ✓ All required fields for business type are included
2

Incorporators

✓ Correct number of incorporators for business type ✓ All incorporator fields complete and valid
3

Addresses

✓ Office address complete ✓ Registered address included if not STARTER ✓ All numeric fields contain only digits
4

Bank Accounts

✓ At least one bank account provided ✓ Bank name matches account deposit type ✓ All required fields for deposit type included
5

Documents

✓ All required documents uploaded via File Upload API ✓ Document types match business type requirements

Next Steps

Authorizations

Authorization
string
header
required

JWT Bearer token authentication

Body

application/json
merchantName
string
required

Trading name or DBA (Doing Business As) name

Maximum string length: 500
modeOfPayments
enum<string>[]
required

List of accepted payment modes

Minimum array length: 1
Available options:
CREDIT_CARD,
DEBIT_CARD,
GCASH,
GRABPAY,
PAYMAYA,
BANK_TRANSFER
currency
enum<string>
required

Primary currency for transactions

Available options:
PHP,
USD
tin
string
required

Tax Identification Number

Maximum string length: 20
industry
string
required

Business industry category

Maximum string length: 200
serviceDescription
string
required

Description of services or products offered

isBrickAndMortarStore
boolean
required

Whether the business has a physical store location

address
object
required
representatives
object
required
banks
object[]
required

List of bank accounts for settlement

Required array length: 1 - 2 elements

Legal registered name of the business (required for non-STARTER types)

Maximum string length: 500
businessHandle
string

Unique business handle/slug for payment links (required for non-STARTER types)

incorporators
object[]

List of business incorporators (for non-STARTER types)

Required array length: 1 - 5 elements
signatories
object[]

List of authorized signatories

Required array length: 1 - 5 elements
websites
object

Response

Onboarding application submitted successfully

onboardingStatus
enum<string>

Initial status of the onboarding application

Available options:
NEW
onboardingReferenceNumber
string<uuid>

Unique reference number for the onboarding record