curl -X POST https://verification.didit.me/v1/transactions/ \
-H 'X-Transaction-Token: SDK_TOKEN' -H 'Content-Type: application/json' \
-d '{"txnId": "wd-2026-07-07-0042", "type": "travelRule", "info": {"direction": "out", "amount": "0.25", "currency": "ETH", "currencyType": "crypto"}, "subject": {"fullName": "Jane Doe"}, "counterparty": {"fullName": "Ana Diaz", "paymentMethod": {"type": "unhosted_wallet", "accountId": "0xBeneficiaryWallet01"}}, "travelRule": {"status": "AWAITING_COUNTERPARTY", "beneficiaryData": {"wallet_address": "0xBeneficiaryWallet01", "name": "Ana Diaz"}}, "includeCryptoScreening": true}'import { DiditSdk } from '@didit-protocol/sdk-web';
const result = await DiditSdk.shared.submitTransaction({
transactionToken: sdkToken,
transaction: {
txnId: 'wd-2026-07-07-0042',
category: 'travelRule',
details: { direction: 'out', amount: '0.25', currency: 'ETH', currencyType: 'crypto' },
subject: { fullName: 'Jane Doe' },
counterparty: { fullName: 'Ana Diaz', paymentMethod: { type: 'unhosted_wallet', accountId: '0xBeneficiaryWallet01' } },
travelRule: { status: 'AWAITING_COUNTERPARTY', beneficiaryData: { wallet_address: '0xBeneficiaryWallet01', name: 'Ana Diaz' } },
includeCryptoScreening: true
},
onActionCompleted: (refreshed) => console.log(refreshed.status)
});import requests
url = "https://verification.didit.me/v1/transactions/"
payload = {
"txnId": "wd-2026-07-07-0042",
"type": "travelRule",
"info": {
"direction": "out",
"amount": "0.25",
"currency": "ETH",
"currencyType": "crypto",
"cryptoParams": { "crypto_chain": "ETH" }
},
"subject": { "fullName": "Jane Doe" },
"counterparty": {
"fullName": "Ana Diaz",
"paymentMethod": {
"type": "unhosted_wallet",
"accountId": "0xBeneficiaryWallet01"
}
},
"travelRule": {
"status": "AWAITING_COUNTERPARTY",
"beneficiaryData": {
"wallet_address": "0xBeneficiaryWallet01",
"name": "Ana Diaz"
}
},
"includeCryptoScreening": True
}
headers = {
"X-Transaction-Token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://verification.didit.me/v1/transactions/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'txnId' => 'wd-2026-07-07-0042',
'type' => 'travelRule',
'info' => [
'direction' => 'out',
'amount' => '0.25',
'currency' => 'ETH',
'currencyType' => 'crypto',
'cryptoParams' => [
'crypto_chain' => 'ETH'
]
],
'subject' => [
'fullName' => 'Jane Doe'
],
'counterparty' => [
'fullName' => 'Ana Diaz',
'paymentMethod' => [
'type' => 'unhosted_wallet',
'accountId' => '0xBeneficiaryWallet01'
]
],
'travelRule' => [
'status' => 'AWAITING_COUNTERPARTY',
'beneficiaryData' => [
'wallet_address' => '0xBeneficiaryWallet01',
'name' => 'Ana Diaz'
]
],
'includeCryptoScreening' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Transaction-Token: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://verification.didit.me/v1/transactions/"
payload := strings.NewReader("{\n \"txnId\": \"wd-2026-07-07-0042\",\n \"type\": \"travelRule\",\n \"info\": {\n \"direction\": \"out\",\n \"amount\": \"0.25\",\n \"currency\": \"ETH\",\n \"currencyType\": \"crypto\",\n \"cryptoParams\": {\n \"crypto_chain\": \"ETH\"\n }\n },\n \"subject\": {\n \"fullName\": \"Jane Doe\"\n },\n \"counterparty\": {\n \"fullName\": \"Ana Diaz\",\n \"paymentMethod\": {\n \"type\": \"unhosted_wallet\",\n \"accountId\": \"0xBeneficiaryWallet01\"\n }\n },\n \"travelRule\": {\n \"status\": \"AWAITING_COUNTERPARTY\",\n \"beneficiaryData\": {\n \"wallet_address\": \"0xBeneficiaryWallet01\",\n \"name\": \"Ana Diaz\"\n }\n },\n \"includeCryptoScreening\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Transaction-Token", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://verification.didit.me/v1/transactions/")
.header("X-Transaction-Token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"txnId\": \"wd-2026-07-07-0042\",\n \"type\": \"travelRule\",\n \"info\": {\n \"direction\": \"out\",\n \"amount\": \"0.25\",\n \"currency\": \"ETH\",\n \"currencyType\": \"crypto\",\n \"cryptoParams\": {\n \"crypto_chain\": \"ETH\"\n }\n },\n \"subject\": {\n \"fullName\": \"Jane Doe\"\n },\n \"counterparty\": {\n \"fullName\": \"Ana Diaz\",\n \"paymentMethod\": {\n \"type\": \"unhosted_wallet\",\n \"accountId\": \"0xBeneficiaryWallet01\"\n }\n },\n \"travelRule\": {\n \"status\": \"AWAITING_COUNTERPARTY\",\n \"beneficiaryData\": {\n \"wallet_address\": \"0xBeneficiaryWallet01\",\n \"name\": \"Ana Diaz\"\n }\n },\n \"includeCryptoScreening\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://verification.didit.me/v1/transactions/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Transaction-Token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"txnId\": \"wd-2026-07-07-0042\",\n \"type\": \"travelRule\",\n \"info\": {\n \"direction\": \"out\",\n \"amount\": \"0.25\",\n \"currency\": \"ETH\",\n \"currencyType\": \"crypto\",\n \"cryptoParams\": {\n \"crypto_chain\": \"ETH\"\n }\n },\n \"subject\": {\n \"fullName\": \"Jane Doe\"\n },\n \"counterparty\": {\n \"fullName\": \"Ana Diaz\",\n \"paymentMethod\": {\n \"type\": \"unhosted_wallet\",\n \"accountId\": \"0xBeneficiaryWallet01\"\n }\n },\n \"travelRule\": {\n \"status\": \"AWAITING_COUNTERPARTY\",\n \"beneficiaryData\": {\n \"wallet_address\": \"0xBeneficiaryWallet01\",\n \"name\": \"Ana Diaz\"\n }\n },\n \"includeCryptoScreening\": true\n}"
response = http.request(request)
puts response.read_body{
"uuid": "22222222-3333-4444-5555-666666666666",
"txn_id": "wd-2026-07-07-0042",
"transaction_type": "travelRule",
"direction": "OUTBOUND",
"status": "APPROVED",
"amount": "0.25",
"currency": "ETH",
"travel_rule": {
"uuid": "33333333-4444-5555-6666-777777777777",
"status": "UNCONFIRMED_OWNERSHIP",
"required": true
},
"action_required": {
"type": "wallet_ownership",
"url": "https://verify.didit.me/wallet-ownership/3s9x...urlsafe",
"widget_session_id": "77777777-8888-9999-aaaa-bbbbbbbbbbbb",
"expires_at": "2026-07-07T13:00:00Z"
}
}从 SDK 提交交易:客户端交易监控(KYT)
Didit 支持使用限定范围的 SDK token 从终端用户设备提交受监控交易,自动进行设备智能分析,并在钱包所有权需要确认时返回 action_required。
curl -X POST https://verification.didit.me/v1/transactions/ \
-H 'X-Transaction-Token: SDK_TOKEN' -H 'Content-Type: application/json' \
-d '{"txnId": "wd-2026-07-07-0042", "type": "travelRule", "info": {"direction": "out", "amount": "0.25", "currency": "ETH", "currencyType": "crypto"}, "subject": {"fullName": "Jane Doe"}, "counterparty": {"fullName": "Ana Diaz", "paymentMethod": {"type": "unhosted_wallet", "accountId": "0xBeneficiaryWallet01"}}, "travelRule": {"status": "AWAITING_COUNTERPARTY", "beneficiaryData": {"wallet_address": "0xBeneficiaryWallet01", "name": "Ana Diaz"}}, "includeCryptoScreening": true}'import { DiditSdk } from '@didit-protocol/sdk-web';
const result = await DiditSdk.shared.submitTransaction({
transactionToken: sdkToken,
transaction: {
txnId: 'wd-2026-07-07-0042',
category: 'travelRule',
details: { direction: 'out', amount: '0.25', currency: 'ETH', currencyType: 'crypto' },
subject: { fullName: 'Jane Doe' },
counterparty: { fullName: 'Ana Diaz', paymentMethod: { type: 'unhosted_wallet', accountId: '0xBeneficiaryWallet01' } },
travelRule: { status: 'AWAITING_COUNTERPARTY', beneficiaryData: { wallet_address: '0xBeneficiaryWallet01', name: 'Ana Diaz' } },
includeCryptoScreening: true
},
onActionCompleted: (refreshed) => console.log(refreshed.status)
});import requests
url = "https://verification.didit.me/v1/transactions/"
payload = {
"txnId": "wd-2026-07-07-0042",
"type": "travelRule",
"info": {
"direction": "out",
"amount": "0.25",
"currency": "ETH",
"currencyType": "crypto",
"cryptoParams": { "crypto_chain": "ETH" }
},
"subject": { "fullName": "Jane Doe" },
"counterparty": {
"fullName": "Ana Diaz",
"paymentMethod": {
"type": "unhosted_wallet",
"accountId": "0xBeneficiaryWallet01"
}
},
"travelRule": {
"status": "AWAITING_COUNTERPARTY",
"beneficiaryData": {
"wallet_address": "0xBeneficiaryWallet01",
"name": "Ana Diaz"
}
},
"includeCryptoScreening": True
}
headers = {
"X-Transaction-Token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://verification.didit.me/v1/transactions/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'txnId' => 'wd-2026-07-07-0042',
'type' => 'travelRule',
'info' => [
'direction' => 'out',
'amount' => '0.25',
'currency' => 'ETH',
'currencyType' => 'crypto',
'cryptoParams' => [
'crypto_chain' => 'ETH'
]
],
'subject' => [
'fullName' => 'Jane Doe'
],
'counterparty' => [
'fullName' => 'Ana Diaz',
'paymentMethod' => [
'type' => 'unhosted_wallet',
'accountId' => '0xBeneficiaryWallet01'
]
],
'travelRule' => [
'status' => 'AWAITING_COUNTERPARTY',
'beneficiaryData' => [
'wallet_address' => '0xBeneficiaryWallet01',
'name' => 'Ana Diaz'
]
],
'includeCryptoScreening' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Transaction-Token: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://verification.didit.me/v1/transactions/"
payload := strings.NewReader("{\n \"txnId\": \"wd-2026-07-07-0042\",\n \"type\": \"travelRule\",\n \"info\": {\n \"direction\": \"out\",\n \"amount\": \"0.25\",\n \"currency\": \"ETH\",\n \"currencyType\": \"crypto\",\n \"cryptoParams\": {\n \"crypto_chain\": \"ETH\"\n }\n },\n \"subject\": {\n \"fullName\": \"Jane Doe\"\n },\n \"counterparty\": {\n \"fullName\": \"Ana Diaz\",\n \"paymentMethod\": {\n \"type\": \"unhosted_wallet\",\n \"accountId\": \"0xBeneficiaryWallet01\"\n }\n },\n \"travelRule\": {\n \"status\": \"AWAITING_COUNTERPARTY\",\n \"beneficiaryData\": {\n \"wallet_address\": \"0xBeneficiaryWallet01\",\n \"name\": \"Ana Diaz\"\n }\n },\n \"includeCryptoScreening\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Transaction-Token", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://verification.didit.me/v1/transactions/")
.header("X-Transaction-Token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"txnId\": \"wd-2026-07-07-0042\",\n \"type\": \"travelRule\",\n \"info\": {\n \"direction\": \"out\",\n \"amount\": \"0.25\",\n \"currency\": \"ETH\",\n \"currencyType\": \"crypto\",\n \"cryptoParams\": {\n \"crypto_chain\": \"ETH\"\n }\n },\n \"subject\": {\n \"fullName\": \"Jane Doe\"\n },\n \"counterparty\": {\n \"fullName\": \"Ana Diaz\",\n \"paymentMethod\": {\n \"type\": \"unhosted_wallet\",\n \"accountId\": \"0xBeneficiaryWallet01\"\n }\n },\n \"travelRule\": {\n \"status\": \"AWAITING_COUNTERPARTY\",\n \"beneficiaryData\": {\n \"wallet_address\": \"0xBeneficiaryWallet01\",\n \"name\": \"Ana Diaz\"\n }\n },\n \"includeCryptoScreening\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://verification.didit.me/v1/transactions/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Transaction-Token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"txnId\": \"wd-2026-07-07-0042\",\n \"type\": \"travelRule\",\n \"info\": {\n \"direction\": \"out\",\n \"amount\": \"0.25\",\n \"currency\": \"ETH\",\n \"currencyType\": \"crypto\",\n \"cryptoParams\": {\n \"crypto_chain\": \"ETH\"\n }\n },\n \"subject\": {\n \"fullName\": \"Jane Doe\"\n },\n \"counterparty\": {\n \"fullName\": \"Ana Diaz\",\n \"paymentMethod\": {\n \"type\": \"unhosted_wallet\",\n \"accountId\": \"0xBeneficiaryWallet01\"\n }\n },\n \"travelRule\": {\n \"status\": \"AWAITING_COUNTERPARTY\",\n \"beneficiaryData\": {\n \"wallet_address\": \"0xBeneficiaryWallet01\",\n \"name\": \"Ana Diaz\"\n }\n },\n \"includeCryptoScreening\": true\n}"
response = http.request(request)
puts response.read_body{
"uuid": "22222222-3333-4444-5555-666666666666",
"txn_id": "wd-2026-07-07-0042",
"transaction_type": "travelRule",
"direction": "OUTBOUND",
"status": "APPROVED",
"amount": "0.25",
"currency": "ETH",
"travel_rule": {
"uuid": "33333333-4444-5555-6666-777777777777",
"status": "UNCONFIRMED_OWNERSHIP",
"required": true
},
"action_required": {
"type": "wallet_ownership",
"url": "https://verify.didit.me/wallet-ownership/3s9x...urlsafe",
"widget_session_id": "77777777-8888-9999-aaaa-bbbbbbbbbbbb",
"expires_at": "2026-07-07T13:00:00Z"
}
}授权
由您的后端通过 POST /v3/transactions/sdk-token/ 生成的短期限定范围 token。供 Didit SDK 在面向设备的 /v1/transactions/ endpoint 上使用。
请求体
您对此交易的唯一标识符(映射到 transaction_id,最多 128 个字符)。
"wd-2026-07-07-0042"
交易类别(映射到 transaction_category),例如 finance、kyc、travelRule、userPlatformEvent、gamblingBet。
"travelRule"
交易的核心财务详情(映射至 transaction_details)。
Show child attributes
Show child attributes
交易的主体(申请人)。此处忽略 externalUserId:主体身份始终强制使用 token 的 vendor_data。
Show child attributes
Show child attributes
交易发生的时间(映射到 transaction_at)。如果省略,则默认为当前时间。
IANA 时区标识符(映射至 time_zone),例如 Europe/Madrid。
交易对手(可选)。结构与 subject 相同;此处 externalUserId 有意义。
Show child attributes
Show child attributes
自定义键值对(映射到 custom_properties)。每个键都可以在规则条件中作为 custom_values.<key> 引用。
Travel Rule 详情(映射到 travel_rule_details)。当为应用启用 Travel Rule 时,Didit 会忽略您发送的任何 status 并自行驱动信息交换。
Show child attributes
Show child attributes
用于加密货币区块链分析筛查的逐笔交易覆盖项(映射到 include_crypto_screening)。
didit-fp-v2 设备指纹 payload。由 SDK 自动注入;仅在直接调用 wire API 时才相关。
响应
交易已提交并受监控。详情结构与 GET /v3/transactions/{transaction_id}/ 相同,包括终端用户必须完成后续操作时的 action_required 块(各 SDK 默认自动启动该操作)。
单个交易的完整监控记录,由 GET /v3/transactions/{transaction_id}/ 和 POST /v3/transactions/ 返回。
Didit 稳定的交易标识符。用作后续调用的 {transaction_id}。
拥有该交易的应用的环境。sandbox 交易会被存储,但绝不会被评估、筛查、通知或计费,因此其空的 rule_runs 表示“未评估”。
live, sandbox 控制台中显示的应用范围内连续交易序号(例如 4123)。
您在创建时提供的 transaction_id(最多 128 个字符)。每个应用唯一。
交易发生的时间(来自 transaction_at;默认为提交时间)。
创建时提供的 IANA 时区标识符。
存储的顶级类别:finance、kyc、travelRule、userPlatformEvent、gamblingBet、gamblingLimitChange、gamblingBonusChange、auditTrailEvent。请注意,即使以 snake_case 提交,包含多个单词的值也会以 camelCase 形式返回。
类别内的子类型(例如 deposit、withdrawal、transfer)。未提供时默认为该类别。
相对于主体的方向。无论提交时的大小写如何,均以大写形式存储(输入时接受 in/out/inbound/outbound)。
INBOUND, OUTBOUND 当前监控裁决结果。创建交易时的状态为 APPROVED;规则可能会同步将其更改为 IN_REVIEW/DECLINED。
APPROVED, IN_REVIEW, DECLINED, AWAITING_USER 记录的生成来源:通过 API 或 SDK 提交的交易为 LIVE,通过控制台导入加载的交易为 IMPORTED。
LIVE, IMPORTED 作为十进制字符串的交易金额,已去除末尾零(例如 "1500"、"0.5"、"0.123456789012345678")。最多 18 位小数。
amount 的货币代码。接受任何 ISO 4217 字母代码(例如 EUR、USD、NGN)以及加密资产符号(例如 BTC)。建议使用当前流通的代码。并非每个接受的代码都有汇率:当该代码没有可用汇率时(例如 ISO 会计单位 XSU,或 Didit 未定价的加密资产符号),自动换算将失败,并且 preferred_currency_amount 将返回 null,除非请求提供了预先换算的 amount_in_default_currency。
fiat 或 crypto,与在 currency_kind 中提交的内容一致。
您提供的预先换算金额,为去除了末尾零的十进制数字符串。
amount 在可用时折算为应用的首选货币。
提交内容中的自由文本付款参考号或附言。
来自 payment_reference_id 的外部支付系统参考标识(例如区块链交易哈希)。
规则累计的风险评分(通常为 0–100)。数值越高 = 风险越大。
由规则/提供商设置的分类风险严重程度(UNKNOWN、LOW、MEDIUM、HIGH、CRITICAL)。在设置该值之前为 null。
UNKNOWN, LOW, MEDIUM, HIGH, CRITICAL 当前 status 的机器可读原因。
decision_reason_code 的便于人类阅读的标签。
申请人 vendor_data 的便捷副本。
创建时提交的 subject 和 counterparty payload 快照。
您在创建时提供的 custom_properties。每个键都可以在规则条件中通过 custom_values.<key> 访问。
附加到交易的标签(手动或通过规则)。
Show child attributes
Show child attributes
交易当事方(申请人、交易对手)。
Show child attributes
Show child attributes
关联至交易的支付方式。
Show child attributes
Show child attributes
从控制台附加到交易的文件。若无则为 []。
Show child attributes
Show child attributes
活动日志条目(创建、备注、人工审核、状态变更)。
Show child attributes
Show child attributes
当前始终为空。未结警报是指状态为 IN_REVIEW 或 AWAITING_USER 的交易。
Show child attributes
Show child attributes
逐条规则的执行结果:触发了哪条规则,以及产生了怎样的评分影响。
Show child attributes
Show child attributes
原始供应商 payload(AML 筛查、区块链分析等)。
Show child attributes
Show child attributes
Travel Rule 转账或核验。在提交了 travel_rule_details 时填充,以及在启用了 Travel Rule 且创建交易时使用了 transaction_category: travelRule 时填充(即使没有 travel_rule_details,Didit 也会自行发起信息交换)。不存在转账或核验时为 null。在入账转账中,交易对手的 originator_data 和 beneficiary_data 保持掩码状态(data_masked: true),直到钱包所有权得到确认。
Show child attributes
Show child attributes
规则引擎使用的相关交易/关联方图谱快照。可以随交易提交的 network_snapshot,也可以是 Didit 从成功的 AML 钱包筛查中构建的图谱(会替换提交的快照)。两者均不存在时为 null。
Show child attributes
Show child attributes
需要重新验证时向用户提供的补救会话。已被规范字段 action_required 取代;保留以向后兼容。
Show child attributes
Show child attributes
完成此交易所需的待处理终端用户操作,若无则为 null。Didit SDK 默认会自动启动该操作,并在其完成时刷新交易。共有两种变体,通过 type 进行区分:verification_session(由规则操作创建的托管验证会话)和 wallet_ownership(为需要钱包控制权证明的 Travel Rule 转账自动生成的钱包所有权微件会话,受 auto_wallet_verification Travel Rule 设置管控)。当两者均适用时,wallet_ownership 具有更高优先级,因为它会阻断 Travel Rule 交互。
- Verification session
- Wallet ownership
Show child attributes
Show child attributes
此交易的费用:total_price 和 items,每项收费一条记录,均包含 usage_type、price、details 和 created_at。对同一笔交易重新筛查会产生一个新条目。