Skip to main content
This page provides complete, production-ready workflow examples for common use cases.

Individual KYC

Basic Individual Verification

Standard KYC for individual customers with ID, liveness, and personal information.
{
  "name": "Individual KYC",
  "description": "Standard individual verification with ID, liveness, and personal info",
  "entity_types": ["individual"],
  "steps": [
    {
      "step_id": "id_upload",
      "order": 1,
      "name": "Identity Document",
      "type": "document_upload",
      "instructions": "Upload a clear photo of your passport or government-issued ID",
      "document_requirements": [
        {
          "document_type": "id",
          "display_name": "Passport or ID Card",
          "required": true,
          "auto_extract": true
        }
      ]
    },
    {
      "step_id": "liveness",
      "order": 2,
      "name": "Identity Verification",
      "type": "liveness",
      "instructions": "Complete the liveness check to verify your identity",
      "liveness_config": {
        "min_confidence": 90.0,
        "challenge_type": "FaceMovementChallenge",
        "save_reference_image": true,
        "use_for_face_match": true,
        "max_retries": 3
      }
    },
    {
      "step_id": "personal_info",
      "order": 3,
      "name": "Personal Information",
      "type": "form_fill",
      "custom_fields": [
        {
          "field_id": "full_name",
          "name": "Full Legal Name",
          "type": "name",
          "name_type": "individual",
          "validate_lists": true,
          "required": true
        },
        {
          "field_id": "date_of_birth",
          "name": "Date of Birth",
          "type": "date",
          "required": true,
          "max_date": "today"
        },
        {
          "field_id": "nationality",
          "name": "Nationality",
          "type": "country",
          "country_type": "nationality",
          "required": true
        },
        {
          "field_id": "residence",
          "name": "Country of Residence",
          "type": "country",
          "country_type": "residence",
          "required": true
        },
        {
          "field_id": "email",
          "name": "Email Address",
          "type": "email",
          "validate_email": true,
          "block_disposable": true,
          "required": true
        },
        {
          "field_id": "phone",
          "name": "Phone Number",
          "type": "phone",
          "format": "international",
          "required": true
        }
      ]
    }
  ],
  "validation_config": {
    "run_lists": true,
    "run_adverse_media": false,
    "auto_face_match": true,
    "face_match_threshold": 0.85,
    "automation_rules": {
      "enabled": true,
      "auto_process": true,
      "country_rules": [
        {"country_code": "KP", "action": "auto_deny", "applies_to": ["all"]},
        {"country_code": "IR", "action": "manual_review", "applies_to": ["all"]},
        {"country_code": "CU", "action": "manual_review", "applies_to": ["all"]},
        {"country_code": "SY", "action": "auto_deny", "applies_to": ["all"]}
      ],
      "list_match_rules": [
        {"list_type": "any", "match_level": "high_confidence", "action": "auto_deny"}
      ],
      "document_rules": [
        {
          "document_types": ["id"],
          "expired_action": "auto_deny",
          "max_days_until_expiry": 90,
          "expiry_action": "flag"
        }
      ],
      "face_match_threshold": 0.85,
      "face_match_action_on_fail": "auto_deny",
      "default_action": "manual_review"
    }
  }
}

Enhanced Due Diligence (EDD)

