Skip to main content

Fluxo de Trabalho Completo de Verificação KYB

O fluxo de trabalho KYB da gu1 automatiza todo o processo de verificação de empresas, desde a coleta inicial de dados até o monitoramento contínuo. Este guia percorre cada etapa com detalhes técnicos de implementação.

Visão Geral do Fluxo de Trabalho

Etapa 1: Coleta de Dados Inicial

O Que Coletar

Reúna informações básicas da empresa do seu formulário de solicitação:
  • Nome da Empresa: Razão social e nome fantasia
  • Número de Registro: Registro empresarial emitido pelo governo
  • ID Fiscal: EIN (EUA), CNPJ (Brasil), RFC (México), etc.
  • Data de Constituição: Quando a empresa foi constituída
  • País: Jurisdição de constituição
  • Endereço Comercial: Localização da sede registrada
  • Setor: Tipo de atividade empresarial
  • Volume de Transações Esperado: Estimativas mensais/anuais

Exemplo de Formulário de Solicitação

const businessApplication = {
  legalName: "Tech Solutions Sociedade Anônima",
  tradeName: "Tech Solutions",
  registrationNumber: "12.345.678/0001-90",
  taxId: "12.345.678/0001-90",
  incorporationDate: "2020-06-15",
  country: "BR",
  address: {
    street: "Av. Paulista, 1000",
    city: "São Paulo",
    state: "SP",
    postalCode: "01310-100"
  },
  industry: "Software Development",
  website: "https://techsolutions.com.br",
  expectedMonthlyVolume: 250000,
  businessDescription: "B2B SaaS platform for enterprise clients"
};

Etapa 2: Criar Entidade Empresarial

Use a API de Entidades para criar uma entidade de empresa na gu1:
curl -X POST http://api.gu1.ai/entities \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "company",
    "externalId": "business_12345",
    "name": "Tech Solutions Sociedade Anônima",
    "taxId": "12.345.678/0001-90",
    "countryCode": "BR",
    "entityData": {
      "company": {
        "legalName": "Tech Solutions Sociedade Anônima",
        "tradeName": "Tech Solutions",
        "incorporationDate": "2020-06-15",
        "industry": "Software Development",
        "employeeCount": 50,
        "revenue": 5000000
      }
    },
    "attributes": {
      "registrationNumber": "12.345.678/0001-90",
      "website": "https://techsolutions.com.br",
      "registeredAddress": "Av. Paulista, 1000, São Paulo",
      "expectedMonthlyVolume": 250000,
      "applicationDate": "2024-10-03T10:00:00Z"
    }
  }'
Resposta:
{
  "success": true,
  "entity": {
    "id": "660e9511-f39c-52e5-b827-557766551111",
    "externalId": "business_12345",
    "type": "company",
    "name": "Tech Solutions Sociedade Anônima",
    "riskScore": 0,
    "status": "under_review",
    "createdAt": "2024-10-03T10:00:00Z"
  }
}

Etapa 3: Upload e Verificação de Documentos

Faça upload dos documentos empresariais necessários para verificação:

Documentos Obrigatórios

  1. Contrato Social - Documento de fundação
  2. Licença Comercial - Permissão de operação emitida pelo governo
  3. Certificado Fiscal - Comprovante de inscrição fiscal
  4. Comprovante de Endereço - Conta de serviço público ou extrato bancário
  5. Declaração de Beneficiários Finais - Informações sobre UBOs

Fazer Upload de Documentos

