Plug-and-Play KYC Name-Check

Seamlessly integrate powerful AML screening into your onboarding flow with just a few lines of code. Reduce development time from weeks to minutes.

React ComponentSupabase Edge FunctionsNext.js App RouterJavaScript SDK

Try Our Screening Tool

Experience the power and simplicity of our AML screening solution.

Screen an Individual or Entity

Enter a name to check against global sanctions, PEP lists, and watchlists.

Enter a full name to check against global watchlists

Simple Copy-Paste Integration

Add compliance screening to your application in minutes, not weeks. Just copy our components directly into your codebase.

Three Simple Steps

  • 1

    Copy the component

    Copy our pre-built KYC component code directly from our documentation or SDK.

  • 2

    Paste into your app

    Paste the component into your React, Next.js, or Vue application with no complex setup.

  • 3

    Start screening instantly

    The component connects to our API automatically. Just add your API key and you're ready to go.

Why Copy-Paste?

  • No npm packages to install or manage
  • Full control to customize the component
  • No dependencies to worry about
  • Easily adapt to your existing tech stack
  • Faster integration than traditional SDKs

KYC Component for Next.js

"use client"

import { useState } from "react"
import { Button } from "@/components/ui/button"
import { Input } from "@/components/ui/input"
import { AlertCircle, CheckCircle, Loader2 } from 'lucide-react'

export default function KycNameCheck({ 
  apiKey,
  onResult,
  theme = "light" 
}) {
  const [query, setQuery] = useState("")
  const [status, setStatus] = useState("idle")
  const [results, setResults] = useState([])
  const [showDetails, setShowDetails] = useState(false)
  const [error, setError] = useState(null)

  const handleCheck = async () => {
    if (!query.trim()) return
    
    setStatus("loading")
    setShowDetails(false)
    setError(null)
    
    try {
      const response = await fetch("https://muddhqdfszuawycsokbg.supabase.co/functions/v1/MPC/search", {
        method: "POST",
        headers: {
          "Content-Type": "application/json"
        },
        body: JSON.stringify({
          query: query,
        }),
      })
      
      if (!response.ok) {
        throw new Error(`API error: ${response.status}`)
      }
      
      const data = await response.json()
      setResults(data)
      
      if (onResult) onResult(data)
      
      if (data && data.length > 0) {
        setStatus("match")
      } else {
        setStatus("no-match")
      }
    } catch (err) {
      console.error("Error during screening:", err)
      setError(err instanceof Error ? err.message : "An unknown error occurred")
      setStatus("no-match")
    }
  }

  // Component JSX...
  // (Full component code available in documentation)
}

Usage Example

// In your Next.js page or component
import KycNameCheck from '@/components/kyc-name-check'

export default function OnboardingPage() {
  const handleKycResult = (result) => {
    console.log('KYC check result:', result)
    // Handle the result in your application
  }

  return (
    <div className="max-w-md mx-auto">
      <h2 className="text-xl font-bold mb-4">Identity Verification</h2>
      <KycNameCheck 
        apiKey="your_api_key_here"
        onResult={handleKycResult} 
      />
    </div>
  )
}

See It In Action

Experience how ComplianceShield seamlessly integrates into your application with our interactive demo.

Name Screening API Demo

Enter a full name to check against global watchlists

curl -X POST https://muddhqdfszuawycsokbg.supabase.co/functions/v1/MPC/search \
  -H "Content-Type: application/json" \
  -d '{"query": "ALI ZAKI MOHAMMED ALI"}'

Implementation Examples

See how our KYC component integrates with Next.js and other platforms.

Next.js Integration

Server Component and Client Component examples for Next.js applications.

// app/components/kyc-check.tsx
"use client"

import { useState } from 'react';
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { AlertCircle, CheckCircle, Loader2 } from 'lucide-react';