For high-risk individuals with additional verification requirements.
{
  "name": "Enhanced Due Diligence",
  "description": "Enhanced KYC for high-risk individuals",
  "entity_types": ["individual"],
  "steps": [
    {
      "step_id": "id_upload",
      "order": 1,
      "name": "Identity Documents",
      "type": "document_upload",
      "instructions": "Upload your passport AND a secondary ID (driver's license, national ID)",
      "document_requirements": [
        {
          "document_type": "passport",
          "display_name": "Passport",
          "required": true,
          "auto_extract": true
        },
        {
          "document_type": "id",
          "display_name": "Secondary ID",
          "required": true,
          "auto_extract": true
        },
        {
          "document_type": "proof_of_address",
          "display_name": "Proof of Address (utility bill, bank statement)",
          "required": true,
          "auto_extract": true
        }
      ]
    },
    {
      "step_id": "liveness",
      "order": 2,
      "name": "Liveness Verification",
      "type": "liveness",
      "liveness_config": {
        "min_confidence": 95.0,
        "challenge_type": "FaceMovementAndLightChallenge",
        "save_reference_image": true,
        "save_audit_images": true,
        "use_for_face_match": true
      }
    },
    {
      "step_id": "personal_info",
      "order": 3,
      "name": "Personal Information",
      "type": "form_fill",
      "custom_fields": [
        {
          "field_id": "full_name",
          "name": "Full Legal Name (as on passport)",
          "type": "name",
          "name_type": "individual",
          "validate_lists": true,
          "validate_adverse_media": true,
          "required": true
        },
        {
          "field_id": "date_of_birth",
          "name": "Date of Birth",
          "type": "date",
          "required": true
        },
        {
          "field_id": "nationality",
          "name": "Nationality",
          "type": "country",
          "country_type": "nationality",
          "required": true
        },
        {
          "field_id": "tax_residence",
          "name": "Country of Tax Residence",
          "type": "country",
          "country_type": "tax_residence",
          "required": true
        },
        {
          "field_id": "tax_id",
          "name": "Tax ID Number",
          "type": "document_id",
          "id_type": "tax_id",
          "validate_format": true,
          "required": true
        },
        {
          "field_id": "home_address",
          "name": "Residential Address",
          "type": "address",
          "require_postal_code": true,
          "require_country": true,
          "country_type": "residence",
          "required": true
        },
        {
          "field_id": "occupation",
          "name": "Occupation",
          "type": "text",
          "required": true
        },
        {
          "field_id": "employer",
          "name": "Employer Name",
          "type": "name",
          "name_type": "company",
          "validate_lists": true,
          "required": true
        },
        {
          "field_id": "source_of_funds",
          "name": "Primary Source of Funds",
          "type": "select",
          "options": ["Employment", "Business", "Investments", "Inheritance", "Savings", "Cryptocurrency", "Other"],
          "required": true
        },
        {
          "field_id": "source_of_funds_details",
          "name": "Source of Funds Details",
          "type": "text",
          "required": true
        },
        {
          "field_id": "pep_status",
          "name": "Are you a Politically Exposed Person (PEP)?",
          "type": "select",
          "options": ["No", "Yes - Current PEP", "Yes - Former PEP", "Yes - Family member of PEP"],
          "required": true
        },
        {
          "field_id": "pep_details",
          "name": "PEP Details (if applicable)",
          "type": "text",
          "required": false,
          "conditional_logic": {
            "show_when": {
              "field_id": "pep_status",
              "operator": "not_equals",
              "value": "No"
            }
          }
        },
        {
          "field_id": "expected_monthly_volume",
          "name": "Expected Monthly Transaction Volume",
          "type": "volume",
          "currency": "USD",
          "period": "monthly",
          "apply_volume_rules": true,
          "required": true
        }
      ]
    }
  ],
  "validation_config": {
    "run_lists": true,
    "run_adverse_media": true,
    "auto_face_match": true,
    "face_match_threshold": 0.9,
    "cross_validate_documents": true,
    "automation_rules": {
      "enabled": true,
      "auto_process": true,
      "country_rules": [
        {"country_code": "KP", "action": "auto_deny", "applies_to": ["all"]},
        {"country_code": "IR", "action": "auto_deny", "applies_to": ["all"]},
        {"country_code": "SY", "action": "auto_deny", "applies_to": ["all"]}
      ],
      "list_match_rules": [
        {"list_type": "any", "match_level": "any", "entity_scope": "all", "action": "manual_review"},
        {"list_type": "ofac", "match_level": "high_confidence", "action": "auto_deny"}
      ],
      "face_dedup_config": {
        "enabled": true,
        "similarity_threshold": 0.92
      },
      "face_dedup_rules": [
        {"min_previous_sessions": 1, "include_rejected": true, "action": "flag"}
      ],
      "document_rules": [
        {
          "document_types": ["passport", "id"],
          "expired_action": "auto_deny",
          "max_days_until_expiry": 180,
          "expiry_action": "flag",
          "min_image_quality": "good",
          "poor_quality_action": "manual_review"
        },
        {
          "document_types": ["proof_of_address"],
          "max_days_since_issue": 90,
          "age_action": "flag"
        }
      ],
      "form_field_rules": [
        {
          "field_id": "pep_status",
          "operator": "not_equals",
          "value": "No",
          "action": "manual_review",
          "reason": "PEP declared"
        },
        {
          "field_id": "source_of_funds",
          "operator": "equals",
          "value": "Cryptocurrency",
          "action": "manual_review",
          "reason": "Crypto source of funds"
        }
      ],
      "volume_rules": [
        {"min_monthly_volume": 100000, "action": "manual_review"},
        {"min_monthly_volume": 500000, "action": "flag"}
      ],
      "face_match_threshold": 0.9,
      "face_match_action_on_fail": "auto_deny",
      "default_action": "manual_review"
    }
  }
}

