Skip to main content

Transaction Monitoring (KYT / KYA) API

The Transaction Monitoring API provides a single unified endpoint for crypto risk screening:

  • KYA — Know Your Address: risk-score a wallet/address and (optionally) return its exposure, entities, and activity summary.
  • KYT — Know Your Transaction: risk-score a transaction hash and (optionally) return its entities, flags, amounts, and inputs/outputs.

Both are served by the same endpoint — you choose which one with the type field.

Base URL​

https://api2.cycurid.com

Authentication​

POST /v2/public/transaction-monitoring uses Basic Authentication with your merchant credentials:

  • Username: {{merchantApiKey}}
  • Password: {{merchantSecret}}
Authorization: Basic base64(merchantApiKey:merchantSecret)

Endpoint​

POST /v2/public/transaction-monitoring​

Screen a single address or transaction.

Content-Type​

application/json

Request Parameters​

FieldTypeRequiredDescription
typestringYesWhat to screen: "address" (KYA) or "transaction" (KYT).
querystringYesThe wallet address or transaction hash to screen. 1–255 characters; only A–Z a–z 0–9 : _ - are allowed (covers bech32, CashAddr, and standard hash/address formats).
currencystringYesThe chain's ISO currency code, e.g. "btc", "eth", "sol". Validated server-side; an unsupported value returns the list of supported currencies (see Supported Currencies).
reportstringNoDetail level: "simple" (default) returns just the risk score; "detailed" returns entities, flags, and activity/exposure data.
labelstringNoA free-text label stored with the query for your own reference (max 255 chars). Defaults to "API Query".
simple vs. detailed

Use simple for a fast risk gate (score only). Use detailed when you need the supporting evidence — counterparty entities, risk flags, exposure breakdown, and (for transactions) amounts and inputs/outputs.

Usage Examples​

Example 1: Address risk check (KYA, simple)​

curl -X POST 'https://api2.cycurid.com/v2/public/transaction-monitoring' \
-u '{{merchantApiKey}}:{{merchantSecret}}' \
-H 'Content-Type: application/json' \
-d '{
"type": "address",
"query": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
"currency": "btc"
}'

Example 2: Transaction risk check (KYT, detailed)​

curl -X POST 'https://api2.cycurid.com/v2/public/transaction-monitoring' \
-u '{{merchantApiKey}}:{{merchantSecret}}' \
-H 'Content-Type: application/json' \
-d '{
"type": "transaction",
"report": "detailed",
"query": "0x9c2b19a3f4e...c1",
"currency": "eth",
"label": "settlement batch #42"
}'

Response Format​

A successful screen returns HTTP 200. The response always includes a score (the provider's risk score) plus the echoed type, query, currency, label, and a queryId you can use to reference this lookup.

Address — simple​

{
"queryId": "b7c1e2a4-...",
"type": "address",
"query": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
"currency": "btc",
"score": 12,
"label": "API Query"
}

Address — detailed​

Adds counterparty and activity data (fields present depend on the chain and what the provider has indexed):

{
"queryId": "b7c1e2a4-...",
"type": "address",
"query": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
"currency": "btc",
"score": 12,
"label": "API Query",
"newAddress": false,
"entities": [ { "name": "Example Exchange", "category": "exchange" } ],
"flags": [ { "name": "sanctions_exposure", "category": "sanctions" } ],
"cluster": "cluster-id",
"firstSeenReceiving": "2019-03-04T00:00:00Z",
"lastSeenSending": "2024-11-20T00:00:00Z",
"receivedAmount": 1.2345,
"sentAmount": 1.2000,
"numberOfTransactions": 87,
"balance": 0.0345,
"isOwner": true,
"ownerAddress": "1A1zP1eP...",
"organizationLabelName": "Example Exchange",
"exposures": { "...": "exposure breakdown" }
}
Field (detailed)Description
newAddressWhether the address is newly seen / unindexed.
entitiesKnown entities associated with the address.
flagsRisk flags with category.
clusterProvider cluster identifier.
firstSeenReceiving / firstSeenSending / lastSeenReceiving / lastSeenSendingActivity timestamps.
receivedAmount / sentAmount / balanceNative-currency totals.
numberOfTransactions / receivedTransactions / sentTransactionsTransaction counts.
isOwner / ownerAddress / organizationLabelName / organizationLabelIdOwnership / labeling.
exposuresDetailed exposure breakdown (entity / flag / rank exposures).

Transaction — simple​

{
"queryId": "3f9a0c11-...",
"type": "transaction",
"query": "0x9c2b19a3f4e...c1",
"currency": "eth",
"score": 30,
"label": "settlement batch #42"
}

Transaction — detailed​

Adds entities, flags, amounts, and inputs/outputs:

{
"queryId": "3f9a0c11-...",
"type": "transaction",
"query": "0x9c2b19a3f4e...c1",
"currency": "eth",
"score": 30,
"label": "settlement batch #42",
"entities": [ { "name": "Example Mixer", "category": "mixer" } ],
"flags": [ { "name": "mixer_exposure", "category": "anonymity" } ],
"low": 10,
"median": 30,
"average": 32,
"high": 65,
"timestamp": "2024-11-20T14:03:11Z",
"amount": 2.5,
"amountFiat": 8123.44,
"fees": 0.0012,
"feesFiat": 3.90,
"inputs": [ { "address": "0x...", "amount": 2.5 } ],
"outputs": [ { "address": "0x...", "amount": 2.4988 } ]
}
Field (detailed)Description
entities / flagsCounterparty entities and risk flags.
low / median / average / highScore distribution across the transaction's exposure.
timestampTransaction time.
amount / amountFiat / fees / feesFiatValue and fees (native + fiat).
inputs / outputsPer-address input/output breakdown.
Solana transactions

For currency: "sol", detailed transaction responses may also include solBalChange, tokenBalChange, listSigner, and tokenMetadata.

Error Responses​

StatusMeaning
400Validation failed (bad/empty query, invalid characters, missing type/currency) — see below.
400Unsupported currency — the message lists the supported currencies.
401Missing or invalid Basic Auth credentials.
404The address or transaction was not found / not yet processed by the provider.
429Rate limit exceeded.
502 / 503 / 504The upstream risk provider returned an error, was unreachable, or timed out — retry shortly.

400 — Validation Error​

{
"success": false,
"message": "Validation failed",
"errors": ["query - query contains invalid characters"]
}

400 — Unsupported Currency​

{
"success": false,
"message": "Unsupported currency: \"abc\". Supported currencies are: btc, eth, sol, ..."
}

404 — Not Found / Not Yet Processed​

{
"success": false,
"message": "Not found. The address or transaction may not have been processed yet."
}

401 — Unauthorized​

{
"message": "Invalid Merchant or Secret Key"
}

503 — Provider Unavailable​

{
"success": false,
"message": "Risk provider is temporarily unavailable. Please retry shortly."
}

Supported Currencies​

Currencies are validated server-side against the supported list. Commonly supported chains include: btc, eth, ltc, bch, bsv, xrp, xlm, doge, dash, zec, etc, bsc, ada, stx, xdc, sys, and sol.

If you submit an unsupported code, the 400 response lists the exact set of currencies currently accepted for your account.

Environment Variables​

When using the Postman collection, configure these variables:

VariableDescriptionExample Value
baseUrlAPI base URLhttps://api2.cycurid.com
merchantApiKeyYour merchant API keyProvided in portal
merchantSecretYour merchant secretProvided in portal