async function uploadBusinessDocuments(entityId, documents) {
  const documentUploads = [];

  for (const doc of documents) {
    const formData = new FormData();
    formData.append('file', doc.file);
    formData.append('documentType', doc.type);
    formData.append('entityId', entityId);

    const response = await fetch('http://api.gu1.ai/documents', {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${API_KEY}`
      },
      body: formData
    });

    documentUploads.push(await response.json());
  }

  return documentUploads;
}

// Uso
const documents = [
  { file: articlesOfIncorporation, type: 'articles_of_incorporation' },
  { file: businessLicense, type: 'business_license' },
  { file: taxCertificate, type: 'tax_certificate' },
  { file: proofOfAddress, type: 'proof_of_address' }
];

const uploadedDocs = await uploadBusinessDocuments(entityId, documents);

Etapa 4: Análise por IA e Avaliação de Risco

Solicite análise alimentada por IA da entidade empresarial:
async function requestAIAnalysis(entityId) {
  const response = await fetch(
    `http://api.gu1.ai/entities/${entityId}/ai-analysis`,
    {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${API_KEY}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        analysisType: 'kyb_verification',
        includeDocuments: true,
        checkSanctions: true,
        checkAdverseMedia: true
      })
    }
  );

  return await response.json();
}
Resposta da Análise por IA:
{
  "analysisId": "analysis_abc123",
  "entityId": "660e9511-f39c-52e5-b827-557766551111",
  "riskScore": 35,
  "riskLevel": "medium",
  "findings": {
    "documentVerification": {
      "status": "verified",
      "confidence": 0.95,
      "articlesOfIncorporation": "valid",
      "businessLicense": "valid",
      "taxCertificate": "valid"
    },
    "businessLegitimacy": {
      "status": "verified",
      "registrationVerified": true,
      "taxIdValid": true,
      "addressConfirmed": true
    },
    "sanctionsScreening": {
      "status": "clear",
      "listsChecked": ["OFAC", "UN", "EU", "UK"],
      "matches": []
    },
    "adverseMedia": {
      "status": "minor_flags",
      "findings": [
        {
          "source": "news_article",
          "date": "2023-05-15",
          "summary": "Small tax dispute resolved",
          "severity": "low"
        }
      ]
    },
    "riskFactors": [
      {
        "factor": "new_business",
        "impact": 20,
        "description": "Company incorporated less than 5 years ago"
      },
      {
        "factor": "high_growth_industry",
        "impact": 15,
        "description": "Software industry has elevated fraud risk"
      },
      {
        "factor": "clean_compliance_history",
        "impact": -10,
        "description": "No regulatory violations found"
      }
    ]
  },
  "recommendation": "approve_with_monitoring",
  "nextSteps": [
    "Verify beneficial ownership",
    "Set transaction monitoring thresholds",
    "Schedule 6-month review"
  ]
}

Etapa 5: Decisão Baseada em Risco

Com base na pontuação de risco, direcione para o fluxo de trabalho apropriado:
async function processKYBDecision(analysisResult) {
  const { riskScore, riskLevel, recommendation } = analysisResult;

  if (riskScore < 30) {
    // Baixo Risco - Auto-aprovação
    return await autoApprove(analysisResult.entityId);

  } else if (riskScore < 70) {
    // Médio Risco - Due Diligence Aprimorada
    return await enhancedDueDiligence(analysisResult.entityId);

  } else {
    // Alto Risco - Revisão Manual Necessária
    return await flagForManualReview(analysisResult.entityId, analysisResult.findings);
  }
}

async function autoApprove(entityId) {
  // Atualizar status da entidade para aprovado
  await fetch(`http://api.gu1.ai/entities/${entityId}`, {
    method: 'PATCH',
    headers: {
      'Authorization': `Bearer ${API_KEY}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      attributes: {
        kybStatus: 'approved',
        approvedAt: new Date().toISOString(),
        approvedBy: 'automated_system',
        reviewNotes: 'Low risk - auto-approved'
      }
    })
  });

  // Enviar notificação de aprovação
  await sendApprovalEmail(entityId);

  // Ativar monitoramento
  await enableOngoingMonitoring(entityId);

  return { status: 'approved', action: 'auto_approved' };
}

async function enhancedDueDiligence(entityId) {
  // Solicitar informações adicionais
  await requestAdditionalDocs(entityId, [
    'financial_statements',
    'ownership_structure',
    'source_of_funds'
  ]);

  // Atualizar status
  await updateEntityStatus(entityId, 'enhanced_due_diligence');

  return { status: 'pending', action: 'edd_required' };
}

async function flagForManualReview(entityId, findings) {
  // Criar tarefa de revisão
  await createReviewTask({
    entityId,
    priority: 'high',
    assignTo: 'compliance_team',
    findings,
    dueDate: new Date(Date.now() + 24 * 60 * 60 * 1000) // 24 horas
  });

  return { status: 'manual_review', action: 'flagged_for_review' };
}

Etapa 6: Verificação de Beneficiários Finais

Identifique e verifique os Beneficiários Finais (UBOs):
async function verifyBeneficialOwners(entityId, owners) {
  const verifiedOwners = [];

  for (const owner of owners) {
    // Criar entidade pessoa para cada UBO
    const uboEntity = await fetch('http://api.gu1.ai/entities', {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${API_KEY}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        type: 'person',
        externalId: `ubo_${owner.id}`,
        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.ownership,
          isPEP: owner.isPEP,
          relationshipToCompany: 'beneficial_owner'
        }
      })
    });

    const ubo = await uboEntity.json();

    // Executar verificações KYC no UBO
    const kycResult = await runKYCCheck(ubo.entity.id);

    // Criar relacionamento entre empresa e UBO
    await createRelationship({
      fromEntityId: entityId,
      toEntityId: ubo.entity.id,
      relationshipType: 'beneficial_owner',
      ownershipPercentage: owner.ownership
    });

    verifiedOwners.push({
      ...ubo.entity,
      kycStatus: kycResult.status,
      riskScore: kycResult.riskScore
    });
  }

  return verifiedOwners;
}

Etapa 7: Configurar Monitoramento Contínuo

Habilite o monitoramento contínuo para empresas aprovadas:
async function setupOngoingMonitoring(entityId) {
  // Configurar regras de monitoramento
  await fetch('http://api.gu1.ai/rules', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${API_KEY}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      name: `KYB Monitoring - ${entityId}`,
      entityId: entityId,
      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'
        },
        {
          type: 'transaction_anomalies',
          threshold: 'high',
          action: 'flag_for_review'
        }
      ]
    })
  });

  // Configurar notificações por webhook
  await configureWebhook({
    entityId,
    events: [
      'sanctions_match',
      'adverse_media_found',
      'ownership_change',
      'transaction_anomaly'
    ],
    url: 'https://your-app.com/webhooks/kyb-alerts'
  });
}

Etapa 8: Atualizações de Status e Notificações

Mantenha a empresa informada durante todo o processo:
async function sendStatusUpdate(entityId, status, details) {
  // Obter detalhes da entidade
  const entity = await getEntity(entityId);

  // Enviar notificação por e-mail
  await sendEmail({
    to: entity.attributes.contactEmail,
    subject: `Atualização de Verificação KYB - ${status}`,
    template: 'kyb_status_update',
    data: {
      companyName: entity.name,
      status: status,
      details: details,
      nextSteps: getNextSteps(status),
      dashboardUrl: `https://app.gu1.ai/onboarding/${entityId}`
    }
  });

  // Enviar webhook para seu sistema
  await sendWebhook({
    event: 'kyb_status_changed',
    entityId: entityId,
    status: status,
    timestamp: new Date().toISOString(),
    details: details
  });
}