Company KYC

Standard Company Verification

Complete company KYC with incorporation documents, directors, and beneficial owners.
{
  "name": "Company KYC",
  "description": "Company verification with incorporation docs, directors, and UBOs",
  "entity_types": ["company"],
  "steps": [
    {
      "step_id": "company_docs",
      "order": 1,
      "name": "Company Documents",
      "type": "document_upload",
      "instructions": "Upload your company incorporation documents",
      "document_requirements": [
        {
          "document_type": "articles_of_incorporation",
          "display_name": "Articles of Incorporation / Certificate of Incorporation",
          "required": true,
          "auto_extract": true
        },
        {
          "document_type": "tax_certificate",
          "display_name": "Tax Registration Certificate",
          "required": true,
          "auto_extract": true
        },
        {
          "document_type": "shareholder_registry",
          "display_name": "Shareholder Registry (if applicable)",
          "required": false,
          "auto_extract": true
        }
      ]
    },
    {
      "step_id": "company_info",
      "order": 2,
      "name": "Company Information",
      "type": "form_fill",
      "custom_fields": [
        {
          "field_id": "company_name",
          "name": "Legal Company Name",
          "type": "name",
          "name_type": "company",
          "validate_lists": true,
          "validate_adverse_media": true,
          "required": true
        },
        {
          "field_id": "trading_name",
          "name": "Trading Name (if different)",
          "type": "text",
          "required": false
        },
        {
          "field_id": "registration_number",
          "name": "Company Registration Number",
          "type": "document_id",
          "id_type": "company_reg",
          "required": true
        },
        {
          "field_id": "incorporation_country",
          "name": "Country of Incorporation",
          "type": "country",
          "country_type": "incorporation",
          "required": true
        },
        {
          "field_id": "incorporation_date",
          "name": "Date of Incorporation",
          "type": "date",
          "required": true
        },
        {
          "field_id": "tax_id",
          "name": "Tax ID / VAT Number",
          "type": "document_id",
          "id_type": "tax_id",
          "required": true
        },
        {
          "field_id": "registered_address",
          "name": "Registered Address",
          "type": "address",
          "require_postal_code": true,
          "country_type": "business_operation",
          "required": true
        },
        {
          "field_id": "industry",
          "name": "Industry",
          "type": "select",
          "options": ["Technology", "Financial Services", "E-commerce", "Manufacturing", "Healthcare", "Real Estate", "Professional Services", "Other"],
          "required": true
        },
        {
          "field_id": "website",
          "name": "Company Website",
          "type": "domain",
          "auto_validate": true,
          "required": true
        },
        {
          "field_id": "email",
          "name": "Company Email",
          "type": "email",
          "validate_email": true,
          "required": true
        },
        {
          "field_id": "phone",
          "name": "Company Phone",
          "type": "phone",
          "format": "international",
          "required": true
        }
      ]
    },
    {
      "step_id": "directors",
      "order": 3,
      "name": "Directors",
      "type": "form_fill",
      "instructions": "Provide information about all company directors",
      "custom_fields": [
        {
          "field_id": "directors",
          "name": "Company Directors",
          "type": "entity_array",
          "entity_role": "director",
          "min_items": 1,
          "max_items": 10,
          "allow_company_entities": false,
          "validate_lists": true,
          "validate_adverse_media": false,
          "required": true,
          "item_schema": {
            "full_name": {"type": "name", "name_type": "individual", "required": true},
            "nationality": {"type": "country", "country_type": "nationality", "required": true},
            "date_of_birth": {"type": "date", "required": true},
            "email": {"type": "email", "required": true}
          }
        }
      ]
    },
    {
      "step_id": "ubos",
      "order": 4,
      "name": "Beneficial Owners",
      "type": "form_fill",
      "instructions": "Provide information about all Ultimate Beneficial Owners (25%+ ownership)",
      "custom_fields": [
        {
          "field_id": "beneficial_owners",
          "name": "Ultimate Beneficial Owners",
          "type": "entity_array",
          "entity_role": "beneficial_owner",
          "min_items": 1,
          "max_items": 10,
          "allow_company_entities": true,
          "max_recursion_depth": 2,
          "validate_lists": true,
          "validate_adverse_media": true,
          "required": true,
          "item_schema": {
            "full_name": {"type": "name", "required": true},
            "nationality": {"type": "country", "country_type": "nationality", "required": true},
            "date_of_birth": {"type": "date", "required": true},
            "ownership_percentage": {"type": "percentage", "required": true},
            "address": {"type": "address", "required": false}
          }
        }
      ]
    },
    {
      "step_id": "rep_verification",
      "order": 5,
      "name": "Representative Verification",
      "type": "document_upload",
      "instructions": "The company representative must verify their identity",
      "document_requirements": [
        {
          "document_type": "id",
          "display_name": "Representative ID",
          "required": true,
          "auto_extract": true
        }
      ]
    },
    {
      "step_id": "rep_liveness",
      "order": 6,
      "name": "Representative Liveness",
      "type": "liveness",
      "liveness_config": {
        "min_confidence": 90.0,
        "use_for_face_match": true
      }
    }
  ],
  "validation_config": {
    "run_lists": true,
    "run_adverse_media": true,
    "auto_face_match": true,
    "automation_rules": {
      "enabled": true,
      "auto_process": true,
      "country_rules": [
        {"country_code": "KP", "action": "auto_deny", "applies_to": ["all"]},
        {"country_code": "IR", "action": "auto_deny", "applies_to": ["incorporation"]}
      ],
      "list_match_rules": [
        {"list_type": "any", "match_level": "high_confidence", "entity_scope": "all", "action": "auto_deny"},
        {"list_type": "pep", "entity_scope": "primary", "action": "manual_review"},
        {"list_type": "pep", "entity_scope": "related_parties", "action": "flag"}
      ],
      "web_validation_rules": {
        "enabled": true,
        "score_rules": [
          {"max_score": 40, "action": "auto_deny"},
          {"min_score": 70, "action": "no_action"}
        ],
        "ssl_rules": {
          "on_no_ssl": "flag",
          "on_invalid_ssl": "flag"
        },
        "industry_rules": {
          "blocked_industries": ["Gambling", "Adult Content", "Weapons"],
          "on_blocked": "auto_deny",
          "on_mismatch": "flag"
        }
      },
      "default_action": "manual_review"
    }
  }
}

