Skip to main content

Bridge Module

The bridge module handles Bridge PSP customer integration and status management for payment service provider operations.

Import

const bridge = await brdzSDK.bridge;

Methods Overview

MethodDescriptionAuth RequiredHTTP Endpoint
createBridgeCustomerCreate Bridge customerPOST /bridge/customers
getBridgeStatusGet Bridge customer statusGET /bridge/status
syncBridgeStatusSync Bridge statusGET /bridge/status/sync
getBridgeModeGet Bridge environment modeGET /bridge/mode

createBridgeCustomer

Create a new Bridge customer for sandbox environment. Builds customer payload from user data and creates customer via Bridge service.

Syntax

const result = await bridge.createBridgeCustomer(data);

Parameters

ParameterTypeRequiredDescription
dataobjectCustomer creation data
data.user_idnumberUser ID to create Bridge customer for

Returns

Promise<{
id: string;
status: string;
type: string;
created_at: string;
kyc_status: string;
signed_agreement_id: string;
capabilities: Array<object>;
external_accounts: Array<object>;
}>

Example

try {
const bridgeCustomer = await bridge.createBridgeCustomer({
user_id: 123
});

console.log('Bridge Customer ID:', bridgeCustomer.id);
console.log('Status:', bridgeCustomer.status);
console.log('KYC Status:', bridgeCustomer.kyc_status);
console.log('Agreement ID:', bridgeCustomer.signed_agreement_id);

// Store bridge customer ID for future reference
localStorage.setItem('bridge_customer_id', bridgeCustomer.id);

} catch (error) {
console.error('Bridge customer creation failed:', error.message);

if (error.message.includes('Missing user_id')) {
console.error('user_id is required in request body');
}
}

HTTP Endpoint

  • Method: POST
  • URL: https://api.brdz.link/api/bridge/customers
  • Headers: Authorization: Bearer <JWT_TOKEN>, x-api-key required

getBridgeStatus

Check Bridge customer status from database and fetch real-time status from Bridge API.

Syntax

const result = await bridge.getBridgeStatus(params);

Parameters

ParameterTypeRequiredDescription
paramsobjectQuery parameters
params.user_idnumberUser ID to get Bridge status for

Returns

Promise<{
id: string;
status: string;
type: string;
kyc_status: string;
capabilities: Array<{
id: string;
status: string;
supported_currencies: Array<string>;
}>;
external_accounts: Array<{
id: string;
type: string;
status: string;
currency: string;
}>;
verification: {
identity_status: string;
documents_status: string;
risk_assessment: string;
};
created_at: string;
updated_at: string;
}>

Example

try {
const bridgeStatus = await bridge.getBridgeStatus({
user_id: 123
});

console.log('Bridge Status:', bridgeStatus.status);
console.log('KYC Status:', bridgeStatus.kyc_status);
console.log('Capabilities:', bridgeStatus.capabilities.length);

// Check specific capabilities
const canSendFunds = bridgeStatus.capabilities.some(cap =>
cap.id === 'cap_send_funds' && cap.status === 'enabled'
);

const canReceiveFunds = bridgeStatus.capabilities.some(cap =>
cap.id === 'cap_receive_funds' && cap.status === 'enabled'
);

console.log('Can send funds:', canSendFunds);
console.log('Can receive funds:', canReceiveFunds);

// Display verification status
if (bridgeStatus.verification) {
console.log('Identity verified:', bridgeStatus.verification.identity_status === 'verified');
console.log('Documents verified:', bridgeStatus.verification.documents_status === 'verified');
console.log('Risk assessment:', bridgeStatus.verification.risk_assessment);
}

} catch (error) {
console.error('Failed to get Bridge status:', error.message);

if (error.message.includes('User not onboarded to Bridge')) {
console.error('User needs to create Bridge customer first');
}
}

HTTP Endpoint

  • Method: GET
  • URL: https://api.brdz.link/api/bridge/status
  • Headers: Authorization: Bearer <JWT_TOKEN>, x-api-key required

syncBridgeStatus

Synchronize Bridge PSP integration status for specific user. Fetches latest status from Bridge API and updates local database.

Syntax

const result = await bridge.syncBridgeStatus(params);

Parameters

ParameterTypeRequiredDescription
paramsobjectQuery parameters
params.user_idnumberUser ID to sync Bridge status for

Returns