// Exemplos de atualização de status
await sendStatusUpdate(entityId, 'documents_received', {
  message: 'Recebemos seus documentos e estamos processando-os.'
});

await sendStatusUpdate(entityId, 'approved', {
  message: 'Sua empresa foi verificada e aprovada!',
  approvalDate: new Date().toISOString()
});

await sendStatusUpdate(entityId, 'additional_info_required', {
  message: 'Precisamos de informações adicionais para concluir sua verificação.',
  requiredDocuments: ['financial_statements', 'ownership_structure']
});

Implementação Completa do Fluxo de Trabalho

Aqui está uma função completa que orquestra todo o fluxo de trabalho KYB:
async function executeKYBWorkflow(applicationData) {
  try {
    // Etapas 1 e 2: Criar entidade
    console.log('Criando entidade empresarial...');
    const entity = await createBusinessEntity(applicationData);

    // Etapa 3: Fazer upload de documentos
    console.log('Fazendo upload de documentos de verificação...');
    await uploadBusinessDocuments(entity.id, applicationData.documents);

    // Etapa 4: Solicitar análise por IA
    console.log('Executando análise por IA...');
    const analysis = await requestAIAnalysis(entity.id);

    // Etapa 5: Tomar decisão baseada em risco
    console.log('Processando decisão KYB...');
    const decision = await processKYBDecision(analysis);

    if (decision.status === 'approved') {
      // Etapa 6: Verificar UBOs (para entidades aprovadas)
      console.log('Verificando beneficiários finais...');
      await verifyBeneficialOwners(entity.id, applicationData.beneficialOwners);

      // Etapa 7: Configurar monitoramento
      console.log('Configurando monitoramento contínuo...');
      await setupOngoingMonitoring(entity.id);
    }

    // Etapa 8: Enviar atualização de status
    console.log('Enviando notificação de status...');
    await sendStatusUpdate(entity.id, decision.status, analysis.findings);

    return {
      success: true,
      entityId: entity.id,
      status: decision.status,
      riskScore: analysis.riskScore,
      decision: decision
    };

  } catch (error) {
    console.error('Erro no fluxo de trabalho KYB:', error);
    return {
      success: false,
      error: error.message
    };
  }
}

Estimativas de Prazo

Nível de RiscoProcessamento AutomatizadoCom Revisão ManualProcesso Tradicional
Baixo Risco2-5 minutos30 minutos2-3 dias
Médio Risco15-30 minutos2-4 horas3-5 dias
Alto Risco30-60 minutos1-2 dias5-10 dias

Próximos Passos