Merchant Onboarding

Payment Facilitator Merchant Verification

Complete merchant onboarding with business verification and sub-merchant samples.
{
  "name": "Merchant Onboarding",
  "description": "Payment facilitator merchant verification",
  "entity_types": ["company"],
  "industry": "Payments",
  "steps": [
    {
      "step_id": "business_docs",
      "order": 1,
      "name": "Business Documents",
      "type": "document_upload",
      "document_requirements": [
        {"document_type": "business_license", "required": true, "auto_extract": true},
        {"document_type": "articles_of_incorporation", "required": true, "auto_extract": true},
        {"document_type": "bank_letter", "display_name": "Bank Reference Letter", "required": true}
      ]
    },
    {
      "step_id": "business_info",
      "order": 2,
      "name": "Business Information",
      "type": "form_fill",
      "custom_fields": [
        {
          "field_id": "company_name",
          "name": "Legal Business Name",
          "type": "name",
          "name_type": "company",
          "validate_lists": true,
          "required": true
        },
        {
          "field_id": "dba",
          "name": "DBA / Trading As",
          "type": "text",
          "required": false
        },
        {
          "field_id": "website",
          "name": "Business Website",
          "type": "domain",
          "auto_validate": true,
          "required": true
        },
        {
          "field_id": "mcc",
          "name": "Merchant Category Code (MCC)",
          "type": "text",
          "required": true,
          "placeholder": "e.g., 5411"
        },
        {
          "field_id": "industry",
          "name": "Industry",
          "type": "select",
          "options": ["E-commerce", "Retail", "Travel", "Gaming", "Digital Goods", "SaaS", "Marketplaces", "Other"],
          "required": true
        },
        {
          "field_id": "business_model",
          "name": "Business Model Description",
          "type": "text",
          "required": true
        },
        {
          "field_id": "incorporation_country",
          "name": "Country of Incorporation",
          "type": "country",
          "country_type": "incorporation",
          "required": true
        },
        {
          "field_id": "operating_countries",
          "name": "Countries of Operation",
          "type": "multi_select",
          "options": ["United States", "Canada", "United Kingdom", "EU", "Asia Pacific", "Latin America", "Global"],
          "required": true
        }
      ]
    },
    {
      "step_id": "volume_info",
      "order": 3,
      "name": "Transaction Volume",
      "type": "form_fill",
      "custom_fields": [
        {
          "field_id": "monthly_volume",
          "name": "Expected Monthly Volume",
          "type": "volume",
          "currency": "USD",
          "period": "monthly",
          "include_transaction_count": true,
          "apply_volume_rules": true,
          "required": true
        },
        {
          "field_id": "average_ticket",
          "name": "Average Transaction Amount",
          "type": "currency",
          "currency": "USD",
          "required": true
        },
        {
          "field_id": "chargeback_rate",
          "name": "Current Chargeback Rate (%)",
          "type": "percentage",
          "max_percentage": 100,
          "required": true
        },
        {
          "field_id": "refund_rate",
          "name": "Current Refund Rate (%)",
          "type": "percentage",
          "required": true
        }
      ]
    },
    {
      "step_id": "principals",
      "order": 4,
      "name": "Principals & Owners",
      "type": "form_fill",
      "custom_fields": [
        {
          "field_id": "principals",
          "name": "Business Principals (25%+ ownership or control)",
          "type": "entity_array",
          "entity_role": "beneficial_owner",
          "min_items": 1,
          "validate_lists": true,
          "required": true,
          "item_schema": {
            "full_name": {"type": "name", "required": true},
            "title": {"type": "text", "required": true},
            "nationality": {"type": "country", "country_type": "nationality", "required": true},
            "date_of_birth": {"type": "date", "required": true},
            "ssn_last4": {"type": "text", "required": false},
            "ownership_percentage": {"type": "percentage", "required": true},
            "email": {"type": "email", "required": true}
          }
        }
      ]
    },
    {
      "step_id": "sub_merchants",
      "order": 5,
      "name": "Sample Sub-Merchants",
      "type": "form_fill",
      "instructions": "Provide 3-5 sample sub-merchants you will onboard",
      "custom_fields": [
        {
          "field_id": "sub_merchants",
          "name": "Sub-Merchant Samples",
          "type": "sub_merchant",
          "min_items": 3,
          "max_items": 5,
          "require_industry": true,
          "require_sample_url": true,
          "required": true
        }
      ]
    },
    {
      "step_id": "rep_verification",
      "order": 6,
      "name": "Authorized Representative",
      "type": "document_upload",
      "document_requirements": [
        {"document_type": "id", "display_name": "Representative ID", "required": true, "auto_extract": true}
      ]
    },
    {
      "step_id": "rep_liveness",
      "order": 7,
      "name": "Representative Verification",
      "type": "liveness",
      "liveness_config": {
        "min_confidence": 90.0,
        "use_for_face_match": true
      }
    }
  ],
  "validation_config": {
    "run_lists": true,
    "run_adverse_media": true,
    "auto_face_match": true,
    "automation_rules": {
      "enabled": true,
      "auto_process": true,
      "country_rules": [
        {"country_code": "KP", "action": "auto_deny", "applies_to": ["all"]},
        {"country_code": "IR", "action": "auto_deny", "applies_to": ["all"]}
      ],
      "list_match_rules": [
        {"list_type": "any", "match_level": "high_confidence", "action": "auto_deny"}
      ],
      "volume_rules": [
        {"min_monthly_volume": 1000000, "action": "manual_review"},
        {"min_monthly_volume": 10000000, "action": "flag"}
      ],
      "form_field_rules": [
        {
          "field_id": "industry",
          "operator": "equals",
          "value": "Gaming",
          "action": "manual_review",
          "reason": "Gaming industry requires enhanced review"
        },
        {
          "field_id": "chargeback_rate",
          "operator": "gt",
          "value": 1,
          "action": "flag",
          "reason": "High chargeback rate"
        }
      ],
      "web_validation_rules": {
        "enabled": true,
        "score_rules": [
          {"max_score": 50, "action": "auto_deny"}
        ],
        "ssl_rules": {
          "on_no_ssl": "auto_deny"
        },
        "industry_rules": {
          "blocked_industries": ["Gambling", "Adult", "Weapons", "Drugs"],
          "on_blocked": "auto_deny"
        },
        "page_evidence_rules": {
          "on_unrealistic_promises": "auto_deny",
          "require_phone": true,
          "require_email": true
        }
      },
      "default_action": "manual_review"
    }
  }
}

