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

Requisitos de Dados

Veja os campos de dados detalhados necessários para KYB

Exemplo Completo

Implementação de código funcional completa

Referência da API

Documentação da API de criação de entidade

Webhooks

Configure notificações em tempo real