Z Zise Developers

汇款两条线的下单前置(用途码 / 滑点 / 最低起汇额 / 限额)

GET /v1/remit/products scope: remittances:read
商户自身

下单前该知道的四件事,此前一件都拿不到 —— 商户只能把请求发出来吃错误码。

为什么这一页值得先拉一次

  • 最低起汇额min_amount)是最难受的一项:低于门槛时用户看到的

不是「金额太小」,而是「汇率暂不可用」 —— 商户会把这句话原样透给

终端用户,然后两边一起查一个不存在的汇率问题。

  • 用途码purpose_codes)你猜不到。上游那 23 个枚举是固定的,

但这里给的是按产品线收窄之后的那一份 —— 我方后台一收窄,

你写死的下拉框里就有一半选项会在下单那一刻被拒。

  • 限额是每个商户一份配置,硬编码必然过期。
  • 滑点区间决定你能传什么 slippage_bps,超范围直接拒。

两条约定,读错会算错钱

  • 金额一律是字符串定点串,位数看同一行 source_assets[].ledger_scale
  • 空串 = 不限,不是 0、也不是「没配」。single_limit: "" 的意思是

这一项没有上限。把空串当 0 处理会让你把每一笔都判成超限。

两套费率,按走廊挑一套

fee_bps / fee_fixed 是跨币种那一档;stable_fee_bps / stable_fee_fixed

到账币 == settlement_currency 那一档(稳定币直付)。

走廊要到选完收款人才知道,所以两套都给。只用一套的代价是

你的计算器与你的确认页会在同一屏上显示两个不同的费率。

不可用的线照样列出available: false + unavailable_reason),

每一行的键都是齐的(不可用那行取空值)。整个不列会让你以为是

自己传错了参数;少几个键会让你按 purpose_codes.length 遍历时抛

undefined —— 而你拿到的是 200,排查方向会一路指错。

unavailable_reason 取值:not_enabled(这条线没给你开通)·

no_payment_asset(一个可付款资产都没有,现在下不了单)。

kyc_trigger_amount累计触发线:超过它该会员必须补 L1。

你可以据此提前提示,但判定在服务端 —— 别自己比一遍然后放行。

响应

200OK
{
  "data": [
    {
      "line": "express",
      "available": true,
      "unavailable_reason": "",
      "source_assets": [
        {
          "asset": "USDT",
          "ledger_scale": 6,
          "display_scale": 2
        }
      ],
      "purpose_codes": [
        "FAMILY_SUPPORT",
        "EDUCATION",
        "TRAVEL"
      ],
      "settlement_currency": "USD",
      "fee_bps": 50,
      "fee_fixed": "0.500000",
      "stable_fee_bps": 50,
      "stable_fee_fixed": "0.500000",
      "slippage": {
        "default_bps": 100,
        "min_bps": 0,
        "max_bps": 500
      },
      "single_limit": "50000.000000",
      "min_amount": "20.000000",
      "daily_limit": "",
      "kyc_trigger_amount": "1000.000000"
    },
    {
      "line": "pobo",
      "available": false,
      "unavailable_reason": "not_enabled",
      "source_assets": [],
      "purpose_codes": [],
      "settlement_currency": "",
      "fee_bps": 0,
      "fee_fixed": "",
      "stable_fee_bps": 0,
      "stable_fee_fixed": "",
      "slippage": {
        "default_bps": 0,
        "min_bps": 0,
        "max_bps": 500
      },
      "single_limit": "",
      "min_amount": "",
      "daily_limit": "",
      "kyc_trigger_amount": ""
    }
  ],
  "next_cursor": null,
  "has_more": false
}
403insufficient_scoperemittances:read
请求
curl -X GET 'https://api.zise.com/v1/remit/products' \
  -H 'x-auth-token: Bearer $TOKEN'
const res = await fetch("https://api.zise.com/v1/remit/products", {
  method: "GET",
  headers: {
    "x-auth-token": "Bearer $TOKEN",
  },
});
// 金额按字符串读,别让它变成 number
const data = await res.json();
import requests

res = requests.get(
    "https://api.zise.com/v1/remit/products",
    headers={
        "x-auth-token": "Bearer $TOKEN",
    },
)
# 金额用 Decimal(str(...)),不要 float
data = res.json()
req, _ := http.NewRequest("GET", "https://api.zise.com/v1/remit/products",
    nil)
req.Header.Set("x-auth-token", "Bearer $TOKEN")
res, err := http.DefaultClient.Do(req)
// 金额字段用 string 接,不要 float64
HttpRequest req = HttpRequest.newBuilder()
    .uri(URI.create("https://api.zise.com/v1/remit/products"))
    .header("x-auth-token", "Bearer $TOKEN")
    .method("GET", HttpRequest.BodyPublishers.noBody())
    .build();
// 金额字段用 String / BigDecimal,不要 double
$ch = curl_init('https://api.zise.com/v1/remit/products');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => [
    'x-auth-token: Bearer $TOKEN',
  ],
]);
$res = curl_exec($ch);
// 金额用 bcmath / 字符串,不要 floatval
200
{
  "data": [
    {
      "line": "express",
      "available": true,
      "unavailable_reason": "",
      "source_assets": [
        {
          "asset": "USDT",
          "ledger_scale": 6,
          "display_scale": 2
        }
      ],
      "purpose_codes": [
        "FAMILY_SUPPORT",
        "EDUCATION",
        "TRAVEL"
      ],
      "settlement_currency": "USD",
      "fee_bps": 50,
      "fee_fixed": "0.500000",
      "stable_fee_bps": 50,
      "stable_fee_fixed": "0.500000",
      "slippage": {
        "default_bps": 100,
        "min_bps": 0,
        "max_bps": 500
      },
      "single_limit": "50000.000000",
      "min_amount": "20.000000",
      "daily_limit": "",
      "kyc_trigger_amount": "1000.000000"
    },
    {
      "line": "pobo",
      "available": false,
      "unavailable_reason": "not_enabled",
      "source_assets": [],
      "purpose_codes": [],
      "settlement_currency": "",
      "fee_bps": 0,
      "fee_fixed": "",
      "stable_fee_bps": 0,
      "stable_fee_fixed": "",
      "slippage": {
        "default_bps": 0,
        "min_bps": 0,
        "max_bps": 500
      },
      "single_limit": "",
      "min_amount": "",
      "daily_limit": "",
      "kyc_trigger_amount": ""
    }
  ],
  "next_cursor": null,
  "has_more": false
}