Seamlessly integrate powerful AML screening into your onboarding flow with just a few lines of code. Reduce development time from weeks to minutes.
Experience the power and simplicity of our AML screening solution.
Enter a name to check against global sanctions, PEP lists, and watchlists.
Enter a full name to check against global watchlists
Add compliance screening to your application in minutes, not weeks. Just copy our components directly into your codebase.
Copy our pre-built KYC component code directly from our documentation or SDK.
Paste the component into your React, Next.js, or Vue application with no complex setup.
The component connects to our API automatically. Just add your API key and you're ready to go.
"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) }
// 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> ) }
Experience how ComplianceShield seamlessly integrates into your application with our interactive 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"}'
See how our KYC component integrates with Next.js and other platforms.
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> ); }
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> ); }
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 } ); } }
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); });
Tailor the KYC component to match your brand and user experience requirements.
theme: 'light'
- Default light themetheme: 'dark'
- Dark themetheme: 'custom'
- Custom themestyles: { 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: 'standard'
Default form layout with labels above inputs
layout: 'compact'
Condensed layout for space-constrained UIs
layout: 'inline'
Horizontal layout with labels beside inputs
showLogo: false
Hide ComplianceShield branding
customLogo: 'https://your-domain.com/logo.png'
Add your own logo
customTitle: 'Identity Verification'
Custom form title
Get started with our KYC Name-Check component today and streamline your compliance process.