Aegis full 4-tier verdict (SDN + consensus + 1-hop + BFS) — submit
curl --request POST \
--url https://api.aegis-kyt.com/v2/check-address \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"address": "TScSLnUodZVsgoGchZspDoimDjDB9bwqVv",
"network": "TRON"
}
'import requests
url = "https://api.aegis-kyt.com/v2/check-address"
payload = {
"address": "TScSLnUodZVsgoGchZspDoimDjDB9bwqVv",
"network": "TRON"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({address: 'TScSLnUodZVsgoGchZspDoimDjDB9bwqVv', network: 'TRON'})
};
fetch('https://api.aegis-kyt.com/v2/check-address', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"schema_version": 1,
"address": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
"network": "TRON",
"provider": "Aegis",
"decision": "reject",
"verdict": {
"ok": true,
"risk_level": "sanctioned",
"risk_score": 100,
"risk_categories": [
"sanctioned"
],
"sdn_match": {
"entity_name": "EXAMPLE DESIGNATED ENTITY",
"programs": [
"SDN"
],
"listing_date": "2025-11-14"
},
"consensus_found": true,
"source_count": 3,
"confidence": 0.92,
"tier3_applied": true,
"tier4_applied": true,
"sanctions_exposure_share": null,
"vasp_attribution": null,
"fallback_used": []
},
"billing": {
"model": "ledger",
"charged_usd": "1.000000",
"balance_usd": "42.500000",
"monthly_spent_usd": "12.300000",
"monthly_cap_usd": "500.000000"
},
"elapsed_ms": 1840
}{
"detail": [
{
"loc": [
"body",
"address"
],
"msg": "Field required",
"type": "missing"
}
]
}V2 Public API
POST /v2/check-address
Single-provider AML check on one address.
POST
/
check-address
Aegis full 4-tier verdict (SDN + consensus + 1-hop + BFS) — submit
curl --request POST \
--url https://api.aegis-kyt.com/v2/check-address \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"address": "TScSLnUodZVsgoGchZspDoimDjDB9bwqVv",
"network": "TRON"
}
'import requests
url = "https://api.aegis-kyt.com/v2/check-address"
payload = {
"address": "TScSLnUodZVsgoGchZspDoimDjDB9bwqVv",
"network": "TRON"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({address: 'TScSLnUodZVsgoGchZspDoimDjDB9bwqVv', network: 'TRON'})
};
fetch('https://api.aegis-kyt.com/v2/check-address', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"schema_version": 1,
"address": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
"network": "TRON",
"provider": "Aegis",
"decision": "reject",
"verdict": {
"ok": true,
"risk_level": "sanctioned",
"risk_score": 100,
"risk_categories": [
"sanctioned"
],
"sdn_match": {
"entity_name": "EXAMPLE DESIGNATED ENTITY",
"programs": [
"SDN"
],
"listing_date": "2025-11-14"
},
"consensus_found": true,
"source_count": 3,
"confidence": 0.92,
"tier3_applied": true,
"tier4_applied": true,
"sanctions_exposure_share": null,
"vasp_attribution": null,
"fallback_used": []
},
"billing": {
"model": "ledger",
"charged_usd": "1.000000",
"balance_usd": "42.500000",
"monthly_spent_usd": "12.300000",
"monthly_cap_usd": "500.000000"
},
"elapsed_ms": 1840
}{
"detail": [
{
"loc": [
"body",
"address"
],
"msg": "Field required",
"type": "missing"
}
]
}Auth: Required · Billing: 1 credit per delivered check, per your plan (commercial agreement)
This endpoint never blocks. It always answers 202 with a
check_id;
the verdict comes from
GET /v2/check-address/{check_id}/result.
Billing fires once, on the first successful delivery of that result — not
on submit. Polling early, or polling again later, never charges twice.Request
curl -X POST https://api.aegis-kyt.com/v2/check-address \
-H "Authorization: Bearer aeg_YOUR_KEY_HERE" \
-H "Content-Type: application/json" \
-d '{
"address": "TScSLnUodZVsgoGchZspDoimDjDB9bwqVv",
"network": "TRON"
}'
| Field | Type | Notes |
|---|---|---|
address | string | EVM hex (auto-lowercased) or base58 (TRON/BTC/SOL — case preserved) |
network | string | Case-insensitive. One of BSC, ETH, TRON or TON. TON is label-only (labels, sanctions, external risk providers, one-hop counterparties — no multi-hop graph); see Networks. |
| Header | Purpose |
|---|---|
Idempotency-Key: <≤64 chars> | Replay-safe within 24h. Same key + same body → cached response, no charge. Different body → HTTP 409. |
TON request
curl -X POST https://api.aegis-kyt.com/v2/check-address \
-H "Authorization: Bearer aeg_YOUR_KEY_HERE" \
-H "Content-Type: application/json" \
-d '{
"address": "UQDKHZ7e70CzqdvZCC83Z4WVR8POC_ZB0J1Y4zo88G-zCSRH",
"network": "TON"
}'
verdict.network_coverage (onchain_graph: false, onchain_stats: "partial" when
counterparties were read from a recent window) instead of leaving graph fields out — read it before treating
a quiet result as “fully analysed”.
Response 202 — accepted
{
"status": "queued",
"check_id": "3f8c1e2a-...",
"address": "TScSLnUodZVsgoGchZspDoimDjDB9bwqVv",
"network": "TRON",
"message": "check queued — poll GET /v2/check-address/{check_id}/result",
"result_url": "/v2/check-address/3f8c1e2a-.../result"
}
result_url every few seconds. Typical completion is 5-90 s; a cold BFS
can take longer. Network must be one of BSC, ETH, TRON or TON — anything else is
rejected with HTTP 400 before a job is created.
The verdict
Delivered byGET /v2/check-address/{check_id}/result,
which is where the response body and its fields are documented.
decision (top-level) is the merchant traffic-light — one of
accept · review · reject · unable. Build your accept/block flow on
this field:
decision | Meaning |
|---|---|
accept | no risk signals found |
review | elevated / borderline — your operator decides |
reject | high risk (sanctions / criminal exposure) |
unable | no data to assess — do not treat as clean |
decision is a probabilistic risk signal, not a command to accept/reject and
not legal advice — the final decision and risk are yours.
verdict.risk_level / verdict.risk_score give the detail behind the
decision; verdict.tier3_applied / tier4_applied show which depth tiers
ran (tier4_applied: false may mean too few transactions for BFS — Tier
0+1+2 still executed).
Errors
| HTTP | code | Why |
|---|---|---|
| 400 | bad_request | malformed address, or network not a known chain |
| 400 | unsupported_network | valid chain, but not one Aegis supports |
| 401 | missing_or_invalid_key | Bearer header missing or wrong |
| 402 | insufficient_funds | credit balance empty — see GET /v2/balance. Body carries balance_credits/requested_credits beside the *_usd fields; the message text prints $ — parse the numbers |
| 402 | monthly_cap_exceeded | monthly spending cap reached (a cap is optional; it can bite while the balance is still healthy) |
| 409 | idempotency_conflict | same key + different body within 24h |
See also
- V2 introduction
- POST /v2/check-transfer — Transaction Check (KYT)
GET /v2/check-address/{check_id}/result— the verdict- GET /v2/balance — what is left to spend
- GET /v2/me/usage — billing snapshot + call history
Authorizations
Your aeg_… API key from the dashboard (Account → API tab).
Headers
Body
application/json
On-chain wallet. EVM is lowercased internally; TRON/BTC/SOL preserved.
Required string length:
1 - 120Examples:
"TScSLnUodZVsgoGchZspDoimDjDB9bwqVv"
"0x21a31ee1afc51d94c2efccaa2092ad1028285549"
Chain identifier (BSC, ETH, TRON, TON). See /v2/networks for allowed values.
Required string length:
1 - 20Examples:
"TRON"
"ETH"
Response
Successful Response
The response is of type Response Check Address Check Address Post · object.