export default function KycCheck() {
  const [query, setQuery] = useState('');
  const [isLoading, setIsLoading] = useState(false);
  const [results, setResults] = useState([]);
  const [showDetails, setShowDetails] = useState(false);

  // API call function
  const checkName = async () => {
    try {
      const response = await fetch('https://muddhqdfszuawycsokbg.supabase.co/functions/v1/MPC/search', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({
          query: query
        })
      });
      
      return await response.json();
    } catch (error) {
      console.error('Error during name check:', error);
      throw error;
    }
  };

  const handleSubmit = async (e: React.FormEvent) => {
    e.preventDefault();
    
    if (!query.trim()) return;
    
    setIsLoading(true);
    setShowDetails(false);
    
    try {
      const data = await checkName();
      setResults(data);
    } catch (error) {
      console.error('Error:', error);
    } finally {
      setIsLoading(false);
    }
  };

  const handleViewDetails = () => {
    setShowDetails(true);
  };
  
  return (
    <div className="w-full max-w-md mx-auto">
      <form onSubmit={handleSubmit} className="space-y-4">
        <div>
          <label htmlFor="query" className="block text-sm font-medium mb-1">
            Name to Check
          </label>
          <Input
            id="query"
            placeholder="Enter name to check (e.g. ALI ZAKI MOHAMMED ALI)"
            value={query}
            onChange={(e) => setQuery(e.target.value)}
            required
            className="w-full"
          />
          <p className="text-xs text-muted-foreground mt-1">
            Enter a full name to check against global watchlists
          </p>
        </div>
        
        <div className="flex justify-end">
          <Button type="submit" disabled={isLoading || !query.trim()}>
            {isLoading ? (
              <>
                <Loader2 className="mr-2 h-4 w-4 animate-spin" />
                Checking
              </>
            ) : (
              "Check Name"
            )}
          </Button>
        </div>
      </form>

      {results && results.length > 0 ? (
        <div className="mt-6 p-4 border rounded-lg bg-red-50 dark:bg-red-900/20">
          <div className="flex items-center">
            <div className="rounded-full bg-red-100 dark:bg-red-900/40 p-2 mr-3">
              <AlertCircle className="h-5 w-5 text-red-600 dark:text-red-400" />
            </div>
            <div className="flex-1">
              <h4 className="font-semibold text-red-600 dark:text-red-400">Potential Match Found</h4>
              <p className="text-sm text-red-700 dark:text-red-300">
                {results.length} {results.length === 1 ? 'match' : 'matches'} found on watchlists.
              </p>
            </div>
            {!showDetails && (
              <Button variant="outline" size="sm" onClick={handleViewDetails}>
                View Details
              </Button>
            )}
          </div>

          {showDetails && (
            <div className="mt-4 border-t border-red-200 dark:border-red-800 pt-4">
              <div className="bg-background/80 backdrop-blur-sm p-3 rounded text-sm">
                <h5 className="font-medium mb-2">Match Details</h5>
                <pre className="overflow-auto text-xs p-2 bg-slate-100 dark:bg-slate-800 rounded">
                  {JSON.stringify(results, null, 2)}
                </pre>
              </div>
            </div>
          )}
        </div>
      ) : results ? (
        <div className="mt-6 p-4 border rounded-lg bg-green-50 dark:bg-green-900/20">
          <div className="flex items-center">
            <div className="rounded-full bg-green-100 dark:bg-green-900/40 p-2 mr-3">
              <CheckCircle className="h-5 w-5 text-green-600 dark:text-green-400" />
            </div>
            <div>
              <h4 className="font-semibold text-green-600 dark:text-green-400">No Matches Found</h4>
              <p className="text-sm text-green-700 dark:text-green-300">
                This individual does not appear on any watchlists.
              </p>
            </div>
          </div>
        </div>
      ) : null}
    </div>
  );
}

Next.js App Router Integration

Using the KYC component in a Next.js App Router page with Server Components.

// app/onboarding/page.tsx
import KycCheck from '@/app/components/kyc-check';

export default function OnboardingPage() {
  return (
    <div className="container max-w-4xl mx-auto py-12">
      <h1 className="text-3xl font-bold mb-8 text-center">Complete Your Profile</h1>
      
      <div className="bg-card p-6 rounded-lg shadow-sm border">
        <h2 className="text-xl font-semibold mb-6">Identity Verification</h2>
        <p className="text-muted-foreground mb-6">
          To comply with regulations, we need to verify your identity. 
          Please provide your information below.
        </p>
        
        <KycCheck />
      </div>
      
      <div className="mt-8 text-center text-sm text-muted-foreground">
        <p>
          Your information is securely checked against global compliance databases.
          No personal data is stored unless required by regulations.
        </p>
      </div>
    </div>
  );
}

