Turnkey AML Screening Integration (Chainalysis, Elliptic, Crystal)
A user's transaction is blocked without explanation — familiar situation? We have integrated Chainalysis, Elliptic, and Crystal in dozens of projects and know how to configure AML screening without false positives. Our experience allows us to implement FATF compliance in 2 weeks.
AML screening of cryptocurrency transactions is a mandatory compliance element for any platform working with crypto. The task: for every deposit or withdrawal, check whether the address is linked to sanctioned entities, darknet markets, stolen funds, or other high-risk activities. A configuration error can cost you your license or lead to bank partner account freezes. We guarantee correct risk logic setup and full process documentation.
Why AML Screening Matters for Crypto Projects
Regulators increasingly require crypto exchanges and exchangers to implement AML procedures. Without them, a company risks sanctions or losing access to banking services. Chainalysis, Elliptic, and Crystal are market leaders that automate real-time transaction checks. Our engineers are certified on each of these products.
Chainalysis vs Elliptic: Which to Choose
| Provider | Strengths | Weaknesses |
|---|---|---|
| Chainalysis KYT | Most comprehensive sanctions database, regulator integration | High cost, complex API for beginners |
| Elliptic Lens | Best DeFi coverage and cross-asset tracing | Smaller Eastern European risk coverage |
| Crystal Blockchain | Competitive price, Russian language support | Fewer integrations with European regulators |
Chainalysis is best for large exchanges with strict regulatory requirements, Elliptic for DeFi protocols, and Crystal for projects from the CIS. We help choose the optimal provider for your jurisdiction.
How Chainalysis KYT Works
Chainalysis is the market leader, used by most major exchanges and regulators for forensics. The API is divided into several products: KYT for transaction monitoring, Reactor for investigation, and Kryptos for entity data. Our experience includes Chainalysis Partner certification, ensuring correct setup from the start.
KYT API Integration
class ChainalysisClient {
private readonly baseURL = "https://api.chainalysis.com";
async registerAddress(address: string, asset: "USDT" | "ETH" | "BTC" | string): Promise<void> {
await this.post("/api/kyt/v2/users", {
userId: address,
asset,
});
}
async screenTransfer(params: {
asset: string;
network: string;
transferReference: string;
direction: "received" | "sent";
userId: string;
outputAddress?: string;
value?: string;
assetAmount?: number;
timestamp?: string;
}): Promise<TransferRisk> {
const response = await this.post("/api/kyt/v2/transfers", params);
return {
externalId: response.externalId,
riskScore: response.riskScore,
cluster: response.cluster,
status: response.status,
};
}
async getTransferAlerts(externalId: string): Promise<Alert[]> {
const response = await this.get(`/api/kyt/v2/transfers/${externalId}/alerts`);
return response.alerts;
}
private async post(path: string, body: any): Promise<any> {
const response = await fetch(`${this.baseURL}${path}`, {
method: "POST",
headers: {
"Token": this.apiKey,
"Content-Type": "application/json",
},
body: JSON.stringify(body),
});
return response.json();
}
}
Risk Score Categories
| Score | Category | Automatic Action |
|---|---|---|
| 0-39 | LOW | Pass |
| 40-69 | MEDIUM | Flag for review |
| 70-100 | HIGH | Block |
| N/A | SEVERE | Block + SAR |
Categories that trigger automatic blocking regardless of score:
-
darknet_market -
ransomware -
stolen_funds -
sanctions -
terrorist_financing
Processing a Deposit
async function processDeposit(deposit: Deposit): Promise<DepositResult> {
await chainalysis.registerAddress(deposit.fromAddress, deposit.asset);
const risk = await chainalysis.screenTransfer({
asset: deposit.asset,
network: deposit.network,
transferReference: deposit.txHash,
direction: "received",
userId: deposit.userId,
value: deposit.usdValue.toString(),
assetAmount: deposit.amount,
});
if (risk.status === "BLOCKED") {
await freezeDeposit(deposit.id);
await notifyCompliance(deposit, risk);
return { status: "blocked", reason: risk.cluster?.category };
}
if (risk.status === "IN_REVIEW") {
await holdForReview(deposit.id);
await createComplianceTask(deposit, risk);
return { status: "pending_review" };
}
await creditUserAccount(deposit);
return { status: "approved" };
}
Elliptic Lens / Navigator Features
Elliptic is a competitor to Chainalysis with similar functionality. It excels in DeFi screening and cross-asset tracing.
class EllipticClient {
async getWalletRisk(address: string, asset: string): Promise<EllipticRisk> {
const response = await this.post("/v2/wallet/synchronous", {
subject: {
asset,
type: "address",
hash: address,
},
type: "wallet_exposure",
customer_reference: address,
});
return {
riskScore: response.risk_score,
exposures: response.exposures,
clusters: response.entities,
};
}
async getTransactionRisk(txHash: string, asset: string): Promise<EllipticRisk> {
return this.post("/v2/txs/synchronous", {
subject: { asset, type: "transaction", hash: txHash },
type: "indirect_exposure",
});
}
}
Elliptic score ranges from 0 to 10 — normalization is needed for a unified risk logic if you use both providers.
Using Crystal Blockchain for Eastern Europe
Crystal is a European player, often preferred for CIS/EU projects due to pricing and support.
const crystalResponse = await axios.post(
"https://aml.crystalblockchain.com/api/v1/risks/check",
{
address,
currency: asset,
},
{
headers: { "X-Auth-Apikey": CRYSTAL_API_KEY },
}
);
How AML Screening Integration Works
The project process includes several stages:
- Compliance requirements analysis — study jurisdiction, operation types, required reports.
- Provider API connection — registration, key generation, webhook setup.
- Risk logic configuration — define thresholds for automatic blocking, manual review, and pass.
- Platform integration — embed AML calls into deposit/withdrawal flows.
- Historical data testing — run past transactions to calibrate thresholds.
- Production launch and monitoring — track false positives, adjust rules.
Why Use a Dual-Provider Strategy
For production: two providers reduce the risk of false negatives. Logic: BLOCK if at least one blocks, REVIEW if at least one flags.
Example dual-provider strategy:
async function dualProviderScreen(address: string, txHash: string): Promise<RiskDecision> {
const [chainalysisResult, ellipticResult] = await Promise.allSettled([
chainalysis.screenTransfer({ transferReference: txHash, ... }),
elliptic.getWalletRisk(address, asset),
]);
const c = chainalysisResult.status === "fulfilled" ? chainalysisResult.value : null;
const e = ellipticResult.status === "fulfilled" ? ellipticResult.value : null;
if (!c && !e) throw new Error("Both AML providers unavailable");
const maxScore = Math.max(
c?.riskScore ?? 0,
e ? e.riskScore * 10 : 0,
);
if (maxScore >= 70 || c?.status === "BLOCKED") return { decision: "BLOCK", score: maxScore };
if (maxScore >= 40) return { decision: "REVIEW", score: maxScore };
return { decision: "ALLOW", score: maxScore };
}
A dual-provider system can reduce operational compliance costs by up to 30% by decreasing false positives.
What's Included in the Work
- Integration documentation in Russian and English.
- Client source code in TypeScript (compatible with Node.js and browser).
- Dashboard setup for the compliance team (filtering, export, notifications).
- Team training: how to interpret risk scores and respond to alerts.
- Post-launch support: 2 weeks of monitoring and refinements.
On more than 20 projects, we've encountered all typical errors — from incorrect score normalization to timeouts under high load. We guarantee your platform will meet regulatory requirements without constant false blocks.
Order turnkey AML screening integration — we will evaluate your project within 1 day. Contact us via Telegram or email for a consultation and a preliminary commercial proposal.







