Schedule a demo with an expertSchedule demo
Back to documentation
Guide25 min

Company verification (KYB)

He verifies moral persons, identifies final beneficiaries and valid legal representatives according to LFPIORPI.

What includes verification KYB

Company information

  • • RFC and fiscal status (SAT)
  • • Act of association
  • • Public Trade Registry
  • • Tax office

Corporate structure

  • • Shareholders and percentages
  • • Final beneficiaries (UBO)
  • • Legal representatives
  • • Notary powers

Control lists

  • • PEP (politically exposed)
  • • Penalties OFAC
  • • UN lists
  • • Local black lists

Verification of persons

  • • KYC of Legal Representatives
  • • KYC of final beneficiaries
  • • Validation of powers
  • • Comparison of signatures

1. To create corporate monitoring

POST / v1 / kyb / verifications
const kybSession = await jaak.kyb.create({
  // Datos básicos de la empresa
  company: {
    rfc: 'ABC123456XYZ',
    legalName: 'Empresa Ejemplo SA de CV',
    tradeName: 'Ejemplo Corp', // Nombre comercial (opcional)
    incorporationDate: '2020-01-15'
  },

  // Qué verificar
  checks: {
    // Validaciones fiscales
    sat: {
      enabled: true,
      validateRfc: true,
      getFiscalStatus: true,
      getConstancia: true
    },

    // Registro Público de Comercio
    rpc: {
      enabled: true,
      validateIncorporation: true
    },

    // Estructura accionaria
    ownership: {
      enabled: true,
      identifyUbo: true, // Beneficiarios finales
      uboThreshold: 25   // Porcentaje mínimo para UBO
    },

    // Listas de control
    watchlists: {
      enabled: true,
      pep: true,
      ofac: true,
      un: true,
      localBlacklists: true
    },

    // KYC de personas relacionadas
    relatedPersons: {
      enabled: true,
      verifyLegalReps: true,      // Representantes legales
      verifyUbos: true,           // Beneficiarios finales
      verificationConfig: {
        documentTypes: ['ine'],
        livenessCheck: true,
        faceMatch: true
      }
    }
  },

  // Documentos a solicitar
  requiredDocuments: [
    'acta_constitutiva',
    'poder_notarial',
    'comprobante_domicilio',
    'constancia_fiscal'
  ],

  metadata: {
    applicationId: 'app_123',
    source: 'onboarding'
  },

  webhookUrl: 'https://tuapp.com/webhooks/kyb'
});

2. uploading documents

Reg up corporate documents for validation:

// Subir acta constitutiva
await jaak.kyb.uploadDocument(kybSession.id, {
  type: 'acta_constitutiva',
  file: fs.readFileSync('./acta_constitutiva.pdf'),
  mimeType: 'application/pdf'
});

// Subir poder notarial
await jaak.kyb.uploadDocument(kybSession.id, {
  type: 'poder_notarial',
  file: fs.readFileSync('./poder_notarial.pdf'),
  mimeType: 'application/pdf',
  metadata: {
    notaryNumber: '123',
    notaryName: 'Lic. Juan Notario',
    date: '2023-06-15'
  }
});

// Verificar estado de documentos
const docs = await jaak.kyb.getDocuments(kybSession.id);
console.log(docs);

3. Check related persons

Initiates verification KYC and final beneficiaries:

// Agregar representante legal
const legalRep = await jaak.kyb.addPerson(kybSession.id, {
  role: 'legal_representative',
  name: 'Juan Pérez García',
  email: 'juan@empresa.com',
  phone: '+525512345678',
  position: 'Apoderado General',

  // Referencia al poder notarial
  powerOfAttorneyRef: 'poder_notarial_001'
});

// Agregar beneficiario final
const ubo = await jaak.kyb.addPerson(kybSession.id, {
  role: 'ubo', // Ultimate Beneficial Owner
  name: 'María García López',
  email: 'maria@email.com',
  ownershipPercentage: 51,
  isDirectOwner: true
});

// Enviar invitaciones para KYC
await jaak.kyb.sendVerificationInvites(kybSession.id);

// O obtener URLs manualmente
const persons = await jaak.kyb.getPersons(kybSession.id);
persons.forEach(person => {
  console.log(`${person.name}: ${person.verificationUrl}`);
});

4. Consult results

Webhook: kyb.complete
{
  "event": "kyb.completed",
  "data": {
    "sessionId": "kyb_abc123",
    "status": "approved", // approved, rejected, pending_review

    "company": {
      "rfc": "ABC123456XYZ",
      "legalName": "Empresa Ejemplo SA de CV",
      "fiscalStatus": "active",
      "incorporationDate": "2020-01-15",
      "registeredAddress": "Av. Reforma 123, CDMX"
    },

    "satValidation": {
      "status": "valid",
      "regime": "General de Ley Personas Morales",
      "obligations": ["ISR", "IVA"],
      "constanciaUrl": "https://evidence.jaak.ai/sat_xxx.pdf"
    },

    "ownership": {
      "shareholders": [
        { "name": "María García López", "percentage": 51, "isUbo": true },
        { "name": "Pedro Sánchez", "percentage": 30, "isUbo": true },
        { "name": "Inversiones XYZ SA", "percentage": 19, "isUbo": false }
      ],
      "ubosIdentified": 2
    },

    "watchlists": {
      "pep": { "matches": 0 },
      "ofac": { "matches": 0 },
      "un": { "matches": 0 },
      "localBlacklists": { "matches": 0 }
    },

    "persons": [
      {
        "name": "Juan Pérez García",
        "role": "legal_representative",
        "kycStatus": "approved",
        "verificationId": "ver_123"
      },
      {
        "name": "María García López",
        "role": "ubo",
        "kycStatus": "approved",
        "verificationId": "ver_456"
      }
    ],

    "riskScore": 15, // 0-100
    "riskLevel": "low" // low, medium, high
  }
}

Risk levels

0-30Low: Recommended automatic approval
31-70Medium: Recommended manual review
71-100Stop: Due care required