curl -X GET 'https://verification.didit.me/v1/transactions/22222222-3333-4444-5555-666666666666/' \
-H 'X-Transaction-Token: SDK_TOKEN'import requests
url = "https://verification.didit.me/v1/transactions/{transaction_id}/"
headers = {"X-Transaction-Token": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Transaction-Token': '<api-key>'}};
fetch('https://verification.didit.me/v1/transactions/{transaction_id}/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://verification.didit.me/v1/transactions/{transaction_id}/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://verification.didit.me/v1/transactions/{transaction_id}/"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Transaction-Token", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://verification.didit.me/v1/transactions/{transaction_id}/")
.header("X-Transaction-Token", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://verification.didit.me/v1/transactions/{transaction_id}/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Transaction-Token"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"environment": "live",
"transaction_number": 123,
"txn_id": "<string>",
"txn_date": "2023-11-07T05:31:56Z",
"zone_id": "<string>",
"transaction_type": "<string>",
"action_type": "<string>",
"direction": "INBOUND",
"status": "APPROVED",
"source": "LIVE",
"amount": "<string>",
"currency": "<string>",
"currency_type": "<string>",
"amount_in_default_currency": "<string>",
"default_currency_code": "<string>",
"preferred_currency_amount": "<string>",
"preferred_currency_code": "<string>",
"payment_details": "<string>",
"payment_txn_id": "<string>",
"score": 123,
"severity": "UNKNOWN",
"decision_reason_code": "<string>",
"decision_reason_label": "<string>",
"vendor_data": "<string>",
"metadata": {},
"props": {},
"tags": [
{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"color": "<string>",
"description": "<string>",
"source": "didit"
}
],
"parties": [
{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"role": "APPLICANT",
"entity_type": "individual",
"kind": "USER",
"vendor_data": "<string>",
"full_name": "<string>",
"first_name": "<string>",
"last_name": "<string>",
"country_code": "<string>",
"dob": "2023-12-25",
"address": {},
"institution_info": {},
"device": {
"fingerprint": "<string>",
"persistent_device_id": "<string>",
"user_agent": "<string>",
"browser_family": "<string>",
"browser_version": "<string>",
"platform": "<string>",
"os_family": "<string>",
"os_version": "<string>",
"accept_language": "<string>",
"session_id": "<string>",
"session_age_ms": 123,
"network_context": {
"ip_address": "<string>",
"ip_country_code": "<string>",
"latitude": 123,
"longitude": 123
}
},
"external_party_snapshot": {}
}
],
"payment_methods": [
{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"payment_method_type": "bank_card",
"label": "<string>",
"fingerprint": "<string>",
"account_id": "<string>",
"issuing_country": "<string>",
"owner_kind": "USER",
"vendor_data": "<string>",
"owner_name": "<string>",
"institution_info": {},
"details": {},
"external_owner_snapshot": {},
"role": "SOURCE"
}
],
"documents": [
{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"label": "<string>",
"note": "<string>",
"uploaded_by": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"files": [
{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"file_url": "<string>",
"original_filename": "<string>",
"file_size": 123
}
]
}
],
"activities": [
{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"activity_type": "<string>",
"source": "<string>",
"status": "<string>",
"title": "<string>",
"description": "<string>",
"metadata": {},
"occurred_at": "2023-11-07T05:31:56Z"
}
],
"alerts": [
{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"description": "<string>",
"severity": "UNKNOWN",
"status": "OPEN",
"source": "RULE",
"metadata": {},
"created_at": "2023-11-07T05:31:56Z",
"due_at": "2023-11-07T05:31:56Z"
}
],
"rule_runs": [
{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"rule": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"rule_title": "<string>",
"rule_description": "<string>",
"rule_category": "<string>",
"matched": true,
"is_test": true,
"mode": "ACTIVE",
"severity": "<string>",
"score_delta": 123,
"status_target": "<string>",
"action_summary": "<string>",
"metadata": {},
"created_at": "2023-11-07T05:31:56Z"
}
],
"provider_results": [
{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"provider": "<string>",
"result_type": "FIAT_MONITORING",
"status": "<string>",
"severity": "<string>",
"score": 123,
"summary": "<string>",
"payload": {},
"created_at": "2023-11-07T05:31:56Z"
}
],
"travel_rule": {
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "<string>",
"protocol": "<string>",
"required": true,
"obligations_count": 123,
"originator_data": {},
"beneficiary_data": {},
"name_match": {},
"data_match": {
"matched": true,
"mismatched_fields": [
"name"
],
"fields": {}
},
"mismatched_fields": [
"<string>"
],
"data_unmasked": {
"at": "2023-11-07T05:31:56Z",
"reason": "ownership_confirmed",
"actor": "<string>"
},
"data_masked": true,
"metadata": {},
"direction": "INBOUND",
"rail": "<string>",
"counterparty_vasp": {
"name": "<string>",
"lei": "<string>",
"dd_score": 123,
"dd_score_breakdown": {},
"dd_assessed_at": "2023-11-07T05:31:56Z"
},
"delivery": {
"kind": "SEND",
"status": "QUEUED",
"rail": "INTERNAL",
"attempts": 1,
"last_error": "email undeliverable",
"next_attempt_at": "2023-11-07T05:31:56Z",
"delivered_at": "2023-11-07T05:31:56Z"
},
"discovery": [
{
"step": "internal_address_book",
"outcome": "match",
"reason": "<string>",
"vasp": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"rail": "<string>",
"at": "2023-11-07T05:31:56Z"
}
],
"reason": "<string>",
"next_actions": [
{
"action": "select_counterparty_vasp",
"url": "<string>"
}
],
"chain_details": {
"chain": "<string>",
"shape": "utxo",
"originator": {
"address": "<string>",
"memo": "<string>",
"source": "declared"
},
"beneficiary": {
"address": "<string>",
"memo": "<string>",
"source": "declared"
},
"utxo": {
"inputs": [
{
"address": "<string>",
"amount": "0.0125",
"txid": "<string>",
"vout": 1
}
],
"outputs": [
{
"address": "<string>",
"amount": "0.0125",
"txid": "<string>",
"vout": 1
}
],
"change_output_indexes": [
123
],
"beneficiary_output_index": 123
},
"lightning": {},
"warnings": [
"declared_originator_not_an_input"
],
"not_applicable_reason": "LIGHTNING_NO_PAYEE_IDENTIFIER"
}
},
"network_snapshot": {
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"nodes": [
{}
],
"edges": [
{}
],
"metrics": {}
},
"remediation": {
"session_id": "<string>",
"session_token": "<string>",
"url": "<string>",
"status": "<string>"
},
"action_required": {
"type": "verification_session",
"url": "<string>",
"session_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"session_token": "<string>",
"status": "<string>"
},
"cost_breakdown": {}
}{
"detail": "Transaction token expired."
}{
"detail": "Not found."
}从 SDK 获取交易:客户端 KYT 查询
使用同一个有范围限制的 SDK 令牌,从终端用户设备重新读取受监控交易:刷新状态、Travel Rule 状态及待处理的 action_required。Didit 提供支持。
curl -X GET 'https://verification.didit.me/v1/transactions/22222222-3333-4444-5555-666666666666/' \
-H 'X-Transaction-Token: SDK_TOKEN'import requests
url = "https://verification.didit.me/v1/transactions/{transaction_id}/"
headers = {"X-Transaction-Token": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Transaction-Token': '<api-key>'}};
fetch('https://verification.didit.me/v1/transactions/{transaction_id}/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://verification.didit.me/v1/transactions/{transaction_id}/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://verification.didit.me/v1/transactions/{transaction_id}/"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Transaction-Token", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://verification.didit.me/v1/transactions/{transaction_id}/")
.header("X-Transaction-Token", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://verification.didit.me/v1/transactions/{transaction_id}/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Transaction-Token"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"environment": "live",
"transaction_number": 123,
"txn_id": "<string>",
"txn_date": "2023-11-07T05:31:56Z",
"zone_id": "<string>",
"transaction_type": "<string>",
"action_type": "<string>",
"direction": "INBOUND",
"status": "APPROVED",
"source": "LIVE",
"amount": "<string>",
"currency": "<string>",
"currency_type": "<string>",
"amount_in_default_currency": "<string>",
"default_currency_code": "<string>",
"preferred_currency_amount": "<string>",
"preferred_currency_code": "<string>",
"payment_details": "<string>",
"payment_txn_id": "<string>",
"score": 123,
"severity": "UNKNOWN",
"decision_reason_code": "<string>",
"decision_reason_label": "<string>",
"vendor_data": "<string>",
"metadata": {},
"props": {},
"tags": [
{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"color": "<string>",
"description": "<string>",
"source": "didit"
}
],
"parties": [
{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"role": "APPLICANT",
"entity_type": "individual",
"kind": "USER",
"vendor_data": "<string>",
"full_name": "<string>",
"first_name": "<string>",
"last_name": "<string>",
"country_code": "<string>",
"dob": "2023-12-25",
"address": {},
"institution_info": {},
"device": {
"fingerprint": "<string>",
"persistent_device_id": "<string>",
"user_agent": "<string>",
"browser_family": "<string>",
"browser_version": "<string>",
"platform": "<string>",
"os_family": "<string>",
"os_version": "<string>",
"accept_language": "<string>",
"session_id": "<string>",
"session_age_ms": 123,
"network_context": {
"ip_address": "<string>",
"ip_country_code": "<string>",
"latitude": 123,
"longitude": 123
}
},
"external_party_snapshot": {}
}
],
"payment_methods": [
{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"payment_method_type": "bank_card",
"label": "<string>",
"fingerprint": "<string>",
"account_id": "<string>",
"issuing_country": "<string>",
"owner_kind": "USER",
"vendor_data": "<string>",
"owner_name": "<string>",
"institution_info": {},
"details": {},
"external_owner_snapshot": {},
"role": "SOURCE"
}
],
"documents": [
{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"label": "<string>",
"note": "<string>",
"uploaded_by": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"files": [
{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"file_url": "<string>",
"original_filename": "<string>",
"file_size": 123
}
]
}
],
"activities": [
{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"activity_type": "<string>",
"source": "<string>",
"status": "<string>",
"title": "<string>",
"description": "<string>",
"metadata": {},
"occurred_at": "2023-11-07T05:31:56Z"
}
],
"alerts": [
{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"description": "<string>",
"severity": "UNKNOWN",
"status": "OPEN",
"source": "RULE",
"metadata": {},
"created_at": "2023-11-07T05:31:56Z",
"due_at": "2023-11-07T05:31:56Z"
}
],
"rule_runs": [
{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"rule": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"rule_title": "<string>",
"rule_description": "<string>",
"rule_category": "<string>",
"matched": true,
"is_test": true,
"mode": "ACTIVE",
"severity": "<string>",
"score_delta": 123,
"status_target": "<string>",
"action_summary": "<string>",
"metadata": {},
"created_at": "2023-11-07T05:31:56Z"
}
],
"provider_results": [
{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"provider": "<string>",
"result_type": "FIAT_MONITORING",
"status": "<string>",
"severity": "<string>",
"score": 123,
"summary": "<string>",
"payload": {},
"created_at": "2023-11-07T05:31:56Z"
}
],
"travel_rule": {
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "<string>",
"protocol": "<string>",
"required": true,
"obligations_count": 123,
"originator_data": {},
"beneficiary_data": {},
"name_match": {},
"data_match": {
"matched": true,
"mismatched_fields": [
"name"
],
"fields": {}
},
"mismatched_fields": [
"<string>"
],
"data_unmasked": {
"at": "2023-11-07T05:31:56Z",
"reason": "ownership_confirmed",
"actor": "<string>"
},
"data_masked": true,
"metadata": {},
"direction": "INBOUND",
"rail": "<string>",
"counterparty_vasp": {
"name": "<string>",
"lei": "<string>",
"dd_score": 123,
"dd_score_breakdown": {},
"dd_assessed_at": "2023-11-07T05:31:56Z"
},
"delivery": {
"kind": "SEND",
"status": "QUEUED",
"rail": "INTERNAL",
"attempts": 1,
"last_error": "email undeliverable",
"next_attempt_at": "2023-11-07T05:31:56Z",
"delivered_at": "2023-11-07T05:31:56Z"
},
"discovery": [
{
"step": "internal_address_book",
"outcome": "match",
"reason": "<string>",
"vasp": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"rail": "<string>",
"at": "2023-11-07T05:31:56Z"
}
],
"reason": "<string>",
"next_actions": [
{
"action": "select_counterparty_vasp",
"url": "<string>"
}
],
"chain_details": {
"chain": "<string>",
"shape": "utxo",
"originator": {
"address": "<string>",
"memo": "<string>",
"source": "declared"
},
"beneficiary": {
"address": "<string>",
"memo": "<string>",
"source": "declared"
},
"utxo": {
"inputs": [
{
"address": "<string>",
"amount": "0.0125",
"txid": "<string>",
"vout": 1
}
],
"outputs": [
{
"address": "<string>",
"amount": "0.0125",
"txid": "<string>",
"vout": 1
}
],
"change_output_indexes": [
123
],
"beneficiary_output_index": 123
},
"lightning": {},
"warnings": [
"declared_originator_not_an_input"
],
"not_applicable_reason": "LIGHTNING_NO_PAYEE_IDENTIFIER"
}
},
"network_snapshot": {
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"nodes": [
{}
],
"edges": [
{}
],
"metrics": {}
},
"remediation": {
"session_id": "<string>",
"session_token": "<string>",
"url": "<string>",
"status": "<string>"
},
"action_required": {
"type": "verification_session",
"url": "<string>",
"session_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"session_token": "<string>",
"status": "<string>"
},
"cost_breakdown": {}
}{
"detail": "Transaction token expired."
}{
"detail": "Not found."
}授权
由您的后端通过 POST /v3/transactions/sdk-token/ 生成的短期限定范围 token。供 Didit SDK 在面向设备的 /v1/transactions/ endpoint 上使用。
路径参数
Didit 稳定的交易 UUID(来自提交响应的 uuid,不是您的 txnId)。
响应
完整的交易详情,包括 action_required(待处理操作解决后为 null)。
单个交易的完整监控记录,由 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。对同一笔交易重新筛查会产生一个新条目。