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
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
| type | string | Oui | Type de service AML : address ou hash |
| network | string | Oui | Code du réseau blockchain (voir tableau) |
| address | string | Oui | Adresse 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). |
| hash | string | Conditionnel* | 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 |
| direction | string | Conditionnel** | 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
| Type | Description |
|---|---|
| address | Analyse une adresse et calcule son profil de risque |
| hash | Analyse une transaction unique du point de vue de l’une de ses adresses (deposit ou withdrawal) |
Réseaux pris en charge
| Code | Réseau | Exemple d’adresse | Exemple de hash |
|---|---|---|---|
| TRX | TRON | TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t | fd4f300e12040089f624353cdfe7c2ae7ed2378fa65c7e5cce60f69cb1d43bab |
| BTC | Bitcoin | bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq | 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b |
| ETH | Ethereum | 0x742d35Cc6634C0532925a3b844Bc454e4438f44e | 0x0f61ba2c923f4113a91eec9a9ce6145866e18b91dab5d2899dbe586a1847652b |
| BSC | BNB Chain | 0x742d35Cc6634C0532925a3b844Bc454e4438f44e | 0x0f61ba2c923f4113a91eec9a9ce6145866e18b91dab5d2899dbe586a1847652b |
| SOL | Solana | TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA | 5VERv8NMvzbJMEkV8xnrLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpRzrFmBV6UjKdiSZkQUW |
| TON | TON | EQCD39VS5jcptHL8vMjEXrzGaRcCVYto7HUn4bpAOg8xqB2N | fd4f300e12040089f624353cdfe7c2ae7ed2378fa65c7e5cce60f69cb1d43bab |
| MATIC | Polygon | 0x742d35Cc6634C0532925a3b844Bc454e4438f44e | 0x0f61ba2c923f4113a91eec9a9ce6145866e18b91dab5d2899dbe586a1847652b |
| ARB | Arbitrum | 0x742d35Cc6634C0532925a3b844Bc454e4438f44e | 0x0f61ba2c923f4113a91eec9a9ce6145866e18b91dab5d2899dbe586a1847652b |
| BASE | Base | 0x742d35Cc6634C0532925a3b844Bc454e4438f44e | 0x0f61ba2c923f4113a91eec9a9ce6145866e18b91dab5d2899dbe586a1847652b |
| OP | Optimism | 0x742d35Cc6634C0532925a3b844Bc454e4438f44e | 0x0f61ba2c923f4113a91eec9a9ce6145866e18b91dab5d2899dbe586a1847652b |
| AVAX | Avalanche C-Chain | 0x742d35Cc6634C0532925a3b844Bc454e4438f44e | 0x0f61ba2c923f4113a91eec9a9ce6145866e18b91dab5d2899dbe586a1847652b |
| LTC | Litecoin | LQTpS3VaYTjCr4s9Y1t5zbeY26zevf7Fb3 | 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b |
| XRP | Ripple | rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh | E3FE6EA3D48F0C2B639448020EA4F03D4F4F8FFDB243A852A0F59177921B4879 |
| ALGO | Algorand | VCMJKWOY5P5P7SKMZFFOCEROPJCZOTIJMNIYNUCKH7LRO45JMJP6UYBIJA | UITN53MFMO6QHK6GCAUMF5MXBJG4OB6S3VCHTGFY5PQGHNWJ5NWQ |
| APT | Aptos | 0x0000000000000000000000000000000000000000000000000000000000000001 | 0x0f61ba2c923f4113a91eec9a9ce6145866e18b91dab5d2899dbe586a1847652b |
| BCH | Bitcoin Cash | bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a | 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b |
| BSV | Bitcoin SV | 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa | 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b |
| ADA | Cardano | addr1qx2fxv2umyhttkxyxp8x0dlpdt3k6cwng5pxj3jhsydzer3n0d3vllmyqwsx5wktcd8cc3sq835lu7drv2xwl2wywfgse35a3x | 8a5a6f0e9c5d7c4e1b62ef2b36d03b34f2b0b6f9f6c7e7a3d55b0f5c8a3b2c1d |
| CELO | Celo | 0x742d35Cc6634C0532925a3b844Bc454e4438f44e | 0x0f61ba2c923f4113a91eec9a9ce6145866e18b91dab5d2899dbe586a1847652b |
| DOGE | Dogecoin | DH5yaieqoZN36fDVciNyRueRGvGLR3mr7L | 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b |
| ETC | Ethereum Classic | 0x742d35Cc6634C0532925a3b844Bc454e4438f44e | 0x0f61ba2c923f4113a91eec9a9ce6145866e18b91dab5d2899dbe586a1847652b |
| NEAR | NEAR | alice.near | 6zgh2u9DqHHiXzdy9ouTP7oGky2T4nugqzqt9wJZwNFm |
| DOT | Polkadot | 15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5 | 0x0f61ba2c923f4113a91eec9a9ce6145866e18b91dab5d2899dbe586a1847652b |
| XLM | Stellar | GAAZI4TCR3TY5OJHCTJC2A4QSY6CJWJH5IAJTGKIN2ER7LBNVKOCCWN7 | 3389e9f0f1a65f19736cacf544c2e825313e8447f569233bb8db39aa607c8889 |
| TetherOMNI | Tether (Omni) | 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa | 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b |
| XTZ | Tezos | tz1VSUr8wwNhLAzempoch5d6hLRiTh8Cjcjb | onvsLP3JFZia2mzZKWaFuFkWg2L5p3BDUhzh5Kr6CiDDN3rtQ1D |
| ZEC | Zcash | t1Rv4exT7bqhZqi2j7xz8bUHDMxwosrjADU | 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b |
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é.
#!/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}"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
$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;
?>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
#!/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}"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
$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;
?>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
| Champ | Type | Description |
|---|---|---|
| code | integer | Code de réponse (0 = succès) |
| request_id | string | Identifiant unique de la requête |
| result | object | Données du contrôle AML |
| result.id | string | Identifiant du contrôle AML |
| result.type | string | Type de service AML (address ou hash) |
| result.address | string | Adresse analysée |
| result.network | string | Code du réseau blockchain, tel qu’écrit dans la liste des réseaux pris en charge (par ex. TRX, TetherOMNI) |
| result.status | string | Statut du contrôle (pending, processing, completed, failed, expired, skipped) |
| result.risk_score | string|null | Score 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_level | string|null | Niveau de risque textuel (low, medium, high) |
| result.blacklist | boolean | true si une correspondance sur liste noire est détectée |
| result.risk_factors | array | Caté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[].name | string | Clé 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[].label | string | Libellé anglais de la catégorie (non traduit) |
| result.risk_factors[].group | string | Groupe de risque de la catégorie : low, medium ou high |
| result.risk_factors[].score | number | Part des fonds liée à cette catégorie, de 0 à 1, arrondie à 3 décimales |
| result.checked_at | string | Horodatage de création du contrôle (ISO 8601) |
| result.hash | string | Hash analysé (uniquement pour hash) |
| result.direction | string | Cô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
{
"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 :
{
"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
addressne participe pas à la transaction, le contrôle est refusé avec le code2(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,networketaddress, et pour les contrôles de hash également mêmeshashetdirection— 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’erreur | Key | Description |
|---|---|---|
| 1 | auth | Erreur d’authentification (token ou signature incorrects) |
| 2 | invalid_service_or_params | Paramè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é |
| 5 | wallet_not_found | Portefeuille introuvable |
| 6 | insufficient_funds | Fonds insuffisants pour exécuter le contrôle |
| 35 | service_unavailable | Ce 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é |
| 500 | internal_server_error | Erreur interne du serveur |
| 503 | temporarily_unavailable | Un contrôle identique est encore en cours (HTTP 503) ; rien n’a été facturé, réessayez dans un instant |