Crypto Wallet Verification

Crypto Exchange Customer Verification

KYC for crypto exchange customers with wallet verification.
{
  "name": "Crypto Exchange KYC",
  "description": "Customer verification for crypto exchange with wallet checks",
  "entity_types": ["individual"],
  "steps": [
    {
      "step_id": "id_upload",
      "order": 1,
      "name": "Identity Document",
      "type": "document_upload",
      "document_requirements": [
        {"document_type": "id", "required": true, "auto_extract": true}
      ]
    },
    {
      "step_id": "liveness",
      "order": 2,
      "name": "Liveness Check",
      "type": "liveness",
      "liveness_config": {
        "min_confidence": 92.0,
        "challenge_type": "FaceMovementAndLightChallenge",
        "use_for_face_match": true
      }
    },
    {
      "step_id": "personal_info",
      "order": 3,
      "name": "Personal Information",
      "type": "form_fill",
      "custom_fields": [
        {
          "field_id": "full_name",
          "name": "Full Name",
          "type": "name",
          "name_type": "individual",
          "validate_lists": true,
          "required": true
        },
        {
          "field_id": "date_of_birth",
          "name": "Date of Birth",
          "type": "date",
          "required": true
        },
        {
          "field_id": "nationality",
          "name": "Nationality",
          "type": "country",
          "country_type": "nationality",
          "required": true
        },
        {
          "field_id": "residence",
          "name": "Country of Residence",
          "type": "country",
          "country_type": "residence",
          "required": true
        },
        {
          "field_id": "email",
          "name": "Email",
          "type": "email",
          "validate_email": true,
          "block_disposable": true,
          "required": true
        }
      ]
    },
    {
      "step_id": "crypto_info",
      "order": 4,
      "name": "Crypto Information",
      "type": "form_fill",
      "custom_fields": [
        {
          "field_id": "experience_level",
          "name": "Crypto Experience Level",
          "type": "select",
          "options": ["Beginner", "Intermediate", "Advanced", "Professional"],
          "required": true
        },
        {
          "field_id": "source_of_crypto",
          "name": "Source of Cryptocurrency",
          "type": "select",
          "options": ["Mining", "Trading", "Employment/Salary", "Investment Returns", "Gifts", "Other"],
          "required": true
        },
        {
          "field_id": "expected_monthly_volume",
          "name": "Expected Monthly Trading Volume",
          "type": "volume",
          "currency": "USD",
          "period": "monthly",
          "apply_volume_rules": true,
          "required": true
        },
        {
          "field_id": "eth_wallet",
          "name": "Ethereum Wallet (optional)",
          "type": "wallet",
          "blockchain": "ethereum",
          "validate_crypto": true,
          "required": false
        },
        {
          "field_id": "btc_wallet",
          "name": "Bitcoin Wallet (optional)",
          "type": "wallet",
          "blockchain": "bitcoin",
          "validate_crypto": true,
          "required": false
        }
      ]
    }
  ],
  "validation_config": {
    "run_lists": true,
    "run_crypto": true,
    "run_adverse_media": true,
    "auto_face_match": true,
    "automation_rules": {
      "enabled": true,
      "auto_process": true,
      "country_rules": [
        {"country_code": "KP", "action": "auto_deny", "applies_to": ["all"]},
        {"country_code": "IR", "action": "auto_deny", "applies_to": ["all"]},
        {"country_code": "US", "action": "flag", "applies_to": ["residence"], "reason": "US residence requires additional compliance"}
      ],
      "list_match_rules": [
        {"list_type": "any", "match_level": "high_confidence", "action": "auto_deny"}
      ],
      "volume_rules": [
        {"min_monthly_volume": 50000, "action": "manual_review"},
        {"min_monthly_volume": 250000, "action": "flag"}
      ],
      "face_dedup_config": {
        "enabled": true,
        "similarity_threshold": 0.95
      },
      "face_dedup_rules": [
        {"min_previous_sessions": 1, "include_rejected": true, "action": "auto_deny"}
      ],
      "default_action": "manual_review",
      "watchlist_auto_add": {
        "enabled": true,
        "rules": [
          {
            "trigger_on": "rejected",
            "watchlist_id": "wl_crypto_rejected",
            "entity_types": ["individual", "wallet"],
            "ttl_days": 365
          }
        ]
      }
    }
  }
}

