Skip to content

Créer un contrôle AML ​

Crée un nouveau contrôle AML pour une adresse de portefeuille ou un hash de transaction spécifique. Le prix du contrôle est réservé sur votre solde au démarrage du contrôle, et la réponse renvoie le contrôle.

POST /v1/aml-checks/new

Requête ​

Paramètres ​

ChampTypeObligatoireDescription
typestringOuiType de service AML : address ou hash
networkstringOuiCode du réseau blockchain (voir tableau)
addressstringOuiAdresse valide pour le réseau sélectionné. Pour type = hash, il s’agit de l’adresse participant à la transaction dont le côté est analysé (voir direction).
hashstringConditionnel*Hash de transaction au format du réseau sélectionné (TRX : 64 caractères hexadécimaux, sans préfixe 0x ; Ethereum et les autres réseaux EVM : 0x suivi de 64 caractères hexadécimaux ; le format de chaque réseau est donné par l’exemple du tableau ci-dessous). Requis lorsque type = hash
directionstringConditionnel**Côté de la transaction analysé pour address : deposit — fonds arrivant sur cette adresse, withdrawal — fonds qui la quittent. Requis lorsque type = hash

* Uniquement pour les contrôles de hash.
** Uniquement pour les contrôles de hash. Il n’y a pas de valeur par défaut : un contrôle de hash sans direction valide est refusé.

Types de service disponibles ​

TypeDescription
addressAnalyse une adresse et calcule son profil de risque
hashAnalyse une transaction unique du point de vue de l’une de ses adresses (deposit ou withdrawal)

Réseaux pris en charge ​