Next.js Batch Screening API Route

Create an API route to handle batch screening with CSV uploads.

// app/api/batch-screen/route.ts
import { NextRequest, NextResponse } from 'next/server';

export async function POST(request: NextRequest) {
  try {
    // Get the CSV data from the request
    const formData = await request.formData();
    const file = formData.get('file') as File;
    
    if (!file) {
      return NextResponse.json(
        { error: 'No file provided' },
        { status: 400 }
      );
    }
    
    // Read the file as text
    const csvData = await file.text();
    
    // Forward the CSV data to the screening API
    const response = await fetch(
      'https://muddhqdfszuawycsokbg.supabase.co/functions/v1/MPC/screen',
      {
        method: 'POST',
        headers: {
          'Content-Type': 'text/csv',
        },
        body: csvData
      }
    );
    
    // Get the response from the screening API
    const result = await response.json();
    
    // Return the result
    return NextResponse.json(result);
  } catch (error) {
    console.error('Error processing batch screening:', error);
    return NextResponse.json(
      { error: 'Failed to process batch screening' },
      { status: 500 }
    );
  }
}

REST API Examples

Examples of how to call the screening APIs.

// Example API request for single name screening
fetch('https://muddhqdfszuawycsokbg.supabase.co/functions/v1/MPC/search', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    query: 'ALI ZAKI MOHAMMED ALI'  // Single query field with full name
  })
})
.then(response => response.json())
.then(data => {
  console.log('Screening result:', data);
  // Example response:
  // [
  //   {
  //     "id": "Q101096308",
  //     "schema": "Person",
  //     "name": "Mohammed Zaki Ali",
  //     "aliases": "محمد زكي علي;محمد زكي علي باشا",
  //     "birth_date": "",
  //     "countries": "eg",
  //     "addresses": "",
  //     "identifiers": "Q101096308",
  //     "sanctions": "",
  //     "phones": "",
  //     "emails": "",
  //     "dataset": "Wikidata;Wikidata Persons in Relevant Categories",
  //     "first_seen": "2024-10-08T21:02:18+00:00",
  //     "last_seen": "2025-04-29T00:47:02+00:00",
  //     "last_change": "2025-01-25T00:47:49+00:00"
  //   }
  // ]
})
.catch(error => {
  console.error('Error:', error);
});

// Example for batch screening with CSV
// First, prepare your CSV data
const csvData = `full_name
ALI ZAKI MOHAMMED ALI
John Smith
Jane Doe
`;

fetch('https://muddhqdfszuawycsokbg.supabase.co/functions/v1/MPC/screen', {
  method: 'POST',
  headers: {
    'Content-Type': 'text/csv',
  },
  body: csvData
})
.then(response => response.json())
.then(data => {
  console.log('Batch screening results:', data);
})
.catch(error => {
  console.error('Error:', error);
});

Customization Options

Tailor the KYC component to match your brand and user experience requirements.

Theme Options

  • theme: 'light' - Default light theme
  • theme: 'dark' - Dark theme
  • theme: 'custom' - Custom theme

Custom Styling

styles: {
  primaryColor: '#3B82F6',
  secondaryColor: '#1E40AF',
  fontFamily: 'Inter, sans-serif',
  borderRadius: '8px',
  inputHeight: '42px',
  buttonStyle: 'filled', // or 'outline'
  animation: true,
  boxShadow: 'sm' // 'none', 'sm', 'md', 'lg'
}

Layout Options

  • layout: 'standard'

    Default form layout with labels above inputs

  • layout: 'compact'

    Condensed layout for space-constrained UIs

  • layout: 'inline'

    Horizontal layout with labels beside inputs

Branding

  • showLogo: false

    Hide ComplianceShield branding

  • customLogo: 'https://your-domain.com/logo.png'

    Add your own logo

  • customTitle: 'Identity Verification'

    Custom form title

Ready to integrate AML screening?

Get started with our KYC Name-Check component today and streamline your compliance process.

Need help with integration? Contact our developer support team