Z Zise Developers

会员流水(游标分页)

GET /v1/transactions scope: balances:read
代会员调用 · 必带 x-on-behalf-of

会员视角的一条条流水,跨全部业务线(入金、提现、汇款、兑换、

转账、发卡、理财、扫码付)。不是账本分录 —— 一笔业务在这里

最多一行,账本那边可能是四条腿。

翻页只有一种形态:把上一页的 next_cursor 原样回传。

游标是不透明串,不要解析它、不要自己拼 —— 一旦你开始拼,

我方就再也改不了排序键了。解不开的游标按「从头开始」处理而不是报错。

amount_scale 必须一起用。金额是「该资产 scale 的定点整数」

的十进制串,而 scale 逐资产不同(USDT 6 位、BTC 8 位)。

按固定 6 位去解,第一个非 6 位资产上就错 100 倍且零报错。

typestatus 是开放枚举,库里没有 CHECK 约束。

新业务线上线会加新值,而不会发版通知你。认不出的值请原样展示

绝不要 default 成「处理中」或「成功」—— 那会把「人工审核中」

显示成已完成。要做分组就维护一张你认得的白名单,剩下的走兜底分支。

direction 只有两个值:in 钱进来、out 钱出去。

日终对账请用 from / to 做增量,不要全量重翻

from / to 与游标锚在同一列created_at),所以

from = 上一轮见过的最大 created_at 是一句自洽的话,可以直接拿来

做增量同步。to开区间< to)—— 闭区间会让每一轮重复取到

边界那一条,而重复的那条在对账里会被加两遍。

⚠ 时间必须是 ISO-8601(2026-08-01T00:00:00Z)。解不出来的串

直接 400 invalid_fields不会被静默忽略 —— 静默忽略的表现是

「筛选没生效」,而你拿到的是一份看着正常、范围却不对的数据。

别拿 occurred_at 当增量水位。 出参里两个时间都给:

occurred_at 是「这件事什么时候发生的」(充值取的是检测到的时刻),

created_at 是「我方什么时候记下的」。补记的历史流水上两者会差很远,

occurred_at 做水位会把它们永久跳过。

查询参数

字段类型必填说明
limit integer 可选 每页条数。缺省 20,上限 100;非数字或 ≤ 0 一律按 20 处理 (不报错,所以别指望用它来发现自己传错了)。
cursor string 可选 上一页返回的 next_cursor 原样回传。首页不传。
id string 可选 只取某一条。带不带 txn_ 前缀都认。非数字直接 400 invalid_fields
type string 可选 按业务类型过滤,精确匹配、大小写敏感。 ⚠ 这是开放枚举,我方刻意不校验取值:新业务线上线会加新值而 不会发版通知你,在这里做白名单等于「我方上了新业务、你的筛选器 当天开始漏单」。所以传一个我方不认识的值得到的是空列表, 不是报错 —— 拼错了不会有人告诉你。
status string 可选 按状态过滤,同样是开放枚举、不校验、拼错得空列表
direction string 可选 inout。⚠ 与上面两个相反,这个是封闭枚举(库级约束 就两个值),所以传别的直接 400 invalid_fields
asset string 可选 按资产过滤,自动转大写。不校验存在性 —— 这是筛选器不是下单 入参,查一个该会员没有的币得到空列表而不是 asset_not_allowed
from string 可选 起始时间(含),ISO-8601。比的是 created_at
to string 可选 结束时间(不含),ISO-8601。比的是 created_at
字段类型必填说明
x-on-behalf-of string 必填 查谁的流水

响应

200OK
{
  "data": [
    {
      "id": "txn_80231",
      "type": "withdrawal",
      "status": "locked",
      "status_version": 1,
      "direction": "out",
      "asset": "USDT",
      "amount": "200000000",
      "amount_scale": 6,
      "occurred_at": "2026-08-12T09:31:02.881Z",
      "created_at": "2026-08-12T09:31:02.881Z"
    },
    {
      "id": "txn_80198",
      "type": "deposit",
      "status": "completed",
      "status_version": 2,
      "direction": "in",
      "asset": "USDT",
      "amount": "1500000000",
      "amount_scale": 6,
      "occurred_at": "2026-08-12T08:04:55.010Z",
      "created_at": "2026-08-12T08:04:57.204Z"
    }
  ],
  "next_cursor": "MjAyNi0wOC0xMlQwODowNDo1N1p8ODAxOTg",
  "has_more": true
}
400member_context_required 没带 x-on-behalf-of · invalid_fields id 不是数字 / direction 不是 in|out / fromto 不是合法 ISO-8601(看 fields 数组)
404member_not_found 会员不存在 / 属于别的商户 / 已停用
请求
curl -X GET 'https://api.zise.com/v1/transactions' \
  -H 'x-auth-token: Bearer $TOKEN' \
  -H 'x-on-behalf-of: $MEMBER_ID'
const res = await fetch("https://api.zise.com/v1/transactions", {
  method: "GET",
  headers: {
    "x-auth-token": "Bearer $TOKEN",
    "x-on-behalf-of": "$MEMBER_ID",
  },
});
// 金额按字符串读,别让它变成 number
const data = await res.json();
import requests

res = requests.get(
    "https://api.zise.com/v1/transactions",
    headers={
        "x-auth-token": "Bearer $TOKEN",
        "x-on-behalf-of": "$MEMBER_ID",
    },
)
# 金额用 Decimal(str(...)),不要 float
data = res.json()
req, _ := http.NewRequest("GET", "https://api.zise.com/v1/transactions",
    nil)
req.Header.Set("x-auth-token", "Bearer $TOKEN")
req.Header.Set("x-on-behalf-of", "$MEMBER_ID")
res, err := http.DefaultClient.Do(req)
// 金额字段用 string 接,不要 float64
HttpRequest req = HttpRequest.newBuilder()
    .uri(URI.create("https://api.zise.com/v1/transactions"))
    .header("x-auth-token", "Bearer $TOKEN")
    .header("x-on-behalf-of", "$MEMBER_ID")
    .method("GET", HttpRequest.BodyPublishers.noBody())
    .build();
// 金额字段用 String / BigDecimal,不要 double
$ch = curl_init('https://api.zise.com/v1/transactions');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => [
    'x-auth-token: Bearer $TOKEN',
    'x-on-behalf-of: $MEMBER_ID',
  ],
]);
$res = curl_exec($ch);
// 金额用 bcmath / 字符串,不要 floatval
200
{
  "data": [
    {
      "id": "txn_80231",
      "type": "withdrawal",
      "status": "locked",
      "status_version": 1,
      "direction": "out",
      "asset": "USDT",
      "amount": "200000000",
      "amount_scale": 6,
      "occurred_at": "2026-08-12T09:31:02.881Z",
      "created_at": "2026-08-12T09:31:02.881Z"
    },
    {
      "id": "txn_80198",
      "type": "deposit",
      "status": "completed",
      "status_version": 2,
      "direction": "in",
      "asset": "USDT",
      "amount": "1500000000",
      "amount_scale": 6,
      "occurred_at": "2026-08-12T08:04:55.010Z",
      "created_at": "2026-08-12T08:04:57.204Z"
    }
  ],
  "next_cursor": "MjAyNi0wOC0xMlQwODowNDo1N1p8ODAxOTg",
  "has_more": true
}