CodeRéseauExemple d’adresseExemple de hash
TRXTRONTR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6tfd4f300e12040089f624353cdfe7c2ae7ed2378fa65c7e5cce60f69cb1d43bab
BTCBitcoinbc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b
ETHEthereum0x742d35Cc6634C0532925a3b844Bc454e4438f44e0x0f61ba2c923f4113a91eec9a9ce6145866e18b91dab5d2899dbe586a1847652b
BSCBNB Chain0x742d35Cc6634C0532925a3b844Bc454e4438f44e0x0f61ba2c923f4113a91eec9a9ce6145866e18b91dab5d2899dbe586a1847652b
SOLSolanaTokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA5VERv8NMvzbJMEkV8xnrLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpRzrFmBV6UjKdiSZkQUW
TONTONEQCD39VS5jcptHL8vMjEXrzGaRcCVYto7HUn4bpAOg8xqB2Nfd4f300e12040089f624353cdfe7c2ae7ed2378fa65c7e5cce60f69cb1d43bab
MATICPolygon0x742d35Cc6634C0532925a3b844Bc454e4438f44e0x0f61ba2c923f4113a91eec9a9ce6145866e18b91dab5d2899dbe586a1847652b
ARBArbitrum0x742d35Cc6634C0532925a3b844Bc454e4438f44e0x0f61ba2c923f4113a91eec9a9ce6145866e18b91dab5d2899dbe586a1847652b
BASEBase0x742d35Cc6634C0532925a3b844Bc454e4438f44e0x0f61ba2c923f4113a91eec9a9ce6145866e18b91dab5d2899dbe586a1847652b
OPOptimism0x742d35Cc6634C0532925a3b844Bc454e4438f44e0x0f61ba2c923f4113a91eec9a9ce6145866e18b91dab5d2899dbe586a1847652b
AVAXAvalanche C-Chain0x742d35Cc6634C0532925a3b844Bc454e4438f44e0x0f61ba2c923f4113a91eec9a9ce6145866e18b91dab5d2899dbe586a1847652b
LTCLitecoinLQTpS3VaYTjCr4s9Y1t5zbeY26zevf7Fb34a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b
XRPRipplerHb9CJAWyB4rj91VRWn96DkukG4bwdtyThE3FE6EA3D48F0C2B639448020EA4F03D4F4F8FFDB243A852A0F59177921B4879
ALGOAlgorandVCMJKWOY5P5P7SKMZFFOCEROPJCZOTIJMNIYNUCKH7LRO45JMJP6UYBIJAUITN53MFMO6QHK6GCAUMF5MXBJG4OB6S3VCHTGFY5PQGHNWJ5NWQ
APTAptos0x00000000000000000000000000000000000000000000000000000000000000010x0f61ba2c923f4113a91eec9a9ce6145866e18b91dab5d2899dbe586a1847652b
BCHBitcoin Cashbitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b
BSVBitcoin SV1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b
ADACardanoaddr1qx2fxv2umyhttkxyxp8x0dlpdt3k6cwng5pxj3jhsydzer3n0d3vllmyqwsx5wktcd8cc3sq835lu7drv2xwl2wywfgse35a3x8a5a6f0e9c5d7c4e1b62ef2b36d03b34f2b0b6f9f6c7e7a3d55b0f5c8a3b2c1d
CELOCelo0x742d35Cc6634C0532925a3b844Bc454e4438f44e0x0f61ba2c923f4113a91eec9a9ce6145866e18b91dab5d2899dbe586a1847652b
DOGEDogecoinDH5yaieqoZN36fDVciNyRueRGvGLR3mr7L4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b
ETCEthereum Classic0x742d35Cc6634C0532925a3b844Bc454e4438f44e0x0f61ba2c923f4113a91eec9a9ce6145866e18b91dab5d2899dbe586a1847652b
NEARNEARalice.near6zgh2u9DqHHiXzdy9ouTP7oGky2T4nugqzqt9wJZwNFm
DOTPolkadot15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp50x0f61ba2c923f4113a91eec9a9ce6145866e18b91dab5d2899dbe586a1847652b
XLMStellarGAAZI4TCR3TY5OJHCTJC2A4QSY6CJWJH5IAJTGKIN2ER7LBNVKOCCWN73389e9f0f1a65f19736cacf544c2e825313e8447f569233bb8db39aa607c8889
TetherOMNITether (Omni)1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b
XTZTezostz1VSUr8wwNhLAzempoch5d6hLRiTh8CjcjbonvsLP3JFZia2mzZKWaFuFkWg2L5p3BDUhzh5Kr6CiDDN3rtQ1D
ZECZcasht1Rv4exT7bqhZqi2j7xz8bUHDMxwosrjADU4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b

TIP

Tous les réseaux de cette liste sont analysés, au même prix par contrôle quel que soit le réseau. network n’est pas sensible à la casse (btc équivaut à BTC) ; address et hash sont vérifiés selon le format du réseau choisi. Un type de contrôle non proposé pour votre projet (voir Obtenir les services AML), ou un réseau que le service d’analyse ne peut pas prendre en charge pour le moment, reçoit le code 35 et rien n’est facturé.

bash
#!/bin/bash
API_TOKEN="your_api_token"
API_SECRET="your_api_secret"
REQUEST_BODY='{
  "type": "address",
  "network": "TRX",
  "address": "TPY1Kb8cKAZQfm95gXQQs2Mh8Uygtos21D"
}'

# Calculer la signature
SIGNATURE=$(echo -n "${REQUEST_BODY}${API_SECRET}" | sha256sum | cut -d' ' -f1)

# Envoyer la requête API
curl -X POST "https://api.trxup.com/v1/aml-checks/new" \
  -H "Authorization: Bearer ${API_TOKEN}" \
  -H "X-Signature: ${SIGNATURE}" \
  -H "Content-Type: application/json" \
  -d "${REQUEST_BODY}"
javascript
const crypto = require('crypto');
const axios = require('axios');

const apiToken = 'your_api_token';
const apiSecret = 'your_api_secret';
const requestBody = JSON.stringify({
  type: 'address',
  network: 'TRX',
  address: 'TPY1Kb8cKAZQfm95gXQQs2Mh8Uygtos21D'
});