Promise<{
user_id: number;
bridge_customer_id: string;
sync_status: string;
previous_status: string;
current_status: string;
capabilities_updated: boolean;
changes_detected: Array<{
field: string;
from: any;
to: any;
}>;
sync_timestamp: string;
}>

Example

try {
const syncResult = await bridge.syncBridgeStatus({
user_id: 123
});

console.log('Sync Status:', syncResult.sync_status);
console.log('Status Change:', `${syncResult.previous_status}${syncResult.current_status}`);
console.log('Capabilities Updated:', syncResult.capabilities_updated);

if (syncResult.changes_detected.length > 0) {
console.log('Changes detected:');
syncResult.changes_detected.forEach(change => {
console.log(` ${change.field}: ${change.from}${change.to}`);
});

// Handle specific changes
const kycChange = syncResult.changes_detected.find(c => c.field === 'kyc_status');
if (kycChange && kycChange.to === 'approved') {
console.log('🎉 KYC has been approved!');
// Trigger UI update or notification
notifyKycApproved();
}
} else {
console.log('No changes detected since last sync');
}

} catch (error) {
console.error('Bridge status sync failed:', error.message);
}

HTTP Endpoint

  • Method: GET
  • URL: https://api.brdz.link/api/bridge/status/sync
  • Headers: Authorization: Bearer <JWT_TOKEN>, x-api-key required

getBridgeMode

Get current Bridge environment mode (Sandbox or Production).

Syntax

const result = await bridge.getBridgeMode();

Parameters

None.

Returns

Promise<{
mode: string; // "sandbox" | "production"
}>

Example

try {
const modeResult = await bridge.getBridgeMode();

console.log('Bridge Mode:', modeResult.mode);

// Environment-specific handling
if (modeResult.mode === 'sandbox') {
console.log('⚠️ Running in Sandbox mode - test data only');
showSandboxWarning();
} else {
console.log('✅ Running in Production mode - live transactions');
enableProductionFeatures();
}

// Store mode for conditional logic
window.bridgeMode = modeResult.mode;

} catch (error) {
console.error('Failed to get Bridge mode:', error.message);
// Default to sandbox for safety
window.bridgeMode = 'sandbox';
}

HTTP Endpoint

  • Method: GET
  • URL: https://api.brdz.link/api/bridge/mode
  • Headers: Authorization: Bearer <JWT_TOKEN>, x-api-key required

Complete Bridge Integration Example

Bridge Customer Management

class BridgeManager {
constructor(sdk) {
this.sdk = sdk;
}

async onboardCustomer(userId) {
const bridge = await this.sdk.bridge;

try {
// Check current mode
const mode = await bridge.getBridgeMode();
console.log(`Operating in ${mode.mode} mode`);

// Create Bridge customer
const customer = await bridge.createBridgeCustomer({
user_id: userId
});

console.log('Bridge customer created:', customer.id);

// Initial status check
const status = await bridge.getBridgeStatus({
user_id: userId
});

return {
customer,
status,
mode: mode.mode
};
} catch (error) {
throw new Error(`Bridge onboarding failed: ${error.message}`);
}
}

async monitorCustomerStatus(userId) {
const bridge = await this.sdk.bridge;

try {
// Get current status
const currentStatus = await bridge.getBridgeStatus({
user_id: userId
});

// Sync with Bridge API for latest updates
const syncResult = await bridge.syncBridgeStatus({
user_id: userId
});

return {
current: currentStatus,
sync: syncResult,
hasChanges: syncResult.changes_detected.length > 0
};
} catch (error) {
throw new Error(`Status monitoring failed: ${error.message}`);
}
}

async pollStatusUpdates(userId, intervalMs = 30000) {
const bridge = await this.sdk.bridge;

const poll = async () => {
try {
const syncResult = await bridge.syncBridgeStatus({
user_id: userId
});

if (syncResult.changes_detected.length > 0) {
console.log('Bridge status updated:', syncResult.changes_detected);

// Handle specific status changes
this.handleStatusChanges(syncResult.changes_detected);
}

// Continue polling if not verified
if (syncResult.current_status !== 'verified') {
setTimeout(poll, intervalMs);
} else {
console.log('Customer fully verified - stopping polling');
}

} catch (error) {
console.error('Polling error:', error.message);
// Retry in case of temporary error
setTimeout(poll, intervalMs * 2);
}
};

// Start polling
poll();
}

handleStatusChanges(changes) {
changes.forEach(change => {
switch (change.field) {
case 'kyc_status':
if (change.to === 'approved') {
this.notifyKycApproved();
} else if (change.to === 'rejected') {
this.notifyKycRejected();
}
break;

case 'capabilities':
if (change.to.includes('cap_send_funds')) {
this.enableSendFunds();
}
if (change.to.includes('cap_receive_funds')) {
this.enableReceiveFunds();
}
break;

default:
console.log(`Status change: ${change.field} = ${change.to}`);
}
});
}

notifyKycApproved() {
console.log('🎉 KYC Approved - Full Bridge features available');
// Update UI, send notification, etc.
}

notifyKycRejected() {
console.log('❌ KYC Rejected - Review required');
// Show rejection reason, guide user to resubmit
}

enableSendFunds() {
console.log('✅ Send funds capability enabled');
// Enable send money features in UI
}

enableReceiveFunds() {
console.log('✅ Receive funds capability enabled');
// Enable receive money features in UI
}
}

