Descripción General
Esta guía proporciona una implementación completa lista para producción de verificación KYB (Know Your Business) utilizando la API de gu1. Puedes copiar y adaptar este código para tu aplicación.Requisitos Previos
- Clave API de gu1 (obtén una aquí)
- Node.js 18+ o Python 3.8+
- Conocimiento básico de APIs RESTful
Implementación Completa
Node.js / TypeScript
Implementación completa de KYB con TypeScript:Copy
Ask AI
import axios from 'axios';
import FormData from 'form-data';
import fs from 'fs';
const GUENO_API_KEY = process.env.GUENO_API_KEY;
const GUENO_API_URL = 'http://api.gu1.ai';
// API Client Setup
const apiClient = axios.create({
baseURL: GUENO_API_URL,
headers: {
'Authorization': `Bearer ${GUENO_API_KEY}`,
'Content-Type': 'application/json'
}
});
// Types
interface BusinessApplication {
businessId: string;
legalName: string;
tradeName: string;
taxId: string;
countryCode: string;
incorporationDate: string;
industry: string;
website?: string;
employeeCount?: number;
revenue?: number;
address: {
street: string;
city: string;
state: string;
postalCode: string;
country: string;
};
contactEmail: string;
contactPhone: string;
expectedMonthlyVolume: number;
beneficialOwners: BeneficialOwner[];
documents: DocumentUpload[];
}
interface BeneficialOwner {
firstName: string;
lastName: string;
dateOfBirth: string;
nationality: string;
ownershipPercentage: number;
isPEP: boolean;
idNumber?: string;
}
interface DocumentUpload {
type: string;
filePath: string;
}
interface KYBResult {
success: boolean;
entityId: string;
status: 'approved' | 'pending' | 'rejected' | 'manual_review';
riskScore: number;
findings: any;
nextSteps: string[];
}
// Main KYB Workflow Class
class KYBProcessor {
/**
* Paso 1: Crear Entidad Empresarial
*/
async createBusinessEntity(application: BusinessApplication): Promise<any> {
console.log('📋 Creando entidad empresarial...');
const response = await apiClient.post('/entities', {
type: 'company',
externalId: application.businessId,
name: application.legalName,
taxId: application.taxId,
countryCode: application.countryCode,
entityData: {
company: {
legalName: application.legalName,
tradeName: application.tradeName,
incorporationDate: application.incorporationDate,
industry: application.industry,
employeeCount: application.employeeCount,
revenue: application.revenue
}
},
attributes: {
website: application.website,
registeredAddress: application.address,
contactEmail: application.contactEmail,
contactPhone: application.contactPhone,
expectedMonthlyVolume: application.expectedMonthlyVolume,
applicationDate: new Date().toISOString()
}
});
console.log(`✅ Entidad creada: ${response.data.entity.id}`);
return response.data.entity;
}
/**
* Paso 2: Cargar Documentos de Verificación
*/
async uploadDocuments(entityId: string, documents: DocumentUpload[]): Promise<any[]> {
console.log(`📄 Cargando ${documents.length} documentos...`);
const uploadResults = [];
for (const doc of documents) {
const formData = new FormData();
formData.append('file', fs.createReadStream(doc.filePath));
formData.append('documentType', doc.type);
formData.append('entityId', entityId);
const response = await axios.post(
`${GUENO_API_URL}/documents`,
formData,
{
headers: {
'Authorization': `Bearer ${GUENO_API_KEY}`,
...formData.getHeaders()
}
}
);
console.log(` ✅ Cargado: ${doc.type}`);
uploadResults.push(response.data);
}
return uploadResults;
}
/**
* Paso 3: Solicitar Análisis de IA
*/
async requestAIAnalysis(entityId: string): Promise<any> {
console.log('🤖 Solicitando análisis de IA...');
const response = await apiClient.post(`/entities/${entityId}/ai-analysis`, {
analysisType: 'kyb_verification',
includeDocuments: true,
checkSanctions: true,
checkAdverseMedia: true,
checkUBOs: true
});
console.log(`✅ Análisis completo. Puntuación de Riesgo: ${response.data.riskScore}`);
return response.data;
}
/**
* Paso 4: Verificar Beneficiarios Finales
*/
async verifyBeneficialOwners(entityId: string, owners: BeneficialOwner[]): Promise<any[]> {
console.log(`👥 Verificando ${owners.length} beneficiarios finales...`);
const verifiedOwners = [];
for (const owner of owners) {
// Crear entidad de persona para UBO
const uboResponse = await apiClient.post('/entities', {
type: 'person',
externalId: `ubo_${entityId}_${owner.idNumber}`,
name: `${owner.firstName} ${owner.lastName}`,
countryCode: owner.nationality,
entityData: {
person: {
firstName: owner.firstName,
lastName: owner.lastName,
dateOfBirth: owner.dateOfBirth,
nationality: owner.nationality
}
},
attributes: {
ownershipPercentage: owner.ownershipPercentage,
isPEP: owner.isPEP,
relationshipToCompany: 'beneficial_owner'
}
});
const ubo = uboResponse.data.entity;
// Ejecutar verificación KYC en UBO
const kycResponse = await apiClient.post(`/entities/${ubo.id}/ai-analysis`, {
analysisType: 'kyc_verification',
checkPEP: true,
checkSanctions: true
});
// Crear relación
await apiClient.post('/relationships', {
fromEntityId: entityId,
toEntityId: ubo.id,
relationshipType: 'beneficial_owner',
metadata: {
ownershipPercentage: owner.ownershipPercentage
}
});
console.log(` ✅ Verificado: ${owner.firstName} ${owner.lastName}`);
verifiedOwners.push({
...ubo,
kycStatus: kycResponse.data.status,
riskScore: kycResponse.data.riskScore
});
}
return verifiedOwners;
}
/**
* Paso 5: Tomar Decisión Basada en el Riesgo
*/
async makeDecision(entityId: string, analysis: any): Promise<string> {
console.log('⚖️ Tomando decisión KYB...');
const { riskScore, riskLevel } = analysis;
if (riskScore < 30) {
// Riesgo Bajo - Aprobación Automática
await this.approveEntity(entityId, analysis);
return 'approved';
} else if (riskScore < 70) {
// Riesgo Medio - Debida Diligencia Reforzada
await this.requestEnhancedDueDiligence(entityId, analysis);
return 'pending';
} else {
// Riesgo Alto - Revisión Manual
await this.flagForManualReview(entityId, analysis);
return 'manual_review';
}
}
/**
* Aprobar Entidad de Bajo Riesgo
*/
private async approveEntity(entityId: string, analysis: any): Promise<void> {
console.log('✅ Aprobando automáticamente entidad de bajo riesgo...');
// Actualizar estado de entidad
await apiClient.patch(`/entities/${entityId}`, {
attributes: {
kybStatus: 'approved',
approvedAt: new Date().toISOString(),
approvedBy: 'automated_system',
riskLevel: 'low',
reviewNotes: 'Bajo riesgo - aprobado automáticamente basado en análisis de IA'
}
});
// Configurar monitoreo
await this.setupMonitoring(entityId);
// Enviar notificación
await this.sendStatusNotification(entityId, 'approved');
}
/**
* Solicitar Debida Diligencia Reforzada
*/
private async requestEnhancedDueDiligence(entityId: string, analysis: any): Promise<void> {
console.log('🔍 Solicitando debida diligencia reforzada...');
await apiClient.patch(`/entities/${entityId}`, {
attributes: {
kybStatus: 'enhanced_due_diligence',
requestedAt: new Date().toISOString(),
riskLevel: 'medium',
additionalDocsRequired: [
'financial_statements',
'ownership_structure',
'source_of_funds'
]
}
});
await this.sendStatusNotification(entityId, 'additional_info_required');
}
/**
* Marcar para Revisión Manual
*/
private async flagForManualReview(entityId: string, analysis: any): Promise<void> {
console.log('⚠️ Marcando para revisión manual...');
// Crear tarea de revisión
await apiClient.post('/tasks', {
type: 'manual_review',
entityId: entityId,
priority: 'high',
assignTo: 'compliance_team',
dueDate: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),
context: {
riskScore: analysis.riskScore,
riskFactors: analysis.riskFactors,
findings: analysis.findings
}
});
await apiClient.patch(`/entities/${entityId}`, {
attributes: {
kybStatus: 'manual_review',
flaggedAt: new Date().toISOString(),
riskLevel: 'high'
}
});
await this.sendStatusNotification(entityId, 'under_review');
}
/**
* Configurar Monitoreo Continuo
*/
private async setupMonitoring(entityId: string): Promise<void> {
console.log('📊 Configurando monitoreo continuo...');
await apiClient.post('/rules', {
name: `KYB Monitoring - ${entityId}`,
entityId: entityId,
active: true,
rules: [
{
type: 'sanctions_screening',
frequency: 'daily',
action: 'alert_compliance_team'
},
{
type: 'adverse_media',
frequency: 'weekly',
action: 'create_review_task'
},
{
type: 'ownership_changes',
frequency: 'realtime',
action: 'trigger_reverification'
}
]
});
}
/**
* Enviar Notificación de Estado
*/
private async sendStatusNotification(entityId: string, status: string): Promise<void> {
console.log(`📧 Enviando notificación de ${status}...`);
// Tu lógica de notificación aquí (email, webhook, etc.)
await apiClient.post('/webhooks/send', {
event: 'kyb_status_changed',
entityId: entityId,
status: status,
timestamp: new Date().toISOString()
});
}
/**
* Flujo de Trabajo KYB Completo
*/
async processKYB(application: BusinessApplication): Promise<KYBResult> {
try {
console.log('🚀 Iniciando proceso de verificación KYB...\n');
// Paso 1: Crear entidad
const entity = await this.createBusinessEntity(application);
// Paso 2: Cargar documentos
await this.uploadDocuments(entity.id, application.documents);
// Paso 3: Análisis de IA
const analysis = await this.requestAIAnalysis(entity.id);
// Paso 4: Verificar UBOs
const verifiedOwners = await this.verifyBeneficialOwners(
entity.id,
application.beneficialOwners
);
// Paso 5: Tomar decisión
const status = await this.makeDecision(entity.id, analysis);
console.log('\n✨ ¡Proceso KYB completado exitosamente!');
return {
success: true,
entityId: entity.id,
status: status as any,
riskScore: analysis.riskScore,
findings: analysis.findings,
nextSteps: analysis.nextSteps
};
} catch (error: any) {
console.error('❌ Proceso KYB falló:', error.message);
return {
success: false,
entityId: '',
status: 'rejected',
riskScore: 100,
findings: { error: error.message },
nextSteps: ['Contactar soporte']
};
}
}
}
// Example Usage
async function main() {
const kybProcessor = new KYBProcessor();
// Sample business application
const application: BusinessApplication = {
businessId: 'business_12345',
legalName: 'Tech Solutions Sociedade Anônima',
tradeName: 'Tech Solutions',
taxId: '12.345.678/0001-90',
countryCode: 'BR',
incorporationDate: '2020-06-15',
industry: 'Software Development',
website: 'https://techsolutions.com.br',
employeeCount: 50,
revenue: 5000000,
address: {
street: 'Av. Paulista, 1000',
city: 'São Paulo',
state: 'SP',
postalCode: '01310-100',
country: 'BR'
},
contactEmail: '[email protected]',
contactPhone: '+55 11 1234-5678',
expectedMonthlyVolume: 250000,
beneficialOwners: [
{
firstName: 'Carlos',
lastName: 'Silva',
dateOfBirth: '1975-08-22',
nationality: 'BR',
ownershipPercentage: 60,
isPEP: false,
idNumber: '123.456.789-00'
},
{
firstName: 'Ana',
lastName: 'Costa',
dateOfBirth: '1980-03-15',
nationality: 'BR',
ownershipPercentage: 40,
isPEP: false,
idNumber: '987.654.321-00'
}
],
documents: [
{ type: 'articles_of_incorporation', filePath: './docs/contrato_social.pdf' },
{ type: 'tax_certificate', filePath: './docs/cnpj_certificate.pdf' },
{ type: 'business_license', filePath: './docs/alvara.pdf' },
{ type: 'proof_of_address', filePath: './docs/comprovante.pdf' }
]
};
// Execute KYB workflow
const result = await kybProcessor.processKYB(application);
console.log('\n📊 Resultado Final:');
console.log(JSON.stringify(result, null, 2));
}
// Run the example
main().catch(console.error);
Implementación en Python
Flujo de trabajo KYB completo en Python:Copy
Ask AI
import requests
import os
from typing import List, Dict, Optional
from datetime import datetime, timedelta
GUENO_API_KEY = os.getenv('GUENO_API_KEY')
GUENO_API_URL = 'http://api.gu1.ai'
class KYBProcessor:
def __init__(self, api_key: str):
self.api_key = api_key
self.headers = {
'Authorization': f'Bearer {api_key}',
'Content-Type': 'application/json'
}
def create_business_entity(self, application: Dict) -> Dict:
"""Paso 1: Crear entidad empresarial"""
print('📋 Creando entidad empresarial...')
response = requests.post(
f'{GUENO_API_URL}/entities',
headers=self.headers,
json={
'type': 'company',
'externalId': application['business_id'],
'name': application['legal_name'],
'taxId': application['tax_id'],
'countryCode': application['country_code'],
'entityData': {
'company': {
'legalName': application['legal_name'],
'tradeName': application['trade_name'],
'incorporationDate': application['incorporation_date'],
'industry': application['industry'],
'employeeCount': application.get('employee_count'),
'revenue': application.get('revenue')
}
},
'attributes': {
'website': application.get('website'),
'registeredAddress': application['address'],
'contactEmail': application['contact_email'],
'contactPhone': application['contact_phone'],
'expectedMonthlyVolume': application['expected_monthly_volume'],
'applicationDate': datetime.now().isoformat()
}
}
)
response.raise_for_status()
entity = response.json()['entity']
print(f'✅ Entidad creada: {entity["id"]}')
return entity
def upload_documents(self, entity_id: str, documents: List[Dict]) -> List[Dict]:
"""Paso 2: Cargar documentos de verificación"""
print(f'📄 Cargando {len(documents)} documentos...')
upload_results = []
for doc in documents:
with open(doc['file_path'], 'rb') as file:
files = {'file': file}
data = {
'documentType': doc['type'],
'entityId': entity_id
}
response = requests.post(
f'{GUENO_API_URL}/documents',
headers={'Authorization': f'Bearer {self.api_key}'},
data=data,
files=files
)
response.raise_for_status()
print(f' ✅ Cargado: {doc["type"]}')
upload_results.append(response.json())
return upload_results
def request_ai_analysis(self, entity_id: str) -> Dict:
"""Paso 3: Solicitar análisis de IA"""
print('🤖 Solicitando análisis de IA...')
response = requests.post(
f'{GUENO_API_URL}/entities/{entity_id}/ai-analysis',
headers=self.headers,
json={
'analysisType': 'kyb_verification',
'includeDocuments': True,
'checkSanctions': True,
'checkAdverseMedia': True,
'checkUBOs': True
}
)
response.raise_for_status()
analysis = response.json()
print(f'✅ Análisis completo. Puntuación de Riesgo: {analysis["riskScore"]}')
return analysis
def verify_beneficial_owners(self, entity_id: str, owners: List[Dict]) -> List[Dict]:
"""Paso 4: Verificar beneficiarios finales"""
print(f'👥 Verificando {len(owners)} beneficiarios finales...')
verified_owners = []
for owner in owners:
# Crear entidad de persona para UBO
ubo_response = requests.post(
f'{GUENO_API_URL}/entities',
headers=self.headers,
json={
'type': 'person',
'externalId': f'ubo_{entity_id}_{owner["id_number"]}',
'name': f'{owner["first_name"]} {owner["last_name"]}',
'countryCode': owner['nationality'],
'entityData': {
'person': {
'firstName': owner['first_name'],
'lastName': owner['last_name'],
'dateOfBirth': owner['date_of_birth'],
'nationality': owner['nationality']
}
},
'attributes': {
'ownershipPercentage': owner['ownership_percentage'],
'isPEP': owner['is_pep'],
'relationshipToCompany': 'beneficial_owner'
}
}
)
ubo = ubo_response.json()['entity']
# Ejecutar verificación KYC
kyc_response = requests.post(
f'{GUENO_API_URL}/entities/{ubo["id"]}/ai-analysis',
headers=self.headers,
json={
'analysisType': 'kyc_verification',
'checkPEP': True,
'checkSanctions': True
}
)
# Crear relación
requests.post(
f'{GUENO_API_URL}/relationships',
headers=self.headers,
json={
'fromEntityId': entity_id,
'toEntityId': ubo['id'],
'relationshipType': 'beneficial_owner',
'metadata': {
'ownershipPercentage': owner['ownership_percentage']
}
}
)
print(f' ✅ Verificado: {owner["first_name"]} {owner["last_name"]}')
verified_owners.append({
**ubo,
'kycStatus': kyc_response.json()['status'],
'riskScore': kyc_response.json()['riskScore']
})
return verified_owners
def make_decision(self, entity_id: str, analysis: Dict) -> str:
"""Paso 5: Tomar decisión basada en el riesgo"""
print('⚖️ Tomando decisión KYB...')
risk_score = analysis['riskScore']
if risk_score < 30:
self.approve_entity(entity_id, analysis)
return 'approved'
elif risk_score < 70:
self.request_enhanced_due_diligence(entity_id, analysis)
return 'pending'
else:
self.flag_for_manual_review(entity_id, analysis)
return 'manual_review'
def approve_entity(self, entity_id: str, analysis: Dict):
"""Aprobar entidad de bajo riesgo"""
print('✅ Aprobando automáticamente entidad de bajo riesgo...')
requests.patch(
f'{GUENO_API_URL}/entities/{entity_id}',
headers=self.headers,
json={
'attributes': {
'kybStatus': 'approved',
'approvedAt': datetime.now().isoformat(),
'approvedBy': 'automated_system',
'riskLevel': 'low'
}
}
)
self.setup_monitoring(entity_id)
self.send_status_notification(entity_id, 'approved')
def request_enhanced_due_diligence(self, entity_id: str, analysis: Dict):
"""Solicitar debida diligencia reforzada"""
print('🔍 Solicitando debida diligencia reforzada...')
requests.patch(
f'{GUENO_API_URL}/entities/{entity_id}',
headers=self.headers,
json={
'attributes': {
'kybStatus': 'enhanced_due_diligence',
'requestedAt': datetime.now().isoformat(),
'riskLevel': 'medium',
'additionalDocsRequired': [
'financial_statements',
'ownership_structure',
'source_of_funds'
]
}
}
)
self.send_status_notification(entity_id, 'additional_info_required')
def flag_for_manual_review(self, entity_id: str, analysis: Dict):
"""Marcar para revisión manual"""
print('⚠️ Marcando para revisión manual...')
requests.post(
f'{GUENO_API_URL}/tasks',
headers=self.headers,
json={
'type': 'manual_review',
'entityId': entity_id,
'priority': 'high',
'assignTo': 'compliance_team',
'dueDate': (datetime.now() + timedelta(days=1)).isoformat(),
'context': {
'riskScore': analysis['riskScore'],
'riskFactors': analysis['riskFactors'],
'findings': analysis['findings']
}
}
)
def setup_monitoring(self, entity_id: str):
"""Configurar monitoreo continuo"""
print('📊 Configurando monitoreo continuo...')
requests.post(
f'{GUENO_API_URL}/rules',
headers=self.headers,
json={
'name': f'KYB Monitoring - {entity_id}',
'entityId': entity_id,
'active': True,
'rules': [
{
'type': 'sanctions_screening',
'frequency': 'daily',
'action': 'alert_compliance_team'
},
{
'type': 'adverse_media',
'frequency': 'weekly',
'action': 'create_review_task'
}
]
}
)
def send_status_notification(self, entity_id: str, status: str):
"""Enviar notificación de estado"""
print(f'📧 Enviando notificación de {status}...')
requests.post(
f'{GUENO_API_URL}/webhooks/send',
headers=self.headers,
json={
'event': 'kyb_status_changed',
'entityId': entity_id,
'status': status,
'timestamp': datetime.now().isoformat()
}
)
def process_kyb(self, application: Dict) -> Dict:
"""Flujo de trabajo KYB completo"""
try:
print('🚀 Iniciando proceso de verificación KYB...\n')
# Paso 1: Crear entidad
entity = self.create_business_entity(application)
# Paso 2: Cargar documentos
self.upload_documents(entity['id'], application['documents'])
# Paso 3: Análisis de IA
analysis = self.request_ai_analysis(entity['id'])
# Paso 4: Verificar UBOs
verified_owners = self.verify_beneficial_owners(
entity['id'],
application['beneficial_owners']
)
# Paso 5: Tomar decisión
status = self.make_decision(entity['id'], analysis)
print('\n✨ ¡Proceso KYB completado exitosamente!')
return {
'success': True,
'entityId': entity['id'],
'status': status,
'riskScore': analysis['riskScore'],
'findings': analysis['findings'],
'nextSteps': analysis['nextSteps']
}
except Exception as e:
print(f'❌ Proceso KYB falló: {str(e)}')
return {
'success': False,
'entityId': '',
'status': 'rejected',
'riskScore': 100,
'findings': {'error': str(e)},
'nextSteps': ['Contactar soporte']
}
# Example usage
if __name__ == '__main__':
processor = KYBProcessor(GUENO_API_KEY)
application = {
'business_id': 'business_12345',
'legal_name': 'Tech Solutions Sociedade Anônima',
'trade_name': 'Tech Solutions',
'tax_id': '12.345.678/0001-90',
'country_code': 'BR',
'incorporation_date': '2020-06-15',
'industry': 'Software Development',
'website': 'https://techsolutions.com.br',
'employee_count': 50,
'revenue': 5000000,
'address': {
'street': 'Av. Paulista, 1000',
'city': 'São Paulo',
'state': 'SP',
'postalCode': '01310-100',
'country': 'BR'
},
'contact_email': '[email protected]',
'contact_phone': '+55 11 1234-5678',
'expected_monthly_volume': 250000,
'beneficial_owners': [
{
'first_name': 'Carlos',
'last_name': 'Silva',
'date_of_birth': '1975-08-22',
'nationality': 'BR',
'ownership_percentage': 60,
'is_pep': False,
'id_number': '123.456.789-00'
},
{
'first_name': 'Ana',
'last_name': 'Costa',
'date_of_birth': '1980-03-15',
'nationality': 'BR',
'ownership_percentage': 40,
'is_pep': False,
'id_number': '987.654.321-00'
}
],
'documents': [
{'type': 'articles_of_incorporation', 'file_path': './docs/contrato_social.pdf'},
{'type': 'tax_certificate', 'file_path': './docs/cnpj_certificate.pdf'},
{'type': 'business_license', 'file_path': './docs/alvara.pdf'},
{'type': 'proof_of_address', 'file_path': './docs/comprovante.pdf'}
]
}
result = processor.process_kyb(application)
print('\n📊 Resultado Final:')
print(result)
Salida Esperada
Cuando ejecutes el flujo de trabajo completo, verás:Copy
Ask AI
🚀 Iniciando proceso de verificación KYB...
📋 Creando entidad empresarial...
✅ Entidad creada: 660e9511-f39c-52e5-b827-557766551111
📄 Cargando 4 documentos...
✅ Cargado: articles_of_incorporation
✅ Cargado: tax_certificate
✅ Cargado: business_license
✅ Cargado: proof_of_address
🤖 Solicitando análisis de IA...
✅ Análisis completo. Puntuación de Riesgo: 35
👥 Verificando 2 beneficiarios finales...
✅ Verificado: Carlos Silva
✅ Verificado: Ana Costa
⚖️ Tomando decisión KYB...
🔍 Solicitando debida diligencia reforzada...
📧 Enviando notificación de additional_info_required...
✨ ¡Proceso KYB completado exitosamente!
📊 Resultado Final:
{
"success": true,
"entityId": "660e9511-f39c-52e5-b827-557766551111",
"status": "pending",
"riskScore": 35,
"findings": {
"documentVerification": "verified",
"sanctionsScreening": "clear",
"adverseMedia": "minor_flags"
},
"nextSteps": [
"Proporcionar estados financieros",
"Enviar diagrama de estructura de propiedad",
"Documentar origen de fondos"
]
}
Pruebas
Prueba el flujo de trabajo KYB con datos de ejemplo:Copy
Ask AI
# Instalar dependencias
npm install axios form-data
# o
pip install requests
# Configurar tu clave API
export GUENO_API_KEY="tu_clave_api_aqui"
# Ejecutar el ejemplo
node kyb-example.ts
# o
python kyb_example.py
Consideraciones de Producción
Manejo de Errores
Copy
Ask AI
try {
const result = await kybProcessor.processKYB(application);
} catch (error) {
if (error.response?.status === 401) {
console.error('Clave API inválida');
} else if (error.response?.status === 429) {
console.error('Límite de tasa excedido - reintentar en 60s');
} else {
console.error('Proceso KYB falló:', error.message);
}
}
Integración de Webhooks
Configura webhooks para recibir actualizaciones en tiempo real:Copy
Ask AI
app.post('/webhooks/kyb', (req, res) => {
const { event, entityId, status } = req.body;
switch (status) {
case 'approved':
// Habilitar funcionalidades empresariales
enableBusinessAccount(entityId);
break;
case 'additional_info_required':
// Solicitar más documentos
requestAdditionalDocs(entityId);
break;
case 'manual_review':
// Notificar al equipo de cumplimiento
alertComplianceTeam(entityId);
break;
}
res.sendStatus(200);
});