Skip to content

Criar verificação AML ​

Cria uma nova verificação AML para um endereço de carteira ou para um hash de transação específico. O preço da verificação é reservado do seu saldo quando a verificação começa, e a resposta retorna a verificação.

POST /v1/aml-checks/new

Requisição ​

Parâmetros ​

CampoTipoObrigatórioDescrição
typestringSimTipo de serviço AML: address ou hash
networkstringSimCódigo da rede blockchain (veja a tabela)
addressstringSimEndereço válido para a rede selecionada. Para type = hash, é o endereço que participa da transação e cujo lado é analisado (veja direction).
hashstringCondicional*Hash da transação no formato da rede selecionada (TRX: 64 caracteres hexadecimais, sem prefixo 0x; Ethereum e as demais redes EVM: 0x e 64 caracteres hexadecimais; o formato de cada rede aparece no exemplo da tabela abaixo). Obrigatório quando type = hash
directionstringCondicional**Qual lado da transação é analisado para address: deposit — fundos que chegam a esse endereço, withdrawal — fundos que saem dele. Obrigatório quando type = hash

* Apenas para verificações de hash.
** Apenas para verificações de hash. Não há valor padrão: uma verificação de hash sem um direction válido é recusada.

Tipos de serviço ​

TipoDescrição
addressAnalisa um endereço de carteira e calcula o perfil de risco
hashAnalisa uma única transação a partir do lado de um dos seus endereços (deposit ou withdrawal)

Redes suportadas ​

CódigoRedeEndereço de exemploHash de exemplo
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

Todas as redes desta lista são analisadas, pelo mesmo preço por verificação, qualquer que seja a rede. network não diferencia maiúsculas de minúsculas (btc é BTC); address e hash são conferidos com o formato da rede selecionada. Um tipo de verificação que não está à venda para o seu projeto (veja Obter serviços AML), ou uma rede que o serviço de análise não consegue atender no momento, é respondido com o código 35 e nada é cobrado.

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

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

# Chamada à 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'
});

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

// Chamada à 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);

// Calcular assinatura
$signature = hash('sha256', $requestBody . $apiSecret);

// Chamada à 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'
})

# Calcular assinatura
signature = hashlib.sha256((request_body + api_secret).encode()).hexdigest()

# Chamada à 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())

Exemplo de requisição para 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"
}'

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

# Chamada à 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'
});

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

// Chamada à 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);

// Calcular assinatura
$signature = hash('sha256', $requestBody . $apiSecret);

// Chamada à 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'
})

# Calcular assinatura
signature = hashlib.sha256((request_body + api_secret).encode()).hexdigest()

# Chamada à 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())

Resposta ​

A resposta retorna a verificação AML. Se o resultado ainda estiver sendo finalizado, o status é pending: consulte Consultar status AML com o id retornado até que ele mude.

Campos da resposta ​

CampoTipoDescrição
codeintegerCódigo de resposta (0 = sucesso)
request_idstringIdentificador único da requisição
resultobjectDados da verificação AML
result.idstringIdentificador da verificação AML
result.typestringTipo de serviço AML (address ou hash)
result.addressstringEndereço analisado
result.networkstringCódigo da rede blockchain como escrito na lista de redes suportadas (ex.: TRX, TetherOMNI)
result.statusstringStatus da verificação (pending, processing, completed, failed, expired, skipped)
result.risk_scorestring|nullPontuação de risco como string com duas casas decimais (ex.: "12.50"), ou null quando ainda não há pontuação
result.risk_levelstring|nullNível de risco textual (low, medium, high)
result.blacklistbooleantrue se houver correspondência em listas de bloqueio
result.risk_factorsarrayCategorias de risco às quais os fundos estão vinculados, ordenadas do maior para o menor score, uma entrada por categoria; [] vazio quando nenhuma categoria foi informada (por exemplo, enquanto a verificação não foi concluída)
result.risk_factors[].namestringChave da categoria, uma das listadas em Categorias de fatores de risco; uma categoria fora dessa lista é informada como other
result.risk_factors[].labelstringRótulo da categoria em inglês (não traduzido)
result.risk_factors[].groupstringGrupo de risco da categoria: low, medium ou high
result.risk_factors[].scorenumberParcela dos fundos vinculada a esta categoria, de 0 a 1, arredondada a 3 casas decimais
result.checked_atstringTimestamp de criação da verificação (ISO 8601)
result.hashstringHash da transação analisado (apenas verificações de hash)
result.directionstringLado da transação analisado, deposit ou withdrawal (apenas verificações de hash)

A lista completa de chaves de categoria, com rótulos e grupos, está em Categorias de fatores de risco.

Exemplo de resposta ​

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"
  }
}

Para uma verificação de hash, hash e direction vêm depois de 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"
  }
}

Cobranças e requisições repetidas ​

  • O preço da verificação é reservado quando a verificação começa. Se a verificação não puder ser executada — os dados de entrada são recusados ou o erro é do nosso lado — a reserva é devolvida integralmente.
  • Em uma verificação de hash, se address não participar da transação, a verificação é recusada com o código 2 (The address was not found in this transaction) e nada é cobrado.
  • Em uma verificação de endereço, se o serviço de verificação se recusar a verificar o endereço, a verificação é recusada com o código 2 (The screening service could not check this address; nothing was charged, chave invalid_service_or_params, sem detalhe) e nada é cobrado. Confira o endereço e tente de novo mais tarde.
  • Repetir a mesma consulta em até uma hora — o mesmo type, network e address, e para verificações de hash também o mesmo hash e direction — retorna a verificação anterior sem cobrar nada.
  • Uma segunda requisição idêntica enviada enquanto a primeira ainda está em andamento é recusada com HTTP 503 (temporarily_unavailable) e nada é cobrado. Tente novamente em instantes.

Possíveis erros ​

Código de erroKeyDescrição
1authErro de autenticação (token ou assinatura incorretos)
2invalid_service_or_paramsParâmetros inválidos, verificados nesta ordem: type; network (Unsupported network); address (Invalid address provided); para verificações de hash, hash (Hash is required for hash checks) e direction (Invalid direction value); em uma verificação de hash cujo address não participa da transação, The address was not found in this transaction (chave invalid_service_or_params.hash), nada é cobrado; em uma verificação de endereço recusada pelo serviço de verificação, The screening service could not check this address; nothing was charged (chave invalid_service_or_params), nada é cobrado
5wallet_not_foundCarteira não encontrada
6insufficient_fundsFundos insuficientes para executar a verificação
35service_unavailableEste tipo de verificação ou esta rede não está disponível para o seu projeto (por exemplo, um tipo de verificação que não está à venda para o seu projeto); nada é cobrado
500internal_server_errorErro interno do servidor
503temporarily_unavailableUma verificação idêntica ainda está em andamento (HTTP 503); nada foi cobrado, tente novamente em instantes

Tron Energy API Documentation