Frontend Integration

JavaScript/TypeScript SDK Example

interface WorkflowStep {
  step_id: string;
  order: number;
  name: string;
  type: 'document_upload' | 'form_fill' | 'selfie' | 'liveness' | 'validation';
  instructions?: string;
  required?: boolean;
  document_requirements?: DocumentRequirement[];
  custom_fields?: CustomField[];
  liveness_config?: LivenessConfig;
}

interface CustomField {
  field_id: string;
  name: string;
  type: string;
  required: boolean;
  // Type-specific properties
  [key: string]: any;
}

interface LivenessConfig {
  min_confidence: number;
  challenge_type: 'FaceMovementChallenge' | 'FaceMovementAndLightChallenge';
  save_reference_image: boolean;
  use_for_face_match: boolean;
  max_retries: number;
}

// Create workflow
async function createWorkflow(workflow: any): Promise<string> {
  const response = await fetch('https://kyc.legaltalent.ai/kyc/workflows', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${token}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(workflow)
  });
  
  const data = await response.json();
  return data.data.workflow_id;
}

// Create session from workflow
async function createSession(workflowId: string, metadata: any): Promise<{ sessionId: string; accessLink: string }> {
  const response = await fetch('https://kyc.legaltalent.ai/kyc/sessions', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${token}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      workflow_id: workflowId,
      ttl_days: 7,
      metadata
    })
  });
  
  const data = await response.json();
  return {
    sessionId: data.data.session_id,
    accessLink: data.data.access_link
  };
}

