Screen
Submit one address or a plan-appropriate batch, with a chain hint where the native format needs one.
Eagle Eye Report API
Use the versioned REST API to screen addresses against covered government sanctions sources and public stablecoin blacklist, freeze, and control facts. Machine-stable statuses, source fields, freshness metadata, and fail-closed coverage states let your application route evidence into the review process your team already owns.
Screen before onboarding, crediting, release, treasury, or collateral activity according to your procedures. The response supplies evidence for review; it does not replace customer due diligence, source-of-funds analysis, case management, or the team’s decision.
Submit one address or a plan-appropriate batch, with a chain hint where the native format needs one.
Read the status together with the supporting boolean fields, providers, freshness, and completeness values.
Send the evidence into the escalation or enhanced-due-diligence path defined by your institution.
The Eagle Virtual API provides programmatic access to source-backed address screening. Screen addresses against covered government sanctions sources, stablecoin blacklist, freeze, and control facts, whitelist status, historical status where supported, freshness metadata, and coverage state across certified networks.
Eagle Virtual is the address-screening and evidence layer. The API does not provide transaction tracing, multi-hop path analysis, clustering, entity graphs, KYC onboarding, or case management — those stay with your existing tools.
https://eaglevirtual.com/v1
All endpoints except the spec itself require an API key. The machine-readable OpenAPI spec is available for code generation. CSV export is available from the screening page on paid plans.
ev_…) is shown once at creation — store it securely; only a hash is kept server-side.curl "https://eaglevirtual.com/v1/addresses/0xdAC17F958D2ee523a2206206994597C13D831ec7/risk" \ -H "Authorization: Bearer YOUR_API_KEY"
Include your API key in the Authorization header with every request:
Authorization: Bearer YOUR_API_KEY
Keys are created on the page by account
admins. Keys start with ev_, are shown in full exactly once, and can be revoked at any
time from the same page. The number of active keys per account depends on your plan
(see Plans & Rate Limits).
X-RateLimit-Limit, X-RateLimit-Remaining,
X-RateLimit-Reset) are included on every authenticated response — see
Plans & Rate Limits.
Responses are plain JSON objects — no envelope. Success responses return the endpoint's
documented fields directly. Errors return an error code (machine-stable) and usually a
human-readable message:
{
"error": "invalid_address",
"message": "Invalid address."
}
Every screening response includes a machine-stable status, the boolean evidence fields
behind it, the flagging providers, and fresh_as_of metadata. Field names such
as sanction_direct are part of the existing API contract; treat them as machine names,
not outcome claims. Stale or incomplete coverage is reported as UNKNOWN_STALE /
UNKNOWN_INCOMPLETE — never silently converted to NO_KNOWN_HIT.
Address fields intended for users are returned in the detector's chain-canonical display form
(EIP-55 for EVM); machine-normalized keys, when present, are explicitly named
address_normalized.
/v1/addresses/{address}/risk
All plans
Returns the screening status for one address together with covered government-sanctions records, stablecoin blacklist or freeze facts, whitelist status, flagging sources, freshness metadata, and coverage state. One EVM check covers every supported EVM network. A successful check counts the address toward monthly unique-address usage; failed validations do not.
| Parameter | Type | In | Description |
|---|---|---|---|
| addressrequired | string | path | Blockchain address (EVM 0x..., BTC bc1..., BCH bitcoincash:..., LTC ltc1..., DOGE/DASH/ZEC transparent, or TRON T...) or an ENS name for EVM |
| chainoptional | string | query | Chain slug hint (e.g. bitcoin, tron) for native formats that are ambiguous between networks |
curl "https://eaglevirtual.com/v1/addresses/0xdAC17F958D2ee523a2206206994597C13D831ec7/risk" \ -H "Authorization: Bearer YOUR_API_KEY"
import requests
r = requests.get(
"https://eaglevirtual.com/v1/addresses/0xdAC17F958D2ee523a2206206994597C13D831ec7/risk",
headers={"Authorization": "Bearer YOUR_API_KEY"},
timeout=30,
)
r.raise_for_status()
result = r.json()
if result["status"] in ("SANCTION_DIRECT", "BLACKLIST_DIRECT"):
print("escalate:", result["providers"])
const r = await fetch(
"https://eaglevirtual.com/v1/addresses/0xdAC17F958D2ee523a2206206994597C13D831ec7/risk",
{ headers: { Authorization: "Bearer YOUR_API_KEY" } },
);
const result = await r.json();
if (!r.ok) throw new Error(result.error);
console.log(result.status, result.providers);
{
"address": "0xdAC17F958D2ee523a2206206994597C13D831ec7",
"display_address": "0xdAC17F958D2ee523a2206206994597C13D831ec7",
"canonical_display": "0xdAC17F958D2ee523a2206206994597C13D831ec7",
"address_normalized": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"chain": "evm",
"account_family": "evm",
"status": "NO_KNOWN_HIT",
"sanction_direct": false,
"sanction_historical": false,
"blacklist_direct": false,
"blacklist_historical": false,
"whitelist": false,
"providers": [],
"fresh_as_of": "2026-06-09T12:00:00Z",
"completeness": "complete",
"checked_chains": [],
"report_url": "/report/0xdAC17F958D2ee523a2206206994597C13D831ec7"
}
| Field | Type | Description |
|---|---|---|
| address | string | Canonical display address that was screened (EIP-55 for EVM; detector-canonical for other chains) |
| display_address | string | Customer-facing copy/display value; prefer this field in UI and exports |
| canonical_display | string | Detector canonical human-facing address for the selected chain |
| address_normalized | string | Machine-normalized matching key; do not show this as customer display text |
| chain | string | evm for EVM accounts (one check covers all supported EVM networks), otherwise the chain slug |
| status | string | Machine-stable screening status — see the table below |
| sanction_direct | boolean | Current address record in a covered government sanctions source |
| sanction_historical | boolean | Previously sanctioned, since delisted |
| blacklist_direct | boolean | Currently blacklisted or frozen by the company or organization behind a covered token |
| blacklist_historical | boolean | Previously blacklisted by the company or organization behind a token, since released |
| whitelist | boolean | On a token whitelist (for example, an RWA transfer-eligibility list) |
| providers | string[] | Sources that flagged the address (e.g. OFAC, issuer names); empty when there is no hit |
| fresh_as_of | string | Freshness timestamp for the data behind this response |
| completeness | string | Coverage completeness for the checked scope |
| checked_chains | string[] | Chains covered by this check; empty for EVM means all supported EVM networks |
| report_url | string | Path to the full evidence report on eaglevirtual.com |
| Status | Meaning |
|---|---|
| SANCTION_DIRECT | Listed on an official government sanctions list |
| SANCTION_HISTORICAL | Previously sanctioned, since delisted |
| BLACKLIST_DIRECT | Currently blacklisted/frozen by a token issuer |
| BLACKLIST_HISTORICAL | Previously blacklisted by the company or organization behind a token, since released |
| WHITELIST | On a token whitelist, with no current sanctions or blacklist/freeze record in the response |
| NO_KNOWN_HIT | No known hit in certified, current coverage |
| UNKNOWN_STALE | Coverage exists but is stale — treat as requiring review, not as clean |
| UNKNOWN_INCOMPLETE | Coverage is incomplete for this scope — treat as requiring review, not as clean |
/v1/addresses/risk/batch
Paid plans
Check multiple addresses in a single request. The maximum batch size depends on your plan (Starter 100, Growth and Enterprise 1,000). Each item is screened independently — an invalid address produces an error entry for that item without failing the rest of the batch. Usage counts unique addresses, not requests.
| Field | Type | Description |
|---|---|---|
| addressesoption A | string[] | Array of addresses to check |
| itemsoption B | object[] | Array of {"address": "...", "chain": "..."} objects for per-item chain hints |
| chainoptional | string | Default chain hint applied to all items |
curl -X POST "https://eaglevirtual.com/v1/addresses/risk/batch" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"addresses": [
"0xdAC17F958D2ee523a2206206994597C13D831ec7",
"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
]
}'
{
"results": [
{
"address": "0xdAC17F958D2ee523a2206206994597C13D831ec7",
"display_address": "0xdAC17F958D2ee523a2206206994597C13D831ec7",
"address_normalized": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"chain": "evm",
"status": "NO_KNOWN_HIT",
"sanction_direct": false,
"blacklist_direct": false,
"whitelist": false,
"providers": [],
"fresh_as_of": "2026-06-09T12:00:00Z",
"report_url": "/report/0xdAC17F958D2ee523a2206206994597C13D831ec7"
},
{
"address": "not-an-address",
"chain": "",
"status": "error",
"error": "invalid_address",
"message": "Invalid address."
}
],
"checked": 1,
"failed": 1
}
Successful items use the same fields as the single-address endpoint. Items with
"status": "error" carry an error code and do not count toward usage.
Requests above your plan's batch size return 400 too_many_addresses with
max_addresses; plans without batch access receive 403 batch_not_available.
/v1/chains
All plans
Returns all blockchain networks currently supported by Eagle Virtual, from the signed public chain registry. Chains-list requests do not count toward monthly unique-address usage.
curl "https://eaglevirtual.com/v1/chains" \ -H "Authorization: Bearer YOUR_API_KEY"
{
"schema_version": 1,
"generated_at": "2026-06-06T11:54:08Z",
"chains": [
{
"chain_id": "1",
"slug": "ethereum",
"display_name": "Ethereum",
"short_name": "ETH",
"family": "evm",
"native_symbol": "ETH",
"status": "running",
"is_active": true,
"native_formats": ["0x EVM account"]
},
// ... additional chains (each entry also carries coverage, format,
// and market-cap context fields)
]
}
The live list is the source of truth — see the supported chains page for the current networks. Coverage spans EVM networks (Ethereum, BNB Smart Chain, Polygon, Arbitrum, Optimism, Base, Sonic, HyperEVM, Avalanche, Celo, Gnosis, Mantle, ADI Network, and Robinhood Chain), TRON, Solana, XRP, and address-record sanctions coverage for Bitcoin-family networks.
/v1/usage
All plans
Returns your account's monthly unique-address usage and the operational limits of your plan, so integrations can monitor consumption without the web app. Usage is also visible on the and pages.
{
"plan": "growth",
"plan_label": "Growth",
"usage_model": "monthly_unique_addresses",
"billing_month": "2026-06",
"monthly_unique_addresses_used": 585,
"monthly_address_limit": 2000,
"monthly_addresses_remaining": 1415,
"service_continues_after_limit": true,
"resets_at": "2026-07-01T00:00:00Z",
"api_rate_per_min": 1500,
"api_batch_max": 1000,
"max_api_keys": 10
}
API access and operational safeguards depend on your subscription plan. Rate limits are enforced per API key per minute. Pricing is based on monthly unique canonical addresses across the shared customer account. Screening checks remain subject to the displayed rate, batch, and plan safeguards. See pricing for current plans.
Every authenticated API response includes rate limit headers. Monthly unique-address reporting is separate from these operational rate limits and does not create an automatic cutoff in v1.
X-RateLimit-Limit: 1500 # Requests allowed per minute X-RateLimit-Remaining: 1495 # Requests remaining in current window X-RateLimit-Reset: 1742054460 # Unix timestamp when limit resets
When the per-minute limit is exceeded, the API returns 429 rate_limited with a
Retry-After header indicating seconds to wait before retrying:
Retry-After: 21
{
"error": "rate_limited",
"message": "Per-minute rate limit exceeded. Retry after the window resets (see Retry-After).",
"retry_after_seconds": 21
}
| Endpoint | Starter | Growth | Enterprise |
|---|---|---|---|
/v1/addresses/{addr}/risk | Yes | Yes | Yes |
/v1/addresses/risk/batch | Yes (100/batch) | Yes (1,000/batch) | Yes (1,000/batch) |
/v1/chains | Yes | Yes | Yes |
/v1/usage | Yes | Yes | Yes |
Billing is measured in monthly unique canonical addresses per customer account across the UTC billing month — an address counts once per month no matter how many times it is checked, from the API, web screening, reports, or PDF exports. The same EVM address checked on multiple EVM networks counts once. Every screening check remains subject to the per-minute rate, batch-size, and plan safeguards above.
GET /v1/usage or on the ; account admins see team-wide usage.
Errors return an error code (machine-stable) and usually a human-readable message:
{
"error": "api_key_required",
"message": "API key required. Send \"Authorization: Bearer <your API key>\"."
}
| Status | Code | Description |
|---|---|---|
| 400 | invalid_address | Address format is not valid for any supported chain |
| 400 | unsupported_chain | The requested chain is not active for public screening |
| 400 | ambiguous_address | Native format matches multiple networks — pass a chain hint |
| 400 | address_requires_review | Ambiguous format — choose the intended network with a chain hint |
| 400 | chain_required | This address format needs an explicit chain hint |
| 400 | chain_mismatch | Address does not match the requested chain |
| 400 | ens_only_supported_for_evm | ENS names resolve for EVM screening only |
| 400 | empty_addresses | Batch request requires at least one address |
| 400 | too_many_addresses | Batch exceeds your plan's maximum (max_addresses is included) |
| 401 | api_key_required | No Authorization: Bearer header was sent |
| 401 | api_key_invalid | API key not found, malformed, or revoked |
| 403 | api_key_inactive_membership | Key is valid but its account membership is inactive |
| 403 | batch_not_available | Plan has no batch access |
| 404 | not_found | Endpoint does not exist — see the OpenAPI spec |
| 429 | rate_limited | Per-minute rate limit exceeded; honor Retry-After |
| 500 | internal_error | Unexpected server error |
| 502 | direct_check_failed | Screening backend temporarily unavailable — retry; failed checks never count toward usage |
| 503 | api_key_unavailable | Key verification temporarily unavailable — retry shortly |
| 503 | chains_unavailable | Chain registry snapshot temporarily unavailable |
| Symptom | Likely cause & fix |
|---|---|
401 api_key_required on every call | The Authorization header is missing or not in Bearer ev_… form. Check for a trailing space or a proxy stripping the header. |
401 api_key_invalid with a key you just created | The key was copied partially (keys are shown once, start with ev_), or it has been revoked on the page. |
403 api_key_inactive_membership | The key owner was removed from the customer account. An account admin can issue a new key. |
429 rate_limited bursts | You are above your plan's per-key per-minute limit. Honor Retry-After, spread requests across the minute, use batch requests, or upgrade the plan. |
400 ambiguous_address / chain_required | Native non-EVM formats (e.g. some legacy Bitcoin-family addresses) can match several networks — pass ?chain=<slug>. |
Status is UNKNOWN_STALE / UNKNOWN_INCOMPLETE | Coverage for that scope is stale or incomplete. This is a deliberate fail-closed signal — treat it as requiring review, not as a clean result. |
EVM result lists "chain": "evm" instead of the network you sent | Expected: one EVM check covers every supported EVM network at once, and usage counts the address once. |
Stuck, or need a higher limit, an enterprise batch size, or scheduled data feeds? Email support@eaglevirtual.com, use the contact form, or reach sales@eaglevirtual.com for plan questions. Security reports: see /security.
The API supplies source-cited screening evidence. Legal obligations, regulatory reporting, market-abuse controls, customer due diligence, and disposition remain with the customer.
Use address evidence as one input to sanctions, AML, and source-of-funds review. It does not replace MiCA authorization, Article 92 market-abuse controls, or Transfer of Funds Regulation messaging.
Review the MiCA screening guideUse the response in the institution’s review and escalation process under the applicable BCB and COAF framework. Eagle Virtual does not decide whether a communication is required or submit it.
Review the Brazil screening guideRead the named authority, current or historical status, providers, freshness, and coverage fields before routing the result through your sanctions procedure.
Review sanctions coverageBitcoin, Bitcoin Cash, Litecoin, Dogecoin, Dash, Zcash transparent addresses, and TRON have address-record checks against covered government sanctions sources. A no-known-hit response for that scope is not connection, balance, transaction-monitoring, mixer, bridge, token-control, name, or pricing coverage. Stale or incomplete coverage remains fail closed.