🧾 Transaction check: how it works
A transaction check (tx-check) takes a transaction hash, detects the network on its own, extracts the parties of the transfer and scores the risk of every address. The resulting score is the maximum across the parties, and the response shows which address produced it.
The difference from a quick check: there the subject is an address in a given currency, here it is the whole transaction, and you do not have to specify the network.
🌐 Base URL and response envelope
POST https://amlkyc.tech/api/v1/tx-checks
Authorization: Bearer <API_TOKEN>
Accept: application/json
Content-Type: application/json
A successful response always has the same shape:
{
"success": true,
"message": "Tx check created.",
"data": { }
}
So does an error:
{
"success": false,
"message": "Insufficient balance."
}
Validation errors add an errors object with the offending fields.
🔐 Access
Transaction checks are enabled for an account on request — contact support. Until they are enabled, every method answers 403 with message: Tx check is not enabled for this account.
The API key itself needs no extra setup: any key issued in the dashboard will do.
For the authorization header itself see API key authentication.
🧮 Networks and hash formats
The network is derived from the shape of the hash and then confirmed by querying the network itself — the network parameter is optional.
| Hash shape | Candidate networks |
|---|---|
0x + 64 hex | eth, bsc, polygon, arbitrum, base, optimism, avax, zksync, iotex, merlin, hsk |
| 64 hex, no prefix | trx, btc, ltc, doge, bch, ton |
| 86–88 base58 characters | solana |
| 43–44 base58 characters | sui |
43 base64 characters + = | ton |
If the hash is confirmed in several networks at once (usually the EVM family), the first confirmed one is used; a network you passed is honoured when it is among the confirmed ones.
🚦 Statuses
status | status_label | Meaning |
|---|---|---|
| 0 | new | The check has been created and queued |
| 1 | processing | Scoring of the parties is running |
| 2 | done | Finished: summary, results and score are filled in |
| 3 | failed | Data could not be obtained, the reason is in error |
The result is fetched by polling the check record: poll every few seconds until status_label becomes done or failed.
# poll until it finishes
until curl -s "https://amlkyc.tech/api/v1/tx-checks/$ID" \
-H "Authorization: Bearer $API_TOKEN" -H 'Accept: application/json' \
| tee /tmp/tx.json | grep -qE '"status_label":"(done|failed)"'; do sleep 5; done
cat /tmp/tx.json
The check runs in the same queue as quick checks and takes from a few seconds to a couple of minutes — budget a client timeout of about 10 minutes, not seconds.
⚠️ Error codes in `error`
The field is filled in only for the failed status:
error | What happened |
|---|---|
transaction_details_unavailable | The network confirmed the transaction, but its details (the parties of the transfer) could not be fetched |
risk_sources_unavailable | The parties are known, but not a single address could be scored |
internal_error | Internal error, all retries exhausted |
💳 Pricing and limits
- You are charged one check per successful
POST /api/v1/tx-checks; the price comes from your tariff plan (thetx_check_pricefield) and defaults to1. In the balance history the operation is marked with thetx_checkpurpose. - Sending the same hash again while the check is still running costs nothing — the current record is returned. Sending an already finished (
done) check is a new paid run. - If the hash is not found (
422) or the sources are silent (503), no charge is made. - The rate limit is shared across the whole API — 60 requests per minute, see Rate limits and pricing.
📚 Methods
| Method | Purpose |
|---|---|
POST /api/v1/tx-checks | Create a check from a hash |
GET /api/v1/tx-checks | List checks with filters |
GET /api/v1/tx-checks/{id} | Check record and result |