// Calculer la signature
const signature = crypto
  .createHash('sha256')
  .update(requestBody + apiSecret)
  .digest('hex');

// Envoyer la requête API
axios({
  method: 'post',
  url: 'https://api.trxup.com/v1/aml-checks/new',
  headers: {
    'Authorization': `Bearer ${apiToken}`,
    'X-Signature': signature,
    'Content-Type': 'application/json'
  },
  data: requestBody
})
.then(response => console.log(response.data))
.catch(error => console.error(error));
php
<?php
$apiToken = 'your_api_token';
$apiSecret = 'your_api_secret';
$requestBody = json_encode([
  'type' => 'address',
  'network' => 'TRX',
  'address' => 'TPY1Kb8cKAZQfm95gXQQs2Mh8Uygtos21D',
], JSON_UNESCAPED_SLASHES);

// Calculer la signature
$signature = hash('sha256', $requestBody . $apiSecret);

// Envoyer la requête API
$ch = curl_init('https://api.trxup.com/v1/aml-checks/new');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $requestBody);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  'Authorization: Bearer ' . $apiToken,
  'X-Signature: ' . $signature,
  'Content-Type: application/json'
]);

$response = curl_exec($ch);
curl_close($ch);

echo $response;
?>
python
import hashlib
import json
import requests

api_token = 'your_api_token'
api_secret = 'your_api_secret'
request_body = json.dumps({
  'type': 'address',
  'network': 'TRX',
  'address': 'TPY1Kb8cKAZQfm95gXQQs2Mh8Uygtos21D'
})

# Calculer la signature
signature = hashlib.sha256((request_body + api_secret).encode()).hexdigest()

# Envoyer la requête API
headers = {
  'Authorization': f'Bearer {api_token}',
  'X-Signature': signature,
  'Content-Type': 'application/json'
}

response = requests.post(
  'https://api.trxup.com/v1/aml-checks/new',
  headers=headers,
  data=request_body
)

print(response.json())

Exemple de requête pour un hash ​

bash
#!/bin/bash
API_TOKEN="your_api_token"
API_SECRET="your_api_secret"
REQUEST_BODY='{
  "type": "hash",
  "network": "TRX",
  "address": "TPY1Kb8cKAZQfm95gXQQs2Mh8Uygtos21D",
  "hash": "E3F2A1B66DBB9F0B24C4125229163944A7D91EB3F1AC5E409FFCEE0C81A913F2",
  "direction": "withdrawal"
}'

# Calculer la signature
SIGNATURE=$(echo -n "${REQUEST_BODY}${API_SECRET}" | sha256sum | cut -d' ' -f1)

# Envoyer la requête API
curl -X POST "https://api.trxup.com/v1/aml-checks/new" \
  -H "Authorization: Bearer ${API_TOKEN}" \
  -H "X-Signature: ${SIGNATURE}" \
  -H "Content-Type: application/json" \
  -d "${REQUEST_BODY}"
javascript
const crypto = require('crypto');
const axios = require('axios');

const apiToken = 'your_api_token';
const apiSecret = 'your_api_secret';
const requestBody = JSON.stringify({
  type: 'hash',
  network: 'TRX',
  address: 'TPY1Kb8cKAZQfm95gXQQs2Mh8Uygtos21D',
  hash: 'E3F2A1B66DBB9F0B24C4125229163944A7D91EB3F1AC5E409FFCEE0C81A913F2',
  direction: 'withdrawal'
});

// Calculer la signature
const signature = crypto
  .createHash('sha256')
  .update(requestBody + apiSecret)
  .digest('hex');