// Get workflow to render steps
async function getWorkflow(workflowId: string): Promise<WorkflowStep[]> {
  const response = await fetch(`https://kyc.legaltalent.ai/kyc/workflows/${workflowId}`, {
    headers: { 'Authorization': `Bearer ${token}` }
  });
  
  const data = await response.json();
  return data.data.steps;
}

// Render form fields based on type
function renderField(field: CustomField): JSX.Element {
  switch (field.type) {
    case 'country':
      return <CountrySelect 
        label={field.name}
        countryType={field.country_type}
        blockedCountries={field.blocked_countries}
        required={field.required}
      />;
    
    case 'name':
      return <NameInput
        label={field.name}
        nameType={field.name_type}
        required={field.required}
      />;
    
    case 'wallet':
      return <WalletInput
        label={field.name}
        blockchain={field.blockchain}
        required={field.required}
      />;
    
    case 'entity_array':
      return <EntityArrayInput
        label={field.name}
        entityRole={field.entity_role}
        minItems={field.min_items}
        maxItems={field.max_items}
        itemSchema={field.item_schema}
      />;
    
    // ... other field types
    
    default:
      return <TextInput label={field.name} required={field.required} />;
  }
}

Processing Results Handler

interface ProcessingResult {
  final_decision: 'approved' | 'rejected' | 'manual_review';
  automation_flags: AutomationFlag[];
  extraction_results: Record<string, any>;
  face_match_result?: FaceMatchResult;
  watchlist_subjects_added?: WatchlistSubject[];
}

interface AutomationFlag {
  rule_type: string;
  action: string;
  reason: string;
  details: Record<string, any>;
}

function handleProcessingResult(result: ProcessingResult) {
  // Display decision
  if (result.final_decision === 'approved') {
    showSuccess('Verification approved!');
  } else if (result.final_decision === 'rejected') {
    showError('Verification rejected');
    
    // Show rejection reasons
    const denyFlags = result.automation_flags
      .filter(f => f.action === 'auto_deny');
    denyFlags.forEach(flag => {
      console.log(`Rejection reason: ${flag.reason}`);
    });
  } else {
    showWarning('Manual review required');
    
    // Show review reasons
    const reviewFlags = result.automation_flags
      .filter(f => f.action === 'manual_review' || f.action === 'flag');
    reviewFlags.forEach(flag => {
      console.log(`Review reason: ${flag.reason}`);
    });
  }
}