// Usage Example
const bridgeManager = new BridgeManager(brdzSDK);

// Onboard new customer
bridgeManager.onboardCustomer(123)
.then(result => {
console.log('Onboarding complete:', result);

// Start monitoring status
bridgeManager.pollStatusUpdates(123);
})
.catch(error => {
console.error('Onboarding failed:', error.message);
});

// Manual status check
bridgeManager.monitorCustomerStatus(123)
.then(result => {
console.log('Current status:', result.current.status);
console.log('Has changes:', result.hasChanges);
})
.catch(error => {
console.error('Status check failed:', error.message);
});

Environment-Aware Integration

// Environment detection and handling
async function initializeBridge() {
const bridge = await brdzSDK.bridge;

try {
const mode = await bridge.getBridgeMode();

// Configure app based on mode
const config = {
sandbox: {
showTestWarnings: true,
enableDebugLogging: true,
mockData: true
},
production: {
showTestWarnings: false,
enableDebugLogging: false,
mockData: false
}
};

const appConfig = config[mode.mode] || config.sandbox;

// Apply configuration
window.bridgeConfig = {
mode: mode.mode,
...appConfig
};

if (appConfig.showTestWarnings) {
showBanner('⚠️ Sandbox Mode - Test Environment Only');
}

return appConfig;
} catch (error) {
console.error('Bridge initialization failed:', error.message);
// Default to sandbox for safety
return config.sandbox;
}
}

// Initialize on app start
initializeBridge().then(config => {
console.log('Bridge initialized with config:', config);
});

Bridge Status Lifecycle

Customer Status Flow

  1. not_started → Customer created, verification not begun
  2. pending_verification → Documents submitted, under review
  3. verified → Customer approved, capabilities enabled
  4. rejected → Verification failed, review required

Capability Management

Capabilities are enabled as verification progresses:

  • cap_send_funds: Send money to external accounts
  • cap_receive_funds: Receive money from external sources
  • cap_card_payments: Process card transactions
  • cap_ach_transfers: ACH bank transfers

Error Handling

Common Errors

ErrorDescriptionSolution
400: Missing user_idRequired parameter missingInclude user_id in request
404: User not onboardedNo Bridge customer recordCreate customer first
500: Bridge API errorExternal service errorCheck Bridge API status
500: Database errorLocal database failureRetry operation

Error Handling Pattern

try {
const result = await bridge.createBridgeCustomer({ user_id: 123 });
} catch (error) {
if (error.message.includes('Missing user_id')) {
// Handle validation error
showValidationError('User ID is required');
} else if (error.message.includes('User not onboarded')) {
// Handle onboarding requirement
redirectToOnboarding();
} else if (error.message.includes('Bridge API error')) {
// Handle external service error
showServiceError('Bridge service temporarily unavailable');
} else {
// Handle generic error
showGenericError(error.message);
}
}

Integration Notes

Database Integration

  • bridge_customers: Maps local users to Bridge customer IDs
  • Activity Logging: Bridge operations logged for audit
  • Status Sync: Regular synchronization with Bridge API

PSP Features

  • Customer Onboarding: Automated KYC/AML verification
  • Capability Management: Progressive feature enablement
  • Compliance: Regulatory compliance handled by Bridge
  • Transaction Processing: Payment capabilities via Bridge

Bridge Integration

Bridge handles complex PSP compliance and verification, allowing focus on core business features.

Sandbox Mode

Sandbox mode uses test data only. No real money movement or actual verification occurs.

Status Monitoring

Use regular status sync to keep local records current with Bridge verification progress.