// Envoyer la requête API
axios({
  method: 'post',
  url: 'https://api.trxup.com/v1/aml-checks/new',
  headers: {
    'Authorization': `Bearer ${apiToken}`,
    'X-Signature': signature,
    'Content-Type': 'application/json'
  },
  data: requestBody
})
.then(response => console.log(response.data))
.catch(error => console.error(error));
php
<?php
$apiToken = 'your_api_token';
$apiSecret = 'your_api_secret';
$requestBody = json_encode([
  'type' => 'hash',
  'network' => 'TRX',
  'address' => 'TPY1Kb8cKAZQfm95gXQQs2Mh8Uygtos21D',
  'hash' => 'E3F2A1B66DBB9F0B24C4125229163944A7D91EB3F1AC5E409FFCEE0C81A913F2',
  'direction' => 'withdrawal'
], JSON_UNESCAPED_SLASHES);

// Calculer la signature
$signature = hash('sha256', $requestBody . $apiSecret);

// Envoyer la requête API
$ch = curl_init('https://api.trxup.com/v1/aml-checks/new');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $requestBody);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  'Authorization: Bearer ' . $apiToken,
  'X-Signature: ' . $signature,
  'Content-Type: application/json'
]);

$response = curl_exec($ch);
curl_close($ch);

echo $response;
?>
python
import hashlib
import json
import requests

api_token = 'your_api_token'
api_secret = 'your_api_secret'
request_body = json.dumps({
  'type': 'hash',
  'network': 'TRX',
  'address': 'TPY1Kb8cKAZQfm95gXQQs2Mh8Uygtos21D',
  'hash': 'E3F2A1B66DBB9F0B24C4125229163944A7D91EB3F1AC5E409FFCEE0C81A913F2',
  'direction': 'withdrawal'
})

# Calculer la signature
signature = hashlib.sha256((request_body + api_secret).encode()).hexdigest()

# Envoyer la requête API
headers = {
  'Authorization': f'Bearer {api_token}',
  'X-Signature': signature,
  'Content-Type': 'application/json'
}

response = requests.post(
  'https://api.trxup.com/v1/aml-checks/new',
  headers=headers,
  data=request_body
)

print(response.json())

Réponse ​

La réponse renvoie le contrôle AML. Si le résultat est encore en cours de finalisation, le statut est pending : interrogez Consulter le statut AML avec l’id renvoyé jusqu’à ce qu’il change.

Champs de la réponse ​

ChampTypeDescription
codeintegerCode de réponse (0 = succès)
request_idstringIdentifiant unique de la requête
resultobjectDonnées du contrôle AML
result.idstringIdentifiant du contrôle AML
result.typestringType de service AML (address ou hash)
result.addressstringAdresse analysée
result.networkstringCode du réseau blockchain, tel qu’écrit dans la liste des réseaux pris en charge (par ex. TRX, TetherOMNI)
result.statusstringStatut du contrôle (pending, processing, completed, failed, expired, skipped)
result.risk_scorestring|nullScore de risque sous forme de chaîne à deux décimales (par ex. "12.50"), ou null tant qu’aucun score n’est disponible
result.risk_levelstring|nullNiveau de risque textuel (low, medium, high)
result.blacklistbooleantrue si une correspondance sur liste noire est détectée
result.risk_factorsarrayCatégories de risque auxquelles les fonds sont liés, triées par score décroissant, une entrée par catégorie ; [] vide si aucune catégorie n’a été signalée (par exemple tant que le contrôle n’est pas terminé)
result.risk_factors[].namestringClé de la catégorie, l’une de celles listées dans Catégories de facteurs de risque ; une catégorie hors de cette liste est signalée comme other
result.risk_factors[].labelstringLibellé anglais de la catégorie (non traduit)
result.risk_factors[].groupstringGroupe de risque de la catégorie : low, medium ou high
result.risk_factors[].scorenumberPart des fonds liée à cette catégorie, de 0 à 1, arrondie à 3 décimales
result.checked_atstringHorodatage de création du contrôle (ISO 8601)
result.hashstringHash analysé (uniquement pour hash)
result.directionstringCôté de la transaction analysé, deposit ou withdrawal (uniquement pour hash)

