Crypto Payment Verification
Screen customer wallet addresses before accepting crypto payments. Detect sanctioned addresses, scam wallets, and high-risk senders with a single API call or an embeddable widget.
How It Works
Customer Enters Address
Your customer pastes their crypto wallet address into your checkout or payment form.
Instant Verification
The address is checked against scam databases, OFAC sanctions lists, GoPlus security data, and our risk scoring engine.
Accept or Reject
You receive a clear recommendation: accept, review, or reject. The widget shows an inline badge automatically.
Widget Quick Start
Add one script tag to your checkout page. The widget attaches to your payment address input and shows a verification badge automatically.
<input
type="text"
id="crypto-address"
placeholder="Enter wallet address"
/>
<script
src="https://chainevidence.net/api/v1/merchant/widget.js"
data-key="YOUR_API_KEY"
data-element="#crypto-address"
></script>When the user enters a valid crypto address and leaves the field, a colored badge appears: Safe Review High Risk or Sanctioned.
Widget Configuration
Configure the widget via data- attributes on the script tag.
| Attribute | Required | Description |
|---|---|---|
| data-key | Yes | Your ChainEvidence API key. Required. The widget will not initialize without it. data-key="ce_live_a1b2c3d4..." |
| data-element | Yes | CSS selector for the payment address input field the widget should attach to. data-element="#crypto-address" |
| data-position | No | Where to place the badge relative to the input. "after" (default) inserts after the input, "before" inserts before it. data-position="after" |
Widget Events
The widget dispatches a ce:payment-checked custom event on the input element after each verification. Use it to integrate with your checkout logic.
document.querySelector('#crypto-address')
.addEventListener('ce:payment-checked', function(e) {
var result = e.detail;
if (result.recommendation === 'sanctioned_reject') {
disableCheckout('This address is sanctioned.');
} else if (result.recommendation === 'high_risk_reject') {
showWarning('This address has been flagged. Proceed with caution.');
} else if (result.recommendation === 'review_recommended') {
flagForManualReview(result);
}
console.log('Risk score:', result.risk.score, result.risk.level);
});API Endpoint
For server-side integration, call the payment check endpoint directly. Base URL: https://chainevidence.net
/api/v1/payment-checkPayment Address Verification
Submit a crypto address to check if it is safe to accept payment from. Returns risk score, sanctions status, scam reports, and a clear accept/reject recommendation.
Request
curl -X POST \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"address": "0x1234...abcd", "chain": "ETH"}' \
https://chainevidence.net/api/v1/payment-checkRequest Body
{
"address": "0x1234...abcd", // Required: wallet address
"chain": "ETH", // Optional: BTC, ETH, BSC, TRX, SOL (auto-detected)
"amount": 1.5, // Optional: transaction amount (for logging)
"currency": "ETH" // Optional: currency of the amount
}Example Response
{
"data": {
"address": "0x1234...abcd",
"chain": "ETH",
"risk": { "score": 5, "level": "low" },
"recommendation": "safe_to_accept",
"sanctions": { "listed": false },
"scamReports": 0,
"labels": [],
"goplusFlags": [],
"verifiedAt": "2026-03-22T14:30:00.000Z"
},
"meta": {
"creditsRemaining": 18,
"balanceCents": 500,
"costCents": 1,
"requestId": "req_a1b2c3d4e5f6g7h8"
}
}Response Fields
| Field | Type | Description |
|---|---|---|
| address | string | The address that was checked. |
| chain | string | Detected blockchain: BTC, ETH, BSC, TRX, SOL, or UNKNOWN. |
| risk.score | number | Risk score from 0 (safe) to 100 (critical). |
| risk.level | string | Human-readable risk level: low, medium, high, or critical. |
| recommendation | string | Action recommendation: safe_to_accept, review_recommended, high_risk_reject, or sanctioned_reject. |
| sanctions.listed | boolean | Whether the address appears on OFAC or other sanctions lists. |
| scamReports | number | Number of scam reports in the ChainEvidence database. |
| labels | string[] | Known labels for this address (e.g. "phishing", "ransomware"). |
| goplusFlags | string[] | Risk flags from GoPlus security analysis (e.g. money laundering, mixer usage). |
| verifiedAt | string | ISO 8601 timestamp of when the check was performed. |
Recommendation Levels
The recommendation field tells you what action to take. Use it to automate your payment acceptance logic.
Address has no known scam reports, sanctions flags, or malicious activity. Risk score below 30.
Address has some risk signals (risk score 30-59). Manual review before accepting is advised.
Address has significant fraud indicators, multiple scam reports, or malicious activity flags. Risk score 60+.
Address appears on OFAC sanctions list or is flagged as blacklisted. Accepting payment is a legal risk.
Compliance
Legal obligation: Merchants who knowingly accept payments from sanctioned addresses may face regulatory penalties. ChainEvidence provides screening data to help you comply, but you are responsible for your own compliance decisions.
OFAC Sanctions
Every payment check screens against the OFAC SDN list and known sanctioned wallet clusters. Sanctioned addresses always return sanctioned_reject.
AML / KYC
Use the risk score and scam reports to enrich your existing AML workflows. Addresses with mixer usage, money laundering flags, or darkweb activity are flagged automatically.
Audit Trail
Every API call is logged with a unique requestId. Use it to prove due diligence in case of regulatory inquiry.
Multi-Chain
Supports Bitcoin, Ethereum, BSC, Tron, and Solana addresses. Chain is auto-detected from the address format, or specify manually for BSC (0x) addresses.
Integration Examples
Server-side verification patterns for common merchant setups.
app.post('/checkout/verify-payment', async (req, res) => {
const { customerAddress } = req.body;
const check = await fetch('https://chainevidence.net/api/v1/payment-check', {
method: 'POST',
headers: {
'Authorization': 'Bearer ' + process.env.CHAINEVIDENCE_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({ address: customerAddress }),
});
const { data } = await check.json();
if (data.recommendation === 'sanctioned_reject') {
return res.status(403).json({
error: 'Cannot accept payment from this address.',
});
}
if (data.recommendation === 'high_risk_reject') {
await notifyComplianceTeam(data);
return res.status(403).json({
error: 'This address has been flagged for review.',
});
}
// Proceed with payment
await processPayment(customerAddress);
res.json({ status: 'accepted', riskScore: data.risk.score });
});import requests
def verify_payment_address(address: str) -> dict:
resp = requests.post(
"https://chainevidence.net/api/v1/payment-check",
headers={
"Authorization": f"Bearer {settings.CHAINEVIDENCE_API_KEY}",
"Content-Type": "application/json",
},
json={"address": address},
timeout=10,
)
resp.raise_for_status()
return resp.json()["data"]
# In your view:
result = verify_payment_address(customer_wallet)
if result["recommendation"] in ("sanctioned_reject", "high_risk_reject"):
raise PaymentRejected(f"Address flagged: {result['recommendation']}")// Shopify webhook: orders/create
// Verify the customer's crypto payment address before fulfillment
async function handleOrderCreated(order) {
const cryptoAddress = order.note_attributes
?.find(a => a.name === 'crypto_address')?.value;
if (!cryptoAddress) return; // Not a crypto payment
const resp = await fetch('https://chainevidence.net/api/v1/payment-check', {
method: 'POST',
headers: {
'Authorization': 'Bearer ' + CHAINEVIDENCE_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({ address: cryptoAddress }),
});
const { data } = await resp.json();
if (data.recommendation !== 'safe_to_accept') {
// Tag the order for manual review
await shopify.order.addTag(order.id, 'crypto-risk-' + data.risk.level);
await shopify.order.addNote(order.id,
'ChainEvidence: ' + data.recommendation +
' (score: ' + data.risk.score + ')'
);
}
}Pricing
per payment check
Billed per unique API call. Widget-side cache (5min TTL) avoids duplicate charges.
1,000 checks
$10
10,000 checks
$100
100,000+ checks
Contact us
20 free checks included with every API key. Top up your balance at any time via Stripe. No monthly fees, no commitments.
Protect your business today
Screen every crypto payment against scam databases, sanctions lists, and fraud indicators. One API call or one script tag. 20 free checks included.