La liste complète des clés de catégorie, avec leurs libellés et leurs groupes, figure dans Catégories de facteurs de risque.

Exemple de réponse ​

json
{
  "code": 0,
  "request_id": "bbf74bcd-fb36-4df8-adc8-25f2bacd087b",
  "result": {
    "id": "1041",
    "type": "address",
    "address": "TPY1Kb8cKAZQfm95gXQQs2Mh8Uygtos21D",
    "network": "TRX",
    "status": "completed",
    "risk_score": "12.50",
    "risk_level": "medium",
    "blacklist": false,
    "risk_factors": [
      {
        "name": "exchange",
        "label": "Exchange",
        "group": "low",
        "score": 0.9
      },
      {
        "name": "p2p_exchange_mlrisk_high",
        "label": "P2P Exchange (High Risk)",
        "group": "medium",
        "score": 0.1
      }
    ],
    "checked_at": "2024-03-25T10:40:05+00:00"
  }
}

Pour un contrôle de hash, hash et direction suivent checked_at :

json
{
  "code": 0,
  "request_id": "bbf74bcd-fb36-4df8-adc8-25f2bacd087b",
  "result": {
    "id": "1042",
    "type": "hash",
    "address": "TPY1Kb8cKAZQfm95gXQQs2Mh8Uygtos21D",
    "network": "TRX",
    "status": "pending",
    "risk_score": null,
    "risk_level": null,
    "blacklist": false,
    "risk_factors": [],
    "checked_at": "2024-03-25T10:42:12+00:00",
    "hash": "E3F2A1B66DBB9F0B24C4125229163944A7D91EB3F1AC5E409FFCEE0C81A913F2",
    "direction": "withdrawal"
  }
}

Facturation et requêtes répétées ​

  • Le prix du contrôle est réservé au démarrage du contrôle. Si le contrôle ne peut pas être exécuté — données refusées ou erreur de notre côté —, la réservation est intégralement restituée.
  • Pour un contrôle de hash, si address ne participe pas à la transaction, le contrôle est refusé avec le code 2 (The address was not found in this transaction) et rien n’est facturé.
  • Pour un contrôle d’adresse, si le service de contrôle refuse de contrôler l’adresse, le contrôle est refusé avec le code 2 (The screening service could not check this address; nothing was charged, clé invalid_service_or_params, sans détail) et rien n’est facturé. Vérifiez l’adresse et réessayez plus tard.
  • La même question posée à nouveau dans l’heure — mêmes type, network et address, et pour les contrôles de hash également mêmes hash et direction — renvoie le contrôle précédent sans rien facturer.
  • Une seconde requête identique envoyée alors que la première est encore en cours est refusée avec HTTP 503 (temporarily_unavailable) et rien n’est facturé. Réessayez dans un instant.

Erreurs possibles ​

Code d’erreurKeyDescription
1authErreur d’authentification (token ou signature incorrects)
2invalid_service_or_paramsParamètres invalides, vérifiés dans cet ordre : type ; network (Unsupported network) ; address (Invalid address provided) ; pour les contrôles de hash, hash (Hash is required for hash checks) et direction (Invalid direction value) ; pour un contrôle de hash dont l’address ne participe pas à la transaction, The address was not found in this transaction (clé invalid_service_or_params.hash), rien n’est facturé ; pour un contrôle d’adresse refusé par le service de contrôle, The screening service could not check this address; nothing was charged (clé invalid_service_or_params), rien n’est facturé
5wallet_not_foundPortefeuille introuvable
6insufficient_fundsFonds insuffisants pour exécuter le contrôle
35service_unavailableCe type de contrôle ou ce réseau n’est pas disponible pour votre projet (par exemple, un type de contrôle non proposé pour votre projet) ; rien n’est facturé
500internal_server_errorErreur interne du serveur
503temporarily_unavailableUn contrôle identique est encore en cours (HTTP 503) ; rien n’a été facturé, réessayez dans un instant

Tron Energy API Documentation